Spaces:
Running
Running
// 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); | |