@slimr/css 2.0.2 → 2.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -73,9 +73,9 @@ export function App() {
73
73
  }
74
74
  ```
75
75
 
76
- ### Comparisons
76
+ ## Comparisons
77
77
 
78
- #### [Emotion](https://emotion.sh/docs/introduction)
78
+ ### [Emotion](https://emotion.sh/docs/introduction)
79
79
 
80
80
  - A popular css-in-js lib that inspired this lib
81
81
 
@@ -89,7 +89,7 @@ Cons
89
89
  - Many features require addons, which make bundle even larger
90
90
  - Does not support zx prop or css shorthand props
91
91
 
92
- #### [Astroturf](https://astroturfcss.github.io/astroturf/)
92
+ ### [Astroturf](https://astroturfcss.github.io/astroturf/)
93
93
 
94
94
  - A popular css-in-js lib similar to Emotion but compiles out the css into css stylesheets
95
95
 
@@ -104,6 +104,6 @@ Cons
104
104
  - Does not support zx prop or css shorthand props
105
105
  - Is not progressive -- all styles for all components is loaded and blocks initial page paint
106
106
 
107
- #### [Linaria](https://linaria.dev/)
107
+ ### [Linaria](https://linaria.dev/)
108
108
 
109
109
  - Pretty much identical to Astroturf, but maybe better Vite support
@@ -1,9 +1,9 @@
1
1
  /** Breakpoints like chakra */
2
- declare const breakPoints: string[];
2
+ export declare const breakPoints: string[];
3
3
  type allowableAny = any;
4
4
  /** Joins class names and filters out blanks */
5
- declare function classJoin(...classes: allowableAny[]): string;
6
- interface ShorthandProps {
5
+ export declare function classJoin(...classes: allowableAny[]): string;
6
+ export interface ShorthandProps {
7
7
  /** shorthand for css:align-items */
8
8
  ai?: string;
9
9
  /** shorthand for css:border */
@@ -67,8 +67,8 @@ interface ShorthandProps {
67
67
  /** shorthand for css:z-index */
68
68
  z?: number | string;
69
69
  }
70
- declare const shorthandPropsMap: Record<keyof Omit<ShorthandProps, 'mx' | 'my' | 'px' | 'py'>, string>;
71
- declare const shorthandProps: string[];
70
+ export declare const shorthandPropsMap: Record<keyof Omit<ShorthandProps, 'mx' | 'my' | 'px' | 'py'>, string>;
71
+ export declare const shorthandProps: string[];
72
72
  /**
73
73
  * Assemble a string from a template string array and a list of placeholders.
74
74
  *
@@ -81,8 +81,8 @@ declare const shorthandProps: string[];
81
81
  * myFoo`hello ${name}` => 'hello world'
82
82
  * myFoo(`hello ${name}`) => 'hello world'
83
83
  */
84
- declare function t2s(...tsp: TemplateStringProps): string;
85
- type TemplateStringProps = [
84
+ export declare function t2s(...tsp: TemplateStringProps): string;
85
+ export type TemplateStringProps = [
86
86
  strings: TemplateStringsArray | string,
87
87
  ...placeHolders: string[]
88
88
  ];
@@ -94,8 +94,8 @@ type TemplateStringProps = [
94
94
  * @param css - css to be injected
95
95
  * @returns void
96
96
  */
97
- declare function addCss(css: string): void;
98
- declare namespace addCss {
97
+ export declare function addCss(css: string): void;
98
+ export declare namespace addCss {
99
99
  var que: Set<string>;
100
100
  var count: number;
101
101
  }
@@ -107,10 +107,9 @@ declare namespace addCss {
107
107
  * @param css - string or template string, to be injected
108
108
  * @returns a unique class name
109
109
  */
110
- declare function createClass(...p: TemplateStringProps): string;
111
- declare namespace createClass {
110
+ export declare function createClass(...p: TemplateStringProps): string;
111
+ export declare namespace createClass {
112
112
  var count: number;
113
113
  var history: Map<string, string>;
114
114
  }
115
-
116
- export { ShorthandProps, TemplateStringProps, addCss, breakPoints, classJoin, createClass, shorthandProps, shorthandPropsMap, t2s };
115
+ export {};
package/cjs/core.js ADDED
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createClass = exports.addCss = exports.t2s = exports.shorthandProps = exports.shorthandPropsMap = exports.classJoin = exports.breakPoints = void 0;
4
+ /** Breakpoints like chakra */
5
+ exports.breakPoints = ['30em', '48em', '62em', '80em', '96em'];
6
+ /** Joins class names and filters out blanks */
7
+ function classJoin(...classes) {
8
+ return classes.filter(c => c && typeof c === 'string').join(' ');
9
+ }
10
+ exports.classJoin = classJoin;
11
+ /** delete css comments **/
12
+ function deleteComments(css) {
13
+ return css.replace(/{\/\*[\s\S]*?(?=\*\/})\*\/}/gm, '');
14
+ }
15
+ /**
16
+ * Expands array values into media queries
17
+ *
18
+ * Inspired by https://chakra-ui.com/docs/styled-system/responsive-styles
19
+ */
20
+ function expandArrayValues(css) {
21
+ if (!css.includes('['))
22
+ return css;
23
+ return css
24
+ .split('\n')
25
+ .map(l => {
26
+ // eslint-disable-next-line no-useless-escape
27
+ const [, prop, vals] = [...l.matchAll(/([A-Za-z\-]*):[ ]*\[([^\]]+)\]/g)]?.[0] ?? [];
28
+ if (vals) {
29
+ return vals
30
+ .split(',')
31
+ .map((val, i) => {
32
+ val = val.trim();
33
+ if (!val || val === 'null' || val === 'undefined')
34
+ return '';
35
+ if (i === 0) {
36
+ return `${prop}: ${val};`;
37
+ }
38
+ return `@media (min-width: ${exports.breakPoints[i - 1]}) { ${prop}: ${val}; }`;
39
+ })
40
+ .join('\n');
41
+ }
42
+ return l;
43
+ })
44
+ .join('\n');
45
+ }
46
+ exports.shorthandPropsMap = {
47
+ ai: 'align-items',
48
+ b: 'border',
49
+ br: 'border-radius',
50
+ bg: 'background',
51
+ c: 'color',
52
+ d: 'display',
53
+ f: 'flex',
54
+ fd: 'flex-direction',
55
+ i: 'inset',
56
+ h: 'height',
57
+ jc: 'justify-content',
58
+ m: 'margin',
59
+ ml: 'margin-left',
60
+ mr: 'margin-right',
61
+ mt: 'margin-top',
62
+ mb: 'margin-bottom',
63
+ maxW: 'max-width',
64
+ minW: 'min-width',
65
+ p: 'padding',
66
+ pl: 'padding-left',
67
+ pr: 'padding-right',
68
+ pt: 'padding-top',
69
+ pb: 'padding-bottom',
70
+ pos: 'position',
71
+ ta: 'text-align',
72
+ w: 'width',
73
+ z: 'z-index',
74
+ };
75
+ exports.shorthandProps = [...Object.keys(exports.shorthandPropsMap), 'mx', 'my', 'px', 'py'];
76
+ /** Expand short-hand css props to full */
77
+ function expandProps(css) {
78
+ css = '\n' + css; // inject a newline to make the regex easier
79
+ // Handle 'mx', 'my', 'px', 'py'
80
+ css = css
81
+ .replace(/([mp])x:([^;]*)/g, '$1l:$2;\n$1r:$2')
82
+ .replace(/([mp])y:([^;]*);/g, '$1t:$2;\n$1b:$2');
83
+ Object.entries(exports.shorthandPropsMap).forEach(([k, v]) => {
84
+ css = css.replace(new RegExp(`([ \n\t;])${k}:`, 'g'), `$1${v}:`);
85
+ });
86
+ return css.trim();
87
+ }
88
+ /** Find @keyframes, @media, @container queries in css **/
89
+ function findQueries(css) {
90
+ const queries = [];
91
+ for (const m of css.matchAll(/[@&]/gm)) {
92
+ let query = '';
93
+ let bodyStart = 0;
94
+ let openCount = 0;
95
+ for (let i = m.index; i < css.length; i++) {
96
+ if (css[i] === '{') {
97
+ if (openCount === 0) {
98
+ query = css.slice(m.index, i).trim();
99
+ bodyStart = i + 1;
100
+ }
101
+ openCount++;
102
+ }
103
+ else if (css[i] === '}') {
104
+ openCount--;
105
+ if (openCount === 0) {
106
+ queries.push({
107
+ start: m.index,
108
+ end: i + 1,
109
+ query,
110
+ outerBody: css.slice(m.index, i + 1),
111
+ innerBody: css.slice(bodyStart, i),
112
+ });
113
+ break;
114
+ }
115
+ }
116
+ }
117
+ if (openCount !== 0)
118
+ console.error(`${query} not closed: "${css}"`);
119
+ }
120
+ return queries;
121
+ }
122
+ /** Trims whitespace for every line */
123
+ function trim(css) {
124
+ return css
125
+ .split('\n')
126
+ .map(l => l.trim())
127
+ .filter(l => l)
128
+ .join('\n');
129
+ }
130
+ /**
131
+ * Assemble a string from a template string array and a list of placeholders.
132
+ *
133
+ * - If the first argument is a string, it is returned as is.
134
+ *
135
+ * i.e.
136
+ * myFoo(...props: TemplateStringProps) => {
137
+ * const inputStr = t2s(...props);
138
+ * }
139
+ * myFoo`hello ${name}` => 'hello world'
140
+ * myFoo(`hello ${name}`) => 'hello world'
141
+ */
142
+ function t2s(...tsp) {
143
+ const [s, ...p] = tsp;
144
+ return typeof s === 'string' ? s : s.map((s, i) => s + (p?.[i] ?? '')).join('');
145
+ }
146
+ exports.t2s = t2s;
147
+ /**
148
+ * Injects css to the page
149
+ *
150
+ * - Batches adds for performance
151
+ *
152
+ * @param css - css to be injected
153
+ * @returns void
154
+ */
155
+ function addCss(css) {
156
+ addCss.que.add(css);
157
+ setTimeout(() => {
158
+ const css = [...addCss.que].join('\n');
159
+ if (css) {
160
+ addCss.que.clear();
161
+ const s = document.createElement('style');
162
+ s.id = `u${addCss.count++}`;
163
+ s.innerHTML = css;
164
+ document.head.appendChild(s);
165
+ }
166
+ }, 0);
167
+ }
168
+ exports.addCss = addCss;
169
+ addCss.que = new Set();
170
+ addCss.count = 0;
171
+ /**
172
+ * Injects css and creates unique class names
173
+ *
174
+ * - Skips if already added
175
+ *
176
+ * @param css - string or template string, to be injected
177
+ * @returns a unique class name
178
+ */
179
+ function createClass(...p) {
180
+ let css = t2s(...p);
181
+ if (!css)
182
+ return '';
183
+ let className = createClass.history.get(css);
184
+ if (!className) {
185
+ className = 's' + createClass.count++;
186
+ createClass.history.set(css, className);
187
+ css = deleteComments(css);
188
+ css = expandProps(css);
189
+ css = expandArrayValues(css);
190
+ const qs = findQueries(css);
191
+ for (const q of qs.reverse()) {
192
+ css = css.slice(0, q.start) + css.slice(q.end);
193
+ }
194
+ css = `.${className}{\n${css}\n}\n`;
195
+ css += qs
196
+ .map(q => {
197
+ if (q.query.startsWith('&')) {
198
+ return `.${className}${q.query.slice(1)}{\n${q.innerBody}\n}`;
199
+ }
200
+ if (q.query.startsWith('@keyframes')) {
201
+ return q.outerBody;
202
+ }
203
+ return `${q.query}{\n.${className}{${q.innerBody}\n}\n}`;
204
+ })
205
+ .join('\n');
206
+ css = trim(css) + '\n\n';
207
+ addCss(css);
208
+ }
209
+ return className;
210
+ }
211
+ exports.createClass = createClass;
212
+ createClass.count = 0;
213
+ createClass.history = new Map();
214
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
package/cjs/core.ts ADDED
@@ -0,0 +1,290 @@
1
+ /** Breakpoints like chakra */
2
+ export const breakPoints = ['30em', '48em', '62em', '80em', '96em']
3
+
4
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5
+ type allowableAny = any
6
+
7
+ /** Joins class names and filters out blanks */
8
+ export function classJoin(...classes: allowableAny[]) {
9
+ return classes.filter(c => c && typeof c === 'string').join(' ')
10
+ }
11
+
12
+ /** delete css comments **/
13
+ function deleteComments(css: string) {
14
+ return css.replace(/{\/\*[\s\S]*?(?=\*\/})\*\/}/gm, '')
15
+ }
16
+
17
+ /**
18
+ * Expands array values into media queries
19
+ *
20
+ * Inspired by https://chakra-ui.com/docs/styled-system/responsive-styles
21
+ */
22
+ function expandArrayValues(css: string) {
23
+ if (!css.includes('[')) return css
24
+ return css
25
+ .split('\n')
26
+ .map(l => {
27
+ // eslint-disable-next-line no-useless-escape
28
+ const [, prop, vals] = [...l.matchAll(/([A-Za-z\-]*):[ ]*\[([^\]]+)\]/g)]?.[0] ?? []
29
+ if (vals) {
30
+ return vals
31
+ .split(',')
32
+ .map((val, i) => {
33
+ val = val.trim()
34
+ if (!val || val === 'null' || val === 'undefined') return ''
35
+ if (i === 0) {
36
+ return `${prop}: ${val};`
37
+ }
38
+ return `@media (min-width: ${breakPoints[i - 1]}) { ${prop}: ${val}; }`
39
+ })
40
+ .join('\n')
41
+ }
42
+ return l
43
+ })
44
+ .join('\n')
45
+ }
46
+
47
+ export interface ShorthandProps {
48
+ /** shorthand for css:align-items */
49
+ ai?: string
50
+ /** shorthand for css:border */
51
+ b?: string | number
52
+ /** shorthand for css:border-radius */
53
+ br?: string | number
54
+ /** shorthand for css:background */
55
+ bg?: string
56
+ /** shorthand for css:color */
57
+ c?: string
58
+ /** shorthand for css:display */
59
+ d?: string
60
+ /** shorthand for css:flex */
61
+ f?: string
62
+ /** shorthand for css:flex-direction */
63
+ fd?: string
64
+ /** shorthand for css:height */
65
+ h?: number | string
66
+ /** shorthand for css:inset */
67
+ i?: number | string
68
+ /** shorthand for css:justify-content */
69
+ jc?: string
70
+ /** shorthand for css:margin */
71
+ m?: number | string
72
+ /** shorthand for css:margin-left */
73
+ ml?: number | string
74
+ /** shorthand for css:margin-right */
75
+ mr?: number | string
76
+ /** shorthand for css:margin-top */
77
+ mt?: number | string
78
+ /** shorthand for css:margin-bottom */
79
+ mb?: number | string
80
+ /** shorthand for css:margin-top & margin-bottom */
81
+ my?: number | string
82
+ /** shorthand for css:margin-left & margin-right */
83
+ mx?: number | string
84
+ /** shorthand for css:max-width */
85
+ maxW?: number | string
86
+ /** shorthand for css:min-width */
87
+ minW?: number | string
88
+ /** shorthand for css:padding */
89
+ p?: number | string
90
+ /** shorthand for css:padding-left */
91
+ pl?: number | string
92
+ /** shorthand for css:padding-right */
93
+ pr?: number | string
94
+ /** shorthand for css:padding-top */
95
+ pt?: number | string
96
+ /** shorthand for css:padding-bottom */
97
+ pb?: number | string
98
+ /** shorthand for css:padding-top & padding-bottom */
99
+ py?: number | string
100
+ /** shorthand for css:padding-left & padding-right */
101
+ px?: number | string
102
+ /** shorthand for css:position */
103
+ pos?: number | string
104
+ /** shorthand for css:text-align */
105
+ ta?: string
106
+ /** shorthand for css:width */
107
+ w?: number | string
108
+ /** shorthand for css:z-index */
109
+ z?: number | string
110
+ }
111
+ export const shorthandPropsMap: Record<
112
+ keyof Omit<ShorthandProps, 'mx' | 'my' | 'px' | 'py'>,
113
+ string
114
+ > = {
115
+ ai: 'align-items',
116
+ b: 'border',
117
+ br: 'border-radius',
118
+ bg: 'background',
119
+ c: 'color',
120
+ d: 'display',
121
+ f: 'flex',
122
+ fd: 'flex-direction',
123
+ i: 'inset',
124
+ h: 'height',
125
+ jc: 'justify-content',
126
+ m: 'margin',
127
+ ml: 'margin-left',
128
+ mr: 'margin-right',
129
+ mt: 'margin-top',
130
+ mb: 'margin-bottom',
131
+ maxW: 'max-width',
132
+ minW: 'min-width',
133
+ p: 'padding',
134
+ pl: 'padding-left',
135
+ pr: 'padding-right',
136
+ pt: 'padding-top',
137
+ pb: 'padding-bottom',
138
+ pos: 'position',
139
+ ta: 'text-align',
140
+ w: 'width',
141
+ z: 'z-index',
142
+ }
143
+ export const shorthandProps = [...Object.keys(shorthandPropsMap), 'mx', 'my', 'px', 'py']
144
+
145
+ /** Expand short-hand css props to full */
146
+ function expandProps(css: string) {
147
+ css = '\n' + css // inject a newline to make the regex easier
148
+ // Handle 'mx', 'my', 'px', 'py'
149
+ css = css
150
+ .replace(/([mp])x:([^;]*)/g, '$1l:$2;\n$1r:$2')
151
+ .replace(/([mp])y:([^;]*);/g, '$1t:$2;\n$1b:$2')
152
+ Object.entries(shorthandPropsMap).forEach(([k, v]) => {
153
+ css = css.replace(new RegExp(`([ \n\t;])${k}:`, 'g'), `$1${v}:`)
154
+ })
155
+ return css.trim()
156
+ }
157
+
158
+ /** Find @keyframes, @media, @container queries in css **/
159
+ function findQueries(css: string) {
160
+ const queries = []
161
+ for (const m of css.matchAll(/[@&]/gm)) {
162
+ let query = ''
163
+ let bodyStart = 0
164
+ let openCount = 0
165
+ for (let i = m.index!; i < css.length; i++) {
166
+ if (css[i] === '{') {
167
+ if (openCount === 0) {
168
+ query = css.slice(m.index, i).trim()
169
+ bodyStart = i + 1
170
+ }
171
+ openCount++
172
+ } else if (css[i] === '}') {
173
+ openCount--
174
+ if (openCount === 0) {
175
+ queries.push({
176
+ start: m.index,
177
+ end: i + 1,
178
+ query,
179
+ outerBody: css.slice(m.index, i + 1),
180
+ innerBody: css.slice(bodyStart, i),
181
+ })
182
+ break
183
+ }
184
+ }
185
+ }
186
+ if (openCount !== 0) console.error(`${query} not closed: "${css}"`)
187
+ }
188
+ return queries
189
+ }
190
+
191
+ /** Trims whitespace for every line */
192
+ function trim(css: string) {
193
+ return css
194
+ .split('\n')
195
+ .map(l => l.trim())
196
+ .filter(l => l)
197
+ .join('\n')
198
+ }
199
+
200
+ /**
201
+ * Assemble a string from a template string array and a list of placeholders.
202
+ *
203
+ * - If the first argument is a string, it is returned as is.
204
+ *
205
+ * i.e.
206
+ * myFoo(...props: TemplateStringProps) => {
207
+ * const inputStr = t2s(...props);
208
+ * }
209
+ * myFoo`hello ${name}` => 'hello world'
210
+ * myFoo(`hello ${name}`) => 'hello world'
211
+ */
212
+ export function t2s(...tsp: TemplateStringProps) {
213
+ const [s, ...p] = tsp
214
+ return typeof s === 'string' ? s : s.map((s, i) => s + (p?.[i] ?? '')).join('')
215
+ }
216
+ export type TemplateStringProps = [
217
+ strings: TemplateStringsArray | string,
218
+ ...placeHolders: string[]
219
+ ]
220
+
221
+ /**
222
+ * Injects css to the page
223
+ *
224
+ * - Batches adds for performance
225
+ *
226
+ * @param css - css to be injected
227
+ * @returns void
228
+ */
229
+ export function addCss(css: string) {
230
+ addCss.que.add(css)
231
+ setTimeout(() => {
232
+ const css = [...addCss.que].join('\n')
233
+ if (css) {
234
+ addCss.que.clear()
235
+ const s = document.createElement('style')
236
+ s.id = `u${addCss.count++}`
237
+ s.innerHTML = css
238
+ document.head.appendChild(s)
239
+ }
240
+ }, 0)
241
+ }
242
+ addCss.que = new Set<string>()
243
+ addCss.count = 0
244
+
245
+ /**
246
+ * Injects css and creates unique class names
247
+ *
248
+ * - Skips if already added
249
+ *
250
+ * @param css - string or template string, to be injected
251
+ * @returns a unique class name
252
+ */
253
+ export function createClass(...p: TemplateStringProps) {
254
+ let css = t2s(...p)
255
+ if (!css) return ''
256
+ let className = createClass.history.get(css)
257
+ if (!className) {
258
+ className = 's' + createClass.count++
259
+ createClass.history.set(css, className)
260
+
261
+ css = deleteComments(css)
262
+ css = expandProps(css)
263
+ css = expandArrayValues(css)
264
+ const qs = findQueries(css)
265
+
266
+ for (const q of qs.reverse()) {
267
+ css = css.slice(0, q.start) + css.slice(q.end)
268
+ }
269
+
270
+ css = `.${className}{\n${css}\n}\n`
271
+ css += qs
272
+ .map(q => {
273
+ if (q.query.startsWith('&')) {
274
+ return `.${className}${q.query.slice(1)}{\n${q.innerBody}\n}`
275
+ }
276
+ if (q.query.startsWith('@keyframes')) {
277
+ return q.outerBody
278
+ }
279
+ return `${q.query}{\n.${className}{${q.innerBody}\n}\n}`
280
+ })
281
+ .join('\n')
282
+
283
+ css = trim(css) + '\n\n'
284
+
285
+ addCss(css)
286
+ }
287
+ return className
288
+ }
289
+ createClass.count = 0
290
+ createClass.history = new Map<string, string>()
package/cjs/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './core.js';
2
+ export { createClass as css } from './core.js';
package/cjs/index.js ADDED
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.css = void 0;
18
+ __exportStar(require("./core.js"), exports);
19
+ var core_js_1 = require("./core.js");
20
+ Object.defineProperty(exports, "css", { enumerable: true, get: function () { return core_js_1.createClass; } });
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,4CAAyB;AACzB,qCAA4C;AAApC,8FAAA,WAAW,OAAO"}
package/cjs/index.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './core.js'
2
+ export {createClass as css} from './core.js'