Skip to content
This repository was archived by the owner on Sep 29, 2024. It is now read-only.

Commit 80d76f8

Browse files
committedMar 29, 2018
0.0.0
0 parents  commit 80d76f8

18 files changed

+659
-0
lines changed
 

Diff for: ‎.appveyor.yml

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# https://www.appveyor.com/docs/appveyor-yml
2+
3+
environment:
4+
matrix:
5+
- nodejs_version: 4
6+
7+
version: "{build}"
8+
build: off
9+
deploy: off
10+
11+
install:
12+
- ps: Install-Product node $env:nodejs_version
13+
- npm install --ignore-scripts
14+
15+
test_script:
16+
- node --version
17+
- npm --version
18+
- cmd: "npm test"

Diff for: ‎.editorconfig

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
root = true
2+
3+
[*]
4+
charset = utf-8
5+
end_of_line = lf
6+
indent_style = tab
7+
insert_final_newline = true
8+
trim_trailing_whitespace = true
9+
10+
[*.md]
11+
trim_trailing_whitespace = false
12+
13+
[*.{json,md,yml}]
14+
indent_size = 2
15+
indent_style = space

Diff for: ‎.gitignore

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
node_modules
2+
index.*.js
3+
package-lock.json
4+
*.log*
5+
*.result.css
6+
.*
7+
!.appveyor.yml
8+
!.editorconfig
9+
!.gitignore
10+
!.rollup.js
11+
!.tape.js
12+
!.travis.yml

Diff for: ‎.rollup.js

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import babel from 'rollup-plugin-babel';
2+
3+
export default {
4+
input: 'index.js',
5+
output: [
6+
{ file: 'index.umd.js', format: 'umd', name: 'cssTypedOm' },
7+
{ file: 'index.es.js', format: 'es' }
8+
],
9+
plugins: [
10+
babel({
11+
plugins: [
12+
'array-includes'
13+
],
14+
presets: [
15+
['env', { modules: false, targets: { node: 4 } }]
16+
]
17+
})
18+
]
19+
};

Diff for: ‎.travis.yml

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# https://docs.travis-ci.com/user/travis-lint
2+
3+
language: node_js
4+
5+
node_js:
6+
- 4
7+
8+
install:
9+
- npm install --ignore-scripts

Diff for: ‎CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# Changes to CSS Typed Object Model
2+
3+
### 1.0.0 (March 28, 2018)
4+
5+
- Initial version

Diff for: ‎CONTRIBUTING.md

+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# Contributing to CSS Typed Object Model
2+
3+
You want to help? You rock! Now, take a moment to be sure your contributions
4+
make sense to everyone else.
5+
6+
## Reporting Issues
7+
8+
Found a problem? Want a new feature?
9+
10+
- See if your issue or idea has [already been reported].
11+
- Provide a [reduced test case] or a [live example].
12+
13+
Remember, a bug is a _demonstrable problem_ caused by _our_ code.
14+
15+
## Submitting Pull Requests
16+
17+
Pull requests are the greatest contributions, so be sure they are focused in
18+
scope and avoid unrelated commits.
19+
20+
1. To begin; [fork this project], clone your fork, and add our upstream.
21+
```bash
22+
# Clone your fork of the repo into the current directory
23+
git clone git@github.com:YOUR_USER/css-typed-om.git
24+
25+
# Navigate to the newly cloned directory
26+
cd css-typed-om
27+
28+
# Assign the original repo to a remote called "upstream"
29+
git remote add upstream git@github.com:jonathantneal/css-typed-om.git
30+
31+
# Install the tools necessary for testing
32+
npm install
33+
```
34+
35+
2. Create a branch for your feature or fix:
36+
```bash
37+
# Move into a new branch for your feature
38+
git checkout -b feature/thing
39+
```
40+
```bash
41+
# Move into a new branch for your fix
42+
git checkout -b fix/something
43+
```
44+
45+
3. If your code follows our practices, then push your feature branch:
46+
```bash
47+
# Test current code
48+
npm test
49+
```
50+
```bash
51+
# Push the branch for your new feature
52+
git push origin feature/thing
53+
```
54+
```bash
55+
# Or, push the branch for your update
56+
git push origin update/something
57+
```
58+
59+
That’s it! Now [open a pull request] with a clear title and description.
60+
61+
[already been reported]: issues
62+
[fork this project]: fork
63+
[live example]: https://codepen.io/pen
64+
[open a pull request]: https://help.github.com/articles/using-pull-requests/
65+
[reduced test case]: https://css-tricks.com/reduced-test-cases/

Diff for: ‎LICENSE.md

+108
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
# CC0 1.0 Universal
2+
3+
## Statement of Purpose
4+
5+
The laws of most jurisdictions throughout the world automatically confer
6+
exclusive Copyright and Related Rights (defined below) upon the creator and
7+
subsequent owner(s) (each and all, an “owner”) of an original work of
8+
authorship and/or a database (each, a “Work”).
9+
10+
Certain owners wish to permanently relinquish those rights to a Work for the
11+
purpose of contributing to a commons of creative, cultural and scientific works
12+
(“Commons”) that the public can reliably and without fear of later claims of
13+
infringement build upon, modify, incorporate in other works, reuse and
14+
redistribute as freely as possible in any form whatsoever and for any purposes,
15+
including without limitation commercial purposes. These owners may contribute
16+
to the Commons to promote the ideal of a free culture and the further
17+
production of creative, cultural and scientific works, or to gain reputation or
18+
greater distribution for their Work in part through the use and efforts of
19+
others.
20+
21+
For these and/or other purposes and motivations, and without any expectation of
22+
additional consideration or compensation, the person associating CC0 with a
23+
Work (the “Affirmer”), to the extent that he or she is an owner of Copyright
24+
and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and
25+
publicly distribute the Work under its terms, with knowledge of his or her
26+
Copyright and Related Rights in the Work and the meaning and intended legal
27+
effect of CC0 on those rights.
28+
29+
1. Copyright and Related Rights. A Work made available under CC0 may be
30+
protected by copyright and related or neighboring rights (“Copyright and
31+
Related Rights”). Copyright and Related Rights include, but are not limited
32+
to, the following:
33+
1. the right to reproduce, adapt, distribute, perform, display, communicate,
34+
and translate a Work;
35+
2. moral rights retained by the original author(s) and/or performer(s);
36+
3. publicity and privacy rights pertaining to a person’s image or likeness
37+
depicted in a Work;
38+
4. rights protecting against unfair competition in regards to a Work,
39+
subject to the limitations in paragraph 4(i), below;
40+
5. rights protecting the extraction, dissemination, use and reuse of data in
41+
a Work;
42+
6. database rights (such as those arising under Directive 96/9/EC of the
43+
European Parliament and of the Council of 11 March 1996 on the legal
44+
protection of databases, and under any national implementation thereof,
45+
including any amended or successor version of such directive); and
46+
7. other similar, equivalent or corresponding rights throughout the world
47+
based on applicable law or treaty, and any national implementations
48+
thereof.
49+
50+
2. Waiver. To the greatest extent permitted by, but not in contravention of,
51+
applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
52+
unconditionally waives, abandons, and surrenders all of Affirmer’s Copyright
53+
and Related Rights and associated claims and causes of action, whether now
54+
known or unknown (including existing as well as future claims and causes of
55+
action), in the Work (i) in all territories worldwide, (ii) for the maximum
56+
duration provided by applicable law or treaty (including future time
57+
extensions), (iii) in any current or future medium and for any number of
58+
copies, and (iv) for any purpose whatsoever, including without limitation
59+
commercial, advertising or promotional purposes (the “Waiver”). Affirmer
60+
makes the Waiver for the benefit of each member of the public at large and
61+
to the detriment of Affirmer’s heirs and successors, fully intending that
62+
such Waiver shall not be subject to revocation, rescission, cancellation,
63+
termination, or any other legal or equitable action to disrupt the quiet
64+
enjoyment of the Work by the public as contemplated by Affirmer’s express
65+
Statement of Purpose.
66+
67+
3. Public License Fallback. Should any part of the Waiver for any reason be
68+
judged legally invalid or ineffective under applicable law, then the Waiver
69+
shall be preserved to the maximum extent permitted taking into account
70+
Affirmer’s express Statement of Purpose. In addition, to the extent the
71+
Waiver is so judged Affirmer hereby grants to each affected person a
72+
royalty-free, non transferable, non sublicensable, non exclusive,
73+
irrevocable and unconditional license to exercise Affirmer’s Copyright and
74+
Related Rights in the Work (i) in all territories worldwide, (ii) for the
75+
maximum duration provided by applicable law or treaty (including future time
76+
extensions), (iii) in any current or future medium and for any number of
77+
copies, and (iv) for any purpose whatsoever, including without limitation
78+
commercial, advertising or promotional purposes (the “License”). The License
79+
shall be deemed effective as of the date CC0 was applied by Affirmer to the
80+
Work. Should any part of the License for any reason be judged legally
81+
invalid or ineffective under applicable law, such partial invalidity or
82+
ineffectiveness shall not invalidate the remainder of the License, and in
83+
such case Affirmer hereby affirms that he or she will not (i) exercise any
84+
of his or her remaining Copyright and Related Rights in the Work or (ii)
85+
assert any associated claims and causes of action with respect to the Work,
86+
in either case contrary to Affirmer’s express Statement of Purpose.
87+
88+
4. Limitations and Disclaimers.
89+
1. No trademark or patent rights held by Affirmer are waived, abandoned,
90+
surrendered, licensed or otherwise affected by this document.
91+
2. Affirmer offers the Work as-is and makes no representations or warranties
92+
of any kind concerning the Work, express, implied, statutory or
93+
otherwise, including without limitation warranties of title,
94+
merchantability, fitness for a particular purpose, non infringement, or
95+
the absence of latent or other defects, accuracy, or the present or
96+
absence of errors, whether or not discoverable, all to the greatest
97+
extent permissible under applicable law.
98+
3. Affirmer disclaims responsibility for clearing rights of other persons
99+
that may apply to the Work or any use thereof, including without
100+
limitation any person’s Copyright and Related Rights in the Work.
101+
Further, Affirmer disclaims responsibility for obtaining any necessary
102+
consents, permissions or other rights required for any use of the Work.
103+
4. Affirmer understands and acknowledges that Creative Commons is not a
104+
party to this document and has no duty or obligation with respect to this
105+
CC0 or use of the Work.
106+
107+
For more information, please see
108+
http://creativecommons.org/publicdomain/zero/1.0/.

Diff for: ‎README.md

+109
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
# CSS Typed Object Model [<img src="http://jonathantneal.github.io/js-logo.svg" alt="js logo" width="90" height="90" align="right">][CSS Typed Object Model]
2+
3+
[![NPM Version][npm-img]][npm-url]
4+
[![Build Status][cli-img]][cli-url]
5+
6+
[CSS Typed Object Model] is a work-in-progress polyfill for using
7+
[CSS Typed OM Level 1] in the browser.
8+
9+
**Pull Requests are welcome. Please don’t use this in production until there is
10+
a v1.0.0.**
11+
12+
```bash
13+
npm install css-typed-om
14+
```
15+
16+
Polyfill the `window` object:
17+
18+
```js
19+
import { polyfill } from 'css-typed-om';
20+
21+
polyfill(window);
22+
```
23+
24+
Use [CSS Typed Object Model] features:
25+
26+
```js
27+
// Element styles
28+
document.body.attributeStyleMap.set('padding-top', CSS.px(42));
29+
document.body.attributeStyleMap.get('padding-top') // CSSUnitValue { value: 42, unit: 'px' }
30+
31+
document.body.attributeStyleMap.set('opacity', 0.3);
32+
typeof document.body.attributeStyleMap.get('opacity').value // number
33+
document.body.attributeStyleMap.get('opacity').unit // "number"
34+
35+
// Stylesheet rules
36+
document.styleSheets[0].cssRules[0].styleMap.set('padding-top', '100px');
37+
document.styleSheets[0].cssRules[0].styleMap.get('padding-top'); // CSSUnitValue { value: 100, unit: 'px' }
38+
```
39+
40+
## Features
41+
42+
### polyfill
43+
44+
The `polyfill` function adds the following functions to `window` if they do not
45+
already exist:
46+
47+
- `CSS`
48+
- `CSSStyleValue`
49+
- `CSSKeywordValue`
50+
- `CSSUnitValue`
51+
- `StylePropertyMap`
52+
53+
It also adds the following functions to `window.CSS` if they do not already
54+
exist:
55+
56+
- `number`
57+
- `percent`
58+
- `em`
59+
- `ex`
60+
- `ch`
61+
- `rem`
62+
- `vw`
63+
- `vh`
64+
- `vmin`
65+
- `vmax`
66+
- `cm`
67+
- `mm`
68+
- `in`
69+
- `pt`
70+
- `pc`
71+
- `px`
72+
- `Q`
73+
- `deg`
74+
- `grad`
75+
- `rad`
76+
- `turn`
77+
- `s`
78+
- `ms`
79+
- `Hz`
80+
- `kHz`
81+
- `dpi`
82+
- `dpcm`
83+
- `dppx`
84+
- `fr`
85+
86+
### StylePropertyMap
87+
88+
A constructor for `StylePropertyMap`, used to polyfill
89+
90+
### CSSKeywordValue
91+
92+
A constructor for `CSSKeywordValue`, used by `StylePropertyMap`.
93+
94+
### CSSUnitValue
95+
96+
A constructor for `CSSUnitValue`, used by `StylePropertyMap`.
97+
98+
### CSSStyleValue
99+
100+
A constructor for `CSSStyleValue`, the super constructor of `CSSKeywordValue`
101+
and `CSSUnitValue`.
102+
103+
[npm-url]: https://www.npmjs.com/package/css-typed-om
104+
[npm-img]: https://img.shields.io/npm/v/css-typed-om.svg
105+
[cli-url]: https://travis-ci.org/jonathantneal/css-typed-om
106+
[cli-img]: https://img.shields.io/travis/jonathantneal/css-typed-om.svg
107+
108+
[CSS Typed Object Model]: https://github.com/jonathantneal/css-typed-om
109+
[CSS Typed OM Level 1]: https://drafts.css-houdini.org/css-typed-om-1/

Diff for: ‎index.js

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import polyfill from './lib/polyfill';
2+
import CSSKeywordValue from './lib/CSSKeywordValue';
3+
import CSSStyleValue from './lib/CSSStyleValue';
4+
import CSSUnitValue from './lib/CSSUnitValue';
5+
import StylePropertyMap from './lib/StylePropertyMap';
6+
7+
export {
8+
polyfill,
9+
CSSKeywordValue,
10+
CSSStyleValue,
11+
CSSUnitValue,
12+
StylePropertyMap
13+
};

Diff for: ‎lib/CSSKeywordValue.js

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import CSSStyleValue from './CSSStyleValue';
2+
3+
export default class CSSKeywordValue extends CSSStyleValue {
4+
get value() {
5+
return this._value;
6+
}
7+
8+
set value(value) {
9+
this._value = String(value)
10+
}
11+
12+
toString() {
13+
return `${this._value}`;
14+
}
15+
16+
constructor(...args) {
17+
super()
18+
19+
if (args.length < 1) {
20+
throw new TypeError(`Failed to construct 'CSSKeywordValue': 1 arguments required, but only ${args.length} present.`);
21+
}
22+
23+
this._value = String(args[0]);
24+
}
25+
}

Diff for: ‎lib/CSSStyleValue.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default class CSSStyleValue {}

Diff for: ‎lib/CSSUnitValue.js

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import CSSStyleValue from './CSSStyleValue';
2+
import units from './units';
3+
4+
export default class CSSUnitValue extends CSSStyleValue {
5+
get value() {
6+
return this._value;
7+
}
8+
9+
set value(value) {
10+
this._value = getFiniteNumber(value)
11+
}
12+
13+
get unit() {
14+
return this._unit;
15+
}
16+
17+
toString() {
18+
return this._unit === 'number' ? `${this._value}` : `${this._value}${units[this._unit]}`;
19+
}
20+
21+
constructor(...args) {
22+
super()
23+
24+
if (args.length < 2) {
25+
throw new TypeError(`Failed to construct 'CSSUnitValue': 2 arguments required, but only ${args.length} present.`);
26+
}
27+
28+
this._value = getFiniteNumber(args[0]);
29+
this._unit = getUnit(args[1]);
30+
}
31+
}
32+
33+
function getFiniteNumber(value) {
34+
if (isNaN(value) || Math.abs(value) === Infinity) {
35+
throw new TypeError(`Failed to set the 'value' property on 'CSSUnitValue': The provided double value is non-finite.`);
36+
}
37+
38+
return Number(value);
39+
}
40+
41+
function getUnit(unit) {
42+
if (!Object.keys(units).includes(unit)) {
43+
throw new TypeError(`Failed to construct 'CSSUnitValue': Invalid unit: ${unit}`);
44+
}
45+
46+
return unit
47+
}

Diff for: ‎lib/StylePropertyMap.js

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import parseAsValue from './parse-as-value';
2+
3+
export default class StylePropertyMap {
4+
get(...args) {
5+
if (args.length < 1) {
6+
throw new TypeError(`Failed to execute 'get' on 'StylePropertyMapReadOnly': 1 argument required, but only ${args.length} present.`);
7+
}
8+
9+
const [ property ] = args;
10+
const value = this.style[property];
11+
12+
if (value) {
13+
return parseAsValue(value);
14+
}
15+
16+
return null;
17+
}
18+
19+
set(...args) {
20+
if (args.length < 2) {
21+
throw new TypeError(`Failed to execute 'set' on 'StylePropertyMap': 2 arguments required, but only ${args.length} present.`);
22+
}
23+
24+
const [ property, value ] = args;
25+
26+
this.style[property] = String(value);
27+
}
28+
29+
constructor() {
30+
throw new TypeError('Illegal constructor');
31+
}
32+
}

Diff for: ‎lib/parse-as-value.js

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import units from './units';
2+
import CSSUnitValue from './CSSUnitValue';
3+
import CSSKeywordValue from './CSSKeywordValue';
4+
5+
export default string => {
6+
const unitParsingMatch = String(string).match(unitParsingMatcher);
7+
8+
if (unitParsingMatch) {
9+
const [, value, unit] = unitParsingMatch;
10+
11+
return new CSSUnitValue(value, unitKeys[unitValues.indexOf(unit)]);
12+
}
13+
14+
return new CSSKeywordValue(string);
15+
}
16+
17+
const unitKeys = Object.keys(units);
18+
const unitValues = Object.values(units);
19+
const unitParsingMatcher = new RegExp(`^([-+]?[0-9]*\.?[0-9]+)(${unitValues.join('|')})?$`);

Diff for: ‎lib/polyfill.js

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { CSSKeywordValue, CSSUnitValue, CSSStyleValue, StylePropertyMap } from 'css-typed-om';
2+
import units from './units';
3+
4+
export default function polyfill(window) {
5+
if (!window.CSS) window.CSS = class CSS {}
6+
7+
Object.keys(units).forEach(
8+
unit => {
9+
if (!window.CSS[unit]) {
10+
window.CSS[unit] = value => new CSSUnitValue(value, unit);
11+
}
12+
}
13+
);
14+
15+
if (!CSSRule.prototype.styleMap) defineProperty(
16+
CSSRule.prototype,
17+
'styleMap',
18+
context => context.style
19+
);
20+
21+
if (!CSSRule.prototype.attributeStyleMap) defineProperty(
22+
Element.prototype,
23+
'attributeStyleMap',
24+
context => context.style
25+
);
26+
27+
if (!Element.prototype.computedStyleMap) defineProperty(
28+
Element.prototype,
29+
'computedStyleMap',
30+
context => getComputedStyle(context)
31+
);
32+
33+
if (!window.CSSKeywordValue) window.CSSKeywordValue = CSSKeywordValue;
34+
if (!window.CSSUnitValue) window.CSSUnitValue = CSSUnitValue;
35+
if (!window.CSSStyleValue) window.CSSStyleValue = CSSStyleValue;
36+
if (!window.StylePropertyMap) window.StylePropertyMap = StylePropertyMap;
37+
38+
function defineProperty(prototype, property, getStyle) {
39+
Object.defineProperty(prototype, property, {
40+
configurable: true,
41+
enumerable: true,
42+
get() {
43+
const computedStyleMap = Object.create(StylePropertyMap.prototype);
44+
45+
computedStyleMap.style = getStyle(this);
46+
47+
return computedStyleMap;
48+
}
49+
});
50+
}
51+
}

Diff for: ‎lib/units.js

+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
export default {
2+
number: '',
3+
percent: '%',
4+
em: 'em',
5+
ex: 'ex',
6+
ch: 'ch',
7+
rem: 'rem',
8+
vw: 'vw',
9+
vh: 'vh',
10+
vmin: 'vmin',
11+
vmax: 'vmax',
12+
cm: 'cm',
13+
mm: 'mm',
14+
in: 'in',
15+
pt: 'pt',
16+
pc: 'pc',
17+
px: 'px',
18+
Q: 'Q',
19+
deg: 'deg',
20+
grad: 'grad',
21+
rad: 'rad',
22+
turn: 'turn',
23+
s: 's',
24+
ms: 'ms',
25+
Hz: 'Hz',
26+
kHz: 'kHz',
27+
dpi: 'dpi',
28+
dpcm: 'dpcm',
29+
dppx: 'dppx',
30+
fr: 'fr'
31+
};

Diff for: ‎package.json

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
{
2+
"name": "css-typed-om",
3+
"version": "0.0.0",
4+
"description": "Use CSS Typed Object Model in the browser",
5+
"author": "Jonathan Neal <jonathantneal@hotmail.com>",
6+
"license": "CC0-1.0",
7+
"repository": "jonathantneal/css-typed-om",
8+
"homepage": "https://github.com/jonathantneal/css-typed-om#readme",
9+
"bugs": "https://github.com/jonathantneal/css-typed-om/issues",
10+
"main": "index.umd.js",
11+
"module": "index.es.js",
12+
"files": [
13+
"index.umd.js",
14+
"index.es.js"
15+
],
16+
"scripts": {
17+
"prepublishOnly": "npm test",
18+
"pretest": "rollup -c .rollup.js --silent",
19+
"test": "echo 'Running tests...'; npm run test:js",
20+
"test:ec": "echint --ignore index.*.js test",
21+
"test:js": "eslint *.js lib/*.js --cache --ignore-path .gitignore --quiet"
22+
},
23+
"engines": {
24+
"node": ">=4.0.0"
25+
},
26+
"devDependencies": {
27+
"babel-core": "^6.26.0",
28+
"babel-eslint": "^8.2.2",
29+
"babel-plugin-array-includes": "^2.0.3",
30+
"babel-preset-env": "^1.6.1",
31+
"eslint": "^4.19.1",
32+
"eslint-config-dev": "^2.0.0",
33+
"pre-commit": "^1.2.2",
34+
"rollup": "^0.57.1",
35+
"rollup-plugin-babel": "^3.0.3"
36+
},
37+
"eslintConfig": {
38+
"extends": "dev",
39+
"parser": "babel-eslint"
40+
},
41+
"keywords": [
42+
"css",
43+
"number",
44+
"percent",
45+
"em",
46+
"ex",
47+
"ch",
48+
"rem",
49+
"vw",
50+
"vh",
51+
"vmin",
52+
"vmax",
53+
"cm",
54+
"mm",
55+
"in",
56+
"pt",
57+
"pc",
58+
"px",
59+
"Q",
60+
"deg",
61+
"grad",
62+
"rad",
63+
"turn",
64+
"s",
65+
"ms",
66+
"Hz",
67+
"kHz",
68+
"dpi",
69+
"dpcm",
70+
"dppx",
71+
"fr",
72+
"StylePropertyMap",
73+
"CSSUnitValue",
74+
"CSSStyleValue",
75+
"CSSKeywordValue",
76+
"styleMap",
77+
"attributeStyleMap",
78+
"computedStyleMap"
79+
]
80+
}

0 commit comments

Comments
 (0)
This repository has been archived.