@elastic/distillate 0.0.0 → 0.2.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 (292) hide show
  1. package/LICENSE.txt +93 -0
  2. package/NOTICE.txt +30 -0
  3. package/README.md +142 -0
  4. package/THIRD_PARTY_LICENSES.md +768 -0
  5. package/dist/cjs/collector.js +491 -0
  6. package/dist/cjs/collector.js.map +1 -0
  7. package/dist/cjs/css_scan.js +186 -0
  8. package/dist/cjs/css_scan.js.map +1 -0
  9. package/dist/cjs/dom_sink.js +40 -0
  10. package/dist/cjs/dom_sink.js.map +1 -0
  11. package/dist/cjs/emotion.js +189 -0
  12. package/dist/cjs/emotion.js.map +1 -0
  13. package/dist/cjs/engine.js +95 -0
  14. package/dist/cjs/engine.js.map +1 -0
  15. package/dist/cjs/environment.js +9 -0
  16. package/dist/cjs/environment.js.map +1 -0
  17. package/dist/cjs/hash.js +86 -0
  18. package/dist/cjs/hash.js.map +1 -0
  19. package/dist/cjs/idents.js +23 -0
  20. package/dist/cjs/idents.js.map +1 -0
  21. package/dist/cjs/index.js +44 -0
  22. package/dist/cjs/index.js.map +1 -0
  23. package/dist/cjs/instance.js +34 -0
  24. package/dist/cjs/instance.js.map +1 -0
  25. package/dist/cjs/local_vars.js +100 -0
  26. package/dist/cjs/local_vars.js.map +1 -0
  27. package/dist/cjs/minify.js +77 -0
  28. package/dist/cjs/minify.js.map +1 -0
  29. package/dist/cjs/names.js +77 -0
  30. package/dist/cjs/names.js.map +1 -0
  31. package/dist/cjs/nesting.js +406 -0
  32. package/dist/cjs/nesting.js.map +1 -0
  33. package/dist/cjs/package.json +3 -0
  34. package/dist/cjs/runtime.js +257 -0
  35. package/dist/cjs/runtime.js.map +1 -0
  36. package/dist/cjs/sink.js +9 -0
  37. package/dist/cjs/sink.js.map +1 -0
  38. package/dist/cjs/styles/authoring.js +169 -0
  39. package/dist/cjs/styles/authoring.js.map +1 -0
  40. package/dist/cjs/styles/declarations.js +139 -0
  41. package/dist/cjs/styles/declarations.js.map +1 -0
  42. package/dist/cjs/styles/index.js +32 -0
  43. package/dist/cjs/styles/index.js.map +1 -0
  44. package/dist/cjs/styles/module.js +233 -0
  45. package/dist/cjs/styles/module.js.map +1 -0
  46. package/dist/cjs/styles/registry.js +187 -0
  47. package/dist/cjs/styles/registry.js.map +1 -0
  48. package/dist/cjs/styles/types.js +9 -0
  49. package/dist/cjs/styles/types.js.map +1 -0
  50. package/dist/cjs/testing.js +37 -0
  51. package/dist/cjs/testing.js.map +1 -0
  52. package/dist/cjs/theme.js +249 -0
  53. package/dist/cjs/theme.js.map +1 -0
  54. package/dist/cjs/tokens/contextual_var.js +39 -0
  55. package/dist/cjs/tokens/contextual_var.js.map +1 -0
  56. package/dist/cjs/tokens/index.js +24 -0
  57. package/dist/cjs/tokens/index.js.map +1 -0
  58. package/dist/cjs/tokens/kind.js +14 -0
  59. package/dist/cjs/tokens/kind.js.map +1 -0
  60. package/dist/cjs/tokens/light_dark.js +42 -0
  61. package/dist/cjs/tokens/light_dark.js.map +1 -0
  62. package/dist/cjs/tokens/scale_token.js +28 -0
  63. package/dist/cjs/tokens/scale_token.js.map +1 -0
  64. package/dist/cjs/tokens/theme_token.js +28 -0
  65. package/dist/cjs/tokens/theme_token.js.map +1 -0
  66. package/dist/cjs/var_invariant.js +115 -0
  67. package/dist/cjs/var_invariant.js.map +1 -0
  68. package/dist/collector.d.ts +101 -0
  69. package/dist/collector.d.ts.map +1 -0
  70. package/dist/collector.js +487 -0
  71. package/dist/collector.js.map +1 -0
  72. package/dist/css_scan.d.ts +57 -0
  73. package/dist/css_scan.d.ts.map +1 -0
  74. package/dist/css_scan.js +180 -0
  75. package/dist/css_scan.js.map +1 -0
  76. package/dist/dom_sink.d.ts +23 -0
  77. package/dist/dom_sink.d.ts.map +1 -0
  78. package/dist/dom_sink.js +36 -0
  79. package/dist/dom_sink.js.map +1 -0
  80. package/dist/emotion.d.ts +44 -0
  81. package/dist/emotion.d.ts.map +1 -0
  82. package/dist/emotion.js +184 -0
  83. package/dist/emotion.js.map +1 -0
  84. package/dist/engine.d.ts +66 -0
  85. package/dist/engine.d.ts.map +1 -0
  86. package/dist/engine.js +91 -0
  87. package/dist/engine.js.map +1 -0
  88. package/dist/environment.d.ts +43 -0
  89. package/dist/environment.d.ts.map +1 -0
  90. package/dist/environment.js +8 -0
  91. package/dist/environment.js.map +1 -0
  92. package/dist/hash.d.ts +2 -0
  93. package/dist/hash.d.ts.map +1 -0
  94. package/dist/hash.js +82 -0
  95. package/dist/hash.js.map +1 -0
  96. package/dist/idents.d.ts +9 -0
  97. package/dist/idents.d.ts.map +1 -0
  98. package/dist/idents.js +19 -0
  99. package/dist/idents.js.map +1 -0
  100. package/dist/index.d.ts +11 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +15 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/instance.d.ts +16 -0
  105. package/dist/instance.d.ts.map +1 -0
  106. package/dist/instance.js +30 -0
  107. package/dist/instance.js.map +1 -0
  108. package/dist/local_vars.d.ts +75 -0
  109. package/dist/local_vars.d.ts.map +1 -0
  110. package/dist/local_vars.js +92 -0
  111. package/dist/local_vars.js.map +1 -0
  112. package/dist/minify.d.ts +11 -0
  113. package/dist/minify.d.ts.map +1 -0
  114. package/dist/minify.js +73 -0
  115. package/dist/minify.js.map +1 -0
  116. package/dist/names.d.ts +39 -0
  117. package/dist/names.d.ts.map +1 -0
  118. package/dist/names.js +70 -0
  119. package/dist/names.js.map +1 -0
  120. package/dist/nesting.d.ts +59 -0
  121. package/dist/nesting.d.ts.map +1 -0
  122. package/dist/nesting.js +400 -0
  123. package/dist/nesting.js.map +1 -0
  124. package/dist/runtime.d.ts +36 -0
  125. package/dist/runtime.d.ts.map +1 -0
  126. package/dist/runtime.js +252 -0
  127. package/dist/runtime.js.map +1 -0
  128. package/dist/sink.d.ts +16 -0
  129. package/dist/sink.d.ts.map +1 -0
  130. package/dist/sink.js +8 -0
  131. package/dist/sink.js.map +1 -0
  132. package/dist/styles/authoring.d.ts +59 -0
  133. package/dist/styles/authoring.d.ts.map +1 -0
  134. package/dist/styles/authoring.js +155 -0
  135. package/dist/styles/authoring.js.map +1 -0
  136. package/dist/styles/declarations.d.ts +10 -0
  137. package/dist/styles/declarations.d.ts.map +1 -0
  138. package/dist/styles/declarations.js +132 -0
  139. package/dist/styles/declarations.js.map +1 -0
  140. package/dist/styles/index.d.ts +7 -0
  141. package/dist/styles/index.d.ts.map +1 -0
  142. package/dist/styles/index.js +12 -0
  143. package/dist/styles/index.js.map +1 -0
  144. package/dist/styles/module.d.ts +5 -0
  145. package/dist/styles/module.d.ts.map +1 -0
  146. package/dist/styles/module.js +229 -0
  147. package/dist/styles/module.js.map +1 -0
  148. package/dist/styles/registry.d.ts +48 -0
  149. package/dist/styles/registry.d.ts.map +1 -0
  150. package/dist/styles/registry.js +182 -0
  151. package/dist/styles/registry.js.map +1 -0
  152. package/dist/styles/types.d.ts +211 -0
  153. package/dist/styles/types.d.ts.map +1 -0
  154. package/dist/styles/types.js +8 -0
  155. package/dist/styles/types.js.map +1 -0
  156. package/dist/testing.d.ts +10 -0
  157. package/dist/testing.d.ts.map +1 -0
  158. package/dist/testing.js +31 -0
  159. package/dist/testing.js.map +1 -0
  160. package/dist/theme.d.ts +85 -0
  161. package/dist/theme.d.ts.map +1 -0
  162. package/dist/theme.js +240 -0
  163. package/dist/theme.js.map +1 -0
  164. package/dist/tokens/contextual_var.d.ts +35 -0
  165. package/dist/tokens/contextual_var.d.ts.map +1 -0
  166. package/dist/tokens/contextual_var.js +33 -0
  167. package/dist/tokens/contextual_var.js.map +1 -0
  168. package/dist/tokens/index.d.ts +5 -0
  169. package/dist/tokens/index.d.ts.map +1 -0
  170. package/dist/tokens/index.js +11 -0
  171. package/dist/tokens/index.js.map +1 -0
  172. package/dist/tokens/kind.d.ts +2 -0
  173. package/dist/tokens/kind.d.ts.map +1 -0
  174. package/dist/tokens/kind.js +10 -0
  175. package/dist/tokens/kind.js.map +1 -0
  176. package/dist/tokens/light_dark.d.ts +20 -0
  177. package/dist/tokens/light_dark.d.ts.map +1 -0
  178. package/dist/tokens/light_dark.js +37 -0
  179. package/dist/tokens/light_dark.js.map +1 -0
  180. package/dist/tokens/scale_token.d.ts +20 -0
  181. package/dist/tokens/scale_token.d.ts.map +1 -0
  182. package/dist/tokens/scale_token.js +23 -0
  183. package/dist/tokens/scale_token.js.map +1 -0
  184. package/dist/tokens/theme_token.d.ts +20 -0
  185. package/dist/tokens/theme_token.d.ts.map +1 -0
  186. package/dist/tokens/theme_token.js +23 -0
  187. package/dist/tokens/theme_token.js.map +1 -0
  188. package/dist/var_invariant.d.ts +25 -0
  189. package/dist/var_invariant.d.ts.map +1 -0
  190. package/dist/var_invariant.js +108 -0
  191. package/dist/var_invariant.js.map +1 -0
  192. package/docs/concepts/authoring.md +115 -0
  193. package/docs/concepts/collection.md +66 -0
  194. package/docs/concepts/distillery.md +47 -0
  195. package/docs/concepts/index.md +18 -0
  196. package/docs/concepts/naming-and-output.md +123 -0
  197. package/docs/concepts/ordering.md +61 -0
  198. package/docs/concepts/single-copy.md +103 -0
  199. package/docs/concepts/tokens.md +99 -0
  200. package/docs/docset.yml +53 -0
  201. package/docs/examples/01-stylesheet.ts +20 -0
  202. package/docs/examples/02-artifact.ts +26 -0
  203. package/docs/examples/03-variants.ts +40 -0
  204. package/docs/examples/04-emotion.ts +33 -0
  205. package/docs/examples/05-var-invariant.ts +31 -0
  206. package/docs/examples/06-payload.ts +85 -0
  207. package/docs/examples/fixture.ts +22 -0
  208. package/docs/getting-started/index.md +14 -0
  209. package/docs/getting-started/installation.md +30 -0
  210. package/docs/getting-started/quick-start.md +61 -0
  211. package/docs/getting-started/your-first-stylesheet.md +57 -0
  212. package/docs/guides/compact-artifacts.md +87 -0
  213. package/docs/guides/emotion-migration.md +60 -0
  214. package/docs/guides/index.md +17 -0
  215. package/docs/guides/name-collisions.md +37 -0
  216. package/docs/guides/non-css-surfaces.md +73 -0
  217. package/docs/guides/react-renderer.md +202 -0
  218. package/docs/guides/theming.md +107 -0
  219. package/docs/guides/var-invariant.md +24 -0
  220. package/docs/guides/vs-emotion.md +61 -0
  221. package/docs/index.md +73 -0
  222. package/docs/logo.svg +7 -0
  223. package/docs/playground/index.html +12 -0
  224. package/docs/playground/package.json +23 -0
  225. package/docs/playground/src/app/app.tsx +109 -0
  226. package/docs/playground/src/app/css_panel.tsx +119 -0
  227. package/docs/playground/src/app/editor_panel.tsx +87 -0
  228. package/docs/playground/src/app/index.ts +8 -0
  229. package/docs/playground/src/app/monaco_css_editor.tsx +84 -0
  230. package/docs/playground/src/app/monaco_source_editor.tsx +132 -0
  231. package/docs/playground/src/app/preview_panel.tsx +99 -0
  232. package/docs/playground/src/app/tokens_panel.tsx +117 -0
  233. package/docs/playground/src/app/types.ts +10 -0
  234. package/docs/playground/src/examples/snippets.test.ts +28 -0
  235. package/docs/playground/src/examples/snippets.ts +418 -0
  236. package/docs/playground/src/lib/compile.test.ts +157 -0
  237. package/docs/playground/src/lib/compile.ts +242 -0
  238. package/docs/playground/src/lib/demo_environment.test.ts +123 -0
  239. package/docs/playground/src/lib/demo_environment.ts +140 -0
  240. package/docs/playground/src/lib/editor_lib.test.ts +39 -0
  241. package/docs/playground/src/lib/editor_lib.ts +142 -0
  242. package/docs/playground/src/lib/format_css.test.ts +41 -0
  243. package/docs/playground/src/lib/format_css.ts +71 -0
  244. package/docs/playground/src/main.tsx +25 -0
  245. package/docs/playground/src/setup/chrome.test.ts +47 -0
  246. package/docs/playground/src/setup/chrome.ts +365 -0
  247. package/docs/playground/src/setup/monaco_env.ts +64 -0
  248. package/docs/playground/tsconfig.json +22 -0
  249. package/docs/playground/vite.config.ts +37 -0
  250. package/docs/playground/vitest.config.ts +35 -0
  251. package/docs/playground.md +28 -0
  252. package/docs/reference/api/emotion.md +290 -0
  253. package/docs/reference/api/index-1.md +2387 -0
  254. package/docs/reference/api/index.md +9 -0
  255. package/docs/reference/api/testing.md +92 -0
  256. package/docs/reference/api.md +12 -0
  257. package/docs/reference/entry-points.md +139 -0
  258. package/docs/reference/environment.md +60 -0
  259. package/docs/reference/index.md +11 -0
  260. package/docs/reference/okf-map.md +93 -0
  261. package/package.json +127 -4
  262. package/src/collector.ts +612 -0
  263. package/src/css_scan.ts +263 -0
  264. package/src/dom_sink.ts +64 -0
  265. package/src/emotion.ts +308 -0
  266. package/src/engine.ts +241 -0
  267. package/src/environment.ts +56 -0
  268. package/src/hash.ts +111 -0
  269. package/src/idents.ts +21 -0
  270. package/src/index.ts +106 -0
  271. package/src/instance.ts +49 -0
  272. package/src/local_vars.ts +220 -0
  273. package/src/minify.ts +87 -0
  274. package/src/names.ts +129 -0
  275. package/src/nesting.ts +596 -0
  276. package/src/runtime.ts +428 -0
  277. package/src/sink.ts +25 -0
  278. package/src/styles/authoring.ts +244 -0
  279. package/src/styles/declarations.ts +172 -0
  280. package/src/styles/index.ts +58 -0
  281. package/src/styles/module.ts +396 -0
  282. package/src/styles/registry.ts +261 -0
  283. package/src/styles/types.ts +283 -0
  284. package/src/testing.ts +48 -0
  285. package/src/theme.ts +454 -0
  286. package/src/tokens/contextual_var.ts +72 -0
  287. package/src/tokens/index.ts +17 -0
  288. package/src/tokens/kind.ts +13 -0
  289. package/src/tokens/light_dark.ts +58 -0
  290. package/src/tokens/scale_token.ts +41 -0
  291. package/src/tokens/theme_token.ts +42 -0
  292. package/src/var_invariant.ts +147 -0
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
4
+ * or more contributor license agreements. Licensed under the Elastic License
5
+ * 2.0; you may not use this file except in compliance with the Elastic License
6
+ * 2.0.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.contentHash64 = void 0;
10
+ const local_vars_1 = require("./local_vars");
11
+ const local_vars_2 = require("./local_vars");
12
+ const nesting_1 = require("./nesting");
13
+ const tokens_1 = require("./tokens");
14
+ const FNV_PRIME = 0x01000193;
15
+ const FNV_OFFSET_A = 0x811c9dc5;
16
+ // A second basis derived from the golden-ratio constant so the two passes
17
+ // disagree, widening the effective hash to 64 bits.
18
+ const FNV_OFFSET_B = (0x811c9dc5 ^ 0x9e3779b9) >>> 0;
19
+ const fnv1a = (input, offset) => {
20
+ let hash = offset;
21
+ for (let i = 0; i < input.length; i += 1) {
22
+ hash ^= input.charCodeAt(i);
23
+ hash = Math.imul(hash, FNV_PRIME);
24
+ }
25
+ return hash >>> 0;
26
+ };
27
+ const base36 = (value) => value.toString(36).padStart(7, '0');
28
+ const contentHash64 = (strings, values) => {
29
+ const canonical = canonicalize(strings, values);
30
+ return (base36(fnv1a(canonical, FNV_OFFSET_A)) +
31
+ base36(fnv1a(canonical, FNV_OFFSET_B)));
32
+ };
33
+ exports.contentHash64 = contentHash64;
34
+ // Canonical, injective-enough serialization. Template strings and tagged
35
+ // values are interleaved and joined with a NUL sentinel that cannot appear in
36
+ // authored CSS, so distinct templates cannot collide by concatenation.
37
+ const canonicalize = (strings, values) => {
38
+ const segments = [];
39
+ strings.forEach((part, index) => {
40
+ segments.push(part);
41
+ if (index < values.length) {
42
+ segments.push(tagValue(values[index]));
43
+ }
44
+ });
45
+ return segments.join('\u0000');
46
+ };
47
+ const tagValue = (value) => {
48
+ if (typeof value === 'string' || typeof value === 'number') {
49
+ return `r:${value}`;
50
+ }
51
+ if ((0, tokens_1.isCssToken)(value)) {
52
+ return `t:${value.path}`;
53
+ }
54
+ if ((0, tokens_1.isContextualCssVar)(value)) {
55
+ return `v:${value.path}`;
56
+ }
57
+ if ((0, tokens_1.isContextualCssVarName)(value)) {
58
+ return `n:${value.path}`;
59
+ }
60
+ if ((0, local_vars_2.isLocalVarRef)(value)) {
61
+ return `l:${value.path}`;
62
+ }
63
+ if ((0, tokens_1.isScaleToken)(value)) {
64
+ return `s:${value.value}`;
65
+ }
66
+ if ((0, local_vars_1.isLocalVarMarker)(value)) {
67
+ return tagMarker(value);
68
+ }
69
+ if ((0, nesting_1.isHandleLike)(value)) {
70
+ return `h:${value.key}`;
71
+ }
72
+ throw new Error(`Unsupported interpolation in css template. Interpolate a theme token, scale token, contextual var, local var (ref/marker), string, number, or a style handle.`);
73
+ };
74
+ const tagMarker = (marker) => {
75
+ if (marker.__kind === 'local-var-default-marker') {
76
+ const entries = marker.defaults
77
+ .map((item) => `${item.key}=${tagValue(item.value)}`)
78
+ .sort();
79
+ return `m:default:${marker.groupId}:${entries.join(',')}`;
80
+ }
81
+ const entries = marker.overrides
82
+ .map((item) => `${item.key}=${tagValue(item.value)}`)
83
+ .sort();
84
+ return `m:override:${marker.groupId}:${entries.join(',')}`;
85
+ };
86
+ //# sourceMappingURL=hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hash.js","sourceRoot":"","sources":["../../src/hash.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\n// Content hashing for anonymous emotion `css`/`injectGlobal` modules.\n//\n// Deterministic 64-bit FNV-1a (two 32-bit passes with distinct offset bases)\n// over a canonical serialization of the authored template. Determinism lets\n// server-rendered and client-rendered class names agree without coordination.\n\nimport type { LocalVarMarker } from './local_vars';\nimport { isLocalVarMarker } from './local_vars';\nimport { isLocalVarRef } from './local_vars';\nimport { isHandleLike } from './nesting';\nimport {\n isContextualCssVar,\n isContextualCssVarName,\n isCssToken,\n isScaleToken,\n} from './tokens';\n\nconst FNV_PRIME = 0x01000193;\nconst FNV_OFFSET_A = 0x811c9dc5;\n// A second basis derived from the golden-ratio constant so the two passes\n// disagree, widening the effective hash to 64 bits.\nconst FNV_OFFSET_B = (0x811c9dc5 ^ 0x9e3779b9) >>> 0;\n\nconst fnv1a = (input: string, offset: number): number => {\n let hash = offset;\n for (let i = 0; i < input.length; i += 1) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, FNV_PRIME);\n }\n return hash >>> 0;\n};\n\nconst base36 = (value: number): string => value.toString(36).padStart(7, '0');\n\nexport const contentHash64 = (\n strings: readonly string[],\n values: readonly unknown[]\n): string => {\n const canonical = canonicalize(strings, values);\n return (\n base36(fnv1a(canonical, FNV_OFFSET_A)) +\n base36(fnv1a(canonical, FNV_OFFSET_B))\n );\n};\n\n// Canonical, injective-enough serialization. Template strings and tagged\n// values are interleaved and joined with a NUL sentinel that cannot appear in\n// authored CSS, so distinct templates cannot collide by concatenation.\nconst canonicalize = (\n strings: readonly string[],\n values: readonly unknown[]\n): string => {\n const segments: string[] = [];\n strings.forEach((part, index) => {\n segments.push(part);\n if (index < values.length) {\n segments.push(tagValue(values[index]));\n }\n });\n return segments.join('\\u0000');\n};\n\nconst tagValue = (value: unknown): string => {\n if (typeof value === 'string' || typeof value === 'number') {\n return `r:${value}`;\n }\n if (isCssToken(value)) {\n return `t:${value.path}`;\n }\n if (isContextualCssVar(value)) {\n return `v:${value.path}`;\n }\n if (isContextualCssVarName(value)) {\n return `n:${value.path}`;\n }\n if (isLocalVarRef(value)) {\n return `l:${value.path}`;\n }\n if (isScaleToken(value)) {\n return `s:${value.value}`;\n }\n if (isLocalVarMarker(value)) {\n return tagMarker(value);\n }\n if (isHandleLike(value)) {\n return `h:${value.key}`;\n }\n throw new Error(\n `Unsupported interpolation in css template. Interpolate a theme token, scale token, contextual var, local var (ref/marker), string, number, or a style handle.`\n );\n};\n\nconst tagMarker = (marker: LocalVarMarker): string => {\n if (marker.__kind === 'local-var-default-marker') {\n const entries = marker.defaults\n .map((item) => `${item.key}=${tagValue(item.value)}`)\n .sort();\n return `m:default:${marker.groupId}:${entries.join(',')}`;\n }\n const entries = marker.overrides\n .map((item) => `${item.key}=${tagValue(item.value)}`)\n .sort();\n return `m:override:${marker.groupId}:${entries.join(',')}`;\n};\n"]}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
4
+ * or more contributor license agreements. Licensed under the Elastic License
5
+ * 2.0; you may not use this file except in compliance with the Elastic License
6
+ * 2.0.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.assertCssIdentSegment = void 0;
10
+ /**
11
+ * Throws if `segment` is not a valid CSS identifier segment.
12
+ *
13
+ * @param segment Value to validate.
14
+ * @param role Human-readable label for the error message (e.g. `'Distillery prefix'`).
15
+ * @throws If `segment` contains characters outside `[A-Za-z_][A-Za-z0-9_-]*`.
16
+ */
17
+ const assertCssIdentSegment = (segment, role) => {
18
+ if (!/^[A-Za-z_][A-Za-z0-9_-]*$/.test(segment)) {
19
+ throw new Error(`${role} "${segment}" is not a CSS identifier segment. Use a letter or underscore, then letters, digits, hyphens, or underscores.`);
20
+ }
21
+ };
22
+ exports.assertCssIdentSegment = assertCssIdentSegment;
23
+ //# sourceMappingURL=idents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idents.js","sourceRoot":"","sources":["../../src/idents.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH;;;;;;GAMG;AACI,MAAM,qBAAqB,GAAG,CAAC,OAAe,EAAE,IAAY,EAAQ,EAAE;IAC3E,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CACb,GAAG,IAAI,KAAK,OAAO,+GAA+G,CACnI,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AANW,QAAA,qBAAqB,yBAMhC","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\n/**\n * Throws if `segment` is not a valid CSS identifier segment.\n *\n * @param segment Value to validate.\n * @param role Human-readable label for the error message (e.g. `'Distillery prefix'`).\n * @throws If `segment` contains characters outside `[A-Za-z_][A-Za-z0-9_-]*`.\n */\nexport const assertCssIdentSegment = (segment: string, role: string): void => {\n if (!/^[A-Za-z_][A-Za-z0-9_-]*$/.test(segment)) {\n throw new Error(\n `${role} \"${segment}\" is not a CSS identifier segment. Use a letter or underscore, then letters, digits, hyphens, or underscores.`\n );\n }\n};\n"]}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
4
+ * or more contributor license agreements. Licensed under the Elastic License
5
+ * 2.0; you may not use this file except in compliance with the Elastic License
6
+ * 2.0.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.variants = exports.StyleRegistry = exports.rule = exports.media = exports.mapDomain = exports.decls = exports.css = exports.container = exports.combineClassNames = exports.renderStyles = exports.StylesCollector = exports.cssVarName = exports.createStyleNameResolver = exports.themeToken = exports.scaleToken = exports.lightDark = exports.isScaleToken = exports.isCssToken = exports.isContextualCssVarName = exports.isContextualCssVar = exports.cq = exports.contextualVar = exports.zipSchemes = exports.resolveThemeValues = exports.createDomSink = exports.createDistillery = void 0;
10
+ var engine_1 = require("./engine");
11
+ Object.defineProperty(exports, "createDistillery", { enumerable: true, get: function () { return engine_1.createDistillery; } });
12
+ var dom_sink_1 = require("./dom_sink");
13
+ Object.defineProperty(exports, "createDomSink", { enumerable: true, get: function () { return dom_sink_1.createDomSink; } });
14
+ var theme_1 = require("./theme");
15
+ Object.defineProperty(exports, "resolveThemeValues", { enumerable: true, get: function () { return theme_1.resolveThemeValues; } });
16
+ Object.defineProperty(exports, "zipSchemes", { enumerable: true, get: function () { return theme_1.zipSchemes; } });
17
+ var tokens_1 = require("./tokens");
18
+ Object.defineProperty(exports, "contextualVar", { enumerable: true, get: function () { return tokens_1.contextualVar; } });
19
+ Object.defineProperty(exports, "cq", { enumerable: true, get: function () { return tokens_1.cq; } });
20
+ Object.defineProperty(exports, "isContextualCssVar", { enumerable: true, get: function () { return tokens_1.isContextualCssVar; } });
21
+ Object.defineProperty(exports, "isContextualCssVarName", { enumerable: true, get: function () { return tokens_1.isContextualCssVarName; } });
22
+ Object.defineProperty(exports, "isCssToken", { enumerable: true, get: function () { return tokens_1.isCssToken; } });
23
+ Object.defineProperty(exports, "isScaleToken", { enumerable: true, get: function () { return tokens_1.isScaleToken; } });
24
+ Object.defineProperty(exports, "lightDark", { enumerable: true, get: function () { return tokens_1.lightDark; } });
25
+ Object.defineProperty(exports, "scaleToken", { enumerable: true, get: function () { return tokens_1.scaleToken; } });
26
+ Object.defineProperty(exports, "themeToken", { enumerable: true, get: function () { return tokens_1.themeToken; } });
27
+ var names_1 = require("./names");
28
+ Object.defineProperty(exports, "createStyleNameResolver", { enumerable: true, get: function () { return names_1.createStyleNameResolver; } });
29
+ Object.defineProperty(exports, "cssVarName", { enumerable: true, get: function () { return names_1.cssVarName; } });
30
+ var collector_1 = require("./collector");
31
+ Object.defineProperty(exports, "StylesCollector", { enumerable: true, get: function () { return collector_1.StylesCollector; } });
32
+ var runtime_1 = require("./runtime");
33
+ Object.defineProperty(exports, "renderStyles", { enumerable: true, get: function () { return runtime_1.renderStyles; } });
34
+ var styles_1 = require("./styles");
35
+ Object.defineProperty(exports, "combineClassNames", { enumerable: true, get: function () { return styles_1.combineClassNames; } });
36
+ Object.defineProperty(exports, "container", { enumerable: true, get: function () { return styles_1.container; } });
37
+ Object.defineProperty(exports, "css", { enumerable: true, get: function () { return styles_1.css; } });
38
+ Object.defineProperty(exports, "decls", { enumerable: true, get: function () { return styles_1.decls; } });
39
+ Object.defineProperty(exports, "mapDomain", { enumerable: true, get: function () { return styles_1.mapDomain; } });
40
+ Object.defineProperty(exports, "media", { enumerable: true, get: function () { return styles_1.media; } });
41
+ Object.defineProperty(exports, "rule", { enumerable: true, get: function () { return styles_1.rule; } });
42
+ Object.defineProperty(exports, "StyleRegistry", { enumerable: true, get: function () { return styles_1.StyleRegistry; } });
43
+ Object.defineProperty(exports, "variants", { enumerable: true, get: function () { return styles_1.variants; } });
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,mCAKkB;AAJhB,0GAAA,gBAAgB,OAAA;AAKlB,uCAMoB;AALlB,yGAAA,aAAa,OAAA;AAYf,iCAaiB;AAZf,2GAAA,kBAAkB,OAAA;AAClB,mGAAA,UAAU,OAAA;AAYZ,mCAekB;AAdhB,uGAAA,aAAa,OAAA;AACb,4FAAA,EAAE,OAAA;AACF,4GAAA,kBAAkB,OAAA;AAClB,gHAAA,sBAAsB,OAAA;AACtB,oGAAA,UAAU,OAAA;AACV,sGAAA,YAAY,OAAA;AACZ,mGAAA,SAAS,OAAA;AACT,oGAAA,UAAU,OAAA;AACV,oGAAA,UAAU,OAAA;AAOZ,iCAOiB;AANf,gHAAA,uBAAuB,OAAA;AACvB,mGAAA,UAAU,OAAA;AAMZ,yCAA2E;AAAlE,4GAAA,eAAe,OAAA;AACxB,qCAImB;AAHjB,uGAAA,YAAY,OAAA;AAId,mCAmCkB;AAlChB,2GAAA,iBAAiB,OAAA;AACjB,mGAAA,SAAS,OAAA;AACT,6FAAA,GAAG,OAAA;AACH,+FAAA,KAAK,OAAA;AACL,mGAAA,SAAS,OAAA;AACT,+FAAA,KAAK,OAAA;AACL,8FAAA,IAAI,OAAA;AACJ,uGAAA,aAAa,OAAA;AACb,kGAAA,QAAQ,OAAA","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nexport {\n createDistillery,\n type Distillery,\n type LiveCollection,\n type LiveCollectionOptions,\n} from './engine';\nexport {\n createDomSink,\n type CreateDomSinkOptions,\n type DocumentLike,\n type StyleElementLike,\n type StyleParentLike,\n} from './dom_sink';\nexport type { StyleSink } from './sink';\nexport {\n type DistilleryEnvironment,\n type DistilleryOptions,\n type ThemeVarDefinition,\n} from './environment';\nexport {\n resolveThemeValues,\n zipSchemes,\n type DeepPartialTheme,\n type MediaThemeVariation,\n type PathsOf,\n type ResolvedThemeVariation,\n type SchemeValueTree,\n type ThemeTree,\n type ThemeVariation,\n type TokensOf,\n type ValuesOf,\n type Zipped,\n} from './theme';\nexport {\n contextualVar,\n cq,\n isContextualCssVar,\n isContextualCssVarName,\n isCssToken,\n isScaleToken,\n lightDark,\n scaleToken,\n themeToken,\n type ContextualCssVar,\n type ContextualCssVarName,\n type CssToken,\n type ScaleToken,\n type SchemePair,\n} from './tokens';\nexport {\n createStyleNameResolver,\n cssVarName,\n type StyleNameMode,\n type StyleNameResolver,\n type StyleNameResolverOptions,\n type StyleTarget,\n} from './names';\nexport { StylesCollector, type StylesCollectorOptions } from './collector';\nexport {\n renderStyles,\n type RenderStylesOptions,\n type ThemeAlternate,\n} from './runtime';\nexport {\n combineClassNames,\n container,\n css,\n decls,\n mapDomain,\n media,\n rule,\n StyleRegistry,\n variants,\n type ContextualVarPath,\n type CssValue,\n type CssVarPath,\n type Declarations,\n type DeclarationSegment,\n type DefaultGroupDeps,\n type DefaultKeyDeps,\n type LocalVarDefaultMarker,\n type LocalVarGroup,\n type LocalVarMarker,\n type LocalVarOverrideMarker,\n type LocalVarRef,\n type PrimitiveStyleAuthoringApi,\n type ResolvedStyles,\n type RuleOptions,\n type StyleAuthoringApi,\n type StyleDeps,\n type StyleEntry,\n type StyleHandle,\n type StyleMedia,\n type StyleRegistrySnapshot,\n type StyleRule,\n type StylesModule,\n type StylesObject,\n type StyleSelectorResolver,\n} from './styles';\n"]}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
4
+ * or more contributor license agreements. Licensed under the Elastic License
5
+ * 2.0; you may not use this file except in compliance with the Elastic License
6
+ * 2.0.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.registerDistillateInstance = exports.INSTANCE_KEY = void 0;
10
+ /** `globalThis` key for the loaded copy's identity. See the README. */
11
+ exports.INSTANCE_KEY = Symbol.for('elastic.distillate.instance');
12
+ /**
13
+ * Records this copy's identity and warns if a different token is already registered.
14
+ *
15
+ * @param host Object carrying the marker, normally `globalThis`.
16
+ * @param instanceId This copy's identity token.
17
+ * @param warn Injected so tests need not intercept the console.
18
+ */
19
+ const registerDistillateInstance = (host, instanceId, warn = (message) => console.warn(message)) => {
20
+ const registered = host[exports.INSTANCE_KEY];
21
+ if (registered === undefined) {
22
+ host[exports.INSTANCE_KEY] = instanceId;
23
+ return;
24
+ }
25
+ if (registered === instanceId) {
26
+ return;
27
+ }
28
+ warn(`@elastic/distillate: a second copy loaded (${instanceId}; already registered ${registered}). ` +
29
+ 'The engine keeps module-scope state, so two copies silently break `variants(...)` tree-shaking ' +
30
+ 'and inflate emitted CSS. Externalize @elastic/distillate in your bundler so exactly one copy loads.');
31
+ };
32
+ exports.registerDistillateInstance = registerDistillateInstance;
33
+ (0, exports.registerDistillateInstance)(globalThis, `@elastic/distillate/instance#${Math.random().toString(36).slice(2)}`);
34
+ //# sourceMappingURL=instance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instance.js","sourceRoot":"","sources":["../../src/instance.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,uEAAuE;AAC1D,QAAA,YAAY,GAAkB,MAAM,CAAC,GAAG,CACnD,6BAA6B,CAC9B,CAAC;AAQF;;;;;;GAMG;AACI,MAAM,0BAA0B,GAAG,CACxC,IAAkB,EAClB,UAAkB,EAClB,OAAkC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAC9D,EAAE;IACR,MAAM,UAAU,GAAG,IAAI,CAAC,oBAAY,CAAC,CAAC;IACtC,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,oBAAY,CAAC,GAAG,UAAU,CAAC;QAChC,OAAO;IACT,CAAC;IACD,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;QAC9B,OAAO;IACT,CAAC;IACD,IAAI,CACF,8CAA8C,UAAU,wBAAwB,UAAU,KAAK;QAC7F,iGAAiG;QACjG,qGAAqG,CACxG,CAAC;AACJ,CAAC,CAAC;AAlBW,QAAA,0BAA0B,8BAkBrC;AAEF,IAAA,kCAA0B,EACxB,UAA0B,EAC1B,gCAAgC,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CACtE,CAAC","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\n/** `globalThis` key for the loaded copy's identity. See the README. */\nexport const INSTANCE_KEY: unique symbol = Symbol.for(\n 'elastic.distillate.instance'\n);\n\n/** Object that may hold the Distillate instance identity, normally `globalThis`. */\nexport interface InstanceHost {\n /** Identity token of the first Distillate copy that registered. */\n [INSTANCE_KEY]?: string;\n}\n\n/**\n * Records this copy's identity and warns if a different token is already registered.\n *\n * @param host Object carrying the marker, normally `globalThis`.\n * @param instanceId This copy's identity token.\n * @param warn Injected so tests need not intercept the console.\n */\nexport const registerDistillateInstance = (\n host: InstanceHost,\n instanceId: string,\n warn: (message: string) => void = (message) => console.warn(message)\n): void => {\n const registered = host[INSTANCE_KEY];\n if (registered === undefined) {\n host[INSTANCE_KEY] = instanceId;\n return;\n }\n if (registered === instanceId) {\n return;\n }\n warn(\n `@elastic/distillate: a second copy loaded (${instanceId}; already registered ${registered}). ` +\n 'The engine keeps module-scope state, so two copies silently break `variants(...)` tree-shaking ' +\n 'and inflate emitted CSS. Externalize @elastic/distillate in your bundler so exactly one copy loads.'\n );\n};\n\nregisterDistillateInstance(\n globalThis as InstanceHost,\n `@elastic/distillate/instance#${Math.random().toString(36).slice(2)}`\n);\n"]}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
4
+ * or more contributor license agreements. Licensed under the Elastic License
5
+ * 2.0; you may not use this file except in compliance with the Elastic License
6
+ * 2.0.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.createLocalVarGroup = exports.isLocalVarMarker = exports.isLocalVarOverrideMarker = exports.isLocalVarDefaultMarker = exports.isLocalVarRef = void 0;
10
+ const idents_1 = require("./idents");
11
+ const names_1 = require("./names");
12
+ const RESERVED_DEFAULT_KEYS = new Set(['set', 'toString', 'valueOf', 'toJSON']);
13
+ const isReservedKey = (key) => RESERVED_DEFAULT_KEYS.has(key) || key.startsWith('__');
14
+ /** `true` when `value` is a {@link LocalVarRef}. */
15
+ const isLocalVarRef = (value) => Boolean(value &&
16
+ typeof value === 'object' &&
17
+ value.__kind === 'local-var-ref');
18
+ exports.isLocalVarRef = isLocalVarRef;
19
+ /** `true` when `value` is a {@link LocalVarDefaultMarker}. */
20
+ const isLocalVarDefaultMarker = (value) => Boolean(value &&
21
+ typeof value === 'object' &&
22
+ value.__kind === 'local-var-default-marker');
23
+ exports.isLocalVarDefaultMarker = isLocalVarDefaultMarker;
24
+ /** `true` when `value` is a {@link LocalVarOverrideMarker}. */
25
+ const isLocalVarOverrideMarker = (value) => Boolean(value &&
26
+ typeof value === 'object' &&
27
+ value.__kind === 'local-var-override-marker');
28
+ exports.isLocalVarOverrideMarker = isLocalVarOverrideMarker;
29
+ /** `true` when `value` is a {@link LocalVarDefaultMarker} or {@link LocalVarOverrideMarker}. */
30
+ const isLocalVarMarker = (value) => (0, exports.isLocalVarDefaultMarker)(value) || (0, exports.isLocalVarOverrideMarker)(value);
31
+ exports.isLocalVarMarker = isLocalVarMarker;
32
+ const cssVarPath = (moduleName, group, key) => `vars/${moduleName}/${group}/${key}`;
33
+ const buildLocalVarRef = (path, propName) => {
34
+ const ref = `var(${propName})`;
35
+ const refToString = () => ref;
36
+ return {
37
+ __kind: 'local-var-ref',
38
+ path,
39
+ propName,
40
+ ref,
41
+ toString: refToString,
42
+ [Symbol.toPrimitive]: refToString,
43
+ };
44
+ };
45
+ const reservedKeyError = (key) => new Error(`t.vars(...) defaults key "${key}" is reserved. Reserved: ${[...RESERVED_DEFAULT_KEYS].join(', ')} plus any "__"-prefixed key.`);
46
+ const createLocalVarGroup = (prefix, moduleName, group, defaults) => {
47
+ (0, idents_1.assertCssIdentSegment)(group, 't.vars(...) group');
48
+ const groupId = `${moduleName}/${group}`;
49
+ const groupPath = `vars/${groupId}`;
50
+ const refs = new Map();
51
+ const defaultsList = [];
52
+ for (const [key, value] of Object.entries(defaults)) {
53
+ if (isReservedKey(key)) {
54
+ throw reservedKeyError(key);
55
+ }
56
+ (0, idents_1.assertCssIdentSegment)(key, `t.vars("${group}") key`);
57
+ const path = cssVarPath(moduleName, group, key);
58
+ const propName = (0, names_1.cssVarName)(prefix, path);
59
+ refs.set(key, buildLocalVarRef(path, propName));
60
+ defaultsList.push({ key, path, propName, value });
61
+ }
62
+ const setOverrides = (overrides) => {
63
+ const list = [];
64
+ for (const [key, value] of Object.entries(overrides)) {
65
+ if (value === undefined) {
66
+ continue;
67
+ }
68
+ const ref = refs.get(key);
69
+ if (!ref) {
70
+ throw new Error(`t.vars("${group}").set: unknown key "${key}". Declared keys: ${defaultsList
71
+ .map((entry) => entry.key)
72
+ .join(', ')}.`);
73
+ }
74
+ list.push({ key, path: ref.path, propName: ref.propName, value });
75
+ }
76
+ return {
77
+ __kind: 'local-var-override-marker',
78
+ groupId,
79
+ overrides: list,
80
+ };
81
+ };
82
+ const group_ = {
83
+ __kind: 'local-var-default-marker',
84
+ groupId,
85
+ groupPath,
86
+ defaults: defaultsList,
87
+ set: setOverrides,
88
+ };
89
+ for (const [key, ref] of refs) {
90
+ Object.defineProperty(group_, key, {
91
+ value: ref,
92
+ enumerable: true,
93
+ writable: false,
94
+ configurable: false,
95
+ });
96
+ }
97
+ return group_;
98
+ };
99
+ exports.createLocalVarGroup = createLocalVarGroup;
100
+ //# sourceMappingURL=local_vars.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local_vars.js","sourceRoot":"","sources":["../../src/local_vars.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nimport { assertCssIdentSegment } from './idents';\nimport { cssVarName } from './names';\nimport type { ContextualVarPath, CssValue } from './styles/types';\n\nconst RESERVED_DEFAULT_KEYS = new Set(['set', 'toString', 'valueOf', 'toJSON']);\n\nconst isReservedKey = (key: string): boolean =>\n RESERVED_DEFAULT_KEYS.has(key) || key.startsWith('__');\n\n/** Reference to a local CSS variable. Stringifies to `var(--...)`. */\nexport interface LocalVarRef {\n /** Brand distinguishing a local-var ref from other interpolations. */\n readonly __kind: 'local-var-ref';\n /** Canonical group/key path. */\n readonly path: ContextualVarPath;\n /** Actual emitted CSS custom property name. */\n readonly propName: `--${string}`;\n /** Usable CSS `var(...)` reference string. */\n readonly ref: `var(--${string})`;\n /** Stringifies to {@link LocalVarRef.ref}. */\n toString(): string;\n /** Template interpolation; same as {@link LocalVarRef.toString}. */\n [Symbol.toPrimitive](hint: string): string;\n}\n\n/** Interpolation marker representing `.set(...)` overrides. */\nexport interface LocalVarOverrideMarker {\n /** Brand distinguishing a `.set(...)` override marker. */\n readonly __kind: 'local-var-override-marker';\n /** Unique ID for the group. */\n readonly groupId: string;\n /** Ordered list of variable overrides. */\n readonly overrides: ReadonlyArray<{\n /** Variable key within the group. */\n readonly key: string;\n /** Canonical group/key path. */\n readonly path: ContextualVarPath;\n /** Actual emitted CSS custom property name. */\n readonly propName: `--${string}`;\n /** Override value written at this interpolation site. */\n readonly value: CssValue;\n }>;\n}\n\n/** Interpolation marker representing `${group}` defaults. */\nexport interface LocalVarDefaultMarker {\n /** Brand distinguishing a `${group}` default marker. */\n readonly __kind: 'local-var-default-marker';\n /** Unique ID for the group. */\n readonly groupId: string;\n /** Group prefix path. */\n readonly groupPath: `vars/${string}`;\n /** Ordered list of variable defaults. */\n readonly defaults: ReadonlyArray<{\n /** Variable key within the group. */\n readonly key: string;\n /** Canonical group/key path. */\n readonly path: ContextualVarPath;\n /** Actual emitted CSS custom property name. */\n readonly propName: `--${string}`;\n /** Default value emitted when this key is reachable. */\n readonly value: CssValue;\n }>;\n}\n\n/** Interpolation marker: `${group}` defaults or `${group.set(...)}` overrides. */\nexport type LocalVarMarker = LocalVarOverrideMarker | LocalVarDefaultMarker;\n\n/**\n * Value returned by `t.vars(...)`. Interpolate `${group}`, `${group.key}`, or `${group.set({...})}`.\n */\nexport type LocalVarGroup<TKey extends string> = {\n readonly [P in TKey]: LocalVarRef;\n} & {\n /** Builds a marker that writes the given keys at the interpolation site. */\n set(overrides: Partial<Record<TKey, CssValue>>): LocalVarOverrideMarker;\n};\n\n/** `true` when `value` is a {@link LocalVarRef}. */\nexport const isLocalVarRef = (value: unknown): value is LocalVarRef =>\n Boolean(\n value &&\n typeof value === 'object' &&\n (value as { __kind?: string }).__kind === 'local-var-ref'\n );\n\n/** `true` when `value` is a {@link LocalVarDefaultMarker}. */\nexport const isLocalVarDefaultMarker = (\n value: unknown\n): value is LocalVarDefaultMarker =>\n Boolean(\n value &&\n typeof value === 'object' &&\n (value as { __kind?: string }).__kind === 'local-var-default-marker'\n );\n\n/** `true` when `value` is a {@link LocalVarOverrideMarker}. */\nexport const isLocalVarOverrideMarker = (\n value: unknown\n): value is LocalVarOverrideMarker =>\n Boolean(\n value &&\n typeof value === 'object' &&\n (value as { __kind?: string }).__kind === 'local-var-override-marker'\n );\n\n/** `true` when `value` is a {@link LocalVarDefaultMarker} or {@link LocalVarOverrideMarker}. */\nexport const isLocalVarMarker = (value: unknown): value is LocalVarMarker =>\n isLocalVarDefaultMarker(value) || isLocalVarOverrideMarker(value);\n\nconst cssVarPath = (\n moduleName: string,\n group: string,\n key: string\n): ContextualVarPath => `vars/${moduleName}/${group}/${key}`;\n\nconst buildLocalVarRef = (\n path: ContextualVarPath,\n propName: `--${string}`\n): LocalVarRef => {\n const ref: `var(--${string})` = `var(${propName})`;\n const refToString = (): string => ref;\n return {\n __kind: 'local-var-ref',\n path,\n propName,\n ref,\n toString: refToString,\n [Symbol.toPrimitive]: refToString,\n };\n};\n\nconst reservedKeyError = (key: string): Error =>\n new Error(\n `t.vars(...) defaults key \"${key}\" is reserved. Reserved: ${[...RESERVED_DEFAULT_KEYS].join(', ')} plus any \"__\"-prefixed key.`\n );\n\nexport const createLocalVarGroup = <TKey extends string>(\n prefix: string,\n moduleName: string,\n group: string,\n defaults: Record<TKey, CssValue>\n): LocalVarGroup<TKey> => {\n assertCssIdentSegment(group, 't.vars(...) group');\n const groupId = `${moduleName}/${group}`;\n const groupPath = `vars/${groupId}`;\n const refs = new Map<TKey, LocalVarRef>();\n const defaultsList: Array<{\n readonly key: string;\n readonly path: ContextualVarPath;\n readonly propName: `--${string}`;\n readonly value: CssValue;\n }> = [];\n\n for (const [key, value] of Object.entries(defaults) as Array<\n [TKey, CssValue]\n >) {\n if (isReservedKey(key)) {\n throw reservedKeyError(key);\n }\n assertCssIdentSegment(key, `t.vars(\"${group}\") key`);\n const path = cssVarPath(moduleName, group, key);\n const propName = cssVarName(prefix, path);\n refs.set(key, buildLocalVarRef(path, propName));\n defaultsList.push({ key, path, propName, value });\n }\n\n const setOverrides = (\n overrides: Partial<Record<TKey, CssValue>>\n ): LocalVarOverrideMarker => {\n const list: Array<LocalVarOverrideMarker['overrides'][number]> = [];\n for (const [key, value] of Object.entries(overrides) as Array<\n [TKey, CssValue | undefined]\n >) {\n if (value === undefined) {\n continue;\n }\n const ref = refs.get(key);\n if (!ref) {\n throw new Error(\n `t.vars(\"${group}\").set: unknown key \"${key}\". Declared keys: ${defaultsList\n .map((entry) => entry.key)\n .join(', ')}.`\n );\n }\n list.push({ key, path: ref.path, propName: ref.propName, value });\n }\n return {\n __kind: 'local-var-override-marker',\n groupId,\n overrides: list,\n };\n };\n\n const group_ = {\n __kind: 'local-var-default-marker',\n groupId,\n groupPath,\n defaults: defaultsList,\n set: setOverrides,\n } as unknown as LocalVarGroup<TKey>;\n\n for (const [key, ref] of refs) {\n Object.defineProperty(group_, key, {\n value: ref,\n enumerable: true,\n writable: false,\n configurable: false,\n });\n }\n\n return group_;\n};\n"]}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
4
+ * or more contributor license agreements. Licensed under the Elastic License
5
+ * 2.0; you may not use this file except in compliance with the Elastic License
6
+ * 2.0.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.minifyCss = void 0;
10
+ const css_scan_1 = require("./css_scan");
11
+ /**
12
+ * A space between two non-structural spans is significant wherever it sits: a
13
+ * descendant combinator in a selector (`.a .b`), a token separator in a value
14
+ * (`margin:0 auto`). Beside a structural character it is noise, except before
15
+ * a pseudo-class colon in a rules block — `.menu :hover` is not `.menu:hover`,
16
+ * while `color : red` is `color:red`.
17
+ */
18
+ const spaceIsSignificant = (before, after) => {
19
+ if (!before || !after) {
20
+ return false;
21
+ }
22
+ if (before.kind === 'structural') {
23
+ return false;
24
+ }
25
+ if (after.kind === 'structural') {
26
+ // Only a pseudo-class colon in a selector keeps the space in front of it.
27
+ // Space before `{`, `}`, `;`, `,`, or `>` is never significant.
28
+ return after.text === ':' && after.block === 'rules';
29
+ }
30
+ return true;
31
+ };
32
+ /**
33
+ * Strips comments and insignificant whitespace from CSS.
34
+ *
35
+ * Strings, unquoted `url(…)` tokens, and backslash escapes pass through
36
+ * untouched: their contents are literal, so a `/*` or a `;` inside one is data
37
+ * rather than syntax.
38
+ *
39
+ * @param value Raw CSS text.
40
+ */
41
+ const minifyCss = (value) => {
42
+ // Dropping comments can leave two whitespace spans adjacent — `.a /*c*/ .b`
43
+ // — and emitting one space per span would keep both. Coalescing after the
44
+ // filter makes the run a single decision.
45
+ const spans = (0, css_scan_1.scanCss)(value)
46
+ .filter((span) => span.kind !== 'comment')
47
+ .filter((span, index, all) => span.kind !== 'whitespace' || all[index - 1]?.kind !== 'whitespace');
48
+ const out = [];
49
+ // Indices into `spans` of what has been emitted, so lookaround skips the
50
+ // whitespace being decided about.
51
+ const significant = spans.filter((span) => span.kind !== 'whitespace');
52
+ let significantIndex = 0;
53
+ spans.forEach((span) => {
54
+ if (span.kind === 'whitespace') {
55
+ const before = significant[significantIndex - 1];
56
+ const after = significant[significantIndex];
57
+ if (spaceIsSignificant(before, after)) {
58
+ out.push(' ');
59
+ }
60
+ return;
61
+ }
62
+ // A declaration's terminator is redundant against the block's own close.
63
+ // Only a bare `;` qualifies: an escaped one is part of a value, and it
64
+ // arrives as an `escape` span rather than a structural `;`.
65
+ if (span.kind === 'structural' &&
66
+ span.text === '}' &&
67
+ significant[significantIndex - 1]?.kind === 'structural' &&
68
+ significant[significantIndex - 1]?.text === ';') {
69
+ out.pop();
70
+ }
71
+ out.push(span.text);
72
+ significantIndex += 1;
73
+ });
74
+ return out.join('').trim();
75
+ };
76
+ exports.minifyCss = minifyCss;
77
+ //# sourceMappingURL=minify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"minify.js","sourceRoot":"","sources":["../../src/minify.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,yCAAmD;AAEnD;;;;;;GAMG;AACH,MAAM,kBAAkB,GAAG,CACzB,MAA2B,EAC3B,KAA0B,EACjB,EAAE;IACX,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAChC,0EAA0E;QAC1E,gEAAgE;QAChE,OAAO,KAAK,CAAC,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,KAAK,OAAO,CAAC;IACvD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;;;;;;GAQG;AACI,MAAM,SAAS,GAAG,CAAC,KAAa,EAAU,EAAE;IACjD,4EAA4E;IAC5E,0EAA0E;IAC1E,0CAA0C;IAC1C,MAAM,KAAK,GAAG,IAAA,kBAAO,EAAC,KAAK,CAAC;SACzB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;SACzC,MAAM,CACL,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CACnB,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK,YAAY,CACtE,CAAC;IACJ,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,yEAAyE;IACzE,kCAAkC;IAClC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;IACvE,IAAI,gBAAgB,GAAG,CAAC,CAAC;IAEzB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACrB,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,WAAW,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,WAAW,CAAC,gBAAgB,CAAC,CAAC;YAC5C,IAAI,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;gBACtC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,CAAC;YACD,OAAO;QACT,CAAC;QAED,yEAAyE;QACzE,uEAAuE;QACvE,4DAA4D;QAC5D,IACE,IAAI,CAAC,IAAI,KAAK,YAAY;YAC1B,IAAI,CAAC,IAAI,KAAK,GAAG;YACjB,WAAW,CAAC,gBAAgB,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK,YAAY;YACxD,WAAW,CAAC,gBAAgB,GAAG,CAAC,CAAC,EAAE,IAAI,KAAK,GAAG,EAC/C,CAAC;YACD,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC;QAED,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,gBAAgB,IAAI,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7B,CAAC,CAAC;AA3CW,QAAA,SAAS,aA2CpB","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\nimport { type CssSpan, scanCss } from './css_scan';\n\n/**\n * A space between two non-structural spans is significant wherever it sits: a\n * descendant combinator in a selector (`.a .b`), a token separator in a value\n * (`margin:0 auto`). Beside a structural character it is noise, except before\n * a pseudo-class colon in a rules block — `.menu :hover` is not `.menu:hover`,\n * while `color : red` is `color:red`.\n */\nconst spaceIsSignificant = (\n before: CssSpan | undefined,\n after: CssSpan | undefined\n): boolean => {\n if (!before || !after) {\n return false;\n }\n if (before.kind === 'structural') {\n return false;\n }\n if (after.kind === 'structural') {\n // Only a pseudo-class colon in a selector keeps the space in front of it.\n // Space before `{`, `}`, `;`, `,`, or `>` is never significant.\n return after.text === ':' && after.block === 'rules';\n }\n return true;\n};\n\n/**\n * Strips comments and insignificant whitespace from CSS.\n *\n * Strings, unquoted `url(…)` tokens, and backslash escapes pass through\n * untouched: their contents are literal, so a `/*` or a `;` inside one is data\n * rather than syntax.\n *\n * @param value Raw CSS text.\n */\nexport const minifyCss = (value: string): string => {\n // Dropping comments can leave two whitespace spans adjacent — `.a /*c*/ .b`\n // — and emitting one space per span would keep both. Coalescing after the\n // filter makes the run a single decision.\n const spans = scanCss(value)\n .filter((span) => span.kind !== 'comment')\n .filter(\n (span, index, all) =>\n span.kind !== 'whitespace' || all[index - 1]?.kind !== 'whitespace'\n );\n const out: string[] = [];\n // Indices into `spans` of what has been emitted, so lookaround skips the\n // whitespace being decided about.\n const significant = spans.filter((span) => span.kind !== 'whitespace');\n let significantIndex = 0;\n\n spans.forEach((span) => {\n if (span.kind === 'whitespace') {\n const before = significant[significantIndex - 1];\n const after = significant[significantIndex];\n if (spaceIsSignificant(before, after)) {\n out.push(' ');\n }\n return;\n }\n\n // A declaration's terminator is redundant against the block's own close.\n // Only a bare `;` qualifies: an escaped one is part of a value, and it\n // arrives as an `escape` span rather than a structural `;`.\n if (\n span.kind === 'structural' &&\n span.text === '}' &&\n significant[significantIndex - 1]?.kind === 'structural' &&\n significant[significantIndex - 1]?.text === ';'\n ) {\n out.pop();\n }\n\n out.push(span.text);\n significantIndex += 1;\n });\n\n return out.join('').trim();\n};\n"]}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
4
+ * or more contributor license agreements. Licensed under the Elastic License
5
+ * 2.0; you may not use this file except in compliance with the Elastic License
6
+ * 2.0.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.createStyleNameResolver = exports.cssVarName = exports.createCompactNameMap = exports.compactNameForIndex = void 0;
10
+ const compactAlphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
11
+ const compactNameForIndex = (index) => {
12
+ if (!Number.isInteger(index) || index < 0) {
13
+ throw new Error(`Compact name index must be a non-negative integer.`);
14
+ }
15
+ const base = compactAlphabet.length;
16
+ let remaining = index;
17
+ let length = 1;
18
+ while (remaining >= base ** length) {
19
+ remaining -= base ** length;
20
+ length += 1;
21
+ }
22
+ let name = '';
23
+ for (let position = length - 1; position >= 0; position -= 1) {
24
+ const divisor = base ** position;
25
+ const digit = Math.floor(remaining / divisor);
26
+ name += compactAlphabet[digit] ?? '';
27
+ remaining %= divisor;
28
+ }
29
+ return name;
30
+ };
31
+ exports.compactNameForIndex = compactNameForIndex;
32
+ /** Compact names are assigned from sorted keys so emission is deterministic. */
33
+ const createCompactNameMap = (keys) => {
34
+ const uniqueKeys = [...new Set(keys)].sort();
35
+ return new Map(uniqueKeys.map((key, index) => [key, (0, exports.compactNameForIndex)(index)]));
36
+ };
37
+ exports.createCompactNameMap = createCompactNameMap;
38
+ const readableClassName = (prefix, key, fallback) => fallback ?? `${prefix}-${key.replaceAll('/', '-')}`;
39
+ /**
40
+ * Readable custom-property name: `--${prefix}-${path}` with `/` joined on `-` and a leading `vars/` stripped.
41
+ *
42
+ * @param prefix Brand prefix (e.g. `'eui'`).
43
+ * @param path Theme or contextual-var path (e.g. `'colors/ink'`, `'vars/chip/look/bg'`).
44
+ */
45
+ const cssVarName = (prefix, path) => `--${prefix}-${path.replace(/^vars\//, '').replaceAll('/', '-')}`;
46
+ exports.cssVarName = cssVarName;
47
+ const compactLookup = (map, key, kind) => {
48
+ const name = map.get(key);
49
+ if (!name) {
50
+ throw new Error(`No compact ${kind} name registered for "${key}".`);
51
+ }
52
+ return name;
53
+ };
54
+ /** Maps semantic keys to readable (`<prefix>-<key>`) or compact (`a`, `b`, …) names. */
55
+ const createStyleNameResolver = ({ names, prefix, classKeys = [], cssVarKeys = [], }) => {
56
+ const classMap = (0, exports.createCompactNameMap)(classKeys);
57
+ const cssVarMap = (0, exports.createCompactNameMap)(cssVarKeys);
58
+ const cssVar = (key) => {
59
+ if (names === 'readable') {
60
+ return (0, exports.cssVarName)(prefix, key);
61
+ }
62
+ return `--${compactLookup(cssVarMap, key, 'CSS variable')}`;
63
+ };
64
+ return {
65
+ names,
66
+ className: (key, fallback) => {
67
+ if (names === 'readable') {
68
+ return readableClassName(prefix, key, fallback);
69
+ }
70
+ return compactLookup(classMap, key, 'class');
71
+ },
72
+ cssVar,
73
+ cssVarRef: (key) => `var(${cssVar(key)})`,
74
+ };
75
+ };
76
+ exports.createStyleNameResolver = createStyleNameResolver;
77
+ //# sourceMappingURL=names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"names.js","sourceRoot":"","sources":["../../src/names.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\n/** Naming scheme: `compact` assigns sequential identifiers by sorted key index, `readable` emits descriptive ones. */\nexport type StyleNameMode = 'compact' | 'readable';\n/** Destination format for the CSS collection. */\nexport type StyleTarget = 'artifact' | 'stylesheet';\n\n/** Context for resolving keys into final class or custom-property names. */\nexport interface StyleNameResolver {\n /** The naming mode used by this resolver. */\n readonly names: StyleNameMode;\n /** Resolves a handle key into a CSS class name. */\n className(key: string, readableName?: string): string;\n /** Resolves a variable key into a custom property name. */\n cssVar(key: string): `--${string}`;\n /** Resolves a variable key into a `var(...)` reference. */\n cssVarRef(key: string): `var(--${string})`;\n}\n\n/** Inputs for {@link createStyleNameResolver}. */\nexport interface StyleNameResolverOptions {\n /** Naming strategy (`compact` or `readable`). */\n names: StyleNameMode;\n /** Brand prefix for readable names (`<prefix>-<key>` / `--<prefix>-<key>`), e.g. `'aui'`. */\n prefix: string;\n /** Keys defining the compact class-name domain. */\n classKeys?: Iterable<string>;\n /** Keys defining the compact custom-property domain. */\n cssVarKeys?: Iterable<string>;\n}\n\nconst compactAlphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\nexport const compactNameForIndex = (index: number): string => {\n if (!Number.isInteger(index) || index < 0) {\n throw new Error(`Compact name index must be a non-negative integer.`);\n }\n\n const base = compactAlphabet.length;\n let remaining = index;\n let length = 1;\n\n while (remaining >= base ** length) {\n remaining -= base ** length;\n length += 1;\n }\n\n let name = '';\n for (let position = length - 1; position >= 0; position -= 1) {\n const divisor = base ** position;\n const digit = Math.floor(remaining / divisor);\n name += compactAlphabet[digit] ?? '';\n remaining %= divisor;\n }\n\n return name;\n};\n\n/** Compact names are assigned from sorted keys so emission is deterministic. */\nexport const createCompactNameMap = (\n keys: Iterable<string>\n): ReadonlyMap<string, string> => {\n const uniqueKeys = [...new Set(keys)].sort();\n return new Map(\n uniqueKeys.map((key, index) => [key, compactNameForIndex(index)])\n );\n};\n\nconst readableClassName = (\n prefix: string,\n key: string,\n fallback?: string\n): string => fallback ?? `${prefix}-${key.replaceAll('/', '-')}`;\n\n/**\n * Readable custom-property name: `--${prefix}-${path}` with `/` joined on `-` and a leading `vars/` stripped.\n *\n * @param prefix Brand prefix (e.g. `'eui'`).\n * @param path Theme or contextual-var path (e.g. `'colors/ink'`, `'vars/chip/look/bg'`).\n */\nexport const cssVarName = (prefix: string, path: string): `--${string}` =>\n `--${prefix}-${path.replace(/^vars\\//, '').replaceAll('/', '-')}`;\n\nconst compactLookup = (\n map: ReadonlyMap<string, string>,\n key: string,\n kind: 'class' | 'CSS variable'\n): string => {\n const name = map.get(key);\n if (!name) {\n throw new Error(`No compact ${kind} name registered for \"${key}\".`);\n }\n return name;\n};\n\n/** Maps semantic keys to readable (`<prefix>-<key>`) or compact (`a`, `b`, …) names. */\nexport const createStyleNameResolver = ({\n names,\n prefix,\n classKeys = [],\n cssVarKeys = [],\n}: StyleNameResolverOptions): StyleNameResolver => {\n const classMap = createCompactNameMap(classKeys);\n const cssVarMap = createCompactNameMap(cssVarKeys);\n\n const cssVar = (key: string): `--${string}` => {\n if (names === 'readable') {\n return cssVarName(prefix, key);\n }\n return `--${compactLookup(cssVarMap, key, 'CSS variable')}`;\n };\n\n return {\n names,\n className: (key, fallback) => {\n if (names === 'readable') {\n return readableClassName(prefix, key, fallback);\n }\n return compactLookup(classMap, key, 'class');\n },\n cssVar,\n cssVarRef: (key) => `var(${cssVar(key)})`,\n };\n};\n"]}