Spaces:
Sleeping
Sleeping
| // 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 <ol> | |
| 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 <ul> and 'decimal' for <ol> | |
| // this is a hack, but it doesn't matter because this value will be either overridden or | |
| // it will disappear at the final step anyway | |
| defaultValue: 'decimal|disc', | |
| shortestValue: 'none' | |
| }, | |
| margin: { | |
| breakUp: breakUp.fourValues, | |
| canOverride: canOverride.generic.components([ | |
| canOverride.generic.unit, | |
| canOverride.generic.unit, | |
| canOverride.generic.unit, | |
| canOverride.generic.unit | |
| ]), | |
| components: [ | |
| 'margin-top', | |
| 'margin-right', | |
| 'margin-bottom', | |
| 'margin-left' | |
| ], | |
| defaultValue: '0', | |
| propertyOptimizer: propertyOptimizers.margin, | |
| restore: restore.fourValues, | |
| shorthand: true, | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| 'margin-bottom': { | |
| canOverride: canOverride.generic.unit, | |
| componentOf: [ | |
| 'margin' | |
| ], | |
| defaultValue: '0', | |
| oppositeTo: 'margin-top', | |
| propertyOptimizer: propertyOptimizers.margin, | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| 'margin-inline-end': { | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| 'margin-inline-start': { | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| 'margin-left': { | |
| canOverride: canOverride.generic.unit, | |
| componentOf: [ | |
| 'margin' | |
| ], | |
| defaultValue: '0', | |
| oppositeTo: 'margin-right', | |
| propertyOptimizer: propertyOptimizers.margin, | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| 'margin-right': { | |
| canOverride: canOverride.generic.unit, | |
| componentOf: [ | |
| 'margin' | |
| ], | |
| defaultValue: '0', | |
| oppositeTo: 'margin-left', | |
| propertyOptimizer: propertyOptimizers.margin, | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| 'margin-top': { | |
| canOverride: canOverride.generic.unit, | |
| componentOf: [ | |
| 'margin' | |
| ], | |
| defaultValue: '0', | |
| oppositeTo: 'margin-bottom', | |
| propertyOptimizer: propertyOptimizers.margin, | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| 'max-height': { | |
| canOverride: canOverride.generic.unit, | |
| defaultValue: 'none', | |
| shortestValue: '0', | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| 'max-width': { | |
| canOverride: canOverride.generic.unit, | |
| defaultValue: 'none', | |
| shortestValue: '0', | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| 'min-height': { | |
| canOverride: canOverride.generic.unit, | |
| defaultValue: '0', | |
| shortestValue: '0', | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| 'min-width': { | |
| canOverride: canOverride.generic.unit, | |
| defaultValue: '0', | |
| shortestValue: '0', | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| opacity: { | |
| valueOptimizers: [ | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision | |
| ] | |
| }, | |
| outline: { | |
| canOverride: canOverride.generic.components([ | |
| canOverride.generic.color, | |
| canOverride.property.outlineStyle, | |
| canOverride.generic.unit | |
| ]), | |
| components: [ | |
| 'outline-color', | |
| 'outline-style', | |
| 'outline-width' | |
| ], | |
| breakUp: breakUp.outline, | |
| restore: restore.withoutDefaults, | |
| defaultValue: '0', | |
| propertyOptimizer: propertyOptimizers.outline, | |
| shorthand: true, | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| 'outline-color': { | |
| canOverride: canOverride.generic.color, | |
| componentOf: [ | |
| 'outline' | |
| ], | |
| defaultValue: 'invert', | |
| shortestValue: 'red', | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.color | |
| ] | |
| }, | |
| 'outline-style': { | |
| canOverride: canOverride.property.outlineStyle, | |
| componentOf: [ | |
| 'outline' | |
| ], | |
| defaultValue: 'none' | |
| }, | |
| 'outline-width': { | |
| canOverride: canOverride.generic.unit, | |
| componentOf: [ | |
| 'outline' | |
| ], | |
| defaultValue: 'medium', | |
| shortestValue: '0', | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| overflow: { | |
| canOverride: canOverride.property.overflow, | |
| defaultValue: 'visible' | |
| }, | |
| 'overflow-x': { | |
| canOverride: canOverride.property.overflow, | |
| defaultValue: 'visible' | |
| }, | |
| 'overflow-y': { | |
| canOverride: canOverride.property.overflow, | |
| defaultValue: 'visible' | |
| }, | |
| padding: { | |
| breakUp: breakUp.fourValues, | |
| canOverride: canOverride.generic.components([ | |
| canOverride.generic.unit, | |
| canOverride.generic.unit, | |
| canOverride.generic.unit, | |
| canOverride.generic.unit | |
| ]), | |
| components: [ | |
| 'padding-top', | |
| 'padding-right', | |
| 'padding-bottom', | |
| 'padding-left' | |
| ], | |
| defaultValue: '0', | |
| propertyOptimizer: propertyOptimizers.padding, | |
| restore: restore.fourValues, | |
| shorthand: true, | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| 'padding-bottom': { | |
| canOverride: canOverride.generic.unit, | |
| componentOf: [ | |
| 'padding' | |
| ], | |
| defaultValue: '0', | |
| oppositeTo: 'padding-top', | |
| propertyOptimizer: propertyOptimizers.padding, | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| 'padding-left': { | |
| canOverride: canOverride.generic.unit, | |
| componentOf: [ | |
| 'padding' | |
| ], | |
| defaultValue: '0', | |
| oppositeTo: 'padding-right', | |
| propertyOptimizer: propertyOptimizers.padding, | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| 'padding-right': { | |
| canOverride: canOverride.generic.unit, | |
| componentOf: [ | |
| 'padding' | |
| ], | |
| defaultValue: '0', | |
| oppositeTo: 'padding-left', | |
| propertyOptimizer: propertyOptimizers.padding, | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| 'padding-top': { | |
| canOverride: canOverride.generic.unit, | |
| componentOf: [ | |
| 'padding' | |
| ], | |
| defaultValue: '0', | |
| oppositeTo: 'padding-bottom', | |
| propertyOptimizer: propertyOptimizers.padding, | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| position: { | |
| canOverride: canOverride.property.position, | |
| defaultValue: 'static' | |
| }, | |
| right: { | |
| canOverride: canOverride.property.right, | |
| defaultValue: 'auto', | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| 'row-gap': { | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| src: { | |
| valueOptimizers: [ | |
| valueOptimizers.urlWhiteSpace, | |
| valueOptimizers.urlPrefix, | |
| valueOptimizers.urlQuotes | |
| ] | |
| }, | |
| 'stroke-width': { | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| 'text-align': { | |
| canOverride: canOverride.property.textAlign, | |
| // NOTE: we can't tell the real default value here, as it depends on default text direction | |
| // this is a hack, but it doesn't matter because this value will be either overridden or | |
| // it will disappear anyway | |
| defaultValue: 'left|right' | |
| }, | |
| 'text-decoration': { | |
| canOverride: canOverride.property.textDecoration, | |
| defaultValue: 'none' | |
| }, | |
| 'text-indent': { | |
| canOverride: canOverride.property.textOverflow, | |
| defaultValue: 'none', | |
| valueOptimizers: [ | |
| valueOptimizers.fraction, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| 'text-overflow': { | |
| canOverride: canOverride.property.textOverflow, | |
| defaultValue: 'none' | |
| }, | |
| 'text-shadow': { | |
| canOverride: canOverride.property.textShadow, | |
| defaultValue: 'none', | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.zero, | |
| valueOptimizers.color | |
| ] | |
| }, | |
| top: { | |
| canOverride: canOverride.property.top, | |
| defaultValue: 'auto', | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| transform: { | |
| canOverride: canOverride.property.transform, | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.degrees, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ], | |
| vendorPrefixes: [ | |
| '-moz-', | |
| '-ms-', | |
| '-o-', | |
| '-webkit-' | |
| ] | |
| }, | |
| transition: { | |
| breakUp: breakUp.multiplex(breakUp.transition), | |
| canOverride: canOverride.generic.components([ | |
| canOverride.property.transitionProperty, | |
| canOverride.generic.time, | |
| canOverride.generic.timingFunction, | |
| canOverride.generic.time | |
| ]), | |
| components: [ | |
| 'transition-property', | |
| 'transition-duration', | |
| 'transition-timing-function', | |
| 'transition-delay' | |
| ], | |
| defaultValue: 'none', | |
| restore: restore.multiplex(restore.withoutDefaults), | |
| shorthand: true, | |
| valueOptimizers: [ | |
| valueOptimizers.time, | |
| valueOptimizers.fraction | |
| ], | |
| vendorPrefixes: [ | |
| '-moz-', | |
| '-ms-', | |
| '-o-', | |
| '-webkit-' | |
| ] | |
| }, | |
| 'transition-delay': { | |
| canOverride: canOverride.generic.time, | |
| componentOf: [ | |
| 'transition' | |
| ], | |
| defaultValue: '0s', | |
| intoMultiplexMode: 'real', | |
| valueOptimizers: [ | |
| valueOptimizers.time | |
| ], | |
| vendorPrefixes: [ | |
| '-moz-', | |
| '-ms-', | |
| '-o-', | |
| '-webkit-' | |
| ] | |
| }, | |
| 'transition-duration': { | |
| canOverride: canOverride.generic.time, | |
| componentOf: [ | |
| 'transition' | |
| ], | |
| defaultValue: '0s', | |
| intoMultiplexMode: 'real', | |
| keepUnlessDefault: 'transition-delay', | |
| valueOptimizers: [ | |
| valueOptimizers.time, | |
| valueOptimizers.fraction | |
| ], | |
| vendorPrefixes: [ | |
| '-moz-', | |
| '-ms-', | |
| '-o-', | |
| '-webkit-' | |
| ] | |
| }, | |
| 'transition-property': { | |
| canOverride: canOverride.generic.propertyName, | |
| componentOf: [ | |
| 'transition' | |
| ], | |
| defaultValue: 'all', | |
| intoMultiplexMode: 'placeholder', | |
| placeholderValue: '_', // it's a short value that won't match any property and still be a valid `transition-property` | |
| vendorPrefixes: [ | |
| '-moz-', | |
| '-ms-', | |
| '-o-', | |
| '-webkit-' | |
| ] | |
| }, | |
| 'transition-timing-function': { | |
| canOverride: canOverride.generic.timingFunction, | |
| componentOf: [ | |
| 'transition' | |
| ], | |
| defaultValue: 'ease', | |
| intoMultiplexMode: 'real', | |
| vendorPrefixes: [ | |
| '-moz-', | |
| '-ms-', | |
| '-o-', | |
| '-webkit-' | |
| ] | |
| }, | |
| 'vertical-align': { | |
| canOverride: canOverride.property.verticalAlign, | |
| defaultValue: 'baseline', | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| visibility: { | |
| canOverride: canOverride.property.visibility, | |
| defaultValue: 'visible' | |
| }, | |
| '-webkit-tap-highlight-color': { | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.color | |
| ] | |
| }, | |
| '-webkit-margin-end': { | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| 'white-space': { | |
| canOverride: canOverride.property.whiteSpace, | |
| defaultValue: 'normal' | |
| }, | |
| width: { | |
| canOverride: canOverride.generic.unit, | |
| defaultValue: 'auto', | |
| shortestValue: '0', | |
| valueOptimizers: [ | |
| valueOptimizers.whiteSpace, | |
| valueOptimizers.fraction, | |
| valueOptimizers.precision, | |
| valueOptimizers.unit, | |
| valueOptimizers.zero | |
| ] | |
| }, | |
| 'z-index': { | |
| canOverride: canOverride.property.zIndex, | |
| defaultValue: 'auto' | |
| } | |
| }; | |
| // generate vendor-prefixed configuration | |
| var vendorPrefixedConfiguration = {}; | |
| function cloneDescriptor(propertyName, prefix) { | |
| var clonedDescriptor = override(configuration[propertyName], {}); | |
| if ('componentOf' in clonedDescriptor) { | |
| clonedDescriptor.componentOf = clonedDescriptor.componentOf.map(function(shorthandName) { | |
| return prefix + shorthandName; | |
| }); | |
| } | |
| if ('components' in clonedDescriptor) { | |
| clonedDescriptor.components = clonedDescriptor.components.map(function(longhandName) { | |
| return prefix + longhandName; | |
| }); | |
| } | |
| if ('keepUnlessDefault' in clonedDescriptor) { | |
| clonedDescriptor.keepUnlessDefault = prefix + clonedDescriptor.keepUnlessDefault; | |
| } | |
| return clonedDescriptor; | |
| } | |
| for (var propertyName in configuration) { | |
| var descriptor = configuration[propertyName]; | |
| if (!('vendorPrefixes' in descriptor)) { | |
| continue; | |
| } | |
| for (var i = 0; i < descriptor.vendorPrefixes.length; i++) { | |
| var prefix = descriptor.vendorPrefixes[i]; | |
| var clonedDescriptor = cloneDescriptor(propertyName, prefix); | |
| delete clonedDescriptor.vendorPrefixes; | |
| vendorPrefixedConfiguration[prefix + propertyName] = clonedDescriptor; | |
| } | |
| delete descriptor.vendorPrefixes; | |
| } | |
| module.exports = override(configuration, vendorPrefixedConfiguration); | |