@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 @@
1
+ {"version":3,"file":"css_scan.js","sourceRoot":"","sources":["../../src/css_scan.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// One scanner for the three passes that need to read CSS text: minification,\n// the `@media` canonicalization in `nesting.ts`, and the var invariant in\n// `./testing`. Each of those grew its own character loop, and each learned the\n// same lessons separately and late — comments inside `url(...)`, backslash\n// escapes, at-rules inside `url(...)`, selector-versus-declaration position.\n// A span is the unit all three actually need: a stretch of text with a kind\n// that says whether its contents are code or opaque, plus where it sits.\n//\n// This is deliberately not a CSS Syntax Level 3 tokenizer. It models the six\n// things those passes get wrong and nothing else, because a promise of full\n// conformance is one this module would not keep.\n\n/** What a span's text is, which decides whether a pass may look inside it. */\nexport type CssSpanKind =\n /** `/* … *\\/`, including the delimiters. Opaque. */\n | 'comment'\n /** A quoted string, including the quotes and any escapes. Opaque. */\n | 'string'\n /** An unquoted `url(…)` function token, including the parentheses. Opaque. */\n | 'url'\n /** A backslash and the character it escapes, outside a string. Opaque. */\n | 'escape'\n /** A run of whitespace. */\n | 'whitespace'\n /** One of `{ } : ; , >`. */\n | 'structural'\n /** Anything else, run together: identifiers, values, selectors, `var(`. */\n | 'text';\n\n/** Whether the enclosing block holds declarations or further rules. */\nexport type CssBlockKind = 'rules' | 'declarations';\n\n/** One scanner span: kind, source slice, and block context. */\nexport interface CssSpan {\n /** What this span's text is; opaque kinds are skipped by later passes. */\n readonly kind: CssSpanKind;\n /** Source slice for this span, including delimiters. */\n readonly text: string;\n /** Index of the first character in the source. */\n readonly start: number;\n /** Index one past the last character in the source. */\n readonly end: number;\n /**\n * What the enclosing block holds. An at-rule prelude (`@media …`) opens a\n * block of rules; anything else opens declarations; top level is rules.\n *\n * This is what separates `color : red` — where the space before `:` is\n * noise — from `.menu :hover`, where it is a descendant combinator.\n */\n readonly block: CssBlockKind;\n /** Block nesting depth; `0` at top level. */\n readonly depth: number;\n}\n\nconst STRUCTURAL = new Set(['{', '}', ':', ';', ',', '>']);\nconst URL_PREFIX = 'url(';\n\n/** `true` when an unquoted `url(` function token starts at `index`. */\nconst isUnquotedUrlStart = (value: string, index: number): boolean => {\n // Cheap rejection first: this runs at every index of every text span, and\n // all but one character in a few hundred fails here rather than in a\n // `slice().toLowerCase()`.\n const head = value[index];\n if (head !== 'u' && head !== 'U') {\n return false;\n }\n // `url(` has to open a function token rather than end a longer identifier.\n // `myurl(/a/*b*/c)` is some other function, and reading it as a url would\n // make its contents opaque — hiding a real comment from every pass.\n const before = value[index - 1];\n if (before !== undefined && /[\\w\\\\-]/.test(before)) {\n return false;\n }\n if (\n value.slice(index, index + URL_PREFIX.length).toLowerCase() !== URL_PREFIX\n ) {\n return false;\n }\n let cursor = index + URL_PREFIX.length;\n while (cursor < value.length && /\\s/.test(value[cursor] ?? '')) {\n cursor += 1;\n }\n const first = value[cursor];\n return first !== '\"' && first !== \"'\";\n};\n\n/** Index one past an unquoted `url(…)` token that starts at `start`. */\nconst endOfUrl = (value: string, start: number): number => {\n for (\n let index = start + URL_PREFIX.length;\n index < value.length;\n index += 1\n ) {\n const char = value[index];\n if (char === '\\\\' && index + 1 < value.length) {\n index += 1;\n continue;\n }\n if (char === ')') {\n return index + 1;\n }\n }\n return value.length;\n};\n\n/** Index one past a quoted string that starts at `start`. Unterminated runs to the end. */\nconst endOfString = (value: string, start: number): number => {\n const quote = value[start];\n for (let index = start + 1; index < value.length; index += 1) {\n const char = value[index];\n if (char === '\\\\' && index + 1 < value.length) {\n index += 1;\n continue;\n }\n if (char === quote) {\n return index + 1;\n }\n }\n return value.length;\n};\n\n/** Index one past a `/* … *\\/` comment that starts at `start`. Unterminated runs to the end. */\nconst endOfComment = (value: string, start: number): number => {\n const closing = value.indexOf('*/', start + 2);\n return closing === -1 ? value.length : closing + 2;\n};\n\n/**\n * Splits `value` into spans.\n *\n * Concatenating every span's `text` reproduces `value` exactly, which is what\n * lets a pass rewrite the spans it understands and copy the rest through.\n *\n * @param value CSS text.\n */\nexport const scanCss = (value: string): readonly CssSpan[] => {\n const spans: CssSpan[] = [];\n const blocks: CssBlockKind[] = ['rules'];\n // Null until the first significant character of a prelude is seen, so that\n // `@media …{` opens rules and `.a …{` opens declarations.\n let preludeIsAtRule: boolean | null = null;\n let index = 0;\n\n const push = (kind: CssSpanKind, start: number, end: number): void => {\n spans.push({\n kind,\n text: value.slice(start, end),\n start,\n end,\n block: blocks.at(-1) ?? 'rules',\n depth: blocks.length - 1,\n });\n };\n\n while (index < value.length) {\n const char = value[index] ?? '';\n const next = value[index + 1];\n\n if (char === '/' && next === '*') {\n const end = endOfComment(value, index);\n push('comment', index, end);\n index = end;\n continue;\n }\n\n if (char === '\"' || char === \"'\") {\n const end = endOfString(value, index);\n push('string', index, end);\n index = end;\n continue;\n }\n\n if (char === '\\\\' && next !== undefined) {\n push('escape', index, index + 2);\n index += 2;\n continue;\n }\n\n if (isUnquotedUrlStart(value, index)) {\n const end = endOfUrl(value, index);\n push('url', index, end);\n index = end;\n continue;\n }\n\n if (/\\s/.test(char)) {\n let end = index + 1;\n while (end < value.length && /\\s/.test(value[end] ?? '')) {\n end += 1;\n }\n push('whitespace', index, end);\n index = end;\n continue;\n }\n\n if (STRUCTURAL.has(char)) {\n // Depth changes after the span is recorded, so `{` reads as belonging to\n // the block it closes over rather than the one it opens.\n push('structural', index, index + 1);\n if (char === '{') {\n blocks.push(preludeIsAtRule ? 'rules' : 'declarations');\n } else if (char === '}' && blocks.length > 1) {\n blocks.pop();\n }\n if (char === '{' || char === '}' || char === ';') {\n preludeIsAtRule = null;\n }\n index += 1;\n continue;\n }\n\n if (preludeIsAtRule === null) {\n preludeIsAtRule = char === '@';\n }\n let end = index + 1;\n while (end < value.length) {\n const ahead = value[end] ?? '';\n if (\n STRUCTURAL.has(ahead) ||\n /\\s/.test(ahead) ||\n ahead === '\"' ||\n ahead === \"'\" ||\n ahead === '\\\\' ||\n (ahead === '/' && value[end + 1] === '*') ||\n isUnquotedUrlStart(value, end)\n ) {\n break;\n }\n end += 1;\n }\n push('text', index, end);\n index = end;\n }\n\n return spans;\n};\n\n/**\n * `true` for spans whose text is a literal rather than code — a comment, a\n * quoted string, an unquoted `url(...)`, or an escape pair. A pass may rewrite\n * what is inside a code span and must copy an opaque one through untouched.\n */\nexport const isOpaque = (span: CssSpan): boolean =>\n span.kind === 'comment' ||\n span.kind === 'string' ||\n span.kind === 'url' ||\n span.kind === 'escape';\n\n/** True when `value` has no declarations left after comments, whitespace, and bare `;` are ignored. */\nexport const isBlankCss = (value: string): boolean =>\n scanCss(value).every(\n (span) =>\n span.kind === 'comment' ||\n span.kind === 'whitespace' ||\n (span.kind === 'structural' && span.text === ';')\n );\n"]}
@@ -0,0 +1,40 @@
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.createDomSink = void 0;
10
+ /**
11
+ * One managed `<style>` element, rewritten on each flush.
12
+ */
13
+ const createDomSink = ({ document, schedule = queueMicrotask, }) => {
14
+ let element = null;
15
+ let dirty = false;
16
+ let latestRender = null;
17
+ const flush = () => {
18
+ dirty = false;
19
+ if (!latestRender) {
20
+ return;
21
+ }
22
+ if (!element) {
23
+ element = document.createElement('style');
24
+ document.head.appendChild(element);
25
+ }
26
+ element.textContent = latestRender();
27
+ };
28
+ return {
29
+ invalidate(render) {
30
+ latestRender = render;
31
+ if (dirty) {
32
+ return;
33
+ }
34
+ dirty = true;
35
+ schedule(flush);
36
+ },
37
+ };
38
+ };
39
+ exports.createDomSink = createDomSink;
40
+ //# sourceMappingURL=dom_sink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom_sink.js","sourceRoot":"","sources":["../../src/dom_sink.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AA0BH;;GAEG;AACI,MAAM,aAAa,GAAG,CAAC,EAC5B,QAAQ,EACR,QAAQ,GAAG,cAAc,GACJ,EAAa,EAAE;IACpC,IAAI,OAAO,GAA4B,IAAI,CAAC;IAC5C,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,YAAY,GAA0B,IAAI,CAAC;IAE/C,MAAM,KAAK,GAAG,GAAS,EAAE;QACvB,KAAK,GAAG,KAAK,CAAC;QACd,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAC1C,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;QACD,OAAO,CAAC,WAAW,GAAG,YAAY,EAAE,CAAC;IACvC,CAAC,CAAC;IAEF,OAAO;QACL,UAAU,CAAC,MAAM;YACf,YAAY,GAAG,MAAM,CAAC;YACtB,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YACD,KAAK,GAAG,IAAI,CAAC;YACb,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AA9BW,QAAA,aAAa,iBA8BxB","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 { StyleSink } from './emotion';\n\n/** Minimal interface for a DOM `<style>` element. */\nexport interface StyleElementLike {\n /** Current stylesheet text, or `null` before the first flush. */\n textContent: string | null;\n}\n\n/** Minimal interface for a DOM `Document` able to create and append style tags. */\nexport interface DocumentLike {\n /** Creates a `<style>` element. */\n createElement(tagName: 'style'): StyleElementLike;\n /** Node that receives the created style element. */\n readonly head: { appendChild(node: StyleElementLike): void };\n}\n\n/** Host document and optional flush scheduler for a `<style>` sink. */\nexport interface CreateDomSinkOptions {\n /** The host document where the style element will be appended. */\n document: DocumentLike;\n /** Defers the flush. Defaults to `queueMicrotask`. */\n schedule?: (flush: () => void) => void;\n}\n\n/**\n * One managed `<style>` element, rewritten on each flush.\n */\nexport const createDomSink = ({\n document,\n schedule = queueMicrotask,\n}: CreateDomSinkOptions): StyleSink => {\n let element: StyleElementLike | null = null;\n let dirty = false;\n let latestRender: (() => string) | null = null;\n\n const flush = (): void => {\n dirty = false;\n if (!latestRender) {\n return;\n }\n if (!element) {\n element = document.createElement('style');\n document.head.appendChild(element);\n }\n element.textContent = latestRender();\n };\n\n return {\n invalidate(render) {\n latestRender = render;\n if (dirty) {\n return;\n }\n dirty = true;\n schedule(flush);\n },\n };\n};\n"]}
@@ -0,0 +1,189 @@
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.createEmotion = exports.createDomSink = void 0;
10
+ const hash_1 = require("./hash");
11
+ const nesting_1 = require("./nesting");
12
+ const styles_1 = require("./styles");
13
+ var dom_sink_1 = require("./dom_sink");
14
+ Object.defineProperty(exports, "createDomSink", { enumerable: true, get: function () { return dom_sink_1.createDomSink; } });
15
+ const stateByRegistry = new WeakMap();
16
+ const stateFor = (registry) => {
17
+ let state = stateByRegistry.get(registry);
18
+ if (!state) {
19
+ state = {
20
+ wrappers: new Map(),
21
+ rawSources: new Map(),
22
+ canonicalByModule: new Map(),
23
+ globals: [],
24
+ brand: new WeakSet(),
25
+ sinks: new Set(),
26
+ };
27
+ stateByRegistry.set(registry, state);
28
+ }
29
+ return state;
30
+ };
31
+ /**
32
+ * `@emotion/css`-shaped API over a distillery.
33
+ *
34
+ * `String(css\`...\`)` is the readable class name and does not collect. Passing the wrapper through `resolveClassName` collects and compacts like a native handle.
35
+ *
36
+ * @param distillery Bound distillery that owns the underlying registry.
37
+ * @param options Optional sink for DOM injection.
38
+ */
39
+ const createEmotion = (distillery, options = {}) => {
40
+ const { registry } = distillery;
41
+ const state = stateFor(registry);
42
+ const stylesheet = () => distillery.renderStyles(distillery.stylesheetCollector('readable'));
43
+ const invalidateSinks = () => {
44
+ for (const sink of state.sinks) {
45
+ sink.invalidate(stylesheet);
46
+ }
47
+ };
48
+ if (options.sink) {
49
+ state.sinks.add(options.sink);
50
+ // Catch a late-attached sink up to styles already registered on this
51
+ // registry: cached `css`/`injectGlobal` calls return early without
52
+ // invalidating, so without this the managed `<style>` would miss every
53
+ // style registered before the sink was attached.
54
+ options.sink.invalidate(stylesheet);
55
+ }
56
+ const inlineValue = (value, position) => {
57
+ if (position !== 'statement' || !isBranded(state, value)) {
58
+ return null;
59
+ }
60
+ return state.rawSources.get(value.key) ?? null;
61
+ };
62
+ const css = (strings, ...values) => {
63
+ assertTemplate(strings, 'css');
64
+ const hash = (0, hash_1.contentHash64)(strings, values);
65
+ const cached = state.wrappers.get(hash);
66
+ if (cached) {
67
+ return cached;
68
+ }
69
+ const moduleName = `css-${hash}`;
70
+ const canonical = canonicalKey(strings, values);
71
+ detectCollision(state, moduleName, canonical);
72
+ const flat = (0, nesting_1.flattenTemplate)(strings, values, {
73
+ mode: 'self',
74
+ inlineValue,
75
+ });
76
+ const pending = (0, styles_1.pendingHandleFromFlattened)(flat);
77
+ const module = distillery.createStyleModule(moduleName, () => ({
78
+ root: pending,
79
+ }));
80
+ const handle = module.handles.root;
81
+ state.rawSources.set(handle.key, {
82
+ strings: [...strings],
83
+ values: [...values],
84
+ });
85
+ const wrapper = makeWrapper(handle);
86
+ state.brand.add(wrapper);
87
+ state.wrappers.set(hash, wrapper);
88
+ state.canonicalByModule.set(moduleName, canonical);
89
+ invalidateSinks();
90
+ return wrapper;
91
+ };
92
+ const injectGlobal = (strings, ...values) => {
93
+ assertTemplate(strings, 'injectGlobal');
94
+ const hash = (0, hash_1.contentHash64)(strings, values);
95
+ const moduleName = `global-${hash}`;
96
+ if (registry.module(moduleName)) {
97
+ return;
98
+ }
99
+ const canonical = canonicalKey(strings, values);
100
+ detectCollision(state, moduleName, canonical);
101
+ const flat = (0, nesting_1.flattenTemplate)(strings, values, {
102
+ mode: 'global',
103
+ inlineValue,
104
+ });
105
+ const module = distillery.createStyleModule(moduleName, () => (0, styles_1.globalStylesFromFlattened)(flat));
106
+ state.canonicalByModule.set(moduleName, canonical);
107
+ state.globals.push(module);
108
+ invalidateSinks();
109
+ };
110
+ const cx = (...args) => {
111
+ const classes = [];
112
+ const walk = (arg) => {
113
+ if (!arg) {
114
+ return;
115
+ }
116
+ if (typeof arg === 'string') {
117
+ classes.push(arg);
118
+ return;
119
+ }
120
+ if (typeof arg === 'number') {
121
+ classes.push(String(arg));
122
+ return;
123
+ }
124
+ if (Array.isArray(arg)) {
125
+ arg.forEach(walk);
126
+ return;
127
+ }
128
+ if (isBranded(state, arg)) {
129
+ classes.push(String(arg));
130
+ return;
131
+ }
132
+ if ((0, nesting_1.isHandleLike)(arg)) {
133
+ classes.push(arg.readableName);
134
+ return;
135
+ }
136
+ for (const [className, enabled] of Object.entries(arg)) {
137
+ if (enabled) {
138
+ classes.push(className);
139
+ }
140
+ }
141
+ };
142
+ args.forEach(walk);
143
+ return classes.join(' ');
144
+ };
145
+ return {
146
+ css,
147
+ cx,
148
+ injectGlobal,
149
+ stylesheet,
150
+ globalModules: () => [...state.globals],
151
+ };
152
+ };
153
+ exports.createEmotion = createEmotion;
154
+ const makeWrapper = (handle) => {
155
+ const readable = handle.readableName;
156
+ const asString = () => readable;
157
+ // Spread copy keeps `resolveClassName` (closed over the original handle) and
158
+ // `key` intact so collector dedupe and compaction work unchanged.
159
+ const wrapper = { ...handle };
160
+ wrapper.toString = asString;
161
+ wrapper[Symbol.toPrimitive] = asString;
162
+ return wrapper;
163
+ };
164
+ const isBranded = (state, value) => Boolean(value && typeof value === 'object' && state.brand.has(value));
165
+ const assertTemplate = (strings, fn) => {
166
+ if (!Array.isArray(strings) || !('raw' in strings)) {
167
+ throw new Error(`${fn} is a template tag; object styles (${fn}({...})) are not supported.`);
168
+ }
169
+ };
170
+ const detectCollision = (state, moduleName, canonical) => {
171
+ const prior = state.canonicalByModule.get(moduleName);
172
+ if (prior !== undefined && prior !== canonical) {
173
+ throw new Error(`Content-hash collision for "${moduleName}"; two distinct templates hashed to the same name.`);
174
+ }
175
+ };
176
+ // A cheap, exact collision tripwire independent of the (lossy) hash. NUL-joins
177
+ // strings and String()s values — good enough because it is only ever compared
178
+ // against another canonical string for the same module name.
179
+ const canonicalKey = (strings, values) => {
180
+ const segments = [];
181
+ strings.forEach((part, index) => {
182
+ segments.push(part);
183
+ if (index < values.length) {
184
+ segments.push(String(values[index]));
185
+ }
186
+ });
187
+ return segments.join('\u0000');
188
+ };
189
+ //# sourceMappingURL=emotion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emotion.js","sourceRoot":"","sources":["../../src/emotion.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 { Distillery } from './engine';\nimport { contentHash64 } from './hash';\nimport { flattenTemplate, isHandleLike, type TemplateSlice } from './nesting';\nimport {\n globalStylesFromFlattened,\n pendingHandleFromFlattened,\n type StyleHandle,\n type StyleRegistry,\n type StylesModule,\n} from './styles';\n\nexport {\n createDomSink,\n type CreateDomSinkOptions,\n type DocumentLike,\n type StyleElementLike,\n} from './dom_sink';\n\n/** Receives stylesheet invalidation from Emotion compat modules. */\nexport interface StyleSink {\n /** Marks the sink dirty. `render` produces the current stylesheet when it flushes. */\n invalidate(render: () => string): void;\n}\n\n/** Shared sink for Emotion compat modules on one registry. */\nexport interface CreateEmotionOptions {\n /** Notified when a compat module registers. Shared across `createEmotion` calls on the same registry. */\n sink?: StyleSink;\n}\n\n/** Style handle that stringifies to its readable class name. */\nexport interface EmotionCss extends StyleHandle {\n /** Stringifies to the readable class name. */\n toString(): string;\n /** Template interpolation; same as {@link EmotionCss.toString}. */\n [Symbol.toPrimitive](hint: string): string;\n}\n\n/** One `cx(...)` argument: a class, handle, list, or truthy map. */\nexport type ClassNameArg =\n | string\n | number\n | false\n | null\n | undefined\n | EmotionCss\n | StyleHandle\n | ClassNameArg[]\n | { readonly [className: string]: boolean };\n\n/** Emotion-shaped authoring API bound to one Distillery registry. */\nexport interface Emotion {\n /** Authors styles and returns a handle that can be used directly or passed to `cx`. */\n css(strings: TemplateStringsArray, ...values: readonly unknown[]): EmotionCss;\n /** Combines handles, conditional classes, and plain strings into a space-separated string. */\n cx(...args: readonly ClassNameArg[]): string;\n /** Defines styles that apply globally (e.g. `body`, `html`). */\n injectGlobal(\n strings: TemplateStringsArray,\n ...values: readonly unknown[]\n ): void;\n /** Emits the full CSS for all generated emotion styles. */\n stylesheet(): string;\n /** Returns the underlying modules backing `injectGlobal` calls. */\n globalModules(): readonly StylesModule[];\n}\n\n/** Per-registry Emotion compat cache. */\ninterface EmotionState {\n /** `css` handles keyed by source hash. */\n readonly wrappers: Map<string, EmotionCss>;\n /** Original templates for inlining nested compat handles. */\n readonly rawSources: Map<string, TemplateSlice>;\n /** Module name → canonical source hash. */\n readonly canonicalByModule: Map<string, string>;\n /** Modules produced by `injectGlobal`. */\n readonly globals: StylesModule[];\n /** Handles created by this registry's Emotion instance. */\n readonly brand: WeakSet<object>;\n /** Sinks notified when a compat module registers. */\n readonly sinks: Set<StyleSink>;\n}\n\nconst stateByRegistry = new WeakMap<StyleRegistry, EmotionState>();\n\nconst stateFor = (registry: StyleRegistry): EmotionState => {\n let state = stateByRegistry.get(registry);\n if (!state) {\n state = {\n wrappers: new Map(),\n rawSources: new Map(),\n canonicalByModule: new Map(),\n globals: [],\n brand: new WeakSet(),\n sinks: new Set(),\n };\n stateByRegistry.set(registry, state);\n }\n return state;\n};\n\n/**\n * `@emotion/css`-shaped API over a distillery.\n *\n * `String(css\\`...\\`)` is the readable class name and does not collect. Passing the wrapper through `resolveClassName` collects and compacts like a native handle.\n *\n * @param distillery Bound distillery that owns the underlying registry.\n * @param options Optional sink for DOM injection.\n */\nexport const createEmotion = <TTokens>(\n distillery: Distillery<TTokens>,\n options: CreateEmotionOptions = {}\n): Emotion => {\n const { registry } = distillery;\n const state = stateFor(registry);\n\n const stylesheet = (): string =>\n distillery.renderStyles(distillery.stylesheetCollector('readable'));\n\n const invalidateSinks = (): void => {\n for (const sink of state.sinks) {\n sink.invalidate(stylesheet);\n }\n };\n\n if (options.sink) {\n state.sinks.add(options.sink);\n // Catch a late-attached sink up to styles already registered on this\n // registry: cached `css`/`injectGlobal` calls return early without\n // invalidating, so without this the managed `<style>` would miss every\n // style registered before the sink was attached.\n options.sink.invalidate(stylesheet);\n }\n\n const inlineValue = (\n value: unknown,\n position: 'selector' | 'statement'\n ): TemplateSlice | null => {\n if (position !== 'statement' || !isBranded(state, value)) {\n return null;\n }\n return state.rawSources.get((value as StyleHandle).key) ?? null;\n };\n\n const css = (\n strings: TemplateStringsArray,\n ...values: readonly unknown[]\n ): EmotionCss => {\n assertTemplate(strings, 'css');\n const hash = contentHash64(strings, values);\n const cached = state.wrappers.get(hash);\n if (cached) {\n return cached;\n }\n const moduleName = `css-${hash}`;\n const canonical = canonicalKey(strings, values);\n detectCollision(state, moduleName, canonical);\n\n const flat = flattenTemplate(strings, values, {\n mode: 'self',\n inlineValue,\n });\n const pending = pendingHandleFromFlattened(flat);\n const module = distillery.createStyleModule(moduleName, () => ({\n root: pending,\n }));\n const handle = module.handles.root;\n\n state.rawSources.set(handle.key, {\n strings: [...strings],\n values: [...values],\n });\n const wrapper = makeWrapper(handle);\n state.brand.add(wrapper);\n state.wrappers.set(hash, wrapper);\n state.canonicalByModule.set(moduleName, canonical);\n invalidateSinks();\n return wrapper;\n };\n\n const injectGlobal = (\n strings: TemplateStringsArray,\n ...values: readonly unknown[]\n ): void => {\n assertTemplate(strings, 'injectGlobal');\n const hash = contentHash64(strings, values);\n const moduleName = `global-${hash}`;\n if (registry.module(moduleName)) {\n return;\n }\n const canonical = canonicalKey(strings, values);\n detectCollision(state, moduleName, canonical);\n\n const flat = flattenTemplate(strings, values, {\n mode: 'global',\n inlineValue,\n });\n const module = distillery.createStyleModule(moduleName, () =>\n globalStylesFromFlattened(flat)\n );\n state.canonicalByModule.set(moduleName, canonical);\n state.globals.push(module);\n invalidateSinks();\n };\n\n const cx = (...args: readonly ClassNameArg[]): string => {\n const classes: string[] = [];\n const walk = (arg: ClassNameArg): void => {\n if (!arg) {\n return;\n }\n if (typeof arg === 'string') {\n classes.push(arg);\n return;\n }\n if (typeof arg === 'number') {\n classes.push(String(arg));\n return;\n }\n if (Array.isArray(arg)) {\n arg.forEach(walk);\n return;\n }\n if (isBranded(state, arg)) {\n classes.push(String(arg));\n return;\n }\n if (isHandleLike(arg)) {\n classes.push(arg.readableName);\n return;\n }\n for (const [className, enabled] of Object.entries(arg)) {\n if (enabled) {\n classes.push(className);\n }\n }\n };\n args.forEach(walk);\n return classes.join(' ');\n };\n\n return {\n css,\n cx,\n injectGlobal,\n stylesheet,\n globalModules: () => [...state.globals],\n };\n};\n\nconst makeWrapper = (handle: StyleHandle): EmotionCss => {\n const readable = handle.readableName;\n const asString = (): string => readable;\n // Spread copy keeps `resolveClassName` (closed over the original handle) and\n // `key` intact so collector dedupe and compaction work unchanged.\n const wrapper = { ...handle } as EmotionCss & {\n toString: () => string;\n [Symbol.toPrimitive]: () => string;\n };\n wrapper.toString = asString;\n wrapper[Symbol.toPrimitive] = asString;\n return wrapper;\n};\n\nconst isBranded = (state: EmotionState, value: unknown): value is EmotionCss =>\n Boolean(value && typeof value === 'object' && state.brand.has(value));\n\nconst assertTemplate = (strings: unknown, fn: string): void => {\n if (!Array.isArray(strings) || !('raw' in (strings as object))) {\n throw new Error(\n `${fn} is a template tag; object styles (${fn}({...})) are not supported.`\n );\n }\n};\n\nconst detectCollision = (\n state: EmotionState,\n moduleName: string,\n canonical: string\n): void => {\n const prior = state.canonicalByModule.get(moduleName);\n if (prior !== undefined && prior !== canonical) {\n throw new Error(\n `Content-hash collision for \"${moduleName}\"; two distinct templates hashed to the same name.`\n );\n }\n};\n\n// A cheap, exact collision tripwire independent of the (lossy) hash. NUL-joins\n// strings and String()s values — good enough because it is only ever compared\n// against another canonical string for the same module name.\nconst canonicalKey = (\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(String(values[index]));\n }\n });\n return segments.join('\\u0000');\n};\n"]}
@@ -0,0 +1,79 @@
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.createDistillery = void 0;
10
+ const collector_1 = require("./collector");
11
+ const idents_1 = require("./idents");
12
+ const names_1 = require("./names");
13
+ const runtime_1 = require("./runtime");
14
+ const styles_1 = require("./styles");
15
+ const theme_1 = require("./theme");
16
+ /**
17
+ * Binds the engine to one library's prefix and theme tree.
18
+ *
19
+ * @param options Brand prefix, theme scope, and authoring theme tree.
20
+ * @throws If `prefix` is not a CSS identifier segment, if a theme key contains a hyphen, if a `lightDark` value is not a CSS `<color>`, if a named variation disagrees with the base, or if `themeVars` / `sharedVars` claim the same readable custom-property name.
21
+ */
22
+ const createDistillery = (options) => {
23
+ const { prefix, themeScope, theme, sharedVars: sharedVarList, variations, dev = false, } = options;
24
+ (0, idents_1.assertCssIdentSegment)(prefix, 'Distillery prefix');
25
+ const { tokens, themeVars } = (0, theme_1.deriveTheme)(prefix, theme);
26
+ const sharedVars = sharedVarList
27
+ ? Object.freeze(new Set(sharedVarList))
28
+ : undefined;
29
+ const resolvedVariations = (0, theme_1.resolveThemeVariations)(prefix, theme, themeVars, variations);
30
+ const environment = {
31
+ prefix,
32
+ themeScope,
33
+ themeVars: Object.freeze(themeVars),
34
+ tokens,
35
+ ...(sharedVars ? { sharedVars } : {}),
36
+ ...(Object.keys(resolvedVariations).length > 0
37
+ ? { variations: resolvedVariations }
38
+ : {}),
39
+ };
40
+ const registry = new styles_1.StyleRegistry(prefix, (0, styles_1.readableVarOwnersFromEnvironment)(environment), sharedVars ?? new Set());
41
+ return {
42
+ environment,
43
+ tokens,
44
+ themeVars: environment.themeVars,
45
+ resolveValues: (scheme, variation) => (0, theme_1.resolveThemeValues)(theme, themeVars, scheme, variation === undefined
46
+ ? undefined
47
+ : (0, theme_1.requireThemeVariation)(environment.variations, variation)),
48
+ registry,
49
+ dev,
50
+ createStyleModule: (name, factory) => (0, styles_1.createStyleModuleWithEnvironment)(environment, registry, name, factory),
51
+ primitiveStyles: (name, factory) => (0, styles_1.createStyleModuleWithEnvironment)(environment, registry, name, ({ css: style, tokens: moduleTokens }) => factory({ style, tokens: moduleTokens })),
52
+ artifactCollector: (names, options) => new collector_1.StylesCollector({
53
+ target: 'artifact',
54
+ names,
55
+ registry,
56
+ prefix,
57
+ dev,
58
+ ...(options?.warn ? { warn: options.warn } : {}),
59
+ }),
60
+ stylesheetCollector: (names = 'readable', options) => {
61
+ const collector = new collector_1.StylesCollector({
62
+ target: 'stylesheet',
63
+ names,
64
+ registry,
65
+ prefix,
66
+ dev,
67
+ ...(options?.warn ? { warn: options.warn } : {}),
68
+ });
69
+ for (const module of registry.modules) {
70
+ collector.useAllEntries(module);
71
+ }
72
+ return collector;
73
+ },
74
+ renderStyles: (collector, resolver, renderOptions) => (0, runtime_1.renderStyles)(environment, collector, resolver, renderOptions),
75
+ createNameResolver: (resolverOptions) => (0, names_1.createStyleNameResolver)({ ...resolverOptions, prefix }),
76
+ };
77
+ };
78
+ exports.createDistillery = createDistillery;
79
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/engine.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 { StylesCollector, type StylesCollectorOptions } from './collector';\nimport type {\n DistilleryEnvironment,\n DistilleryOptions,\n ThemeVarDefinition,\n} from './environment';\nimport { assertCssIdentSegment } from './idents';\nimport {\n createStyleNameResolver,\n type StyleNameMode,\n type StyleNameResolver,\n type StyleNameResolverOptions,\n} from './names';\nimport { renderStyles, type RenderStylesOptions } from './runtime';\nimport {\n createStyleModuleWithEnvironment,\n type PrimitiveStyleAuthoringApi,\n readableVarOwnersFromEnvironment,\n type ResolvedStyles,\n type StyleAuthoringApi,\n StyleRegistry,\n type StylesModule,\n type StylesObject,\n} from './styles';\nimport {\n deriveTheme,\n requireThemeVariation,\n resolveThemeValues,\n resolveThemeVariations,\n type ThemeTree,\n type TokensOf,\n type ValuesOf,\n} from './theme';\n\n/** One component library's binding: environment, registry, and pre-bound operations. Destructure-safe (no `this`). */\nexport interface Distillery<\n TTokens = unknown,\n TTheme extends ThemeTree = ThemeTree,\n> {\n /** Resolved environment (tokens, prefix, derived theme vars). */\n readonly environment: DistilleryEnvironment<TTokens>;\n /** Derived token tree, same object as `environment.tokens`. */\n readonly tokens: TTokens;\n /** Derived theme-var registry, same object as `environment.themeVars`. */\n readonly themeVars: Readonly<Record<string, ThemeVarDefinition>>;\n /** Nested literal values for one scheme. Optional `variation` is a name from `variations`. */\n readonly resolveValues: (\n scheme: 'light' | 'dark',\n variation?: string\n ) => ValuesOf<TTheme>;\n /** The module registry accumulating collected handles and rules. */\n readonly registry: StyleRegistry;\n /** When `true`, collectors warn about no-op handles. */\n readonly dev: boolean;\n /** Named handle tree plus tokens. */\n readonly createStyleModule: <TStyles extends StylesObject>(\n name: string,\n factory: (api: StyleAuthoringApi<TTokens>) => TStyles\n ) => StylesModule<ResolvedStyles<TStyles>>;\n /** Named handles plus tokens only. */\n readonly primitiveStyles: <TStyles extends StylesObject>(\n name: string,\n factory: (api: PrimitiveStyleAuthoringApi<TTokens>) => TStyles\n ) => StylesModule<ResolvedStyles<TStyles>>;\n /** Collector for one render. Class-name resolution collects as a side effect. No-op warnings require `dev: true`; pass `{ warn }` to capture them. */\n readonly artifactCollector: (\n names: StyleNameMode,\n options?: Pick<StylesCollectorOptions, 'warn'>\n ) => StylesCollector;\n /** Collector preloaded with every registered module. No-op warnings require `dev: true`; pass `{ warn }` to capture them. */\n readonly stylesheetCollector: (\n names?: StyleNameMode,\n options?: Pick<StylesCollectorOptions, 'warn'>\n ) => StylesCollector;\n /** Emits collected CSS for this environment. */\n readonly renderStyles: (\n collector: StylesCollector,\n resolver?: StyleNameResolver,\n options?: RenderStylesOptions\n ) => string;\n /** Creates a standalone name resolver using this distillery's prefix. */\n readonly createNameResolver: (\n options: Omit<StyleNameResolverOptions, 'prefix'>\n ) => StyleNameResolver;\n}\n\n/**\n * Binds the engine to one library's prefix and theme tree.\n *\n * @param options Brand prefix, theme scope, and authoring theme tree.\n * @throws If `prefix` is not a CSS identifier segment, if a theme key contains a hyphen, if a `lightDark` value is not a CSS `<color>`, if a named variation disagrees with the base, or if `themeVars` / `sharedVars` claim the same readable custom-property name.\n */\nexport const createDistillery = <const TTheme extends ThemeTree>(\n options: DistilleryOptions<TTheme>\n): Distillery<TokensOf<TTheme>, TTheme> => {\n const {\n prefix,\n themeScope,\n theme,\n sharedVars: sharedVarList,\n variations,\n dev = false,\n } = options;\n assertCssIdentSegment(prefix, 'Distillery prefix');\n const { tokens, themeVars } = deriveTheme(prefix, theme);\n const sharedVars = sharedVarList\n ? Object.freeze(new Set(sharedVarList))\n : undefined;\n const resolvedVariations = resolveThemeVariations(\n prefix,\n theme,\n themeVars,\n variations\n );\n const environment: DistilleryEnvironment<TokensOf<TTheme>> = {\n prefix,\n themeScope,\n themeVars: Object.freeze(themeVars),\n tokens,\n ...(sharedVars ? { sharedVars } : {}),\n ...(Object.keys(resolvedVariations).length > 0\n ? { variations: resolvedVariations }\n : {}),\n };\n const registry = new StyleRegistry(\n prefix,\n readableVarOwnersFromEnvironment(environment),\n sharedVars ?? new Set()\n );\n\n return {\n environment,\n tokens,\n themeVars: environment.themeVars,\n resolveValues: (scheme, variation) =>\n resolveThemeValues(\n theme,\n themeVars,\n scheme,\n variation === undefined\n ? undefined\n : requireThemeVariation(environment.variations, variation)\n ),\n registry,\n dev,\n createStyleModule: (name, factory) =>\n createStyleModuleWithEnvironment(environment, registry, name, factory),\n primitiveStyles: (name, factory) =>\n createStyleModuleWithEnvironment(\n environment,\n registry,\n name,\n ({ css: style, tokens: moduleTokens }) =>\n factory({ style, tokens: moduleTokens })\n ),\n artifactCollector: (names, options) =>\n new StylesCollector({\n target: 'artifact',\n names,\n registry,\n prefix,\n dev,\n ...(options?.warn ? { warn: options.warn } : {}),\n }),\n stylesheetCollector: (names = 'readable', options) => {\n const collector = new StylesCollector({\n target: 'stylesheet',\n names,\n registry,\n prefix,\n dev,\n ...(options?.warn ? { warn: options.warn } : {}),\n });\n for (const module of registry.modules) {\n collector.useAllEntries(module);\n }\n return collector;\n },\n renderStyles: (collector, resolver, renderOptions) =>\n renderStyles(environment, collector, resolver, renderOptions),\n createNameResolver: (resolverOptions) =>\n createStyleNameResolver({ ...resolverOptions, prefix }),\n };\n};\n"]}
@@ -0,0 +1,9 @@
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
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/environment.ts"],"names":[],"mappings":";AAAA;;;;;GAKG","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 {\n ResolvedThemeVariation,\n ThemeTree,\n ThemeVariation,\n} from './theme';\n\n/** One theme CSS variable. Differing `light`/`dark` fold into `light-dark(...)`. */\nexport interface ThemeVarDefinition {\n /** Theme-tree path this definition was derived from. */\n readonly path: string;\n /** Emitted CSS custom property name. Equal to `cssVarName(prefix, path)`. */\n readonly cssVar: `--${string}`;\n /** Value for light color scheme. */\n readonly light: string;\n /** Value for dark color scheme. Equal to `light` for scheme-invariant tokens. */\n readonly dark: string;\n}\n\n/** Authoring input to `createDistillery`. */\nexport interface DistilleryOptions<TTheme extends ThemeTree = ThemeTree> {\n /** Brand identifier used in readable class and CSS-variable names. Must be a CSS identifier segment. */\n readonly prefix: string;\n /** Selector wrapping emitted theme-var declarations. */\n readonly themeScope: string;\n /** Nested value tree. Strings and `lightDark` leaves become theme vars; `ScaleToken` leaves inline. */\n readonly theme: TTheme;\n /** Named partial variations of `theme`. Declaring a variation does not emit it; name it at `renderStyles`. */\n readonly variations?: Readonly<Record<string, ThemeVariation<TTheme>>>;\n /** Cross-module contextual-var paths. Names are `cssVarName(prefix, path)`. Module-local `vars(...)` groups are not listed here. */\n readonly sharedVars?: readonly `vars/${string}`[];\n /** When `true`, collectors warn about no-op handles. Default `false`. Does not affect the single-copy guard. */\n readonly dev?: boolean;\n}\n\n/** Resolved environment: derived `themeVars` / `tokens` plus the bind-time prefix and scope. */\nexport interface DistilleryEnvironment<TTokens = unknown> {\n /** Brand identifier used in readable class and CSS-variable names. Must be a CSS identifier segment. */\n readonly prefix: string;\n /** Selector wrapping emitted theme-var declarations. */\n readonly themeScope: string;\n /** Theme token path → definition. Emission sorts paths. */\n readonly themeVars: Readonly<Record<string, ThemeVarDefinition>>;\n /** Cross-module contextual-var paths. Module-local `vars(...)` groups are not listed here. */\n readonly sharedVars?: ReadonlySet<`vars/${string}`>;\n /** Typed token tree, surfaced as `tokens` on the authoring API. */\n readonly tokens: TTokens;\n /** Named variations resolved against `themeVars`. Absent when no `variations` were declared. */\n readonly variations?: Readonly<Record<string, ResolvedThemeVariation>>;\n}\n"]}
@@ -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,42 @@
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.createDistillery = void 0;
10
+ var engine_1 = require("./engine");
11
+ Object.defineProperty(exports, "createDistillery", { enumerable: true, get: function () { return engine_1.createDistillery; } });
12
+ var theme_1 = require("./theme");
13
+ Object.defineProperty(exports, "resolveThemeValues", { enumerable: true, get: function () { return theme_1.resolveThemeValues; } });
14
+ Object.defineProperty(exports, "zipSchemes", { enumerable: true, get: function () { return theme_1.zipSchemes; } });
15
+ var tokens_1 = require("./tokens");
16
+ Object.defineProperty(exports, "contextualVar", { enumerable: true, get: function () { return tokens_1.contextualVar; } });
17
+ Object.defineProperty(exports, "cq", { enumerable: true, get: function () { return tokens_1.cq; } });
18
+ Object.defineProperty(exports, "isContextualCssVar", { enumerable: true, get: function () { return tokens_1.isContextualCssVar; } });
19
+ Object.defineProperty(exports, "isContextualCssVarName", { enumerable: true, get: function () { return tokens_1.isContextualCssVarName; } });
20
+ Object.defineProperty(exports, "isCssToken", { enumerable: true, get: function () { return tokens_1.isCssToken; } });
21
+ Object.defineProperty(exports, "isScaleToken", { enumerable: true, get: function () { return tokens_1.isScaleToken; } });
22
+ Object.defineProperty(exports, "lightDark", { enumerable: true, get: function () { return tokens_1.lightDark; } });
23
+ Object.defineProperty(exports, "scaleToken", { enumerable: true, get: function () { return tokens_1.scaleToken; } });
24
+ Object.defineProperty(exports, "themeToken", { enumerable: true, get: function () { return tokens_1.themeToken; } });
25
+ var names_1 = require("./names");
26
+ Object.defineProperty(exports, "createStyleNameResolver", { enumerable: true, get: function () { return names_1.createStyleNameResolver; } });
27
+ Object.defineProperty(exports, "cssVarName", { enumerable: true, get: function () { return names_1.cssVarName; } });
28
+ var collector_1 = require("./collector");
29
+ Object.defineProperty(exports, "StylesCollector", { enumerable: true, get: function () { return collector_1.StylesCollector; } });
30
+ var runtime_1 = require("./runtime");
31
+ Object.defineProperty(exports, "renderStyles", { enumerable: true, get: function () { return runtime_1.renderStyles; } });
32
+ var styles_1 = require("./styles");
33
+ Object.defineProperty(exports, "combineClassNames", { enumerable: true, get: function () { return styles_1.combineClassNames; } });
34
+ Object.defineProperty(exports, "container", { enumerable: true, get: function () { return styles_1.container; } });
35
+ Object.defineProperty(exports, "css", { enumerable: true, get: function () { return styles_1.css; } });
36
+ Object.defineProperty(exports, "decls", { enumerable: true, get: function () { return styles_1.decls; } });
37
+ Object.defineProperty(exports, "mapDomain", { enumerable: true, get: function () { return styles_1.mapDomain; } });
38
+ Object.defineProperty(exports, "media", { enumerable: true, get: function () { return styles_1.media; } });
39
+ Object.defineProperty(exports, "rule", { enumerable: true, get: function () { return styles_1.rule; } });
40
+ Object.defineProperty(exports, "StyleRegistry", { enumerable: true, get: function () { return styles_1.StyleRegistry; } });
41
+ Object.defineProperty(exports, "variants", { enumerable: true, get: function () { return styles_1.variants; } });
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,mCAA6D;AAApD,0GAAA,gBAAgB,OAAA;AAMzB,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 { createDistillery, type Distillery } from './engine';\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"]}