@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collector.js","sourceRoot":"","sources":["../src/collector.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 { isLocalVarOverrideMarker } from './local_vars';\nimport {\n createStyleNameResolver,\n type StyleNameMode,\n type StyleNameResolver,\n type StyleTarget,\n} from './names';\nimport type {\n ContextualVarPath,\n CssVarPath,\n Declarations,\n DefaultGroupDeps,\n StyleEntry,\n StyleHandle,\n StyleMedia,\n StyleRegistry,\n StyleRule,\n StylesModule,\n} from './styles';\nimport { isEmptyDeclarations } from './styles/declarations';\n\nconst warnedHandles = new WeakSet<StyleHandle>();\n\nconst dependentEntriesCache = new WeakMap<\n StylesModule,\n Map<string, StyleEntry[]>\n>();\n\nconst dependentEntries = (\n module: StylesModule,\n handleKey: string\n): readonly StyleEntry[] => {\n let cached = dependentEntriesCache.get(module);\n if (!cached) {\n cached = new Map<string, StyleEntry[]>();\n for (const entry of module.entries) {\n if (entry.kind === 'rule') {\n if (!entry.auto) {\n continue;\n }\n for (const dep of entry.dependsOn) {\n appendDependent(cached, dep, entry);\n }\n continue;\n }\n if (entry.kind === 'media') {\n const deps = new Set<string>();\n for (const nested of entry.rules) {\n if (!nested.auto) {\n continue;\n }\n nested.dependsOn.forEach((key) => deps.add(key));\n }\n for (const dep of deps) {\n appendDependent(cached, dep, entry);\n }\n }\n }\n dependentEntriesCache.set(module, cached);\n }\n return cached.get(handleKey) ?? [];\n};\n\nconst appendDependent = (\n cache: Map<string, StyleEntry[]>,\n key: string,\n entry: StyleEntry\n): void => {\n const list = cache.get(key);\n if (list) {\n list.push(entry);\n return;\n }\n cache.set(key, [entry]);\n};\n\n/** Target, naming mode, registry, and prefix for one {@link StylesCollector}. */\nexport interface StylesCollectorOptions {\n /** Target context (e.g. `artifact` or `stylesheet`). */\n target: StyleTarget;\n /** Desired name mode (`compact` or `readable`). */\n names: StyleNameMode;\n /** Registry modules were authored against; used for auto-collection and compact-name snapshots. */\n registry: StyleRegistry;\n /** Brand prefix forwarded to the name resolver. */\n prefix: string;\n /** When `true`, emit no-op-handle warnings through `warn`. Inherited from `createDistillery({ dev })`. */\n dev?: boolean;\n /** Warning sink for no-op handles. Used only when `dev` is `true`. Defaults to `console.warn`. */\n warn?: (message: string) => void;\n}\n\n/** Reachable entries for one render or one stylesheet. */\nexport class StylesCollector {\n /** The target collection mode. */\n readonly target: StyleTarget;\n /** The naming mode (compact vs readable). */\n readonly names: StyleNameMode;\n /** Associated registry. */\n readonly registry: StyleRegistry;\n /** Emitted class name prefix. */\n readonly prefix: string;\n private readonly dev: boolean;\n private readonly warn: (message: string) => void;\n private readonly entries = new Map<string, StyleEntry>();\n private readonly handles = new Map<string, StyleHandle>();\n private readonly themeDeps = new Set<string>();\n private readonly varDeps = new Set<ContextualVarPath>();\n\n constructor({\n target,\n names,\n registry,\n prefix,\n dev = false,\n warn = (message) => console.warn(message),\n }: StylesCollectorOptions) {\n this.target = target;\n this.names = names;\n this.registry = registry;\n this.prefix = prefix;\n this.dev = dev;\n this.warn = warn;\n }\n\n /**\n * Collects a module's non-variant entries, or one explicit entry.\n *\n * Variant entries stay off this path; collect them via `useHandles`.\n *\n * @param value Module (all non-variant entries), a single entry, or an array of entries.\n */\n use(value: StylesModule | StyleEntry | readonly StyleEntry[]): void {\n if (isReadonlyArray(value)) {\n value.forEach((entry) => this.use(entry));\n return;\n }\n\n if (isStylesModule(value)) {\n // Aggregate deps from non-variant entries only. The module-level\n // `themeDeps`/`varDeps` snapshot would also include variant entries'\n // deps, which would push their var paths into the resolver's compact\n // registry and steal short names from actually-rendered handles.\n for (const entry of value.entries) {\n if (entry.variant) {\n continue;\n }\n if (entry.kind === 'handle' && !this.retainHandle(entry)) {\n continue;\n }\n this.entries.set(entryKey(entry), entry);\n if (entry.kind === 'handle' || entry.kind === 'rule') {\n this.addDeclarationDeps(entry.declarations);\n } else {\n for (const inner of entry.rules) {\n this.addDeclarationDeps(inner.declarations);\n }\n }\n }\n for (const handle of value.handleList) {\n if (handle.variant) {\n continue;\n }\n if (!this.retainHandle(handle)) {\n continue;\n }\n this.handles.set(handle.key, handle);\n }\n return;\n }\n\n this.addEntry(value);\n }\n\n /**\n * Collects every entry on `module`, including variants. Used by the stylesheet target.\n *\n * @param module Module whose entries should all be collected.\n */\n useAllEntries(module: StylesModule): void {\n for (const entry of module.entries) {\n if (entry.kind === 'handle' && !this.retainHandle(entry)) {\n continue;\n }\n this.entries.set(entryKey(entry), entry);\n }\n for (const handle of module.handleList) {\n if (!this.retainHandle(handle)) {\n continue;\n }\n this.handles.set(handle.key, handle);\n }\n module.themeDeps.forEach((path) => this.themeDeps.add(path));\n module.varDeps.forEach((path) => this.varDeps.add(path));\n }\n\n /**\n * Collects handles and auto-includes rules whose selector deps are all present.\n *\n * Media blocks include only inner rules whose deps are met.\n *\n * @param handles Handles resolved during this render pass (e.g. from `resolveClassName`).\n * @returns Handles that were retained. Empty untargeted handles are omitted in compact mode.\n */\n useHandles(handles: readonly StyleHandle[]): readonly StyleHandle[] {\n const retained: StyleHandle[] = [];\n for (const handle of handles) {\n if (!this.retainHandle(handle)) {\n continue;\n }\n retained.push(handle);\n if (this.handles.has(handle.key)) {\n continue;\n }\n this.entries.set(entryKey(handle), handle);\n this.handles.set(handle.key, handle);\n this.addDeclarationDeps(handle.declarations);\n }\n for (const handle of retained) {\n const module = this.registry.module(handle.moduleName);\n if (!module) {\n continue;\n }\n for (const dependent of dependentEntries(module, handle.key)) {\n this.tryActivateDependent(dependent);\n }\n }\n return retained;\n }\n\n /** Collects `auto` rules on `module` whose every selector dependency is already collected. */\n useRulesWhenDepsMet(module: StylesModule): void {\n for (const entry of module.entries) {\n if (entry.kind !== 'rule') {\n continue;\n }\n if (this.entries.has(entryKey(entry))) {\n continue;\n }\n if (this.allDepsMet(entry.dependsOn)) {\n this.addEntry(entry);\n }\n }\n }\n\n private tryActivateDependent(entry: StyleEntry): void {\n if (entry.kind === 'rule') {\n if (!entry.auto) {\n return;\n }\n if (this.entries.has(entryKey(entry))) {\n return;\n }\n if (!this.allDepsMet(entry.dependsOn)) {\n return;\n }\n this.addEntry(entry);\n return;\n }\n if (entry.kind === 'media') {\n const liveRules = entry.rules.filter(\n (rule) => rule.auto && this.allDepsMet(rule.dependsOn)\n );\n if (liveRules.length === 0) {\n return;\n }\n const filtered: StyleMedia =\n liveRules.length === entry.rules.length\n ? entry\n : { ...entry, rules: liveRules };\n this.entries.set(entryKey(filtered), filtered);\n for (const rule of liveRules) {\n this.addDeclarationDeps(rule.declarations);\n }\n }\n }\n\n private allDepsMet(dependsOn: ReadonlySet<string>): boolean {\n for (const dep of dependsOn) {\n if (!this.handles.has(dep)) {\n return false;\n }\n }\n return true;\n }\n\n /** Marks a theme token path as reachable so it appears in the emitted theme block, even if no collected declaration reads it. */\n useThemeVar(path: string): void {\n this.themeDeps.add(path);\n }\n\n /** Creates a {@link StyleNameResolver} scoped to this collector's current dep set. */\n createResolver(): StyleNameResolver {\n const finalized = this.finalizeDeps();\n const snapshot = this.registry.freeze({\n classKeys:\n this.names === 'compact'\n ? [...this.handles.keys()]\n : this.registry.classKeys,\n cssVarKeys: cssVarKeysFrom(finalized),\n });\n return createStyleNameResolver({\n names: this.names,\n prefix: this.prefix,\n classKeys: snapshot.classKeys,\n cssVarKeys: snapshot.cssVarKeys,\n });\n }\n\n /** Collected style entries sorted for emission (base rules before all `@media`/`@container` blocks). */\n get collectedEntries(): readonly StyleEntry[] {\n return [...this.entries.values()].sort(compareEntriesForEmission);\n }\n\n /** Theme token paths that survive reachability; emitted in the theme scope block. */\n get collectedThemeDeps(): ReadonlySet<string> {\n return this.finalizeDeps().theme;\n }\n\n /** Contextual var paths that survive reachability; used by the runtime for compact-name substitution. */\n get collectedVarDeps(): ReadonlySet<ContextualVarPath> {\n return this.finalizeDeps().vars;\n }\n\n // Reachability-aware default-emission set used by the runtime. For a\n // given handle and `${group}` site, returns the keys whose declarations\n // should ship: union of group-keys appearing in `handle.declarations.deps.refs`\n // and in `deps.refs` of every collected rule/media-inner-rule whose\n // selector targets `handle`.\n /**\n * Returns the variable keys within `groupPath` that are reachable from `handle` or from any collected rule targeting it.\n *\n * @param handle Handle whose declaration refs and dependent rules are consulted.\n * @param groupPath Group prefix path (e.g. `vars/chip/look`).\n */\n reachableDefaults(\n handle: StyleHandle,\n groupPath: `vars/${string}`\n ): ReadonlySet<string> {\n const groupPrefix = `${groupPath}/`;\n const reachable = new Set<string>();\n const harvest = (refs: ReadonlySet<ContextualVarPath>): void => {\n for (const path of refs) {\n if (path.startsWith(groupPrefix)) {\n reachable.add(path.slice(groupPrefix.length));\n }\n }\n };\n\n harvest(handle.declarations.deps.refs);\n\n for (const entry of this.entries.values()) {\n if (entry.kind === 'rule') {\n if (entry.dependsOn.has(handle.key)) {\n harvest(entry.declarations.deps.refs);\n }\n continue;\n }\n if (entry.kind === 'media') {\n for (const innerRule of entry.rules) {\n if (innerRule.dependsOn.has(handle.key)) {\n harvest(innerRule.declarations.deps.refs);\n }\n }\n }\n }\n\n return reachable;\n }\n\n // Computes the final theme/var dep sets, folding in default-marker\n // contributions only for keys that survive reachability. Called once per\n // `createResolver()` and per `collectedThemeDeps`/`collectedVarDeps`\n // access; collection mutations between calls re-derive the result.\n private finalizeDeps(): {\n theme: ReadonlySet<string>;\n vars: ReadonlySet<ContextualVarPath>;\n } {\n const theme = new Set<string>(this.themeDeps);\n const vars = new Set<ContextualVarPath>(this.varDeps);\n\n for (const handle of this.handles.values()) {\n for (const group of handle.declarations.deps.defaults) {\n const reachable = this.reachableDefaults(handle, group.groupPath);\n for (const item of group.keys) {\n if (!reachable.has(item.key)) {\n continue;\n }\n vars.add(item.path);\n item.valueDeps.theme.forEach((path) => theme.add(path));\n item.valueDeps.vars.forEach((path) => vars.add(path));\n }\n }\n }\n\n // Default markers inside rule / media-inner-rule declarations don't have\n // a host handle to anchor reachability against. The runtime emits every\n // listed key when rendering such a declaration, so we mirror that here\n // and include all of them in the registry.\n for (const entry of this.entries.values()) {\n if (entry.kind === 'rule') {\n includeAllDefaults(entry.declarations.deps.defaults, theme, vars);\n continue;\n }\n if (entry.kind === 'media') {\n for (const inner of entry.rules) {\n includeAllDefaults(inner.declarations.deps.defaults, theme, vars);\n }\n }\n }\n\n return { theme, vars };\n }\n\n private retainHandle(handle: StyleHandle): boolean {\n if (!isEmptyDeclarations(handle.declarations)) {\n return true;\n }\n if (this.registry.targetsHandle(handle.key)) {\n return true;\n }\n if (this.dev && !warnedHandles.has(handle)) {\n warnedHandles.add(handle);\n this.warn(\n `Style module \"${handle.moduleName}\" handle \"${handle.localName}\" has no declarations and no rule targets it; delete the empty template.`\n );\n }\n return this.names !== 'compact';\n }\n\n private addEntry(entry: StyleEntry): void {\n if (entry.kind === 'handle' && !this.retainHandle(entry)) {\n return;\n }\n this.entries.set(entryKey(entry), entry);\n if (entry.kind === 'handle') {\n this.handles.set(entry.key, entry);\n this.addDeclarationDeps(entry.declarations);\n return;\n }\n if (entry.kind === 'rule') {\n this.addDeclarationDeps(entry.declarations);\n return;\n }\n for (const rule of entry.rules) {\n this.addDeclarationDeps(rule.declarations);\n }\n }\n\n private addDeclarationDeps(declarations: Declarations): void {\n declarations.deps.theme.forEach((path) => this.themeDeps.add(path));\n declarations.deps.vars.forEach((path) => this.varDeps.add(path));\n }\n}\n\nconst includeAllDefaults = (\n defaults: ReadonlyArray<DefaultGroupDeps>,\n theme: Set<string>,\n vars: Set<ContextualVarPath>\n): void => {\n for (const group of defaults) {\n for (const item of group.keys) {\n vars.add(item.path);\n item.valueDeps.theme.forEach((path) => theme.add(path));\n item.valueDeps.vars.forEach((path) => vars.add(path));\n }\n }\n};\n\nconst cssVarKeysFrom = (finalized: {\n theme: ReadonlySet<string>;\n vars: ReadonlySet<ContextualVarPath>;\n}): readonly CssVarPath[] => {\n const keys = new Set<CssVarPath>();\n finalized.theme.forEach((path) => keys.add(path));\n finalized.vars.forEach((path) => keys.add(path));\n return [...keys].sort();\n};\n\nconst entryKey = (entry: StyleEntry): string => {\n if (entry.kind === 'media') {\n return `media/${entry.key}`;\n }\n return entry.key;\n};\n\nconst mediaSortRank = (entry: StyleEntry): number =>\n entry.kind === 'media' ? 1 : 0;\n\nconst localVarOverrideRank = (entry: StyleEntry): number => {\n if (entry.kind === 'media') {\n return 0;\n }\n return entry.declarations.css.some(isLocalVarOverrideMarker) ? 1 : 0;\n};\n\n// Base entries before every `@media`/`@container` block (no specificity). See finding `media-block-ordering`.\n// `${group.set()}` after `${group}` defaults so a stacked override class wins. See finding `local-var-override-ordering`.\nconst compareEntriesForEmission = (a: StyleEntry, b: StyleEntry): number => {\n const rankDelta = mediaSortRank(a) - mediaSortRank(b);\n if (rankDelta !== 0) {\n return rankDelta;\n }\n const varDelta = localVarOverrideRank(a) - localVarOverrideRank(b);\n if (varDelta !== 0) {\n return varDelta;\n }\n if (a.moduleName !== b.moduleName) {\n return a.moduleName.localeCompare(b.moduleName);\n }\n return a.key.localeCompare(b.key);\n};\n\nconst isReadonlyArray = <T>(value: unknown): value is readonly T[] =>\n Array.isArray(value);\n\nconst isStylesModule = (\n value: StylesModule | StyleHandle | StyleRule | StyleMedia\n): value is StylesModule => 'handles' in value && 'handleList' in value;\n"]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/** What a span's text is, which decides whether a pass may look inside it. */
|
|
2
|
+
export type CssSpanKind =
|
|
3
|
+
/** `/* … *\/`, including the delimiters. Opaque. */
|
|
4
|
+
'comment'
|
|
5
|
+
/** A quoted string, including the quotes and any escapes. Opaque. */
|
|
6
|
+
| 'string'
|
|
7
|
+
/** An unquoted `url(…)` function token, including the parentheses. Opaque. */
|
|
8
|
+
| 'url'
|
|
9
|
+
/** A backslash and the character it escapes, outside a string. Opaque. */
|
|
10
|
+
| 'escape'
|
|
11
|
+
/** A run of whitespace. */
|
|
12
|
+
| 'whitespace'
|
|
13
|
+
/** One of `{ } : ; , >`. */
|
|
14
|
+
| 'structural'
|
|
15
|
+
/** Anything else, run together: identifiers, values, selectors, `var(`. */
|
|
16
|
+
| 'text';
|
|
17
|
+
/** Whether the enclosing block holds declarations or further rules. */
|
|
18
|
+
export type CssBlockKind = 'rules' | 'declarations';
|
|
19
|
+
/** One scanner span: kind, source slice, and block context. */
|
|
20
|
+
export interface CssSpan {
|
|
21
|
+
/** What this span's text is; opaque kinds are skipped by later passes. */
|
|
22
|
+
readonly kind: CssSpanKind;
|
|
23
|
+
/** Source slice for this span, including delimiters. */
|
|
24
|
+
readonly text: string;
|
|
25
|
+
/** Index of the first character in the source. */
|
|
26
|
+
readonly start: number;
|
|
27
|
+
/** Index one past the last character in the source. */
|
|
28
|
+
readonly end: number;
|
|
29
|
+
/**
|
|
30
|
+
* What the enclosing block holds. An at-rule prelude (`@media …`) opens a
|
|
31
|
+
* block of rules; anything else opens declarations; top level is rules.
|
|
32
|
+
*
|
|
33
|
+
* This is what separates `color : red` — where the space before `:` is
|
|
34
|
+
* noise — from `.menu :hover`, where it is a descendant combinator.
|
|
35
|
+
*/
|
|
36
|
+
readonly block: CssBlockKind;
|
|
37
|
+
/** Block nesting depth; `0` at top level. */
|
|
38
|
+
readonly depth: number;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Splits `value` into spans.
|
|
42
|
+
*
|
|
43
|
+
* Concatenating every span's `text` reproduces `value` exactly, which is what
|
|
44
|
+
* lets a pass rewrite the spans it understands and copy the rest through.
|
|
45
|
+
*
|
|
46
|
+
* @param value CSS text.
|
|
47
|
+
*/
|
|
48
|
+
export declare const scanCss: (value: string) => readonly CssSpan[];
|
|
49
|
+
/**
|
|
50
|
+
* `true` for spans whose text is a literal rather than code — a comment, a
|
|
51
|
+
* quoted string, an unquoted `url(...)`, or an escape pair. A pass may rewrite
|
|
52
|
+
* what is inside a code span and must copy an opaque one through untouched.
|
|
53
|
+
*/
|
|
54
|
+
export declare const isOpaque: (span: CssSpan) => boolean;
|
|
55
|
+
/** True when `value` has no declarations left after comments, whitespace, and bare `;` are ignored. */
|
|
56
|
+
export declare const isBlankCss: (value: string) => boolean;
|
|
57
|
+
//# sourceMappingURL=css_scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css_scan.d.ts","sourceRoot":"","sources":["../src/css_scan.ts"],"names":[],"mappings":"AAmBA,8EAA8E;AAC9E,MAAM,MAAM,WAAW;AACrB,oDAAoD;AAClD,SAAS;AACX,qEAAqE;GACnE,QAAQ;AACV,8EAA8E;GAC5E,KAAK;AACP,0EAA0E;GACxE,QAAQ;AACV,2BAA2B;GACzB,YAAY;AACd,4BAA4B;GAC1B,YAAY;AACd,2EAA2E;GACzE,MAAM,CAAC;AAEX,uEAAuE;AACvE,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,cAAc,CAAC;AAEpD,+DAA+D;AAC/D,MAAM,WAAW,OAAO;IACtB,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,wDAAwD;IACxD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,kDAAkD;IAClD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,uDAAuD;IACvD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,6CAA6C;IAC7C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AA2ED;;;;;;;GAOG;AACH,eAAO,MAAM,OAAO,GAAI,OAAO,MAAM,KAAG,SAAS,OAAO,EAoGvD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,MAAM,OAAO,KAAG,OAIjB,CAAC;AAEzB,uGAAuG;AACvG,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,OAMxC,CAAC"}
|
package/dist/css_scan.js
ADDED
|
@@ -0,0 +1,180 @@
|
|
|
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
|
+
const STRUCTURAL = new Set(['{', '}', ':', ';', ',', '>']);
|
|
8
|
+
const URL_PREFIX = 'url(';
|
|
9
|
+
/** `true` when an unquoted `url(` function token starts at `index`. */
|
|
10
|
+
const isUnquotedUrlStart = (value, index) => {
|
|
11
|
+
// Cheap rejection first: this runs at every index of every text span, and
|
|
12
|
+
// all but one character in a few hundred fails here rather than in a
|
|
13
|
+
// `slice().toLowerCase()`.
|
|
14
|
+
const head = value[index];
|
|
15
|
+
if (head !== 'u' && head !== 'U') {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
// `url(` has to open a function token rather than end a longer identifier.
|
|
19
|
+
// `myurl(/a/*b*/c)` is some other function, and reading it as a url would
|
|
20
|
+
// make its contents opaque — hiding a real comment from every pass.
|
|
21
|
+
const before = value[index - 1];
|
|
22
|
+
if (before !== undefined && /[\w\\-]/.test(before)) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
if (value.slice(index, index + URL_PREFIX.length).toLowerCase() !== URL_PREFIX) {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
let cursor = index + URL_PREFIX.length;
|
|
29
|
+
while (cursor < value.length && /\s/.test(value[cursor] ?? '')) {
|
|
30
|
+
cursor += 1;
|
|
31
|
+
}
|
|
32
|
+
const first = value[cursor];
|
|
33
|
+
return first !== '"' && first !== "'";
|
|
34
|
+
};
|
|
35
|
+
/** Index one past an unquoted `url(…)` token that starts at `start`. */
|
|
36
|
+
const endOfUrl = (value, start) => {
|
|
37
|
+
for (let index = start + URL_PREFIX.length; index < value.length; index += 1) {
|
|
38
|
+
const char = value[index];
|
|
39
|
+
if (char === '\\' && index + 1 < value.length) {
|
|
40
|
+
index += 1;
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (char === ')') {
|
|
44
|
+
return index + 1;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return value.length;
|
|
48
|
+
};
|
|
49
|
+
/** Index one past a quoted string that starts at `start`. Unterminated runs to the end. */
|
|
50
|
+
const endOfString = (value, start) => {
|
|
51
|
+
const quote = value[start];
|
|
52
|
+
for (let index = start + 1; index < value.length; index += 1) {
|
|
53
|
+
const char = value[index];
|
|
54
|
+
if (char === '\\' && index + 1 < value.length) {
|
|
55
|
+
index += 1;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (char === quote) {
|
|
59
|
+
return index + 1;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return value.length;
|
|
63
|
+
};
|
|
64
|
+
/** Index one past a `/* … *\/` comment that starts at `start`. Unterminated runs to the end. */
|
|
65
|
+
const endOfComment = (value, start) => {
|
|
66
|
+
const closing = value.indexOf('*/', start + 2);
|
|
67
|
+
return closing === -1 ? value.length : closing + 2;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Splits `value` into spans.
|
|
71
|
+
*
|
|
72
|
+
* Concatenating every span's `text` reproduces `value` exactly, which is what
|
|
73
|
+
* lets a pass rewrite the spans it understands and copy the rest through.
|
|
74
|
+
*
|
|
75
|
+
* @param value CSS text.
|
|
76
|
+
*/
|
|
77
|
+
export const scanCss = (value) => {
|
|
78
|
+
const spans = [];
|
|
79
|
+
const blocks = ['rules'];
|
|
80
|
+
// Null until the first significant character of a prelude is seen, so that
|
|
81
|
+
// `@media …{` opens rules and `.a …{` opens declarations.
|
|
82
|
+
let preludeIsAtRule = null;
|
|
83
|
+
let index = 0;
|
|
84
|
+
const push = (kind, start, end) => {
|
|
85
|
+
spans.push({
|
|
86
|
+
kind,
|
|
87
|
+
text: value.slice(start, end),
|
|
88
|
+
start,
|
|
89
|
+
end,
|
|
90
|
+
block: blocks.at(-1) ?? 'rules',
|
|
91
|
+
depth: blocks.length - 1,
|
|
92
|
+
});
|
|
93
|
+
};
|
|
94
|
+
while (index < value.length) {
|
|
95
|
+
const char = value[index] ?? '';
|
|
96
|
+
const next = value[index + 1];
|
|
97
|
+
if (char === '/' && next === '*') {
|
|
98
|
+
const end = endOfComment(value, index);
|
|
99
|
+
push('comment', index, end);
|
|
100
|
+
index = end;
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (char === '"' || char === "'") {
|
|
104
|
+
const end = endOfString(value, index);
|
|
105
|
+
push('string', index, end);
|
|
106
|
+
index = end;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (char === '\\' && next !== undefined) {
|
|
110
|
+
push('escape', index, index + 2);
|
|
111
|
+
index += 2;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (isUnquotedUrlStart(value, index)) {
|
|
115
|
+
const end = endOfUrl(value, index);
|
|
116
|
+
push('url', index, end);
|
|
117
|
+
index = end;
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (/\s/.test(char)) {
|
|
121
|
+
let end = index + 1;
|
|
122
|
+
while (end < value.length && /\s/.test(value[end] ?? '')) {
|
|
123
|
+
end += 1;
|
|
124
|
+
}
|
|
125
|
+
push('whitespace', index, end);
|
|
126
|
+
index = end;
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
if (STRUCTURAL.has(char)) {
|
|
130
|
+
// Depth changes after the span is recorded, so `{` reads as belonging to
|
|
131
|
+
// the block it closes over rather than the one it opens.
|
|
132
|
+
push('structural', index, index + 1);
|
|
133
|
+
if (char === '{') {
|
|
134
|
+
blocks.push(preludeIsAtRule ? 'rules' : 'declarations');
|
|
135
|
+
}
|
|
136
|
+
else if (char === '}' && blocks.length > 1) {
|
|
137
|
+
blocks.pop();
|
|
138
|
+
}
|
|
139
|
+
if (char === '{' || char === '}' || char === ';') {
|
|
140
|
+
preludeIsAtRule = null;
|
|
141
|
+
}
|
|
142
|
+
index += 1;
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
if (preludeIsAtRule === null) {
|
|
146
|
+
preludeIsAtRule = char === '@';
|
|
147
|
+
}
|
|
148
|
+
let end = index + 1;
|
|
149
|
+
while (end < value.length) {
|
|
150
|
+
const ahead = value[end] ?? '';
|
|
151
|
+
if (STRUCTURAL.has(ahead) ||
|
|
152
|
+
/\s/.test(ahead) ||
|
|
153
|
+
ahead === '"' ||
|
|
154
|
+
ahead === "'" ||
|
|
155
|
+
ahead === '\\' ||
|
|
156
|
+
(ahead === '/' && value[end + 1] === '*') ||
|
|
157
|
+
isUnquotedUrlStart(value, end)) {
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
end += 1;
|
|
161
|
+
}
|
|
162
|
+
push('text', index, end);
|
|
163
|
+
index = end;
|
|
164
|
+
}
|
|
165
|
+
return spans;
|
|
166
|
+
};
|
|
167
|
+
/**
|
|
168
|
+
* `true` for spans whose text is a literal rather than code — a comment, a
|
|
169
|
+
* quoted string, an unquoted `url(...)`, or an escape pair. A pass may rewrite
|
|
170
|
+
* what is inside a code span and must copy an opaque one through untouched.
|
|
171
|
+
*/
|
|
172
|
+
export const isOpaque = (span) => span.kind === 'comment' ||
|
|
173
|
+
span.kind === 'string' ||
|
|
174
|
+
span.kind === 'url' ||
|
|
175
|
+
span.kind === 'escape';
|
|
176
|
+
/** True when `value` has no declarations left after comments, whitespace, and bare `;` are ignored. */
|
|
177
|
+
export const isBlankCss = (value) => scanCss(value).every((span) => span.kind === 'comment' ||
|
|
178
|
+
span.kind === 'whitespace' ||
|
|
179
|
+
(span.kind === 'structural' && span.text === ';'));
|
|
180
|
+
//# sourceMappingURL=css_scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css_scan.js","sourceRoot":"","sources":["../src/css_scan.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAwDH,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAC3D,MAAM,UAAU,GAAG,MAAM,CAAC;AAE1B,uEAAuE;AACvE,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAE,KAAa,EAAW,EAAE;IACnE,0EAA0E;IAC1E,qEAAqE;IACrE,2BAA2B;IAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1B,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;QACjC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,2EAA2E;IAC3E,0EAA0E;IAC1E,oEAAoE;IACpE,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAChC,IAAI,MAAM,KAAK,SAAS,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IACE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,KAAK,UAAU,EAC1E,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,MAAM,GAAG,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;IACvC,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/D,MAAM,IAAI,CAAC,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5B,OAAO,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC;AACxC,CAAC,CAAC;AAEF,wEAAwE;AACxE,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,KAAa,EAAU,EAAE;IACxD,KACE,IAAI,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC,MAAM,EACrC,KAAK,GAAG,KAAK,CAAC,MAAM,EACpB,KAAK,IAAI,CAAC,EACV,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC9C,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjB,OAAO,KAAK,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC;AACtB,CAAC,CAAC;AAEF,2FAA2F;AAC3F,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,KAAa,EAAU,EAAE;IAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3B,KAAK,IAAI,KAAK,GAAG,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC1B,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC9C,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACnB,OAAO,KAAK,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,CAAC;AACtB,CAAC,CAAC;AAEF,gGAAgG;AAChG,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,KAAa,EAAU,EAAE;IAC5D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAC/C,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;AACrD,CAAC,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAa,EAAsB,EAAE;IAC3D,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAmB,CAAC,OAAO,CAAC,CAAC;IACzC,2EAA2E;IAC3E,0DAA0D;IAC1D,IAAI,eAAe,GAAmB,IAAI,CAAC;IAC3C,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,MAAM,IAAI,GAAG,CAAC,IAAiB,EAAE,KAAa,EAAE,GAAW,EAAQ,EAAE;QACnE,KAAK,CAAC,IAAI,CAAC;YACT,IAAI;YACJ,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;YAC7B,KAAK;YACL,GAAG;YACH,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO;YAC/B,KAAK,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC;SACzB,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAE9B,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACvC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YAC5B,KAAK,GAAG,GAAG,CAAC;YACZ,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACtC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YAC3B,KAAK,GAAG,GAAG,CAAC;YACZ,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACxC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YACjC,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;YACrC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACnC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YACxB,KAAK,GAAG,GAAG,CAAC;YACZ,SAAS;QACX,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,IAAI,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC;YACpB,OAAO,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBACzD,GAAG,IAAI,CAAC,CAAC;YACX,CAAC;YACD,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;YAC/B,KAAK,GAAG,GAAG,CAAC;YACZ,SAAS;QACX,CAAC;QAED,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,yEAAyE;YACzE,yDAAyD;YACzD,IAAI,CAAC,YAAY,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YACrC,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;YAC1D,CAAC;iBAAM,IAAI,IAAI,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7C,MAAM,CAAC,GAAG,EAAE,CAAC;YACf,CAAC;YACD,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjD,eAAe,GAAG,IAAI,CAAC;YACzB,CAAC;YACD,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QAED,IAAI,eAAe,KAAK,IAAI,EAAE,CAAC;YAC7B,eAAe,GAAG,IAAI,KAAK,GAAG,CAAC;QACjC,CAAC;QACD,IAAI,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC;QACpB,OAAO,GAAG,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YAC/B,IACE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;gBACrB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;gBAChB,KAAK,KAAK,GAAG;gBACb,KAAK,KAAK,GAAG;gBACb,KAAK,KAAK,IAAI;gBACd,CAAC,KAAK,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC;gBACzC,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,EAC9B,CAAC;gBACD,MAAM;YACR,CAAC;YACD,GAAG,IAAI,CAAC,CAAC;QACX,CAAC;QACD,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QACzB,KAAK,GAAG,GAAG,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,IAAa,EAAW,EAAE,CACjD,IAAI,CAAC,IAAI,KAAK,SAAS;IACvB,IAAI,CAAC,IAAI,KAAK,QAAQ;IACtB,IAAI,CAAC,IAAI,KAAK,KAAK;IACnB,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;AAEzB,uGAAuG;AACvG,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAW,EAAE,CACnD,OAAO,CAAC,KAAK,CAAC,CAAC,KAAK,CAClB,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,CAAC,IAAI,KAAK,SAAS;IACvB,IAAI,CAAC,IAAI,KAAK,YAAY;IAC1B,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,CACpD,CAAC","sourcesContent":["/*\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one\n * or more contributor license agreements. Licensed under the Elastic License\n * 2.0; you may not use this file except in compliance with the Elastic License\n * 2.0.\n */\n\n// 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,27 @@
|
|
|
1
|
+
import type { StyleSink } from './emotion.js';
|
|
2
|
+
/** Minimal interface for a DOM `<style>` element. */
|
|
3
|
+
export interface StyleElementLike {
|
|
4
|
+
/** Current stylesheet text, or `null` before the first flush. */
|
|
5
|
+
textContent: string | null;
|
|
6
|
+
}
|
|
7
|
+
/** Minimal interface for a DOM `Document` able to create and append style tags. */
|
|
8
|
+
export interface DocumentLike {
|
|
9
|
+
/** Creates a `<style>` element. */
|
|
10
|
+
createElement(tagName: 'style'): StyleElementLike;
|
|
11
|
+
/** Node that receives the created style element. */
|
|
12
|
+
readonly head: {
|
|
13
|
+
appendChild(node: StyleElementLike): void;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/** Host document and optional flush scheduler for a `<style>` sink. */
|
|
17
|
+
export interface CreateDomSinkOptions {
|
|
18
|
+
/** The host document where the style element will be appended. */
|
|
19
|
+
document: DocumentLike;
|
|
20
|
+
/** Defers the flush. Defaults to `queueMicrotask`. */
|
|
21
|
+
schedule?: (flush: () => void) => void;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* One managed `<style>` element, rewritten on each flush.
|
|
25
|
+
*/
|
|
26
|
+
export declare const createDomSink: ({ document, schedule, }: CreateDomSinkOptions) => StyleSink;
|
|
27
|
+
//# sourceMappingURL=dom_sink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom_sink.d.ts","sourceRoot":"","sources":["../src/dom_sink.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C,qDAAqD;AACrD,MAAM,WAAW,gBAAgB;IAC/B,iEAAiE;IACjE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,mFAAmF;AACnF,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,gBAAgB,CAAC;IAClD,oDAAoD;IACpD,QAAQ,CAAC,IAAI,EAAE;QAAE,WAAW,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAAA;KAAE,CAAC;CAC9D;AAED,uEAAuE;AACvE,MAAM,WAAW,oBAAoB;IACnC,kEAAkE;IAClE,QAAQ,EAAE,YAAY,CAAC;IACvB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;CACxC;AAED;;GAEG;AACH,eAAO,MAAM,aAAa,GAAI,yBAG3B,oBAAoB,KAAG,SA2BzB,CAAC"}
|
package/dist/dom_sink.js
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
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
|
+
/**
|
|
8
|
+
* One managed `<style>` element, rewritten on each flush.
|
|
9
|
+
*/
|
|
10
|
+
export const createDomSink = ({ document, schedule = queueMicrotask, }) => {
|
|
11
|
+
let element = null;
|
|
12
|
+
let dirty = false;
|
|
13
|
+
let latestRender = null;
|
|
14
|
+
const flush = () => {
|
|
15
|
+
dirty = false;
|
|
16
|
+
if (!latestRender) {
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
if (!element) {
|
|
20
|
+
element = document.createElement('style');
|
|
21
|
+
document.head.appendChild(element);
|
|
22
|
+
}
|
|
23
|
+
element.textContent = latestRender();
|
|
24
|
+
};
|
|
25
|
+
return {
|
|
26
|
+
invalidate(render) {
|
|
27
|
+
latestRender = render;
|
|
28
|
+
if (dirty) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
dirty = true;
|
|
32
|
+
schedule(flush);
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
//# 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;AACH,MAAM,CAAC,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","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,47 @@
|
|
|
1
|
+
import type { Distillery } from './engine.js';
|
|
2
|
+
import { type StyleHandle, type StylesModule } from './styles/index.js';
|
|
3
|
+
export { createDomSink, type CreateDomSinkOptions, type DocumentLike, type StyleElementLike, } from './dom_sink.js';
|
|
4
|
+
/** Receives stylesheet invalidation from Emotion compat modules. */
|
|
5
|
+
export interface StyleSink {
|
|
6
|
+
/** Marks the sink dirty. `render` produces the current stylesheet when it flushes. */
|
|
7
|
+
invalidate(render: () => string): void;
|
|
8
|
+
}
|
|
9
|
+
/** Shared sink for Emotion compat modules on one registry. */
|
|
10
|
+
export interface CreateEmotionOptions {
|
|
11
|
+
/** Notified when a compat module registers. Shared across `createEmotion` calls on the same registry. */
|
|
12
|
+
sink?: StyleSink;
|
|
13
|
+
}
|
|
14
|
+
/** Style handle that stringifies to its readable class name. */
|
|
15
|
+
export interface EmotionCss extends StyleHandle {
|
|
16
|
+
/** Stringifies to the readable class name. */
|
|
17
|
+
toString(): string;
|
|
18
|
+
/** Template interpolation; same as {@link EmotionCss.toString}. */
|
|
19
|
+
[Symbol.toPrimitive](hint: string): string;
|
|
20
|
+
}
|
|
21
|
+
/** One `cx(...)` argument: a class, handle, list, or truthy map. */
|
|
22
|
+
export type ClassNameArg = string | number | false | null | undefined | EmotionCss | StyleHandle | ClassNameArg[] | {
|
|
23
|
+
readonly [className: string]: boolean;
|
|
24
|
+
};
|
|
25
|
+
/** Emotion-shaped authoring API bound to one Distillery registry. */
|
|
26
|
+
export interface Emotion {
|
|
27
|
+
/** Authors styles and returns a handle that can be used directly or passed to `cx`. */
|
|
28
|
+
css(strings: TemplateStringsArray, ...values: readonly unknown[]): EmotionCss;
|
|
29
|
+
/** Combines handles, conditional classes, and plain strings into a space-separated string. */
|
|
30
|
+
cx(...args: readonly ClassNameArg[]): string;
|
|
31
|
+
/** Defines styles that apply globally (e.g. `body`, `html`). */
|
|
32
|
+
injectGlobal(strings: TemplateStringsArray, ...values: readonly unknown[]): void;
|
|
33
|
+
/** Emits the full CSS for all generated emotion styles. */
|
|
34
|
+
stylesheet(): string;
|
|
35
|
+
/** Returns the underlying modules backing `injectGlobal` calls. */
|
|
36
|
+
globalModules(): readonly StylesModule[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* `@emotion/css`-shaped API over a distillery.
|
|
40
|
+
*
|
|
41
|
+
* `String(css\`...\`)` is the readable class name and does not collect. Passing the wrapper through `resolveClassName` collects and compacts like a native handle.
|
|
42
|
+
*
|
|
43
|
+
* @param distillery Bound distillery that owns the underlying registry.
|
|
44
|
+
* @param options Optional sink for DOM injection.
|
|
45
|
+
*/
|
|
46
|
+
export declare const createEmotion: <TTokens>(distillery: Distillery<TTokens>, options?: CreateEmotionOptions) => Emotion;
|
|
47
|
+
//# sourceMappingURL=emotion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emotion.d.ts","sourceRoot":"","sources":["../src/emotion.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAG3C,OAAO,EAGL,KAAK,WAAW,EAEhB,KAAK,YAAY,EAClB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,aAAa,EACb,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,gBAAgB,GACtB,MAAM,YAAY,CAAC;AAEpB,oEAAoE;AACpE,MAAM,WAAW,SAAS;IACxB,sFAAsF;IACtF,UAAU,CAAC,MAAM,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;CACxC;AAED,8DAA8D;AAC9D,MAAM,WAAW,oBAAoB;IACnC,yGAAyG;IACzG,IAAI,CAAC,EAAE,SAAS,CAAC;CAClB;AAED,gEAAgE;AAChE,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,8CAA8C;IAC9C,QAAQ,IAAI,MAAM,CAAC;IACnB,mEAAmE;IACnE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5C;AAED,oEAAoE;AACpE,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,MAAM,GACN,KAAK,GACL,IAAI,GACJ,SAAS,GACT,UAAU,GACV,WAAW,GACX,YAAY,EAAE,GACd;IAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,CAAC;AAE9C,qEAAqE;AACrE,MAAM,WAAW,OAAO;IACtB,uFAAuF;IACvF,GAAG,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,SAAS,OAAO,EAAE,GAAG,UAAU,CAAC;IAC9E,8FAA8F;IAC9F,EAAE,CAAC,GAAG,IAAI,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAAC;IAC7C,gEAAgE;IAChE,YAAY,CACV,OAAO,EAAE,oBAAoB,EAC7B,GAAG,MAAM,EAAE,SAAS,OAAO,EAAE,GAC5B,IAAI,CAAC;IACR,2DAA2D;IAC3D,UAAU,IAAI,MAAM,CAAC;IACrB,mEAAmE;IACnE,aAAa,IAAI,SAAS,YAAY,EAAE,CAAC;CAC1C;AAoCD;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,GAAI,OAAO,EACnC,YAAY,UAAU,CAAC,OAAO,CAAC,EAC/B,UAAS,oBAAyB,KACjC,OAwIF,CAAC"}
|