@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.
- package/LICENSE.txt +93 -0
- package/NOTICE.txt +30 -0
- package/README.md +142 -0
- package/THIRD_PARTY_LICENSES.md +768 -0
- package/dist/cjs/collector.js +420 -0
- package/dist/cjs/collector.js.map +1 -0
- package/dist/cjs/css_scan.js +186 -0
- package/dist/cjs/css_scan.js.map +1 -0
- package/dist/cjs/dom_sink.js +40 -0
- package/dist/cjs/dom_sink.js.map +1 -0
- package/dist/cjs/emotion.js +189 -0
- package/dist/cjs/emotion.js.map +1 -0
- package/dist/cjs/engine.js +79 -0
- package/dist/cjs/engine.js.map +1 -0
- package/dist/cjs/environment.js +9 -0
- package/dist/cjs/environment.js.map +1 -0
- package/dist/cjs/hash.js +86 -0
- package/dist/cjs/hash.js.map +1 -0
- package/dist/cjs/idents.js +23 -0
- package/dist/cjs/idents.js.map +1 -0
- package/dist/cjs/index.js +42 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/instance.js +34 -0
- package/dist/cjs/instance.js.map +1 -0
- package/dist/cjs/local_vars.js +100 -0
- package/dist/cjs/local_vars.js.map +1 -0
- package/dist/cjs/minify.js +77 -0
- package/dist/cjs/minify.js.map +1 -0
- package/dist/cjs/names.js +77 -0
- package/dist/cjs/names.js.map +1 -0
- package/dist/cjs/nesting.js +406 -0
- package/dist/cjs/nesting.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/runtime.js +257 -0
- package/dist/cjs/runtime.js.map +1 -0
- package/dist/cjs/styles/authoring.js +169 -0
- package/dist/cjs/styles/authoring.js.map +1 -0
- package/dist/cjs/styles/declarations.js +139 -0
- package/dist/cjs/styles/declarations.js.map +1 -0
- package/dist/cjs/styles/index.js +32 -0
- package/dist/cjs/styles/index.js.map +1 -0
- package/dist/cjs/styles/module.js +233 -0
- package/dist/cjs/styles/module.js.map +1 -0
- package/dist/cjs/styles/registry.js +187 -0
- package/dist/cjs/styles/registry.js.map +1 -0
- package/dist/cjs/styles/types.js +9 -0
- package/dist/cjs/styles/types.js.map +1 -0
- package/dist/cjs/testing.js +37 -0
- package/dist/cjs/testing.js.map +1 -0
- package/dist/cjs/theme.js +249 -0
- package/dist/cjs/theme.js.map +1 -0
- package/dist/cjs/tokens/contextual_var.js +39 -0
- package/dist/cjs/tokens/contextual_var.js.map +1 -0
- package/dist/cjs/tokens/index.js +24 -0
- package/dist/cjs/tokens/index.js.map +1 -0
- package/dist/cjs/tokens/kind.js +14 -0
- package/dist/cjs/tokens/kind.js.map +1 -0
- package/dist/cjs/tokens/light_dark.js +42 -0
- package/dist/cjs/tokens/light_dark.js.map +1 -0
- package/dist/cjs/tokens/scale_token.js +28 -0
- package/dist/cjs/tokens/scale_token.js.map +1 -0
- package/dist/cjs/tokens/theme_token.js +28 -0
- package/dist/cjs/tokens/theme_token.js.map +1 -0
- package/dist/cjs/var_invariant.js +115 -0
- package/dist/cjs/var_invariant.js.map +1 -0
- package/dist/collector.d.ts +84 -0
- package/dist/collector.d.ts.map +1 -0
- package/dist/collector.js +416 -0
- package/dist/collector.js.map +1 -0
- package/dist/css_scan.d.ts +57 -0
- package/dist/css_scan.d.ts.map +1 -0
- package/dist/css_scan.js +180 -0
- package/dist/css_scan.js.map +1 -0
- package/dist/dom_sink.d.ts +27 -0
- package/dist/dom_sink.d.ts.map +1 -0
- package/dist/dom_sink.js +36 -0
- package/dist/dom_sink.js.map +1 -0
- package/dist/emotion.d.ts +47 -0
- package/dist/emotion.d.ts.map +1 -0
- package/dist/emotion.js +184 -0
- package/dist/emotion.js.map +1 -0
- package/dist/engine.d.ts +41 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +75 -0
- package/dist/engine.js.map +1 -0
- package/dist/environment.d.ts +43 -0
- package/dist/environment.d.ts.map +1 -0
- package/dist/environment.js +8 -0
- package/dist/environment.js.map +1 -0
- package/dist/hash.d.ts +2 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +82 -0
- package/dist/hash.js.map +1 -0
- package/dist/idents.d.ts +9 -0
- package/dist/idents.d.ts.map +1 -0
- package/dist/idents.js +19 -0
- package/dist/idents.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/instance.d.ts +16 -0
- package/dist/instance.d.ts.map +1 -0
- package/dist/instance.js +30 -0
- package/dist/instance.js.map +1 -0
- package/dist/local_vars.d.ts +75 -0
- package/dist/local_vars.d.ts.map +1 -0
- package/dist/local_vars.js +92 -0
- package/dist/local_vars.js.map +1 -0
- package/dist/minify.d.ts +11 -0
- package/dist/minify.d.ts.map +1 -0
- package/dist/minify.js +73 -0
- package/dist/minify.js.map +1 -0
- package/dist/names.d.ts +39 -0
- package/dist/names.d.ts.map +1 -0
- package/dist/names.js +70 -0
- package/dist/names.js.map +1 -0
- package/dist/nesting.d.ts +59 -0
- package/dist/nesting.d.ts.map +1 -0
- package/dist/nesting.js +400 -0
- package/dist/nesting.js.map +1 -0
- package/dist/runtime.d.ts +36 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +252 -0
- package/dist/runtime.js.map +1 -0
- package/dist/styles/authoring.d.ts +59 -0
- package/dist/styles/authoring.d.ts.map +1 -0
- package/dist/styles/authoring.js +155 -0
- package/dist/styles/authoring.js.map +1 -0
- package/dist/styles/declarations.d.ts +10 -0
- package/dist/styles/declarations.d.ts.map +1 -0
- package/dist/styles/declarations.js +132 -0
- package/dist/styles/declarations.js.map +1 -0
- package/dist/styles/index.d.ts +7 -0
- package/dist/styles/index.d.ts.map +1 -0
- package/dist/styles/index.js +12 -0
- package/dist/styles/index.js.map +1 -0
- package/dist/styles/module.d.ts +5 -0
- package/dist/styles/module.d.ts.map +1 -0
- package/dist/styles/module.js +229 -0
- package/dist/styles/module.js.map +1 -0
- package/dist/styles/registry.d.ts +48 -0
- package/dist/styles/registry.d.ts.map +1 -0
- package/dist/styles/registry.js +182 -0
- package/dist/styles/registry.js.map +1 -0
- package/dist/styles/types.d.ts +211 -0
- package/dist/styles/types.d.ts.map +1 -0
- package/dist/styles/types.js +8 -0
- package/dist/styles/types.js.map +1 -0
- package/dist/testing.d.ts +10 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +31 -0
- package/dist/testing.js.map +1 -0
- package/dist/theme.d.ts +85 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +240 -0
- package/dist/theme.js.map +1 -0
- package/dist/tokens/contextual_var.d.ts +35 -0
- package/dist/tokens/contextual_var.d.ts.map +1 -0
- package/dist/tokens/contextual_var.js +33 -0
- package/dist/tokens/contextual_var.js.map +1 -0
- package/dist/tokens/index.d.ts +5 -0
- package/dist/tokens/index.d.ts.map +1 -0
- package/dist/tokens/index.js +11 -0
- package/dist/tokens/index.js.map +1 -0
- package/dist/tokens/kind.d.ts +2 -0
- package/dist/tokens/kind.d.ts.map +1 -0
- package/dist/tokens/kind.js +10 -0
- package/dist/tokens/kind.js.map +1 -0
- package/dist/tokens/light_dark.d.ts +20 -0
- package/dist/tokens/light_dark.d.ts.map +1 -0
- package/dist/tokens/light_dark.js +37 -0
- package/dist/tokens/light_dark.js.map +1 -0
- package/dist/tokens/scale_token.d.ts +20 -0
- package/dist/tokens/scale_token.d.ts.map +1 -0
- package/dist/tokens/scale_token.js +23 -0
- package/dist/tokens/scale_token.js.map +1 -0
- package/dist/tokens/theme_token.d.ts +20 -0
- package/dist/tokens/theme_token.d.ts.map +1 -0
- package/dist/tokens/theme_token.js +23 -0
- package/dist/tokens/theme_token.js.map +1 -0
- package/dist/var_invariant.d.ts +25 -0
- package/dist/var_invariant.d.ts.map +1 -0
- package/dist/var_invariant.js +108 -0
- package/dist/var_invariant.js.map +1 -0
- package/docs/concepts/authoring.md +115 -0
- package/docs/concepts/collection.md +66 -0
- package/docs/concepts/distillery.md +47 -0
- package/docs/concepts/index.md +18 -0
- package/docs/concepts/naming-and-output.md +123 -0
- package/docs/concepts/ordering.md +61 -0
- package/docs/concepts/single-copy.md +103 -0
- package/docs/concepts/tokens.md +99 -0
- package/docs/docset.yml +53 -0
- package/docs/examples/01-stylesheet.ts +20 -0
- package/docs/examples/02-artifact.ts +26 -0
- package/docs/examples/03-variants.ts +40 -0
- package/docs/examples/04-emotion.ts +33 -0
- package/docs/examples/05-var-invariant.ts +31 -0
- package/docs/examples/06-payload.ts +85 -0
- package/docs/examples/fixture.ts +22 -0
- package/docs/getting-started/index.md +14 -0
- package/docs/getting-started/installation.md +30 -0
- package/docs/getting-started/quick-start.md +61 -0
- package/docs/getting-started/your-first-stylesheet.md +57 -0
- package/docs/guides/compact-artifacts.md +87 -0
- package/docs/guides/emotion-migration.md +60 -0
- package/docs/guides/index.md +17 -0
- package/docs/guides/name-collisions.md +37 -0
- package/docs/guides/non-css-surfaces.md +73 -0
- package/docs/guides/react-renderer.md +158 -0
- package/docs/guides/theming.md +107 -0
- package/docs/guides/var-invariant.md +24 -0
- package/docs/guides/vs-emotion.md +61 -0
- package/docs/index.md +73 -0
- package/docs/logo.svg +7 -0
- package/docs/playground/index.html +12 -0
- package/docs/playground/package.json +23 -0
- package/docs/playground/src/app/app.tsx +109 -0
- package/docs/playground/src/app/css_panel.tsx +119 -0
- package/docs/playground/src/app/editor_panel.tsx +87 -0
- package/docs/playground/src/app/index.ts +8 -0
- package/docs/playground/src/app/monaco_css_editor.tsx +84 -0
- package/docs/playground/src/app/monaco_source_editor.tsx +132 -0
- package/docs/playground/src/app/preview_panel.tsx +99 -0
- package/docs/playground/src/app/tokens_panel.tsx +117 -0
- package/docs/playground/src/app/types.ts +10 -0
- package/docs/playground/src/examples/snippets.test.ts +28 -0
- package/docs/playground/src/examples/snippets.ts +418 -0
- package/docs/playground/src/lib/compile.test.ts +157 -0
- package/docs/playground/src/lib/compile.ts +242 -0
- package/docs/playground/src/lib/demo_environment.test.ts +123 -0
- package/docs/playground/src/lib/demo_environment.ts +140 -0
- package/docs/playground/src/lib/editor_lib.test.ts +39 -0
- package/docs/playground/src/lib/editor_lib.ts +142 -0
- package/docs/playground/src/lib/format_css.test.ts +41 -0
- package/docs/playground/src/lib/format_css.ts +71 -0
- package/docs/playground/src/main.tsx +25 -0
- package/docs/playground/src/setup/chrome.test.ts +47 -0
- package/docs/playground/src/setup/chrome.ts +365 -0
- package/docs/playground/src/setup/monaco_env.ts +64 -0
- package/docs/playground/tsconfig.json +22 -0
- package/docs/playground/vite.config.ts +37 -0
- package/docs/playground/vitest.config.ts +35 -0
- package/docs/playground.md +28 -0
- package/docs/reference/api/emotion.md +372 -0
- package/docs/reference/api/index-1.md +2180 -0
- package/docs/reference/api/index.md +9 -0
- package/docs/reference/api/testing.md +92 -0
- package/docs/reference/api.md +12 -0
- package/docs/reference/entry-points.md +125 -0
- package/docs/reference/environment.md +60 -0
- package/docs/reference/index.md +11 -0
- package/docs/reference/okf-map.md +92 -0
- package/package.json +127 -4
- package/src/collector.ts +526 -0
- package/src/css_scan.ts +263 -0
- package/src/dom_sink.ts +65 -0
- package/src/emotion.ts +311 -0
- package/src/engine.ts +191 -0
- package/src/environment.ts +56 -0
- package/src/hash.ts +111 -0
- package/src/idents.ts +21 -0
- package/src/index.ts +93 -0
- package/src/instance.ts +49 -0
- package/src/local_vars.ts +220 -0
- package/src/minify.ts +87 -0
- package/src/names.ts +129 -0
- package/src/nesting.ts +596 -0
- package/src/runtime.ts +428 -0
- package/src/styles/authoring.ts +244 -0
- package/src/styles/declarations.ts +172 -0
- package/src/styles/index.ts +58 -0
- package/src/styles/module.ts +396 -0
- package/src/styles/registry.ts +261 -0
- package/src/styles/types.ts +283 -0
- package/src/testing.ts +48 -0
- package/src/theme.ts +454 -0
- package/src/tokens/contextual_var.ts +72 -0
- package/src/tokens/index.ts +17 -0
- package/src/tokens/kind.ts +13 -0
- package/src/tokens/light_dark.ts +58 -0
- package/src/tokens/scale_token.ts +41 -0
- package/src/tokens/theme_token.ts +42 -0
- package/src/var_invariant.ts +147 -0
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
|
3
|
+
* or more contributor license agreements. Licensed under the Elastic License
|
|
4
|
+
* 2.0; you may not use this file except in compliance with the Elastic License
|
|
5
|
+
* 2.0.
|
|
6
|
+
*/
|
|
7
|
+
import { isBlankCss, isOpaque, scanCss } from './css_scan.js';
|
|
8
|
+
import { isLocalVarDefaultMarker, isLocalVarOverrideMarker, } from './local_vars.js';
|
|
9
|
+
import { minifyCss } from './minify.js';
|
|
10
|
+
import { cssVarName } from './names.js';
|
|
11
|
+
import { requireThemeVariation, serializedThemeValue, } from './theme.js';
|
|
12
|
+
/**
|
|
13
|
+
* Emits collected CSS: theme block, then entries, minified.
|
|
14
|
+
*
|
|
15
|
+
* @param environment Theme vars, prefix, and scope for this render.
|
|
16
|
+
* @param collector Reachable entries and deps.
|
|
17
|
+
* @param resolver Defaults to `collector.createResolver()`.
|
|
18
|
+
*/
|
|
19
|
+
export const renderStyles = (environment, collector, resolver = collector.createResolver(), options = {}) => {
|
|
20
|
+
const ctx = { environment, collector, resolver, options };
|
|
21
|
+
const bodyFragments = collector.collectedEntries.map((entry) => {
|
|
22
|
+
if (entry.kind === 'handle') {
|
|
23
|
+
return renderHandle(entry, ctx);
|
|
24
|
+
}
|
|
25
|
+
if (entry.kind === 'rule') {
|
|
26
|
+
return renderRule(entry, ctx);
|
|
27
|
+
}
|
|
28
|
+
const inner = entry.rules
|
|
29
|
+
.map((rule) => renderRule(rule, ctx))
|
|
30
|
+
.filter((fragment) => fragment.length > 0);
|
|
31
|
+
return inner.length > 0
|
|
32
|
+
? `@${entry.atRule ?? 'media'} ${entry.query}{${inner.join('')}}`
|
|
33
|
+
: '';
|
|
34
|
+
});
|
|
35
|
+
const bodyCss = bodyFragments.join('');
|
|
36
|
+
const fragments = [renderThemeVars(ctx), bodyCss];
|
|
37
|
+
return minifyCss(fragments.join(''));
|
|
38
|
+
};
|
|
39
|
+
const renderThemeVars = (ctx) => {
|
|
40
|
+
const { environment, options } = ctx;
|
|
41
|
+
const selected = options.flatten
|
|
42
|
+
? themeVariation(environment, options.flatten)
|
|
43
|
+
: undefined;
|
|
44
|
+
const primaryVars = selected && !selected.media ? selected.themeVars : environment.themeVars;
|
|
45
|
+
const blocks = [renderVarBlock(ctx, environment.themeScope, primaryVars)];
|
|
46
|
+
if (selected?.media) {
|
|
47
|
+
blocks.push(wrapMedia(selected.media, renderVarBlock(ctx, environment.themeScope, selected.diffs)));
|
|
48
|
+
}
|
|
49
|
+
for (const alternate of options.alternates ?? []) {
|
|
50
|
+
blocks.push(renderAlternate(ctx, alternate));
|
|
51
|
+
}
|
|
52
|
+
return blocks.join('');
|
|
53
|
+
};
|
|
54
|
+
const renderAlternate = (ctx, alternate) => {
|
|
55
|
+
const resolved = themeVariation(ctx.environment, alternate.variation);
|
|
56
|
+
const selector = alternate.selector
|
|
57
|
+
? composeThemeSelector(ctx.environment.themeScope, alternate.selector)
|
|
58
|
+
: resolved.media
|
|
59
|
+
? ctx.environment.themeScope
|
|
60
|
+
: undefined;
|
|
61
|
+
if (!selector) {
|
|
62
|
+
throw new Error(`Alternate variation "${alternate.variation}" needs a selector (media-conditioned variations may omit one).`);
|
|
63
|
+
}
|
|
64
|
+
const block = renderVarBlock(ctx, selector, resolved.diffs);
|
|
65
|
+
return resolved.media ? wrapMedia(resolved.media, block) : block;
|
|
66
|
+
};
|
|
67
|
+
const themeVariation = (environment, name) => requireThemeVariation(environment.variations, name);
|
|
68
|
+
const renderVarBlock = (ctx, selector, vars) => {
|
|
69
|
+
const declarations = [...ctx.collector.collectedThemeDeps]
|
|
70
|
+
.sort()
|
|
71
|
+
.flatMap((path) => {
|
|
72
|
+
const definition = vars[path];
|
|
73
|
+
if (!definition) {
|
|
74
|
+
return [];
|
|
75
|
+
}
|
|
76
|
+
return [
|
|
77
|
+
`${ctx.resolver.cssVar(path)}:${formatThemeValue(definition, ctx.options.themeValueOverrides?.[path], ctx.options.scheme)}`,
|
|
78
|
+
];
|
|
79
|
+
});
|
|
80
|
+
return declarations.length > 0
|
|
81
|
+
? `${selector}{${declarations.join(';')}}`
|
|
82
|
+
: '';
|
|
83
|
+
};
|
|
84
|
+
const wrapMedia = (query, block) => block.length > 0 ? `@media ${query}{${block}}` : '';
|
|
85
|
+
/** Composes `themeScope` with a per-render alternate selector. */
|
|
86
|
+
export const composeThemeSelector = (themeScope, selector) => {
|
|
87
|
+
const scope = themeScope.trim();
|
|
88
|
+
const extra = selector.trim();
|
|
89
|
+
if (extra.length === 0) {
|
|
90
|
+
throw new Error('Alternate selector must be non-empty.');
|
|
91
|
+
}
|
|
92
|
+
if (scope === ':host') {
|
|
93
|
+
return extra.startsWith(':host') ? extra : `:host(${extra})`;
|
|
94
|
+
}
|
|
95
|
+
if (/^[.#[:]/.test(extra)) {
|
|
96
|
+
return `${scope}${extra}`;
|
|
97
|
+
}
|
|
98
|
+
return `${scope} ${extra}`;
|
|
99
|
+
};
|
|
100
|
+
const formatThemeValue = (definition, override, scheme) => override ?? (scheme ? definition[scheme] : serializedThemeValue(definition));
|
|
101
|
+
const renderHandle = (handle, ctx) => {
|
|
102
|
+
const body = renderDeclarations(handle.declarations, { handle }, ctx);
|
|
103
|
+
if (isBlankCss(body)) {
|
|
104
|
+
return '';
|
|
105
|
+
}
|
|
106
|
+
const className = ctx.resolver.className(handle.key, handle.readableName);
|
|
107
|
+
return `.${className}{${body}}`;
|
|
108
|
+
};
|
|
109
|
+
const renderRule = (rule, ctx) => {
|
|
110
|
+
// Rules don't have a host handle for per-handle reachability — default
|
|
111
|
+
// markers in a rule's declaration emit every listed key. In practice
|
|
112
|
+
// authors place default markers on handle declarations; this branch keeps
|
|
113
|
+
// the runtime well-defined if a rule ever does carry one.
|
|
114
|
+
const body = renderDeclarations(rule.declarations, {}, ctx);
|
|
115
|
+
if (isBlankCss(body)) {
|
|
116
|
+
return '';
|
|
117
|
+
}
|
|
118
|
+
const selector = rule.selector(createSelectorResolver(rule, ctx));
|
|
119
|
+
return `${selector}{${body}}`;
|
|
120
|
+
};
|
|
121
|
+
const renderDeclarations = (declarations, host, ctx) => {
|
|
122
|
+
const out = [];
|
|
123
|
+
for (const segment of declarations.css) {
|
|
124
|
+
out.push(renderSegment(segment, host, ctx));
|
|
125
|
+
}
|
|
126
|
+
return out.join('');
|
|
127
|
+
};
|
|
128
|
+
const renderSegment = (segment, host, ctx) => {
|
|
129
|
+
if (typeof segment === 'string') {
|
|
130
|
+
return resolveStringSegment(segment, ctx);
|
|
131
|
+
}
|
|
132
|
+
if (isLocalVarDefaultMarker(segment)) {
|
|
133
|
+
return renderDefaultMarker(segment, host, ctx);
|
|
134
|
+
}
|
|
135
|
+
if (isLocalVarOverrideMarker(segment)) {
|
|
136
|
+
return renderOverrideMarker(segment, ctx);
|
|
137
|
+
}
|
|
138
|
+
return '';
|
|
139
|
+
};
|
|
140
|
+
const renderDefaultMarker = (marker, host, ctx) => {
|
|
141
|
+
const reachable = host.handle
|
|
142
|
+
? ctx.collector.reachableDefaults(host.handle, marker.groupPath)
|
|
143
|
+
: null;
|
|
144
|
+
const declarations = [];
|
|
145
|
+
for (const { key, path, value } of marker.defaults) {
|
|
146
|
+
if (reachable && !reachable.has(key)) {
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const stringified = stringifyMarkerValue(value);
|
|
150
|
+
const resolvedValue = resolveStringSegment(stringified, ctx);
|
|
151
|
+
const propIdentifier = ctx.resolver.cssVar(path);
|
|
152
|
+
declarations.push(`${propIdentifier}:${resolvedValue}`);
|
|
153
|
+
}
|
|
154
|
+
return declarations.length > 0 ? `${declarations.join(';')};` : '';
|
|
155
|
+
};
|
|
156
|
+
const renderOverrideMarker = (marker, ctx) => {
|
|
157
|
+
const declarations = [];
|
|
158
|
+
for (const { path, value } of marker.overrides) {
|
|
159
|
+
const stringified = stringifyMarkerValue(value);
|
|
160
|
+
const resolvedValue = resolveStringSegment(stringified, ctx);
|
|
161
|
+
const propIdentifier = ctx.resolver.cssVar(path);
|
|
162
|
+
declarations.push(`${propIdentifier}:${resolvedValue}`);
|
|
163
|
+
}
|
|
164
|
+
return declarations.length > 0 ? `${declarations.join(';')};` : '';
|
|
165
|
+
};
|
|
166
|
+
const stringifyMarkerValue = (value) => {
|
|
167
|
+
if (typeof value === 'string') {
|
|
168
|
+
return value;
|
|
169
|
+
}
|
|
170
|
+
if (typeof value === 'number') {
|
|
171
|
+
return String(value);
|
|
172
|
+
}
|
|
173
|
+
if (value !== null &&
|
|
174
|
+
typeof value === 'object' &&
|
|
175
|
+
typeof value.toString === 'function' &&
|
|
176
|
+
value.toString !== Object.prototype.toString) {
|
|
177
|
+
return value.toString();
|
|
178
|
+
}
|
|
179
|
+
throw new Error(`t.vars(...) value must be a string, number, theme token, contextual var, scale token, or local var ref; received ${describeValue(value)}.`);
|
|
180
|
+
};
|
|
181
|
+
const describeValue = (value) => {
|
|
182
|
+
if (value === null) {
|
|
183
|
+
return 'null';
|
|
184
|
+
}
|
|
185
|
+
if (value === undefined) {
|
|
186
|
+
return 'undefined';
|
|
187
|
+
}
|
|
188
|
+
if (typeof value === 'object') {
|
|
189
|
+
return '[object Object]';
|
|
190
|
+
}
|
|
191
|
+
return `${typeof value}`;
|
|
192
|
+
};
|
|
193
|
+
const createSelectorResolver = (rule, ctx) => {
|
|
194
|
+
const { resolver } = ctx;
|
|
195
|
+
const selectorResolver = ((handle) => resolver.className(handle.key, handle.readableName));
|
|
196
|
+
const module = ctx.collector.registry.module(rule.moduleName);
|
|
197
|
+
for (const handle of module?.handleList ?? []) {
|
|
198
|
+
defineSelectorAlias(selectorResolver, handle.localName, handle, resolver);
|
|
199
|
+
const leafName = handle.localName.split('/').at(-1);
|
|
200
|
+
if (leafName && leafName !== handle.localName) {
|
|
201
|
+
defineSelectorAlias(selectorResolver, leafName, handle, resolver);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
return selectorResolver;
|
|
205
|
+
};
|
|
206
|
+
const defineSelectorAlias = (selectorResolver, name, handle, resolver) => {
|
|
207
|
+
if (!/^[A-Za-z_$][\w$]*$/.test(name) || name in selectorResolver) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
Object.defineProperty(selectorResolver, name, {
|
|
211
|
+
configurable: true,
|
|
212
|
+
enumerable: true,
|
|
213
|
+
get: () => `.${resolver.className(handle.key, handle.readableName)}`,
|
|
214
|
+
});
|
|
215
|
+
};
|
|
216
|
+
const resolveStringSegment = (cssText, ctx) => {
|
|
217
|
+
return scanCss(cssText)
|
|
218
|
+
.map((span) => isOpaque(span) ? span.text : resolveCodeSpan(span.text, ctx))
|
|
219
|
+
.join('');
|
|
220
|
+
};
|
|
221
|
+
const resolveCodeSpan = (cssText, ctx) => {
|
|
222
|
+
let result = cssText;
|
|
223
|
+
const paths = new Set([
|
|
224
|
+
...Object.keys(ctx.environment.themeVars),
|
|
225
|
+
...(ctx.environment.sharedVars ?? []),
|
|
226
|
+
...ctx.collector.collectedVarDeps,
|
|
227
|
+
]);
|
|
228
|
+
for (const path of paths) {
|
|
229
|
+
result = substituteReadableVar(result, path, ctx);
|
|
230
|
+
}
|
|
231
|
+
return result;
|
|
232
|
+
};
|
|
233
|
+
const substituteReadableVar = (cssText, path, ctx) => {
|
|
234
|
+
const readableName = cssVarName(ctx.environment.prefix, path);
|
|
235
|
+
const readableRef = `var(${readableName})`;
|
|
236
|
+
let result = cssText;
|
|
237
|
+
if (result.includes(readableRef)) {
|
|
238
|
+
result = replaceAll(result, readableRef, ctx.resolver.cssVarRef(path));
|
|
239
|
+
}
|
|
240
|
+
if (containsCssIdentifier(result, readableName)) {
|
|
241
|
+
result = replaceCssIdentifier(result, readableName, ctx.resolver.cssVar(path));
|
|
242
|
+
}
|
|
243
|
+
return result;
|
|
244
|
+
};
|
|
245
|
+
const replaceAll = (value, search, replacement) => value.split(search).join(replacement);
|
|
246
|
+
const replaceCssIdentifier = (value, search, replacement) =>
|
|
247
|
+
// Authored and generated CSS only contains valid custom property identifiers.
|
|
248
|
+
// Since every searched token starts with "--", the trailing boundary is enough.
|
|
249
|
+
value.replace(new RegExp(`${escapeRegExp(search)}(?![_a-zA-Z0-9-])`, 'g'), replacement);
|
|
250
|
+
const containsCssIdentifier = (value, search) => new RegExp(`${escapeRegExp(search)}(?![_a-zA-Z0-9-])`).test(value);
|
|
251
|
+
const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
252
|
+
//# 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,59 @@
|
|
|
1
|
+
import { type FlattenedTemplate } from '../nesting.js';
|
|
2
|
+
import type { Declarations, PendingStyleHandle, RuleOptions, StyleHandle, StyleMedia, StyleRule, StyleSelectorResolver, StylesObject } from './types.js';
|
|
3
|
+
/** Shared empty `dependsOn` until module construction fills the real set. */
|
|
4
|
+
export declare const EMPTY_DEPS: ReadonlySet<string>;
|
|
5
|
+
/** Declaration-block template. Interpolations stringify; local-var markers stay until render. */
|
|
6
|
+
export declare const decls: (strings: TemplateStringsArray, ...values: readonly unknown[]) => Declarations;
|
|
7
|
+
/** Handle template. Nested `&` / `@media` flatten into sibling rules. */
|
|
8
|
+
export declare const css: (strings: TemplateStringsArray, ...values: readonly unknown[]) => PendingStyleHandle;
|
|
9
|
+
/** Builds a pending handle (plus nested sibling descriptors) from a flattened template. */
|
|
10
|
+
export declare const pendingHandleFromFlattened: (flat: FlattenedTemplate) => PendingStyleHandle;
|
|
11
|
+
/**
|
|
12
|
+
* Selector plus declarations. `dependsOn` is filled when the module is constructed.
|
|
13
|
+
*
|
|
14
|
+
* @param selector Factory receiving a {@link StyleSelectorResolver}; uses `&` and handle aliases.
|
|
15
|
+
* @param declarations CSS properties for this rule.
|
|
16
|
+
* @param options `auto` controls whether the rule self-collects when its handle dependencies are met.
|
|
17
|
+
*/
|
|
18
|
+
export declare const rule: (selector: (h: StyleSelectorResolver) => string, declarations: Declarations, options?: RuleOptions) => StyleRule;
|
|
19
|
+
/**
|
|
20
|
+
* `@media` block wrapping rules.
|
|
21
|
+
*
|
|
22
|
+
* @param query Media query string (e.g. `(min-width: 600px)`).
|
|
23
|
+
* @param rules Inner rules scoped to this block.
|
|
24
|
+
*/
|
|
25
|
+
export declare const media: (query: string, rules: readonly StyleRule[]) => StyleMedia;
|
|
26
|
+
/**
|
|
27
|
+
* `@container` block. `kind` stays `'media'` so emission rank matches {@link media}.
|
|
28
|
+
*
|
|
29
|
+
* @param query Container query string (e.g. `(min-width: 400px)`).
|
|
30
|
+
* @param rules Inner rules scoped to this block.
|
|
31
|
+
*/
|
|
32
|
+
export declare const container: (query: string, rules: readonly StyleRule[]) => StyleMedia;
|
|
33
|
+
export declare const isVariantMarked: (value: unknown) => boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Builds a record keyed by `domain`. No CSS-collection side effect.
|
|
36
|
+
*
|
|
37
|
+
* @param domain All valid keys (e.g. `['primary', 'secondary']`).
|
|
38
|
+
* @param factory Called once per key.
|
|
39
|
+
*/
|
|
40
|
+
export declare const mapDomain: <TKey extends string, TValue>(domain: readonly TKey[], factory: (value: TKey) => TValue) => Record<TKey, TValue>;
|
|
41
|
+
/**
|
|
42
|
+
* Builds a record of styles keyed by `domain`. Each value is marked `variant` so {@link index.StylesCollector#use | StylesCollector.use} skips it.
|
|
43
|
+
*
|
|
44
|
+
* @param domain All valid variant keys (e.g. `['primary', 'secondary']`).
|
|
45
|
+
* @param factory Called once per key; returns the handle or nested style object for that variant.
|
|
46
|
+
*/
|
|
47
|
+
export declare const variants: <TKey extends string, TValue>(domain: readonly TKey[], factory: (value: TKey) => TValue) => Record<TKey, TValue>;
|
|
48
|
+
/**
|
|
49
|
+
* Resolves handles through the collector's class-name resolver.
|
|
50
|
+
*
|
|
51
|
+
* @param context Object exposing `resolveClassName` (e.g. a React render context).
|
|
52
|
+
* @param handles One or more handles to resolve and join.
|
|
53
|
+
*/
|
|
54
|
+
export declare const combineClassNames: (context: {
|
|
55
|
+
resolveClassName: (...handles: StyleHandle[]) => string;
|
|
56
|
+
}, ...handles: readonly StyleHandle[]) => string;
|
|
57
|
+
/** Authored `rule()`/`media()` entries from a global-mode flattened template. */
|
|
58
|
+
export declare const globalStylesFromFlattened: (flat: FlattenedTemplate) => StylesObject;
|
|
59
|
+
//# sourceMappingURL=authoring.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authoring.d.ts","sourceRoot":"","sources":["../../src/styles/authoring.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,KAAK,iBAAiB,EAIvB,MAAM,YAAY,CAAC;AAGpB,OAAO,KAAK,EACV,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,WAAW,EACX,UAAU,EACV,SAAS,EACT,qBAAqB,EACrB,YAAY,EACb,MAAM,SAAS,CAAC;AAEjB,6EAA6E;AAC7E,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,MAAM,CAAa,CAAC;AAEzD,iGAAiG;AACjG,eAAO,MAAM,KAAK,GAChB,SAAS,oBAAoB,EAC7B,GAAG,QAAQ,SAAS,OAAO,EAAE,KAC5B,YAAkD,CAAC;AAEtD,yEAAyE;AACzE,eAAO,MAAM,GAAG,GACd,SAAS,oBAAoB,EAC7B,GAAG,QAAQ,SAAS,OAAO,EAAE,KAC5B,kBAUF,CAAC;AAEF,2FAA2F;AAC3F,eAAO,MAAM,0BAA0B,GACrC,MAAM,iBAAiB,KACtB,kBAiCF,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,GACf,UAAU,CAAC,CAAC,EAAE,qBAAqB,KAAK,MAAM,EAC9C,cAAc,YAAY,EAC1B,UAAS,WAAgB,KACxB,SAYD,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,KAAK,GAChB,OAAO,MAAM,EACb,OAAO,SAAS,SAAS,EAAE,KAC1B,UAQD,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,SAAS,GACpB,OAAO,MAAM,EACb,OAAO,SAAS,SAAS,EAAE,KAC1B,UAQD,CAAC;AAIH,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,KAAG,OACyB,CAAC;AAS3E;;;;;GAKG;AACH,eAAO,MAAM,SAAS,GAAI,IAAI,SAAS,MAAM,EAAE,MAAM,EACnD,QAAQ,SAAS,IAAI,EAAE,EACvB,SAAS,CAAC,KAAK,EAAE,IAAI,KAAK,MAAM,KAC/B,MAAM,CAAC,IAAI,EAAE,MAAM,CAInB,CAAC;AAEJ;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,GAAI,IAAI,SAAS,MAAM,EAAE,MAAM,EAClD,QAAQ,SAAS,IAAI,EAAE,EACvB,SAAS,CAAC,KAAK,EAAE,IAAI,KAAK,MAAM,KAC/B,MAAM,CAAC,IAAI,EAAE,MAAM,CAMrB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAC5B,SAAS;IAAE,gBAAgB,EAAE,CAAC,GAAG,OAAO,EAAE,WAAW,EAAE,KAAK,MAAM,CAAA;CAAE,EACpE,GAAG,SAAS,SAAS,WAAW,EAAE,KACjC,MAA8C,CAAC;AAalD,iFAAiF;AACjF,eAAO,MAAM,yBAAyB,GACpC,MAAM,iBAAiB,KACtB,YAsBF,CAAC"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
|
|
3
|
+
* or more contributor license agreements. Licensed under the Elastic License
|
|
4
|
+
* 2.0; you may not use this file except in compliance with the Elastic License
|
|
5
|
+
* 2.0.
|
|
6
|
+
*/
|
|
7
|
+
import { flattenTemplate, hasNestedSyntax, } from '../nesting.js';
|
|
8
|
+
import { buildDeclarations } from './declarations.js';
|
|
9
|
+
/** Shared empty `dependsOn` until module construction fills the real set. */
|
|
10
|
+
export const EMPTY_DEPS = new Set();
|
|
11
|
+
/** Declaration-block template. Interpolations stringify; local-var markers stay until render. */
|
|
12
|
+
export const decls = (strings, ...values) => buildDeclarations(strings, values);
|
|
13
|
+
/** Handle template. Nested `&` / `@media` flatten into sibling rules. */
|
|
14
|
+
export const css = (strings, ...values) => {
|
|
15
|
+
if (!hasNestedSyntax(strings)) {
|
|
16
|
+
return {
|
|
17
|
+
kind: 'pending-handle',
|
|
18
|
+
declarations: buildDeclarations(strings, values),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
return pendingHandleFromFlattened(flattenTemplate(strings, values, { mode: 'self' }));
|
|
22
|
+
};
|
|
23
|
+
/** Builds a pending handle (plus nested sibling descriptors) from a flattened template. */
|
|
24
|
+
export const pendingHandleFromFlattened = (flat) => {
|
|
25
|
+
const selfSlice = flat.self ?? { strings: [''], values: [] };
|
|
26
|
+
return {
|
|
27
|
+
kind: 'pending-handle',
|
|
28
|
+
declarations: buildDeclarations(selfSlice.strings, selfSlice.values),
|
|
29
|
+
nested: flat.nested.map((entry) => {
|
|
30
|
+
if (entry.kind === 'rule') {
|
|
31
|
+
return {
|
|
32
|
+
kind: 'nested-rule',
|
|
33
|
+
alternatives: entry.alternatives,
|
|
34
|
+
declarations: buildDeclarations(entry.slice.strings, entry.slice.values),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
kind: 'nested-media',
|
|
39
|
+
query: entry.query,
|
|
40
|
+
...(entry.self
|
|
41
|
+
? { self: buildDeclarations(entry.self.strings, entry.self.values) }
|
|
42
|
+
: {}),
|
|
43
|
+
rules: entry.rules.map((rule) => ({
|
|
44
|
+
kind: 'nested-rule',
|
|
45
|
+
alternatives: rule.alternatives,
|
|
46
|
+
declarations: buildDeclarations(rule.slice.strings, rule.slice.values),
|
|
47
|
+
})),
|
|
48
|
+
};
|
|
49
|
+
}),
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Selector plus declarations. `dependsOn` is filled when the module is constructed.
|
|
54
|
+
*
|
|
55
|
+
* @param selector Factory receiving a {@link StyleSelectorResolver}; uses `&` and handle aliases.
|
|
56
|
+
* @param declarations CSS properties for this rule.
|
|
57
|
+
* @param options `auto` controls whether the rule self-collects when its handle dependencies are met.
|
|
58
|
+
*/
|
|
59
|
+
export const rule = (selector, declarations, options = {}) => ({
|
|
60
|
+
kind: 'rule',
|
|
61
|
+
moduleName: '',
|
|
62
|
+
key: '',
|
|
63
|
+
selector,
|
|
64
|
+
declarations,
|
|
65
|
+
// `dependsOn` is computed in `assignEntries` once the module's handles are
|
|
66
|
+
// known. Authors construct rules outside that scope, so the placeholder is
|
|
67
|
+
// an empty set until `assignEntries` rewrites the entry.
|
|
68
|
+
dependsOn: EMPTY_DEPS,
|
|
69
|
+
auto: options.auto ?? true,
|
|
70
|
+
variant: false,
|
|
71
|
+
});
|
|
72
|
+
/**
|
|
73
|
+
* `@media` block wrapping rules.
|
|
74
|
+
*
|
|
75
|
+
* @param query Media query string (e.g. `(min-width: 600px)`).
|
|
76
|
+
* @param rules Inner rules scoped to this block.
|
|
77
|
+
*/
|
|
78
|
+
export const media = (query, rules) => ({
|
|
79
|
+
kind: 'media',
|
|
80
|
+
atRule: 'media',
|
|
81
|
+
key: '',
|
|
82
|
+
moduleName: '',
|
|
83
|
+
query,
|
|
84
|
+
rules,
|
|
85
|
+
variant: false,
|
|
86
|
+
});
|
|
87
|
+
/**
|
|
88
|
+
* `@container` block. `kind` stays `'media'` so emission rank matches {@link media}.
|
|
89
|
+
*
|
|
90
|
+
* @param query Container query string (e.g. `(min-width: 400px)`).
|
|
91
|
+
* @param rules Inner rules scoped to this block.
|
|
92
|
+
*/
|
|
93
|
+
export const container = (query, rules) => ({
|
|
94
|
+
kind: 'media',
|
|
95
|
+
atRule: 'container',
|
|
96
|
+
key: '',
|
|
97
|
+
moduleName: '',
|
|
98
|
+
query,
|
|
99
|
+
rules,
|
|
100
|
+
variant: false,
|
|
101
|
+
});
|
|
102
|
+
const variantMarkers = new WeakSet();
|
|
103
|
+
export const isVariantMarked = (value) => Boolean(value && typeof value === 'object' && variantMarkers.has(value));
|
|
104
|
+
const markVariant = (value) => {
|
|
105
|
+
if (!value || typeof value !== 'object') {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
variantMarkers.add(value);
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* Builds a record keyed by `domain`. No CSS-collection side effect.
|
|
112
|
+
*
|
|
113
|
+
* @param domain All valid keys (e.g. `['primary', 'secondary']`).
|
|
114
|
+
* @param factory Called once per key.
|
|
115
|
+
*/
|
|
116
|
+
export const mapDomain = (domain, factory) => Object.fromEntries(domain.map((key) => [key, factory(key)]));
|
|
117
|
+
/**
|
|
118
|
+
* Builds a record of styles keyed by `domain`. Each value is marked `variant` so {@link index.StylesCollector#use | StylesCollector.use} skips it.
|
|
119
|
+
*
|
|
120
|
+
* @param domain All valid variant keys (e.g. `['primary', 'secondary']`).
|
|
121
|
+
* @param factory Called once per key; returns the handle or nested style object for that variant.
|
|
122
|
+
*/
|
|
123
|
+
export const variants = (domain, factory) => {
|
|
124
|
+
const record = mapDomain(domain, factory);
|
|
125
|
+
for (const value of Object.values(record)) {
|
|
126
|
+
markVariant(value);
|
|
127
|
+
}
|
|
128
|
+
return record;
|
|
129
|
+
};
|
|
130
|
+
/**
|
|
131
|
+
* Resolves handles through the collector's class-name resolver.
|
|
132
|
+
*
|
|
133
|
+
* @param context Object exposing `resolveClassName` (e.g. a React render context).
|
|
134
|
+
* @param handles One or more handles to resolve and join.
|
|
135
|
+
*/
|
|
136
|
+
export const combineClassNames = (context, ...handles) => context.resolveClassName(...handles);
|
|
137
|
+
const composeAbsoluteSelector = (alternatives) => (h) => alternatives
|
|
138
|
+
.map((parts) => parts
|
|
139
|
+
.map((part) => (typeof part === 'string' ? part : `.${h(part)}`))
|
|
140
|
+
.join(''))
|
|
141
|
+
.join(',');
|
|
142
|
+
/** Authored `rule()`/`media()` entries from a global-mode flattened template. */
|
|
143
|
+
export const globalStylesFromFlattened = (flat) => {
|
|
144
|
+
const styles = {};
|
|
145
|
+
flat.nested.forEach((entry, index) => {
|
|
146
|
+
const localKey = `g${String(index).padStart(3, '0')}`;
|
|
147
|
+
if (entry.kind === 'rule') {
|
|
148
|
+
styles[localKey] = rule(composeAbsoluteSelector(entry.alternatives), buildDeclarations(entry.slice.strings, entry.slice.values));
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
styles[localKey] = media(entry.query, entry.rules.map((nested) => rule(composeAbsoluteSelector(nested.alternatives), buildDeclarations(nested.slice.strings, nested.slice.values))));
|
|
152
|
+
});
|
|
153
|
+
return styles;
|
|
154
|
+
};
|
|
155
|
+
//# 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,10 @@
|
|
|
1
|
+
import type { Declarations, DefaultKeyDeps, MutableStyleDeps } from './types.js';
|
|
2
|
+
/** Builds a declaration block: interpolations stringify; local-var markers stay until render. */
|
|
3
|
+
export declare const buildDeclarations: (strings: readonly string[], values: readonly unknown[]) => Declarations;
|
|
4
|
+
/** Theme/var deps recorded while stringifying one declaration value. */
|
|
5
|
+
export declare const computeValueDeps: (value: unknown) => DefaultKeyDeps["valueDeps"];
|
|
6
|
+
/** Stringifies one interpolable CSS value and records theme/var deps onto `deps`. */
|
|
7
|
+
export declare const stringifyCssValue: (value: unknown, deps: MutableStyleDeps) => string;
|
|
8
|
+
/** True when every segment is comments, whitespace, or bare `;`. A local-var marker counts as content. */
|
|
9
|
+
export declare const isEmptyDeclarations: ({ css }: Declarations) => boolean;
|
|
10
|
+
//# sourceMappingURL=declarations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"declarations.d.ts","sourceRoot":"","sources":["../../src/styles/declarations.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EACV,YAAY,EAEZ,cAAc,EAEd,gBAAgB,EACjB,MAAM,SAAS,CAAC;AAEjB,iGAAiG;AACjG,eAAO,MAAM,iBAAiB,GAC5B,SAAS,SAAS,MAAM,EAAE,EAC1B,QAAQ,SAAS,OAAO,EAAE,KACzB,YA0CF,CAAC;AA+BF,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,GAC3B,OAAO,OAAO,KACb,cAAc,CAAC,WAAW,CAS5B,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,iBAAiB,GAC5B,OAAO,OAAO,EACd,MAAM,gBAAgB,KACrB,MA+BF,CAAC;AAEF,0GAA0G;AAC1G,eAAO,MAAM,mBAAmB,GAAI,SAAS,YAAY,KAAG,OACgB,CAAC"}
|