@slimr/css 2.1.11 → 2.1.14
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 +58 -50
- package/cjs/addCss.d.ts +23 -0
- package/cjs/addCss.js +38 -0
- package/cjs/addCss.js.map +1 -0
- package/cjs/addCss.ts +33 -0
- package/cjs/createClass.d.ts +43 -0
- package/cjs/{src/createClass.js → createClass.js} +78 -132
- package/cjs/createClass.js.map +1 -0
- package/cjs/createClass.ts +82 -211
- package/{esm/src → cjs}/index.d.ts +1 -0
- package/cjs/{src/index.js → index.js} +1 -0
- package/cjs/index.js.map +1 -0
- package/cjs/index.ts +1 -0
- package/cjs/{src/createClass.d.ts → shorthandProps.d.ts} +7 -47
- package/cjs/shorthandProps.js +51 -0
- package/cjs/shorthandProps.js.map +1 -0
- package/cjs/shorthandProps.ts +118 -0
- package/esm/addCss.d.ts +23 -0
- package/esm/addCss.js +34 -0
- package/esm/addCss.js.map +1 -0
- package/esm/addCss.ts +33 -0
- package/esm/createClass.d.ts +43 -0
- package/esm/{src/createClass.js → createClass.js} +76 -128
- package/esm/createClass.js.map +1 -0
- package/esm/createClass.ts +82 -211
- package/{cjs/src → esm}/index.d.ts +1 -0
- package/esm/{src/index.js → index.js} +1 -0
- package/esm/index.js.map +1 -0
- package/esm/index.ts +1 -0
- package/esm/{src/createClass.d.ts → shorthandProps.d.ts} +7 -47
- package/esm/shorthandProps.js +47 -0
- package/esm/shorthandProps.js.map +1 -0
- package/esm/shorthandProps.ts +118 -0
- package/package.json +4 -1
- package/src/addCss.ts +33 -0
- package/src/createClass.ts +82 -211
- package/src/index.ts +1 -0
- package/src/shorthandProps.ts +118 -0
- package/tsconfig.json +1 -1
- package/cjs/src/createClass.js.map +0 -1
- package/cjs/src/index.js.map +0 -1
- package/esm/src/createClass.js.map +0 -1
- package/esm/src/index.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,6 +1,18 @@
|
|
|
1
|
-
# @slimr/css
|
|
1
|
+
# 🪶 @slimr/css [](https://npmjs.org/package/@slimr/css)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
tiny css-in-js features, inspired by the popular emotion library
|
|
4
|
+
|
|
5
|
+
Demo: [CodeSandbox](https://codesandbox.io/s/64r9px?file=/src/App.tsx)
|
|
6
|
+
|
|
7
|
+
Features:
|
|
8
|
+
|
|
9
|
+
- Much smaller (less bundle size)
|
|
10
|
+
- Less is more: faster, less bugs, no breaking changes
|
|
11
|
+
- Is progressive -- lazy loads styles
|
|
12
|
+
- Css shorthand props like [chakra-ui](https://chakra-ui.com/docs/styled-system/style-props)
|
|
13
|
+
- CSS responsive shorthand props like [chakra-ui](https://chakra-ui.com/docs/styled-system/responsive-styles)
|
|
14
|
+
|
|
15
|
+
## Context
|
|
4
16
|
|
|
5
17
|
`@slimr` is a set of slim React (hence '@slimr') libs:
|
|
6
18
|
|
|
@@ -14,63 +26,59 @@ A tiny alternative to the popular emotion library
|
|
|
14
26
|
- [@slimr/swr](https://www.npmjs.com/package/@slimr/swr) - A React hook for fetching data that supports stale-while-refresh eager rendering
|
|
15
27
|
- [@slimr/util](https://www.npmjs.com/package/@slimr/util) - Framework agnostic Javascript polyfills
|
|
16
28
|
|
|
17
|
-
|
|
29
|
+
## Setup/Install
|
|
18
30
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
- Css shorthand props like [chakra-ui](https://chakra-ui.com/docs/styled-system/style-props):
|
|
23
|
-
- `m` --> `margin`
|
|
24
|
-
- `mx` --> `margin-left` and bottom
|
|
25
|
-
- `py` --> `padding-top` and bottom
|
|
26
|
-
- More [here](https://github.com/bdombro/slimr/blob/65bf012086760b7e481a4064f3be8aea6a098b91/packages/css/src/index.ts#L73)!
|
|
27
|
-
- CSS Breakpoints shorthand like [chakra-ui](https://chakra-ui.com/docs/styled-system/responsive-styles):
|
|
31
|
+
```bash
|
|
32
|
+
npm i @slimr/css
|
|
33
|
+
```
|
|
28
34
|
|
|
29
|
-
|
|
30
|
-
margin: [auto, null, inherit];
|
|
31
|
-
/* Translates to */
|
|
32
|
-
margin: auto;
|
|
33
|
-
@media (min-width: 48em) {
|
|
34
|
-
margin: inherit;
|
|
35
|
-
}
|
|
36
|
-
```
|
|
35
|
+
## API
|
|
37
36
|
|
|
38
|
-
|
|
37
|
+
### addCss
|
|
39
38
|
|
|
40
|
-
|
|
39
|
+
Injects css to the page head
|
|
41
40
|
|
|
42
|
-
-
|
|
41
|
+
- Queues and batches injections for better performance
|
|
42
|
+
- Has local cache to recall prior adds, to reduce duplicates and dom changes
|
|
43
43
|
|
|
44
|
-
|
|
44
|
+
```typescript
|
|
45
|
+
import { addCSs } from '@slimr/css'
|
|
46
|
+
addCss(`.foo { color: green; }`) // queues css for injection
|
|
47
|
+
addCss(`.foo { color: green; }`) // ignored bc duplicate
|
|
48
|
+
addCss(`.foo { background: purplse`) // queues more css
|
|
49
|
+
// the queue will be executed next javascript tick
|
|
50
|
+
```
|
|
45
51
|
|
|
46
|
-
|
|
47
|
-
|
|
52
|
+
### `css` (alias for `createClass`)
|
|
53
|
+
|
|
54
|
+
Upserts and returns a unique css class for a given css string
|
|
55
|
+
|
|
56
|
+
- Leverages addCss under the hood, so very performant
|
|
57
|
+
- Supports several css short-hands, inspired by [Chakra-UI's box](https://chakra-ui.com/docs/styled-system/responsive-styles)
|
|
58
|
+
- Supports array values for responsive styles, similar to Chakra-UI's box. More [here](https://github.com/bdombro/slimr/blob/65bf012086760b7e481a4064f3be8aea6a098b91/packages/css/src/index.ts#L73)
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
import {createClass, css} from '@slimr/css'
|
|
62
|
+
c1 = createClass('c: red;') // queues the create of new css class 's0'
|
|
63
|
+
c2 = createClass('c: red;') // is duplicate so will return 's0'
|
|
64
|
+
c3 = createClass`c: red;` // same
|
|
65
|
+
c4 = css`c: red;` // same
|
|
66
|
+
// c1 = c2 = c3 = c4
|
|
67
|
+
<div className={css`c: red;`} /> // will resolve to 's0' like above
|
|
68
|
+
c5 = css`c: blue;` // queues the create of new css class 's1'
|
|
69
|
+
c6 = css`w: [100%, null, 400px]` // width = 100% on mobile and table, 400px on desktop
|
|
48
70
|
```
|
|
49
71
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
<div
|
|
61
|
-
className={css`
|
|
62
|
-
background: white;
|
|
63
|
-
color: ${on ? 'red' : 'initial'};
|
|
64
|
-
&:hover {
|
|
65
|
-
font-weight: bold;
|
|
66
|
-
}
|
|
67
|
-
font-size: [20px, null, 16px];
|
|
68
|
-
`}
|
|
69
|
-
>
|
|
70
|
-
Helo css!
|
|
71
|
-
</div>
|
|
72
|
-
)
|
|
73
|
-
}
|
|
72
|
+
...and the queue will be executed next javascript tick
|
|
73
|
+
|
|
74
|
+
### `classJoin`
|
|
75
|
+
|
|
76
|
+
Joins class names and omits falsey props
|
|
77
|
+
|
|
78
|
+
```typescript
|
|
79
|
+
import { classJoin } from '@slimr/css'
|
|
80
|
+
classJoin('a', 'b', 'c') // 'a b c'
|
|
81
|
+
classJoin('a', 0, 'b', null, 'c') // 'a b c'
|
|
74
82
|
```
|
|
75
83
|
|
|
76
84
|
## Comparisons
|
package/cjs/addCss.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Injects css to the page head
|
|
3
|
+
*
|
|
4
|
+
* - Lazy: Will not be added until the component mounts, if called from within a component
|
|
5
|
+
* - Batches dom changes for better performance
|
|
6
|
+
* - Has local cache to recall prior adds, to reduce duplicates and dom changes
|
|
7
|
+
*
|
|
8
|
+
* @param css
|
|
9
|
+
* css to be injected
|
|
10
|
+
*
|
|
11
|
+
* @returns void
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* addCss(`.myClass { color: red; }`) // queues css for injection
|
|
15
|
+
* addCss(`.myClass { color: red; }`) // is duplicate so will not be added
|
|
16
|
+
* addCss(`.myClass { color: blue; }`) // queues css for injection
|
|
17
|
+
* // ...and the queue will be executed next javascript tick
|
|
18
|
+
*/
|
|
19
|
+
export declare function addCss(css: string): void;
|
|
20
|
+
export declare namespace addCss {
|
|
21
|
+
var que: Set<string>;
|
|
22
|
+
var count: number;
|
|
23
|
+
}
|
package/cjs/addCss.js
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.addCss = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Injects css to the page head
|
|
6
|
+
*
|
|
7
|
+
* - Lazy: Will not be added until the component mounts, if called from within a component
|
|
8
|
+
* - Batches dom changes for better performance
|
|
9
|
+
* - Has local cache to recall prior adds, to reduce duplicates and dom changes
|
|
10
|
+
*
|
|
11
|
+
* @param css
|
|
12
|
+
* css to be injected
|
|
13
|
+
*
|
|
14
|
+
* @returns void
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* addCss(`.myClass { color: red; }`) // queues css for injection
|
|
18
|
+
* addCss(`.myClass { color: red; }`) // is duplicate so will not be added
|
|
19
|
+
* addCss(`.myClass { color: blue; }`) // queues css for injection
|
|
20
|
+
* // ...and the queue will be executed next javascript tick
|
|
21
|
+
*/
|
|
22
|
+
function addCss(css) {
|
|
23
|
+
addCss.que.add(css);
|
|
24
|
+
setTimeout(() => {
|
|
25
|
+
const css = [...addCss.que].join('\n');
|
|
26
|
+
if (css) {
|
|
27
|
+
addCss.que.clear();
|
|
28
|
+
const s = document.createElement('style');
|
|
29
|
+
s.id = `u${addCss.count++}`;
|
|
30
|
+
s.innerHTML = css;
|
|
31
|
+
document.head.appendChild(s);
|
|
32
|
+
}
|
|
33
|
+
}, 0);
|
|
34
|
+
}
|
|
35
|
+
exports.addCss = addCss;
|
|
36
|
+
addCss.que = new Set();
|
|
37
|
+
addCss.count = 0;
|
|
38
|
+
//# sourceMappingURL=addCss.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"addCss.js","sourceRoot":"","sources":["../src/addCss.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,MAAM,CAAC,GAAW;IAChC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACnB,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtC,IAAI,GAAG,EAAE;YACP,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAA;YAClB,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;YACzC,CAAC,CAAC,EAAE,GAAG,IAAI,MAAM,CAAC,KAAK,EAAE,EAAE,CAAA;YAC3B,CAAC,CAAC,SAAS,GAAG,GAAG,CAAA;YACjB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;SAC7B;IACH,CAAC,EAAE,CAAC,CAAC,CAAA;AACP,CAAC;AAZD,wBAYC;AACD,MAAM,CAAC,GAAG,GAAG,IAAI,GAAG,EAAU,CAAA;AAC9B,MAAM,CAAC,KAAK,GAAG,CAAC,CAAA"}
|
package/cjs/addCss.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Injects css to the page head
|
|
3
|
+
*
|
|
4
|
+
* - Lazy: Will not be added until the component mounts, if called from within a component
|
|
5
|
+
* - Batches dom changes for better performance
|
|
6
|
+
* - Has local cache to recall prior adds, to reduce duplicates and dom changes
|
|
7
|
+
*
|
|
8
|
+
* @param css
|
|
9
|
+
* css to be injected
|
|
10
|
+
*
|
|
11
|
+
* @returns void
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* addCss(`.myClass { color: red; }`) // queues css for injection
|
|
15
|
+
* addCss(`.myClass { color: red; }`) // is duplicate so will not be added
|
|
16
|
+
* addCss(`.myClass { color: blue; }`) // queues css for injection
|
|
17
|
+
* // ...and the queue will be executed next javascript tick
|
|
18
|
+
*/
|
|
19
|
+
export function addCss(css: string) {
|
|
20
|
+
addCss.que.add(css)
|
|
21
|
+
setTimeout(() => {
|
|
22
|
+
const css = [...addCss.que].join('\n')
|
|
23
|
+
if (css) {
|
|
24
|
+
addCss.que.clear()
|
|
25
|
+
const s = document.createElement('style')
|
|
26
|
+
s.id = `u${addCss.count++}`
|
|
27
|
+
s.innerHTML = css
|
|
28
|
+
document.head.appendChild(s)
|
|
29
|
+
}
|
|
30
|
+
}, 0)
|
|
31
|
+
}
|
|
32
|
+
addCss.que = new Set<string>()
|
|
33
|
+
addCss.count = 0
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { T2SProps } from '@slimr/util';
|
|
2
|
+
/**
|
|
3
|
+
* Joins class names and omits falsey props
|
|
4
|
+
*
|
|
5
|
+
* @param classes
|
|
6
|
+
* class names to be joined
|
|
7
|
+
*
|
|
8
|
+
* @returns a string of joined class names
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* classJoin('a', 'b', 'c') // 'a b c'
|
|
13
|
+
* classJoin('a', 0, 'b', null, 'c') // 'a b c'
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export declare function classJoin(...classes: (string | 0 | null | undefined)[]): string;
|
|
17
|
+
/**
|
|
18
|
+
* Upserts and returns a unique css class for a given css string
|
|
19
|
+
*
|
|
20
|
+
* @param cssString
|
|
21
|
+
* string or template string, to be injected. Shorthand props are supported (see Readme).
|
|
22
|
+
*
|
|
23
|
+
* @returns a unique class name
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* c1 = createClass('c: red;') // queues the create of new css class 's0'
|
|
28
|
+
* c2 = createClass('c: red;') // is duplicate so will return 's0'
|
|
29
|
+
* c3 = createClass`c: red;` // same
|
|
30
|
+
* c4 = css`c: red;` // same
|
|
31
|
+
* // c1 = c2 = c3 = c4
|
|
32
|
+
* <div className={css`c: red;`} /> // will resolve to 's0' like above
|
|
33
|
+
* c5 = css`c: blue;` // queues the create of new css class 's1'
|
|
34
|
+
* c6 = css`w: [100%, null, 400px]` // width = 100% on mobile and table, 400px on desktop
|
|
35
|
+
* ```
|
|
36
|
+
* ...and the queue will be executed next javascript tick
|
|
37
|
+
*/
|
|
38
|
+
export declare function createClass(...p: T2SProps): string;
|
|
39
|
+
export declare namespace createClass {
|
|
40
|
+
var breakPoints: string[];
|
|
41
|
+
var count: number;
|
|
42
|
+
var history: Map<string, string>;
|
|
43
|
+
}
|
|
@@ -1,13 +1,85 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createClass = exports.
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
exports.createClass = exports.classJoin = void 0;
|
|
4
|
+
const util_1 = require("@slimr/util");
|
|
5
|
+
const addCss_js_1 = require("./addCss.js");
|
|
6
|
+
const shorthandProps_js_1 = require("./shorthandProps.js");
|
|
7
|
+
/**
|
|
8
|
+
* Joins class names and omits falsey props
|
|
9
|
+
*
|
|
10
|
+
* @param classes
|
|
11
|
+
* class names to be joined
|
|
12
|
+
*
|
|
13
|
+
* @returns a string of joined class names
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* classJoin('a', 'b', 'c') // 'a b c'
|
|
18
|
+
* classJoin('a', 0, 'b', null, 'c') // 'a b c'
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
7
21
|
function classJoin(...classes) {
|
|
8
22
|
return classes.filter(c => c && typeof c === 'string').join(' ');
|
|
9
23
|
}
|
|
10
24
|
exports.classJoin = classJoin;
|
|
25
|
+
/**
|
|
26
|
+
* Upserts and returns a unique css class for a given css string
|
|
27
|
+
*
|
|
28
|
+
* @param cssString
|
|
29
|
+
* string or template string, to be injected. Shorthand props are supported (see Readme).
|
|
30
|
+
*
|
|
31
|
+
* @returns a unique class name
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* ```typescript
|
|
35
|
+
* c1 = createClass('c: red;') // queues the create of new css class 's0'
|
|
36
|
+
* c2 = createClass('c: red;') // is duplicate so will return 's0'
|
|
37
|
+
* c3 = createClass`c: red;` // same
|
|
38
|
+
* c4 = css`c: red;` // same
|
|
39
|
+
* // c1 = c2 = c3 = c4
|
|
40
|
+
* <div className={css`c: red;`} /> // will resolve to 's0' like above
|
|
41
|
+
* c5 = css`c: blue;` // queues the create of new css class 's1'
|
|
42
|
+
* c6 = css`w: [100%, null, 400px]` // width = 100% on mobile and table, 400px on desktop
|
|
43
|
+
* ```
|
|
44
|
+
* ...and the queue will be executed next javascript tick
|
|
45
|
+
*/
|
|
46
|
+
function createClass(...p) {
|
|
47
|
+
let css = (0, util_1.t2s)(...p);
|
|
48
|
+
if (!css)
|
|
49
|
+
return '';
|
|
50
|
+
let className = createClass.history.get(css);
|
|
51
|
+
if (!className) {
|
|
52
|
+
className = 's' + createClass.count++;
|
|
53
|
+
createClass.history.set(css, className);
|
|
54
|
+
css = deleteComments(css);
|
|
55
|
+
css = (0, shorthandProps_js_1.expandShorthands)(css);
|
|
56
|
+
css = expandArrayValues(css);
|
|
57
|
+
const qs = findQueries(css);
|
|
58
|
+
for (const q of qs.reverse()) {
|
|
59
|
+
css = css.slice(0, q.start) + css.slice(q.end);
|
|
60
|
+
}
|
|
61
|
+
css = `.${className}{\n${css}\n}\n`;
|
|
62
|
+
css += qs
|
|
63
|
+
.map(q => {
|
|
64
|
+
if (q.query.startsWith('&')) {
|
|
65
|
+
return `.${className}${q.query.slice(1)}{\n${q.innerBody}\n}`;
|
|
66
|
+
}
|
|
67
|
+
if (q.query.startsWith('@keyframes')) {
|
|
68
|
+
return q.outerBody;
|
|
69
|
+
}
|
|
70
|
+
return `${q.query}{\n.${className}{${q.innerBody}\n}\n}`;
|
|
71
|
+
})
|
|
72
|
+
.join('\n');
|
|
73
|
+
css = trimByLine(css) + '\n\n';
|
|
74
|
+
(0, addCss_js_1.addCss)(css);
|
|
75
|
+
}
|
|
76
|
+
return className;
|
|
77
|
+
}
|
|
78
|
+
exports.createClass = createClass;
|
|
79
|
+
/** Breakpoints like chakra */
|
|
80
|
+
createClass.breakPoints = ['30em', '48em', '62em', '80em', '96em'];
|
|
81
|
+
createClass.count = 0;
|
|
82
|
+
createClass.history = new Map();
|
|
11
83
|
/** delete css comments **/
|
|
12
84
|
function deleteComments(css) {
|
|
13
85
|
return css.replace(/{\/\*[\s\S]*?(?=\*\/})\*\/}/gm, '');
|
|
@@ -35,7 +107,7 @@ function expandArrayValues(css) {
|
|
|
35
107
|
if (i === 0) {
|
|
36
108
|
return `${prop}: ${val};`;
|
|
37
109
|
}
|
|
38
|
-
return `@media (min-width: ${
|
|
110
|
+
return `@media (min-width: ${createClass.breakPoints[i - 1]}) { ${prop}: ${val}; }`;
|
|
39
111
|
})
|
|
40
112
|
.join('\n');
|
|
41
113
|
}
|
|
@@ -43,48 +115,6 @@ function expandArrayValues(css) {
|
|
|
43
115
|
})
|
|
44
116
|
.join('\n');
|
|
45
117
|
}
|
|
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
118
|
/** Find @keyframes, @media, @container queries in css **/
|
|
89
119
|
function findQueries(css) {
|
|
90
120
|
const queries = [];
|
|
@@ -120,95 +150,11 @@ function findQueries(css) {
|
|
|
120
150
|
return queries;
|
|
121
151
|
}
|
|
122
152
|
/** Trims whitespace for every line */
|
|
123
|
-
function
|
|
153
|
+
function trimByLine(css) {
|
|
124
154
|
return css
|
|
125
155
|
.split('\n')
|
|
126
156
|
.map(l => l.trim())
|
|
127
157
|
.filter(l => l)
|
|
128
158
|
.join('\n');
|
|
129
159
|
}
|
|
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
160
|
//# sourceMappingURL=createClass.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createClass.js","sourceRoot":"","sources":["../src/createClass.ts"],"names":[],"mappings":"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"}
|