@elastic/distillate 0.0.0 → 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 (285) 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 +420 -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 +79 -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 +42 -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/styles/authoring.js +169 -0
  37. package/dist/cjs/styles/authoring.js.map +1 -0
  38. package/dist/cjs/styles/declarations.js +139 -0
  39. package/dist/cjs/styles/declarations.js.map +1 -0
  40. package/dist/cjs/styles/index.js +32 -0
  41. package/dist/cjs/styles/index.js.map +1 -0
  42. package/dist/cjs/styles/module.js +233 -0
  43. package/dist/cjs/styles/module.js.map +1 -0
  44. package/dist/cjs/styles/registry.js +187 -0
  45. package/dist/cjs/styles/registry.js.map +1 -0
  46. package/dist/cjs/styles/types.js +9 -0
  47. package/dist/cjs/styles/types.js.map +1 -0
  48. package/dist/cjs/testing.js +37 -0
  49. package/dist/cjs/testing.js.map +1 -0
  50. package/dist/cjs/theme.js +249 -0
  51. package/dist/cjs/theme.js.map +1 -0
  52. package/dist/cjs/tokens/contextual_var.js +39 -0
  53. package/dist/cjs/tokens/contextual_var.js.map +1 -0
  54. package/dist/cjs/tokens/index.js +24 -0
  55. package/dist/cjs/tokens/index.js.map +1 -0
  56. package/dist/cjs/tokens/kind.js +14 -0
  57. package/dist/cjs/tokens/kind.js.map +1 -0
  58. package/dist/cjs/tokens/light_dark.js +42 -0
  59. package/dist/cjs/tokens/light_dark.js.map +1 -0
  60. package/dist/cjs/tokens/scale_token.js +28 -0
  61. package/dist/cjs/tokens/scale_token.js.map +1 -0
  62. package/dist/cjs/tokens/theme_token.js +28 -0
  63. package/dist/cjs/tokens/theme_token.js.map +1 -0
  64. package/dist/cjs/var_invariant.js +115 -0
  65. package/dist/cjs/var_invariant.js.map +1 -0
  66. package/dist/collector.d.ts +84 -0
  67. package/dist/collector.d.ts.map +1 -0
  68. package/dist/collector.js +416 -0
  69. package/dist/collector.js.map +1 -0
  70. package/dist/css_scan.d.ts +57 -0
  71. package/dist/css_scan.d.ts.map +1 -0
  72. package/dist/css_scan.js +180 -0
  73. package/dist/css_scan.js.map +1 -0
  74. package/dist/dom_sink.d.ts +27 -0
  75. package/dist/dom_sink.d.ts.map +1 -0
  76. package/dist/dom_sink.js +36 -0
  77. package/dist/dom_sink.js.map +1 -0
  78. package/dist/emotion.d.ts +47 -0
  79. package/dist/emotion.d.ts.map +1 -0
  80. package/dist/emotion.js +184 -0
  81. package/dist/emotion.js.map +1 -0
  82. package/dist/engine.d.ts +41 -0
  83. package/dist/engine.d.ts.map +1 -0
  84. package/dist/engine.js +75 -0
  85. package/dist/engine.js.map +1 -0
  86. package/dist/environment.d.ts +43 -0
  87. package/dist/environment.d.ts.map +1 -0
  88. package/dist/environment.js +8 -0
  89. package/dist/environment.js.map +1 -0
  90. package/dist/hash.d.ts +2 -0
  91. package/dist/hash.d.ts.map +1 -0
  92. package/dist/hash.js +82 -0
  93. package/dist/hash.js.map +1 -0
  94. package/dist/idents.d.ts +9 -0
  95. package/dist/idents.d.ts.map +1 -0
  96. package/dist/idents.js +19 -0
  97. package/dist/idents.js.map +1 -0
  98. package/dist/index.d.ts +9 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +14 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/instance.d.ts +16 -0
  103. package/dist/instance.d.ts.map +1 -0
  104. package/dist/instance.js +30 -0
  105. package/dist/instance.js.map +1 -0
  106. package/dist/local_vars.d.ts +75 -0
  107. package/dist/local_vars.d.ts.map +1 -0
  108. package/dist/local_vars.js +92 -0
  109. package/dist/local_vars.js.map +1 -0
  110. package/dist/minify.d.ts +11 -0
  111. package/dist/minify.d.ts.map +1 -0
  112. package/dist/minify.js +73 -0
  113. package/dist/minify.js.map +1 -0
  114. package/dist/names.d.ts +39 -0
  115. package/dist/names.d.ts.map +1 -0
  116. package/dist/names.js +70 -0
  117. package/dist/names.js.map +1 -0
  118. package/dist/nesting.d.ts +59 -0
  119. package/dist/nesting.d.ts.map +1 -0
  120. package/dist/nesting.js +400 -0
  121. package/dist/nesting.js.map +1 -0
  122. package/dist/runtime.d.ts +36 -0
  123. package/dist/runtime.d.ts.map +1 -0
  124. package/dist/runtime.js +252 -0
  125. package/dist/runtime.js.map +1 -0
  126. package/dist/styles/authoring.d.ts +59 -0
  127. package/dist/styles/authoring.d.ts.map +1 -0
  128. package/dist/styles/authoring.js +155 -0
  129. package/dist/styles/authoring.js.map +1 -0
  130. package/dist/styles/declarations.d.ts +10 -0
  131. package/dist/styles/declarations.d.ts.map +1 -0
  132. package/dist/styles/declarations.js +132 -0
  133. package/dist/styles/declarations.js.map +1 -0
  134. package/dist/styles/index.d.ts +7 -0
  135. package/dist/styles/index.d.ts.map +1 -0
  136. package/dist/styles/index.js +12 -0
  137. package/dist/styles/index.js.map +1 -0
  138. package/dist/styles/module.d.ts +5 -0
  139. package/dist/styles/module.d.ts.map +1 -0
  140. package/dist/styles/module.js +229 -0
  141. package/dist/styles/module.js.map +1 -0
  142. package/dist/styles/registry.d.ts +48 -0
  143. package/dist/styles/registry.d.ts.map +1 -0
  144. package/dist/styles/registry.js +182 -0
  145. package/dist/styles/registry.js.map +1 -0
  146. package/dist/styles/types.d.ts +211 -0
  147. package/dist/styles/types.d.ts.map +1 -0
  148. package/dist/styles/types.js +8 -0
  149. package/dist/styles/types.js.map +1 -0
  150. package/dist/testing.d.ts +10 -0
  151. package/dist/testing.d.ts.map +1 -0
  152. package/dist/testing.js +31 -0
  153. package/dist/testing.js.map +1 -0
  154. package/dist/theme.d.ts +85 -0
  155. package/dist/theme.d.ts.map +1 -0
  156. package/dist/theme.js +240 -0
  157. package/dist/theme.js.map +1 -0
  158. package/dist/tokens/contextual_var.d.ts +35 -0
  159. package/dist/tokens/contextual_var.d.ts.map +1 -0
  160. package/dist/tokens/contextual_var.js +33 -0
  161. package/dist/tokens/contextual_var.js.map +1 -0
  162. package/dist/tokens/index.d.ts +5 -0
  163. package/dist/tokens/index.d.ts.map +1 -0
  164. package/dist/tokens/index.js +11 -0
  165. package/dist/tokens/index.js.map +1 -0
  166. package/dist/tokens/kind.d.ts +2 -0
  167. package/dist/tokens/kind.d.ts.map +1 -0
  168. package/dist/tokens/kind.js +10 -0
  169. package/dist/tokens/kind.js.map +1 -0
  170. package/dist/tokens/light_dark.d.ts +20 -0
  171. package/dist/tokens/light_dark.d.ts.map +1 -0
  172. package/dist/tokens/light_dark.js +37 -0
  173. package/dist/tokens/light_dark.js.map +1 -0
  174. package/dist/tokens/scale_token.d.ts +20 -0
  175. package/dist/tokens/scale_token.d.ts.map +1 -0
  176. package/dist/tokens/scale_token.js +23 -0
  177. package/dist/tokens/scale_token.js.map +1 -0
  178. package/dist/tokens/theme_token.d.ts +20 -0
  179. package/dist/tokens/theme_token.d.ts.map +1 -0
  180. package/dist/tokens/theme_token.js +23 -0
  181. package/dist/tokens/theme_token.js.map +1 -0
  182. package/dist/var_invariant.d.ts +25 -0
  183. package/dist/var_invariant.d.ts.map +1 -0
  184. package/dist/var_invariant.js +108 -0
  185. package/dist/var_invariant.js.map +1 -0
  186. package/docs/concepts/authoring.md +115 -0
  187. package/docs/concepts/collection.md +66 -0
  188. package/docs/concepts/distillery.md +47 -0
  189. package/docs/concepts/index.md +18 -0
  190. package/docs/concepts/naming-and-output.md +123 -0
  191. package/docs/concepts/ordering.md +61 -0
  192. package/docs/concepts/single-copy.md +103 -0
  193. package/docs/concepts/tokens.md +99 -0
  194. package/docs/docset.yml +53 -0
  195. package/docs/examples/01-stylesheet.ts +20 -0
  196. package/docs/examples/02-artifact.ts +26 -0
  197. package/docs/examples/03-variants.ts +40 -0
  198. package/docs/examples/04-emotion.ts +33 -0
  199. package/docs/examples/05-var-invariant.ts +31 -0
  200. package/docs/examples/06-payload.ts +85 -0
  201. package/docs/examples/fixture.ts +22 -0
  202. package/docs/getting-started/index.md +14 -0
  203. package/docs/getting-started/installation.md +30 -0
  204. package/docs/getting-started/quick-start.md +61 -0
  205. package/docs/getting-started/your-first-stylesheet.md +57 -0
  206. package/docs/guides/compact-artifacts.md +87 -0
  207. package/docs/guides/emotion-migration.md +60 -0
  208. package/docs/guides/index.md +17 -0
  209. package/docs/guides/name-collisions.md +37 -0
  210. package/docs/guides/non-css-surfaces.md +73 -0
  211. package/docs/guides/react-renderer.md +158 -0
  212. package/docs/guides/theming.md +107 -0
  213. package/docs/guides/var-invariant.md +24 -0
  214. package/docs/guides/vs-emotion.md +61 -0
  215. package/docs/index.md +73 -0
  216. package/docs/logo.svg +7 -0
  217. package/docs/playground/index.html +12 -0
  218. package/docs/playground/package.json +23 -0
  219. package/docs/playground/src/app/app.tsx +109 -0
  220. package/docs/playground/src/app/css_panel.tsx +119 -0
  221. package/docs/playground/src/app/editor_panel.tsx +87 -0
  222. package/docs/playground/src/app/index.ts +8 -0
  223. package/docs/playground/src/app/monaco_css_editor.tsx +84 -0
  224. package/docs/playground/src/app/monaco_source_editor.tsx +132 -0
  225. package/docs/playground/src/app/preview_panel.tsx +99 -0
  226. package/docs/playground/src/app/tokens_panel.tsx +117 -0
  227. package/docs/playground/src/app/types.ts +10 -0
  228. package/docs/playground/src/examples/snippets.test.ts +28 -0
  229. package/docs/playground/src/examples/snippets.ts +418 -0
  230. package/docs/playground/src/lib/compile.test.ts +157 -0
  231. package/docs/playground/src/lib/compile.ts +242 -0
  232. package/docs/playground/src/lib/demo_environment.test.ts +123 -0
  233. package/docs/playground/src/lib/demo_environment.ts +140 -0
  234. package/docs/playground/src/lib/editor_lib.test.ts +39 -0
  235. package/docs/playground/src/lib/editor_lib.ts +142 -0
  236. package/docs/playground/src/lib/format_css.test.ts +41 -0
  237. package/docs/playground/src/lib/format_css.ts +71 -0
  238. package/docs/playground/src/main.tsx +25 -0
  239. package/docs/playground/src/setup/chrome.test.ts +47 -0
  240. package/docs/playground/src/setup/chrome.ts +365 -0
  241. package/docs/playground/src/setup/monaco_env.ts +64 -0
  242. package/docs/playground/tsconfig.json +22 -0
  243. package/docs/playground/vite.config.ts +37 -0
  244. package/docs/playground/vitest.config.ts +35 -0
  245. package/docs/playground.md +28 -0
  246. package/docs/reference/api/emotion.md +372 -0
  247. package/docs/reference/api/index-1.md +2180 -0
  248. package/docs/reference/api/index.md +9 -0
  249. package/docs/reference/api/testing.md +92 -0
  250. package/docs/reference/api.md +12 -0
  251. package/docs/reference/entry-points.md +125 -0
  252. package/docs/reference/environment.md +60 -0
  253. package/docs/reference/index.md +11 -0
  254. package/docs/reference/okf-map.md +92 -0
  255. package/package.json +127 -4
  256. package/src/collector.ts +526 -0
  257. package/src/css_scan.ts +263 -0
  258. package/src/dom_sink.ts +65 -0
  259. package/src/emotion.ts +311 -0
  260. package/src/engine.ts +191 -0
  261. package/src/environment.ts +56 -0
  262. package/src/hash.ts +111 -0
  263. package/src/idents.ts +21 -0
  264. package/src/index.ts +93 -0
  265. package/src/instance.ts +49 -0
  266. package/src/local_vars.ts +220 -0
  267. package/src/minify.ts +87 -0
  268. package/src/names.ts +129 -0
  269. package/src/nesting.ts +596 -0
  270. package/src/runtime.ts +428 -0
  271. package/src/styles/authoring.ts +244 -0
  272. package/src/styles/declarations.ts +172 -0
  273. package/src/styles/index.ts +58 -0
  274. package/src/styles/module.ts +396 -0
  275. package/src/styles/registry.ts +261 -0
  276. package/src/styles/types.ts +283 -0
  277. package/src/testing.ts +48 -0
  278. package/src/theme.ts +454 -0
  279. package/src/tokens/contextual_var.ts +72 -0
  280. package/src/tokens/index.ts +17 -0
  281. package/src/tokens/kind.ts +13 -0
  282. package/src/tokens/light_dark.ts +58 -0
  283. package/src/tokens/scale_token.ts +41 -0
  284. package/src/tokens/theme_token.ts +42 -0
  285. package/src/var_invariant.ts +147 -0
@@ -0,0 +1,257 @@
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.composeThemeSelector = exports.renderStyles = void 0;
10
+ const css_scan_1 = require("./css_scan");
11
+ const local_vars_1 = require("./local_vars");
12
+ const minify_1 = require("./minify");
13
+ const names_1 = require("./names");
14
+ const theme_1 = require("./theme");
15
+ /**
16
+ * Emits collected CSS: theme block, then entries, minified.
17
+ *
18
+ * @param environment Theme vars, prefix, and scope for this render.
19
+ * @param collector Reachable entries and deps.
20
+ * @param resolver Defaults to `collector.createResolver()`.
21
+ */
22
+ const renderStyles = (environment, collector, resolver = collector.createResolver(), options = {}) => {
23
+ const ctx = { environment, collector, resolver, options };
24
+ const bodyFragments = collector.collectedEntries.map((entry) => {
25
+ if (entry.kind === 'handle') {
26
+ return renderHandle(entry, ctx);
27
+ }
28
+ if (entry.kind === 'rule') {
29
+ return renderRule(entry, ctx);
30
+ }
31
+ const inner = entry.rules
32
+ .map((rule) => renderRule(rule, ctx))
33
+ .filter((fragment) => fragment.length > 0);
34
+ return inner.length > 0
35
+ ? `@${entry.atRule ?? 'media'} ${entry.query}{${inner.join('')}}`
36
+ : '';
37
+ });
38
+ const bodyCss = bodyFragments.join('');
39
+ const fragments = [renderThemeVars(ctx), bodyCss];
40
+ return (0, minify_1.minifyCss)(fragments.join(''));
41
+ };
42
+ exports.renderStyles = renderStyles;
43
+ const renderThemeVars = (ctx) => {
44
+ const { environment, options } = ctx;
45
+ const selected = options.flatten
46
+ ? themeVariation(environment, options.flatten)
47
+ : undefined;
48
+ const primaryVars = selected && !selected.media ? selected.themeVars : environment.themeVars;
49
+ const blocks = [renderVarBlock(ctx, environment.themeScope, primaryVars)];
50
+ if (selected?.media) {
51
+ blocks.push(wrapMedia(selected.media, renderVarBlock(ctx, environment.themeScope, selected.diffs)));
52
+ }
53
+ for (const alternate of options.alternates ?? []) {
54
+ blocks.push(renderAlternate(ctx, alternate));
55
+ }
56
+ return blocks.join('');
57
+ };
58
+ const renderAlternate = (ctx, alternate) => {
59
+ const resolved = themeVariation(ctx.environment, alternate.variation);
60
+ const selector = alternate.selector
61
+ ? (0, exports.composeThemeSelector)(ctx.environment.themeScope, alternate.selector)
62
+ : resolved.media
63
+ ? ctx.environment.themeScope
64
+ : undefined;
65
+ if (!selector) {
66
+ throw new Error(`Alternate variation "${alternate.variation}" needs a selector (media-conditioned variations may omit one).`);
67
+ }
68
+ const block = renderVarBlock(ctx, selector, resolved.diffs);
69
+ return resolved.media ? wrapMedia(resolved.media, block) : block;
70
+ };
71
+ const themeVariation = (environment, name) => (0, theme_1.requireThemeVariation)(environment.variations, name);
72
+ const renderVarBlock = (ctx, selector, vars) => {
73
+ const declarations = [...ctx.collector.collectedThemeDeps]
74
+ .sort()
75
+ .flatMap((path) => {
76
+ const definition = vars[path];
77
+ if (!definition) {
78
+ return [];
79
+ }
80
+ return [
81
+ `${ctx.resolver.cssVar(path)}:${formatThemeValue(definition, ctx.options.themeValueOverrides?.[path], ctx.options.scheme)}`,
82
+ ];
83
+ });
84
+ return declarations.length > 0
85
+ ? `${selector}{${declarations.join(';')}}`
86
+ : '';
87
+ };
88
+ const wrapMedia = (query, block) => block.length > 0 ? `@media ${query}{${block}}` : '';
89
+ /** Composes `themeScope` with a per-render alternate selector. */
90
+ const composeThemeSelector = (themeScope, selector) => {
91
+ const scope = themeScope.trim();
92
+ const extra = selector.trim();
93
+ if (extra.length === 0) {
94
+ throw new Error('Alternate selector must be non-empty.');
95
+ }
96
+ if (scope === ':host') {
97
+ return extra.startsWith(':host') ? extra : `:host(${extra})`;
98
+ }
99
+ if (/^[.#[:]/.test(extra)) {
100
+ return `${scope}${extra}`;
101
+ }
102
+ return `${scope} ${extra}`;
103
+ };
104
+ exports.composeThemeSelector = composeThemeSelector;
105
+ const formatThemeValue = (definition, override, scheme) => override ?? (scheme ? definition[scheme] : (0, theme_1.serializedThemeValue)(definition));
106
+ const renderHandle = (handle, ctx) => {
107
+ const body = renderDeclarations(handle.declarations, { handle }, ctx);
108
+ if ((0, css_scan_1.isBlankCss)(body)) {
109
+ return '';
110
+ }
111
+ const className = ctx.resolver.className(handle.key, handle.readableName);
112
+ return `.${className}{${body}}`;
113
+ };
114
+ const renderRule = (rule, ctx) => {
115
+ // Rules don't have a host handle for per-handle reachability — default
116
+ // markers in a rule's declaration emit every listed key. In practice
117
+ // authors place default markers on handle declarations; this branch keeps
118
+ // the runtime well-defined if a rule ever does carry one.
119
+ const body = renderDeclarations(rule.declarations, {}, ctx);
120
+ if ((0, css_scan_1.isBlankCss)(body)) {
121
+ return '';
122
+ }
123
+ const selector = rule.selector(createSelectorResolver(rule, ctx));
124
+ return `${selector}{${body}}`;
125
+ };
126
+ const renderDeclarations = (declarations, host, ctx) => {
127
+ const out = [];
128
+ for (const segment of declarations.css) {
129
+ out.push(renderSegment(segment, host, ctx));
130
+ }
131
+ return out.join('');
132
+ };
133
+ const renderSegment = (segment, host, ctx) => {
134
+ if (typeof segment === 'string') {
135
+ return resolveStringSegment(segment, ctx);
136
+ }
137
+ if ((0, local_vars_1.isLocalVarDefaultMarker)(segment)) {
138
+ return renderDefaultMarker(segment, host, ctx);
139
+ }
140
+ if ((0, local_vars_1.isLocalVarOverrideMarker)(segment)) {
141
+ return renderOverrideMarker(segment, ctx);
142
+ }
143
+ return '';
144
+ };
145
+ const renderDefaultMarker = (marker, host, ctx) => {
146
+ const reachable = host.handle
147
+ ? ctx.collector.reachableDefaults(host.handle, marker.groupPath)
148
+ : null;
149
+ const declarations = [];
150
+ for (const { key, path, value } of marker.defaults) {
151
+ if (reachable && !reachable.has(key)) {
152
+ continue;
153
+ }
154
+ const stringified = stringifyMarkerValue(value);
155
+ const resolvedValue = resolveStringSegment(stringified, ctx);
156
+ const propIdentifier = ctx.resolver.cssVar(path);
157
+ declarations.push(`${propIdentifier}:${resolvedValue}`);
158
+ }
159
+ return declarations.length > 0 ? `${declarations.join(';')};` : '';
160
+ };
161
+ const renderOverrideMarker = (marker, ctx) => {
162
+ const declarations = [];
163
+ for (const { path, value } of marker.overrides) {
164
+ const stringified = stringifyMarkerValue(value);
165
+ const resolvedValue = resolveStringSegment(stringified, ctx);
166
+ const propIdentifier = ctx.resolver.cssVar(path);
167
+ declarations.push(`${propIdentifier}:${resolvedValue}`);
168
+ }
169
+ return declarations.length > 0 ? `${declarations.join(';')};` : '';
170
+ };
171
+ const stringifyMarkerValue = (value) => {
172
+ if (typeof value === 'string') {
173
+ return value;
174
+ }
175
+ if (typeof value === 'number') {
176
+ return String(value);
177
+ }
178
+ if (value !== null &&
179
+ typeof value === 'object' &&
180
+ typeof value.toString === 'function' &&
181
+ value.toString !== Object.prototype.toString) {
182
+ return value.toString();
183
+ }
184
+ throw new Error(`t.vars(...) value must be a string, number, theme token, contextual var, scale token, or local var ref; received ${describeValue(value)}.`);
185
+ };
186
+ const describeValue = (value) => {
187
+ if (value === null) {
188
+ return 'null';
189
+ }
190
+ if (value === undefined) {
191
+ return 'undefined';
192
+ }
193
+ if (typeof value === 'object') {
194
+ return '[object Object]';
195
+ }
196
+ return `${typeof value}`;
197
+ };
198
+ const createSelectorResolver = (rule, ctx) => {
199
+ const { resolver } = ctx;
200
+ const selectorResolver = ((handle) => resolver.className(handle.key, handle.readableName));
201
+ const module = ctx.collector.registry.module(rule.moduleName);
202
+ for (const handle of module?.handleList ?? []) {
203
+ defineSelectorAlias(selectorResolver, handle.localName, handle, resolver);
204
+ const leafName = handle.localName.split('/').at(-1);
205
+ if (leafName && leafName !== handle.localName) {
206
+ defineSelectorAlias(selectorResolver, leafName, handle, resolver);
207
+ }
208
+ }
209
+ return selectorResolver;
210
+ };
211
+ const defineSelectorAlias = (selectorResolver, name, handle, resolver) => {
212
+ if (!/^[A-Za-z_$][\w$]*$/.test(name) || name in selectorResolver) {
213
+ return;
214
+ }
215
+ Object.defineProperty(selectorResolver, name, {
216
+ configurable: true,
217
+ enumerable: true,
218
+ get: () => `.${resolver.className(handle.key, handle.readableName)}`,
219
+ });
220
+ };
221
+ const resolveStringSegment = (cssText, ctx) => {
222
+ return (0, css_scan_1.scanCss)(cssText)
223
+ .map((span) => (0, css_scan_1.isOpaque)(span) ? span.text : resolveCodeSpan(span.text, ctx))
224
+ .join('');
225
+ };
226
+ const resolveCodeSpan = (cssText, ctx) => {
227
+ let result = cssText;
228
+ const paths = new Set([
229
+ ...Object.keys(ctx.environment.themeVars),
230
+ ...(ctx.environment.sharedVars ?? []),
231
+ ...ctx.collector.collectedVarDeps,
232
+ ]);
233
+ for (const path of paths) {
234
+ result = substituteReadableVar(result, path, ctx);
235
+ }
236
+ return result;
237
+ };
238
+ const substituteReadableVar = (cssText, path, ctx) => {
239
+ const readableName = (0, names_1.cssVarName)(ctx.environment.prefix, path);
240
+ const readableRef = `var(${readableName})`;
241
+ let result = cssText;
242
+ if (result.includes(readableRef)) {
243
+ result = replaceAll(result, readableRef, ctx.resolver.cssVarRef(path));
244
+ }
245
+ if (containsCssIdentifier(result, readableName)) {
246
+ result = replaceCssIdentifier(result, readableName, ctx.resolver.cssVar(path));
247
+ }
248
+ return result;
249
+ };
250
+ const replaceAll = (value, search, replacement) => value.split(search).join(replacement);
251
+ const replaceCssIdentifier = (value, search, replacement) =>
252
+ // Authored and generated CSS only contains valid custom property identifiers.
253
+ // Since every searched token starts with "--", the trailing boundary is enough.
254
+ value.replace(new RegExp(`${escapeRegExp(search)}(?![_a-zA-Z0-9-])`, 'g'), replacement);
255
+ const containsCssIdentifier = (value, search) => new RegExp(`${escapeRegExp(search)}(?![_a-zA-Z0-9-])`).test(value);
256
+ const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
257
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/runtime.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 type { StylesCollector } from './collector';\nimport { isBlankCss, isOpaque, scanCss } from './css_scan';\nimport type { DistilleryEnvironment, ThemeVarDefinition } from './environment';\nimport {\n isLocalVarDefaultMarker,\n isLocalVarOverrideMarker,\n type LocalVarDefaultMarker,\n type LocalVarOverrideMarker,\n} from './local_vars';\nimport { minifyCss } from './minify';\nimport { cssVarName, type StyleNameResolver } from './names';\nimport type {\n Declarations,\n DeclarationSegment,\n StyleHandle,\n StyleRule,\n StyleSelectorResolver,\n} from './styles';\nimport {\n requireThemeVariation,\n type ResolvedThemeVariation,\n serializedThemeValue,\n} from './theme';\n\n/**\n * Emits collected CSS: theme block, then entries, minified.\n *\n * @param environment Theme vars, prefix, and scope for this render.\n * @param collector Reachable entries and deps.\n * @param resolver Defaults to `collector.createResolver()`.\n */\nexport const renderStyles = (\n environment: DistilleryEnvironment<unknown>,\n collector: StylesCollector,\n resolver: StyleNameResolver = collector.createResolver(),\n options: RenderStylesOptions = {}\n): string => {\n const ctx: RenderContext = { environment, collector, resolver, options };\n const bodyFragments = collector.collectedEntries.map((entry) => {\n if (entry.kind === 'handle') {\n return renderHandle(entry, ctx);\n }\n if (entry.kind === 'rule') {\n return renderRule(entry, ctx);\n }\n const inner = entry.rules\n .map((rule) => renderRule(rule, ctx))\n .filter((fragment) => fragment.length > 0);\n return inner.length > 0\n ? `@${entry.atRule ?? 'media'} ${entry.query}{${inner.join('')}}`\n : '';\n });\n const bodyCss = bodyFragments.join('');\n const fragments = [renderThemeVars(ctx), bodyCss];\n\n return minifyCss(fragments.join(''));\n};\n\n/** Per-render variation selection, scheme flatten, alternate blocks, and value overrides. */\nexport interface RenderStylesOptions {\n /** Flatten this declared variation into `themeScope`. Default is the base. A media variation does not replace the primary block; it wraps its diffs in `@media`. */\n flatten?: string;\n /**\n * Emit one scheme's literal instead of `light-dark(...)`.\n *\n * For a target with no color scheme to resolve the function against — an image or PDF backend, email HTML, an older browser.\n */\n scheme?: 'light' | 'dark';\n /** Extra blocks for runtime switching. Each entry emits only the variation's diff. */\n alternates?: readonly ThemeAlternate[];\n /** Override a theme token's emitted value. */\n themeValueOverrides?: Partial<Record<string, string>>;\n}\n\n/** One runtime-switched variation. `selector` is required unless the variation declares `media`. */\nexport interface ThemeAlternate {\n /** Name passed in `DistilleryOptions.variations`. */\n readonly variation: string;\n /** Consuming page selector, composed with `themeScope`. */\n readonly selector?: string;\n}\n\ninterface RenderContext {\n /** Environment supplying theme vars, prefix, and scope. */\n environment: DistilleryEnvironment<unknown>;\n /** Reachable entries and deps for this render. */\n collector: StylesCollector;\n /** Class and CSS-var name resolver for this render. */\n resolver: StyleNameResolver;\n /** Per-render theme value overrides. */\n options: RenderStylesOptions;\n}\n\nconst renderThemeVars = (ctx: RenderContext): string => {\n const { environment, options } = ctx;\n const selected = options.flatten\n ? themeVariation(environment, options.flatten)\n : undefined;\n const primaryVars =\n selected && !selected.media ? selected.themeVars : environment.themeVars;\n const blocks = [renderVarBlock(ctx, environment.themeScope, primaryVars)];\n if (selected?.media) {\n blocks.push(\n wrapMedia(\n selected.media,\n renderVarBlock(ctx, environment.themeScope, selected.diffs)\n )\n );\n }\n for (const alternate of options.alternates ?? []) {\n blocks.push(renderAlternate(ctx, alternate));\n }\n return blocks.join('');\n};\n\nconst renderAlternate = (\n ctx: RenderContext,\n alternate: ThemeAlternate\n): string => {\n const resolved = themeVariation(ctx.environment, alternate.variation);\n const selector = alternate.selector\n ? composeThemeSelector(ctx.environment.themeScope, alternate.selector)\n : resolved.media\n ? ctx.environment.themeScope\n : undefined;\n if (!selector) {\n throw new Error(\n `Alternate variation \"${alternate.variation}\" needs a selector (media-conditioned variations may omit one).`\n );\n }\n const block = renderVarBlock(ctx, selector, resolved.diffs);\n return resolved.media ? wrapMedia(resolved.media, block) : block;\n};\n\nconst themeVariation = (\n environment: DistilleryEnvironment<unknown>,\n name: string\n): ResolvedThemeVariation =>\n requireThemeVariation(environment.variations, name);\n\nconst renderVarBlock = (\n ctx: RenderContext,\n selector: string,\n vars: Readonly<Record<string, ThemeVarDefinition>>\n): string => {\n const declarations = [...ctx.collector.collectedThemeDeps]\n .sort()\n .flatMap((path) => {\n const definition = vars[path];\n if (!definition) {\n return [];\n }\n return [\n `${ctx.resolver.cssVar(path)}:${formatThemeValue(\n definition,\n ctx.options.themeValueOverrides?.[path],\n ctx.options.scheme\n )}`,\n ];\n });\n return declarations.length > 0\n ? `${selector}{${declarations.join(';')}}`\n : '';\n};\n\nconst wrapMedia = (query: string, block: string): string =>\n block.length > 0 ? `@media ${query}{${block}}` : '';\n\n/** Composes `themeScope` with a per-render alternate selector. */\nexport const composeThemeSelector = (\n themeScope: string,\n selector: string\n): string => {\n const scope = themeScope.trim();\n const extra = selector.trim();\n if (extra.length === 0) {\n throw new Error('Alternate selector must be non-empty.');\n }\n if (scope === ':host') {\n return extra.startsWith(':host') ? extra : `:host(${extra})`;\n }\n if (/^[.#[:]/.test(extra)) {\n return `${scope}${extra}`;\n }\n return `${scope} ${extra}`;\n};\n\nconst formatThemeValue = (\n definition: ThemeVarDefinition,\n override: string | undefined,\n scheme: 'light' | 'dark' | undefined\n): string =>\n override ?? (scheme ? definition[scheme] : serializedThemeValue(definition));\n\nconst renderHandle = (handle: StyleHandle, ctx: RenderContext): string => {\n const body = renderDeclarations(handle.declarations, { handle }, ctx);\n if (isBlankCss(body)) {\n return '';\n }\n const className = ctx.resolver.className(handle.key, handle.readableName);\n return `.${className}{${body}}`;\n};\n\nconst renderRule = (rule: StyleRule, ctx: RenderContext): string => {\n // Rules don't have a host handle for per-handle reachability — default\n // markers in a rule's declaration emit every listed key. In practice\n // authors place default markers on handle declarations; this branch keeps\n // the runtime well-defined if a rule ever does carry one.\n const body = renderDeclarations(rule.declarations, {}, ctx);\n if (isBlankCss(body)) {\n return '';\n }\n const selector = rule.selector(createSelectorResolver(rule, ctx));\n return `${selector}{${body}}`;\n};\n\n/** Host for default-marker emission: a handle enables per-handle reachability. */\ninterface DeclarationHostContext {\n /** Host handle whose refs narrow default-marker keys. Omitted for rules. */\n handle?: StyleHandle;\n}\n\nconst renderDeclarations = (\n declarations: Declarations,\n host: DeclarationHostContext,\n ctx: RenderContext\n): string => {\n const out: string[] = [];\n for (const segment of declarations.css) {\n out.push(renderSegment(segment, host, ctx));\n }\n return out.join('');\n};\n\nconst renderSegment = (\n segment: DeclarationSegment,\n host: DeclarationHostContext,\n ctx: RenderContext\n): string => {\n if (typeof segment === 'string') {\n return resolveStringSegment(segment, ctx);\n }\n if (isLocalVarDefaultMarker(segment)) {\n return renderDefaultMarker(segment, host, ctx);\n }\n if (isLocalVarOverrideMarker(segment)) {\n return renderOverrideMarker(segment, ctx);\n }\n return '';\n};\n\nconst renderDefaultMarker = (\n marker: LocalVarDefaultMarker,\n host: DeclarationHostContext,\n ctx: RenderContext\n): string => {\n const reachable = host.handle\n ? ctx.collector.reachableDefaults(host.handle, marker.groupPath)\n : null;\n const declarations: string[] = [];\n for (const { key, path, value } of marker.defaults) {\n if (reachable && !reachable.has(key)) {\n continue;\n }\n const stringified = stringifyMarkerValue(value);\n const resolvedValue = resolveStringSegment(stringified, ctx);\n const propIdentifier = ctx.resolver.cssVar(path);\n declarations.push(`${propIdentifier}:${resolvedValue}`);\n }\n return declarations.length > 0 ? `${declarations.join(';')};` : '';\n};\n\nconst renderOverrideMarker = (\n marker: LocalVarOverrideMarker,\n ctx: RenderContext\n): string => {\n const declarations: string[] = [];\n for (const { path, value } of marker.overrides) {\n const stringified = stringifyMarkerValue(value);\n const resolvedValue = resolveStringSegment(stringified, ctx);\n const propIdentifier = ctx.resolver.cssVar(path);\n declarations.push(`${propIdentifier}:${resolvedValue}`);\n }\n return declarations.length > 0 ? `${declarations.join(';')};` : '';\n};\n\nconst stringifyMarkerValue = (value: unknown): string => {\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number') {\n return String(value);\n }\n if (\n value !== null &&\n typeof value === 'object' &&\n typeof (value as { toString?: () => string }).toString === 'function' &&\n (value as { toString: () => string }).toString !== Object.prototype.toString\n ) {\n return (value as { toString: () => string }).toString();\n }\n throw new Error(\n `t.vars(...) value must be a string, number, theme token, contextual var, scale token, or local var ref; received ${describeValue(value)}.`\n );\n};\n\nconst describeValue = (value: unknown): string => {\n if (value === null) {\n return 'null';\n }\n if (value === undefined) {\n return 'undefined';\n }\n if (typeof value === 'object') {\n return '[object Object]';\n }\n return `${typeof value}`;\n};\n\nconst createSelectorResolver = (\n rule: StyleRule,\n ctx: RenderContext\n): StyleSelectorResolver => {\n const { resolver } = ctx;\n const selectorResolver = ((handle: StyleHandle) =>\n resolver.className(\n handle.key,\n handle.readableName\n )) as StyleSelectorResolver;\n const module = ctx.collector.registry.module(rule.moduleName);\n for (const handle of module?.handleList ?? []) {\n defineSelectorAlias(selectorResolver, handle.localName, handle, resolver);\n const leafName = handle.localName.split('/').at(-1);\n if (leafName && leafName !== handle.localName) {\n defineSelectorAlias(selectorResolver, leafName, handle, resolver);\n }\n }\n return selectorResolver;\n};\n\nconst defineSelectorAlias = (\n selectorResolver: StyleSelectorResolver,\n name: string,\n handle: StyleHandle,\n resolver: StyleNameResolver\n): void => {\n if (!/^[A-Za-z_$][\\w$]*$/.test(name) || name in selectorResolver) {\n return;\n }\n Object.defineProperty(selectorResolver, name, {\n configurable: true,\n enumerable: true,\n get: () => `.${resolver.className(handle.key, handle.readableName)}`,\n });\n};\n\nconst resolveStringSegment = (cssText: string, ctx: RenderContext): string => {\n return scanCss(cssText)\n .map((span) =>\n isOpaque(span) ? span.text : resolveCodeSpan(span.text, ctx)\n )\n .join('');\n};\n\nconst resolveCodeSpan = (cssText: string, ctx: RenderContext): string => {\n let result = cssText;\n const paths = new Set<string>([\n ...Object.keys(ctx.environment.themeVars),\n ...(ctx.environment.sharedVars ?? []),\n ...ctx.collector.collectedVarDeps,\n ]);\n for (const path of paths) {\n result = substituteReadableVar(result, path, ctx);\n }\n return result;\n};\n\nconst substituteReadableVar = (\n cssText: string,\n path: string,\n ctx: RenderContext\n): string => {\n const readableName = cssVarName(ctx.environment.prefix, path);\n const readableRef = `var(${readableName})`;\n let result = cssText;\n if (result.includes(readableRef)) {\n result = replaceAll(result, readableRef, ctx.resolver.cssVarRef(path));\n }\n if (containsCssIdentifier(result, readableName)) {\n result = replaceCssIdentifier(\n result,\n readableName,\n ctx.resolver.cssVar(path)\n );\n }\n return result;\n};\n\nconst replaceAll = (\n value: string,\n search: string,\n replacement: string\n): string => value.split(search).join(replacement);\n\nconst replaceCssIdentifier = (\n value: string,\n search: string,\n replacement: string\n): string =>\n // Authored and generated CSS only contains valid custom property identifiers.\n // Since every searched token starts with \"--\", the trailing boundary is enough.\n value.replace(\n new RegExp(`${escapeRegExp(search)}(?![_a-zA-Z0-9-])`, 'g'),\n replacement\n );\n\nconst containsCssIdentifier = (value: string, search: string): boolean =>\n new RegExp(`${escapeRegExp(search)}(?![_a-zA-Z0-9-])`).test(value);\n\nconst escapeRegExp = (value: string): string =>\n value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n"]}
@@ -0,0 +1,169 @@
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.globalStylesFromFlattened = exports.combineClassNames = exports.variants = exports.mapDomain = exports.isVariantMarked = exports.container = exports.media = exports.rule = exports.pendingHandleFromFlattened = exports.css = exports.decls = exports.EMPTY_DEPS = void 0;
10
+ const nesting_1 = require("../nesting");
11
+ const declarations_1 = require("./declarations");
12
+ /** Shared empty `dependsOn` until module construction fills the real set. */
13
+ exports.EMPTY_DEPS = new Set();
14
+ /** Declaration-block template. Interpolations stringify; local-var markers stay until render. */
15
+ const decls = (strings, ...values) => (0, declarations_1.buildDeclarations)(strings, values);
16
+ exports.decls = decls;
17
+ /** Handle template. Nested `&` / `@media` flatten into sibling rules. */
18
+ const css = (strings, ...values) => {
19
+ if (!(0, nesting_1.hasNestedSyntax)(strings)) {
20
+ return {
21
+ kind: 'pending-handle',
22
+ declarations: (0, declarations_1.buildDeclarations)(strings, values),
23
+ };
24
+ }
25
+ return (0, exports.pendingHandleFromFlattened)((0, nesting_1.flattenTemplate)(strings, values, { mode: 'self' }));
26
+ };
27
+ exports.css = css;
28
+ /** Builds a pending handle (plus nested sibling descriptors) from a flattened template. */
29
+ const pendingHandleFromFlattened = (flat) => {
30
+ const selfSlice = flat.self ?? { strings: [''], values: [] };
31
+ return {
32
+ kind: 'pending-handle',
33
+ declarations: (0, declarations_1.buildDeclarations)(selfSlice.strings, selfSlice.values),
34
+ nested: flat.nested.map((entry) => {
35
+ if (entry.kind === 'rule') {
36
+ return {
37
+ kind: 'nested-rule',
38
+ alternatives: entry.alternatives,
39
+ declarations: (0, declarations_1.buildDeclarations)(entry.slice.strings, entry.slice.values),
40
+ };
41
+ }
42
+ return {
43
+ kind: 'nested-media',
44
+ query: entry.query,
45
+ ...(entry.self
46
+ ? { self: (0, declarations_1.buildDeclarations)(entry.self.strings, entry.self.values) }
47
+ : {}),
48
+ rules: entry.rules.map((rule) => ({
49
+ kind: 'nested-rule',
50
+ alternatives: rule.alternatives,
51
+ declarations: (0, declarations_1.buildDeclarations)(rule.slice.strings, rule.slice.values),
52
+ })),
53
+ };
54
+ }),
55
+ };
56
+ };
57
+ exports.pendingHandleFromFlattened = pendingHandleFromFlattened;
58
+ /**
59
+ * Selector plus declarations. `dependsOn` is filled when the module is constructed.
60
+ *
61
+ * @param selector Factory receiving a {@link StyleSelectorResolver}; uses `&` and handle aliases.
62
+ * @param declarations CSS properties for this rule.
63
+ * @param options `auto` controls whether the rule self-collects when its handle dependencies are met.
64
+ */
65
+ const rule = (selector, declarations, options = {}) => ({
66
+ kind: 'rule',
67
+ moduleName: '',
68
+ key: '',
69
+ selector,
70
+ declarations,
71
+ // `dependsOn` is computed in `assignEntries` once the module's handles are
72
+ // known. Authors construct rules outside that scope, so the placeholder is
73
+ // an empty set until `assignEntries` rewrites the entry.
74
+ dependsOn: exports.EMPTY_DEPS,
75
+ auto: options.auto ?? true,
76
+ variant: false,
77
+ });
78
+ exports.rule = rule;
79
+ /**
80
+ * `@media` block wrapping rules.
81
+ *
82
+ * @param query Media query string (e.g. `(min-width: 600px)`).
83
+ * @param rules Inner rules scoped to this block.
84
+ */
85
+ const media = (query, rules) => ({
86
+ kind: 'media',
87
+ atRule: 'media',
88
+ key: '',
89
+ moduleName: '',
90
+ query,
91
+ rules,
92
+ variant: false,
93
+ });
94
+ exports.media = media;
95
+ /**
96
+ * `@container` block. `kind` stays `'media'` so emission rank matches {@link media}.
97
+ *
98
+ * @param query Container query string (e.g. `(min-width: 400px)`).
99
+ * @param rules Inner rules scoped to this block.
100
+ */
101
+ const container = (query, rules) => ({
102
+ kind: 'media',
103
+ atRule: 'container',
104
+ key: '',
105
+ moduleName: '',
106
+ query,
107
+ rules,
108
+ variant: false,
109
+ });
110
+ exports.container = container;
111
+ const variantMarkers = new WeakSet();
112
+ const isVariantMarked = (value) => Boolean(value && typeof value === 'object' && variantMarkers.has(value));
113
+ exports.isVariantMarked = isVariantMarked;
114
+ const markVariant = (value) => {
115
+ if (!value || typeof value !== 'object') {
116
+ return;
117
+ }
118
+ variantMarkers.add(value);
119
+ };
120
+ /**
121
+ * Builds a record keyed by `domain`. No CSS-collection side effect.
122
+ *
123
+ * @param domain All valid keys (e.g. `['primary', 'secondary']`).
124
+ * @param factory Called once per key.
125
+ */
126
+ const mapDomain = (domain, factory) => Object.fromEntries(domain.map((key) => [key, factory(key)]));
127
+ exports.mapDomain = mapDomain;
128
+ /**
129
+ * Builds a record of styles keyed by `domain`. Each value is marked `variant` so {@link index.StylesCollector#use | StylesCollector.use} skips it.
130
+ *
131
+ * @param domain All valid variant keys (e.g. `['primary', 'secondary']`).
132
+ * @param factory Called once per key; returns the handle or nested style object for that variant.
133
+ */
134
+ const variants = (domain, factory) => {
135
+ const record = (0, exports.mapDomain)(domain, factory);
136
+ for (const value of Object.values(record)) {
137
+ markVariant(value);
138
+ }
139
+ return record;
140
+ };
141
+ exports.variants = variants;
142
+ /**
143
+ * Resolves handles through the collector's class-name resolver.
144
+ *
145
+ * @param context Object exposing `resolveClassName` (e.g. a React render context).
146
+ * @param handles One or more handles to resolve and join.
147
+ */
148
+ const combineClassNames = (context, ...handles) => context.resolveClassName(...handles);
149
+ exports.combineClassNames = combineClassNames;
150
+ const composeAbsoluteSelector = (alternatives) => (h) => alternatives
151
+ .map((parts) => parts
152
+ .map((part) => (typeof part === 'string' ? part : `.${h(part)}`))
153
+ .join(''))
154
+ .join(',');
155
+ /** Authored `rule()`/`media()` entries from a global-mode flattened template. */
156
+ const globalStylesFromFlattened = (flat) => {
157
+ const styles = {};
158
+ flat.nested.forEach((entry, index) => {
159
+ const localKey = `g${String(index).padStart(3, '0')}`;
160
+ if (entry.kind === 'rule') {
161
+ styles[localKey] = (0, exports.rule)(composeAbsoluteSelector(entry.alternatives), (0, declarations_1.buildDeclarations)(entry.slice.strings, entry.slice.values));
162
+ return;
163
+ }
164
+ styles[localKey] = (0, exports.media)(entry.query, entry.rules.map((nested) => (0, exports.rule)(composeAbsoluteSelector(nested.alternatives), (0, declarations_1.buildDeclarations)(nested.slice.strings, nested.slice.values))));
165
+ });
166
+ return styles;
167
+ };
168
+ exports.globalStylesFromFlattened = globalStylesFromFlattened;
169
+ //# sourceMappingURL=authoring.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authoring.js","sourceRoot":"","sources":["../../../src/styles/authoring.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 {\n type FlattenedTemplate,\n flattenTemplate,\n hasNestedSyntax,\n type SelectorAlternative,\n} from '../nesting';\n\nimport { buildDeclarations } from './declarations';\nimport type {\n Declarations,\n PendingStyleHandle,\n RuleOptions,\n StyleHandle,\n StyleMedia,\n StyleRule,\n StyleSelectorResolver,\n StylesObject,\n} from './types';\n\n/** Shared empty `dependsOn` until module construction fills the real set. */\nexport const EMPTY_DEPS: ReadonlySet<string> = new Set();\n\n/** Declaration-block template. Interpolations stringify; local-var markers stay until render. */\nexport const decls = (\n strings: TemplateStringsArray,\n ...values: readonly unknown[]\n): Declarations => buildDeclarations(strings, values);\n\n/** Handle template. Nested `&` / `@media` flatten into sibling rules. */\nexport const css = (\n strings: TemplateStringsArray,\n ...values: readonly unknown[]\n): PendingStyleHandle => {\n if (!hasNestedSyntax(strings)) {\n return {\n kind: 'pending-handle',\n declarations: buildDeclarations(strings, values),\n };\n }\n return pendingHandleFromFlattened(\n flattenTemplate(strings, values, { mode: 'self' })\n );\n};\n\n/** Builds a pending handle (plus nested sibling descriptors) from a flattened template. */\nexport const pendingHandleFromFlattened = (\n flat: FlattenedTemplate\n): PendingStyleHandle => {\n const selfSlice = flat.self ?? { strings: [''], values: [] };\n return {\n kind: 'pending-handle',\n declarations: buildDeclarations(selfSlice.strings, selfSlice.values),\n nested: flat.nested.map((entry) => {\n if (entry.kind === 'rule') {\n return {\n kind: 'nested-rule',\n alternatives: entry.alternatives,\n declarations: buildDeclarations(\n entry.slice.strings,\n entry.slice.values\n ),\n };\n }\n return {\n kind: 'nested-media',\n query: entry.query,\n ...(entry.self\n ? { self: buildDeclarations(entry.self.strings, entry.self.values) }\n : {}),\n rules: entry.rules.map((rule) => ({\n kind: 'nested-rule',\n alternatives: rule.alternatives,\n declarations: buildDeclarations(\n rule.slice.strings,\n rule.slice.values\n ),\n })),\n };\n }),\n };\n};\n\n/**\n * Selector plus declarations. `dependsOn` is filled when the module is constructed.\n *\n * @param selector Factory receiving a {@link StyleSelectorResolver}; uses `&` and handle aliases.\n * @param declarations CSS properties for this rule.\n * @param options `auto` controls whether the rule self-collects when its handle dependencies are met.\n */\nexport const rule = (\n selector: (h: StyleSelectorResolver) => string,\n declarations: Declarations,\n options: RuleOptions = {}\n): StyleRule => ({\n kind: 'rule',\n moduleName: '',\n key: '',\n selector,\n declarations,\n // `dependsOn` is computed in `assignEntries` once the module's handles are\n // known. Authors construct rules outside that scope, so the placeholder is\n // an empty set until `assignEntries` rewrites the entry.\n dependsOn: EMPTY_DEPS,\n auto: options.auto ?? true,\n variant: false,\n});\n\n/**\n * `@media` block wrapping rules.\n *\n * @param query Media query string (e.g. `(min-width: 600px)`).\n * @param rules Inner rules scoped to this block.\n */\nexport const media = (\n query: string,\n rules: readonly StyleRule[]\n): StyleMedia => ({\n kind: 'media',\n atRule: 'media',\n key: '',\n moduleName: '',\n query,\n rules,\n variant: false,\n});\n\n/**\n * `@container` block. `kind` stays `'media'` so emission rank matches {@link media}.\n *\n * @param query Container query string (e.g. `(min-width: 400px)`).\n * @param rules Inner rules scoped to this block.\n */\nexport const container = (\n query: string,\n rules: readonly StyleRule[]\n): StyleMedia => ({\n kind: 'media',\n atRule: 'container',\n key: '',\n moduleName: '',\n query,\n rules,\n variant: false,\n});\n\nconst variantMarkers = new WeakSet<object>();\n\nexport const isVariantMarked = (value: unknown): boolean =>\n Boolean(value && typeof value === 'object' && variantMarkers.has(value));\n\nconst markVariant = (value: unknown): void => {\n if (!value || typeof value !== 'object') {\n return;\n }\n variantMarkers.add(value);\n};\n\n/**\n * Builds a record keyed by `domain`. No CSS-collection side effect.\n *\n * @param domain All valid keys (e.g. `['primary', 'secondary']`).\n * @param factory Called once per key.\n */\nexport const mapDomain = <TKey extends string, TValue>(\n domain: readonly TKey[],\n factory: (value: TKey) => TValue\n): Record<TKey, TValue> =>\n Object.fromEntries(domain.map((key) => [key, factory(key)])) as Record<\n TKey,\n TValue\n >;\n\n/**\n * Builds a record of styles keyed by `domain`. Each value is marked `variant` so {@link index.StylesCollector#use | StylesCollector.use} skips it.\n *\n * @param domain All valid variant keys (e.g. `['primary', 'secondary']`).\n * @param factory Called once per key; returns the handle or nested style object for that variant.\n */\nexport const variants = <TKey extends string, TValue>(\n domain: readonly TKey[],\n factory: (value: TKey) => TValue\n): Record<TKey, TValue> => {\n const record = mapDomain(domain, factory);\n for (const value of Object.values(record)) {\n markVariant(value);\n }\n return record;\n};\n\n/**\n * Resolves handles through the collector's class-name resolver.\n *\n * @param context Object exposing `resolveClassName` (e.g. a React render context).\n * @param handles One or more handles to resolve and join.\n */\nexport const combineClassNames = (\n context: { resolveClassName: (...handles: StyleHandle[]) => string },\n ...handles: readonly StyleHandle[]\n): string => context.resolveClassName(...handles);\n\nconst composeAbsoluteSelector =\n (alternatives: readonly SelectorAlternative[]) =>\n (h: StyleSelectorResolver): string =>\n alternatives\n .map((parts) =>\n parts\n .map((part) => (typeof part === 'string' ? part : `.${h(part)}`))\n .join('')\n )\n .join(',');\n\n/** Authored `rule()`/`media()` entries from a global-mode flattened template. */\nexport const globalStylesFromFlattened = (\n flat: FlattenedTemplate\n): StylesObject => {\n const styles: Record<string, StyleRule | StyleMedia> = {};\n flat.nested.forEach((entry, index) => {\n const localKey = `g${String(index).padStart(3, '0')}`;\n if (entry.kind === 'rule') {\n styles[localKey] = rule(\n composeAbsoluteSelector(entry.alternatives),\n buildDeclarations(entry.slice.strings, entry.slice.values)\n );\n return;\n }\n styles[localKey] = media(\n entry.query,\n entry.rules.map((nested) =>\n rule(\n composeAbsoluteSelector(nested.alternatives),\n buildDeclarations(nested.slice.strings, nested.slice.values)\n )\n )\n );\n });\n return styles;\n};\n"]}
@@ -0,0 +1,139 @@
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.isEmptyDeclarations = exports.stringifyCssValue = exports.computeValueDeps = exports.buildDeclarations = void 0;
10
+ const css_scan_1 = require("../css_scan");
11
+ const local_vars_1 = require("../local_vars");
12
+ const nesting_1 = require("../nesting");
13
+ const tokens_1 = require("../tokens");
14
+ /** Builds a declaration block: interpolations stringify; local-var markers stay until render. */
15
+ const buildDeclarations = (strings, values) => {
16
+ const deps = {
17
+ theme: new Set(),
18
+ vars: new Set(),
19
+ refs: new Set(),
20
+ defaults: [],
21
+ };
22
+ const segments = [];
23
+ let pending = '';
24
+ const flushPending = () => {
25
+ if (pending.length > 0) {
26
+ segments.push(pending);
27
+ pending = '';
28
+ }
29
+ };
30
+ strings.forEach((part, index) => {
31
+ pending += part;
32
+ if (index < values.length) {
33
+ const value = values[index];
34
+ if ((0, local_vars_1.isLocalVarMarker)(value)) {
35
+ flushPending();
36
+ // Both default-emission and override-emission markers may carry
37
+ // theme tokens or shared contextual var refs as values. Walk those
38
+ // values and record any nested deps onto the host declaration so
39
+ // tree-shaking and registry registration include them.
40
+ recordMarkerDeps(value, deps);
41
+ segments.push(value);
42
+ }
43
+ else {
44
+ pending += (0, exports.stringifyCssValue)(value, deps);
45
+ }
46
+ }
47
+ });
48
+ flushPending();
49
+ assertDeclarationBlock(segments);
50
+ return {
51
+ css: segments,
52
+ deps,
53
+ };
54
+ };
55
+ exports.buildDeclarations = buildDeclarations;
56
+ const recordMarkerDeps = (marker, deps) => {
57
+ if (marker.__kind === 'local-var-default-marker') {
58
+ // Default markers contribute their var paths and per-value deps only
59
+ // through the collector's reachability pass at resolver creation. We
60
+ // capture per-key value deps here so the collector can fold them in
61
+ // verbatim when the key survives reachability — and skip them entirely
62
+ // when it doesn't.
63
+ deps.defaults.push({
64
+ groupPath: marker.groupPath,
65
+ keys: marker.defaults.map((item) => ({
66
+ key: item.key,
67
+ path: item.path,
68
+ valueDeps: (0, exports.computeValueDeps)(item.value),
69
+ })),
70
+ });
71
+ return;
72
+ }
73
+ for (const item of marker.overrides) {
74
+ deps.vars.add(item.path);
75
+ // Stringify each value once to capture nested theme/var deps. The
76
+ // string return is discarded — the runtime re-stringifies at render
77
+ // time so compaction sees the same readable refs we record here.
78
+ (0, exports.stringifyCssValue)(item.value, deps);
79
+ }
80
+ };
81
+ /** Theme/var deps recorded while stringifying one declaration value. */
82
+ const computeValueDeps = (value) => {
83
+ const local = {
84
+ theme: new Set(),
85
+ vars: new Set(),
86
+ refs: new Set(),
87
+ defaults: [],
88
+ };
89
+ (0, exports.stringifyCssValue)(value, local);
90
+ return { theme: local.theme, vars: local.vars };
91
+ };
92
+ exports.computeValueDeps = computeValueDeps;
93
+ /** Stringifies one interpolable CSS value and records theme/var deps onto `deps`. */
94
+ const stringifyCssValue = (value, deps) => {
95
+ if ((0, nesting_1.isHandleLike)(value)) {
96
+ throw new Error('A style handle cannot be interpolated into a declaration value; compose with the emotion compat css instead.');
97
+ }
98
+ if ((0, tokens_1.isCssToken)(value)) {
99
+ deps.theme.add(value.path);
100
+ return value.ref;
101
+ }
102
+ if ((0, tokens_1.isContextualCssVar)(value)) {
103
+ deps.vars.add(value.path);
104
+ deps.refs.add(value.path);
105
+ return value.ref;
106
+ }
107
+ if ((0, tokens_1.isContextualCssVarName)(value)) {
108
+ // `.name` interpolations are left-hand-side custom-property
109
+ // identifiers, not `var(...)` references — they belong in `vars` for
110
+ // registry coverage but not in `refs` (which feeds reachability).
111
+ deps.vars.add(value.path);
112
+ return value.name;
113
+ }
114
+ if ((0, local_vars_1.isLocalVarRef)(value)) {
115
+ deps.vars.add(value.path);
116
+ deps.refs.add(value.path);
117
+ return value.ref;
118
+ }
119
+ if ((0, tokens_1.isScaleToken)(value)) {
120
+ return value.value;
121
+ }
122
+ return String(value);
123
+ };
124
+ exports.stringifyCssValue = stringifyCssValue;
125
+ /** True when every segment is comments, whitespace, or bare `;`. A local-var marker counts as content. */
126
+ const isEmptyDeclarations = ({ css }) => css.every((segment) => typeof segment === 'string' && (0, css_scan_1.isBlankCss)(segment));
127
+ exports.isEmptyDeclarations = isEmptyDeclarations;
128
+ const assertDeclarationBlock = (segments) => {
129
+ for (const segment of segments) {
130
+ if (typeof segment !== 'string') {
131
+ continue;
132
+ }
133
+ if (/[{}]/.test(segment) ||
134
+ /(^|[\s;])@(?:media|supports|container)\b/i.test(segment)) {
135
+ throw new Error('css and decls accept declaration blocks only.');
136
+ }
137
+ }
138
+ };
139
+ //# sourceMappingURL=declarations.js.map