@praxisjs/css 0.3.4 → 0.3.6
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/CHANGELOG.md +31 -0
- package/dist/builder/css-builder.d.ts.map +1 -1
- package/dist/builder/css-builder.js +68 -74
- package/dist/builder/css-builder.js.map +1 -1
- package/dist/builder/keyframes.d.ts +5 -0
- package/dist/builder/keyframes.d.ts.map +1 -1
- package/dist/builder/keyframes.js +12 -14
- package/dist/builder/keyframes.js.map +1 -1
- package/dist/cx.d.ts.map +1 -1
- package/dist/cx.js +23 -18
- package/dist/cx.js.map +1 -1
- package/dist/decorators/param.d.ts +1 -2
- package/dist/decorators/param.d.ts.map +1 -1
- package/dist/decorators/param.js +9 -17
- package/dist/decorators/param.js.map +1 -1
- package/dist/decorators/style.d.ts.map +1 -1
- package/dist/decorators/style.js +61 -33
- package/dist/decorators/style.js.map +1 -1
- package/dist/decorators/styled.d.ts.map +1 -1
- package/dist/decorators/styled.js +112 -95
- package/dist/decorators/styled.js.map +1 -1
- package/dist/extract.d.ts.map +1 -1
- package/dist/extract.js +19 -35
- package/dist/extract.js.map +1 -1
- package/dist/global.d.ts +3 -0
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +9 -4
- package/dist/global.js.map +1 -1
- package/dist/internal/kebab.d.ts +5 -0
- package/dist/internal/kebab.d.ts.map +1 -0
- package/dist/internal/kebab.js +23 -0
- package/dist/internal/kebab.js.map +1 -0
- package/dist/internal/lifecycle.d.ts +15 -0
- package/dist/internal/lifecycle.d.ts.map +1 -0
- package/dist/internal/lifecycle.js +16 -0
- package/dist/internal/lifecycle.js.map +1 -0
- package/dist/internal/registry.d.ts +5 -1
- package/dist/internal/registry.d.ts.map +1 -1
- package/dist/internal/registry.js +9 -23
- package/dist/internal/registry.js.map +1 -1
- package/dist/internal/sheet.d.ts +20 -0
- package/dist/internal/sheet.d.ts.map +1 -0
- package/dist/internal/sheet.js +56 -0
- package/dist/internal/sheet.js.map +1 -0
- package/dist/internal/static-mode.d.ts +2 -0
- package/dist/internal/static-mode.d.ts.map +1 -0
- package/dist/internal/static-mode.js +2 -0
- package/dist/internal/static-mode.js.map +1 -0
- package/dist/preflight.d.ts +3 -1
- package/dist/preflight.d.ts.map +1 -1
- package/dist/preflight.js +7 -3
- package/dist/preflight.js.map +1 -1
- package/dist/tokens/decorators.d.ts.map +1 -1
- package/dist/tokens/decorators.js +13 -4
- package/dist/tokens/decorators.js.map +1 -1
- package/dist/tokens/theme-instance.d.ts +5 -0
- package/dist/tokens/theme-instance.d.ts.map +1 -1
- package/dist/tokens/theme-instance.js +25 -17
- package/dist/tokens/theme-instance.js.map +1 -1
- package/dist/tokens/token-sheet.d.ts.map +1 -1
- package/dist/tokens/token-sheet.js +12 -9
- package/dist/tokens/token-sheet.js.map +1 -1
- package/package.json +13 -5
- package/src/builder/css-builder.ts +79 -83
- package/src/builder/keyframes.ts +12 -20
- package/src/cx.ts +20 -13
- package/src/decorators/param.ts +12 -16
- package/src/decorators/style.ts +79 -35
- package/src/decorators/styled.ts +127 -111
- package/src/extract.ts +18 -34
- package/src/global.ts +10 -9
- package/src/internal/kebab.ts +23 -0
- package/src/internal/lifecycle.ts +21 -0
- package/src/internal/registry.ts +9 -35
- package/src/internal/sheet.ts +71 -0
- package/src/internal/static-mode.ts +6 -0
- package/src/preflight.ts +8 -3
- package/src/tokens/decorators.ts +15 -3
- package/src/tokens/theme-instance.ts +26 -16
- package/src/tokens/token-sheet.ts +12 -12
- package/dist/__tests__/css-builder.test.d.ts +0 -2
- package/dist/__tests__/css-builder.test.d.ts.map +0 -1
- package/dist/__tests__/css-builder.test.js +0 -198
- package/dist/__tests__/css-builder.test.js.map +0 -1
- package/dist/__tests__/cx.test.d.ts +0 -2
- package/dist/__tests__/cx.test.d.ts.map +0 -1
- package/dist/__tests__/cx.test.js +0 -47
- package/dist/__tests__/cx.test.js.map +0 -1
- package/dist/__tests__/decorators.test.d.ts +0 -2
- package/dist/__tests__/decorators.test.d.ts.map +0 -1
- package/dist/__tests__/decorators.test.js +0 -264
- package/dist/__tests__/decorators.test.js.map +0 -1
- package/dist/__tests__/extract.test.d.ts +0 -2
- package/dist/__tests__/extract.test.d.ts.map +0 -1
- package/dist/__tests__/extract.test.js +0 -416
- package/dist/__tests__/extract.test.js.map +0 -1
- package/dist/__tests__/global.test.d.ts +0 -2
- package/dist/__tests__/global.test.d.ts.map +0 -1
- package/dist/__tests__/global.test.js +0 -136
- package/dist/__tests__/global.test.js.map +0 -1
- package/dist/__tests__/keyframes.test.d.ts +0 -2
- package/dist/__tests__/keyframes.test.d.ts.map +0 -1
- package/dist/__tests__/keyframes.test.js +0 -90
- package/dist/__tests__/keyframes.test.js.map +0 -1
- package/dist/__tests__/preflight.test.d.ts +0 -2
- package/dist/__tests__/preflight.test.d.ts.map +0 -1
- package/dist/__tests__/preflight.test.js +0 -74
- package/dist/__tests__/preflight.test.js.map +0 -1
- package/dist/__tests__/registry.test.d.ts +0 -2
- package/dist/__tests__/registry.test.d.ts.map +0 -1
- package/dist/__tests__/registry.test.js +0 -132
- package/dist/__tests__/registry.test.js.map +0 -1
- package/dist/__tests__/style.test.d.ts +0 -2
- package/dist/__tests__/style.test.d.ts.map +0 -1
- package/dist/__tests__/style.test.js +0 -281
- package/dist/__tests__/style.test.js.map +0 -1
- package/dist/__tests__/styled.test.d.ts +0 -2
- package/dist/__tests__/styled.test.d.ts.map +0 -1
- package/dist/__tests__/styled.test.js +0 -904
- package/dist/__tests__/styled.test.js.map +0 -1
- package/dist/__tests__/theme-instance.test.d.ts +0 -2
- package/dist/__tests__/theme-instance.test.d.ts.map +0 -1
- package/dist/__tests__/theme-instance.test.js +0 -309
- package/dist/__tests__/theme-instance.test.js.map +0 -1
- package/dist/__tests__/theme-uninit.test.d.ts +0 -2
- package/dist/__tests__/theme-uninit.test.d.ts.map +0 -1
- package/dist/__tests__/theme-uninit.test.js +0 -10
- package/dist/__tests__/theme-uninit.test.js.map +0 -1
- package/dist/__tests__/token-sheet.test.d.ts +0 -2
- package/dist/__tests__/token-sheet.test.d.ts.map +0 -1
- package/dist/__tests__/token-sheet.test.js +0 -74
- package/dist/__tests__/token-sheet.test.js.map +0 -1
- package/src/__tests__/css-builder.test.ts +0 -230
- package/src/__tests__/cx.test.ts +0 -63
- package/src/__tests__/decorators.test.ts +0 -127
- package/src/__tests__/extract.test.ts +0 -459
- package/src/__tests__/global.test.ts +0 -163
- package/src/__tests__/keyframes.test.ts +0 -103
- package/src/__tests__/preflight.test.ts +0 -85
- package/src/__tests__/registry.test.ts +0 -151
- package/src/__tests__/style.test.ts +0 -170
- package/src/__tests__/styled.test.ts +0 -443
- package/src/__tests__/theme-instance.test.ts +0 -374
- package/src/__tests__/theme-uninit.test.ts +0 -12
- package/src/__tests__/token-sheet.test.ts +0 -87
- package/tsconfig.json +0 -8
|
@@ -1,45 +1,50 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const paramNames = getParamNames(StyleClass);
|
|
15
|
-
const classMap = {};
|
|
16
|
-
const blocks = [];
|
|
17
|
-
const paramDefaults = {};
|
|
18
|
-
for (const [key, value] of Object.entries(template)) {
|
|
19
|
-
if (key.startsWith("$")) {
|
|
20
|
-
// Accept plain strings or fluent CSSBuilder values.
|
|
21
|
-
const css = typeof value === "string" ? value : isCSSBuilder(value) ? String(value) : null;
|
|
22
|
-
if (css !== null) {
|
|
23
|
-
const safeName = key.slice(1).replace(/[^\w-]/g, "-");
|
|
24
|
-
const className = `prx-${safeName}-${hashCSS(css)}`;
|
|
25
|
-
classMap[key] = className;
|
|
26
|
-
blocks.push(`.${className} { ${css.trim()} }`);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
else if (paramNames.has(key) && (typeof value === "string" || typeof value === "number")) {
|
|
30
|
-
paramDefaults[key] = value;
|
|
1
|
+
import { createEffect, disposeEffect, getComponentAnchor, readSignal, SignalNode, writeSignal, } from "@praxisjs/core/internal";
|
|
2
|
+
import { assertFieldContext } from "@praxisjs/decorators";
|
|
3
|
+
import { HookedField } from "../internal/lifecycle.js";
|
|
4
|
+
import { injectStyle } from "../internal/registry.js";
|
|
5
|
+
import { compileSheet } from "../internal/sheet.js";
|
|
6
|
+
const PARAMS = Symbol("praxis.styled.params");
|
|
7
|
+
// One class per stylesheet: the class names and the @Param() accessors live on its prototype,
|
|
8
|
+
// so an instance is a single slot holding its signal nodes.
|
|
9
|
+
function createParamSheetClass(sheet) {
|
|
10
|
+
class Sheet {
|
|
11
|
+
[PARAMS];
|
|
12
|
+
constructor(nodes) {
|
|
13
|
+
this[PARAMS] = nodes;
|
|
31
14
|
}
|
|
32
15
|
}
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
16
|
+
const proto = Sheet.prototype;
|
|
17
|
+
for (const key in sheet.classMap) {
|
|
18
|
+
Object.defineProperty(proto, key, { value: sheet.classMap[key], writable: true, enumerable: true, configurable: true });
|
|
19
|
+
}
|
|
20
|
+
sheet.params.forEach((param, i) => {
|
|
21
|
+
Object.defineProperty(proto, param, {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
configurable: true,
|
|
24
|
+
get() {
|
|
25
|
+
return readSignal(this[PARAMS][i]);
|
|
26
|
+
},
|
|
27
|
+
set(value) {
|
|
28
|
+
writeSignal(this[PARAMS][i], value);
|
|
29
|
+
},
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
return Sheet;
|
|
33
|
+
}
|
|
34
|
+
class ParamField extends HookedField {
|
|
35
|
+
nodes;
|
|
36
|
+
sheet;
|
|
37
|
+
effects = undefined;
|
|
38
|
+
el = undefined;
|
|
39
|
+
constructor(instance, Sheet, defaults) {
|
|
40
|
+
super(instance);
|
|
41
|
+
const nodes = new Array(defaults.length);
|
|
42
|
+
for (let i = 0; i < defaults.length; i++)
|
|
43
|
+
nodes[i] = new SignalNode(defaults[i]);
|
|
44
|
+
this.nodes = nodes;
|
|
45
|
+
this.sheet = new Sheet(nodes);
|
|
46
|
+
}
|
|
41
47
|
}
|
|
42
|
-
// ─── @Styled field decorator ──────────────────────────────────────────────────
|
|
43
48
|
/**
|
|
44
49
|
* Scoped CSS field decorator. Receives a {@link Stylesheet} or
|
|
45
50
|
* {@link ReactiveStylesheet} subclass and builds a stylesheet object with:
|
|
@@ -74,65 +79,77 @@ function getStyleClassData(StyleClass) {
|
|
|
74
79
|
* }
|
|
75
80
|
*/
|
|
76
81
|
export function Styled(StyleClass) {
|
|
77
|
-
const
|
|
82
|
+
const sheet = compileSheet(StyleClass);
|
|
83
|
+
const { css, key } = sheet;
|
|
78
84
|
// Eagerly inject CSS at decoration time (module load) so it is in the DOM
|
|
79
85
|
// before any component mounts — avoids layout-measurement timing issues.
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
get() { return sig(); },
|
|
96
|
-
set(v) { sig.set(v); },
|
|
97
|
-
enumerable: true,
|
|
98
|
-
configurable: true,
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
let stopFns = [];
|
|
102
|
-
return {
|
|
103
|
-
descriptor: { value: stylesheetObj, writable: false },
|
|
104
|
-
onMount() {
|
|
105
|
-
// Increment ref-count for this instance (base ref injected at decoration time).
|
|
106
|
-
if (data.rawCSS)
|
|
107
|
-
injectStyle(data.registryKey, data.rawCSS);
|
|
108
|
-
if (hasParams) {
|
|
109
|
-
const el = getComponentAnchor(instance)?.parentElement;
|
|
110
|
-
if (el) {
|
|
111
|
-
for (const [paramName, sig] of Object.entries(paramSignals)) {
|
|
112
|
-
stopFns.push(effect(() => {
|
|
113
|
-
el.style.setProperty(`--${paramName}`, String(sig()));
|
|
114
|
-
}));
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
},
|
|
119
|
-
onUnmount() {
|
|
120
|
-
if (data.rawCSS)
|
|
121
|
-
releaseStyle(data.registryKey);
|
|
122
|
-
for (const stop of stopFns)
|
|
123
|
-
stop();
|
|
124
|
-
stopFns = [];
|
|
125
|
-
if (hasParams) {
|
|
126
|
-
const el = getComponentAnchor(instance)?.parentElement;
|
|
127
|
-
if (el) {
|
|
128
|
-
for (const paramName of Object.keys(paramSignals)) {
|
|
129
|
-
el.style.removeProperty(`--${paramName}`);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
},
|
|
86
|
+
if (css)
|
|
87
|
+
injectStyle(key, css);
|
|
88
|
+
// Both paths return the field's value from its initializer, which is much cheaper than redefining
|
|
89
|
+
// the field with Object.defineProperty on every new instance. Each instance also re-checks the
|
|
90
|
+
// stylesheet (cheap when present): it is collected again during a server render, and put back
|
|
91
|
+
// if its <style> was removed.
|
|
92
|
+
if (sheet.params.length === 0) {
|
|
93
|
+
// The same frozen class map for every instance: no per-instance object, signals or hooks.
|
|
94
|
+
const { classMap } = sheet;
|
|
95
|
+
return ((_value, context) => {
|
|
96
|
+
assertFieldContext(context);
|
|
97
|
+
return () => {
|
|
98
|
+
if (css)
|
|
99
|
+
injectStyle(key, css);
|
|
100
|
+
return classMap;
|
|
134
101
|
};
|
|
135
|
-
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
const Sheet = createParamSheetClass(sheet);
|
|
105
|
+
const { defaults } = sheet;
|
|
106
|
+
const vars = sheet.params.map((param) => `--${param}`);
|
|
107
|
+
return ((_value, context) => {
|
|
108
|
+
assertFieldContext(context);
|
|
109
|
+
const name = context.name;
|
|
110
|
+
const slot = Symbol(`praxis.styled.${String(name)}`);
|
|
111
|
+
function onMount() {
|
|
112
|
+
const field = this[slot];
|
|
113
|
+
field.prevMount?.call(this);
|
|
114
|
+
const el = getComponentAnchor(this)?.parentElement;
|
|
115
|
+
if (!el)
|
|
116
|
+
return;
|
|
117
|
+
const effects = [];
|
|
118
|
+
for (let i = 0; i < vars.length; i++) {
|
|
119
|
+
const node = field.nodes[i];
|
|
120
|
+
const prop = vars[i];
|
|
121
|
+
effects.push(createEffect(() => {
|
|
122
|
+
el.style.setProperty(prop, String(readSignal(node)));
|
|
123
|
+
}));
|
|
124
|
+
}
|
|
125
|
+
field.el = el;
|
|
126
|
+
field.effects = effects;
|
|
127
|
+
}
|
|
128
|
+
function onUnmount() {
|
|
129
|
+
const field = this[slot];
|
|
130
|
+
field.prevUnmount?.call(this);
|
|
131
|
+
const { effects, el } = field;
|
|
132
|
+
if (effects) {
|
|
133
|
+
for (const effect of effects)
|
|
134
|
+
disposeEffect(effect);
|
|
135
|
+
field.effects = undefined;
|
|
136
|
+
}
|
|
137
|
+
// The element the vars were set on, even if the anchor has been detached by now.
|
|
138
|
+
if (el) {
|
|
139
|
+
for (const prop of vars)
|
|
140
|
+
el.style.removeProperty(prop);
|
|
141
|
+
field.el = undefined;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return function () {
|
|
145
|
+
if (css)
|
|
146
|
+
injectStyle(key, css);
|
|
147
|
+
const field = new ParamField(this, Sheet, defaults);
|
|
148
|
+
this[slot] = field;
|
|
149
|
+
this.onMount = onMount;
|
|
150
|
+
this.onUnmount = onUnmount;
|
|
151
|
+
return field.sheet;
|
|
152
|
+
};
|
|
136
153
|
});
|
|
137
154
|
}
|
|
138
155
|
//# sourceMappingURL=styled.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styled.js","sourceRoot":"","sources":["../../src/decorators/styled.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"styled.js","sourceRoot":"","sources":["../../src/decorators/styled.ts"],"names":[],"mappings":"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"}
|
package/dist/extract.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAyB9D;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuEtE"}
|
package/dist/extract.js
CHANGED
|
@@ -1,19 +1,17 @@
|
|
|
1
1
|
import { Stylesheet, ReactiveStylesheet } from "./base/stylesheet.js";
|
|
2
|
-
import {
|
|
2
|
+
import { createCSSBuilder } from "./builder/css-builder.js";
|
|
3
|
+
import { keyframesRule } from "./builder/keyframes.js";
|
|
4
|
+
import { globalCSS } from "./global.js";
|
|
3
5
|
import { hashCSS } from "./internal/hash.js";
|
|
6
|
+
import { compileSheet } from "./internal/sheet.js";
|
|
7
|
+
import { preflightCSS } from "./preflight.js";
|
|
8
|
+
import { instanceToVars, varsToCSS } from "./tokens/theme-instance.js";
|
|
4
9
|
import { TokenSheet, tokenVars } from "./tokens/token-sheet.js";
|
|
5
10
|
// ─── Helpers ──────────────────────────────────────────────────────────────────
|
|
6
|
-
function camelToKebab(s) {
|
|
7
|
-
return s.replace(/([A-Z])/g, "-$1").toLowerCase();
|
|
8
|
-
}
|
|
9
11
|
function themeToRootCSS(ThemeClass) {
|
|
10
12
|
try {
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
.filter(([, v]) => typeof v === "string" || typeof v === "number")
|
|
14
|
-
.map(([k, v]) => ` --${camelToKebab(k)}: ${String(v)};`)
|
|
15
|
-
.join("\n");
|
|
16
|
-
return vars ? `:root {\n${vars}\n}` : null;
|
|
13
|
+
const vars = instanceToVars(new ThemeClass());
|
|
14
|
+
return Object.keys(vars).length > 0 ? varsToCSS(vars) : null;
|
|
17
15
|
}
|
|
18
16
|
catch {
|
|
19
17
|
return null;
|
|
@@ -21,19 +19,9 @@ function themeToRootCSS(ThemeClass) {
|
|
|
21
19
|
}
|
|
22
20
|
function collectSheetCSS(SheetClass, emit) {
|
|
23
21
|
try {
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
if (!k.startsWith("$"))
|
|
28
|
-
continue;
|
|
29
|
-
const css = typeof v === "string" ? v : (isCSSBuilder(v) ? String(v) : null);
|
|
30
|
-
if (!css)
|
|
31
|
-
continue;
|
|
32
|
-
const name = k.slice(1).replace(/[^\w-]/g, "-");
|
|
33
|
-
blocks.push(`.prx-${name}-${hashCSS(css)} { ${css.trim()} }`);
|
|
34
|
-
}
|
|
35
|
-
if (blocks.length)
|
|
36
|
-
emit(blocks.join("\n"));
|
|
22
|
+
const { css } = compileSheet(SheetClass);
|
|
23
|
+
if (css)
|
|
24
|
+
emit(css);
|
|
37
25
|
}
|
|
38
26
|
catch { /* skip sheets that can't be instantiated at build time */ }
|
|
39
27
|
}
|
|
@@ -107,19 +95,15 @@ export function extractionModule(emit) {
|
|
|
107
95
|
Style: () => () => { },
|
|
108
96
|
cx: () => "",
|
|
109
97
|
keyframes: (name, stops) => {
|
|
110
|
-
const
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
.join("\n");
|
|
117
|
-
const sn = `prx-${name}-${hashCSS(body)}`;
|
|
118
|
-
dedupEmit(`@keyframes ${sn} {\n${body}\n}`);
|
|
119
|
-
return sn;
|
|
98
|
+
const rule = keyframesRule(name, stops);
|
|
99
|
+
dedupEmit(rule.css);
|
|
100
|
+
return rule.name;
|
|
101
|
+
},
|
|
102
|
+
globalStyle: (factory, options) => {
|
|
103
|
+
dedupEmit(globalCSS(factory, options));
|
|
120
104
|
},
|
|
121
|
-
|
|
122
|
-
dedupEmit(
|
|
105
|
+
preflight: (options) => {
|
|
106
|
+
dedupEmit(preflightCSS(options));
|
|
123
107
|
},
|
|
124
108
|
};
|
|
125
109
|
}
|
package/dist/extract.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"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"}
|
package/dist/global.d.ts
CHANGED
|
@@ -10,6 +10,8 @@ export interface GlobalStyleOptions {
|
|
|
10
10
|
*/
|
|
11
11
|
layer?: string | false;
|
|
12
12
|
}
|
|
13
|
+
/** The CSS a `globalStyle()` call injects — shared with build-time extraction. */
|
|
14
|
+
export declare function globalCSS(factory: GlobalStyleFactory, { layer }?: GlobalStyleOptions): string;
|
|
13
15
|
/**
|
|
14
16
|
* Injects unscoped CSS into `<head>` exactly once.
|
|
15
17
|
*
|
|
@@ -37,4 +39,5 @@ export interface GlobalStyleOptions {
|
|
|
37
39
|
* globalStyle(_css => `body { font-family: system-ui; }`, { layer: 'base' })
|
|
38
40
|
*/
|
|
39
41
|
export declare function globalStyle(factory: GlobalStyleFactory, options?: GlobalStyleOptions): void;
|
|
42
|
+
export declare function injectGlobalCSS(css: string): void;
|
|
40
43
|
//# sourceMappingURL=global.d.ts.map
|
package/dist/global.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global.d.ts","sourceRoot":"","sources":["../src/global.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"global.d.ts","sourceRoot":"","sources":["../src/global.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAOjG,gHAAgH;AAChH,MAAM,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,UAAU,KAAK,UAAU,GAAG,MAAM,CAAC;AAEpG,MAAM,WAAW,kBAAkB;IACjC;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CACxB;AAID,kFAAkF;AAClF,wBAAgB,SAAS,CAAC,OAAO,EAAE,kBAAkB,EAAE,EAAE,KAAK,EAAE,GAAE,kBAAuB,GAAG,MAAM,CAGjG;AAID;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,EAAE,OAAO,GAAE,kBAAuB,GAAG,IAAI,CAE/F;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAgBjD"}
|
package/dist/global.js
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { createCSSBuilder } from "./builder/css-builder.js";
|
|
2
2
|
import { getCollector } from "./internal/collector.js";
|
|
3
3
|
import { hashCSS } from "./internal/hash.js";
|
|
4
|
-
|
|
4
|
+
import { STATIC_MODE } from "./internal/static-mode.js";
|
|
5
5
|
const injected = new Set();
|
|
6
|
+
/** The CSS a `globalStyle()` call injects — shared with build-time extraction. */
|
|
7
|
+
export function globalCSS(factory, { layer } = {}) {
|
|
8
|
+
const rawCSS = String(factory(createCSSBuilder));
|
|
9
|
+
return layer ? `@layer ${layer} {\n${rawCSS}\n}` : rawCSS;
|
|
10
|
+
}
|
|
6
11
|
// ─── globalStyle ─────────────────────────────────────────────────────────────
|
|
7
12
|
/**
|
|
8
13
|
* Injects unscoped CSS into `<head>` exactly once.
|
|
@@ -31,9 +36,9 @@ const injected = new Set();
|
|
|
31
36
|
* globalStyle(_css => `body { font-family: system-ui; }`, { layer: 'base' })
|
|
32
37
|
*/
|
|
33
38
|
export function globalStyle(factory, options = {}) {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
39
|
+
injectGlobalCSS(globalCSS(factory, options));
|
|
40
|
+
}
|
|
41
|
+
export function injectGlobalCSS(css) {
|
|
37
42
|
const key = hashCSS(css);
|
|
38
43
|
if (injected.has(key))
|
|
39
44
|
return;
|
package/dist/global.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global.js","sourceRoot":"","sources":["../src/global.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAuC,MAAM,0BAA0B,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"global.js","sourceRoot":"","sources":["../src/global.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAuC,MAAM,0BAA0B,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAiBxD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;AAEnC,kFAAkF;AAClF,MAAM,UAAU,SAAS,CAAC,OAA2B,EAAE,EAAE,KAAK,KAAyB,EAAE;IACvF,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AAC5D,CAAC;AAED,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,WAAW,CAAC,OAA2B,EAAE,UAA8B,EAAE;IACvF,eAAe,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACzB,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO;IAC9B,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAElB,IAAI,WAAW;QAAE,OAAO;IAExB,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,IAAI,GAAG,EAAE,CAAC;QAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IAE1C,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO;IAE5C,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC3C,EAAE,CAAC,YAAY,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC;IAC3C,EAAE,CAAC,WAAW,GAAG,GAAG,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** `backgroundColor` → `background-color`. Memoized: the same few hundred property and token names repeat. */
|
|
2
|
+
export declare function toKebab(camel: string): string;
|
|
3
|
+
/** One `prop: value;` line per defined entry, each prefixed with `indent`. */
|
|
4
|
+
export declare function declarations(props: Readonly<Record<string, string | number | null | undefined>>, indent: string): string;
|
|
5
|
+
//# sourceMappingURL=kebab.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kebab.d.ts","sourceRoot":"","sources":["../../src/internal/kebab.ts"],"names":[],"mappings":"AAEA,8GAA8G;AAC9G,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO7C;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CASxH"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const cache = new Map();
|
|
2
|
+
/** `backgroundColor` → `background-color`. Memoized: the same few hundred property and token names repeat. */
|
|
3
|
+
export function toKebab(camel) {
|
|
4
|
+
let kebab = cache.get(camel);
|
|
5
|
+
if (kebab === undefined) {
|
|
6
|
+
kebab = camel.replace(/([A-Z])/g, "-$1").toLowerCase();
|
|
7
|
+
cache.set(camel, kebab);
|
|
8
|
+
}
|
|
9
|
+
return kebab;
|
|
10
|
+
}
|
|
11
|
+
/** One `prop: value;` line per defined entry, each prefixed with `indent`. */
|
|
12
|
+
export function declarations(props, indent) {
|
|
13
|
+
let out = "";
|
|
14
|
+
for (const key in props) {
|
|
15
|
+
const value = props[key];
|
|
16
|
+
if (value == null)
|
|
17
|
+
continue;
|
|
18
|
+
const line = `${indent}${toKebab(key)}: ${String(value)};`;
|
|
19
|
+
out = out === "" ? line : `${out}\n${line}`;
|
|
20
|
+
}
|
|
21
|
+
return out;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=kebab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kebab.js","sourceRoot":"","sources":["../../src/internal/kebab.ts"],"names":[],"mappings":"AAAA,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;AAExC,8GAA8G;AAC9G,MAAM,UAAU,OAAO,CAAC,KAAa;IACnC,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;QACvD,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,YAAY,CAAC,KAAmE,EAAE,MAAc;IAC9G,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,KAAK,IAAI,IAAI;YAAE,SAAS;QAC5B,MAAM,IAAI,GAAG,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;QAC3D,GAAG,GAAG,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,IAAI,EAAE,CAAC;IAC9C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface LifecycleHost {
|
|
2
|
+
onMount?(): void;
|
|
3
|
+
onUnmount?(): void;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Per-instance state of a decorated field that needs mount/unmount hooks. The hooks themselves
|
|
7
|
+
* are shared per decorated field and find this state through a symbol slot, so chaining onto
|
|
8
|
+
* the instance's own `onMount`/`onUnmount` allocates no closures.
|
|
9
|
+
*/
|
|
10
|
+
export declare class HookedField {
|
|
11
|
+
readonly prevMount: (() => void) | undefined;
|
|
12
|
+
readonly prevUnmount: (() => void) | undefined;
|
|
13
|
+
constructor(instance: LifecycleHost);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/internal/lifecycle.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,IAAI,IAAI,CAAC;IACjB,SAAS,CAAC,IAAI,IAAI,CAAC;CACpB;AAED;;;;GAIG;AACH,qBAAa,WAAW;IACtB,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAC7C,QAAQ,CAAC,WAAW,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;gBAEnC,QAAQ,EAAE,aAAa;CAMpC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-instance state of a decorated field that needs mount/unmount hooks. The hooks themselves
|
|
3
|
+
* are shared per decorated field and find this state through a symbol slot, so chaining onto
|
|
4
|
+
* the instance's own `onMount`/`onUnmount` allocates no closures.
|
|
5
|
+
*/
|
|
6
|
+
export class HookedField {
|
|
7
|
+
prevMount;
|
|
8
|
+
prevUnmount;
|
|
9
|
+
constructor(instance) {
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/unbound-method -- called back with `.call(instance)`
|
|
11
|
+
this.prevMount = instance.onMount;
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/unbound-method -- called back with `.call(instance)`
|
|
13
|
+
this.prevUnmount = instance.onUnmount;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/internal/lifecycle.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,MAAM,OAAO,WAAW;IACb,SAAS,CAA2B;IACpC,WAAW,CAA2B;IAE/C,YAAY,QAAuB;QACjC,mGAAmG;QACnG,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC;QAClC,mGAAmG;QACnG,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC;IACxC,CAAC;CACF"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Makes sure the stylesheet `key` is present: collected while a collector is active (server
|
|
3
|
+
* render), appended once to `document.head` otherwise, and appended again if its element was
|
|
4
|
+
* removed from the document. Idempotent, so it is cheap to call for every component instance.
|
|
5
|
+
*/
|
|
1
6
|
export declare function injectStyle(key: string, css: string): void;
|
|
2
|
-
export declare function releaseStyle(key: string): void;
|
|
3
7
|
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/internal/registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/internal/registry.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAc1D"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { getCollector } from "./collector.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
import { STATIC_MODE } from "./static-mode.js";
|
|
3
|
+
const elements = new Map();
|
|
4
|
+
/**
|
|
5
|
+
* Makes sure the stylesheet `key` is present: collected while a collector is active (server
|
|
6
|
+
* render), appended once to `document.head` otherwise, and appended again if its element was
|
|
7
|
+
* removed from the document. Idempotent, so it is cheap to call for every component instance.
|
|
8
|
+
*/
|
|
7
9
|
export function injectStyle(key, css) {
|
|
8
10
|
if (STATIC_MODE)
|
|
9
11
|
return;
|
|
@@ -14,28 +16,12 @@ export function injectStyle(key, css) {
|
|
|
14
16
|
}
|
|
15
17
|
if (typeof document === "undefined")
|
|
16
18
|
return;
|
|
17
|
-
|
|
18
|
-
const existingEl = existing?.ref.deref();
|
|
19
|
-
if (existing && existingEl && document.head.contains(existingEl)) {
|
|
20
|
-
existing.count++;
|
|
19
|
+
if (elements.get(key)?.isConnected)
|
|
21
20
|
return;
|
|
22
|
-
}
|
|
23
21
|
const el = document.createElement("style");
|
|
24
22
|
el.setAttribute("data-praxis-hash", key);
|
|
25
23
|
el.textContent = css;
|
|
26
24
|
document.head.appendChild(el);
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
export function releaseStyle(key) {
|
|
30
|
-
if (STATIC_MODE)
|
|
31
|
-
return;
|
|
32
|
-
const entry = cssRegistry.get(key);
|
|
33
|
-
if (!entry)
|
|
34
|
-
return;
|
|
35
|
-
entry.count--;
|
|
36
|
-
if (entry.count <= 0) {
|
|
37
|
-
entry.ref.deref()?.remove();
|
|
38
|
-
cssRegistry.delete(key);
|
|
39
|
-
}
|
|
25
|
+
elements.set(key, el);
|
|
40
26
|
}
|
|
41
27
|
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/internal/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/internal/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;AAErD;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,GAAW;IAClD,IAAI,WAAW;QAAE,OAAO;IAExB,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,IAAI,GAAG,EAAE,CAAC;QAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAAC,OAAO;IAAC,CAAC;IAE1C,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO;IAC5C,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,WAAW;QAAE,OAAO;IAE3C,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC3C,EAAE,CAAC,YAAY,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;IACzC,EAAE,CAAC,WAAW,GAAG,GAAG,CAAC;IACrB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAC9B,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare function addParamName(ctor: object, name: string): void;
|
|
2
|
+
export declare function getParamNames(ctor: object): ReadonlySet<string> | undefined;
|
|
3
|
+
export interface CompiledSheet {
|
|
4
|
+
/** `$field` → scoped class name. */
|
|
5
|
+
classMap: Readonly<Record<string, string>>;
|
|
6
|
+
/** One `.class { ... }` block per `$` field, or `""` when there is none. */
|
|
7
|
+
css: string;
|
|
8
|
+
/** Content hash of `css`, the key of its `<style>` element. */
|
|
9
|
+
key: string;
|
|
10
|
+
/** `@Param()` field names, in declaration order. */
|
|
11
|
+
params: readonly string[];
|
|
12
|
+
/** Default value of each entry in `params`. */
|
|
13
|
+
defaults: ReadonlyArray<string | number>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Builds the scoped class names and CSS of a `Stylesheet` subclass, once per class: constructing
|
|
17
|
+
* the template instance fires its `@Param()` initializers, which register the param names.
|
|
18
|
+
*/
|
|
19
|
+
export declare function compileSheet(SheetClass: new () => unknown): CompiledSheet;
|
|
20
|
+
//# sourceMappingURL=sheet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sheet.d.ts","sourceRoot":"","sources":["../../src/internal/sheet.ts"],"names":[],"mappings":"AAKA,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAI7D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,SAAS,CAE3E;AAED,MAAM,WAAW,aAAa;IAC5B,oCAAoC;IACpC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3C,4EAA4E;IAC5E,GAAG,EAAE,MAAM,CAAC;IACZ,+DAA+D;IAC/D,GAAG,EAAE,MAAM,CAAC;IACZ,oDAAoD;IACpD,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,+CAA+C;IAC/C,QAAQ,EAAE,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;CAC1C;AAID;;;GAGG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,UAAU,OAAO,GAAG,aAAa,CAoCzE"}
|