{"version":3,"file":"modernizr-custom-CXc_tiuj.js","sources":["../../../app/frontend/entrypoints/modernizr-custom.js"],"sourcesContent":["/*!\n * modernizr v4.0.0-alpha\n * Build https://modernizr.com/download?-classlist-csspositionsticky-dataset-fetch-flexbox-inlinesvg-promises-srcset-svg-svgasimg-dontmin\n *\n * Copyright (c)\n * Faruk Ates\n * Paul Irish\n * Alex Sexton\n * Ryan Seddon\n * Patrick Kettner\n * Stu Cox\n * Richard Herrera\n * Veeck\n\n * MIT License\n */\n\n/*\n * Modernizr tests which native CSS3 and HTML5 features are available in the\n * current UA and makes the results available to you in two ways: as properties on\n * a global `Modernizr` object, and as classes on the `` element. This\n * information allows you to progressively enhance your pages with a granular level\n * of control over the experience.\n*/\n\n;(function(scriptGlobalObject, window, document, undefined){\n\n var tests = [];\n\n\n /**\n * ModernizrProto is the constructor for Modernizr\n *\n * @class\n * @access public\n */\n var ModernizrProto = {\n _version: '4.0.0-alpha',\n\n // Any settings that don't work as separate modules\n // can go in here as configuration.\n _config: {\n 'classPrefix': '',\n 'enableClasses': true,\n 'enableJSClass': true,\n 'usePrefixes': true\n },\n\n // Queue of tests\n _q: [],\n\n // Stub these for people who are listening\n on: function(test, cb) {\n // I don't really think people should do this, but we can\n // safe guard it a bit.\n // -- NOTE:: this gets WAY overridden in src/addTest for actual async tests.\n // This is in case people listen to synchronous tests. I would leave it out,\n // but the code to *disallow* sync tests in the real version of this\n // function is actually larger than this.\n var self = this;\n setTimeout(function() {\n cb(self[test]);\n }, 0);\n },\n\n addTest: function(name, fn, options) {\n tests.push({name: name, fn: fn, options: options});\n },\n\n addAsyncTest: function(fn) {\n tests.push({name: null, fn: fn});\n }\n };\n\n\n\n // Fake some of Object.create so we can force non test results to be non \"own\" properties.\n var Modernizr = function() {};\n Modernizr.prototype = ModernizrProto;\n\n // Leak modernizr globally when you `require` it rather than force it here.\n // Overwrite name so constructor name is nicer :D\n Modernizr = new Modernizr();\n\n\n\n var classes = [];\n\n\n /**\n * is returns a boolean if the typeof an obj is exactly type.\n *\n * @access private\n * @function is\n * @param {*} obj - A thing we want to check the type of\n * @param {string} type - A string to compare the typeof against\n * @returns {boolean} true if the typeof the first parameter is exactly the specified type, false otherwise\n */\n function is(obj, type) {\n return typeof obj === type;\n }\n\n ;\n\n /**\n * Run through all tests and detect their support in the current UA.\n *\n * @access private\n * @returns {void}\n */\n function testRunner() {\n var featureNames;\n var feature;\n var aliasIdx;\n var result;\n var nameIdx;\n var featureName;\n var featureNameSplit;\n\n for (var featureIdx in tests) {\n if (tests.hasOwnProperty(featureIdx)) {\n featureNames = [];\n feature = tests[featureIdx];\n // run the test, throw the return value into the Modernizr,\n // then based on that boolean, define an appropriate className\n // and push it into an array of classes we'll join later.\n //\n // If there is no name, it's an 'async' test that is run,\n // but not directly added to the object. That should\n // be done with a post-run addTest call.\n if (feature.name) {\n featureNames.push(feature.name.toLowerCase());\n\n if (feature.options && feature.options.aliases && feature.options.aliases.length) {\n // Add all the aliases into the names list\n for (aliasIdx = 0; aliasIdx < feature.options.aliases.length; aliasIdx++) {\n featureNames.push(feature.options.aliases[aliasIdx].toLowerCase());\n }\n }\n }\n\n // Run the test, or use the raw value if it's not a function\n result = is(feature.fn, 'function') ? feature.fn() : feature.fn;\n\n // Set each of the names on the Modernizr object\n for (nameIdx = 0; nameIdx < featureNames.length; nameIdx++) {\n featureName = featureNames[nameIdx];\n // Support dot properties as sub tests. We don't do checking to make sure\n // that the implied parent tests have been added. You must call them in\n // order (either in the test, or make the parent test a dependency).\n //\n // Cap it to TWO to make the logic simple and because who needs that kind of subtesting\n // hashtag famous last words\n featureNameSplit = featureName.split('.');\n\n if (featureNameSplit.length === 1) {\n Modernizr[featureNameSplit[0]] = result;\n } else {\n // cast to a Boolean, if not one already or if it doesnt exist yet (like inputtypes)\n if (!Modernizr[featureNameSplit[0]] || Modernizr[featureNameSplit[0]] && !(Modernizr[featureNameSplit[0]] instanceof Boolean)) {\n Modernizr[featureNameSplit[0]] = new Boolean(Modernizr[featureNameSplit[0]]);\n }\n\n Modernizr[featureNameSplit[0]][featureNameSplit[1]] = result;\n }\n\n classes.push((result ? '' : 'no-') + featureNameSplit.join('-'));\n }\n }\n }\n }\n ;\n\n /**\n * If the browsers follow the spec, then they would expose vendor-specific styles as:\n * elem.style.WebkitBorderRadius\n * instead of something like the following (which is technically incorrect):\n * elem.style.webkitBorderRadius\n *\n * WebKit ghosts their properties in lowercase but Opera & Moz do not.\n * Microsoft uses a lowercase `ms` instead of the correct `Ms` in IE8+\n * erik.eae.net/archives/2008/03/10/21.48.10/\n *\n * More here: github.com/Modernizr/Modernizr/issues/issue/21\n *\n * @access private\n * @returns {string} The string representing the vendor-specific style properties\n */\n var omPrefixes = 'Moz O ms Webkit';\n\n\n var cssomPrefixes = (ModernizrProto._config.usePrefixes ? omPrefixes.split(' ') : []);\n ModernizrProto._cssomPrefixes = cssomPrefixes;\n\n\n /**\n * contains checks to see if a string contains another string\n *\n * @access private\n * @function contains\n * @param {string} str - The string we want to check for substrings\n * @param {string} substr - The substring we want to search the first string for\n * @returns {boolean} true if and only if the first string 'str' contains the second string 'substr'\n */\n function contains(str, substr) {\n return !!~('' + str).indexOf(substr);\n }\n\n ;\n\n /**\n * docElement is a convenience wrapper to grab the root element of the document\n *\n * @access private\n * @returns {HTMLElement|SVGElement} The root element of the document\n */\n var docElement = document.documentElement;\n\n\n /**\n * A convenience helper to check if the document we are running in is an SVG document\n *\n * @access private\n * @returns {boolean}\n */\n var isSVG = docElement.nodeName.toLowerCase() === 'svg';\n\n\n\n /**\n * createElement is a convenience wrapper around document.createElement. Since we\n * use createElement all over the place, this allows for (slightly) smaller code\n * as well as abstracting away issues with creating elements in contexts other than\n * HTML documents (e.g. SVG documents).\n *\n * @access private\n * @function createElement\n * @returns {HTMLElement|SVGElement} An HTML or SVG element\n */\n function createElement() {\n if (typeof document.createElement !== 'function') {\n // This is the case in IE7, where the type of createElement is \"object\".\n // For this reason, we cannot call apply() as Object is not a Function.\n return document.createElement(arguments[0]);\n } else if (isSVG) {\n return document.createElementNS.call(document, 'http://www.w3.org/2000/svg', arguments[0]);\n } else {\n return document.createElement.apply(document, arguments);\n }\n }\n\n ;\n\n /**\n * Create our \"modernizr\" element that we do most feature tests on.\n *\n * @access private\n */\n var modElem = {\n elem: createElement('modernizr')\n };\n\n // Clean up this element\n Modernizr._q.push(function() {\n delete modElem.elem;\n });\n\n\n\n var mStyle = {\n style: modElem.elem.style\n };\n\n // kill ref for gc, must happen before mod.elem is removed, so we unshift on to\n // the front of the queue.\n Modernizr._q.unshift(function() {\n delete mStyle.style;\n });\n\n\n\n /**\n * getBody returns the body of a document, or an element that can stand in for\n * the body if a real body does not exist\n *\n * @access private\n * @function getBody\n * @returns {HTMLElement|SVGElement} Returns the real body of a document, or an\n * artificially created element that stands in for the body\n */\n function getBody() {\n // After page load injecting a fake body doesn't work so check if body exists\n var body = document.body;\n\n if (!body) {\n // Can't use the real body create a fake one.\n body = createElement(isSVG ? 'svg' : 'body');\n body.fake = true;\n }\n\n return body;\n }\n\n ;\n\n /**\n * injectElementWithStyles injects an element with style element and some CSS rules\n *\n * @access private\n * @function injectElementWithStyles\n * @param {string} rule - String representing a css rule\n * @param {Function} callback - A function that is used to test the injected element\n * @param {number} [nodes] - An integer representing the number of additional nodes you want injected\n * @param {string[]} [testnames] - An array of strings that are used as ids for the additional nodes\n * @returns {boolean} the result of the specified callback test\n */\n function injectElementWithStyles(rule, callback, nodes, testnames) {\n var mod = 'modernizr';\n var style;\n var ret;\n var node;\n var docOverflow;\n var div = createElement('div');\n var body = getBody();\n\n if (parseInt(nodes, 10)) {\n // In order not to give false positives we create a node for each test\n // This also allows the method to scale for unspecified uses\n while (nodes--) {\n node = createElement('div');\n node.id = testnames ? testnames[nodes] : mod + (nodes + 1);\n div.appendChild(node);\n }\n }\n\n style = createElement('style');\n style.type = 'text/css';\n style.id = 's' + mod;\n\n // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody.\n // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270\n (!body.fake ? div : body).appendChild(style);\n body.appendChild(div);\n\n if (style.styleSheet) {\n style.styleSheet.cssText = rule;\n } else {\n style.appendChild(document.createTextNode(rule));\n }\n div.id = mod;\n\n if (body.fake) {\n //avoid crashing IE8, if background image is used\n body.style.background = '';\n //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible\n body.style.overflow = 'hidden';\n docOverflow = docElement.style.overflow;\n docElement.style.overflow = 'hidden';\n docElement.appendChild(body);\n }\n\n ret = callback(div, rule);\n // If this is done after page load we don't want to remove the body so check if body exists\n if (body.fake && body.parentNode) {\n body.parentNode.removeChild(body);\n docElement.style.overflow = docOverflow;\n // Trigger layout so kinetic scrolling isn't disabled in iOS6+\n // eslint-disable-next-line\n docElement.offsetHeight;\n } else {\n div.parentNode.removeChild(div);\n }\n\n return !!ret;\n }\n\n ;\n\n /**\n * domToCSS takes a camelCase string and converts it to hyphen-case\n * e.g. boxSizing -> box-sizing\n *\n * @access private\n * @function domToCSS\n * @param {string} name - String name of camelCase prop we want to convert\n * @returns {string} The hyphen-case version of the supplied name\n */\n function domToCSS(name) {\n return name.replace(/([A-Z])/g, function(str, m1) {\n return '-' + m1.toLowerCase();\n }).replace(/^ms-/, '-ms-');\n }\n\n ;\n\n\n /**\n * wrapper around getComputedStyle, to fix issues with Firefox returning null when\n * called inside of a hidden iframe\n *\n * @access private\n * @function computedStyle\n * @param {HTMLElement|SVGElement} elem - The element we want to find the computed styles of\n * @param {string|null} [pseudo] - An optional pseudo element selector (e.g. :before), of null if none\n * @param {string} prop - A CSS property\n * @returns {CSSStyleDeclaration} the value of the specified CSS property\n */\n function computedStyle(elem, pseudo, prop) {\n var result;\n\n if ('getComputedStyle' in window) {\n result = getComputedStyle.call(window, elem, pseudo);\n var console = window.console;\n\n if (result !== null) {\n if (prop) {\n result = result.getPropertyValue(prop);\n }\n } else {\n if (console) {\n var method = console.error ? 'error' : 'log';\n console[method].call(console, 'getComputedStyle returning null, its possible modernizr test results are inaccurate');\n }\n }\n } else {\n result = !pseudo && elem.currentStyle && elem.currentStyle[prop];\n }\n\n return result;\n }\n\n ;\n\n /**\n * nativeTestProps allows for us to use native feature detection functionality if available.\n * some prefixed form, or false, in the case of an unsupported rule\n *\n * @access private\n * @function nativeTestProps\n * @param {Array} props - An array of property names\n * @param {string} value - A string representing the value we want to check via @supports\n * @returns {boolean|undefined} A boolean when @supports exists, undefined otherwise\n */\n // Accepts a list of property names and a single value\n // Returns `undefined` if native detection not available\n function nativeTestProps(props, value) {\n var i = props.length;\n // Start with the JS API: https://www.w3.org/TR/css3-conditional/#the-css-interface\n if ('CSS' in window && 'supports' in window.CSS) {\n // Try every prefixed variant of the property\n while (i--) {\n if (window.CSS.supports(domToCSS(props[i]), value)) {\n return true;\n }\n }\n return false;\n }\n // Otherwise fall back to at-rule (for Opera 12.x)\n else if ('CSSSupportsRule' in window) {\n // Build a condition string for every prefixed variant\n var conditionText = [];\n while (i--) {\n conditionText.push('(' + domToCSS(props[i]) + ':' + value + ')');\n }\n conditionText = conditionText.join(' or ');\n return injectElementWithStyles('@supports (' + conditionText + ') { #modernizr { position: absolute; } }', function(node) {\n return computedStyle(node, null, 'position') === 'absolute';\n });\n }\n return undefined;\n }\n ;\n\n /**\n * cssToDOM takes a hyphen-case string and converts it to camelCase\n * e.g. box-sizing -> boxSizing\n *\n * @access private\n * @function cssToDOM\n * @param {string} name - String name of hyphen-case prop we want to convert\n * @returns {string} The camelCase version of the supplied name\n */\n function cssToDOM(name) {\n return name.replace(/([a-z])-([a-z])/g, function(str, m1, m2) {\n return m1 + m2.toUpperCase();\n }).replace(/^-/, '');\n }\n\n ;\n\n // testProps is a generic CSS / DOM property test.\n\n // In testing support for a given CSS property, it's legit to test:\n // `elem.style[styleName] !== undefined`\n // If the property is supported it will return an empty string,\n // if unsupported it will return undefined.\n\n // We'll take advantage of this quick test and skip setting a style\n // on our modernizr element, but instead just testing undefined vs\n // empty string.\n\n // Property names can be provided in either camelCase or hyphen-case.\n\n function testProps(props, prefixed, value, skipValueTest) {\n skipValueTest = is(skipValueTest, 'undefined') ? false : skipValueTest;\n\n // Try native detect first\n if (!is(value, 'undefined')) {\n var result = nativeTestProps(props, value);\n if (!is(result, 'undefined')) {\n return result;\n }\n }\n\n // Otherwise do it properly\n var afterInit, i, propsLength, prop, before;\n\n // If we don't have a style element, that means we're running async or after\n // the core tests, so we'll need to create our own elements to use.\n\n // Inside of an SVG element, in certain browsers, the `style` element is only\n // defined for valid tags. Therefore, if `modernizr` does not have one, we\n // fall back to a less used element and hope for the best.\n // For strict XHTML browsers the hardly used samp element is used.\n var elems = ['modernizr', 'tspan', 'samp'];\n while (!mStyle.style && elems.length) {\n afterInit = true;\n mStyle.modElem = createElement(elems.shift());\n mStyle.style = mStyle.modElem.style;\n }\n\n // Delete the objects if we created them.\n function cleanElems() {\n if (afterInit) {\n delete mStyle.style;\n delete mStyle.modElem;\n }\n }\n\n propsLength = props.length;\n for (i = 0; i < propsLength; i++) {\n prop = props[i];\n before = mStyle.style[prop];\n\n if (contains(prop, '-')) {\n prop = cssToDOM(prop);\n }\n\n if (mStyle.style[prop] !== undefined) {\n\n // If value to test has been passed in, do a set-and-check test.\n // 0 (integer) is a valid property value, so check that `value` isn't\n // undefined, rather than just checking it's truthy.\n if (!skipValueTest && !is(value, 'undefined')) {\n\n // Needs a try catch block because of old IE. This is slow, but will\n // be avoided in most cases because `skipValueTest` will be used.\n try {\n mStyle.style[prop] = value;\n } catch (e) {}\n\n // If the property value has changed, we assume the value used is\n // supported. If `value` is empty string, it'll fail here (because\n // it hasn't changed), which matches how browsers have implemented\n // CSS.supports()\n if (mStyle.style[prop] !== before) {\n cleanElems();\n return prefixed === 'pfx' ? prop : true;\n }\n }\n // Otherwise just return true, or the property name if this is a\n // `prefixed()` call\n else {\n cleanElems();\n return prefixed === 'pfx' ? prop : true;\n }\n }\n }\n cleanElems();\n return false;\n }\n\n ;\n\n /**\n * List of JavaScript DOM values used for tests\n *\n * @memberOf Modernizr\n * @name Modernizr._domPrefixes\n * @optionName Modernizr._domPrefixes\n * @optionProp domPrefixes\n * @access public\n * @example\n *\n * Modernizr._domPrefixes is exactly the same as [_prefixes](#modernizr-_prefixes), but rather\n * than hyphen-case properties, all properties are their Capitalized variant\n *\n * ```js\n * Modernizr._domPrefixes === [ \"Moz\", \"O\", \"ms\", \"Webkit\" ];\n * ```\n */\n var domPrefixes = (ModernizrProto._config.usePrefixes ? omPrefixes.toLowerCase().split(' ') : []);\n ModernizrProto._domPrefixes = domPrefixes;\n\n\n /**\n * fnBind is a super small [bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind) polyfill.\n *\n * @access private\n * @function fnBind\n * @param {Function} fn - a function you want to change `this` reference to\n * @param {object} that - the `this` you want to call the function with\n * @returns {Function} The wrapped version of the supplied function\n */\n function fnBind(fn, that) {\n return function() {\n return fn.apply(that, arguments);\n };\n }\n\n ;\n\n /**\n * testDOMProps is a generic DOM property test; if a browser supports\n * a certain property, it won't return undefined for it.\n *\n * @access private\n * @function testDOMProps\n * @param {Array} props - An array of properties to test for\n * @param {object} obj - An object or Element you want to use to test the parameters again\n * @param {boolean|object} elem - An Element to bind the property lookup again. Use `false` to prevent the check\n * @returns {boolean|*} returns `false` if the prop is unsupported, otherwise the value that is supported\n */\n function testDOMProps(props, obj, elem) {\n var item;\n\n for (var i in props) {\n if (props[i] in obj) {\n\n // return the property name as a string\n if (elem === false) {\n return props[i];\n }\n\n item = obj[props[i]];\n\n // let's bind a function\n if (is(item, 'function')) {\n // bind to obj unless overridden\n return fnBind(item, elem || obj);\n }\n\n // return the unbound function or obj or value\n return item;\n }\n }\n return false;\n }\n\n ;\n\n /**\n * testPropsAll tests a list of DOM properties we want to check against.\n * We specify literally ALL possible (known and/or likely) properties on\n * the element including the non-vendor prefixed one, for forward-\n * compatibility.\n *\n * @access private\n * @function testPropsAll\n * @param {string} prop - A string of the property to test for\n * @param {string|object} [prefixed] - An object to check the prefixed properties on. Use a string to skip\n * @param {HTMLElement|SVGElement} [elem] - An element used to test the property and value against\n * @param {string} [value] - A string of a css value\n * @param {boolean} [skipValueTest] - An boolean representing if you want to test if value sticks when set\n * @returns {string|boolean} returns the string version of the property, or `false` if it is unsupported\n */\n function testPropsAll(prop, prefixed, elem, value, skipValueTest) {\n\n var ucProp = prop.charAt(0).toUpperCase() + prop.slice(1),\n props = (prop + ' ' + cssomPrefixes.join(ucProp + ' ') + ucProp).split(' ');\n\n // did they call .prefixed('boxSizing') or are we just testing a prop?\n if (is(prefixed, 'string') || is(prefixed, 'undefined')) {\n return testProps(props, prefixed, value, skipValueTest);\n\n // otherwise, they called .prefixed('requestAnimationFrame', window[, elem])\n } else {\n props = (prop + ' ' + (domPrefixes).join(ucProp + ' ') + ucProp).split(' ');\n return testDOMProps(props, prefixed, elem);\n }\n }\n\n // Modernizr.testAllProps() investigates whether a given style property,\n // or any of its vendor-prefixed variants, is recognized\n //\n // Note that the property names must be provided in the camelCase variant.\n // Modernizr.testAllProps('boxSizing')\n ModernizrProto.testAllProps = testPropsAll;\n\n\n\n /**\n * testAllProps determines whether a given CSS property is supported in the browser\n *\n * @memberOf Modernizr\n * @name Modernizr.testAllProps\n * @optionName Modernizr.testAllProps()\n * @optionProp testAllProps\n * @access public\n * @function testAllProps\n * @param {string} prop - String naming the property to test (either camelCase or hyphen-case)\n * @param {string} [value] - String of the value to test\n * @param {boolean} [skipValueTest=false] - Whether to skip testing that the value is supported when using non-native detection\n * @returns {string|boolean} returns the string version of the property, or `false` if it is unsupported\n * @example\n *\n * testAllProps determines whether a given CSS property, in some prefixed form,\n * is supported by the browser.\n *\n * ```js\n * testAllProps('boxSizing') // true\n * ```\n *\n * It can optionally be given a CSS value in string form to test if a property\n * value is valid\n *\n * ```js\n * testAllProps('display', 'block') // true\n * testAllProps('display', 'penguin') // false\n * ```\n *\n * A boolean can be passed as a third parameter to skip the value check when\n * native detection (@supports) isn't available.\n *\n * ```js\n * testAllProps('shapeOutside', 'content-box', true);\n * ```\n */\n function testAllProps(prop, value, skipValueTest) {\n return testPropsAll(prop, undefined, undefined, value, skipValueTest);\n }\n\n ModernizrProto.testAllProps = testAllProps;\n\n\n /*!\n {\n \"name\": \"Flexbox\",\n \"property\": \"flexbox\",\n \"caniuse\": \"flexbox\",\n \"tags\": [\"css\"],\n \"notes\": [{\n \"name\": \"The _new_ flexbox\",\n \"href\": \"https://www.w3.org/TR/css-flexbox-1/\"\n }],\n \"warnings\": [\n \"A `true` result for this detect does not imply that the `flex-wrap` property is supported; see the `flexwrap` detect.\"\n ]\n }\n !*/\n /* DOC\n Detects support for the Flexible Box Layout model, a.k.a. Flexbox, which allows easy manipulation of layout order and sizing within a container.\n */\n\n Modernizr.addTest('flexbox', testAllProps('flexBasis', '1px', true));\n\n /*!\n {\n \"name\": \"ES6 Promises\",\n \"property\": \"promises\",\n \"caniuse\": \"promises\",\n \"polyfills\": [\"es6promises\"],\n \"authors\": [\"Krister Kari\", \"Jake Archibald\"],\n \"tags\": [\"es6\"],\n \"notes\": [{\n \"name\": \"The ES6 promises spec\",\n \"href\": \"https://github.com/domenic/promises-unwrapping\"\n }, {\n \"name\": \"Chromium dashboard - ES6 Promises\",\n \"href\": \"https://www.chromestatus.com/features/5681726336532480\"\n }, {\n \"name\": \"JavaScript Promises: an Introduction\",\n \"href\": \"https://developers.google.com/web/fundamentals/primers/promises/\"\n }]\n }\n !*/\n /* DOC\n Check if browser implements ECMAScript 6 Promises per specification.\n */\n\n Modernizr.addTest('promises', function() {\n return 'Promise' in window &&\n // Some of these methods are missing from\n // Firefox/Chrome experimental implementations\n 'resolve' in window.Promise &&\n 'reject' in window.Promise &&\n 'all' in window.Promise &&\n 'race' in window.Promise &&\n // Older version of the spec had a resolver object\n // as the arg rather than a function\n (function() {\n var resolve;\n new window.Promise(function(r) { resolve = r; });\n return typeof resolve === 'function';\n }());\n });\n\n /*!\n {\n \"name\": \"classList\",\n \"caniuse\": \"classlist\",\n \"property\": \"classlist\",\n \"tags\": [\"dom\"],\n \"builderAliases\": [\"dataview_api\"],\n \"notes\": [{\n \"name\": \"MDN Docs\",\n \"href\": \"https://developer.mozilla.org/en/DOM/element.classList\"\n }]\n }\n !*/\n\n Modernizr.addTest('classlist', 'classList' in docElement);\n\n /*!\n {\n \"name\": \"dataset API\",\n \"caniuse\": \"dataset\",\n \"property\": \"dataset\",\n \"tags\": [\"dom\"],\n \"builderAliases\": [\"dom_dataset\"],\n \"authors\": [\"@phiggins42\"]\n }\n !*/\n\n // dataset API for data-* attributes\n Modernizr.addTest('dataset', function() {\n var n = createElement('div');\n n.setAttribute('data-a-b', 'c');\n return !!(n.dataset && n.dataset.aB === 'c');\n });\n\n /*!\n {\n \"name\": \"srcset attribute\",\n \"property\": \"srcset\",\n \"caniuse\": \"srcset\",\n \"tags\": [\"image\"],\n \"notes\": [{\n \"name\": \"Smashing Magazine Article\",\n \"href\": \"https://www.smashingmagazine.com/2013/08/webkit-implements-srcset-and-why-its-a-good-thing/\"\n }, {\n \"name\": \"Generate multi-resolution images for srcset with Grunt\",\n \"href\": \"https://addyosmani.com/blog/generate-multi-resolution-images-for-srcset-with-grunt/\"\n }]\n }\n !*/\n /* DOC\n Test for the srcset attribute of images\n */\n\n Modernizr.addTest('srcset', 'srcset' in createElement('img'));\n\n /*!\n {\n \"name\": \"SVG\",\n \"property\": \"svg\",\n \"caniuse\": \"svg\",\n \"tags\": [\"svg\"],\n \"authors\": [\"Erik Dahlstrom\"],\n \"polyfills\": [\n \"svgweb\",\n \"raphael\",\n \"canvg\",\n \"svg-boilerplate\",\n \"sie\",\n \"fabricjs\"\n ]\n }\n !*/\n /* DOC\n Detects support for SVG in `` or `` elements.\n */\n\n Modernizr.addTest('svg', !!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect);\n\n /*!\n {\n \"name\": \"Inline SVG\",\n \"property\": \"inlinesvg\",\n \"caniuse\": \"svg-html5\",\n \"tags\": [\"svg\"],\n \"notes\": [{\n \"name\": \"Test page\",\n \"href\": \"https://paulirish.com/demo/inline-svg\"\n }, {\n \"name\": \"Test page and results\",\n \"href\": \"https://codepen.io/eltonmesquita/full/GgXbvo/\"\n }],\n \"polyfills\": [\"inline-svg-polyfill\"],\n \"knownBugs\": [\"False negative on some Chromia browsers.\"]\n }\n !*/\n /* DOC\n Detects support for inline SVG in HTML (not within XHTML).\n */\n\n Modernizr.addTest('inlinesvg', function() {\n var div = createElement('div');\n div.innerHTML = '';\n return (typeof SVGRect !== 'undefined' && div.firstChild && div.firstChild.namespaceURI) === 'http://www.w3.org/2000/svg';\n });\n\n\n /**\n * hasOwnProp is a shim for hasOwnProperty that is needed for Safari 2.0 support\n *\n * @author kangax\n * @access private\n * @function hasOwnProp\n * @param {object} object - The object to check for a property\n * @param {string} property - The property to check for\n * @returns {boolean}\n */\n\n // hasOwnProperty shim by kangax needed for Safari 2.0 support\n var hasOwnProp;\n\n (function() {\n var _hasOwnProperty = ({}).hasOwnProperty;\n /* istanbul ignore else */\n /* we have no way of testing IE 5.5 or safari 2,\n * so just assume the else gets hit */\n if (!is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined')) {\n hasOwnProp = function(object, property) {\n return _hasOwnProperty.call(object, property);\n };\n }\n else {\n hasOwnProp = function(object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */\n return ((property in object) && is(object.constructor.prototype[property], 'undefined'));\n };\n }\n })();\n\n\n\n /**\n * setClasses takes an array of class names and adds them to the root element\n *\n * @access private\n * @function setClasses\n * @param {string[]} classes - Array of class names\n */\n // Pass in an and array of class names, e.g.:\n // ['no-webp', 'borderradius', ...]\n function setClasses(classes) {\n var className = docElement.className;\n var classPrefix = Modernizr._config.classPrefix || '';\n\n if (isSVG) {\n className = className.baseVal;\n }\n\n // Change `no-js` to `js` (independently of the `enableClasses` option)\n // Handle classPrefix on this too\n if (Modernizr._config.enableJSClass) {\n var reJS = new RegExp('(^|\\\\s)' + classPrefix + 'no-js(\\\\s|$)');\n className = className.replace(reJS, '$1' + classPrefix + 'js$2');\n }\n\n if (Modernizr._config.enableClasses) {\n // Add the new classes\n if (classes.length > 0) {\n className += ' ' + classPrefix + classes.join(' ' + classPrefix);\n }\n if (isSVG) {\n docElement.className.baseVal = className;\n } else {\n docElement.className = className;\n }\n }\n }\n\n ;\n\n\n // _l tracks listeners for async tests, as well as tests that execute after the initial run\n ModernizrProto._l = {};\n\n /**\n * Modernizr.on is a way to listen for the completion of async tests. Being\n * asynchronous, they may not finish before your scripts run. As a result you\n * will get a possibly false negative `undefined` value.\n *\n * @memberOf Modernizr\n * @name Modernizr.on\n * @access public\n * @function on\n * @param {string} feature - String name of the feature detect\n * @param {Function} cb - Callback function returning a Boolean - true if feature is supported, false if not\n * @returns {void}\n * @example\n *\n * ```js\n * Modernizr.on('flash', function( result ) {\n * if (result) {\n * // the browser has flash\n * } else {\n * // the browser does not have flash\n * }\n * });\n * ```\n */\n ModernizrProto.on = function(feature, cb) {\n // Create the list of listeners if it doesn't exist\n if (!this._l[feature]) {\n this._l[feature] = [];\n }\n\n // Push this test on to the listener list\n this._l[feature].push(cb);\n\n // If it's already been resolved, trigger it on next tick\n if (Modernizr.hasOwnProperty(feature)) {\n // Next Tick\n setTimeout(function() {\n Modernizr._trigger(feature, Modernizr[feature]);\n }, 0);\n }\n };\n\n /**\n * _trigger is the private function used to signal test completion and run any\n * callbacks registered through [Modernizr.on](#modernizr-on)\n *\n * @memberOf Modernizr\n * @name Modernizr._trigger\n * @access private\n * @function _trigger\n * @param {string} feature - string name of the feature detect\n * @param {Function|boolean} [res] - A feature detection function, or the boolean =\n * result of a feature detection function\n * @returns {void}\n */\n ModernizrProto._trigger = function(feature, res) {\n if (!this._l[feature]) {\n return;\n }\n\n var cbs = this._l[feature];\n\n // Force async\n setTimeout(function() {\n var i, cb;\n for (i = 0; i < cbs.length; i++) {\n cb = cbs[i];\n cb(res);\n }\n }, 0);\n\n // Don't trigger these again\n delete this._l[feature];\n };\n\n /**\n * addTest allows you to define your own feature detects that are not currently\n * included in Modernizr (under the covers it's the exact same code Modernizr\n * uses for its own [feature detections](https://github.com/Modernizr/Modernizr/tree/master/feature-detects)).\n * Just like the official detects, the result\n * will be added onto the Modernizr object, as well as an appropriate className set on\n * the html element when configured to do so\n *\n * @memberOf Modernizr\n * @name Modernizr.addTest\n * @optionName Modernizr.addTest()\n * @optionProp addTest\n * @access public\n * @function addTest\n * @param {string|object} feature - The string name of the feature detect, or an\n * object of feature detect names and test\n * @param {Function|boolean} test - Function returning true if feature is supported,\n * false if not. Otherwise a boolean representing the results of a feature detection\n * @returns {object} the Modernizr object to allow chaining\n * @example\n *\n * The most common way of creating your own feature detects is by calling\n * `Modernizr.addTest` with a string (preferably just lowercase, without any\n * punctuation), and a function you want executed that will return a boolean result\n *\n * ```js\n * Modernizr.addTest('itsTuesday', function() {\n * var d = new Date();\n * return d.getDay() === 2;\n * });\n * ```\n *\n * When the above is run, it will set Modernizr.itstuesday to `true` when it is tuesday,\n * and to `false` every other day of the week. One thing to notice is that the names of\n * feature detect functions are always lowercased when added to the Modernizr object. That\n * means that `Modernizr.itsTuesday` will not exist, but `Modernizr.itstuesday` will.\n *\n *\n * Since we only look at the returned value from any feature detection function,\n * you do not need to actually use a function. For simple detections, just passing\n * in a statement that will return a boolean value works just fine.\n *\n * ```js\n * Modernizr.addTest('hasjquery', 'jQuery' in window);\n * ```\n *\n * Just like before, when the above runs `Modernizr.hasjquery` will be true if\n * jQuery has been included on the page. Not using a function saves a small amount\n * of overhead for the browser, as well as making your code much more readable.\n *\n * Finally, you also have the ability to pass in an object of feature names and\n * their tests. This is handy if you want to add multiple detections in one go.\n * The keys should always be a string, and the value can be either a boolean or\n * function that returns a boolean.\n *\n * ```js\n * var detects = {\n * 'hasjquery': 'jQuery' in window,\n * 'itstuesday': function() {\n * var d = new Date();\n * return d.getDay() === 2;\n * }\n * }\n *\n * Modernizr.addTest(detects);\n * ```\n *\n * There is really no difference between the first methods and this one, it is\n * just a convenience to let you write more readable code.\n */\n function addTest(feature, test) {\n\n if (typeof feature === 'object') {\n for (var key in feature) {\n if (hasOwnProp(feature, key)) {\n addTest(key, feature[ key ]);\n }\n }\n } else {\n\n feature = feature.toLowerCase();\n var featureNameSplit = feature.split('.');\n var last = Modernizr[featureNameSplit[0]];\n\n // Again, we don't check for parent test existence. Get that right, though.\n if (featureNameSplit.length === 2) {\n last = last[featureNameSplit[1]];\n }\n\n if (typeof last !== 'undefined') {\n // we're going to quit if you're trying to overwrite an existing test\n // if we were to allow it, we'd do this:\n // var re = new RegExp(\"\\\\b(no-)?\" + feature + \"\\\\b\");\n // docElement.className = docElement.className.replace( re, '' );\n // but, no rly, stuff 'em.\n return Modernizr;\n }\n\n test = typeof test === 'function' ? test() : test;\n\n // Set the value (this is the magic, right here).\n if (featureNameSplit.length === 1) {\n Modernizr[featureNameSplit[0]] = test;\n } else {\n // cast to a Boolean, if not one already\n if (Modernizr[featureNameSplit[0]] && !(Modernizr[featureNameSplit[0]] instanceof Boolean)) {\n Modernizr[featureNameSplit[0]] = new Boolean(Modernizr[featureNameSplit[0]]);\n }\n\n Modernizr[featureNameSplit[0]][featureNameSplit[1]] = test;\n }\n\n // Set a single class (either `feature` or `no-feature`)\n setClasses([(!!test && test !== false ? '' : 'no-') + featureNameSplit.join('-')]);\n\n // Trigger the event\n Modernizr._trigger(feature, test);\n }\n\n return Modernizr; // allow chaining.\n }\n\n // After all the tests are run, add self to the Modernizr prototype\n Modernizr._q.push(function() {\n ModernizrProto.addTest = addTest;\n });\n\n\n\n /*!\n {\n \"name\": \"SVG as an tag source\",\n \"property\": \"svgasimg\",\n \"caniuse\": \"svg-img\",\n \"tags\": [\"svg\"],\n \"aliases\": [\"svgincss\"],\n \"authors\": [\"Chris Coyier\"],\n \"notes\": [{\n \"name\": \"HTML5 Spec\",\n \"href\": \"https://www.w3.org/TR/html5/embedded-content-0.html#the-img-element\"\n }]\n }\n !*/\n\n\n // Original Async test by Stu Cox\n // https://gist.github.com/chriscoyier/8774501\n\n // Now a Sync test based on good results here\n // https://codepen.io/chriscoyier/pen/bADFx\n\n // Note http://www.w3.org/TR/SVG11/feature#Image is *supposed* to represent\n // support for the `` tag in SVG, not an SVG file linked from an ``\n // tag in HTML – but it’s a heuristic which works\n Modernizr.addTest('svgasimg', document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#Image', '1.1'));\n\n\n /**\n * List of property values to set for css tests. See ticket #21\n * https://github.com/modernizr/modernizr/issues/21\n *\n * @memberOf Modernizr\n * @name Modernizr._prefixes\n * @optionName Modernizr._prefixes\n * @optionProp prefixes\n * @access public\n * @example\n *\n * Modernizr._prefixes is the internal list of prefixes that we test against\n * inside of things like [prefixed](#modernizr-prefixed) and [prefixedCSS](#-code-modernizr-prefixedcss). It is simply\n * an array of hyphen-case vendor prefixes you can use within your code.\n *\n * Some common use cases include\n *\n * Generating all possible prefixed version of a CSS property\n * ```js\n * var rule = Modernizr._prefixes.join('transform: rotate(20deg); ');\n *\n * rule === 'transform: rotate(20deg); webkit-transform: rotate(20deg); moz-transform: rotate(20deg); o-transform: rotate(20deg); ms-transform: rotate(20deg);'\n * ```\n *\n * Generating all possible prefixed version of a CSS value\n * ```js\n * rule = 'display:' + Modernizr._prefixes.join('flex; display:') + 'flex';\n *\n * rule === 'display:flex; display:-webkit-flex; display:-moz-flex; display:-o-flex; display:-ms-flex; display:flex'\n * ```\n */\n // we use ['',''] rather than an empty array in order to allow a pattern of .`join()`ing prefixes to test\n // values in feature detects to continue to work\n var prefixes = (ModernizrProto._config.usePrefixes ? ' -webkit- -moz- -o- -ms- '.split(' ') : ['','']);\n\n // expose these for the plugin API. Look in the source for how to join() them against your input\n ModernizrProto._prefixes = prefixes;\n\n\n /*!\n {\n \"name\": \"CSS position: sticky\",\n \"property\": \"csspositionsticky\",\n \"tags\": [\"css\"],\n \"builderAliases\": [\"css_positionsticky\"],\n \"notes\": [{\n \"name\": \"Chrome bug report\",\n \"href\": \"https://bugs.chromium.org/p/chromium/issues/detail?id=322972\"\n }],\n \"warnings\": [\"using position:sticky on anything but top aligned elements is buggy in Chrome < 37 and iOS <=7+\"]\n }\n !*/\n\n // Sticky positioning - constrains an element to be positioned inside the\n // intersection of its container box, and the viewport.\n Modernizr.addTest('csspositionsticky', function() {\n var prop = 'position:';\n var value = 'sticky';\n var el = createElement('a');\n var mStyle = el.style;\n\n mStyle.cssText = prop + prefixes.join(value + ';' + prop).slice(0, -prop.length);\n\n return mStyle.position.indexOf(value) !== -1;\n });\n\n /*!\n {\n \"name\": \"Fetch API\",\n \"property\": \"fetch\",\n \"tags\": [\"network\"],\n \"caniuse\": \"fetch\",\n \"notes\": [{\n \"name\": \"WHATWG Spec\",\n \"href\": \"https://fetch.spec.whatwg.org/\"\n }],\n \"polyfills\": [\"fetch\"]\n }\n !*/\n /* DOC\n Detects support for the fetch API, a modern replacement for XMLHttpRequest.\n */\n\n Modernizr.addTest('fetch', 'fetch' in window);\n\n\n // Run each test\n testRunner();\n\n delete ModernizrProto.addTest;\n delete ModernizrProto.addAsyncTest;\n\n // Run the things that are supposed to run after the tests\n for (var i = 0; i < Modernizr._q.length; i++) {\n Modernizr._q[i]();\n }\n\n // Leak Modernizr namespace\n scriptGlobalObject.Modernizr = Modernizr;\n\n\n ;\n\n})(window, window, document);\n"],"names":["scriptGlobalObject","window","document","undefined","tests","ModernizrProto","test","cb","self","name","fn","options","Modernizr","classes","is","obj","type","testRunner","featureNames","feature","aliasIdx","result","nameIdx","featureName","featureNameSplit","featureIdx","omPrefixes","cssomPrefixes","contains","str","substr","docElement","isSVG","createElement","modElem","mStyle","getBody","body","injectElementWithStyles","rule","callback","nodes","testnames","mod","style","ret","node","docOverflow","div","domToCSS","m1","computedStyle","elem","pseudo","prop","console","method","nativeTestProps","props","value","i","conditionText","cssToDOM","m2","testProps","prefixed","skipValueTest","afterInit","propsLength","before","elems","cleanElems","domPrefixes","fnBind","that","testDOMProps","item","testPropsAll","ucProp","testAllProps","resolve","r","n","hasOwnProp","_hasOwnProperty","object","property","setClasses","className","classPrefix","reJS","res","cbs","addTest","key","last","prefixes","el"],"mappings":"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"}