Skip to content

Commit 18cea49

Browse files
committedMar 26, 2019
feat: 🎸 change VRule interface, add vcssom docs
1 parent 6d25e55 commit 18cea49

File tree

6 files changed

+148
-5
lines changed

6 files changed

+148
-5
lines changed
 

‎.storybook/VCSSOM.stories.js

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ sheet.diff({
2626
'@media only screen and (max-width: 600px)': {
2727
'.test_vcssom': {
2828
'text-decoration': 'underline',
29+
color: 'green',
2930
},
3031
}
3132
});

‎README.md

+2
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ __Motto of `nano-css` is simple__: *create the smallest possible CSS-in-JS libra
5858
- [`extract`](./docs/extract.md)
5959
- [`sourcemaps`](./docs/sourcemaps.md)
6060
- [`.units`](./docs/units.md)
61+
- [`cssom`](./docs/cssom.md)
62+
- [`vcssom`](./docs/vcssom.md)
6163
- [Presets](./docs/Presets.md)
6264
- [Server-side rendering](./docs/SSR.md)
6365

‎addon/vcssom.d.ts

+59
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,71 @@
11
import {CSSOMAddon} from './cssom';
22
import {Css} from './vcssom/cssToTree';
33
import {NanoRenderer} from '../types/nano';
4+
import {CSSOMRule} from './cssom';
5+
import {CssProps} from '../types/common';
6+
7+
export interface VRule {
8+
/**
9+
* CSS declarations, like `{color: 'red'}`
10+
*/
11+
decl: CssProps;
12+
rule: CSSOMRule;
13+
14+
/**
15+
* Re-render css rule according to new CSS declarations.
16+
* @param decl CSS declarations, like `{color: 'red'}`
17+
*/
18+
diff(decl: CssProps);
19+
20+
/**
21+
* Removes this `VRule` from CSSOM. After calling this method, you
22+
* cannot call `diff` anymore as this rule will be removed from style sheet.
23+
*/
24+
del();
25+
}
426

527
export interface VSheet {
28+
/**
29+
* Re-renders style sheet according to specified CSS-like object. The `css`
30+
* object is a 3-level tree structure:
31+
*
32+
* ```
33+
* {
34+
* media-query-prelude: {
35+
* selector: {
36+
* declarations
37+
* }
38+
* }
39+
* }
40+
* ```
41+
*
42+
* Example:
43+
*
44+
* ```js
45+
* sheet.diff({
46+
* '': {
47+
* '.my-class': {
48+
* color: 'red',
49+
* },
50+
* '.my-class:hover': {
51+
* color: 'blue',
52+
* },
53+
* },
54+
* '@media only screen and (max-width: 600px)': {
55+
* '.my-class': {
56+
* color: 'green',
57+
* },
58+
* },
59+
* });
60+
* ```
61+
*
62+
* @param css CSS-like object with media queries as top level.
63+
*/
664
diff(css: Css);
765
}
866

967
export interface VCSSOMAddon {
68+
VRule: new (selector: string, mediaQuery?: string) => VRule;
1069
VSheet: new () => VSheet;
1170
}
1271

‎addon/vcssom.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ exports.addon = function (renderer) {
1212

1313
var kebab = renderer.kebab;
1414

15-
function VRule (rule, decl) {
16-
this.rule = rule;
17-
this.decl = decl;
15+
function VRule (selector, prelude) {
16+
this.rule = renderer.createRule(selector, prelude);
17+
this.decl = {};
1818
}
1919
VRule.prototype.diff = function (newDecl) {
2020
var oldDecl = this.decl;
@@ -60,7 +60,7 @@ exports.addon = function (renderer) {
6060
if (oldTree[prelude] === undefined) {
6161
// Whole media query is new.
6262
for (var selector in newTree[prelude]) {
63-
var rule = new VRule(renderer.createRule(selector, prelude), {});
63+
var rule = new VRule(selector, prelude);
6464
rule.diff(newTree[prelude][selector]);
6565
newTree[prelude][selector] = rule;
6666
}
@@ -81,7 +81,7 @@ exports.addon = function (renderer) {
8181
rule.diff(newRules[selector]);
8282
newRules[selector] = rule;
8383
} else {
84-
rule = new VRule(renderer.createRule(selector, prelude), {});
84+
rule = new VRule(selector, prelude);
8585
rule.diff(newRules[selector]);
8686
newRules[selector] = rule;
8787
}

‎docs/cssom.md

+7
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,10 @@ Use `rule` object to set CSS.
3131
rule.style.color = 'red';
3232
rule.style.setProperty('color', 'green');
3333
```
34+
35+
36+
## Installation
37+
38+
Simply install `cssom` addon.
39+
40+
Read more about the [Addon Installation](./Addons.md#addon-installation).

‎docs/vcssom.md

+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
# `vcssom` Addon
2+
3+
Adds `VRule` and `VSheet` classes, which can be used for rendering and diffing
4+
virtual CSS. Both classes have `.diff()` methods. The `.diff()` method will compute
5+
differences with the previous render and add or remove only necessary CSS rules/declarations.
6+
7+
8+
## Usage
9+
10+
Create a virtual CSS rule.
11+
12+
```js
13+
const rule = new nano.VRule('.my-class');
14+
```
15+
16+
Apply styles to it.
17+
18+
```js
19+
rule.diff({
20+
color: 'red',
21+
'font-weight': 'bold',
22+
});
23+
24+
rule.diff({
25+
color: 'blue',
26+
});
27+
```
28+
29+
Remove the rule from CSSOM (you cannot call `.diff` after this anymore).
30+
31+
```js
32+
rule.del();
33+
```
34+
35+
Create virtual CSS style sheet.
36+
37+
```js
38+
const sheet = new nano.VSheet();
39+
```
40+
41+
Render CSS.
42+
43+
```js
44+
sheet.diff({
45+
'': {
46+
'.my-class': {
47+
color: 'red',
48+
},
49+
'.my-class:hover': {
50+
color: 'blue',
51+
},
52+
},
53+
'@media only screen and (max-width: 600px)': {
54+
'.my-class': {
55+
fontWeight: 'bold',
56+
},
57+
},
58+
});
59+
```
60+
61+
Remove all rendered CSS.
62+
63+
```js
64+
sheet.diff({});
65+
```
66+
67+
68+
## Installation
69+
70+
Simply install `vcssom` addon and its dependencies:
71+
72+
- [`cssom`](./cssom.md)
73+
74+
Read more about the [Addon Installation](./Addons.md#addon-installation).

0 commit comments

Comments
 (0)