Warning
This is a fork of the original css-typed-om to continue the excellent foundation built there. It's still uncertain if we will merge this fork back into the original at some point or if it will remain a separate fork. Also note, this is heavy work-in-progress, if you use this in production, things are guaranteed to break or not work at all. See Feature Implementation Status below for details.
A polyfill for using CSS Typed OM in unsupported browsers and jsdom.
Warning
TODO: This needs to be upated for this fork. The only way to install with npm right now is via GitHub.
npm install css-typed-omPolyfill the window object:
import polyfill from "css-typed-om";
polyfill(window);This is a work in progress. We don't have 100% of the CSS Typed OM features implemented. This table breaks down the status of features. This is also a rough roadmap to a complete polyfill.
| Feature | Implemented | Notes |
|---|---|---|
| StylePropertyMapReadyOnly | ||
| StylePropertyMapReadyOnly | ✅ Yes | |
| StylePropertyMapReadyOnly.size | ✅ Yes | |
| StylePropertyMapReadyOnly.entries() | ✅ Yes | |
| StylePropertyMapReadyOnly.forEach() | ✅ Yes | |
| StylePropertyMapReadyOnly.get() | ✅ Yes | |
| StylePropertyMapReadyOnly.getAll() | ❌ No | Not 100% sure what it's supposed to do |
| StylePropertyMapReadyOnly.has() | ✅ Yes | |
| StylePropertyMapReadyOnly.keys() | ✅ Yes | |
| StylePropertyMapReadyOnly.values() | ✅ Yes | |
| StylePropertyMap | ||
| StylePropertyMap | ✅ Yes | |
| StylePropertyMap.append() | ❌ No | |
| StylePropertyMap.clear() | ❌ No | |
| StylePropertyMap.delete() | ❌ No | |
| StylePropertyMap.set() | ✅ Yes | |
| StylePropertyMap.size | ✅ Yes | Inherited from StylePropertyMapReadOnly |
| StylePropertyMap.entries() | ✅ Yes | Inherited from StylePropertyMapReadOnly |
| StylePropertyMap.forEach() | ✅ Yes | Inherited from StylePropertyMapReadOnly |
| StylePropertyMap.get() | ✅ Yes | Inherited from StylePropertyMapReadOnly |
| StylePropertyMap.getAll() | ❌ No | Inherited from StylePropertyMapReadOnly |
| StylePropertyMap.has() | ✅ Yes | Inherited from StylePropertyMapReadOnly |
| StylePropertyMap.keys() | ✅ Yes | Inherited from StylePropertyMapReadOnly |
| StylePropertyMap.values() | ✅ Yes | Inherited from StylePropertyMapReadOnly |
| CSSStyleValue | ||
| CSSStyleValue | ✅ Yes | |
| CSSStyleValue.parse() | Bare minimum functionality. 🧪 Needs tests | |
| CSSStyleValue.parseAll() | ❌ No | |
| CSSStyleValue.toString() | ❌ No | Stringifier to value |
| CSSImageValue | ||
| CSSImageValue | ❌ No | |
| CSSImageValue.parse() | ❌ No | Inherits from CSSStyleValue |
| CSSImageValue.parseAll() | ❌ No | Inherits from CSSStyleValue |
| CSSImageValue.toString() | ❌ No | Inherits from CSSStyleValue |
| CSSKeywordValue | ||
| CSSKeywordValue | ✅ Yes | |
| CSSKeywordValue() constructor | ✅ Yes | 🧪 Needs tests |
| CSSKeywordValue.value | ✅ Yes | 🧪 Needs tests |
| CSSKeywordValue.toString() | ✅ Yes | 🧪 Needs tests |
| CSSKeywordValue.parse() | ❌ No | Inherits from CSSStyleValue |
| CSSKeywordValue.parseAll() | ❌ No | Inherits from CSSStyleValue |
| CSSNumericValue | ||
| CSSNumericValue | ✅ Yes | |
| CSSNumericValue.parse() | ❌ No | Inherits from CSSStyleValue |
| CSSNumericValue.parseAll() | ❌ No | Inherits from CSSStyleValue |
| CSSNumericValue.add() | ✅ Yes | 🧪 Needs tests |
| CSSNumericValue.div() | ✅ Yes | 🧪 Needs tests |
| CSSNumericValue.equals() | ❌ No | |
| CSSNumericValue.max() | ✅ Yes | 🧪 Needs tests |
| CSSNumericValue.min() | ✅ Yes | 🧪 Needs tests |
| CSSNumericValue.mul() | ✅ Yes | 🧪 Needs tests |
| CSSNumericValue.sub() | ✅ Yes | 🧪 Needs tests |
| CSSNumericValue.to() | ❌ No | |
| CSSNumericValue.toSum() | ❌ No | |
| CSSNumericValue.type() | ❌ No | |
| CSSTransformValue | ||
| CSSTransformValue | ❌ No | |
| CSSTransformValue() constructor | ❌ No | |
| CSSTransformValue.length | ❌ No | |
| CSSTransformValue.is2D | ❌ No | |
| CSSTransformValue.toMatrix() | ❌ No | |
| CSSTransformValue.entries() | ❌ No | |
| CSSTransformValue.forEach() | ❌ No | |
| CSSTransformValue.keys() | ❌ No | |
| CSSTransformValue.values() | ❌ No | |
| CSSTransformValue.toString() | ❌ No | Inherits from CSSStyleValue |
| CSSTransformValue.parse() | ❌ No | Inherits from CSSStyleValue |
| CSSTransformValue.parseAll() | ❌ No | Inherits from CSSStyleValue |
| CSSUnparsedValue | ||
| CSSUnparsedValue | ✅ Yes | |
| CSSUnparsedValue() constructor | ✅ Yes | |
| CSSUnparsedValue.length | ✅ Yes | |
| CSSUnparsedValue.entries() | ✅ Yes | |
| CSSUnparsedValue.forEach() | ✅ Yes | |
| CSSUnparsedValue.keys() | ✅ Yes | |
| CSSUnparsedValue.values() | ✅ Yes | |
| CSSUnparsedValue.toString() | ❌ No | Inherits from CSSStyleValue |
| CSSUnitValue | Inherits from CSSNumericValue, has same static and instance methods | |
| CSSUnitValue | ✅ Yes | |
| CSSUnitValue() constructor | ✅ Yes | 🧪 Needs tests |
| CSSUnitValue.value | ✅ Yes | 🧪 Needs tests |
| CSSUnitValue.unit | ✅ Yes | 🧪 Needs tests |
| CSSUnitValue.toString() | ✅ Yes | 🧪 Needs tests |
| CSSUnitValue.parse() | ❌ No | Inherits from CSSStyleValue |
| CSSUnitValue.parseAll() | ❌ No | Inherits from CSSStyleValue |
| CSSMathValue | Inherits from CSSNumericValue, has same static and instance methods | |
| CSSMathValue | ❌ No | |
| CSSMathValue.operator | ❌ No | |
| CSSMathInvert | Inherits from CSSMathValue, has same static and instance methods | |
| CSSMathInvert | ✅ Yes | |
| CSSMathInvert() constructor | Needs exception handling. 🧪 Needs tests | |
| CSSMathInvert.value | ✅ Yes | 🧪 Needs tests |
| CSSMathInvert.toString() | ✅ Yes | 🧪 Needs tests |
| CSSMathInvert.parse() | ❌ No | Inherits from CSSStyleValue |
| CSSMathInvert.parseAll() | ❌ No | Inherits from CSSStyleValue |
| CSSMathMax | Inherits from CSSMathValue, has same static and instance methods | |
| CSSMathMax | ✅ Yes | |
| CSSMathMax() constructor | Needs exception handling. 🧪 Needs tests | |
| CSSMathMax.values | ✅ Yes | 🧪 Needs tests |
| CSSMathMax.toString() | ✅ Yes | 🧪 Needs tests |
| CSSMathMax.parse() | ❌ No | Inherits from CSSStyleValue |
| CSSMathMax.parseAll() | ❌ No | Inherits from CSSStyleValue |
| CSSMathMin | Inherits from CSSMathValue, has same static and instance methods | |
| CSSMathMin | ✅ Yes | |
| CSSMathMin() constructor | Needs exception handling. 🧪 Needs tests | |
| CSSMathMin.values | ✅ Yes | 🧪 Needs tests |
| CSSMathMin.toString() | ✅ Yes | 🧪 Needs tests |
| CSSMathMin.parse() | ❌ No | Inherits from CSSStyleValue |
| CSSMathMin.parseAll() | ❌ No | Inherits from CSSStyleValue |
| CSSMathNegate | Inherits from CSSMathValue, has same static and instance methods | |
| TODO: Complete this section | ||
| CSSMathProduct | Inherits from CSSMathValue, has same static and instance methods | |
| TODO: Complete this section | ||
| CSSMathSum | Inherits from CSSMathValue, has same static and instance methods | |
| TODO: Complete this section |
Warning
NOTE: Below here is still being reformated and some things need to be documented in Feature Implementation Status.
// Element styles
document.body.attributeStyleMap.set("padding-top", CSS.px(42));
document.body.attributeStyleMap.get("padding-top"); /* CSSUnitValue {
value: 42,
unit: 'px'
}.toString() => 42px */
document.body.attributeStyleMap.set("opacity", 0.3);
typeof document.body.attributeStyleMap.get("opacity").value; // number
document.body.attributeStyleMap.get("opacity").unit; // "number"
// Stylesheet rules
document.styleSheets[0].cssRules[0].styleMap.set("padding-top", "100px");
document.styleSheets[0].cssRules[0].styleMap.get(
"padding-top",
); /* CSSUnitValue {
value: 100,
unit: 'px'
}.toString() => 100px */
// Math products
CSS.px(15).add(CSS.rem(10), CSS.em(5)); /* CSSMathSum {
operator: "sum",
values: [
CSSUnitValue { value: 15, unit: 'px' },
CSSUnitValue { value: 10, unit: 'rem' },
CSSUnitValu { value: 5, unit: 'em' }
]
}.toString() => calc(15px + 10rem + 5em) */
CSS.px(15).mul(CSS.rem(10), CSS.em(5)); /* CSSMathProduct {
operator: "product",
values: [
CSSUnitValue { value: 15, unit: 'px' },
CSSUnitValue { value: 10, unit: 'rem' },
CSSUnitValu { value: 5, unit: 'em' }
]
}.toString() => calc(15px * 10rem * 5em) */
CSS.px(15).sub(CSS.rem(10), CSS.em(5)); /* CSSMathSum {
operator: "sum",
values: [
CSSUnitValue { value: 15, unit: 'px' },
CSSUnitValue { value: -10, unit: 'rem' },
CSSUnitValu { value: -5, unit: 'em' }
]
}.toString() => calc(15px + -10rem + -5em) */
CSS.px(15).div(CSS.rem(10), CSS.em(5)); /* CSSMathProduct {
operator: "product",
values: [
CSSUnitValue { value: 15, unit: 'px' },
CSSMathInvert {
operator: 'invert',
value: CSSUnitValue { value: 10, unit: 'rem' }
},
CSSMathInvert {
operator: 'invert',
value: CSSUnitValue { value: 5, unit: 'em' }
}
]
}.toString() => calc(15px / 10rem / 5em) */
CSS.px(15).max(CSS.rem(10), CSS.em(5)); /* CSSMathMax {
operator: 'max',
values: [
CSSUnitValue { value: 15, unit: 'px' },
CSSUnitValue { value: 10, unit: 'rem' },
CSSUnitValu { value: 5, unit: 'em' }
],
}.toString() => max(15px, 10rem, 5em) */
CSS.px(15).min(CSS.rem(10), CSS.em(5)); /* CSSMathMin {
operator: 'min',
values: [
CSSUnitValue { value: 15, unit: 'px' },
CSSUnitValue { value: 10, unit: 'rem' },
CSSUnitValu { value: 5, unit: 'em' }
],
}.toString() => min(15px, 10rem, 5em) */The polyfill function adds CSS Typed OM interfaces to window if they do not
already exist:
It then adds the following functions to CSS if they do not already exist:
numberpercentemexchremvwvhvminvmaxcmmminptpcpxQdeggradradturnsmsHzkHzdpidpcmdppxfr
The new CSSUnitValue instances returned by these methods extend
CSSNumericValue, which allow them to use the following methods:
adddivmaxminmulsub
The result of these transforms may be a new CSSUnitValue instance or a new
CSSMathProduct, CSSMathMax, CSSMathMin, or CSSMathSum instance.
They all stringify back into compliant CSS.