@praxisjs/css 0.1.0

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 (164) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/LICENSE +21 -0
  3. package/dist/__tests__/css-builder.test.d.ts +2 -0
  4. package/dist/__tests__/css-builder.test.d.ts.map +1 -0
  5. package/dist/__tests__/css-builder.test.js +198 -0
  6. package/dist/__tests__/css-builder.test.js.map +1 -0
  7. package/dist/__tests__/cx.test.d.ts +2 -0
  8. package/dist/__tests__/cx.test.d.ts.map +1 -0
  9. package/dist/__tests__/cx.test.js +47 -0
  10. package/dist/__tests__/cx.test.js.map +1 -0
  11. package/dist/__tests__/decorators.test.d.ts +2 -0
  12. package/dist/__tests__/decorators.test.d.ts.map +1 -0
  13. package/dist/__tests__/decorators.test.js +268 -0
  14. package/dist/__tests__/decorators.test.js.map +1 -0
  15. package/dist/__tests__/extract.test.d.ts +2 -0
  16. package/dist/__tests__/extract.test.d.ts.map +1 -0
  17. package/dist/__tests__/extract.test.js +420 -0
  18. package/dist/__tests__/extract.test.js.map +1 -0
  19. package/dist/__tests__/global.test.d.ts +2 -0
  20. package/dist/__tests__/global.test.d.ts.map +1 -0
  21. package/dist/__tests__/global.test.js +117 -0
  22. package/dist/__tests__/global.test.js.map +1 -0
  23. package/dist/__tests__/keyframes.test.d.ts +2 -0
  24. package/dist/__tests__/keyframes.test.d.ts.map +1 -0
  25. package/dist/__tests__/keyframes.test.js +90 -0
  26. package/dist/__tests__/keyframes.test.js.map +1 -0
  27. package/dist/__tests__/preflight.test.d.ts +2 -0
  28. package/dist/__tests__/preflight.test.d.ts.map +1 -0
  29. package/dist/__tests__/preflight.test.js +55 -0
  30. package/dist/__tests__/preflight.test.js.map +1 -0
  31. package/dist/__tests__/registry.test.d.ts +2 -0
  32. package/dist/__tests__/registry.test.d.ts.map +1 -0
  33. package/dist/__tests__/registry.test.js +132 -0
  34. package/dist/__tests__/registry.test.js.map +1 -0
  35. package/dist/__tests__/style.test.d.ts +2 -0
  36. package/dist/__tests__/style.test.d.ts.map +1 -0
  37. package/dist/__tests__/style.test.js +257 -0
  38. package/dist/__tests__/style.test.js.map +1 -0
  39. package/dist/__tests__/styled.test.d.ts +2 -0
  40. package/dist/__tests__/styled.test.d.ts.map +1 -0
  41. package/dist/__tests__/styled.test.js +951 -0
  42. package/dist/__tests__/styled.test.js.map +1 -0
  43. package/dist/__tests__/theme-instance.test.d.ts +2 -0
  44. package/dist/__tests__/theme-instance.test.d.ts.map +1 -0
  45. package/dist/__tests__/theme-instance.test.js +317 -0
  46. package/dist/__tests__/theme-instance.test.js.map +1 -0
  47. package/dist/__tests__/theme-uninit.test.d.ts +2 -0
  48. package/dist/__tests__/theme-uninit.test.d.ts.map +1 -0
  49. package/dist/__tests__/theme-uninit.test.js +10 -0
  50. package/dist/__tests__/theme-uninit.test.js.map +1 -0
  51. package/dist/__tests__/token-sheet.test.d.ts +2 -0
  52. package/dist/__tests__/token-sheet.test.d.ts.map +1 -0
  53. package/dist/__tests__/token-sheet.test.js +74 -0
  54. package/dist/__tests__/token-sheet.test.js.map +1 -0
  55. package/dist/base/stylesheet.d.ts +30 -0
  56. package/dist/base/stylesheet.d.ts.map +1 -0
  57. package/dist/base/stylesheet.js +29 -0
  58. package/dist/base/stylesheet.js.map +1 -0
  59. package/dist/builder/css-builder.d.ts +98 -0
  60. package/dist/builder/css-builder.d.ts.map +1 -0
  61. package/dist/builder/css-builder.js +79 -0
  62. package/dist/builder/css-builder.js.map +1 -0
  63. package/dist/builder/keyframes.d.ts +23 -0
  64. package/dist/builder/keyframes.d.ts.map +1 -0
  65. package/dist/builder/keyframes.js +54 -0
  66. package/dist/builder/keyframes.js.map +1 -0
  67. package/dist/cx.d.ts +3 -0
  68. package/dist/cx.d.ts.map +1 -0
  69. package/dist/cx.js +23 -0
  70. package/dist/cx.js.map +1 -0
  71. package/dist/decorators/param.d.ts +23 -0
  72. package/dist/decorators/param.d.ts.map +1 -0
  73. package/dist/decorators/param.js +39 -0
  74. package/dist/decorators/param.js.map +1 -0
  75. package/dist/decorators/style.d.ts +15 -0
  76. package/dist/decorators/style.d.ts.map +1 -0
  77. package/dist/decorators/style.js +53 -0
  78. package/dist/decorators/style.js.map +1 -0
  79. package/dist/decorators/styled.d.ts +37 -0
  80. package/dist/decorators/styled.d.ts.map +1 -0
  81. package/dist/decorators/styled.js +138 -0
  82. package/dist/decorators/styled.js.map +1 -0
  83. package/dist/extract.d.ts +14 -0
  84. package/dist/extract.d.ts.map +1 -0
  85. package/dist/extract.js +124 -0
  86. package/dist/extract.js.map +1 -0
  87. package/dist/global.d.ts +27 -0
  88. package/dist/global.d.ts.map +1 -0
  89. package/dist/global.js +49 -0
  90. package/dist/global.js.map +1 -0
  91. package/dist/index.d.ts +11 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +10 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/internal/collector.d.ts +15 -0
  96. package/dist/internal/collector.d.ts.map +1 -0
  97. package/dist/internal/collector.js +33 -0
  98. package/dist/internal/collector.js.map +1 -0
  99. package/dist/internal/hash.d.ts +5 -0
  100. package/dist/internal/hash.d.ts.map +1 -0
  101. package/dist/internal/hash.js +11 -0
  102. package/dist/internal/hash.js.map +1 -0
  103. package/dist/internal/registry.d.ts +3 -0
  104. package/dist/internal/registry.d.ts.map +1 -0
  105. package/dist/internal/registry.js +41 -0
  106. package/dist/internal/registry.js.map +1 -0
  107. package/dist/preflight.d.ts +18 -0
  108. package/dist/preflight.d.ts.map +1 -0
  109. package/dist/preflight.js +191 -0
  110. package/dist/preflight.js.map +1 -0
  111. package/dist/server.d.ts +8 -0
  112. package/dist/server.d.ts.map +1 -0
  113. package/dist/server.js +8 -0
  114. package/dist/server.js.map +1 -0
  115. package/dist/tokens/decorators.d.ts +41 -0
  116. package/dist/tokens/decorators.d.ts.map +1 -0
  117. package/dist/tokens/decorators.js +73 -0
  118. package/dist/tokens/decorators.js.map +1 -0
  119. package/dist/tokens/index.d.ts +4 -0
  120. package/dist/tokens/index.d.ts.map +1 -0
  121. package/dist/tokens/index.js +4 -0
  122. package/dist/tokens/index.js.map +1 -0
  123. package/dist/tokens/theme-instance.d.ts +33 -0
  124. package/dist/tokens/theme-instance.d.ts.map +1 -0
  125. package/dist/tokens/theme-instance.js +130 -0
  126. package/dist/tokens/theme-instance.js.map +1 -0
  127. package/dist/tokens/token-sheet.d.ts +46 -0
  128. package/dist/tokens/token-sheet.d.ts.map +1 -0
  129. package/dist/tokens/token-sheet.js +55 -0
  130. package/dist/tokens/token-sheet.js.map +1 -0
  131. package/package.json +33 -0
  132. package/src/__tests__/css-builder.test.ts +230 -0
  133. package/src/__tests__/cx.test.ts +63 -0
  134. package/src/__tests__/decorators.test.ts +127 -0
  135. package/src/__tests__/extract.test.ts +418 -0
  136. package/src/__tests__/global.test.ts +140 -0
  137. package/src/__tests__/keyframes.test.ts +103 -0
  138. package/src/__tests__/preflight.test.ts +63 -0
  139. package/src/__tests__/registry.test.ts +151 -0
  140. package/src/__tests__/style.test.ts +153 -0
  141. package/src/__tests__/styled.test.ts +427 -0
  142. package/src/__tests__/theme-instance.test.ts +374 -0
  143. package/src/__tests__/theme-uninit.test.ts +12 -0
  144. package/src/__tests__/token-sheet.test.ts +87 -0
  145. package/src/base/stylesheet.ts +35 -0
  146. package/src/builder/css-builder.ts +204 -0
  147. package/src/builder/keyframes.ts +66 -0
  148. package/src/cx.ts +26 -0
  149. package/src/decorators/param.ts +40 -0
  150. package/src/decorators/style.ts +55 -0
  151. package/src/decorators/styled.ts +167 -0
  152. package/src/extract.ts +133 -0
  153. package/src/global.ts +60 -0
  154. package/src/index.ts +10 -0
  155. package/src/internal/collector.ts +38 -0
  156. package/src/internal/hash.ts +10 -0
  157. package/src/internal/registry.ts +51 -0
  158. package/src/preflight.ts +192 -0
  159. package/src/server.ts +12 -0
  160. package/src/tokens/decorators.ts +108 -0
  161. package/src/tokens/index.ts +3 -0
  162. package/src/tokens/theme-instance.ts +149 -0
  163. package/src/tokens/token-sheet.ts +86 -0
  164. package/tsconfig.json +8 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styled.js","sourceRoot":"","sources":["../../src/decorators/styled.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export type EmitFn = (css: string, prepend?: boolean) => void;
2
+ /**
3
+ * Creates the `@praxisjs/css` module API surface for build-time CSS extraction.
4
+ *
5
+ * All CSS-generating calls route through `emit` instead of the DOM.
6
+ * Pass the returned object as the `@praxisjs/css` entry in a vm sandbox's
7
+ * `require()` handler.
8
+ *
9
+ * @example
10
+ * const mod = extractionModule((css, prepend) => { ... })
11
+ * sandbox.require = id => id === '@praxisjs/css' ? mod : {}
12
+ */
13
+ export declare function extractionModule(emit: EmitFn): Record<string, unknown>;
14
+ //# sourceMappingURL=extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"AAMA,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,CA0EtE"}
@@ -0,0 +1,124 @@
1
+ import { Stylesheet, ReactiveStylesheet } from "./base/stylesheet.js";
2
+ import { isCSSBuilder, createCSSBuilder } from "./builder/css-builder.js";
3
+ import { hashCSS } from "./internal/hash.js";
4
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
5
+ function camelToKebab(s) {
6
+ return s.replace(/([A-Z])/g, "-$1").toLowerCase();
7
+ }
8
+ function themeToRootCSS(ThemeClass) {
9
+ try {
10
+ const inst = new ThemeClass();
11
+ const vars = Object.entries(inst)
12
+ .filter(([, v]) => typeof v === "string" || typeof v === "number")
13
+ .map(([k, v]) => ` --${camelToKebab(k)}: ${String(v)};`)
14
+ .join("\n");
15
+ return vars ? `:root {\n${vars}\n}` : null;
16
+ }
17
+ catch {
18
+ return null;
19
+ }
20
+ }
21
+ function collectSheetCSS(SheetClass, emit) {
22
+ try {
23
+ const inst = new SheetClass();
24
+ const blocks = [];
25
+ for (const [k, v] of Object.entries(inst)) {
26
+ if (!k.startsWith("$"))
27
+ continue;
28
+ const css = typeof v === "string" ? v : (isCSSBuilder(v) ? String(v) : null);
29
+ if (!css)
30
+ continue;
31
+ const name = k.slice(1).replace(/[^\w-]/g, "-");
32
+ blocks.push(`.prx-${name}-${hashCSS(css)} { ${css.trim()} }`);
33
+ }
34
+ if (blocks.length)
35
+ emit(blocks.join("\n"));
36
+ }
37
+ catch { /* skip sheets that can't be instantiated at build time */ }
38
+ }
39
+ // ─── Module factory ───────────────────────────────────────────────────────────
40
+ /**
41
+ * Creates the `@praxisjs/css` module API surface for build-time CSS extraction.
42
+ *
43
+ * All CSS-generating calls route through `emit` instead of the DOM.
44
+ * Pass the returned object as the `@praxisjs/css` entry in a vm sandbox's
45
+ * `require()` handler.
46
+ *
47
+ * @example
48
+ * const mod = extractionModule((css, prepend) => { ... })
49
+ * sandbox.require = id => id === '@praxisjs/css' ? mod : {}
50
+ */
51
+ export function extractionModule(emit) {
52
+ const seen = new Set();
53
+ const dedupEmit = (css, prepend) => {
54
+ const key = hashCSS(css);
55
+ if (seen.has(key))
56
+ return;
57
+ seen.add(key);
58
+ emit(css, prepend);
59
+ };
60
+ class ExtractionThemeInstance {
61
+ constructor(DefaultTheme) {
62
+ const css = themeToRootCSS(DefaultTheme);
63
+ if (css)
64
+ dedupEmit(css, true);
65
+ }
66
+ get current() { return {}; }
67
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
68
+ switch(_T) { }
69
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
70
+ destroy() { }
71
+ }
72
+ return {
73
+ __esModule: true,
74
+ // Base classes — real implementations, used by user's `extends Stylesheet`
75
+ Stylesheet,
76
+ ReactiveStylesheet,
77
+ createCSSBuilder,
78
+ // Token system — extraction stubs
79
+ // eslint-disable-next-line @typescript-eslint/no-extraneous-class
80
+ TokenSheet: class TokenSheet {
81
+ },
82
+ tokenVars: (cls) => cls,
83
+ ThemeInstance: ExtractionThemeInstance,
84
+ // eslint-disable-next-line @typescript-eslint/no-extraneous-class
85
+ theme: () => new ExtractionThemeInstance(class {
86
+ }),
87
+ createThemeInstance: (T) => new ExtractionThemeInstance(T),
88
+ Themed: (_skeleton, DefaultTheme) => {
89
+ const css = themeToRootCSS(DefaultTheme);
90
+ if (css)
91
+ dedupEmit(css, true);
92
+ return (cls) => cls;
93
+ },
94
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
95
+ Theme: () => () => { },
96
+ // CSS API — collect instead of inject
97
+ Styled: (SheetClass) => {
98
+ collectSheetCSS(SheetClass, dedupEmit);
99
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
100
+ return () => { };
101
+ },
102
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
103
+ Param: () => () => { },
104
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
105
+ Style: () => () => { },
106
+ cx: () => "",
107
+ keyframes: (name, stops) => {
108
+ const stopToCSS = (p) => Object.entries(p)
109
+ .filter(([, v]) => v != null)
110
+ .map(([k, v]) => ` ${camelToKebab(k)}: ${String(v)};`)
111
+ .join("\n");
112
+ const body = Object.entries(stops)
113
+ .map(([s, p]) => ` ${s} {\n${stopToCSS(p)}\n }`)
114
+ .join("\n");
115
+ const sn = `prx-${name}-${hashCSS(body)}`;
116
+ dedupEmit(`@keyframes ${sn} {\n${body}\n}`);
117
+ return sn;
118
+ },
119
+ globalStyle: (factory) => {
120
+ dedupEmit(String(factory(createCSSBuilder)));
121
+ },
122
+ };
123
+ }
124
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { type CSSProperties, type CSSBuilder } from "./builder/css-builder.js";
2
+ /** Factory function that receives `css` (= `createCSSBuilder`) and returns a `CSSBuilder` or raw CSS string. */
3
+ export type GlobalStyleFactory = (css: (props: CSSProperties) => CSSBuilder) => CSSBuilder | string;
4
+ /**
5
+ * Injects unscoped CSS into `<head>` exactly once.
6
+ *
7
+ * Receives a factory function that is passed `css` — the same builder
8
+ * function as `this.css()` in a `Stylesheet` class — and returns either a
9
+ * {@link CSSBuilder} or a raw CSS string.
10
+ *
11
+ * Use `.on(selector, props)` to attach rules to specific elements.
12
+ * Chain multiple `.on()` calls to produce multiple selectors in one injection.
13
+ *
14
+ * Idempotent — duplicate content is ignored (content-hashed).
15
+ * Safe to call at module level. With the `praxisjsCSS()` Vite plugin the
16
+ * CSS is extracted at build time.
17
+ *
18
+ * @example
19
+ * globalStyle(css =>
20
+ * css({})
21
+ * .on('*, *::before, *::after', { boxSizing: 'border-box', margin: 0, padding: 0 })
22
+ * .on('body', { fontFamily: 'system-ui', lineHeight: 1.5 })
23
+ * .on('img, video', { display: 'block', maxWidth: '100%' })
24
+ * )
25
+ */
26
+ export declare function globalStyle(factory: GlobalStyleFactory): void;
27
+ //# sourceMappingURL=global.d.ts.map
@@ -0,0 +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;AAYpG;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAkB7D"}
package/dist/global.js ADDED
@@ -0,0 +1,49 @@
1
+ import { createCSSBuilder } from "./builder/css-builder.js";
2
+ import { getCollector } from "./internal/collector.js";
3
+ import { hashCSS } from "./internal/hash.js";
4
+ const STATIC_MODE = typeof __PRAXIS_CSS_STATIC__ !== "undefined" && __PRAXIS_CSS_STATIC__;
5
+ const injected = new Set();
6
+ // ─── globalStyle ─────────────────────────────────────────────────────────────
7
+ /**
8
+ * Injects unscoped CSS into `<head>` exactly once.
9
+ *
10
+ * Receives a factory function that is passed `css` — the same builder
11
+ * function as `this.css()` in a `Stylesheet` class — and returns either a
12
+ * {@link CSSBuilder} or a raw CSS string.
13
+ *
14
+ * Use `.on(selector, props)` to attach rules to specific elements.
15
+ * Chain multiple `.on()` calls to produce multiple selectors in one injection.
16
+ *
17
+ * Idempotent — duplicate content is ignored (content-hashed).
18
+ * Safe to call at module level. With the `praxisjsCSS()` Vite plugin the
19
+ * CSS is extracted at build time.
20
+ *
21
+ * @example
22
+ * globalStyle(css =>
23
+ * css({})
24
+ * .on('*, *::before, *::after', { boxSizing: 'border-box', margin: 0, padding: 0 })
25
+ * .on('body', { fontFamily: 'system-ui', lineHeight: 1.5 })
26
+ * .on('img, video', { display: 'block', maxWidth: '100%' })
27
+ * )
28
+ */
29
+ export function globalStyle(factory) {
30
+ const css = String(factory(createCSSBuilder));
31
+ const key = hashCSS(css);
32
+ if (injected.has(key))
33
+ return;
34
+ injected.add(key);
35
+ if (STATIC_MODE)
36
+ return;
37
+ const col = getCollector();
38
+ if (col) {
39
+ col.inject(key, css);
40
+ return;
41
+ }
42
+ if (typeof document === "undefined")
43
+ return;
44
+ const el = document.createElement("style");
45
+ el.setAttribute("data-praxis-global", key);
46
+ el.textContent = css;
47
+ document.head.appendChild(el);
48
+ }
49
+ //# sourceMappingURL=global.js.map
@@ -0,0 +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;AAU7C,MAAM,WAAW,GACf,OAAO,qBAAqB,KAAK,WAAW,IAAI,qBAAqB,CAAC;AAExE,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;AAEnC,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,WAAW,CAAC,OAA2B;IACrD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAE9C,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,11 @@
1
+ export { cx, type ClassValue } from "./cx.js";
2
+ export { preflight } from "./preflight.js";
3
+ export { globalStyle, type GlobalStyleFactory } from "./global.js";
4
+ export { type CSSBuilder, type CSSProperties } from "./builder/css-builder.js";
5
+ export { keyframes } from "./builder/keyframes.js";
6
+ export { Param } from "./decorators/param.js";
7
+ export { ReactiveStylesheet, Stylesheet } from "./base/stylesheet.js";
8
+ export { Styled } from "./decorators/styled.js";
9
+ export { Style } from "./decorators/style.js";
10
+ export { TokenSheet, tokenVars, ThemeInstance, theme, Themed, Theme, type ThemedConfig } from "./tokens/index.js";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ export { cx } from "./cx.js";
2
+ export { preflight } from "./preflight.js";
3
+ export { globalStyle } from "./global.js";
4
+ export { keyframes } from "./builder/keyframes.js";
5
+ export { Param } from "./decorators/param.js";
6
+ export { ReactiveStylesheet, Stylesheet } from "./base/stylesheet.js";
7
+ export { Styled } from "./decorators/styled.js";
8
+ export { Style } from "./decorators/style.js";
9
+ export { TokenSheet, tokenVars, ThemeInstance, theme, Themed, Theme } from "./tokens/index.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAmB,MAAM,SAAS,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAA2B,MAAM,aAAa,CAAC;AAEnE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAqB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * CSS collector — used by the Vite CSS plugin during build-time extraction.
3
+ * When a collector is active, `injectStyle` and `keyframes` push CSS to it
4
+ * instead of injecting `<style>` elements into the DOM.
5
+ */
6
+ export interface CSSCollector {
7
+ inject(key: string, css: string): void;
8
+ addKeyframes(name: string, css: string): void;
9
+ getCSS(): string;
10
+ clear(): void;
11
+ }
12
+ export declare function setCollector(c: CSSCollector | null): void;
13
+ export declare function getCollector(): CSSCollector | null;
14
+ export declare function createCollector(): CSSCollector;
15
+ //# sourceMappingURL=collector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.d.ts","sourceRoot":"","sources":["../../src/internal/collector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C,MAAM,IAAI,MAAM,CAAC;IACjB,KAAK,IAAI,IAAI,CAAC;CACf;AAID,wBAAgB,YAAY,CAAC,CAAC,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAEzD;AAED,wBAAgB,YAAY,IAAI,YAAY,GAAG,IAAI,CAElD;AAED,wBAAgB,eAAe,IAAI,YAAY,CAc9C"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * CSS collector — used by the Vite CSS plugin during build-time extraction.
3
+ * When a collector is active, `injectStyle` and `keyframes` push CSS to it
4
+ * instead of injecting `<style>` elements into the DOM.
5
+ */
6
+ let _active = null;
7
+ export function setCollector(c) {
8
+ _active = c;
9
+ }
10
+ export function getCollector() {
11
+ return _active;
12
+ }
13
+ export function createCollector() {
14
+ const seen = new Set();
15
+ const blocks = [];
16
+ return {
17
+ inject(key, css) {
18
+ if (!seen.has(key)) {
19
+ seen.add(key);
20
+ blocks.push(css);
21
+ }
22
+ },
23
+ addKeyframes(name, css) {
24
+ if (!seen.has(name)) {
25
+ seen.add(name);
26
+ blocks.push(css);
27
+ }
28
+ },
29
+ getCSS() { return blocks.join("\n"); },
30
+ clear() { seen.clear(); blocks.length = 0; },
31
+ };
32
+ }
33
+ //# sourceMappingURL=collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collector.js","sourceRoot":"","sources":["../../src/internal/collector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,IAAI,OAAO,GAAwB,IAAI,CAAC;AAExC,MAAM,UAAU,YAAY,CAAC,CAAsB;IACjD,OAAO,GAAG,CAAC,CAAC;AACd,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,OAAO;QACL,MAAM,CAAC,GAAG,EAAE,GAAG;YACb,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC;QAC1D,CAAC;QACD,YAAY,CAAC,IAAI,EAAE,GAAG;YACpB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC;QAC5D,CAAC;QACD,MAAM,KAAK,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,KAAK,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;KAC7C,CAAC;AACJ,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * djb2-variant hash of a string, returning a 6-char base-36 identifier.
3
+ */
4
+ export declare function hashCSS(str: string): string;
5
+ //# sourceMappingURL=hash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.d.ts","sourceRoot":"","sources":["../../src/internal/hash.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM3C"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * djb2-variant hash of a string, returning a 6-char base-36 identifier.
3
+ */
4
+ export function hashCSS(str) {
5
+ let h = 5381;
6
+ for (let i = 0; i < str.length; i++) {
7
+ h = (h * 33) ^ str.charCodeAt(i);
8
+ }
9
+ return (h >>> 0).toString(36).slice(0, 6);
10
+ }
11
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/internal/hash.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,IAAI,CAAC,GAAG,IAAI,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function injectStyle(key: string, css: string): void;
2
+ export declare function releaseStyle(key: string): void;
3
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,41 @@
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();
7
+ export function injectStyle(key, css) {
8
+ if (STATIC_MODE)
9
+ return;
10
+ const col = getCollector();
11
+ if (col) {
12
+ col.inject(key, css);
13
+ return;
14
+ }
15
+ if (typeof document === "undefined")
16
+ return;
17
+ const existing = cssRegistry.get(key);
18
+ const existingEl = existing?.ref.deref();
19
+ if (existing && existingEl && document.head.contains(existingEl)) {
20
+ existing.count++;
21
+ return;
22
+ }
23
+ const el = document.createElement("style");
24
+ el.setAttribute("data-praxis-hash", key);
25
+ el.textContent = css;
26
+ 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
+ }
40
+ }
41
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Injects an opinionated browser reset into `document.head` exactly once.
3
+ *
4
+ * Inspired by the Tailwind CSS preflight reset — normalises browser defaults,
5
+ * removes margins and padding, resets borders, and makes replaced elements
6
+ * block-level. Tailwind-specific `--theme()` references are not included;
7
+ * font stacks use standard system defaults instead.
8
+ *
9
+ * Safe to call at module level. Idempotent — multiple calls inject the CSS
10
+ * only once. Works with the `praxisjsCSS()` Vite plugin for static extraction.
11
+ *
12
+ * @example
13
+ * // src/main.ts
14
+ * import { preflight } from '@praxisjs/css'
15
+ * preflight()
16
+ */
17
+ export declare function preflight(): void;
18
+ //# sourceMappingURL=preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AA6KA;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,SAAS,IAAI,IAAI,CAEhC"}
@@ -0,0 +1,191 @@
1
+ import { globalStyle } from "./global.js";
2
+ // Tailwind CSS preflight — https://github.com/tailwindlabs/tailwindcss/blob/main/packages/tailwindcss/preflight.css
3
+ // --theme() references stripped and replaced with their fallback values.
4
+ const PREFLIGHT = `
5
+ *,
6
+ ::after,
7
+ ::before,
8
+ ::backdrop,
9
+ ::file-selector-button {
10
+ box-sizing: border-box;
11
+ margin: 0;
12
+ padding: 0;
13
+ border: 0 solid;
14
+ }
15
+
16
+ html,
17
+ :host {
18
+ line-height: 1.5;
19
+ -webkit-text-size-adjust: 100%;
20
+ tab-size: 4;
21
+ font-family: ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
22
+ font-feature-settings: normal;
23
+ font-variation-settings: normal;
24
+ -webkit-tap-highlight-color: transparent;
25
+ }
26
+
27
+ hr {
28
+ height: 0;
29
+ color: inherit;
30
+ border-top-width: 1px;
31
+ }
32
+
33
+ abbr:where([title]) {
34
+ -webkit-text-decoration: underline dotted;
35
+ text-decoration: underline dotted;
36
+ }
37
+
38
+ h1, h2, h3, h4, h5, h6 {
39
+ font-size: inherit;
40
+ font-weight: inherit;
41
+ }
42
+
43
+ a {
44
+ color: inherit;
45
+ -webkit-text-decoration: inherit;
46
+ text-decoration: inherit;
47
+ }
48
+
49
+ b, strong {
50
+ font-weight: bolder;
51
+ }
52
+
53
+ code, kbd, samp, pre {
54
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
55
+ font-feature-settings: normal;
56
+ font-variation-settings: normal;
57
+ font-size: 1em;
58
+ }
59
+
60
+ small {
61
+ font-size: 80%;
62
+ }
63
+
64
+ sub, sup {
65
+ font-size: 75%;
66
+ line-height: 0;
67
+ position: relative;
68
+ vertical-align: baseline;
69
+ }
70
+
71
+ sub { bottom: -0.25em; }
72
+ sup { top: -0.5em; }
73
+
74
+ table {
75
+ text-indent: 0;
76
+ border-color: inherit;
77
+ border-collapse: collapse;
78
+ }
79
+
80
+ :-moz-focusring { outline: auto; }
81
+
82
+ progress { vertical-align: baseline; }
83
+
84
+ summary { display: list-item; }
85
+
86
+ ol, ul, menu { list-style: none; }
87
+
88
+ img, svg, video, canvas, audio, iframe, embed, object {
89
+ display: block;
90
+ vertical-align: middle;
91
+ }
92
+
93
+ img, video {
94
+ max-width: 100%;
95
+ height: auto;
96
+ }
97
+
98
+ button,
99
+ input,
100
+ select,
101
+ optgroup,
102
+ textarea,
103
+ ::file-selector-button {
104
+ font: inherit;
105
+ font-feature-settings: inherit;
106
+ font-variation-settings: inherit;
107
+ letter-spacing: inherit;
108
+ color: inherit;
109
+ border-radius: 0;
110
+ background-color: transparent;
111
+ opacity: 1;
112
+ }
113
+
114
+ :where(select:is([multiple], [size])) optgroup { font-weight: bolder; }
115
+
116
+ :where(select:is([multiple], [size])) optgroup option { padding-inline-start: 20px; }
117
+
118
+ ::file-selector-button { margin-inline-end: 4px; }
119
+
120
+ ::placeholder { opacity: 1; }
121
+
122
+ @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) {
123
+ ::placeholder {
124
+ color: color-mix(in oklab, currentcolor 50%, transparent);
125
+ }
126
+ }
127
+
128
+ textarea { resize: vertical; }
129
+
130
+ ::-webkit-search-decoration { -webkit-appearance: none; }
131
+
132
+ ::-webkit-date-and-time-value {
133
+ min-height: 1lh;
134
+ text-align: inherit;
135
+ }
136
+
137
+ ::-webkit-datetime-edit { display: inline-flex; }
138
+
139
+ ::-webkit-datetime-edit-fields-wrapper { padding: 0; }
140
+
141
+ ::-webkit-datetime-edit,
142
+ ::-webkit-datetime-edit-year-field,
143
+ ::-webkit-datetime-edit-month-field,
144
+ ::-webkit-datetime-edit-day-field,
145
+ ::-webkit-datetime-edit-hour-field,
146
+ ::-webkit-datetime-edit-minute-field,
147
+ ::-webkit-datetime-edit-second-field,
148
+ ::-webkit-datetime-edit-millisecond-field,
149
+ ::-webkit-datetime-edit-meridiem-field {
150
+ padding-block: 0;
151
+ }
152
+
153
+ ::-webkit-calendar-picker-indicator { line-height: 1; }
154
+
155
+ :-moz-ui-invalid { box-shadow: none; }
156
+
157
+ button,
158
+ input:where([type='button'], [type='reset'], [type='submit']),
159
+ ::file-selector-button {
160
+ appearance: button;
161
+ }
162
+
163
+ ::-webkit-inner-spin-button,
164
+ ::-webkit-outer-spin-button {
165
+ height: auto;
166
+ }
167
+
168
+ [hidden]:where(:not([hidden='until-found'])) {
169
+ display: none !important;
170
+ }
171
+ `;
172
+ /**
173
+ * Injects an opinionated browser reset into `document.head` exactly once.
174
+ *
175
+ * Inspired by the Tailwind CSS preflight reset — normalises browser defaults,
176
+ * removes margins and padding, resets borders, and makes replaced elements
177
+ * block-level. Tailwind-specific `--theme()` references are not included;
178
+ * font stacks use standard system defaults instead.
179
+ *
180
+ * Safe to call at module level. Idempotent — multiple calls inject the CSS
181
+ * only once. Works with the `praxisjsCSS()` Vite plugin for static extraction.
182
+ *
183
+ * @example
184
+ * // src/main.ts
185
+ * import { preflight } from '@praxisjs/css'
186
+ * preflight()
187
+ */
188
+ export function preflight() {
189
+ globalStyle(_css => PREFLIGHT);
190
+ }
191
+ //# sourceMappingURL=preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,oHAAoH;AACpH,yEAAyE;AACzE,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuKjB,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,SAAS;IACvB,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Server-side / build-time API for the `@praxisjs/vite-plugin` CSS extractor.
3
+ *
4
+ * Import this at `@praxisjs/css/server` — it is NOT part of the browser bundle.
5
+ * Using it in browser code has no effect and the tree-shaker will remove it.
6
+ */
7
+ export { setCollector, getCollector, createCollector, type CSSCollector, } from "./internal/collector.js";
8
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,KAAK,YAAY,GAClB,MAAM,yBAAyB,CAAC"}