From efbc2ffe6a1ee5ec38a4396305561d6515d0943e Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Fri, 30 Aug 2024 17:21:18 +0800 Subject: node fixes, updates --- node_modules/clean-css/lib/optimizer/clone.js | 33 + .../clean-css/lib/optimizer/configuration.js | 1640 ++++++++++++++++++++ .../lib/optimizer/configuration/break-up.js | 656 ++++++++ .../lib/optimizer/configuration/can-override.js | 314 ++++ .../configuration/properties/understandable.js | 15 + .../lib/optimizer/configuration/restore.js | 294 ++++ node_modules/clean-css/lib/optimizer/hack.js | 8 + .../lib/optimizer/invalid-property-error.js | 10 + .../clean-css/lib/optimizer/level-0/optimize.js | 6 + .../clean-css/lib/optimizer/level-1/optimize.js | 325 ++++ .../lib/optimizer/level-1/property-optimizers.js | 10 + .../level-1/property-optimizers/background.js | 23 + .../level-1/property-optimizers/border-radius.js | 29 + .../level-1/property-optimizers/box-shadow.js | 15 + .../level-1/property-optimizers/filter.js | 34 + .../level-1/property-optimizers/font-weight.js | 23 + .../level-1/property-optimizers/margin.js | 21 + .../level-1/property-optimizers/outline.js | 19 + .../level-1/property-optimizers/padding.js | 32 + .../lib/optimizer/level-1/sort-selectors.js | 23 + .../lib/optimizer/level-1/tidy-at-rule.js | 9 + .../clean-css/lib/optimizer/level-1/tidy-block.js | 34 + .../clean-css/lib/optimizer/level-1/tidy-rules.js | 265 ++++ .../lib/optimizer/level-1/value-optimizers.js | 14 + .../optimizer/level-1/value-optimizers/color.js | 89 ++ .../level-1/value-optimizers/color/shorten-hex.js | 189 +++ .../level-1/value-optimizers/color/shorten-hsl.js | 54 + .../level-1/value-optimizers/color/shorten-rgb.js | 10 + .../optimizer/level-1/value-optimizers/degrees.js | 19 + .../optimizer/level-1/value-optimizers/fraction.js | 72 + .../level-1/value-optimizers/precision.js | 22 + .../level-1/value-optimizers/starts-as-url.js | 7 + .../level-1/value-optimizers/text-quotes.js | 31 + .../lib/optimizer/level-1/value-optimizers/time.js | 31 + .../lib/optimizer/level-1/value-optimizers/unit.js | 46 + .../level-1/value-optimizers/url-prefix.js | 23 + .../level-1/value-optimizers/url-quotes.js | 22 + .../level-1/value-optimizers/url-whitespace.js | 22 + .../level-1/value-optimizers/whitespace.js | 48 + .../lib/optimizer/level-1/value-optimizers/zero.js | 49 + .../lib/optimizer/level-2/extract-properties.js | 61 + .../lib/optimizer/level-2/is-mergeable.js | 273 ++++ .../lib/optimizer/level-2/merge-adjacent.js | 55 + .../lib/optimizer/level-2/merge-media-queries.js | 105 ++ .../level-2/merge-non-adjacent-by-body.js | 88 ++ .../level-2/merge-non-adjacent-by-selector.js | 73 + .../clean-css/lib/optimizer/level-2/optimize.js | 139 ++ .../level-2/properties/every-values-pair.js | 28 + .../level-2/properties/find-component-in.js | 38 + .../optimizer/level-2/properties/has-inherit.js | 9 + .../level-2/properties/has-same-values.js | 14 + .../lib/optimizer/level-2/properties/has-unset.js | 9 + .../level-2/properties/is-component-of.js | 22 + .../level-2/properties/is-mergeable-shorthand.js | 11 + .../level-2/properties/merge-into-shorthands.js | 496 ++++++ .../lib/optimizer/level-2/properties/optimize.js | 40 + .../level-2/properties/override-properties.js | 461 ++++++ .../overrides-non-component-shorthand.js | 9 + .../level-2/properties/populate-components.js | 61 + .../lib/optimizer/level-2/reduce-non-adjacent.js | 174 +++ .../level-2/remove-duplicate-font-at-rules.js | 30 + .../level-2/remove-duplicate-media-queries.js | 30 + .../lib/optimizer/level-2/remove-duplicates.js | 36 + .../optimizer/level-2/remove-unused-at-rules.js | 249 +++ .../clean-css/lib/optimizer/level-2/reorderable.js | 93 ++ .../optimizer/level-2/restore-with-components.js | 12 + .../clean-css/lib/optimizer/level-2/restructure.js | 392 +++++ .../lib/optimizer/level-2/rules-overlap.js | 32 + .../lib/optimizer/level-2/specificities-overlap.js | 36 + .../clean-css/lib/optimizer/level-2/specificity.js | 77 + .../lib/optimizer/level-2/tidy-rule-duplicates.js | 21 + .../clean-css/lib/optimizer/remove-unused.js | 11 + .../lib/optimizer/restore-from-optimizing.js | 78 + node_modules/clean-css/lib/optimizer/validator.js | 561 +++++++ .../clean-css/lib/optimizer/vendor-prefixes.js | 24 + .../clean-css/lib/optimizer/wrap-for-optimizing.js | 192 +++ 76 files changed, 8626 insertions(+) create mode 100644 node_modules/clean-css/lib/optimizer/clone.js create mode 100644 node_modules/clean-css/lib/optimizer/configuration.js create mode 100644 node_modules/clean-css/lib/optimizer/configuration/break-up.js create mode 100644 node_modules/clean-css/lib/optimizer/configuration/can-override.js create mode 100644 node_modules/clean-css/lib/optimizer/configuration/properties/understandable.js create mode 100644 node_modules/clean-css/lib/optimizer/configuration/restore.js create mode 100644 node_modules/clean-css/lib/optimizer/hack.js create mode 100644 node_modules/clean-css/lib/optimizer/invalid-property-error.js create mode 100644 node_modules/clean-css/lib/optimizer/level-0/optimize.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/optimize.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/property-optimizers.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/property-optimizers/background.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/property-optimizers/border-radius.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/property-optimizers/box-shadow.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/property-optimizers/filter.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/property-optimizers/font-weight.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/property-optimizers/margin.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/property-optimizers/outline.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/property-optimizers/padding.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/sort-selectors.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/tidy-at-rule.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/tidy-block.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/tidy-rules.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/value-optimizers.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/color.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/color/shorten-hex.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/color/shorten-hsl.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/color/shorten-rgb.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/degrees.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/fraction.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/precision.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/starts-as-url.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/text-quotes.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/time.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/unit.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/url-prefix.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/url-quotes.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/url-whitespace.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/whitespace.js create mode 100644 node_modules/clean-css/lib/optimizer/level-1/value-optimizers/zero.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/extract-properties.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/is-mergeable.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/merge-adjacent.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/merge-media-queries.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-body.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/merge-non-adjacent-by-selector.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/optimize.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/every-values-pair.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/find-component-in.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/has-inherit.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/has-same-values.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/has-unset.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/is-component-of.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/is-mergeable-shorthand.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/merge-into-shorthands.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/optimize.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/override-properties.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/overrides-non-component-shorthand.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/properties/populate-components.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/reduce-non-adjacent.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-font-at-rules.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/remove-duplicate-media-queries.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/remove-duplicates.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/remove-unused-at-rules.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/reorderable.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/restore-with-components.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/restructure.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/rules-overlap.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/specificities-overlap.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/specificity.js create mode 100644 node_modules/clean-css/lib/optimizer/level-2/tidy-rule-duplicates.js create mode 100644 node_modules/clean-css/lib/optimizer/remove-unused.js create mode 100644 node_modules/clean-css/lib/optimizer/restore-from-optimizing.js create mode 100644 node_modules/clean-css/lib/optimizer/validator.js create mode 100644 node_modules/clean-css/lib/optimizer/vendor-prefixes.js create mode 100644 node_modules/clean-css/lib/optimizer/wrap-for-optimizing.js (limited to 'node_modules/clean-css/lib/optimizer') diff --git a/node_modules/clean-css/lib/optimizer/clone.js b/node_modules/clean-css/lib/optimizer/clone.js new file mode 100644 index 00000000..e6a006f3 --- /dev/null +++ b/node_modules/clean-css/lib/optimizer/clone.js @@ -0,0 +1,33 @@ +var wrapSingle = require('./wrap-for-optimizing').single; + +var Token = require('../tokenizer/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([ + Token.PROPERTY, + [Token.PROPERTY_NAME, property.name] + ]); + cloned.important = property.important; + cloned.hack = property.hack; + cloned.unused = false; + return cloned; +} + +module.exports = { + deep: deep, + shallow: shallow +}; diff --git a/node_modules/clean-css/lib/optimizer/configuration.js b/node_modules/clean-css/lib/optimizer/configuration.js new file mode 100644 index 00000000..9da654dd --- /dev/null +++ b/node_modules/clean-css/lib/optimizer/configuration.js @@ -0,0 +1,1640 @@ +// Contains the interpretation of CSS properties, as used by the property optimizer + +var breakUp = require('./configuration/break-up'); +var canOverride = require('./configuration/can-override'); +var restore = require('./configuration/restore'); + +var propertyOptimizers = require('./level-1/property-optimizers'); +var valueOptimizers = require('./level-1/value-optimizers'); + +var override = require('../utils/override'); + +// 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 = { + 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