(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.HTMLMinifier = {})); })(this, (function (exports) { 'use strict'; var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; function getDefaultExportFromCjs (x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x; } function getAugmentedNamespace(n) { var f = n.default; if (typeof f == "function") { var a = function () { return f.apply(this, arguments); }; a.prototype = f.prototype; } else a = {}; Object.defineProperty(a, '__esModule', {value: true}); Object.keys(n).forEach(function (k) { var d = Object.getOwnPropertyDescriptor(n, k); Object.defineProperty(a, k, d.get ? d : { enumerable: true, get: function () { return n[k]; } }); }); return a; } var cleanCss = {exports: {}}; var global$1 = (typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}); // shim for using process in browser // based off https://github.com/defunctzombie/node-process/blob/master/browser.js function defaultSetTimout() { throw new Error('setTimeout has not been defined'); } function defaultClearTimeout () { throw new Error('clearTimeout has not been defined'); } var cachedSetTimeout = defaultSetTimout; var cachedClearTimeout = defaultClearTimeout; if (typeof global$1.setTimeout === 'function') { cachedSetTimeout = setTimeout; } if (typeof global$1.clearTimeout === 'function') { cachedClearTimeout = clearTimeout; } function runTimeout(fun) { if (cachedSetTimeout === setTimeout) { //normal enviroments in sane situations return setTimeout(fun, 0); } // if setTimeout wasn't available but was latter defined if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { cachedSetTimeout = setTimeout; return setTimeout(fun, 0); } try { // when when somebody has screwed with setTimeout but no I.E. maddness return cachedSetTimeout(fun, 0); } catch(e){ try { // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally return cachedSetTimeout.call(null, fun, 0); } catch(e){ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error return cachedSetTimeout.call(this, fun, 0); } } } function runClearTimeout(marker) { if (cachedClearTimeout === clearTimeout) { //normal enviroments in sane situations return clearTimeout(marker); } // if clearTimeout wasn't available but was latter defined if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { cachedClearTimeout = clearTimeout; return clearTimeout(marker); } try { // when when somebody has screwed with setTimeout but no I.E. maddness return cachedClearTimeout(marker); } catch (e){ try { // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally return cachedClearTimeout.call(null, marker); } catch (e){ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. // Some versions of I.E. have different rules for clearTimeout vs setTimeout return cachedClearTimeout.call(this, marker); } } } var queue = []; var draining = false; var currentQueue; var queueIndex = -1; function cleanUpNextTick() { if (!draining || !currentQueue) { return; } draining = false; if (currentQueue.length) { queue = currentQueue.concat(queue); } else { queueIndex = -1; } if (queue.length) { drainQueue(); } } function drainQueue() { if (draining) { return; } var timeout = runTimeout(cleanUpNextTick); draining = true; var len = queue.length; while(len) { currentQueue = queue; queue = []; while (++queueIndex < len) { if (currentQueue) { currentQueue[queueIndex].run(); } } queueIndex = -1; len = queue.length; } currentQueue = null; draining = false; runClearTimeout(timeout); } function nextTick(fun) { var args = new Array(arguments.length - 1); if (arguments.length > 1) { for (var i = 1; i < arguments.length; i++) { args[i - 1] = arguments[i]; } } queue.push(new Item(fun, args)); if (queue.length === 1 && !draining) { runTimeout(drainQueue); } } // v8 likes predictible objects function Item(fun, array) { this.fun = fun; this.array = array; } Item.prototype.run = function () { this.fun.apply(null, this.array); }; var title = 'browser'; var platform$1 = 'browser'; var browser = true; var env = {}; var argv = []; var version = ''; // empty string to avoid regexp issues var versions = {}; var release$1 = {}; var config = {}; function noop$2() {} var on = noop$2; var addListener = noop$2; var once = noop$2; var off = noop$2; var removeListener = noop$2; var removeAllListeners = noop$2; var emit = noop$2; function binding(name) { throw new Error('process.binding is not supported'); } function cwd () { return '/' } function chdir (dir) { throw new Error('process.chdir is not supported'); }function umask() { return 0; } // from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js var performance = global$1.performance || {}; var performanceNow = performance.now || performance.mozNow || performance.msNow || performance.oNow || performance.webkitNow || function(){ return (new Date()).getTime() }; // generate timestamp or delta // see http://nodejs.org/api/process.html#process_process_hrtime function hrtime(previousTimestamp){ var clocktime = performanceNow.call(performance)*1e-3; var seconds = Math.floor(clocktime); var nanoseconds = Math.floor((clocktime%1)*1e9); if (previousTimestamp) { seconds = seconds - previousTimestamp[0]; nanoseconds = nanoseconds - previousTimestamp[1]; if (nanoseconds<0) { seconds--; nanoseconds += 1e9; } } return [seconds,nanoseconds] } var startTime = new Date(); function uptime$1() { var currentTime = new Date(); var dif = currentTime - startTime; return dif / 1000; } var browser$1 = { nextTick: nextTick, title: title, browser: browser, env: env, argv: argv, version: version, versions: versions, on: on, addListener: addListener, once: once, off: off, removeListener: removeListener, removeAllListeners: removeAllListeners, emit: emit, binding: binding, cwd: cwd, chdir: chdir, umask: umask, hrtime: hrtime, platform: platform$1, release: release$1, config: config, uptime: uptime$1 }; var clean$1 = {exports: {}}; function level0Optimize$1(tokens) { // noop as level 0 means no optimizations! return tokens; } var optimize$4 = level0Optimize$1; // adapted from http://nedbatchelder.com/blog/200712.html#e20071211T054956 var NUMBER_PATTERN = /([0-9]+)/; function naturalCompare$1(value1, value2) { var keys1 = ('' + value1).split(NUMBER_PATTERN).map(tryParseInt); var keys2 = ('' + value2).split(NUMBER_PATTERN).map(tryParseInt); var key1; var key2; var compareFirst = Math.min(keys1.length, keys2.length); var i, l; for (i = 0, l = compareFirst; i < l; i++) { key1 = keys1[i]; key2 = keys2[i]; if (key1 != key2) { return key1 > key2 ? 1 : -1; } } return keys1.length > keys2.length ? 1 : (keys1.length == keys2.length ? 0 : -1); } function tryParseInt(value) { return ('' + parseInt(value)) == value ? parseInt(value) : value; } var naturalCompare_1 = naturalCompare$1; var naturalCompare = naturalCompare_1; function naturalSorter$1(scope1, scope2) { return naturalCompare(scope1[1], scope2[1]); } function standardSorter(scope1, scope2) { return scope1[1] > scope2[1] ? 1 : -1; } function sortSelectors$3(selectors, method) { switch (method) { case 'natural': return selectors.sort(naturalSorter$1); case 'standard': return selectors.sort(standardSorter); case 'none': case false: return selectors; } } var sortSelectors_1 = sortSelectors$3; /* The MIT License (MIT) Copyright (c) 2016 CoderPuppy Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ var _endianness; function endianness() { if (typeof _endianness === 'undefined') { var a = new ArrayBuffer(2); var b = new Uint8Array(a); var c = new Uint16Array(a); b[0] = 1; b[1] = 2; if (c[0] === 258) { _endianness = 'BE'; } else if (c[0] === 513){ _endianness = 'LE'; } else { throw new Error('unable to figure out endianess'); } } return _endianness; } function hostname() { if (typeof global$1.location !== 'undefined') { return global$1.location.hostname } else return ''; } function loadavg() { return []; } function uptime() { return 0; } function freemem() { return Number.MAX_VALUE; } function totalmem() { return Number.MAX_VALUE; } function cpus() { return []; } function type() { return 'Browser'; } function release () { if (typeof global$1.navigator !== 'undefined') { return global$1.navigator.appVersion; } return ''; } function networkInterfaces () { return {}; } function getNetworkInterfaces () { return {}; } function arch() { return 'javascript'; } function platform() { return 'browser'; } function tmpDir() { return '/tmp'; } var tmpdir = tmpDir; var EOL = '\n'; function homedir(){ return '$HOME' } var _polyfillNode_os = { homedir: homedir, EOL: EOL, arch: arch, platform: platform, tmpdir: tmpdir, tmpDir: tmpDir, networkInterfaces:networkInterfaces, getNetworkInterfaces: getNetworkInterfaces, release: release, type: type, cpus: cpus, totalmem: totalmem, freemem: freemem, uptime: uptime, loadavg: loadavg, hostname: hostname, endianness: endianness, }; var _polyfillNode_os$1 = /*#__PURE__*/Object.freeze({ __proto__: null, endianness: endianness, hostname: hostname, loadavg: loadavg, uptime: uptime, freemem: freemem, totalmem: totalmem, cpus: cpus, type: type, release: release, networkInterfaces: networkInterfaces, getNetworkInterfaces: getNetworkInterfaces, arch: arch, platform: platform, tmpDir: tmpDir, tmpdir: tmpdir, EOL: EOL, homedir: homedir, default: _polyfillNode_os }); var require$$0$3 = /*@__PURE__*/getAugmentedNamespace(_polyfillNode_os$1); function override$7(source1, source2) { var target = {}; var key1; var key2; var item; for (key1 in source1) { item = source1[key1]; if (Array.isArray(item)) { target[key1] = item.slice(0); } else if (typeof item == 'object' && item !== null) { target[key1] = override$7(item, {}); } else { target[key1] = item; } } for (key2 in source2) { item = source2[key2]; if (key2 in target && Array.isArray(item)) { target[key2] = item.slice(0); } else if (key2 in target && typeof item == 'object' && item !== null) { target[key2] = override$7(target[key2], item); } else { target[key2] = item; } } return target; } var override_1 = override$7; var systemLineBreak = require$$0$3.EOL; var override$6 = override_1; var Breaks$1 = { AfterAtRule: 'afterAtRule', AfterBlockBegins: 'afterBlockBegins', AfterBlockEnds: 'afterBlockEnds', AfterComment: 'afterComment', AfterProperty: 'afterProperty', AfterRuleBegins: 'afterRuleBegins', AfterRuleEnds: 'afterRuleEnds', BeforeBlockEnds: 'beforeBlockEnds', BetweenSelectors: 'betweenSelectors' }; var BreakWith = { CarriageReturnLineFeed: '\r\n', LineFeed: '\n', System: systemLineBreak }; var IndentWith = { Space: ' ', Tab: '\t' }; var Spaces$2 = { AroundSelectorRelation: 'aroundSelectorRelation', BeforeBlockBegins: 'beforeBlockBegins', BeforeValue: 'beforeValue' }; var DEFAULTS$2 = { breaks: breaks(false), breakWith: BreakWith.System, indentBy: 0, indentWith: IndentWith.Space, spaces: spaces(false), wrapAt: false, semicolonAfterLastProperty: false }; var BEAUTIFY_ALIAS = 'beautify'; var KEEP_BREAKS_ALIAS = 'keep-breaks'; var OPTION_SEPARATOR$1 = ';'; var OPTION_NAME_VALUE_SEPARATOR = ':'; var HASH_VALUES_OPTION_SEPARATOR = ','; var HASH_VALUES_NAME_VALUE_SEPARATOR = '='; var FALSE_KEYWORD_1$1 = 'false'; var FALSE_KEYWORD_2$1 = 'off'; var TRUE_KEYWORD_1$1 = 'true'; var TRUE_KEYWORD_2$1 = 'on'; function breaks(value) { var breakOptions = {}; breakOptions[Breaks$1.AfterAtRule] = value; breakOptions[Breaks$1.AfterBlockBegins] = value; breakOptions[Breaks$1.AfterBlockEnds] = value; breakOptions[Breaks$1.AfterComment] = value; breakOptions[Breaks$1.AfterProperty] = value; breakOptions[Breaks$1.AfterRuleBegins] = value; breakOptions[Breaks$1.AfterRuleEnds] = value; breakOptions[Breaks$1.BeforeBlockEnds] = value; breakOptions[Breaks$1.BetweenSelectors] = value; return breakOptions; } function spaces(value) { var spaceOptions = {}; spaceOptions[Spaces$2.AroundSelectorRelation] = value; spaceOptions[Spaces$2.BeforeBlockBegins] = value; spaceOptions[Spaces$2.BeforeValue] = value; return spaceOptions; } function formatFrom$1(source) { if (source === undefined || source === false) { return false; } if (typeof source == 'object' && 'breakWith' in source) { source = override$6(source, { breakWith: mapBreakWith(source.breakWith) }); } if (typeof source == 'object' && 'indentBy' in source) { source = override$6(source, { indentBy: parseInt(source.indentBy) }); } if (typeof source == 'object' && 'indentWith' in source) { source = override$6(source, { indentWith: mapIndentWith(source.indentWith) }); } if (typeof source == 'object') { return remapBreaks(override$6(DEFAULTS$2, source)); } if (typeof source == 'string' && source == BEAUTIFY_ALIAS) { return remapBreaks( override$6(DEFAULTS$2, { breaks: breaks(true), indentBy: 2, spaces: spaces(true) }) ); } if (typeof source == 'string' && source == KEEP_BREAKS_ALIAS) { return remapBreaks( override$6(DEFAULTS$2, { breaks: { afterAtRule: true, afterBlockBegins: true, afterBlockEnds: true, afterComment: true, afterRuleEnds: true, beforeBlockEnds: true } }) ); } if (typeof source == 'string') { return remapBreaks(override$6(DEFAULTS$2, toHash(source))); } return DEFAULTS$2; } function toHash(string) { return string .split(OPTION_SEPARATOR$1) .reduce(function (accumulator, directive) { var parts = directive.split(OPTION_NAME_VALUE_SEPARATOR); var name = parts[0]; var value = parts[1]; if (name == 'breaks' || name == 'spaces') { accumulator[name] = hashValuesToHash(value); } else if (name == 'indentBy' || name == 'wrapAt') { accumulator[name] = parseInt(value); } else if (name == 'indentWith') { accumulator[name] = mapIndentWith(value); } else if (name == 'breakWith') { accumulator[name] = mapBreakWith(value); } return accumulator; }, {}); } function hashValuesToHash(string) { return string .split(HASH_VALUES_OPTION_SEPARATOR) .reduce(function (accumulator, directive) { var parts = directive.split(HASH_VALUES_NAME_VALUE_SEPARATOR); var name = parts[0]; var value = parts[1]; accumulator[name] = normalizeValue$1(value); return accumulator; }, {}); } function normalizeValue$1(value) { switch (value) { case FALSE_KEYWORD_1$1: case FALSE_KEYWORD_2$1: return false; case TRUE_KEYWORD_1$1: case TRUE_KEYWORD_2$1: return true; default: return value; } } function mapBreakWith(value) { switch (value) { case 'windows': case 'crlf': case BreakWith.CarriageReturnLineFeed: return BreakWith.CarriageReturnLineFeed; case 'unix': case 'lf': case BreakWith.LineFeed: return BreakWith.LineFeed; default: return systemLineBreak; } } function mapIndentWith(value) { switch (value) { case 'space': return IndentWith.Space; case 'tab': return IndentWith.Tab; default: return value; } } function remapBreaks(source) { for (var key in Breaks$1) { var breakName = Breaks$1[key]; var breakValue = source.breaks[breakName]; if (breakValue === true) { source.breaks[breakName] = source.breakWith; } else if (breakValue === false) { source.breaks[breakName] = ''; } else { source.breaks[breakName] = source.breakWith.repeat(parseInt(breakValue)); } } return source; } var format$3 = { Breaks: Breaks$1, Spaces: Spaces$2, formatFrom: formatFrom$1 }; var Marker$g = { ASTERISK: '*', AT: '@', BACK_SLASH: '\\', CARRIAGE_RETURN: '\r', CLOSE_CURLY_BRACKET: '}', CLOSE_ROUND_BRACKET: ')', CLOSE_SQUARE_BRACKET: ']', COLON: ':', COMMA: ',', DOUBLE_QUOTE: '"', EXCLAMATION: '!', FORWARD_SLASH: '/', INTERNAL: '-clean-css-', NEW_LINE_NIX: '\n', OPEN_CURLY_BRACKET: '{', OPEN_ROUND_BRACKET: '(', OPEN_SQUARE_BRACKET: '[', SEMICOLON: ';', SINGLE_QUOTE: '\'', SPACE: ' ', TAB: '\t', UNDERSCORE: '_' }; var marker = Marker$g; function formatPosition$4(metadata) { var line = metadata[0]; var column = metadata[1]; var source = metadata[2]; return source ? source + ':' + line + ':' + column : line + ':' + column; } var formatPosition_1 = formatPosition$4; var Spaces$1 = format$3.Spaces; var Marker$f = marker; var formatPosition$3 = formatPosition_1; var CASE_ATTRIBUTE_PATTERN = /[\s"'][iI]\s*\]/; var CASE_RESTORE_PATTERN = /([\d\w])([iI])\]/g; var DOUBLE_QUOTE_CASE_PATTERN = /="([a-zA-Z][a-zA-Z\d\-_]+)"([iI])/g; var DOUBLE_QUOTE_PATTERN = /="([a-zA-Z][a-zA-Z\d\-_]+)"(\s|\])/g; var HTML_COMMENT_PATTERN = /^(?:(?:)\s*)+/; var SINGLE_QUOTE_CASE_PATTERN = /='([a-zA-Z][a-zA-Z\d\-_]+)'([iI])/g; var SINGLE_QUOTE_PATTERN = /='([a-zA-Z][a-zA-Z\d\-_]+)'(\s|\])/g; var RELATION_PATTERN$1 = /[>\+~]/; var WHITESPACE_PATTERN$2 = /\s/; var ASTERISK_PLUS_HTML_HACK = '*+html '; var ASTERISK_FIRST_CHILD_PLUS_HTML_HACK = '*:first-child+html '; var LESS_THAN = '<'; var PSEUDO_CLASSES_WITH_SELECTORS = [ ':current', ':future', ':has', ':host', ':host-context', ':is', ':not', ':past', ':where' ]; function hasInvalidCharacters(value) { var isEscaped; var isInvalid = false; var character; var isQuote = false; var i, l; for (i = 0, l = value.length; i < l; i++) { character = value[i]; if (isEscaped) ; else if (character == Marker$f.SINGLE_QUOTE || character == Marker$f.DOUBLE_QUOTE) { isQuote = !isQuote; } else if (!isQuote && (character == Marker$f.CLOSE_CURLY_BRACKET || character == Marker$f.EXCLAMATION || character == LESS_THAN || character == Marker$f.SEMICOLON)) { isInvalid = true; break; } else if (!isQuote && i === 0 && RELATION_PATTERN$1.test(character)) { isInvalid = true; break; } isEscaped = character == Marker$f.BACK_SLASH; } return isInvalid; } function removeWhitespace(value, format) { var stripped = []; var character; var isNewLineNix; var isNewLineWin; var isEscaped; var wasEscaped; var isQuoted; var isSingleQuoted; var isDoubleQuoted; var isAttribute; var isRelation; var isWhitespace; var isSpaceAwarePseudoClass; var roundBracketLevel = 0; var wasComma = false; var wasRelation = false; var wasWhitespace = false; var withCaseAttribute = CASE_ATTRIBUTE_PATTERN.test(value); var spaceAroundRelation = format && format.spaces[Spaces$1.AroundSelectorRelation]; var i, l; for (i = 0, l = value.length; i < l; i++) { character = value[i]; isNewLineNix = character == Marker$f.NEW_LINE_NIX; isNewLineWin = character == Marker$f.NEW_LINE_NIX && value[i - 1] == Marker$f.CARRIAGE_RETURN; isQuoted = isSingleQuoted || isDoubleQuoted; isRelation = !isAttribute && !isEscaped && roundBracketLevel === 0 && RELATION_PATTERN$1.test(character); isWhitespace = WHITESPACE_PATTERN$2.test(character); isSpaceAwarePseudoClass = roundBracketLevel == 1 && character == Marker$f.CLOSE_ROUND_BRACKET ? false : isSpaceAwarePseudoClass || (roundBracketLevel === 0 && character == Marker$f.COLON && isPseudoClassWithSelectors(value, i)); if (wasEscaped && isQuoted && isNewLineWin) { // swallow escaped new windows lines in comments stripped.pop(); stripped.pop(); } else if (isEscaped && isQuoted && isNewLineNix) { // swallow escaped new *nix lines in comments stripped.pop(); } else if (isEscaped) { stripped.push(character); } else if (character == Marker$f.OPEN_SQUARE_BRACKET && !isQuoted) { stripped.push(character); isAttribute = true; } else if (character == Marker$f.CLOSE_SQUARE_BRACKET && !isQuoted) { stripped.push(character); isAttribute = false; } else if (character == Marker$f.OPEN_ROUND_BRACKET && !isQuoted) { stripped.push(character); roundBracketLevel++; } else if (character == Marker$f.CLOSE_ROUND_BRACKET && !isQuoted) { stripped.push(character); roundBracketLevel--; } else if (character == Marker$f.SINGLE_QUOTE && !isQuoted) { stripped.push(character); isSingleQuoted = true; } else if (character == Marker$f.DOUBLE_QUOTE && !isQuoted) { stripped.push(character); isDoubleQuoted = true; } else if (character == Marker$f.SINGLE_QUOTE && isQuoted) { stripped.push(character); isSingleQuoted = false; } else if (character == Marker$f.DOUBLE_QUOTE && isQuoted) { stripped.push(character); isDoubleQuoted = false; } else if (isWhitespace && wasRelation && !spaceAroundRelation) { continue; } else if (!isWhitespace && wasRelation && spaceAroundRelation) { stripped.push(Marker$f.SPACE); stripped.push(character); } else if (isWhitespace && !wasWhitespace && wasComma && roundBracketLevel > 0 && isSpaceAwarePseudoClass) ; else if (isWhitespace && !wasWhitespace && roundBracketLevel > 0 && isSpaceAwarePseudoClass) { stripped.push(character); } else if (isWhitespace && (isAttribute || roundBracketLevel > 0) && !isQuoted) ; else if (isWhitespace && wasWhitespace && !isQuoted) ; else if ((isNewLineWin || isNewLineNix) && (isAttribute || roundBracketLevel > 0) && isQuoted) ; else if (isRelation && wasWhitespace && !spaceAroundRelation) { stripped.pop(); stripped.push(character); } else if (isRelation && !wasWhitespace && spaceAroundRelation) { stripped.push(Marker$f.SPACE); stripped.push(character); } else if (isWhitespace) { stripped.push(Marker$f.SPACE); } else { stripped.push(character); } wasEscaped = isEscaped; isEscaped = character == Marker$f.BACK_SLASH; wasRelation = isRelation; wasWhitespace = isWhitespace; wasComma = character == Marker$f.COMMA; } return withCaseAttribute ? stripped.join('').replace(CASE_RESTORE_PATTERN, '$1 $2]') : stripped.join(''); } function isPseudoClassWithSelectors(value, colonPosition) { var pseudoClass = value.substring(colonPosition, value.indexOf(Marker$f.OPEN_ROUND_BRACKET, colonPosition)); return PSEUDO_CLASSES_WITH_SELECTORS.indexOf(pseudoClass) > -1; } function removeQuotes(value) { if (value.indexOf('\'') == -1 && value.indexOf('"') == -1) { return value; } return value .replace(SINGLE_QUOTE_CASE_PATTERN, '=$1 $2') .replace(SINGLE_QUOTE_PATTERN, '=$1$2') .replace(DOUBLE_QUOTE_CASE_PATTERN, '=$1 $2') .replace(DOUBLE_QUOTE_PATTERN, '=$1$2'); } function tidyRules$3(rules, removeUnsupported, adjacentSpace, format, warnings) { var list = []; var repeated = []; function removeHTMLComment(rule, match) { warnings.push('HTML comment \'' + match + '\' at ' + formatPosition$3(rule[2][0]) + '. Removing.'); return ''; } for (var i = 0, l = rules.length; i < l; i++) { var rule = rules[i]; var reduced = rule[1]; reduced = reduced.replace(HTML_COMMENT_PATTERN, removeHTMLComment.bind(null, rule)); if (hasInvalidCharacters(reduced)) { warnings.push('Invalid selector \'' + rule[1] + '\' at ' + formatPosition$3(rule[2][0]) + '. Ignoring.'); continue; } reduced = removeWhitespace(reduced, format); reduced = removeQuotes(reduced); if (adjacentSpace && reduced.indexOf('nav') > 0) { reduced = reduced.replace(/\+nav(\S|$)/, '+ nav$1'); } if (removeUnsupported && reduced.indexOf(ASTERISK_PLUS_HTML_HACK) > -1) { continue; } if (removeUnsupported && reduced.indexOf(ASTERISK_FIRST_CHILD_PLUS_HTML_HACK) > -1) { continue; } if (reduced.indexOf('*') > -1) { reduced = reduced .replace(/\*([:#\.\[])/g, '$1') .replace(/^(\:first\-child)?\+html/, '*$1+html'); } if (repeated.indexOf(reduced) > -1) { continue; } rule[1] = reduced; repeated.push(reduced); list.push(rule); } if (list.length == 1 && list[0][1].length === 0) { warnings.push('Empty selector \'' + list[0][1] + '\' at ' + formatPosition$3(list[0][2][0]) + '. Ignoring.'); list = []; } return list; } var tidyRules_1 = tidyRules$3; var SUPPORTED_COMPACT_BLOCK_MATCHER = /^@media\W/; var SUPPORTED_QUOTE_REMOVAL_MATCHER = /^@(?:keyframes|-moz-keyframes|-o-keyframes|-webkit-keyframes)\W/; function tidyBlock$1(values, spaceAfterClosingBrace) { var withoutSpaceAfterClosingBrace; var withoutQuotes; var i; for (i = values.length - 1; i >= 0; i--) { withoutSpaceAfterClosingBrace = !spaceAfterClosingBrace && SUPPORTED_COMPACT_BLOCK_MATCHER.test(values[i][1]); withoutQuotes = SUPPORTED_QUOTE_REMOVAL_MATCHER.test(values[i][1]); values[i][1] = values[i][1] .replace(/\n|\r\n/g, ' ') .replace(/\s+/g, ' ') .replace(/(,|:|\() /g, '$1') .replace(/ \)/g, ')'); if (withoutQuotes) { values[i][1] = values[i][1] .replace(/'([a-zA-Z][a-zA-Z\d\-_]+)'/, '$1') .replace(/"([a-zA-Z][a-zA-Z\d\-_]+)"/, '$1'); } if (withoutSpaceAfterClosingBrace) { values[i][1] = values[i][1] .replace(/\) /g, ')'); } } return values; } var tidyBlock_1 = tidyBlock$1; function tidyAtRule$1(value) { return value .replace(/\s+/g, ' ') .replace(/url\(\s+/g, 'url(') .replace(/\s+\)/g, ')') .trim(); } var tidyAtRule_1 = tidyAtRule$1; var Hack$3 = { ASTERISK: 'asterisk', BANG: 'bang', BACKSLASH: 'backslash', UNDERSCORE: 'underscore' }; var hack = Hack$3; function removeUnused$2(properties) { for (var i = properties.length - 1; i >= 0; i--) { var property = properties[i]; if (property.unused) { property.all.splice(property.position, 1); } } } var removeUnused_1 = removeUnused$2; var Hack$2 = hack; var Marker$e = marker; var ASTERISK_HACK = '*'; var BACKSLASH_HACK = '\\'; var IMPORTANT_TOKEN = '!important'; var UNDERSCORE_HACK = '_'; var BANG_HACK = '!ie'; function restoreFromOptimizing$5(properties, restoreCallback) { var property; var restored; var current; var i; for (i = properties.length - 1; i >= 0; i--) { property = properties[i]; if (property.dynamic && property.important) { restoreImportant(property); continue; } if (property.dynamic) { continue; } if (property.unused) { continue; } if (!property.dirty && !property.important && !property.hack) { continue; } if (property.optimizable && restoreCallback) { restored = restoreCallback(property); property.value = restored; } else { restored = property.value; } if (property.important) { restoreImportant(property); } if (property.hack) { restoreHack(property); } if ('all' in property) { current = property.all[property.position]; current[1][1] = property.name; current.splice(2, current.length - 1); Array.prototype.push.apply(current, restored); } } } function restoreImportant(property) { property.value[property.value.length - 1][1] += IMPORTANT_TOKEN; } function restoreHack(property) { if (property.hack[0] == Hack$2.UNDERSCORE) { property.name = UNDERSCORE_HACK + property.name; } else if (property.hack[0] == Hack$2.ASTERISK) { property.name = ASTERISK_HACK + property.name; } else if (property.hack[0] == Hack$2.BACKSLASH) { property.value[property.value.length - 1][1] += BACKSLASH_HACK + property.hack[1]; } else if (property.hack[0] == Hack$2.BANG) { property.value[property.value.length - 1][1] += Marker$e.SPACE + BANG_HACK; } } var restoreFromOptimizing_1 = restoreFromOptimizing$5; var Token$o = { AT_RULE: 'at-rule', // e.g. `@import`, `@charset` AT_RULE_BLOCK: 'at-rule-block', // e.g. `@font-face{...}` AT_RULE_BLOCK_SCOPE: 'at-rule-block-scope', // e.g. `@font-face` COMMENT: 'comment', // e.g. `/* comment */` NESTED_BLOCK: 'nested-block', // e.g. `@media screen{...}`, `@keyframes animation {...}` NESTED_BLOCK_SCOPE: 'nested-block-scope', // e.g. `@media`, `@keyframes` PROPERTY: 'property', // e.g. `color:red` PROPERTY_BLOCK: 'property-block', // e.g. `--var:{color:red}` PROPERTY_NAME: 'property-name', // e.g. `color` PROPERTY_VALUE: 'property-value', // e.g. `red` RAW: 'raw', // e.g. anything between /* clean-css ignore:start */ and /* clean-css ignore:end */ comments RULE: 'rule', // e.g `div > a{...}` RULE_SCOPE: 'rule-scope' // e.g `div > a` }; var token = Token$o; var Hack$1 = hack; var Marker$d = marker; var Token$n = token; var Match = { ASTERISK: '*', BACKSLASH: '\\', BANG: '!', BANG_SUFFIX_PATTERN: /!\w+$/, IMPORTANT_TOKEN: '!important', IMPORTANT_TOKEN_PATTERN: new RegExp('!important$', 'i'), IMPORTANT_WORD: 'important', IMPORTANT_WORD_PATTERN: new RegExp('important$', 'i'), SUFFIX_BANG_PATTERN: /!$/, UNDERSCORE: '_', VARIABLE_REFERENCE_PATTERN: /var\(--.+\)$/ }; function wrapAll(properties, skipProperties) { var wrapped = []; var single; var property; var i; for (i = properties.length - 1; i >= 0; i--) { property = properties[i]; if (property[0] != Token$n.PROPERTY) { continue; } if (skipProperties && skipProperties.indexOf(property[1][1]) > -1) { continue; } single = wrapSingle$3(property); single.all = properties; single.position = i; wrapped.unshift(single); } return wrapped; } function someVariableReferences(property) { var i, l; var value; // skipping `property` and property name tokens for (i = 2, l = property.length; i < l; i++) { value = property[i]; if (value[0] != Token$n.PROPERTY_VALUE) { continue; } if (isVariableReference(value[1])) { return true; } } return false; } function isVariableReference(value) { return Match.VARIABLE_REFERENCE_PATTERN.test(value); } function isMultiplex(property) { var value; var i, l; for (i = 3, l = property.length; i < l; i++) { value = property[i]; if (value[0] == Token$n.PROPERTY_VALUE && (value[1] == Marker$d.COMMA || value[1] == Marker$d.FORWARD_SLASH)) { return true; } } return false; } function hackFrom(property) { var match = false; var name = property[1][1]; var lastValue = property[property.length - 1]; if (name[0] == Match.UNDERSCORE) { match = [Hack$1.UNDERSCORE]; } else if (name[0] == Match.ASTERISK) { match = [Hack$1.ASTERISK]; } else if (lastValue[1][0] == Match.BANG && !lastValue[1].match(Match.IMPORTANT_WORD_PATTERN)) { match = [Hack$1.BANG]; } else if (lastValue[1].indexOf(Match.BANG) > 0 && !lastValue[1].match(Match.IMPORTANT_WORD_PATTERN) && Match.BANG_SUFFIX_PATTERN.test(lastValue[1])) { match = [Hack$1.BANG]; } else if (lastValue[1].indexOf(Match.BACKSLASH) > 0 && lastValue[1].indexOf(Match.BACKSLASH) == lastValue[1].length - Match.BACKSLASH.length - 1) { match = [Hack$1.BACKSLASH, lastValue[1].substring(lastValue[1].indexOf(Match.BACKSLASH) + 1)]; } else if (lastValue[1].indexOf(Match.BACKSLASH) === 0 && lastValue[1].length == 2) { match = [Hack$1.BACKSLASH, lastValue[1].substring(1)]; } return match; } function isImportant(property) { if (property.length < 3) return false; var lastValue = property[property.length - 1]; if (Match.IMPORTANT_TOKEN_PATTERN.test(lastValue[1])) { return true; } else if (Match.IMPORTANT_WORD_PATTERN.test(lastValue[1]) && Match.SUFFIX_BANG_PATTERN.test(property[property.length - 2][1])) { return true; } return false; } function stripImportant(property) { var lastValue = property[property.length - 1]; var oneButLastValue = property[property.length - 2]; if (Match.IMPORTANT_TOKEN_PATTERN.test(lastValue[1])) { lastValue[1] = lastValue[1].replace(Match.IMPORTANT_TOKEN_PATTERN, ''); } else { lastValue[1] = lastValue[1].replace(Match.IMPORTANT_WORD_PATTERN, ''); oneButLastValue[1] = oneButLastValue[1].replace(Match.SUFFIX_BANG_PATTERN, ''); } if (lastValue[1].length === 0) { property.pop(); } if (oneButLastValue[1].length === 0) { property.pop(); } } function stripPrefixHack(property) { property[1][1] = property[1][1].substring(1); } function stripSuffixHack(property, hackFrom) { var lastValue = property[property.length - 1]; lastValue[1] = lastValue[1] .substring(0, lastValue[1].indexOf(hackFrom[0] == Hack$1.BACKSLASH ? Match.BACKSLASH : Match.BANG)) .trim(); if (lastValue[1].length === 0) { property.pop(); } } function wrapSingle$3(property) { var importantProperty = isImportant(property); if (importantProperty) { stripImportant(property); } var whichHack = hackFrom(property); if (whichHack[0] == Hack$1.ASTERISK || whichHack[0] == Hack$1.UNDERSCORE) { stripPrefixHack(property); } else if (whichHack[0] == Hack$1.BACKSLASH || whichHack[0] == Hack$1.BANG) { stripSuffixHack(property, whichHack); } return { block: property[2] && property[2][0] == Token$n.PROPERTY_BLOCK, components: [], dirty: false, dynamic: someVariableReferences(property), hack: whichHack, important: importantProperty, name: property[1][1], multiplex: property.length > 3 ? isMultiplex(property) : false, optimizable: true, position: 0, shorthand: false, unused: false, value: property.slice(2) }; } var wrapForOptimizing$3 = { all: wrapAll, single: wrapSingle$3 }; function InvalidPropertyError$2(message) { this.name = 'InvalidPropertyError'; this.message = message; this.stack = (new Error()).stack; } InvalidPropertyError$2.prototype = Object.create(Error.prototype); InvalidPropertyError$2.prototype.constructor = InvalidPropertyError$2; var invalidPropertyError = InvalidPropertyError$2; var InvalidPropertyError$1 = invalidPropertyError; var wrapSingle$2 = wrapForOptimizing$3.single; var Token$m = token; var Marker$c = marker; var formatPosition$2 = formatPosition_1; function _anyIsInherit(values) { var i, l; for (i = 0, l = values.length; i < l; i++) { if (values[i][1] == 'inherit') { return true; } } return false; } function _colorFilter(validator) { return function (value) { return value[1] == 'invert' || validator.isColor(value[1]) || validator.isPrefixed(value[1]); }; } function _styleFilter(validator) { return function (value) { return value[1] != 'inherit' && validator.isStyleKeyword(value[1]) && !validator.isColorFunction(value[1]); }; } function _wrapDefault(name, property, configuration) { var descriptor = configuration[name]; if (descriptor.doubleValues && descriptor.defaultValue.length == 2) { return wrapSingle$2([ Token$m.PROPERTY, [Token$m.PROPERTY_NAME, name], [Token$m.PROPERTY_VALUE, descriptor.defaultValue[0]], [Token$m.PROPERTY_VALUE, descriptor.defaultValue[1]] ]); } else if (descriptor.doubleValues && descriptor.defaultValue.length == 1) { return wrapSingle$2([ Token$m.PROPERTY, [Token$m.PROPERTY_NAME, name], [Token$m.PROPERTY_VALUE, descriptor.defaultValue[0]] ]); } else { return wrapSingle$2([ Token$m.PROPERTY, [Token$m.PROPERTY_NAME, name], [Token$m.PROPERTY_VALUE, descriptor.defaultValue] ]); } } function _widthFilter(validator) { return function (value) { return value[1] != 'inherit' && (validator.isWidth(value[1]) || validator.isUnit(value[1]) || validator.isDynamicUnit(value[1])) && !validator.isStyleKeyword(value[1]) && !validator.isColorFunction(value[1]); }; } function animation(property, configuration, validator) { var duration = _wrapDefault(property.name + '-duration', property, configuration); var timing = _wrapDefault(property.name + '-timing-function', property, configuration); var delay = _wrapDefault(property.name + '-delay', property, configuration); var iteration = _wrapDefault(property.name + '-iteration-count', property, configuration); var direction = _wrapDefault(property.name + '-direction', property, configuration); var fill = _wrapDefault(property.name + '-fill-mode', property, configuration); var play = _wrapDefault(property.name + '-play-state', property, configuration); var name = _wrapDefault(property.name + '-name', property, configuration); var components = [duration, timing, delay, iteration, direction, fill, play, name]; var values = property.value; var value; var durationSet = false; var timingSet = false; var delaySet = false; var iterationSet = false; var directionSet = false; var fillSet = false; var playSet = false; var nameSet = false; var i; var l; if (property.value.length == 1 && property.value[0][1] == 'inherit') { duration.value = timing.value = delay.value = iteration.value = direction.value = fill.value = play.value = name.value = property.value; return components; } if (values.length > 1 && _anyIsInherit(values)) { throw new InvalidPropertyError$1('Invalid animation values at ' + formatPosition$2(values[0][2][0]) + '. Ignoring.'); } for (i = 0, l = values.length; i < l; i++) { value = values[i]; if (validator.isTime(value[1]) && !durationSet) { duration.value = [value]; durationSet = true; } else if (validator.isTime(value[1]) && !delaySet) { delay.value = [value]; delaySet = true; } else if ((validator.isGlobal(value[1]) || validator.isTimingFunction(value[1])) && !timingSet) { timing.value = [value]; timingSet = true; } else if ((validator.isAnimationIterationCountKeyword(value[1]) || validator.isPositiveNumber(value[1])) && !iterationSet) { iteration.value = [value]; iterationSet = true; } else if (validator.isAnimationDirectionKeyword(value[1]) && !directionSet) { direction.value = [value]; directionSet = true; } else if (validator.isAnimationFillModeKeyword(value[1]) && !fillSet) { fill.value = [value]; fillSet = true; } else if (validator.isAnimationPlayStateKeyword(value[1]) && !playSet) { play.value = [value]; playSet = true; } else if ((validator.isAnimationNameKeyword(value[1]) || validator.isIdentifier(value[1])) && !nameSet) { name.value = [value]; nameSet = true; } else { throw new InvalidPropertyError$1('Invalid animation value at ' + formatPosition$2(value[2][0]) + '. Ignoring.'); } } return components; } function background$2(property, configuration, validator) { var image = _wrapDefault('background-image', property, configuration); var position = _wrapDefault('background-position', property, configuration); var size = _wrapDefault('background-size', property, configuration); var repeat = _wrapDefault('background-repeat', property, configuration); var attachment = _wrapDefault('background-attachment', property, configuration); var origin = _wrapDefault('background-origin', property, configuration); var clip = _wrapDefault('background-clip', property, configuration); var color = _wrapDefault('background-color', property, configuration); var components = [image, position, size, repeat, attachment, origin, clip, color]; var values = property.value; var positionSet = false; var clipSet = false; var originSet = false; var repeatSet = false; var anyValueSet = false; if (property.value.length == 1 && property.value[0][1] == 'inherit') { // NOTE: 'inherit' is not a valid value for background-attachment color.value = image.value = repeat.value = position.value = size.value = origin.value = clip.value = property.value; return components; } if (property.value.length == 1 && property.value[0][1] == '0 0') { return components; } for (var i = values.length - 1; i >= 0; i--) { var value = values[i]; if (validator.isBackgroundAttachmentKeyword(value[1])) { attachment.value = [value]; anyValueSet = true; } else if (validator.isBackgroundClipKeyword(value[1]) || validator.isBackgroundOriginKeyword(value[1])) { if (clipSet) { origin.value = [value]; originSet = true; } else { clip.value = [value]; clipSet = true; } anyValueSet = true; } else if (validator.isBackgroundRepeatKeyword(value[1])) { if (repeatSet) { repeat.value.unshift(value); } else { repeat.value = [value]; repeatSet = true; } anyValueSet = true; } else if (validator.isBackgroundPositionKeyword(value[1]) || validator.isBackgroundSizeKeyword(value[1]) || validator.isUnit(value[1]) || validator.isDynamicUnit(value[1])) { if (i > 0) { var previousValue = values[i - 1]; if (previousValue[1] == Marker$c.FORWARD_SLASH) { size.value = [value]; } else if (i > 1 && values[i - 2][1] == Marker$c.FORWARD_SLASH) { size.value = [previousValue, value]; i -= 2; } else { if (!positionSet) position.value = []; position.value.unshift(value); positionSet = true; } } else { if (!positionSet) position.value = []; position.value.unshift(value); positionSet = true; } anyValueSet = true; } else if ((color.value[0][1] == configuration[color.name].defaultValue || color.value[0][1] == 'none') && (validator.isColor(value[1]) || validator.isPrefixed(value[1]))) { color.value = [value]; anyValueSet = true; } else if (validator.isUrl(value[1]) || validator.isFunction(value[1])) { image.value = [value]; anyValueSet = true; } } if (clipSet && !originSet) origin.value = clip.value.slice(0); if (!anyValueSet) { throw new InvalidPropertyError$1('Invalid background value at ' + formatPosition$2(values[0][2][0]) + '. Ignoring.'); } return components; } function borderRadius$2(property, configuration) { var values = property.value; var splitAt = -1; for (var i = 0, l = values.length; i < l; i++) { if (values[i][1] == Marker$c.FORWARD_SLASH) { splitAt = i; break; } } if (splitAt === 0 || splitAt === values.length - 1) { throw new InvalidPropertyError$1('Invalid border-radius value at ' + formatPosition$2(values[0][2][0]) + '. Ignoring.'); } var target = _wrapDefault(property.name, property, configuration); target.value = splitAt > -1 ? values.slice(0, splitAt) : values.slice(0); target.components = fourValues$1(target, configuration); var remainder = _wrapDefault(property.name, property, configuration); remainder.value = splitAt > -1 ? values.slice(splitAt + 1) : values.slice(0); remainder.components = fourValues$1(remainder, configuration); for (var j = 0; j < 4; j++) { target.components[j].multiplex = true; target.components[j].value = target.components[j].value.concat(remainder.components[j].value); } return target.components; } function font$1(property, configuration, validator) { var style = _wrapDefault('font-style', property, configuration); var variant = _wrapDefault('font-variant', property, configuration); var weight = _wrapDefault('font-weight', property, configuration); var stretch = _wrapDefault('font-stretch', property, configuration); var size = _wrapDefault('font-size', property, configuration); var height = _wrapDefault('line-height', property, configuration); var family = _wrapDefault('font-family', property, configuration); var components = [style, variant, weight, stretch, size, height, family]; var values = property.value; var fuzzyMatched = 4; // style, variant, weight, and stretch var index = 0; var isStretchSet = false; var isStretchValid; var isStyleSet = false; var isStyleValid; var isVariantSet = false; var isVariantValid; var isWeightSet = false; var isWeightValid; var appendableFamilyName = false; if (!values[index]) { throw new InvalidPropertyError$1('Missing font values at ' + formatPosition$2(property.all[property.position][1][2][0]) + '. Ignoring.'); } if (values.length == 1 && values[0][1] == 'inherit') { style.value = variant.value = weight.value = stretch.value = size.value = height.value = family.value = values; return components; } if (values.length == 1 && (validator.isFontKeyword(values[0][1]) || validator.isGlobal(values[0][1]) || validator.isPrefixed(values[0][1]))) { values[0][1] = Marker$c.INTERNAL + values[0][1]; style.value = variant.value = weight.value = stretch.value = size.value = height.value = family.value = values; return components; } if (values.length < 2 || !_anyIsFontSize(values, validator) || !_anyIsFontFamily(values, validator)) { throw new InvalidPropertyError$1('Invalid font values at ' + formatPosition$2(property.all[property.position][1][2][0]) + '. Ignoring.'); } if (values.length > 1 && _anyIsInherit(values)) { throw new InvalidPropertyError$1('Invalid font values at ' + formatPosition$2(values[0][2][0]) + '. Ignoring.'); } // fuzzy match style, variant, weight, and stretch on first elements while (index < fuzzyMatched) { isStretchValid = validator.isFontStretchKeyword(values[index][1]) || validator.isGlobal(values[index][1]); isStyleValid = validator.isFontStyleKeyword(values[index][1]) || validator.isGlobal(values[index][1]); isVariantValid = validator.isFontVariantKeyword(values[index][1]) || validator.isGlobal(values[index][1]); isWeightValid = validator.isFontWeightKeyword(values[index][1]) || validator.isGlobal(values[index][1]); if (isStyleValid && !isStyleSet) { style.value = [values[index]]; isStyleSet = true; } else if (isVariantValid && !isVariantSet) { variant.value = [values[index]]; isVariantSet = true; } else if (isWeightValid && !isWeightSet) { weight.value = [values[index]]; isWeightSet = true; } else if (isStretchValid && !isStretchSet) { stretch.value = [values[index]]; isStretchSet = true; } else if (isStyleValid && isStyleSet || isVariantValid && isVariantSet || isWeightValid && isWeightSet || isStretchValid && isStretchSet) { throw new InvalidPropertyError$1('Invalid font style / variant / weight / stretch value at ' + formatPosition$2(values[0][2][0]) + '. Ignoring.'); } else { break; } index++; } // now comes font-size ... if (validator.isFontSizeKeyword(values[index][1]) || validator.isUnit(values[index][1]) && !validator.isDynamicUnit(values[index][1])) { size.value = [values[index]]; index++; } else { throw new InvalidPropertyError$1('Missing font size at ' + formatPosition$2(values[0][2][0]) + '. Ignoring.'); } if (!values[index]) { throw new InvalidPropertyError$1('Missing font family at ' + formatPosition$2(values[0][2][0]) + '. Ignoring.'); } // ... and perhaps line-height if (values[index] && values[index][1] == Marker$c.FORWARD_SLASH && values[index + 1] && (validator.isLineHeightKeyword(values[index + 1][1]) || validator.isUnit(values[index + 1][1]) || validator.isNumber(values[index + 1][1]))) { height.value = [values[index + 1]]; index++; index++; } // ... and whatever comes next is font-family family.value = []; while (values[index]) { if (values[index][1] == Marker$c.COMMA) { appendableFamilyName = false; } else { if (appendableFamilyName) { family.value[family.value.length - 1][1] += Marker$c.SPACE + values[index][1]; } else { family.value.push(values[index]); } appendableFamilyName = true; } index++; } if (family.value.length === 0) { throw new InvalidPropertyError$1('Missing font family at ' + formatPosition$2(values[0][2][0]) + '. Ignoring.'); } return components; } function _anyIsFontSize(values, validator) { var value; var i, l; for (i = 0, l = values.length; i < l; i++) { value = values[i]; if (validator.isFontSizeKeyword(value[1]) || validator.isUnit(value[1]) && !validator.isDynamicUnit(value[1]) || validator.isFunction(value[1])) { return true; } } return false; } function _anyIsFontFamily(values, validator) { var value; var i, l; for (i = 0, l = values.length; i < l; i++) { value = values[i]; if (validator.isIdentifier(value[1]) || validator.isQuotedText(value[1])) { return true; } } return false; } function fourValues$1(property, configuration) { var componentNames = configuration[property.name].components; var components = []; var value = property.value; if (value.length < 1) return []; if (value.length < 2) value[1] = value[0].slice(0); if (value.length < 3) value[2] = value[0].slice(0); if (value.length < 4) value[3] = value[1].slice(0); for (var i = componentNames.length - 1; i >= 0; i--) { var component = wrapSingle$2([ Token$m.PROPERTY, [Token$m.PROPERTY_NAME, componentNames[i]] ]); component.value = [value[i]]; components.unshift(component); } return components; } function multiplex$1(splitWith) { return function (property, configuration, validator) { var splitsAt = []; var values = property.value; var i, j, l, m; // find split commas for (i = 0, l = values.length; i < l; i++) { if (values[i][1] == ',') splitsAt.push(i); } if (splitsAt.length === 0) return splitWith(property, configuration, validator); var splitComponents = []; // split over commas, and into components for (i = 0, l = splitsAt.length; i <= l; i++) { var from = i === 0 ? 0 : splitsAt[i - 1] + 1; var to = i < l ? splitsAt[i] : values.length; var _property = _wrapDefault(property.name, property, configuration); _property.value = values.slice(from, to); if (_property.value.length > 0) { splitComponents.push(splitWith(_property, configuration, validator)); } } var components = splitComponents[0]; // group component values from each split for (i = 0, l = components.length; i < l; i++) { components[i].multiplex = true; for (j = 1, m = splitComponents.length; j < m; j++) { components[i].value.push([Token$m.PROPERTY_VALUE, Marker$c.COMMA]); Array.prototype.push.apply(components[i].value, splitComponents[j][i].value); } } return components; }; } function listStyle(property, configuration, validator) { var type = _wrapDefault('list-style-type', property, configuration); var position = _wrapDefault('list-style-position', property, configuration); var image = _wrapDefault('list-style-image', property, configuration); var components = [type, position, image]; if (property.value.length == 1 && property.value[0][1] == 'inherit') { type.value = position.value = image.value = [property.value[0]]; return components; } var values = property.value.slice(0); var total = values.length; var index = 0; // `image` first... for (index = 0, total = values.length; index < total; index++) { if (validator.isUrl(values[index][1]) || values[index][1] == '0') { image.value = [values[index]]; values.splice(index, 1); break; } } // ... then `position` for (index = 0, total = values.length; index < total; index++) { if (validator.isListStylePositionKeyword(values[index][1])) { position.value = [values[index]]; values.splice(index, 1); break; } } // ... and what's left is a `type` if (values.length > 0 && (validator.isListStyleTypeKeyword(values[0][1]) || validator.isIdentifier(values[0][1]))) { type.value = [values[0]]; } return components; } function transition(property, configuration, validator) { var prop = _wrapDefault(property.name + '-property', property, configuration); var duration = _wrapDefault(property.name + '-duration', property, configuration); var timing = _wrapDefault(property.name + '-timing-function', property, configuration); var delay = _wrapDefault(property.name + '-delay', property, configuration); var components = [prop, duration, timing, delay]; var values = property.value; var value; var durationSet = false; var delaySet = false; var propSet = false; var timingSet = false; var i; var l; if (property.value.length == 1 && property.value[0][1] == 'inherit') { prop.value = duration.value = timing.value = delay.value = property.value; return components; } if (values.length > 1 && _anyIsInherit(values)) { throw new InvalidPropertyError$1('Invalid animation values at ' + formatPosition$2(values[0][2][0]) + '. Ignoring.'); } for (i = 0, l = values.length; i < l; i++) { value = values[i]; if (validator.isTime(value[1]) && !durationSet) { duration.value = [value]; durationSet = true; } else if (validator.isTime(value[1]) && !delaySet) { delay.value = [value]; delaySet = true; } else if ((validator.isGlobal(value[1]) || validator.isTimingFunction(value[1])) && !timingSet) { timing.value = [value]; timingSet = true; } else if (validator.isIdentifier(value[1]) && !propSet) { prop.value = [value]; propSet = true; } else { throw new InvalidPropertyError$1('Invalid animation value at ' + formatPosition$2(value[2][0]) + '. Ignoring.'); } } return components; } function widthStyleColor(property, configuration, validator) { var descriptor = configuration[property.name]; var components = [ _wrapDefault(descriptor.components[0], property, configuration), _wrapDefault(descriptor.components[1], property, configuration), _wrapDefault(descriptor.components[2], property, configuration) ]; var color, style, width; for (var i = 0; i < 3; i++) { var component = components[i]; if (component.name.indexOf('color') > 0) color = component; else if (component.name.indexOf('style') > 0) style = component; else width = component; } if ((property.value.length == 1 && property.value[0][1] == 'inherit') || (property.value.length == 3 && property.value[0][1] == 'inherit' && property.value[1][1] == 'inherit' && property.value[2][1] == 'inherit')) { color.value = style.value = width.value = [property.value[0]]; return components; } var values = property.value.slice(0); var match, matches; // NOTE: usually users don't follow the required order of parts in this shorthand, // so we'll try to parse it caring as little about order as possible if (values.length > 0) { matches = values.filter(_widthFilter(validator)); match = matches.length > 1 && (matches[0][1] == 'none' || matches[0][1] == 'auto') ? matches[1] : matches[0]; if (match) { width.value = [match]; values.splice(values.indexOf(match), 1); } } if (values.length > 0) { match = values.filter(_styleFilter(validator))[0]; if (match) { style.value = [match]; values.splice(values.indexOf(match), 1); } } if (values.length > 0) { match = values.filter(_colorFilter(validator))[0]; if (match) { color.value = [match]; values.splice(values.indexOf(match), 1); } } return components; } var breakUp$1 = { animation: animation, background: background$2, border: widthStyleColor, borderRadius: borderRadius$2, font: font$1, fourValues: fourValues$1, listStyle: listStyle, multiplex: multiplex$1, outline: widthStyleColor, transition: transition }; var VENDOR_PREFIX_PATTERN = /(?:^|\W)(\-\w+\-)/g; function unique(value) { var prefixes = []; var match; while ((match = VENDOR_PREFIX_PATTERN.exec(value)) !== null) { if (prefixes.indexOf(match[0]) == -1) { prefixes.push(match[0]); } } return prefixes; } function same(value1, value2) { return unique(value1).sort().join(',') == unique(value2).sort().join(','); } var vendorPrefixes = { unique: unique, same: same }; var sameVendorPrefixes = vendorPrefixes.same; function understandable$1(validator, value1, value2, _position, isPaired) { if (!sameVendorPrefixes(value1, value2)) { return false; } if (isPaired && validator.isVariable(value1) !== validator.isVariable(value2)) { return false; } return true; } var understandable_1 = understandable$1; var understandable = understandable_1; function animationIterationCount(validator, value1, value2) { if (!understandable(validator, value1, value2, 0, true) && !(validator.isAnimationIterationCountKeyword(value2) || validator.isPositiveNumber(value2))) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } return validator.isAnimationIterationCountKeyword(value2) || validator.isPositiveNumber(value2); } function animationName(validator, value1, value2) { if (!understandable(validator, value1, value2, 0, true) && !(validator.isAnimationNameKeyword(value2) || validator.isIdentifier(value2))) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } return validator.isAnimationNameKeyword(value2) || validator.isIdentifier(value2); } function areSameFunction(validator, value1, value2) { if (!validator.isFunction(value1) || !validator.isFunction(value2)) { return false; } var function1Name = value1.substring(0, value1.indexOf('(')); var function2Name = value2.substring(0, value2.indexOf('(')); var function1Value = value1.substring(function1Name.length + 1, value1.length - 1); var function2Value = value2.substring(function2Name.length + 1, value2.length - 1); if (validator.isFunction(function1Value) || validator.isFunction(function2Value)) { return function1Name === function2Name && areSameFunction(validator, function1Value, function2Value); } else { return function1Name === function2Name; } } function backgroundPosition(validator, value1, value2) { if (!understandable(validator, value1, value2, 0, true) && !(validator.isBackgroundPositionKeyword(value2) || validator.isGlobal(value2))) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } else if (validator.isBackgroundPositionKeyword(value2) || validator.isGlobal(value2)) { return true; } return unit$1(validator, value1, value2); } function backgroundSize(validator, value1, value2) { if (!understandable(validator, value1, value2, 0, true) && !(validator.isBackgroundSizeKeyword(value2) || validator.isGlobal(value2))) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } else if (validator.isBackgroundSizeKeyword(value2) || validator.isGlobal(value2)) { return true; } return unit$1(validator, value1, value2); } function color$1(validator, value1, value2) { if (!understandable(validator, value1, value2, 0, true) && !validator.isColor(value2)) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } else if (!validator.colorOpacity && (validator.isRgbColor(value1) || validator.isHslColor(value1))) { return false; } else if (!validator.colorOpacity && (validator.isRgbColor(value2) || validator.isHslColor(value2))) { return false; } else if (!validator.colorHexAlpha && (validator.isHexAlphaColor(value1) || validator.isHexAlphaColor(value2))) { return false; } else if (validator.isColor(value1) && validator.isColor(value2)) { return true; } return sameFunctionOrValue(validator, value1, value2); } function components(overrideCheckers) { return function (validator, value1, value2, position) { return overrideCheckers[position](validator, value1, value2); }; } function fontFamily(validator, value1, value2) { return understandable(validator, value1, value2, 0, true); } function image(validator, value1, value2) { if (!understandable(validator, value1, value2, 0, true) && !validator.isImage(value2)) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } else if (validator.isImage(value2)) { return true; } else if (validator.isImage(value1)) { return false; } return sameFunctionOrValue(validator, value1, value2); } function keyword(propertyName) { return function(validator, value1, value2) { if (!understandable(validator, value1, value2, 0, true) && !validator.isKeyword(propertyName)(value2)) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } return validator.isKeyword(propertyName)(value2); }; } function keywordWithGlobal(propertyName) { return function(validator, value1, value2) { if (!understandable(validator, value1, value2, 0, true) && !(validator.isKeyword(propertyName)(value2) || validator.isGlobal(value2))) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } return validator.isKeyword(propertyName)(value2) || validator.isGlobal(value2); }; } function propertyName$1(validator, value1, value2) { if (!understandable(validator, value1, value2, 0, true) && !validator.isIdentifier(value2)) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } return validator.isIdentifier(value2); } function sameFunctionOrValue(validator, value1, value2) { return areSameFunction(validator, value1, value2) ? true : value1 === value2; } function textShadow(validator, value1, value2) { if (!understandable(validator, value1, value2, 0, true) && !(validator.isUnit(value2) || validator.isColor(value2) || validator.isGlobal(value2))) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } return validator.isUnit(value2) || validator.isColor(value2) || validator.isGlobal(value2); } function time$1(validator, value1, value2) { if (!understandable(validator, value1, value2, 0, true) && !validator.isTime(value2)) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } else if (validator.isTime(value1) && !validator.isTime(value2)) { return false; } else if (validator.isTime(value2)) { return true; } else if (validator.isTime(value1)) { return false; } else if (validator.isFunction(value1) && !validator.isPrefixed(value1) && validator.isFunction(value2) && !validator.isPrefixed(value2)) { return true; } return sameFunctionOrValue(validator, value1, value2); } function timingFunction(validator, value1, value2) { if (!understandable(validator, value1, value2, 0, true) && !(validator.isTimingFunction(value2) || validator.isGlobal(value2))) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } return validator.isTimingFunction(value2) || validator.isGlobal(value2); } function unit$1(validator, value1, value2) { if (!understandable(validator, value1, value2, 0, true) && !validator.isUnit(value2)) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } else if (validator.isUnit(value1) && !validator.isUnit(value2)) { return false; } else if (validator.isUnit(value2)) { return true; } else if (validator.isUnit(value1)) { return false; } else if (validator.isFunction(value1) && !validator.isPrefixed(value1) && validator.isFunction(value2) && !validator.isPrefixed(value2)) { return true; } return sameFunctionOrValue(validator, value1, value2); } function unitOrKeywordWithGlobal(propertyName) { var byKeyword = keywordWithGlobal(propertyName); return function(validator, value1, value2) { return unit$1(validator, value1, value2) || byKeyword(validator, value1, value2); }; } function unitOrNumber(validator, value1, value2) { if (!understandable(validator, value1, value2, 0, true) && !(validator.isUnit(value2) || validator.isNumber(value2))) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } else if ((validator.isUnit(value1) || validator.isNumber(value1)) && !(validator.isUnit(value2) || validator.isNumber(value2))) { return false; } else if (validator.isUnit(value2) || validator.isNumber(value2)) { return true; } else if (validator.isUnit(value1) || validator.isNumber(value1)) { return false; } else if (validator.isFunction(value1) && !validator.isPrefixed(value1) && validator.isFunction(value2) && !validator.isPrefixed(value2)) { return true; } return sameFunctionOrValue(validator, value1, value2); } function zIndex(validator, value1, value2) { if (!understandable(validator, value1, value2, 0, true) && !validator.isZIndex(value2)) { return false; } else if (validator.isVariable(value1) && validator.isVariable(value2)) { return true; } return validator.isZIndex(value2); } var canOverride$1 = { generic: { color: color$1, components: components, image: image, propertyName: propertyName$1, time: time$1, timingFunction: timingFunction, unit: unit$1, unitOrNumber: unitOrNumber }, property: { animationDirection: keywordWithGlobal('animation-direction'), animationFillMode: keyword('animation-fill-mode'), animationIterationCount: animationIterationCount, animationName: animationName, animationPlayState: keywordWithGlobal('animation-play-state'), backgroundAttachment: keyword('background-attachment'), backgroundClip: keywordWithGlobal('background-clip'), backgroundOrigin: keyword('background-origin'), backgroundPosition: backgroundPosition, backgroundRepeat: keyword('background-repeat'), backgroundSize: backgroundSize, bottom: unitOrKeywordWithGlobal('bottom'), borderCollapse: keyword('border-collapse'), borderStyle: keywordWithGlobal('*-style'), clear: keywordWithGlobal('clear'), cursor: keywordWithGlobal('cursor'), display: keywordWithGlobal('display'), float: keywordWithGlobal('float'), left: unitOrKeywordWithGlobal('left'), fontFamily: fontFamily, fontStretch: keywordWithGlobal('font-stretch'), fontStyle: keywordWithGlobal('font-style'), fontVariant: keywordWithGlobal('font-variant'), fontWeight: keywordWithGlobal('font-weight'), listStyleType: keywordWithGlobal('list-style-type'), listStylePosition: keywordWithGlobal('list-style-position'), outlineStyle: keywordWithGlobal('*-style'), overflow: keywordWithGlobal('overflow'), position: keywordWithGlobal('position'), right: unitOrKeywordWithGlobal('right'), textAlign: keywordWithGlobal('text-align'), textDecoration: keywordWithGlobal('text-decoration'), textOverflow: keywordWithGlobal('text-overflow'), textShadow: textShadow, top: unitOrKeywordWithGlobal('top'), transform: sameFunctionOrValue, verticalAlign: unitOrKeywordWithGlobal('vertical-align'), visibility: keywordWithGlobal('visibility'), whiteSpace: keywordWithGlobal('white-space'), zIndex: zIndex } }; var wrapSingle$1 = wrapForOptimizing$3.single; var Token$l = token; function deep(property) { var cloned = shallow(property); for (var i = property.components.length - 1; i >= 0; i--) { var component = shallow(property.components[i]); component.value = property.components[i].value.slice(0); cloned.components.unshift(component); } cloned.dirty = true; cloned.value = property.value.slice(0); return cloned; } function shallow(property) { var cloned = wrapSingle$1([ Token$l.PROPERTY, [Token$l.PROPERTY_NAME, property.name] ]); cloned.important = property.important; cloned.hack = property.hack; cloned.unused = false; return cloned; } var clone$1 = { deep: deep, shallow: shallow }; var shallowClone$1 = clone$1.shallow; var Token$k = token; var Marker$b = marker; function isInheritOnly(values) { for (var i = 0, l = values.length; i < l; i++) { var value = values[i][1]; if (value != 'inherit' && value != Marker$b.COMMA && value != Marker$b.FORWARD_SLASH) return false; } return true; } function background$1(property, configuration, lastInMultiplex) { var components = property.components; var restored = []; var needsOne, needsBoth; function restoreValue(component) { Array.prototype.unshift.apply(restored, component.value); } function isDefaultValue(component) { var descriptor = configuration[component.name]; if (descriptor.doubleValues && descriptor.defaultValue.length == 1) { return component.value[0][1] == descriptor.defaultValue[0] && (component.value[1] ? component.value[1][1] == descriptor.defaultValue[0] : true); } else if (descriptor.doubleValues && descriptor.defaultValue.length != 1) { return component.value[0][1] == descriptor.defaultValue[0] && (component.value[1] ? component.value[1][1] : component.value[0][1]) == descriptor.defaultValue[1]; } else { return component.value[0][1] == descriptor.defaultValue; } } for (var i = components.length - 1; i >= 0; i--) { var component = components[i]; var isDefault = isDefaultValue(component); if (component.name == 'background-clip') { var originComponent = components[i - 1]; var isOriginDefault = isDefaultValue(originComponent); needsOne = component.value[0][1] == originComponent.value[0][1]; needsBoth = !needsOne && ( (isOriginDefault && !isDefault) || (!isOriginDefault && !isDefault) || (!isOriginDefault && isDefault && component.value[0][1] != originComponent.value[0][1])); if (needsOne) { restoreValue(originComponent); } else if (needsBoth) { restoreValue(component); restoreValue(originComponent); } i--; } else if (component.name == 'background-size') { var positionComponent = components[i - 1]; var isPositionDefault = isDefaultValue(positionComponent); needsOne = !isPositionDefault && isDefault; needsBoth = !needsOne && (isPositionDefault && !isDefault || !isPositionDefault && !isDefault); if (needsOne) { restoreValue(positionComponent); } else if (needsBoth) { restoreValue(component); restored.unshift([Token$k.PROPERTY_VALUE, Marker$b.FORWARD_SLASH]); restoreValue(positionComponent); } else if (positionComponent.value.length == 1) { restoreValue(positionComponent); } i--; } else { if (isDefault || configuration[component.name].multiplexLastOnly && !lastInMultiplex) continue; restoreValue(component); } } if (restored.length === 0 && property.value.length == 1 && property.value[0][1] == '0') restored.push(property.value[0]); if (restored.length === 0) restored.push([Token$k.PROPERTY_VALUE, configuration[property.name].defaultValue]); if (isInheritOnly(restored)) return [restored[0]]; return restored; } function borderRadius$1(property) { if (property.multiplex) { var horizontal = shallowClone$1(property); var vertical = shallowClone$1(property); for (var i = 0; i < 4; i++) { var component = property.components[i]; var horizontalComponent = shallowClone$1(property); horizontalComponent.value = [component.value[0]]; horizontal.components.push(horizontalComponent); var verticalComponent = shallowClone$1(property); // FIXME: only shorthand compactor (see breakup#borderRadius) knows that border radius // longhands have two values, whereas tokenizer does not care about populating 2nd value // if it's missing, hence this fallback verticalComponent.value = [component.value[1] || component.value[0]]; vertical.components.push(verticalComponent); } var horizontalValues = fourValues(horizontal); var verticalValues = fourValues(vertical); if (horizontalValues.length == verticalValues.length && horizontalValues[0][1] == verticalValues[0][1] && (horizontalValues.length > 1 ? horizontalValues[1][1] == verticalValues[1][1] : true) && (horizontalValues.length > 2 ? horizontalValues[2][1] == verticalValues[2][1] : true) && (horizontalValues.length > 3 ? horizontalValues[3][1] == verticalValues[3][1] : true)) { return horizontalValues; } else { return horizontalValues.concat([[Token$k.PROPERTY_VALUE, Marker$b.FORWARD_SLASH]]).concat(verticalValues); } } else { return fourValues(property); } } function font(property, configuration) { var components = property.components; var restored = []; var component; var componentIndex = 0; var fontFamilyIndex = 0; if (property.value[0][1].indexOf(Marker$b.INTERNAL) === 0) { property.value[0][1] = property.value[0][1].substring(Marker$b.INTERNAL.length); return property.value; } // first four components are optional while (componentIndex < 4) { component = components[componentIndex]; if (component.value[0][1] != configuration[component.name].defaultValue) { Array.prototype.push.apply(restored, component.value); } componentIndex++; } // then comes font-size Array.prototype.push.apply(restored, components[componentIndex].value); componentIndex++; // then may come line-height if (components[componentIndex].value[0][1] != configuration[components[componentIndex].name].defaultValue) { Array.prototype.push.apply(restored, [[Token$k.PROPERTY_VALUE, Marker$b.FORWARD_SLASH]]); Array.prototype.push.apply(restored, components[componentIndex].value); } componentIndex++; // then comes font-family while (components[componentIndex].value[fontFamilyIndex]) { restored.push(components[componentIndex].value[fontFamilyIndex]); if (components[componentIndex].value[fontFamilyIndex + 1]) { restored.push([Token$k.PROPERTY_VALUE, Marker$b.COMMA]); } fontFamilyIndex++; } if (isInheritOnly(restored)) { return [restored[0]]; } return restored; } function fourValues(property) { var components = property.components; var value1 = components[0].value[0]; var value2 = components[1].value[0]; var value3 = components[2].value[0]; var value4 = components[3].value[0]; if (value1[1] == value2[1] && value1[1] == value3[1] && value1[1] == value4[1]) { return [value1]; } else if (value1[1] == value3[1] && value2[1] == value4[1]) { return [value1, value2]; } else if (value2[1] == value4[1]) { return [value1, value2, value3]; } else { return [value1, value2, value3, value4]; } } function multiplex(restoreWith) { return function (property, configuration) { if (!property.multiplex) return restoreWith(property, configuration, true); var multiplexSize = 0; var restored = []; var componentMultiplexSoFar = {}; var i, l; // At this point we don't know what's the multiplex size, e.g. how many background layers are there for (i = 0, l = property.components[0].value.length; i < l; i++) { if (property.components[0].value[i][1] == Marker$b.COMMA) multiplexSize++; } for (i = 0; i <= multiplexSize; i++) { var _property = shallowClone$1(property); // We split multiplex into parts and restore them one by one for (var j = 0, m = property.components.length; j < m; j++) { var componentToClone = property.components[j]; var _component = shallowClone$1(componentToClone); _property.components.push(_component); // The trick is some properties has more than one value, so we iterate over values looking for // a multiplex separator - a comma for (var k = componentMultiplexSoFar[_component.name] || 0, n = componentToClone.value.length; k < n; k++) { if (componentToClone.value[k][1] == Marker$b.COMMA) { componentMultiplexSoFar[_component.name] = k + 1; break; } _component.value.push(componentToClone.value[k]); } } // No we can restore shorthand value var lastInMultiplex = i == multiplexSize; var _restored = restoreWith(_property, configuration, lastInMultiplex); Array.prototype.push.apply(restored, _restored); if (i < multiplexSize) restored.push([Token$k.PROPERTY_VALUE, Marker$b.COMMA]); } return restored; }; } function withoutDefaults(property, configuration) { var components = property.components; var restored = []; for (var i = components.length - 1; i >= 0; i--) { var component = components[i]; var descriptor = configuration[component.name]; if (component.value[0][1] != descriptor.defaultValue || ('keepUnlessDefault' in descriptor) && !isDefault(components, configuration, descriptor.keepUnlessDefault)) { restored.unshift(component.value[0]); } } if (restored.length === 0) restored.push([Token$k.PROPERTY_VALUE, configuration[property.name].defaultValue]); if (isInheritOnly(restored)) return [restored[0]]; return restored; } function isDefault(components, configuration, propertyName) { var component; var i, l; for (i = 0, l = components.length; i < l; i++) { component = components[i]; if (component.name == propertyName && component.value[0][1] == configuration[propertyName].defaultValue) { return true; } } return false; } var restore$1 = { background: background$1, borderRadius: borderRadius$1, font: font, fourValues: fourValues, multiplex: multiplex, withoutDefaults: withoutDefaults }; var override$5 = override_1; var INTEGER_PATTERN = /^\d+$/; var ALL_UNITS = ['*', 'all']; var DEFAULT_PRECISION = 'off'; // all precision changes are disabled var DIRECTIVES_SEPARATOR = ','; // e.g. *=5,px=3 var DIRECTIVE_VALUE_SEPARATOR = '='; // e.g. *=5 function roundingPrecisionFrom$1(source) { return override$5(defaults$2(DEFAULT_PRECISION), buildPrecisionFrom(source)); } function defaults$2(value) { return { 'ch': value, 'cm': value, 'em': value, 'ex': value, 'in': value, 'mm': value, 'pc': value, 'pt': value, 'px': value, 'q': value, 'rem': value, 'vh': value, 'vmax': value, 'vmin': value, 'vw': value, '%': value }; } function buildPrecisionFrom(source) { if (source === null || source === undefined) { return {}; } if (typeof source == 'boolean') { return {}; } if (typeof source == 'number' && source == -1) { return defaults$2(DEFAULT_PRECISION); } if (typeof source == 'number') { return defaults$2(source); } if (typeof source == 'string' && INTEGER_PATTERN.test(source)) { return defaults$2(parseInt(source)); } if (typeof source == 'string' && source == DEFAULT_PRECISION) { return defaults$2(DEFAULT_PRECISION); } if (typeof source == 'object') { return source; } return source .split(DIRECTIVES_SEPARATOR) .reduce(function (accumulator, directive) { var directiveParts = directive.split(DIRECTIVE_VALUE_SEPARATOR); var name = directiveParts[0]; var value = parseInt(directiveParts[1]); if (isNaN(value) || value == -1) { value = DEFAULT_PRECISION; } if (ALL_UNITS.indexOf(name) > -1) { accumulator = override$5(accumulator, defaults$2(value)); } else { accumulator[name] = value; } return accumulator; }, {}); } var roundingPrecision = { DEFAULT: DEFAULT_PRECISION, roundingPrecisionFrom: roundingPrecisionFrom$1 }; var roundingPrecisionFrom = roundingPrecision.roundingPrecisionFrom; var override$4 = override_1; var OptimizationLevel$j = { Zero: '0', One: '1', Two: '2' }; var DEFAULTS$1 = {}; DEFAULTS$1[OptimizationLevel$j.Zero] = {}; DEFAULTS$1[OptimizationLevel$j.One] = { cleanupCharsets: true, normalizeUrls: true, optimizeBackground: true, optimizeBorderRadius: true, optimizeFilter: true, optimizeFontWeight: true, optimizeOutline: true, removeEmpty: true, removeNegativePaddings: true, removeQuotes: true, removeWhitespace: true, replaceMultipleZeros: true, replaceTimeUnits: true, replaceZeroUnits: true, roundingPrecision: roundingPrecisionFrom(undefined), selectorsSortingMethod: 'standard', specialComments: 'all', tidyAtRules: true, tidyBlockScopes: true, tidySelectors: true }; DEFAULTS$1[OptimizationLevel$j.Two] = { mergeAdjacentRules: true, mergeIntoShorthands: true, mergeMedia: true, mergeNonAdjacentRules: true, mergeSemantically: false, overrideProperties: true, removeEmpty: true, reduceNonAdjacentRules: true, removeDuplicateFontRules: true, removeDuplicateMediaBlocks: true, removeDuplicateRules: true, removeUnusedAtRules: false, restructureRules: false, skipProperties: [] }; var ALL_KEYWORD_1 = '*'; var ALL_KEYWORD_2 = 'all'; var FALSE_KEYWORD_1 = 'false'; var FALSE_KEYWORD_2 = 'off'; var TRUE_KEYWORD_1 = 'true'; var TRUE_KEYWORD_2 = 'on'; var LIST_VALUE_SEPARATOR = ','; var OPTION_SEPARATOR = ';'; var OPTION_VALUE_SEPARATOR = ':'; function optimizationLevelFrom$1(source) { var level = override$4(DEFAULTS$1, {}); var Zero = OptimizationLevel$j.Zero; var One = OptimizationLevel$j.One; var Two = OptimizationLevel$j.Two; if (undefined === source) { delete level[Two]; return level; } if (typeof source == 'string') { source = parseInt(source); } if (typeof source == 'number' && source === parseInt(Two)) { return level; } if (typeof source == 'number' && source === parseInt(One)) { delete level[Two]; return level; } if (typeof source == 'number' && source === parseInt(Zero)) { delete level[Two]; delete level[One]; return level; } if (typeof source == 'object') { source = covertValuesToHashes(source); } if (One in source && 'roundingPrecision' in source[One]) { source[One].roundingPrecision = roundingPrecisionFrom(source[One].roundingPrecision); } if (Two in source && 'skipProperties' in source[Two] && typeof(source[Two].skipProperties) == 'string') { source[Two].skipProperties = source[Two].skipProperties.split(LIST_VALUE_SEPARATOR); } if (Zero in source || One in source || Two in source) { level[Zero] = override$4(level[Zero], source[Zero]); } if (One in source && ALL_KEYWORD_1 in source[One]) { level[One] = override$4(level[One], defaults$1(One, normalizeValue(source[One][ALL_KEYWORD_1]))); delete source[One][ALL_KEYWORD_1]; } if (One in source && ALL_KEYWORD_2 in source[One]) { level[One] = override$4(level[One], defaults$1(One, normalizeValue(source[One][ALL_KEYWORD_2]))); delete source[One][ALL_KEYWORD_2]; } if (One in source || Two in source) { level[One] = override$4(level[One], source[One]); } else { delete level[One]; } if (Two in source && ALL_KEYWORD_1 in source[Two]) { level[Two] = override$4(level[Two], defaults$1(Two, normalizeValue(source[Two][ALL_KEYWORD_1]))); delete source[Two][ALL_KEYWORD_1]; } if (Two in source && ALL_KEYWORD_2 in source[Two]) { level[Two] = override$4(level[Two], defaults$1(Two, normalizeValue(source[Two][ALL_KEYWORD_2]))); delete source[Two][ALL_KEYWORD_2]; } if (Two in source) { level[Two] = override$4(level[Two], source[Two]); } else { delete level[Two]; } return level; } function defaults$1(level, value) { var options = override$4(DEFAULTS$1[level], {}); var key; for (key in options) { if (typeof options[key] == 'boolean') { options[key] = value; } } return options; } function normalizeValue(value) { switch (value) { case FALSE_KEYWORD_1: case FALSE_KEYWORD_2: return false; case TRUE_KEYWORD_1: case TRUE_KEYWORD_2: return true; default: return value; } } function covertValuesToHashes(source) { var clonedSource = override$4(source, {}); var level; var i; for (i = 0; i <= 2; i++) { level = '' + i; if (level in clonedSource && (clonedSource[level] === undefined || clonedSource[level] === false)) { delete clonedSource[level]; } if (level in clonedSource && clonedSource[level] === true) { clonedSource[level] = {}; } if (level in clonedSource && typeof clonedSource[level] == 'string') { clonedSource[level] = covertToHash(clonedSource[level], level); } } return clonedSource; } function covertToHash(asString, level) { return asString .split(OPTION_SEPARATOR) .reduce(function (accumulator, directive) { var parts = directive.split(OPTION_VALUE_SEPARATOR); var name = parts[0]; var value = parts[1]; var normalizedValue = normalizeValue(value); if (ALL_KEYWORD_1 == name || ALL_KEYWORD_2 == name) { accumulator = override$4(accumulator, defaults$1(level, normalizedValue)); } else { accumulator[name] = normalizedValue; } return accumulator; }, {}); } var optimizationLevel = { OptimizationLevel: OptimizationLevel$j, optimizationLevelFrom: optimizationLevelFrom$1, }; var OptimizationLevel$i = optimizationLevel.OptimizationLevel; var plugin$j = { level1: { property: function background(_rule, property, options) { var values = property.value; if (!options.level[OptimizationLevel$i.One].optimizeBackground) { return; } if (values.length == 1 && values[0][1] == 'none') { values[0][1] = '0 0'; } if (values.length == 1 && values[0][1] == 'transparent') { values[0][1] = '0 0'; } } } }; var background = plugin$j; var plugin$i = { level1: { property: function boxShadow(_rule, property) { var values = property.value; // remove multiple zeros if (values.length == 4 && values[0][1] === '0' && values[1][1] === '0' && values[2][1] === '0' && values[3][1] === '0') { property.value.splice(2); property.dirty = true; } } } }; var boxShadow = plugin$i; var OptimizationLevel$h = optimizationLevel.OptimizationLevel; var plugin$h = { level1: { property: function borderRadius(_rule, property, options) { var values = property.value; if (!options.level[OptimizationLevel$h.One].optimizeBorderRadius) { return; } if (values.length == 3 && values[1][1] == '/' && values[0][1] == values[2][1]) { property.value.splice(1); property.dirty = true; } else if (values.length == 5 && values[2][1] == '/' && values[0][1] == values[3][1] && values[1][1] == values[4][1]) { property.value.splice(2); property.dirty = true; } else if (values.length == 7 && values[3][1] == '/' && values[0][1] == values[4][1] && values[1][1] == values[5][1] && values[2][1] == values[6][1]) { property.value.splice(3); property.dirty = true; } else if (values.length == 9 && values[4][1] == '/' && values[0][1] == values[5][1] && values[1][1] == values[6][1] && values[2][1] == values[7][1] && values[3][1] == values[8][1]) { property.value.splice(4); property.dirty = true; } } } }; var borderRadius = plugin$h; var OptimizationLevel$g = optimizationLevel.OptimizationLevel; var ALPHA_OR_CHROMA_FILTER_PATTERN = /progid:DXImageTransform\.Microsoft\.(Alpha|Chroma)(\W)/; var NO_SPACE_AFTER_COMMA_PATTERN = /,(\S)/g; var WHITESPACE_AROUND_EQUALS_PATTERN = / ?= ?/g; var plugin$g = { level1: { property: function filter(_rule, property, options) { if (!options.compatibility.properties.ieFilters) { return; } if (!options.level[OptimizationLevel$g.One].optimizeFilter) { return; } if (property.value.length == 1) { property.value[0][1] = property.value[0][1].replace(ALPHA_OR_CHROMA_FILTER_PATTERN, function (match, filter, suffix) { return filter.toLowerCase() + suffix; }); } property.value[0][1] = property.value[0][1] .replace(NO_SPACE_AFTER_COMMA_PATTERN, ', $1') .replace(WHITESPACE_AROUND_EQUALS_PATTERN, '='); } } }; var filter$1 = plugin$g; var OptimizationLevel$f = optimizationLevel.OptimizationLevel; var plugin$f = { level1: { property: function fontWeight(_rule, property, options) { var value = property.value[0][1]; if (!options.level[OptimizationLevel$f.One].optimizeFontWeight) { return; } if (value == 'normal') { value = '400'; } else if (value == 'bold') { value = '700'; } property.value[0][1] = value; } } }; var fontWeight = plugin$f; var OptimizationLevel$e = optimizationLevel.OptimizationLevel; var plugin$e = { level1: { property: function margin(_rule, property, options) { var values = property.value; if (!options.level[OptimizationLevel$e.One].replaceMultipleZeros) { return; } // remove multiple zeros if (values.length == 4 && values[0][1] === '0' && values[1][1] === '0' && values[2][1] === '0' && values[3][1] === '0') { property.value.splice(1); property.dirty = true; } } } }; var margin = plugin$e; var OptimizationLevel$d = optimizationLevel.OptimizationLevel; var plugin$d = { level1: { property: function outline(_rule, property, options) { var values = property.value; if (!options.level[OptimizationLevel$d.One].optimizeOutline) { return; } if (values.length == 1 && values[0][1] == 'none') { values[0][1] = '0'; } } } }; var outline = plugin$d; var OptimizationLevel$c = optimizationLevel.OptimizationLevel; function isNegative(value) { return value && value[1][0] == '-' && parseFloat(value[1]) < 0; } var plugin$c = { level1: { property: function padding(_rule, property, options) { var values = property.value; // remove multiple zeros if (values.length == 4 && values[0][1] === '0' && values[1][1] === '0' && values[2][1] === '0' && values[3][1] === '0') { property.value.splice(1); property.dirty = true; } // remove negative paddings if (options.level[OptimizationLevel$c.One].removeNegativePaddings && (isNegative(property.value[0]) || isNegative(property.value[1]) || isNegative(property.value[2]) || isNegative(property.value[3]))) { property.unused = true; } } } }; var padding = plugin$c; var propertyOptimizers$1 = { background: background.level1.property, boxShadow: boxShadow.level1.property, borderRadius: borderRadius.level1.property, filter: filter$1.level1.property, fontWeight: fontWeight.level1.property, margin: margin.level1.property, outline: outline.level1.property, padding: padding.level1.property }; var COLORS = { aliceblue: '#f0f8ff', antiquewhite: '#faebd7', aqua: '#0ff', aquamarine: '#7fffd4', azure: '#f0ffff', beige: '#f5f5dc', bisque: '#ffe4c4', black: '#000', blanchedalmond: '#ffebcd', blue: '#00f', blueviolet: '#8a2be2', brown: '#a52a2a', burlywood: '#deb887', cadetblue: '#5f9ea0', chartreuse: '#7fff00', chocolate: '#d2691e', coral: '#ff7f50', cornflowerblue: '#6495ed', cornsilk: '#fff8dc', crimson: '#dc143c', cyan: '#0ff', darkblue: '#00008b', darkcyan: '#008b8b', darkgoldenrod: '#b8860b', darkgray: '#a9a9a9', darkgreen: '#006400', darkgrey: '#a9a9a9', darkkhaki: '#bdb76b', darkmagenta: '#8b008b', darkolivegreen: '#556b2f', darkorange: '#ff8c00', darkorchid: '#9932cc', darkred: '#8b0000', darksalmon: '#e9967a', darkseagreen: '#8fbc8f', darkslateblue: '#483d8b', darkslategray: '#2f4f4f', darkslategrey: '#2f4f4f', darkturquoise: '#00ced1', darkviolet: '#9400d3', deeppink: '#ff1493', deepskyblue: '#00bfff', dimgray: '#696969', dimgrey: '#696969', dodgerblue: '#1e90ff', firebrick: '#b22222', floralwhite: '#fffaf0', forestgreen: '#228b22', fuchsia: '#f0f', gainsboro: '#dcdcdc', ghostwhite: '#f8f8ff', gold: '#ffd700', goldenrod: '#daa520', gray: '#808080', green: '#008000', greenyellow: '#adff2f', grey: '#808080', honeydew: '#f0fff0', hotpink: '#ff69b4', indianred: '#cd5c5c', indigo: '#4b0082', ivory: '#fffff0', khaki: '#f0e68c', lavender: '#e6e6fa', lavenderblush: '#fff0f5', lawngreen: '#7cfc00', lemonchiffon: '#fffacd', lightblue: '#add8e6', lightcoral: '#f08080', lightcyan: '#e0ffff', lightgoldenrodyellow: '#fafad2', lightgray: '#d3d3d3', lightgreen: '#90ee90', lightgrey: '#d3d3d3', lightpink: '#ffb6c1', lightsalmon: '#ffa07a', lightseagreen: '#20b2aa', lightskyblue: '#87cefa', lightslategray: '#778899', lightslategrey: '#778899', lightsteelblue: '#b0c4de', lightyellow: '#ffffe0', lime: '#0f0', limegreen: '#32cd32', linen: '#faf0e6', magenta: '#ff00ff', maroon: '#800000', mediumaquamarine: '#66cdaa', mediumblue: '#0000cd', mediumorchid: '#ba55d3', mediumpurple: '#9370db', mediumseagreen: '#3cb371', mediumslateblue: '#7b68ee', mediumspringgreen: '#00fa9a', mediumturquoise: '#48d1cc', mediumvioletred: '#c71585', midnightblue: '#191970', mintcream: '#f5fffa', mistyrose: '#ffe4e1', moccasin: '#ffe4b5', navajowhite: '#ffdead', navy: '#000080', oldlace: '#fdf5e6', olive: '#808000', olivedrab: '#6b8e23', orange: '#ffa500', orangered: '#ff4500', orchid: '#da70d6', palegoldenrod: '#eee8aa', palegreen: '#98fb98', paleturquoise: '#afeeee', palevioletred: '#db7093', papayawhip: '#ffefd5', peachpuff: '#ffdab9', peru: '#cd853f', pink: '#ffc0cb', plum: '#dda0dd', powderblue: '#b0e0e6', purple: '#800080', rebeccapurple: '#663399', red: '#f00', rosybrown: '#bc8f8f', royalblue: '#4169e1', saddlebrown: '#8b4513', salmon: '#fa8072', sandybrown: '#f4a460', seagreen: '#2e8b57', seashell: '#fff5ee', sienna: '#a0522d', silver: '#c0c0c0', skyblue: '#87ceeb', slateblue: '#6a5acd', slategray: '#708090', slategrey: '#708090', snow: '#fffafa', springgreen: '#00ff7f', steelblue: '#4682b4', tan: '#d2b48c', teal: '#008080', thistle: '#d8bfd8', tomato: '#ff6347', turquoise: '#40e0d0', violet: '#ee82ee', wheat: '#f5deb3', white: '#fff', whitesmoke: '#f5f5f5', yellow: '#ff0', yellowgreen: '#9acd32' }; var toHex$1 = {}; var toName = {}; for (var name in COLORS) { var hex = COLORS[name]; if (name.length < hex.length) { toName[hex] = name; } else { toHex$1[name] = hex; } } var toHexPattern = new RegExp('(^| |,|\\))(' + Object.keys(toHex$1).join('|') + ')( |,|\\)|$)', 'ig'); var toNamePattern = new RegExp('(' + Object.keys(toName).join('|') + ')([^a-f0-9]|$)', 'ig'); function hexConverter(match, prefix, colorValue, suffix) { return prefix + toHex$1[colorValue.toLowerCase()] + suffix; } function nameConverter(match, colorValue, suffix) { return toName[colorValue.toLowerCase()] + suffix; } function shortenHex$1(value) { var hasHex = value.indexOf('#') > -1; var shortened = value.replace(toHexPattern, hexConverter); if (shortened != value) { shortened = shortened.replace(toHexPattern, hexConverter); } return hasHex ? shortened.replace(toNamePattern, nameConverter) : shortened; } var shortenHex_1 = shortenHex$1; // HSL to RGB converter. Both methods adapted from: // http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript function hslToRgb(h, s, l) { var r, g, b; // normalize hue orientation b/w 0 and 360 degrees h = h % 360; if (h < 0) h += 360; h = ~~h / 360; if (s < 0) s = 0; else if (s > 100) s = 100; s = ~~s / 100; if (l < 0) l = 0; else if (l > 100) l = 100; l = ~~l / 100; if (s === 0) { r = g = b = l; // achromatic } else { var q = l < 0.5 ? l * (1 + s) : l + s - l * s; var p = 2 * l - q; r = hueToRgb(p, q, h + 1/3); g = hueToRgb(p, q, h); b = hueToRgb(p, q, h - 1/3); } return [~~(r * 255), ~~(g * 255), ~~(b * 255)]; } function hueToRgb(p, q, t) { if (t < 0) t += 1; if (t > 1) t -= 1; if (t < 1/6) return p + (q - p) * 6 * t; if (t < 1/2) return q; if (t < 2/3) return p + (q - p) * (2/3 - t) * 6; return p; } function shortenHsl$1(hue, saturation, lightness) { var asRgb = hslToRgb(hue, saturation, lightness); var redAsHex = asRgb[0].toString(16); var greenAsHex = asRgb[1].toString(16); var blueAsHex = asRgb[2].toString(16); return '#' + ((redAsHex.length == 1 ? '0' : '') + redAsHex) + ((greenAsHex.length == 1 ? '0' : '') + greenAsHex) + ((blueAsHex.length == 1 ? '0' : '') + blueAsHex); } var shortenHsl_1 = shortenHsl$1; function shortenRgb$1(red, green, blue) { var normalizedRed = Math.max(0, Math.min(parseInt(red), 255)); var normalizedGreen = Math.max(0, Math.min(parseInt(green), 255)); var normalizedBlue = Math.max(0, Math.min(parseInt(blue), 255)); // Credit: Asen http://jsbin.com/UPUmaGOc/2/edit?js,console return '#' + ('00000' + (normalizedRed << 16 | normalizedGreen << 8 | normalizedBlue).toString(16)).slice(-6); } var shortenRgb_1 = shortenRgb$1; var Marker$a = marker; function is(value, separator, isSeparatorRegex) { return isSeparatorRegex ? separator.test(value) : value === separator; } function split$4(value, separator) { var openLevel = Marker$a.OPEN_ROUND_BRACKET; var closeLevel = Marker$a.CLOSE_ROUND_BRACKET; var level = 0; var cursor = 0; var lastStart = 0; var lastValue; var lastCharacter; var len = value.length; var parts = []; var isSeparatorRegex = typeof(separator) == 'object' && 'exec' in separator; if (!isSeparatorRegex && value.indexOf(separator) == -1) { return [value]; } if (value.indexOf(openLevel) == -1) { return value.split(separator); } while (cursor < len) { if (value[cursor] == openLevel) { level++; } else if (value[cursor] == closeLevel) { level--; } if (level === 0 && cursor > 0 && cursor + 1 < len && is(value[cursor], separator, isSeparatorRegex)) { parts.push(value.substring(lastStart, cursor)); if (isSeparatorRegex && separator.exec(value[cursor]).length > 1) { parts.push(value[cursor]); } lastStart = cursor + 1; } cursor++; } if (lastStart < cursor + 1) { lastValue = value.substring(lastStart); lastCharacter = lastValue[lastValue.length - 1]; if (is(lastCharacter, separator, isSeparatorRegex)) { lastValue = lastValue.substring(0, lastValue.length - 1); } parts.push(lastValue); } return parts; } var split_1 = split$4; var shortenHex = shortenHex_1; var shortenHsl = shortenHsl_1; var shortenRgb = shortenRgb_1; var split$3 = split_1; var ANY_COLOR_FUNCTION_PATTERN = /(rgb|rgba|hsl|hsla)\(([^\(\)]+)\)/gi; var COLOR_PREFIX_PATTERN = /#|rgb|hsl/gi; var HEX_LONG_PATTERN = /(^|[^='"])#([0-9a-f]{6})/gi; var HEX_SHORT_PATTERN = /(^|[^='"])#([0-9a-f]{3})/gi; var HEX_VALUE_PATTERN = /[0-9a-f]/i; var HSL_PATTERN = /hsl\((-?\d+),(-?\d+)%?,(-?\d+)%?\)/gi; var RGBA_HSLA_PATTERN = /(rgb|hsl)a?\((\-?\d+),(\-?\d+\%?),(\-?\d+\%?),(0*[1-9]+[0-9]*(\.?\d*)?)\)/gi; var RGB_PATTERN = /rgb\((\-?\d+),(\-?\d+),(\-?\d+)\)/gi; var TRANSPARENT_FUNCTION_PATTERN = /(?:rgba|hsla)\(0,0%?,0%?,0\)/g; var plugin$b = { level1: { value: function color(name, value, options) { if (!options.compatibility.properties.colors) { return value; } if (!value.match(COLOR_PREFIX_PATTERN)) { return shortenHex(value); } value = value .replace(RGBA_HSLA_PATTERN, function (match, colorFn, p1, p2, p3, alpha) { return (parseInt(alpha, 10) >= 1 ? colorFn + '(' + [p1,p2,p3].join(',') + ')' : match); }) .replace(RGB_PATTERN, function (match, red, green, blue) { return shortenRgb(red, green, blue); }) .replace(HSL_PATTERN, function (match, hue, saturation, lightness) { return shortenHsl(hue, saturation, lightness); }) .replace(HEX_LONG_PATTERN, function (match, prefix, color, at, inputValue) { var suffix = inputValue[at + match.length]; if (suffix && HEX_VALUE_PATTERN.test(suffix)) { return match; } else if (color[0] == color[1] && color[2] == color[3] && color[4] == color[5]) { return (prefix + '#' + color[0] + color[2] + color[4]).toLowerCase(); } else { return (prefix + '#' + color).toLowerCase(); } }) .replace(HEX_SHORT_PATTERN, function (match, prefix, color) { return prefix + '#' + color.toLowerCase(); }) .replace(ANY_COLOR_FUNCTION_PATTERN, function (match, colorFunction, colorDef) { var tokens = colorDef.split(','); var colorFnLowercase = colorFunction && colorFunction.toLowerCase(); var applies = (colorFnLowercase == 'hsl' && tokens.length == 3) || (colorFnLowercase == 'hsla' && tokens.length == 4) || (colorFnLowercase == 'rgb' && tokens.length === 3 && colorDef.indexOf('%') > 0) || (colorFnLowercase == 'rgba' && tokens.length == 4 && colorDef.indexOf('%') > 0); if (!applies) { return match; } if (tokens[1].indexOf('%') == -1) { tokens[1] += '%'; } if (tokens[2].indexOf('%') == -1) { tokens[2] += '%'; } return colorFunction + '(' + tokens.join(',') + ')'; }); if (options.compatibility.colors.opacity && name.indexOf('background') == -1) { value = value.replace(TRANSPARENT_FUNCTION_PATTERN, function (match) { if (split$3(value, ',').pop().indexOf('gradient(') > -1) { return match; } return 'transparent'; }); } return shortenHex(value); } } }; var color = plugin$b; var ZERO_DEG_PATTERN = /\(0deg\)/g; var plugin$a = { level1: { value: function degrees(_name, value, options) { if (!options.compatibility.properties.zeroUnits) { return value; } if (value.indexOf('0deg') == -1) { return value; } return value.replace(ZERO_DEG_PATTERN, '(0)'); } } }; var degrees = plugin$a; var URL_PREFIX_PATTERN$4 = /^url\(/i; function startsAsUrl$4(value) { return URL_PREFIX_PATTERN$4.test(value); } var startsAsUrl_1 = startsAsUrl$4; var startsAsUrl$3 = startsAsUrl_1; var OptimizationLevel$b = optimizationLevel.OptimizationLevel; var DOT_ZERO_PATTERN = /(^|\D)\.0+(\D|$)/g; var FRACTION_PATTERN = /\.([1-9]*)0+(\D|$)/g; var LEADING_ZERO_FRACTION_PATTERN = /(^|\D)0\.(\d)/g; var MINUS_ZERO_FRACTION_PATTERN = /([^\w\d\-]|^)\-0([^\.]|$)/g; var ZERO_PREFIXED_UNIT_PATTERN = /(^|\s)0+([1-9])/g; var plugin$9 = { level1: { value: function fraction(name, value, options) { if (!options.level[OptimizationLevel$b.One].replaceZeroUnits) { return value; } if (startsAsUrl$3(value)) { return value; } if (value.indexOf('0') == -1) { return value; } if (value.indexOf('-') > -1) { value = value .replace(MINUS_ZERO_FRACTION_PATTERN, '$10$2') .replace(MINUS_ZERO_FRACTION_PATTERN, '$10$2'); } return value .replace(ZERO_PREFIXED_UNIT_PATTERN, '$1$2') .replace(DOT_ZERO_PATTERN, '$10$2') .replace(FRACTION_PATTERN, function (match, nonZeroPart, suffix) { return (nonZeroPart.length > 0 ? '.' : '') + nonZeroPart + suffix; }) .replace(LEADING_ZERO_FRACTION_PATTERN, '$1.$2'); } } }; var fraction = plugin$9; var plugin$8 = { level1: { value: function precision(_name, value, options) { if (!options.precision.enabled || value.indexOf('.') === -1) { return value; } return value .replace(options.precision.decimalPointMatcher, '$1$2$3') .replace(options.precision.zeroMatcher, function (match, integerPart, fractionPart, unit) { var multiplier = options.precision.units[unit].multiplier; var parsedInteger = parseInt(integerPart); var integer = isNaN(parsedInteger) ? 0 : parsedInteger; var fraction = parseFloat(fractionPart); return Math.round((integer + fraction) * multiplier) / multiplier + unit; }); } } }; var precision = plugin$8; var OptimizationLevel$a = optimizationLevel.OptimizationLevel; var LOCAL_PREFIX_PATTERN = /^local\(/i; var QUOTED_PATTERN = /^('.*'|".*")$/; var QUOTED_BUT_SAFE_PATTERN = /^['"][a-zA-Z][a-zA-Z\d\-_]+['"]$/; var plugin$7 = { level1: { value: function textQuotes(_name, value, options) { if (!options.level[OptimizationLevel$a.One].removeQuotes) { return value; } if (!QUOTED_PATTERN.test(value) && !LOCAL_PREFIX_PATTERN.test(value)) { return value; } return QUOTED_BUT_SAFE_PATTERN.test(value) ? value.substring(1, value.length - 1) : value; } } }; var textQuotes = plugin$7; var OptimizationLevel$9 = optimizationLevel.OptimizationLevel; var TIME_VALUE = /^(\-?[\d\.]+)(m?s)$/; var plugin$6 = { level1: { value: function time(name, value, options) { if (!options.level[OptimizationLevel$9.One].replaceTimeUnits) { return value; } if (!TIME_VALUE.test(value)) { return value; } return value.replace(TIME_VALUE, function (match, val, unit) { var newValue; if (unit == 'ms') { newValue = parseInt(val) / 1000 + 's'; } else if (unit == 's') { newValue = parseFloat(val) * 1000 + 'ms'; } return newValue.length < match.length ? newValue : match; }); } } }; var time = plugin$6; var WHOLE_PIXEL_VALUE = /(?:^|\s|\()(-?\d+)px/; var plugin$5 = { level1: { value: function unit(_name, value, options) { if (!WHOLE_PIXEL_VALUE.test(value)) { return value; } return value.replace(WHOLE_PIXEL_VALUE, function (match, val) { var newValue; var intVal = parseInt(val); if (intVal === 0) { return match; } if (options.compatibility.properties.shorterLengthUnits && options.compatibility.units.pt && intVal * 3 % 4 === 0) { newValue = intVal * 3 / 4 + 'pt'; } if (options.compatibility.properties.shorterLengthUnits && options.compatibility.units.pc && intVal % 16 === 0) { newValue = intVal / 16 + 'pc'; } if (options.compatibility.properties.shorterLengthUnits && options.compatibility.units.in && intVal % 96 === 0) { newValue = intVal / 96 + 'in'; } if (newValue) { newValue = match.substring(0, match.indexOf(val)) + newValue; } return newValue && newValue.length < match.length ? newValue : match; }); } } }; var unit = plugin$5; var startsAsUrl$2 = startsAsUrl_1; var OptimizationLevel$8 = optimizationLevel.OptimizationLevel; var URL_PREFIX_PATTERN$3 = /^url\(/i; var plugin$4 = { level1: { value: function urlPrefix(_name, value, options) { if (!options.level[OptimizationLevel$8.One].normalizeUrls) { return value; } if (!startsAsUrl$2(value)) { return value; } return value.replace(URL_PREFIX_PATTERN$3, 'url('); } } }; var urlPrefix = plugin$4; var QUOTED_URL_PATTERN = /^url\(['"].+['"]\)$/; var QUOTED_URL_WITH_WHITESPACE_PATTERN = /^url\(['"].*[\*\s\(\)'"].*['"]\)$/; var QUOTES_PATTERN = /["']/g; var URL_DATA_PATTERN = /^url\(['"]data:[^;]+;charset/; var plugin$3 = { level1: { value: function urlQuotes(_name, value, options) { if (options.compatibility.properties.urlQuotes) { return value; } return QUOTED_URL_PATTERN.test(value) && !QUOTED_URL_WITH_WHITESPACE_PATTERN.test(value) && !URL_DATA_PATTERN.test(value) ? value.replace(QUOTES_PATTERN, '') : value; } } }; var urlQuotes = plugin$3; var startsAsUrl$1 = startsAsUrl_1; var WHITESPACE_PATTERN$1 = /\\?\n|\\?\r\n/g; var WHITESPACE_PREFIX_PATTERN = /(\()\s+/g; var WHITESPACE_SUFFIX_PATTERN = /\s+(\))/g; var plugin$2 = { level1: { value: function urlWhitespace(_name, value) { if (!startsAsUrl$1(value)) { return value; } return value .replace(WHITESPACE_PATTERN$1, '') .replace(WHITESPACE_PREFIX_PATTERN, '$1') .replace(WHITESPACE_SUFFIX_PATTERN, '$1'); } } }; var urlWhitespace = plugin$2; var OptimizationLevel$7 = optimizationLevel.OptimizationLevel; var Marker$9 = marker; var CALC_DIVISION_WHITESPACE_PATTERN = /\) ?\/ ?/g; var COMMA_AND_SPACE_PATTERN = /, /g; var LINE_BREAK_PATTERN = /\r?\n/g; var MULTI_WHITESPACE_PATTERN = /\s+/g; var FUNCTION_CLOSING_BRACE_WHITESPACE_PATTERN = /\s+(;?\))/g; var FUNCTION_OPENING_BRACE_WHITESPACE_PATTERN = /(\(;?)\s+/g; var VARIABLE_NAME_PATTERN = /^--\S+$/; var VARIABLE_VALUE_PATTERN = /^var\(\s*--\S+\s*\)$/; var plugin$1 = { level1: { value: function whitespace(name, value, options) { if (!options.level[OptimizationLevel$7.One].removeWhitespace) { return value; } if (VARIABLE_NAME_PATTERN.test(name) && !VARIABLE_VALUE_PATTERN.test(value)) { return value; } if ((value.indexOf(' ') == -1 && value.indexOf('\n') == -1) || value.indexOf('expression') === 0) { return value; } if (value.indexOf(Marker$9.SINGLE_QUOTE) > -1 || value.indexOf(Marker$9.DOUBLE_QUOTE) > -1) { return value; } value = value.replace(LINE_BREAK_PATTERN, ''); value = value.replace(MULTI_WHITESPACE_PATTERN, ' '); if (value.indexOf('calc') > -1) { value = value.replace(CALC_DIVISION_WHITESPACE_PATTERN, ')/ '); } return value .replace(FUNCTION_OPENING_BRACE_WHITESPACE_PATTERN, '$1') .replace(FUNCTION_CLOSING_BRACE_WHITESPACE_PATTERN, '$1') .replace(COMMA_AND_SPACE_PATTERN, ','); } } }; var whitespace = plugin$1; var split$2 = split_1; var ANY_FUNCTION_PATTERN = /^(\-(?:moz|ms|o|webkit)\-[a-z\-]+|[a-z\-]+)\((.+)\)$/; var SKIP_FUNCTION_PATTERN = /^(?:\-moz\-calc|\-webkit\-calc|calc|rgb|hsl|rgba|hsla|min|max|clamp|expression)\(/; var TOKEN_SEPARATOR_PATTERN = /([\s,\/])/; function removeRecursively(value, options) { var functionTokens; var tokens; if (SKIP_FUNCTION_PATTERN.test(value)) { return value; } functionTokens = ANY_FUNCTION_PATTERN.exec(value); if (!functionTokens) { return removeZeros(value, options); } tokens = split$2(functionTokens[2], TOKEN_SEPARATOR_PATTERN) .map(function (token) { return removeRecursively(token, options); }); return functionTokens[1] + '(' + tokens.join('') + ')'; } function removeZeros(value, options) { return value .replace(options.unitsRegexp, '$1' + '0' + '$2') .replace(options.unitsRegexp, '$1' + '0' + '$2'); } var plugin = { level1: { value: function zero(name, value, options) { if (!options.compatibility.properties.zeroUnits) { return value; } if (value.indexOf('%') > 0 && (name == 'height' || name == 'max-height' || name == 'width' || name == 'max-width')) { return value; } return removeRecursively(value, options); } } }; var zero = plugin; var valueOptimizers$1 = { color: color.level1.value, degrees: degrees.level1.value, fraction: fraction.level1.value, precision: precision.level1.value, textQuotes: textQuotes.level1.value, time: time.level1.value, unit: unit.level1.value, urlPrefix: urlPrefix.level1.value, urlQuotes: urlQuotes.level1.value, urlWhiteSpace: urlWhitespace.level1.value, whiteSpace: whitespace.level1.value, zero: zero.level1.value }; // Contains the interpretation of CSS properties, as used by the property optimizer var breakUp = breakUp$1; var canOverride = canOverride$1; var restore = restore$1; var propertyOptimizers = propertyOptimizers$1; var valueOptimizers = valueOptimizers$1; var override$3 = override_1; // Properties to process // Extend this object in order to add support for more properties in the optimizer. // // Each key in this object represents a CSS property and should be an object. // Such an object contains properties that describe how the represented CSS property should be handled. // Possible options: // // * components: array (Only specify for shorthand properties.) // Contains the names of the granular properties this shorthand compacts. // // * canOverride: function // Returns whether two tokens of this property can be merged with each other. // This property has no meaning for shorthands. // // * defaultValue: string // Specifies the default value of the property according to the CSS standard. // For shorthand, this is used when every component is set to its default value, therefore it should be the shortest possible default value of all the components. // // * shortestValue: string // Specifies the shortest possible value the property can possibly have. // (Falls back to defaultValue if unspecified.) // // * breakUp: function (Only specify for shorthand properties.) // Breaks the shorthand up to its components. // // * restore: function (Only specify for shorthand properties.) // Puts the shorthand together from its components. // var configuration$8 = { 'animation': { canOverride: canOverride.generic.components([ canOverride.generic.time, canOverride.generic.timingFunction, canOverride.generic.time, canOverride.property.animationIterationCount, canOverride.property.animationDirection, canOverride.property.animationFillMode, canOverride.property.animationPlayState, canOverride.property.animationName ]), components: [ 'animation-duration', 'animation-timing-function', 'animation-delay', 'animation-iteration-count', 'animation-direction', 'animation-fill-mode', 'animation-play-state', 'animation-name' ], breakUp: breakUp.multiplex(breakUp.animation), defaultValue: 'none', restore: restore.multiplex(restore.withoutDefaults), shorthand: true, valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.textQuotes, valueOptimizers.time, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.unit, valueOptimizers.zero ], vendorPrefixes: [ '-moz-', '-o-', '-webkit-' ] }, 'animation-delay': { canOverride: canOverride.generic.time, componentOf: [ 'animation' ], defaultValue: '0s', intoMultiplexMode: 'real', valueOptimizers: [ valueOptimizers.time, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.unit, valueOptimizers.zero ], vendorPrefixes: [ '-moz-', '-o-', '-webkit-' ] }, 'animation-direction': { canOverride: canOverride.property.animationDirection, componentOf: [ 'animation' ], defaultValue: 'normal', intoMultiplexMode: 'real', vendorPrefixes: [ '-moz-', '-o-', '-webkit-' ] }, 'animation-duration': { canOverride: canOverride.generic.time, componentOf: [ 'animation' ], defaultValue: '0s', intoMultiplexMode: 'real', keepUnlessDefault: 'animation-delay', valueOptimizers: [ valueOptimizers.time, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.unit, valueOptimizers.zero ], vendorPrefixes: [ '-moz-', '-o-', '-webkit-' ] }, 'animation-fill-mode': { canOverride: canOverride.property.animationFillMode, componentOf: [ 'animation' ], defaultValue: 'none', intoMultiplexMode: 'real', vendorPrefixes: [ '-moz-', '-o-', '-webkit-' ] }, 'animation-iteration-count': { canOverride: canOverride.property.animationIterationCount, componentOf: [ 'animation' ], defaultValue: '1', intoMultiplexMode: 'real', vendorPrefixes: [ '-moz-', '-o-', '-webkit-' ] }, 'animation-name': { canOverride: canOverride.property.animationName, componentOf: [ 'animation' ], defaultValue: 'none', intoMultiplexMode: 'real', valueOptimizers: [ valueOptimizers.textQuotes ], vendorPrefixes: [ '-moz-', '-o-', '-webkit-' ] }, 'animation-play-state': { canOverride: canOverride.property.animationPlayState, componentOf: [ 'animation' ], defaultValue: 'running', intoMultiplexMode: 'real', vendorPrefixes: [ '-moz-', '-o-', '-webkit-' ] }, 'animation-timing-function': { canOverride: canOverride.generic.timingFunction, componentOf: [ 'animation' ], defaultValue: 'ease', intoMultiplexMode: 'real', vendorPrefixes: [ '-moz-', '-o-', '-webkit-' ] }, 'background': { canOverride: canOverride.generic.components([ canOverride.generic.image, canOverride.property.backgroundPosition, canOverride.property.backgroundSize, canOverride.property.backgroundRepeat, canOverride.property.backgroundAttachment, canOverride.property.backgroundOrigin, canOverride.property.backgroundClip, canOverride.generic.color ]), components: [ 'background-image', 'background-position', 'background-size', 'background-repeat', 'background-attachment', 'background-origin', 'background-clip', 'background-color' ], breakUp: breakUp.multiplex(breakUp.background), defaultValue: '0 0', propertyOptimizer: propertyOptimizers.background, restore: restore.multiplex(restore.background), shortestValue: '0', shorthand: true, valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.urlWhiteSpace, valueOptimizers.fraction, valueOptimizers.zero, valueOptimizers.color, valueOptimizers.urlPrefix, valueOptimizers.urlQuotes ] }, 'background-attachment': { canOverride: canOverride.property.backgroundAttachment, componentOf: [ 'background' ], defaultValue: 'scroll', intoMultiplexMode: 'real' }, 'background-clip': { canOverride: canOverride.property.backgroundClip, componentOf: [ 'background' ], defaultValue: 'border-box', intoMultiplexMode: 'real', shortestValue: 'border-box' }, 'background-color': { canOverride: canOverride.generic.color, componentOf: [ 'background' ], defaultValue: 'transparent', intoMultiplexMode: 'real', // otherwise real color will turn into default since color appears in last multiplex only multiplexLastOnly: true, nonMergeableValue: 'none', shortestValue: 'red', valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.color ] }, 'background-image': { canOverride: canOverride.generic.image, componentOf: [ 'background' ], defaultValue: 'none', intoMultiplexMode: 'default', valueOptimizers: [ valueOptimizers.urlWhiteSpace, valueOptimizers.urlPrefix, valueOptimizers.urlQuotes, valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.unit, valueOptimizers.zero, valueOptimizers.color ] }, 'background-origin': { canOverride: canOverride.property.backgroundOrigin, componentOf: [ 'background' ], defaultValue: 'padding-box', intoMultiplexMode: 'real', shortestValue: 'border-box' }, 'background-position': { canOverride: canOverride.property.backgroundPosition, componentOf: [ 'background' ], defaultValue: ['0', '0'], doubleValues: true, intoMultiplexMode: 'real', shortestValue: '0', valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.unit, valueOptimizers.zero ] }, 'background-repeat': { canOverride: canOverride.property.backgroundRepeat, componentOf: [ 'background' ], defaultValue: ['repeat'], doubleValues: true, intoMultiplexMode: 'real' }, 'background-size': { canOverride: canOverride.property.backgroundSize, componentOf: [ 'background' ], defaultValue: ['auto'], doubleValues: true, intoMultiplexMode: 'real', shortestValue: '0 0', valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.unit, valueOptimizers.zero ] }, 'bottom': { canOverride: canOverride.property.bottom, defaultValue: 'auto', valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.unit, valueOptimizers.zero ] }, 'border': { breakUp: breakUp.border, canOverride: canOverride.generic.components([ canOverride.generic.unit, canOverride.property.borderStyle, canOverride.generic.color ]), components: [ 'border-width', 'border-style', 'border-color' ], defaultValue: 'none', overridesShorthands: [ 'border-bottom', 'border-left', 'border-right', 'border-top' ], restore: restore.withoutDefaults, shorthand: true, shorthandComponents: true, valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.zero, valueOptimizers.color ] }, 'border-bottom': { breakUp: breakUp.border, canOverride: canOverride.generic.components([ canOverride.generic.unit, canOverride.property.borderStyle, canOverride.generic.color ]), components: [ 'border-bottom-width', 'border-bottom-style', 'border-bottom-color' ], defaultValue: 'none', restore: restore.withoutDefaults, shorthand: true, valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.zero, valueOptimizers.color ] }, 'border-bottom-color': { canOverride: canOverride.generic.color, componentOf: [ 'border-bottom', 'border-color' ], defaultValue: 'none', valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.color ] }, 'border-bottom-left-radius': { canOverride: canOverride.generic.unit, componentOf: [ 'border-radius' ], defaultValue: '0', propertyOptimizer: propertyOptimizers.borderRadius, valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.unit, valueOptimizers.zero ], vendorPrefixes: [ '-moz-', '-o-' ] }, 'border-bottom-right-radius': { canOverride: canOverride.generic.unit, componentOf: [ 'border-radius' ], defaultValue: '0', propertyOptimizer: propertyOptimizers.borderRadius, valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.unit, valueOptimizers.zero ], vendorPrefixes: [ '-moz-', '-o-' ] }, 'border-bottom-style': { canOverride: canOverride.property.borderStyle, componentOf: [ 'border-bottom', 'border-style' ], defaultValue: 'none' }, 'border-bottom-width': { canOverride: canOverride.generic.unit, componentOf: [ 'border-bottom', 'border-width' ], defaultValue: 'medium', oppositeTo: 'border-top-width', shortestValue: '0', valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.unit, valueOptimizers.zero ] }, 'border-collapse': { canOverride: canOverride.property.borderCollapse, defaultValue: 'separate' }, 'border-color': { breakUp: breakUp.fourValues, canOverride: canOverride.generic.components([ canOverride.generic.color, canOverride.generic.color, canOverride.generic.color, canOverride.generic.color ]), componentOf: [ 'border' ], components: [ 'border-top-color', 'border-right-color', 'border-bottom-color', 'border-left-color' ], defaultValue: 'none', restore: restore.fourValues, shortestValue: 'red', shorthand: true, singleTypeComponents: true, valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.color ] }, 'border-left': { breakUp: breakUp.border, canOverride: canOverride.generic.components([ canOverride.generic.unit, canOverride.property.borderStyle, canOverride.generic.color ]), components: [ 'border-left-width', 'border-left-style', 'border-left-color' ], defaultValue: 'none', restore: restore.withoutDefaults, shorthand: true, valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.zero, valueOptimizers.color ] }, 'border-left-color': { canOverride: canOverride.generic.color, componentOf: [ 'border-color', 'border-left' ], defaultValue: 'none', valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.color ] }, 'border-left-style': { canOverride: canOverride.property.borderStyle, componentOf: [ 'border-left', 'border-style' ], defaultValue: 'none' }, 'border-left-width': { canOverride: canOverride.generic.unit, componentOf: [ 'border-left', 'border-width' ], defaultValue: 'medium', oppositeTo: 'border-right-width', shortestValue: '0', valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.unit, valueOptimizers.zero ] }, 'border-radius': { breakUp: breakUp.borderRadius, canOverride: canOverride.generic.components([ canOverride.generic.unit, canOverride.generic.unit, canOverride.generic.unit, canOverride.generic.unit ]), components: [ 'border-top-left-radius', 'border-top-right-radius', 'border-bottom-right-radius', 'border-bottom-left-radius' ], defaultValue: '0', propertyOptimizer: propertyOptimizers.borderRadius, restore: restore.borderRadius, shorthand: true, valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.unit, valueOptimizers.zero ], vendorPrefixes: [ '-moz-', '-o-' ] }, 'border-right': { breakUp: breakUp.border, canOverride: canOverride.generic.components([ canOverride.generic.unit, canOverride.property.borderStyle, canOverride.generic.color ]), components: [ 'border-right-width', 'border-right-style', 'border-right-color' ], defaultValue: 'none', restore: restore.withoutDefaults, shorthand: true, valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.color ] }, 'border-right-color': { canOverride: canOverride.generic.color, componentOf: [ 'border-color', 'border-right' ], defaultValue: 'none', valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.color ] }, 'border-right-style': { canOverride: canOverride.property.borderStyle, componentOf: [ 'border-right', 'border-style' ], defaultValue: 'none' }, 'border-right-width': { canOverride: canOverride.generic.unit, componentOf: [ 'border-right', 'border-width' ], defaultValue: 'medium', oppositeTo: 'border-left-width', shortestValue: '0', valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.unit, valueOptimizers.zero ] }, 'border-style': { breakUp: breakUp.fourValues, canOverride: canOverride.generic.components([ canOverride.property.borderStyle, canOverride.property.borderStyle, canOverride.property.borderStyle, canOverride.property.borderStyle ]), componentOf: [ 'border' ], components: [ 'border-top-style', 'border-right-style', 'border-bottom-style', 'border-left-style' ], defaultValue: 'none', restore: restore.fourValues, shorthand: true, singleTypeComponents: true }, 'border-top': { breakUp: breakUp.border, canOverride: canOverride.generic.components([ canOverride.generic.unit, canOverride.property.borderStyle, canOverride.generic.color ]), components: [ 'border-top-width', 'border-top-style', 'border-top-color' ], defaultValue: 'none', restore: restore.withoutDefaults, shorthand: true, valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.zero, valueOptimizers.color, valueOptimizers.unit ] }, 'border-top-color': { canOverride: canOverride.generic.color, componentOf: [ 'border-color', 'border-top' ], defaultValue: 'none', valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.color ] }, 'border-top-left-radius': { canOverride: canOverride.generic.unit, componentOf: [ 'border-radius' ], defaultValue: '0', propertyOptimizer: propertyOptimizers.borderRadius, valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.unit, valueOptimizers.zero ], vendorPrefixes: [ '-moz-', '-o-' ] }, 'border-top-right-radius': { canOverride: canOverride.generic.unit, componentOf: [ 'border-radius' ], defaultValue: '0', propertyOptimizer: propertyOptimizers.borderRadius, valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.unit, valueOptimizers.zero ], vendorPrefixes: [ '-moz-', '-o-' ] }, 'border-top-style': { canOverride: canOverride.property.borderStyle, componentOf: [ 'border-style', 'border-top' ], defaultValue: 'none' }, 'border-top-width': { canOverride: canOverride.generic.unit, componentOf: [ 'border-top', 'border-width' ], defaultValue: 'medium', oppositeTo: 'border-bottom-width', shortestValue: '0', valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.unit, valueOptimizers.zero ] }, 'border-width': { breakUp: breakUp.fourValues, canOverride: canOverride.generic.components([ canOverride.generic.unit, canOverride.generic.unit, canOverride.generic.unit, canOverride.generic.unit ]), componentOf: [ 'border' ], components: [ 'border-top-width', 'border-right-width', 'border-bottom-width', 'border-left-width' ], defaultValue: 'medium', restore: restore.fourValues, shortestValue: '0', shorthand: true, singleTypeComponents: true, valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.unit, valueOptimizers.zero ] }, 'box-shadow': { propertyOptimizer: propertyOptimizers.boxShadow, valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.unit, valueOptimizers.zero, valueOptimizers.color ], vendorPrefixes: [ '-moz-', '-ms-', '-o-', '-webkit-' ] }, 'clear': { canOverride: canOverride.property.clear, defaultValue: 'none' }, 'clip': { valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.unit, valueOptimizers.zero ] }, 'color': { canOverride: canOverride.generic.color, defaultValue: 'transparent', shortestValue: 'red', valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.color ] }, 'column-gap': { valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.unit, valueOptimizers.zero ] }, 'cursor': { canOverride: canOverride.property.cursor, defaultValue: 'auto' }, 'display': { canOverride: canOverride.property.display, }, 'filter': { propertyOptimizer: propertyOptimizers.filter, valueOptimizers: [ valueOptimizers.fraction ] }, 'float': { canOverride: canOverride.property.float, defaultValue: 'none' }, 'font': { breakUp: breakUp.font, canOverride: canOverride.generic.components([ canOverride.property.fontStyle, canOverride.property.fontVariant, canOverride.property.fontWeight, canOverride.property.fontStretch, canOverride.generic.unit, canOverride.generic.unit, canOverride.property.fontFamily ]), components: [ 'font-style', 'font-variant', 'font-weight', 'font-stretch', 'font-size', 'line-height', 'font-family' ], restore: restore.font, shorthand: true, valueOptimizers: [ valueOptimizers.textQuotes ] }, 'font-family': { canOverride: canOverride.property.fontFamily, defaultValue: 'user|agent|specific', valueOptimizers: [ valueOptimizers.textQuotes ] }, 'font-size': { canOverride: canOverride.generic.unit, defaultValue: 'medium', shortestValue: '0', valueOptimizers: [ valueOptimizers.fraction ] }, 'font-stretch': { canOverride: canOverride.property.fontStretch, defaultValue: 'normal' }, 'font-style': { canOverride: canOverride.property.fontStyle, defaultValue: 'normal' }, 'font-variant': { canOverride: canOverride.property.fontVariant, defaultValue: 'normal' }, 'font-weight': { canOverride: canOverride.property.fontWeight, defaultValue: 'normal', propertyOptimizer: propertyOptimizers.fontWeight, shortestValue: '400' }, 'gap': { valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.unit, valueOptimizers.zero ] }, 'height': { canOverride: canOverride.generic.unit, defaultValue: 'auto', shortestValue: '0', valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.unit, valueOptimizers.zero ] }, 'left': { canOverride: canOverride.property.left, defaultValue: 'auto', valueOptimizers: [ valueOptimizers.whiteSpace, valueOptimizers.fraction, valueOptimizers.precision, valueOptimizers.unit, valueOptimizers.zero ] }, 'letter-spacing': { valueOptimizers: [ valueOptimizers.fraction, valueOptimizers.zero ] }, 'line-height': { canOverride: canOverride.generic.unitOrNumber, defaultValue: 'normal', shortestValue: '0', valueOptimizers: [ valueOptimizers.fraction, valueOptimizers.zero ] }, 'list-style': { canOverride: canOverride.generic.components([ canOverride.property.listStyleType, canOverride.property.listStylePosition, canOverride.property.listStyleImage ]), components: [ 'list-style-type', 'list-style-position', 'list-style-image' ], breakUp: breakUp.listStyle, restore: restore.withoutDefaults, defaultValue: 'outside', // can't use 'disc' because that'd override default 'decimal' for
    shortestValue: 'none', shorthand: true }, 'list-style-image' : { canOverride: canOverride.generic.image, componentOf: [ 'list-style' ], defaultValue: 'none' }, 'list-style-position' : { canOverride: canOverride.property.listStylePosition, componentOf: [ 'list-style' ], defaultValue: 'outside', shortestValue: 'inside' }, 'list-style-type' : { canOverride: canOverride.property.listStyleType, componentOf: [ 'list-style' ], // NOTE: we can't tell the real default value here, it's 'disc' for