@praxisjs/css 0.3.3 → 0.3.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.
Files changed (146) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/builder/css-builder.d.ts.map +1 -1
  3. package/dist/builder/css-builder.js +68 -74
  4. package/dist/builder/css-builder.js.map +1 -1
  5. package/dist/builder/keyframes.d.ts +5 -0
  6. package/dist/builder/keyframes.d.ts.map +1 -1
  7. package/dist/builder/keyframes.js +12 -14
  8. package/dist/builder/keyframes.js.map +1 -1
  9. package/dist/cx.d.ts.map +1 -1
  10. package/dist/cx.js +23 -18
  11. package/dist/cx.js.map +1 -1
  12. package/dist/decorators/param.d.ts +1 -2
  13. package/dist/decorators/param.d.ts.map +1 -1
  14. package/dist/decorators/param.js +9 -17
  15. package/dist/decorators/param.js.map +1 -1
  16. package/dist/decorators/style.d.ts.map +1 -1
  17. package/dist/decorators/style.js +61 -33
  18. package/dist/decorators/style.js.map +1 -1
  19. package/dist/decorators/styled.d.ts.map +1 -1
  20. package/dist/decorators/styled.js +112 -95
  21. package/dist/decorators/styled.js.map +1 -1
  22. package/dist/extract.d.ts.map +1 -1
  23. package/dist/extract.js +19 -35
  24. package/dist/extract.js.map +1 -1
  25. package/dist/global.d.ts +3 -0
  26. package/dist/global.d.ts.map +1 -1
  27. package/dist/global.js +9 -4
  28. package/dist/global.js.map +1 -1
  29. package/dist/internal/kebab.d.ts +5 -0
  30. package/dist/internal/kebab.d.ts.map +1 -0
  31. package/dist/internal/kebab.js +23 -0
  32. package/dist/internal/kebab.js.map +1 -0
  33. package/dist/internal/lifecycle.d.ts +15 -0
  34. package/dist/internal/lifecycle.d.ts.map +1 -0
  35. package/dist/internal/lifecycle.js +16 -0
  36. package/dist/internal/lifecycle.js.map +1 -0
  37. package/dist/internal/registry.d.ts +5 -1
  38. package/dist/internal/registry.d.ts.map +1 -1
  39. package/dist/internal/registry.js +9 -23
  40. package/dist/internal/registry.js.map +1 -1
  41. package/dist/internal/sheet.d.ts +20 -0
  42. package/dist/internal/sheet.d.ts.map +1 -0
  43. package/dist/internal/sheet.js +56 -0
  44. package/dist/internal/sheet.js.map +1 -0
  45. package/dist/internal/static-mode.d.ts +2 -0
  46. package/dist/internal/static-mode.d.ts.map +1 -0
  47. package/dist/internal/static-mode.js +2 -0
  48. package/dist/internal/static-mode.js.map +1 -0
  49. package/dist/preflight.d.ts +3 -1
  50. package/dist/preflight.d.ts.map +1 -1
  51. package/dist/preflight.js +7 -3
  52. package/dist/preflight.js.map +1 -1
  53. package/dist/tokens/decorators.d.ts.map +1 -1
  54. package/dist/tokens/decorators.js +13 -4
  55. package/dist/tokens/decorators.js.map +1 -1
  56. package/dist/tokens/theme-instance.d.ts +5 -0
  57. package/dist/tokens/theme-instance.d.ts.map +1 -1
  58. package/dist/tokens/theme-instance.js +25 -17
  59. package/dist/tokens/theme-instance.js.map +1 -1
  60. package/dist/tokens/token-sheet.d.ts.map +1 -1
  61. package/dist/tokens/token-sheet.js +12 -9
  62. package/dist/tokens/token-sheet.js.map +1 -1
  63. package/package.json +13 -5
  64. package/src/builder/css-builder.ts +79 -83
  65. package/src/builder/keyframes.ts +12 -20
  66. package/src/cx.ts +20 -13
  67. package/src/decorators/param.ts +12 -16
  68. package/src/decorators/style.ts +79 -35
  69. package/src/decorators/styled.ts +127 -111
  70. package/src/extract.ts +18 -34
  71. package/src/global.ts +10 -9
  72. package/src/internal/kebab.ts +23 -0
  73. package/src/internal/lifecycle.ts +21 -0
  74. package/src/internal/registry.ts +9 -35
  75. package/src/internal/sheet.ts +71 -0
  76. package/src/internal/static-mode.ts +6 -0
  77. package/src/preflight.ts +8 -3
  78. package/src/tokens/decorators.ts +15 -3
  79. package/src/tokens/theme-instance.ts +26 -16
  80. package/src/tokens/token-sheet.ts +12 -12
  81. package/dist/__tests__/css-builder.test.d.ts +0 -2
  82. package/dist/__tests__/css-builder.test.d.ts.map +0 -1
  83. package/dist/__tests__/css-builder.test.js +0 -198
  84. package/dist/__tests__/css-builder.test.js.map +0 -1
  85. package/dist/__tests__/cx.test.d.ts +0 -2
  86. package/dist/__tests__/cx.test.d.ts.map +0 -1
  87. package/dist/__tests__/cx.test.js +0 -47
  88. package/dist/__tests__/cx.test.js.map +0 -1
  89. package/dist/__tests__/decorators.test.d.ts +0 -2
  90. package/dist/__tests__/decorators.test.d.ts.map +0 -1
  91. package/dist/__tests__/decorators.test.js +0 -264
  92. package/dist/__tests__/decorators.test.js.map +0 -1
  93. package/dist/__tests__/extract.test.d.ts +0 -2
  94. package/dist/__tests__/extract.test.d.ts.map +0 -1
  95. package/dist/__tests__/extract.test.js +0 -416
  96. package/dist/__tests__/extract.test.js.map +0 -1
  97. package/dist/__tests__/global.test.d.ts +0 -2
  98. package/dist/__tests__/global.test.d.ts.map +0 -1
  99. package/dist/__tests__/global.test.js +0 -136
  100. package/dist/__tests__/global.test.js.map +0 -1
  101. package/dist/__tests__/keyframes.test.d.ts +0 -2
  102. package/dist/__tests__/keyframes.test.d.ts.map +0 -1
  103. package/dist/__tests__/keyframes.test.js +0 -90
  104. package/dist/__tests__/keyframes.test.js.map +0 -1
  105. package/dist/__tests__/preflight.test.d.ts +0 -2
  106. package/dist/__tests__/preflight.test.d.ts.map +0 -1
  107. package/dist/__tests__/preflight.test.js +0 -74
  108. package/dist/__tests__/preflight.test.js.map +0 -1
  109. package/dist/__tests__/registry.test.d.ts +0 -2
  110. package/dist/__tests__/registry.test.d.ts.map +0 -1
  111. package/dist/__tests__/registry.test.js +0 -132
  112. package/dist/__tests__/registry.test.js.map +0 -1
  113. package/dist/__tests__/style.test.d.ts +0 -2
  114. package/dist/__tests__/style.test.d.ts.map +0 -1
  115. package/dist/__tests__/style.test.js +0 -281
  116. package/dist/__tests__/style.test.js.map +0 -1
  117. package/dist/__tests__/styled.test.d.ts +0 -2
  118. package/dist/__tests__/styled.test.d.ts.map +0 -1
  119. package/dist/__tests__/styled.test.js +0 -904
  120. package/dist/__tests__/styled.test.js.map +0 -1
  121. package/dist/__tests__/theme-instance.test.d.ts +0 -2
  122. package/dist/__tests__/theme-instance.test.d.ts.map +0 -1
  123. package/dist/__tests__/theme-instance.test.js +0 -309
  124. package/dist/__tests__/theme-instance.test.js.map +0 -1
  125. package/dist/__tests__/theme-uninit.test.d.ts +0 -2
  126. package/dist/__tests__/theme-uninit.test.d.ts.map +0 -1
  127. package/dist/__tests__/theme-uninit.test.js +0 -10
  128. package/dist/__tests__/theme-uninit.test.js.map +0 -1
  129. package/dist/__tests__/token-sheet.test.d.ts +0 -2
  130. package/dist/__tests__/token-sheet.test.d.ts.map +0 -1
  131. package/dist/__tests__/token-sheet.test.js +0 -74
  132. package/dist/__tests__/token-sheet.test.js.map +0 -1
  133. package/src/__tests__/css-builder.test.ts +0 -230
  134. package/src/__tests__/cx.test.ts +0 -63
  135. package/src/__tests__/decorators.test.ts +0 -127
  136. package/src/__tests__/extract.test.ts +0 -459
  137. package/src/__tests__/global.test.ts +0 -163
  138. package/src/__tests__/keyframes.test.ts +0 -103
  139. package/src/__tests__/preflight.test.ts +0 -85
  140. package/src/__tests__/registry.test.ts +0 -151
  141. package/src/__tests__/style.test.ts +0 -170
  142. package/src/__tests__/styled.test.ts +0 -443
  143. package/src/__tests__/theme-instance.test.ts +0 -374
  144. package/src/__tests__/theme-uninit.test.ts +0 -12
  145. package/src/__tests__/token-sheet.test.ts +0 -87
  146. package/tsconfig.json +0 -8
@@ -1,45 +1,50 @@
1
- import { effect, getComponentAnchor, signal } from "@praxisjs/core/internal";
2
- import { createFieldDecorator } from "@praxisjs/decorators";
3
- import { getParamNames } from "./param.js";
4
- import { isCSSBuilder } from "../builder/css-builder.js";
5
- import { hashCSS } from "../internal/hash.js";
6
- import { injectStyle, releaseStyle } from "../internal/registry.js";
7
- const styleClassCache = new Map();
8
- function getStyleClassData(StyleClass) {
9
- const cached = styleClassCache.get(StyleClass);
10
- if (cached)
11
- return cached;
12
- // Constructing the template fires @Param() addInitializers, populating PARAM_META.
13
- const template = new StyleClass();
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 data = {
34
- classMap: Object.freeze(classMap),
35
- rawCSS: blocks.join("\n"),
36
- registryKey: blocks.length ? hashCSS(blocks.join("\n")) : "",
37
- paramDefaults: Object.freeze(paramDefaults),
38
- };
39
- styleClassCache.set(StyleClass, data);
40
- return data;
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 data = getStyleClassData(StyleClass);
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
- // The per-instance onMount/onUnmount still manage the ref count on top of
81
- // this base reference, which intentionally stays for the page lifetime.
82
- if (data.rawCSS)
83
- injectStyle(data.registryKey, data.rawCSS);
84
- return createFieldDecorator({
85
- bind(instance) {
86
- const paramSignals = {};
87
- const hasParams = Object.keys(data.paramDefaults).length > 0;
88
- const stylesheetObj = hasParams
89
- ? { ...data.classMap }
90
- : data.classMap;
91
- for (const [paramName, defaultVal] of Object.entries(data.paramDefaults)) {
92
- const sig = signal(defaultVal);
93
- paramSignals[paramName] = sig;
94
- Object.defineProperty(stylesheetObj, paramName, {
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":"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"}
1
+ {"version":3,"file":"styled.js","sourceRoot":"","sources":["../../src/decorators/styled.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAyC9D;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA4EtE"}
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 { isCSSBuilder, createCSSBuilder } from "./builder/css-builder.js";
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 inst = new ThemeClass();
12
- const vars = Object.entries(inst)
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 inst = new SheetClass();
25
- const blocks = [];
26
- for (const [k, v] of Object.entries(inst)) {
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 stopToCSS = (p) => Object.entries(p)
111
- .filter(([, v]) => v != null)
112
- .map(([k, v]) => ` ${camelToKebab(k)}: ${String(v)};`)
113
- .join("\n");
114
- const body = Object.entries(stops)
115
- .map(([s, p]) => ` ${s} {\n${stopToCSS(p)}\n }`)
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
- globalStyle: (factory) => {
122
- dedupEmit(String(factory(createCSSBuilder)));
105
+ preflight: (options) => {
106
+ dedupEmit(preflightCSS(options));
123
107
  },
124
108
  };
125
109
  }
@@ -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,YAAY,EAAE,gBAAgB,EAAsB,MAAM,0BAA0B,CAAC;AAC9F,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAShE,iFAAiF;AAEjF,SAAS,YAAY,CAAC,CAAS;IAC7B,OAAO,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;AACpD,CAAC;AAED,SAAS,cAAc,CAAC,UAAgB;IACtC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,UAAU,EAA6B,CAAC;QACzD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;aAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC;aACjE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;aACxD,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,OAAO,IAAI,CAAC,CAAC,CAAC,YAAY,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,UAAgB,EAAE,IAAY;IACrD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,UAAU,EAA6B,CAAC;QACzD,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YACjC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC7E,IAAI,CAAC,GAAG;gBAAE,SAAS;YACnB,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,MAAM,CAAC,MAAM;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC,CAAC,0DAA0D,CAAC,CAAC;AACxE,CAAC;AAED,iFAAiF;AAEjF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,MAAM,SAAS,GAAW,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;QACzC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO;QAC1B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACrB,CAAC,CAAC;IAEF,MAAM,uBAAuB;QAC3B,YAAY,YAAkB;YAC5B,MAAM,GAAG,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;YACzC,IAAI,GAAG;gBAAE,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC;QAC5B,gEAAgE;QAChE,MAAM,CAAC,EAAQ,IAAG,CAAC;QACnB,gEAAgE;QAChE,OAAO,KAAI,CAAC;KACb;IAED,OAAO;QACL,UAAU,EAAE,IAAI;QAEhB,2EAA2E;QAC3E,UAAU;QACV,kBAAkB;QAClB,gBAAgB;QAEhB,oEAAoE;QACpE,uEAAuE;QACvE,sEAAsE;QACtE,sEAAsE;QACtE,UAAU;QACV,SAAS;QACT,aAAa,EAAE,uBAAuB;QACtC,kEAAkE;QAClE,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,uBAAuB,CAAC;SAAQ,CAAC;QAClD,mBAAmB,EAAE,CAAC,CAAO,EAAE,EAAE,CAAC,IAAI,uBAAuB,CAAC,CAAC,CAAC;QAChE,MAAM,EAAE,CAAC,SAAkB,EAAE,YAAkB,EAAE,EAAE;YACjD,MAAM,GAAG,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;YACzC,IAAI,GAAG;gBAAE,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC9B,OAAO,CAAC,GAAY,EAAE,EAAE,CAAC,GAAG,CAAC;QAC/B,CAAC;QACD,gEAAgE;QAChE,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAE,CAAC;QAErB,sCAAsC;QACtC,MAAM,EAAE,CAAC,UAAgB,EAAE,EAAE;YAC3B,eAAe,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YACvC,gEAAgE;YAChE,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;QAClB,CAAC;QACD,gEAAgE;QAChE,KAAK,EAAG,GAAG,EAAE,CAAC,GAAG,EAAE,GAAE,CAAC;QACtB,gEAAgE;QAChE,KAAK,EAAG,GAAG,EAAE,CAAC,GAAG,EAAE,GAAE,CAAC;QACtB,EAAE,EAAM,GAAG,EAAE,CAAC,EAAE;QAChB,SAAS,EAAE,CAAC,IAAY,EAAE,KAAoC,EAAE,EAAE;YAChE,MAAM,SAAS,GAAG,CAAC,CAAgB,EAAE,EAAE,CACrC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;iBACd,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC;iBAC5B,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;iBACxD,IAAI,CAAC,IAAI,CAAC,CAAC;YAChB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;iBAC/B,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;iBACjD,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,MAAM,EAAE,GAAG,OAAO,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,SAAS,CAAC,cAAc,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC;YAC5C,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,WAAW,EAAE,CAAC,OAAkD,EAAE,EAAE;YAClE,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;KACF,CAAC;AACJ,CAAC"}
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
@@ -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;AAMjG,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;AAYD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,EAAE,OAAO,GAAE,kBAAuB,GAAG,IAAI,CAoB/F"}
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
- const STATIC_MODE = typeof __PRAXIS_CSS_STATIC__ !== "undefined" && __PRAXIS_CSS_STATIC__;
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
- const rawCSS = String(factory(createCSSBuilder));
35
- const { layer } = options;
36
- const css = layer ? `@layer ${layer} {\n${rawCSS}\n}` : rawCSS;
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;
@@ -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;AAoB7C,MAAM,WAAW,GACf,OAAO,qBAAqB,KAAK,WAAW,IAAI,qBAAqB,CAAC;AAExE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;AAEnC,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,WAAW,CAAC,OAA2B,EAAE,UAA8B,EAAE;IACvF,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACjD,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,UAAU,KAAK,OAAO,MAAM,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IAE/D,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"}
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":"AAiBA,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAqB1D;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAU9C"}
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
- const STATIC_MODE = typeof __PRAXIS_CSS_STATIC__ !== "undefined" && __PRAXIS_CSS_STATIC__;
3
- // ─── DOM registry ─────────────────────────────────────────────────────────────
4
- // WeakRef lets the GC reclaim style elements that were removed externally
5
- // without going through releaseStyle (e.g. framework teardown, test cleanup).
6
- const cssRegistry = new Map();
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
- const existing = cssRegistry.get(key);
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
- cssRegistry.set(key, { ref: new WeakRef(el), count: 1 });
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;AAQ9C,MAAM,WAAW,GACf,OAAO,qBAAqB,KAAK,WAAW,IAAI,qBAAqB,CAAC;AAExE,iFAAiF;AAEjF,0EAA0E;AAC1E,8EAA8E;AAC9E,MAAM,WAAW,GAAG,IAAI,GAAG,EAA6D,CAAC;AAEzF,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;IAE5C,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,QAAQ,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;IAEzC,IAAI,QAAQ,IAAI,UAAU,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACjE,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO;IACT,CAAC;IAED,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,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,OAAO,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,IAAI,WAAW;QAAE,OAAO;IAExB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACnC,IAAI,CAAC,KAAK;QAAE,OAAO;IACnB,KAAK,CAAC,KAAK,EAAE,CAAC;IACd,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC;QAC5B,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;AACH,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"}