@unpunnyfuns/swatchbook-blocks 0.1.5 → 0.2.1
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/README.md +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +202 -60
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["generatedCss","virtualAxes","sampleStyle","styles","formatDimension","formatColor","styles","MAX_RENDER_PX","styles","toPixels","styles","styles","styles","styles","styles","styles","styles","formatColor","styles","styles","styles","styles","styles","styles","styles","styles","styles","styles","styles","styles","styles"],"sources":["../src/format-color.ts","../src/internal/channel-globals.ts","../src/contexts.ts","../src/internal/use-project.ts","../src/border-preview/BorderSample.tsx","../src/internal/styles.ts","../src/BorderPreview.tsx","../src/ColorPalette.tsx","../src/dimension-scale/DimensionBar.tsx","../src/DimensionScale.tsx","../src/FontFamilySample.tsx","../src/FontWeightScale.tsx","../src/GradientPalette.tsx","../src/internal/prefers-reduced-motion.ts","../src/motion-preview/MotionSample.tsx","../src/MotionPreview.tsx","../src/provider.tsx","../src/shadow-preview/ShadowSample.tsx","../src/ShadowPreview.tsx","../src/StrokeStyleSample.tsx","../src/token-detail/styles.ts","../src/token-detail/internal.ts","../src/token-detail/AliasChain.tsx","../src/token-detail/AliasedBy.tsx","../src/token-detail/AxisVariance.tsx","../src/token-detail/CompositeBreakdown.tsx","../src/token-detail/CompositePreview.tsx","../src/token-detail/ConsumerOutput.tsx","../src/token-detail/TokenHeader.tsx","../src/token-detail/TokenUsageSnippet.tsx","../src/TokenDetail.tsx","../src/TokenNavigator.tsx","../src/TokenTable.tsx","../src/TypographyScale.tsx"],"sourcesContent":["import Color from 'colorjs.io';\n\n/**\n * Color display formats understood by {@link formatColor}.\n *\n * - `hex` — sRGB hex (`#rrggbb` or `#rrggbbaa`). Out-of-gamut or wide-gamut\n * colors fall back to `rgb()` and surface `outOfGamut: true` so callers\n * can render a ⚠ glyph.\n * - `rgb` / `hsl` — modern CSS Color 4 space-separated syntax, converted\n * from the source colorspace. Out-of-gamut values are still stringified\n * (the browser will clip when actually rendering) and flagged.\n * - `oklch` — perceptual wide-gamut form. Never marks out-of-gamut because\n * every color expressible in sRGB/P3 fits in oklch.\n * - `raw` — compact JSON of the normalized Terrazzo shape. For DTCG\n * authors who want to see what the parser actually stored.\n */\nexport type ColorFormat = 'hex' | 'rgb' | 'hsl' | 'oklch' | 'raw';\n\nexport const COLOR_FORMATS: readonly ColorFormat[] = ['hex', 'rgb', 'hsl', 'oklch', 'raw'];\n\n/**\n * Terrazzo's `ColorValueNormalized`, copied inline to avoid a hard dep on\n * `@terrazzo/token-tools` from blocks. Matches the shape documented at\n * https://terrazzo.app/docs/cli/reference/token-tools/ColorValueNormalized.\n *\n * Some token payloads we see in the wild use the legacy DTCG-ish `channels`\n * field in place of `components`; we accept either.\n */\nexport interface NormalizedColor {\n colorSpace: string;\n components?: readonly (number | null)[];\n channels?: readonly (number | null)[];\n alpha?: number;\n hex?: string;\n}\n\nexport interface FormatColorResult {\n /** Display string — e.g. `rgb(59 132 246)`, `#3b82f6`. */\n value: string;\n /** True when the requested format can't losslessly represent the color. */\n outOfGamut: boolean;\n}\n\nconst DEFAULT_FALLBACK = '—';\n\n/**\n * Convert Terrazzo's normalized color payload into a display string in the\n * requested format. Pure function — never throws; returns `{ value: '—' }`\n * for unrecognized input so calling blocks don't need try/catch.\n */\nexport function formatColor(\n value: unknown,\n format: ColorFormat,\n fallback: string = DEFAULT_FALLBACK,\n): FormatColorResult {\n const normalized = coerce(value);\n if (!normalized) return { value: stringifyFallback(value, fallback), outOfGamut: false };\n\n if (format === 'raw') {\n return { value: compactJson(normalized), outOfGamut: false };\n }\n\n const color = toColor(normalized);\n if (!color) return { value: stringifyFallback(value, fallback), outOfGamut: false };\n\n const alpha = typeof normalized.alpha === 'number' ? normalized.alpha : 1;\n\n if (format === 'hex') return formatHex(color, alpha);\n if (format === 'rgb') return formatRgb(color, alpha);\n if (format === 'hsl') return formatHsl(color, alpha);\n return formatOklch(color, alpha);\n}\n\nfunction coerce(value: unknown): NormalizedColor | null {\n if (!value || typeof value !== 'object') return null;\n const v = value as Record<string, unknown>;\n const colorSpace = typeof v['colorSpace'] === 'string' ? (v['colorSpace'] as string) : undefined;\n const components = Array.isArray(v['components'])\n ? (v['components'] as (number | null)[])\n : Array.isArray(v['channels'])\n ? (v['channels'] as (number | null)[])\n : undefined;\n if (!colorSpace || !components) {\n if (typeof v['hex'] === 'string') {\n return { colorSpace: 'srgb', components: hexToComponents(v['hex'] as string) };\n }\n return null;\n }\n const alpha = typeof v['alpha'] === 'number' ? (v['alpha'] as number) : undefined;\n const hex = typeof v['hex'] === 'string' ? (v['hex'] as string) : undefined;\n return {\n colorSpace,\n components,\n ...(alpha !== undefined && { alpha }),\n ...(hex !== undefined && { hex }),\n };\n}\n\nfunction hexToComponents(hex: string): number[] {\n const h = hex.replace('#', '');\n const expanded =\n h.length === 3 || h.length === 4\n ? h\n .split('')\n .map((c) => c + c)\n .join('')\n : h;\n const r = parseInt(expanded.slice(0, 2), 16) / 255;\n const g = parseInt(expanded.slice(2, 4), 16) / 255;\n const b = parseInt(expanded.slice(4, 6), 16) / 255;\n return [r, g, b];\n}\n\n/**\n * Map Terrazzo's canonical CSS Color 4 space identifiers to the shorter\n * identifiers colorjs.io registers. Only the ones that differ need an entry.\n */\nconst COLORJS_SPACE_ALIASES: Record<string, string> = {\n 'display-p3': 'p3',\n 'a98-rgb': 'a98rgb',\n 'prophoto-rgb': 'prophoto',\n};\n\nfunction toColor(normalized: NormalizedColor): Color | null {\n const source = normalized.components ?? normalized.channels ?? [];\n const coords: [number, number, number] = [\n numberOrZero(source[0]),\n numberOrZero(source[1]),\n numberOrZero(source[2]),\n ];\n const space = COLORJS_SPACE_ALIASES[normalized.colorSpace] ?? normalized.colorSpace;\n try {\n return new Color(space, coords, normalized.alpha ?? 1);\n } catch {\n return null;\n }\n}\n\nfunction numberOrZero(n: number | null | undefined): number {\n return typeof n === 'number' && !Number.isNaN(n) ? n : 0;\n}\n\nfunction coord(color: Color, i: number): number {\n const c = color.coords[i];\n return typeof c === 'number' && !Number.isNaN(c) ? c : 0;\n}\n\nfunction formatHex(color: Color, alpha: number): FormatColorResult {\n const srgb = color.to('srgb');\n const inGamut = srgb.inGamut('srgb');\n if (!inGamut) {\n const rgb = formatRgb(color, alpha);\n return { value: rgb.value, outOfGamut: true };\n }\n const r = clamp255(coord(srgb, 0));\n const g = clamp255(coord(srgb, 1));\n const b = clamp255(coord(srgb, 2));\n const base = `#${toHexByte(r)}${toHexByte(g)}${toHexByte(b)}`;\n if (alpha >= 1) return { value: base, outOfGamut: false };\n const a = clamp255(alpha);\n return { value: `${base}${toHexByte(a)}`, outOfGamut: false };\n}\n\nfunction formatRgb(color: Color, alpha: number): FormatColorResult {\n const srgb = color.to('srgb');\n const inGamut = srgb.inGamut('srgb');\n const r = Math.round(clampUnit(coord(srgb, 0)) * 255);\n const g = Math.round(clampUnit(coord(srgb, 1)) * 255);\n const b = Math.round(clampUnit(coord(srgb, 2)) * 255);\n const body = `${r} ${g} ${b}`;\n const value = alpha >= 1 ? `rgb(${body})` : `rgb(${body} / ${roundAlpha(alpha)})`;\n return { value, outOfGamut: !inGamut };\n}\n\nfunction formatHsl(color: Color, alpha: number): FormatColorResult {\n const hsl = color.to('hsl');\n const srgb = color.to('srgb');\n const inGamut = srgb.inGamut('srgb');\n const hue = roundHue(coord(hsl, 0));\n const sat = roundPercent(coord(hsl, 1));\n const light = roundPercent(coord(hsl, 2));\n const body = `${hue} ${sat}% ${light}%`;\n const value = alpha >= 1 ? `hsl(${body})` : `hsl(${body} / ${roundAlpha(alpha)})`;\n return { value, outOfGamut: !inGamut };\n}\n\nfunction formatOklch(color: Color, alpha: number): FormatColorResult {\n const oklch = color.to('oklch');\n const L = roundTo(coord(oklch, 0), 3);\n const C = roundTo(coord(oklch, 1), 3);\n const H = roundTo(coord(oklch, 2), 2);\n const body = `${L} ${C} ${H}`;\n const value = alpha >= 1 ? `oklch(${body})` : `oklch(${body} / ${roundAlpha(alpha)})`;\n return { value, outOfGamut: false };\n}\n\nfunction clamp255(n: number): number {\n return Math.max(0, Math.min(255, Math.round(n * 255)));\n}\n\nfunction clampUnit(n: number): number {\n return Math.max(0, Math.min(1, n));\n}\n\nfunction toHexByte(n: number): string {\n return n.toString(16).padStart(2, '0');\n}\n\nfunction roundTo(n: number, digits: number): number {\n const f = 10 ** digits;\n return Math.round(n * f) / f;\n}\n\nfunction roundHue(h: number): number {\n return roundTo(((h % 360) + 360) % 360, 1);\n}\n\nfunction roundPercent(n: number): number {\n return Math.round(n * 10) / 10;\n}\n\nfunction roundAlpha(a: number): number {\n return roundTo(a, 3);\n}\n\nfunction compactJson(value: NormalizedColor): string {\n const parts: string[] = [`\"colorSpace\":${JSON.stringify(value.colorSpace)}`];\n const components = value.components ?? value.channels;\n if (components) {\n parts.push(`\"components\":[${components.map((c) => (c === null ? 'null' : c)).join(', ')}]`);\n }\n if (typeof value.alpha === 'number' && value.alpha !== 1) {\n parts.push(`\"alpha\":${value.alpha}`);\n }\n return `{ ${parts.join(', ')} }`;\n}\n\nfunction stringifyFallback(value: unknown, fallback: string): string {\n if (value == null) return fallback;\n if (typeof value === 'string' || typeof value === 'number') return String(value);\n return fallback;\n}\n","import { useSyncExternalStore } from 'react';\nimport { addons } from 'storybook/preview-api';\nimport { COLOR_FORMATS, type ColorFormat } from '#/format-color.ts';\n\n/**\n * Shared subscription to Storybook's globals channel, lifted out of React\n * component state so the values survive docs-mode remounts.\n *\n * On MDX docs pages, Storybook force-rerenders the docs container on every\n * `updateGlobals` (see `preview/runtime.js` → `onUpdateGlobals`), which\n * unmounts and remounts any embedded blocks. A `useState(null)` initializer\n * inside the block would reset to null on each remount — the symptom is a\n * one-frame flicker to the correct value, then revert to the defaults.\n * Module-level state persists; React reads it through `useSyncExternalStore`\n * and stays concurrent-safe.\n */\n\nexport interface ChannelGlobals {\n axes: Record<string, string> | null;\n theme: string | null;\n format: ColorFormat | null;\n}\n\nconst AXES_GLOBAL_KEY = 'swatchbookAxes';\nconst THEME_GLOBAL_KEY = 'swatchbookTheme';\nconst COLOR_FORMAT_GLOBAL_KEY = 'swatchbookColorFormat';\n\nlet snapshot: ChannelGlobals = { axes: null, theme: null, format: null };\nconst listeners = new Set<() => void>();\nlet subscribed = false;\n\nfunction isColorFormat(value: unknown): value is ColorFormat {\n return typeof value === 'string' && (COLOR_FORMATS as readonly string[]).includes(value);\n}\n\nfunction ensureSubscribed(): void {\n if (subscribed || typeof window === 'undefined') return;\n subscribed = true;\n const channel = addons.getChannel();\n const onGlobals = (payload: { globals?: Record<string, unknown> }): void => {\n const globals = payload.globals;\n if (!globals) return;\n let next = snapshot;\n const nextAxes = globals[AXES_GLOBAL_KEY];\n if (nextAxes && typeof nextAxes === 'object') {\n next = { ...next, axes: nextAxes as Record<string, string> };\n }\n const nextTheme = globals[THEME_GLOBAL_KEY];\n if (typeof nextTheme === 'string') {\n next = { ...next, theme: nextTheme };\n }\n const nextFormat = globals[COLOR_FORMAT_GLOBAL_KEY];\n if (isColorFormat(nextFormat)) {\n next = { ...next, format: nextFormat };\n }\n if (next !== snapshot) {\n snapshot = next;\n for (const cb of listeners) cb();\n }\n };\n /**\n * `setGlobals` fires once on preview init carrying the URL-persisted user\n * globals (Storybook stores toolbar selections in `?globals=…`). Without\n * this listener, deeplinking to an MDX page with a non-default axis tuple\n * or color format renders defaults for one frame before the first\n * `updateGlobals` arrives. `emitGlobals()` reads from `userGlobals.get()`\n * (current state), so the payload is never stale — safe to handle.\n */\n channel.on('globalsUpdated', onGlobals);\n channel.on('updateGlobals', onGlobals);\n channel.on('setGlobals', onGlobals);\n}\n\n/**\n * Subscribe at module load so the `SET_GLOBALS` emission from preview init\n * lands in our snapshot before any block renders. Running `useSyncExternalStore`'s\n * `subscribe` lazily on first hook call would miss the event in most cases.\n */\nensureSubscribed();\n\nfunction subscribe(cb: () => void): () => void {\n ensureSubscribed();\n listeners.add(cb);\n return () => {\n listeners.delete(cb);\n };\n}\n\nfunction getSnapshot(): ChannelGlobals {\n return snapshot;\n}\n\nfunction getServerSnapshot(): ChannelGlobals {\n return snapshot;\n}\n\nexport function useChannelGlobals(): ChannelGlobals {\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n","import { createContext, useContext } from 'react';\nimport { useChannelGlobals } from '#/internal/channel-globals.ts';\nimport type { ColorFormat } from '#/format-color.ts';\n\n/**\n * Typed shape of the addon's `virtual:swatchbook/tokens` module, duplicated\n * as value-importable interfaces so consumers outside the addon's Vite\n * plugin (unit tests, custom React apps) can construct a snapshot by hand.\n *\n * The ambient `declare module 'virtual:swatchbook/tokens'` declarations in\n * `packages/addon/src/virtual.d.ts` describe the same payload; the two\n * stay in sync by eye.\n */\nexport interface VirtualAxisShape {\n name: string;\n contexts: readonly string[];\n default: string;\n description?: string;\n source: 'resolver' | 'synthetic';\n}\n\nexport interface VirtualThemeShape {\n name: string;\n input: Record<string, string>;\n sources: string[];\n}\n\nexport interface VirtualDiagnosticShape {\n severity: 'error' | 'warn' | 'info';\n group: string;\n message: string;\n filename?: string;\n line?: number;\n column?: number;\n}\n\nexport interface VirtualTokenShape {\n $type?: string;\n $value?: unknown;\n $description?: string;\n aliasOf?: string;\n aliasChain?: readonly string[];\n aliasedBy?: readonly string[];\n}\n\nexport interface VirtualPresetShape {\n name: string;\n axes: Partial<Record<string, string>>;\n description?: string;\n}\n\n/**\n * Full project data read by blocks. Populated by the addon's preview\n * decorator (from the virtual module) or constructed by hand in\n * non-Storybook consumers.\n */\nexport interface ProjectSnapshot {\n axes: readonly VirtualAxisShape[];\n /** Axis names suppressed via `config.disabledAxes` — pinned to their defaults, hidden from the toolbar. */\n disabledAxes: readonly string[];\n presets: readonly VirtualPresetShape[];\n themes: readonly VirtualThemeShape[];\n themesResolved: Record<string, Record<string, VirtualTokenShape>>;\n activeTheme: string;\n activeAxes: Readonly<Record<string, string>>;\n cssVarPrefix: string;\n diagnostics: readonly VirtualDiagnosticShape[];\n css: string;\n}\n\n/**\n * Context carrying the full {@link ProjectSnapshot}. `null` sentinel lets\n * `useSwatchbookData()` tell \"provider present\" from \"fall back to the\n * virtual module\".\n */\nexport const SwatchbookContext = createContext<ProjectSnapshot | null>(null);\n\nexport function useOptionalSwatchbookData(): ProjectSnapshot | null {\n return useContext(SwatchbookContext);\n}\n\n/**\n * Active swatchbook theme for the current story/docs render. Populated by\n * the addon's preview decorator and consumed by `useToken` + any future\n * consumer hooks.\n *\n * This runs through plain React context rather than Storybook's\n * `useGlobals` so the same hook works in autodocs / MDX renders where the\n * preview-hooks context isn't available.\n */\nexport const ThemeContext = createContext<string>('');\n\nexport function useActiveTheme(): string {\n return useContext(ThemeContext);\n}\n\n/**\n * Active axis tuple for the current story/docs render — `Record<axisName,\n * contextName>`. Derived from the same input as {@link ThemeContext}; split\n * out so consumers needing per-axis info (toolbar, panel, tuple-aware\n * blocks) don't have to reparse the composed permutation ID.\n */\nexport const AxesContext = createContext<Readonly<Record<string, string>>>({});\n\nexport function useActiveAxes(): Readonly<Record<string, string>> {\n return useContext(AxesContext);\n}\n\n/**\n * Active color-display format for the current story/docs render. Populated\n * by the addon's preview decorator from the `swatchbookColorFormat` global\n * (per-story `globals` or toolbar dropdown) and consumed by blocks that\n * render color-token values. Emitted CSS is unaffected.\n *\n * Runs through plain React context rather than Storybook's `useGlobals` so\n * per-story seeded globals flow through on first render and the same hook\n * is safe to call from MDX doc blocks (where the preview-hooks context\n * isn't available).\n */\nexport const ColorFormatContext = createContext<ColorFormat | null>(null);\n\nexport function useColorFormat(): ColorFormat {\n const contextValue = useContext(ColorFormatContext);\n const channelGlobals = useChannelGlobals();\n return contextValue ?? channelGlobals.format ?? 'hex';\n}\n","import { useEffect } from 'react';\nimport { useActiveAxes, useActiveTheme, useOptionalSwatchbookData } from '#/contexts.ts';\nimport { useChannelGlobals } from '#/internal/channel-globals.ts';\nimport {\n axes as virtualAxes,\n css as generatedCss,\n cssVarPrefix,\n defaultTheme,\n themes,\n themesResolved,\n} from 'virtual:swatchbook/tokens';\nimport type { ProjectSnapshot, VirtualAxis, VirtualTheme, VirtualToken } from '#/types.ts';\n\ntype ResolvedTokens = Record<string, VirtualToken>;\n\nexport interface ProjectData {\n activeTheme: string;\n activeAxes: Record<string, string>;\n axes: readonly VirtualAxis[];\n themes: readonly VirtualTheme[];\n resolved: ResolvedTokens;\n themesResolved: Record<string, ResolvedTokens>;\n cssVarPrefix: string;\n}\n\nconst STYLE_ELEMENT_ID = 'swatchbook-tokens';\n\nfunction ensureStylesheet(css: string): void {\n if (typeof document === 'undefined') return;\n let style = document.getElementById(STYLE_ELEMENT_ID) as HTMLStyleElement | null;\n if (!style) {\n style = document.createElement('style');\n style.id = STYLE_ELEMENT_ID;\n document.head.appendChild(style);\n }\n if (style.textContent !== css) style.textContent = css;\n}\n\nfunction defaultTuple(axes: readonly VirtualAxis[]): Record<string, string> {\n const out: Record<string, string> = {};\n for (const axis of axes) out[axis.name] = axis.default;\n return out;\n}\n\nfunction tupleForName(\n themesList: readonly VirtualTheme[],\n name: string,\n): Record<string, string> | undefined {\n const match = themesList.find((t) => t.name === name);\n return match?.input;\n}\n\nfunction tuplesEqual(a: Record<string, string>, b: Record<string, string>): boolean {\n const keys = new Set([...Object.keys(a), ...Object.keys(b)]);\n for (const k of keys) {\n if (a[k] !== b[k]) return false;\n }\n return true;\n}\n\nfunction nameForTuple(\n themesList: readonly VirtualTheme[],\n tuple: Record<string, string>,\n): string | undefined {\n const match = themesList.find((t) => tuplesEqual(t.input as Record<string, string>, tuple));\n return match?.name;\n}\n\nfunction snapshotToData(snapshot: ProjectSnapshot): ProjectData {\n return {\n activeTheme: snapshot.activeTheme,\n activeAxes: { ...snapshot.activeAxes },\n axes: snapshot.axes,\n themes: snapshot.themes,\n themesResolved: snapshot.themesResolved,\n resolved: snapshot.themesResolved[snapshot.activeTheme] ?? {},\n cssVarPrefix: snapshot.cssVarPrefix,\n };\n}\n\n/**\n * Reads project data either from a mounted {@link SwatchbookProvider}\n * (preferred — the addon's preview decorator installs one around every\n * story) or — as a back-compat fallback — directly from the virtual\n * module plus Storybook globals.\n *\n * The fallback path is what makes the hook safe to call from MDX doc\n * blocks and autodocs renders where no story is active. It self-mounts\n * the virtual module's per-theme CSS and tracks the active tuple via the\n * `globalsUpdated` channel event; {@link useGlobals} from\n * `storybook/preview-api` would throw outside a story render.\n */\nexport function useProject(): ProjectData {\n const snapshot = useOptionalSwatchbookData();\n const fallback = useVirtualModuleFallback(snapshot === null);\n return snapshot !== null ? snapshotToData(snapshot) : fallback;\n}\n\nfunction useVirtualModuleFallback(enabled: boolean): ProjectData {\n const contextTheme = useActiveTheme();\n const contextAxes = useActiveAxes();\n const channelGlobals = useChannelGlobals();\n\n useEffect(() => {\n if (!enabled) return;\n ensureStylesheet(generatedCss);\n }, [enabled]);\n\n const hasContextAxes = Object.keys(contextAxes).length > 0;\n const activeAxes: Record<string, string> = hasContextAxes\n ? { ...contextAxes }\n : (channelGlobals.axes ?? defaultTuple(virtualAxes));\n\n const derivedName = nameForTuple(themes, activeAxes);\n const channelTheme = channelGlobals.theme;\n const fallbackTupleName =\n channelTheme && tupleForName(themes, channelTheme) ? channelTheme : null;\n const activeTheme =\n contextTheme ||\n derivedName ||\n fallbackTupleName ||\n channelTheme ||\n defaultTheme ||\n themes[0]?.name ||\n '';\n\n return {\n activeTheme,\n activeAxes,\n axes: virtualAxes,\n themes,\n themesResolved,\n resolved: themesResolved[activeTheme] ?? {},\n cssVarPrefix,\n };\n}\n\nexport function makeCssVar(path: string, prefix: string): string {\n const tail = path.replaceAll('.', '-');\n return prefix ? `var(--${prefix}-${tail})` : `var(--${tail})`;\n}\n\nexport function globMatch(path: string, glob: string | undefined): boolean {\n if (!glob) return true;\n if (glob === '*' || glob === '**') return true;\n if (glob.endsWith('.*')) return path.startsWith(`${glob.slice(0, -2)}.`);\n if (glob.endsWith('**')) return path.startsWith(glob.slice(0, -2));\n return path === glob || path.startsWith(`${glob}.`);\n}\n\nexport function formatValue(value: unknown): string {\n if (value == null) return '';\n if (typeof value === 'string' || typeof value === 'number') return String(value);\n if (typeof value === 'object') {\n const v = value as Record<string, unknown>;\n if (typeof v['hex'] === 'string') return v['hex'] as string;\n if ('value' in v && 'unit' in v) return `${String(v['value'])}${String(v['unit'])}`;\n return JSON.stringify(value).slice(0, 120);\n }\n return String(value);\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport interface BorderSampleProps {\n /** Full dot-path of the border token to preview. */\n path: string;\n}\n\nconst sampleStyle: CSSProperties = {\n width: 120,\n height: 56,\n background: 'var(--sb-color-sys-surface-raised, transparent)',\n borderRadius: 6,\n};\n\nexport function BorderSample({ path }: BorderSampleProps): ReactElement {\n const { cssVarPrefix } = useProject();\n const cssVar = makeCssVar(path, cssVarPrefix);\n return <div style={{ ...sampleStyle, border: cssVar }} aria-hidden />;\n}\n","import type { CSSProperties } from 'react';\n\nexport const MONO_STACK = 'ui-monospace, SFMono-Regular, Menlo, monospace';\n\nexport const BORDER_DEFAULT = '1px solid var(--sb-color-sys-border-default, rgba(128,128,128,0.2))';\n\nexport const BORDER_FAINT = '1px solid var(--sb-color-sys-border-default, rgba(128,128,128,0.15))';\n\nexport const surfaceStyle = {\n fontFamily: 'var(--sb-typography-sys-body-font-family, system-ui)',\n fontSize: 'var(--sb-typography-sys-body-font-size, 14px)',\n color: 'var(--sb-color-sys-text-default, CanvasText)',\n background: 'var(--sb-color-sys-surface-default, Canvas)',\n padding: 12,\n borderRadius: 6,\n} satisfies CSSProperties;\n\nexport const captionStyle = {\n padding: '4px 0 12px',\n opacity: 0.7,\n fontSize: 12,\n} satisfies CSSProperties;\n\nexport const emptyStyle = {\n padding: '24px 12px',\n textAlign: 'center',\n opacity: 0.6,\n} satisfies CSSProperties;\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport { BorderSample } from '#/border-preview/BorderSample.tsx';\nimport {\n BORDER_DEFAULT,\n captionStyle,\n emptyStyle,\n MONO_STACK,\n surfaceStyle,\n} from '#/internal/styles.ts';\nimport { globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport interface BorderPreviewProps {\n /**\n * Token-path filter. Defaults to every `border` token. Use e.g.\n * `\"border.sys.*\"` to scope to the semantic layer.\n */\n filter?: string;\n /** Override the caption. */\n caption?: string;\n}\n\nconst styles = {\n wrapper: surfaceStyle,\n caption: captionStyle,\n empty: emptyStyle,\n row: {\n display: 'grid',\n gridTemplateColumns: 'minmax(160px, 220px) 140px 1fr',\n gap: 16,\n alignItems: 'center',\n padding: '14px 0',\n borderBottom: BORDER_DEFAULT,\n } satisfies CSSProperties,\n meta: {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n minWidth: 0,\n } satisfies CSSProperties,\n path: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } satisfies CSSProperties,\n cssVar: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n opacity: 0.7,\n } satisfies CSSProperties,\n sampleCell: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n } satisfies CSSProperties,\n breakdown: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n display: 'grid',\n gridTemplateColumns: 'auto 1fr',\n columnGap: 12,\n rowGap: 2,\n } satisfies CSSProperties,\n breakdownKey: {\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n};\n\ninterface BorderValue {\n color?: unknown;\n width?: unknown;\n style?: unknown;\n}\n\ninterface Row {\n path: string;\n cssVar: string;\n value: BorderValue;\n}\n\nfunction formatDimension(raw: unknown): string {\n if (raw == null) return '—';\n if (typeof raw === 'number') return String(raw);\n if (typeof raw === 'string') return raw;\n if (typeof raw === 'object') {\n const v = raw as { value?: unknown; unit?: unknown };\n if (typeof v.value === 'number' && typeof v.unit === 'string') {\n return `${v.value}${v.unit}`;\n }\n }\n return JSON.stringify(raw);\n}\n\nfunction formatColor(raw: unknown): string {\n if (raw == null) return '—';\n if (typeof raw === 'string') return raw;\n if (typeof raw === 'object') {\n const v = raw as { components?: unknown; alpha?: unknown; colorSpace?: unknown };\n if (Array.isArray(v.components) && typeof v.colorSpace === 'string') {\n const parts = v.components.map((c) => (typeof c === 'number' ? c.toFixed(3) : String(c)));\n const alpha = typeof v.alpha === 'number' && v.alpha !== 1 ? `, ${v.alpha}` : '';\n return `${v.colorSpace}(${parts.join(' ')}${alpha})`;\n }\n }\n return JSON.stringify(raw);\n}\n\nexport function BorderPreview({ filter = 'border', caption }: BorderPreviewProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo(() => {\n const collected: Row[] = [];\n for (const [path, token] of Object.entries(resolved)) {\n if (token.$type !== 'border') continue;\n if (!globMatch(path, filter)) continue;\n collected.push({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n value: (token.$value ?? {}) as BorderValue,\n });\n }\n collected.sort((a, b) => a.path.localeCompare(b.path, undefined, { numeric: true }));\n return collected;\n }, [resolved, filter, cssVarPrefix]);\n\n const captionText =\n caption ??\n `${rows.length} border${rows.length === 1 ? '' : 's'}${filter ? ` matching \\`${filter}\\`` : ''} · ${activeTheme}`;\n\n if (rows.length === 0) {\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.empty}>No border tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.caption}>{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} style={styles.row}>\n <div style={styles.meta}>\n <span style={styles.path}>{row.path}</span>\n <span style={styles.cssVar}>{row.cssVar}</span>\n </div>\n <div style={styles.sampleCell}>\n <BorderSample path={row.path} />\n </div>\n <div style={styles.breakdown}>\n <span style={styles.breakdownKey}>width</span>\n <span>{formatDimension(row.value.width)}</span>\n <span style={styles.breakdownKey}>style</span>\n <span>{row.value.style != null ? String(row.value.style) : '—'}</span>\n <span style={styles.breakdownKey}>color</span>\n <span>{formatColor(row.value.color)}</span>\n </div>\n </div>\n ))}\n </div>\n );\n}\n","import type { ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport { useColorFormat } from '#/contexts.ts';\nimport { formatColor } from '#/format-color.ts';\nimport {\n BORDER_DEFAULT,\n captionStyle,\n emptyStyle,\n MONO_STACK,\n surfaceStyle,\n} from '#/internal/styles.ts';\nimport { globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport interface ColorPaletteProps {\n /**\n * Token-path filter. Defaults to every `color` token. Use e.g.\n * `\"color.sys.*\"` to scope to the semantic layer, or `\"color.ref.blue.*\"`\n * for a single ref ramp.\n */\n filter?: string;\n /**\n * Grouping depth. Tokens are grouped by the first `groupBy` dot-segments\n * of their path. `2` yields groups like `color.sys`, `color.ref`; `3`\n * yields `color.sys.surface`, `color.sys.text`, etc.\n *\n * If omitted, groupBy is derived from the filter: one level below the\n * filter's fixed prefix (segments before the first `*`), clamped so each\n * swatch still carries a leaf label. `\"color.sys.*\"` → groups at\n * `color.sys.<family>`; `\"color.ref.blue.*\"` collapses all shades into\n * one `color.ref.blue` group because the tokens have no deeper level.\n */\n groupBy?: number;\n /** Override the section caption. */\n caption?: string;\n}\n\nconst styles = {\n wrapper: surfaceStyle,\n caption: captionStyle,\n empty: emptyStyle,\n group: {\n marginBottom: 20,\n } satisfies React.CSSProperties,\n groupHeader: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n opacity: 0.6,\n marginBottom: 8,\n } satisfies React.CSSProperties,\n grid: {\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(120px, 1fr))',\n gap: 8,\n } satisfies React.CSSProperties,\n card: {\n border: BORDER_DEFAULT,\n borderRadius: 6,\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n } satisfies React.CSSProperties,\n swatch: {\n height: 56,\n width: '100%',\n borderBottom: '1px solid var(--sb-color-sys-border-default, rgba(0,0,0,0.08))',\n } satisfies React.CSSProperties,\n meta: {\n padding: '8px 10px',\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n } satisfies React.CSSProperties,\n leaf: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n } satisfies React.CSSProperties,\n value: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n opacity: 0.7,\n } satisfies React.CSSProperties,\n};\n\ninterface Swatch {\n path: string;\n leaf: string;\n cssVar: string;\n value: string;\n outOfGamut: boolean;\n}\n\n/**\n * Count segments in the filter before the first glob (`*` / `**`).\n * `color.ref.*` → 2; `color.sys.surface.*` → 3; `color` → 1; undefined → 0.\n */\nfunction fixedPrefixLength(filter: string | undefined): number {\n if (!filter) return 0;\n const segments = filter.split('.');\n let fixed = 0;\n for (const seg of segments) {\n if (seg === '*' || seg === '**') break;\n fixed += 1;\n }\n return fixed;\n}\n\nexport function ColorPalette({\n filter = 'color',\n groupBy,\n caption,\n}: ColorPaletteProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n const colorFormat = useColorFormat();\n\n const groups = useMemo(() => {\n const entries = Object.entries(resolved)\n .filter(([path, token]) => {\n if (token.$type !== 'color') return false;\n return globMatch(path, filter);\n })\n .toSorted(([a], [b]) => a.localeCompare(b, undefined, { numeric: true }));\n\n const maxDepth = entries.reduce((m, [p]) => Math.max(m, p.split('.').length), 0);\n /**\n * Auto-derive: group one level below the filter's fixed prefix, but\n * clamp so each swatch retains at least one leaf segment. A filter\n * like `color.ref.blue.*` (fixed length 3) with only 4-segment tokens\n * would try groupBy=4 → one-per-group; clamp to `maxDepth - 1` so the\n * whole ramp lands in one group with each shade as a leaf.\n */\n const effectiveGroupBy =\n groupBy ?? Math.min(fixedPrefixLength(filter) + 1, Math.max(maxDepth - 1, 1));\n\n const bucket = new Map<string, Swatch[]>();\n for (const [path, token] of entries) {\n const segments = path.split('.');\n const groupKey = segments.slice(0, effectiveGroupBy).join('.');\n const leaf = segments.slice(effectiveGroupBy).join('.') || segments.at(-1) || path;\n const list = bucket.get(groupKey) ?? [];\n const formatted = formatColor(token.$value, colorFormat);\n list.push({\n path,\n leaf,\n cssVar: makeCssVar(path, cssVarPrefix),\n value: formatted.value,\n outOfGamut: formatted.outOfGamut,\n });\n bucket.set(groupKey, list);\n }\n\n return [...bucket.entries()].toSorted(([a], [b]) =>\n a.localeCompare(b, undefined, { numeric: true }),\n );\n }, [resolved, filter, groupBy, cssVarPrefix, colorFormat]);\n\n const totalCount = groups.reduce((acc, [, swatches]) => acc + swatches.length, 0);\n const captionText =\n caption ??\n `${totalCount} color${totalCount === 1 ? '' : 's'}${filter ? ` matching \\`${filter}\\`` : ''} · ${activeTheme}`;\n\n if (totalCount === 0) {\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.empty}>No color tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.caption}>{captionText}</div>\n {groups.map(([group, swatches]) => (\n <section key={group} style={styles.group}>\n <div style={styles.groupHeader}>{group}</div>\n <div style={styles.grid}>\n {swatches.map((swatch) => (\n <div key={swatch.path} style={styles.card}>\n <div style={{ ...styles.swatch, background: swatch.cssVar }} aria-hidden />\n <div style={styles.meta}>\n <span style={styles.leaf}>{swatch.leaf}</span>\n <span style={styles.value}>\n {swatch.value}\n {swatch.outOfGamut && (\n <span\n title='Out of sRGB gamut for this format'\n aria-label='out of gamut'\n style={{ marginLeft: 4 }}\n >\n {' '}\n ⚠\n </span>\n )}\n </span>\n </div>\n </div>\n ))}\n </div>\n </section>\n ))}\n </div>\n );\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport type DimensionKind = 'length' | 'radius' | 'size';\n\nexport interface DimensionBarProps {\n /** Full dot-path of the dimension token to preview. */\n path: string;\n /**\n * Visualization kind:\n * - `'length'` (default): horizontal bar whose width equals the token's dimension.\n * - `'radius'`: 56×56 square with the token applied as `border-radius`.\n * - `'size'`: a square sized to the token's dimension.\n */\n kind?: DimensionKind;\n}\n\nconst MAX_RENDER_PX = 480;\n\nconst styles = {\n bar: {\n height: 14,\n background: 'var(--sb-color-sys-accent-bg, #3b82f6)',\n borderRadius: 2,\n minWidth: 1,\n } satisfies CSSProperties,\n radiusSample: {\n width: 56,\n height: 56,\n background: 'var(--sb-color-sys-accent-bg, #3b82f6)',\n border: '1px solid var(--sb-color-sys-border-default, rgba(128,128,128,0.3))',\n } satisfies CSSProperties,\n sizeSample: {\n background: 'var(--sb-color-sys-accent-bg, #3b82f6)',\n border: '1px solid var(--sb-color-sys-border-default, rgba(128,128,128,0.3))',\n minWidth: 1,\n minHeight: 1,\n } satisfies CSSProperties,\n};\n\n/**\n * Convert a DTCG dimension `$value` (`{ value, unit }`) to pixels for the\n * purpose of deciding whether to cap the rendered bar. Returns `NaN` for\n * units we can't reasonably approximate (ex / ch / %), which the caller\n * treats as \"render at cssVar but don't cap\".\n */\nfunction toPixels(raw: unknown): number {\n if (raw == null || typeof raw !== 'object') return Number.NaN;\n const v = raw as { value?: unknown; unit?: unknown };\n if (typeof v.value !== 'number' || typeof v.unit !== 'string') return Number.NaN;\n switch (v.unit) {\n case 'px':\n return v.value;\n case 'rem':\n case 'em':\n return v.value * 16;\n default:\n return Number.NaN;\n }\n}\n\nexport function DimensionBar({ path, kind = 'length' }: DimensionBarProps): ReactElement {\n const { resolved, cssVarPrefix } = useProject();\n const cssVar = makeCssVar(path, cssVarPrefix);\n const token = resolved[path];\n const pxValue = toPixels(token?.$value);\n const capped = Number.isFinite(pxValue) && pxValue > MAX_RENDER_PX;\n const cappedValue = capped ? `${MAX_RENDER_PX}px` : cssVar;\n\n switch (kind) {\n case 'radius':\n return <div style={{ ...styles.radiusSample, borderRadius: cssVar }} aria-hidden />;\n case 'size':\n return (\n <div\n style={{ ...styles.sizeSample, width: cappedValue, height: cappedValue }}\n aria-hidden\n />\n );\n case 'length':\n default:\n return <div style={{ ...styles.bar, width: cappedValue }} aria-hidden />;\n }\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport { DimensionBar, type DimensionKind } from '#/dimension-scale/DimensionBar.tsx';\nimport {\n BORDER_DEFAULT,\n captionStyle,\n emptyStyle,\n MONO_STACK,\n surfaceStyle,\n} from '#/internal/styles.ts';\nimport { formatValue, globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport type { DimensionKind };\n\nexport interface DimensionScaleProps {\n /**\n * Token-path filter. Defaults to every `dimension` token. Use e.g.\n * `\"space.sys.*\"` to scope to the spacing scale.\n */\n filter?: string;\n /**\n * Visualization kind:\n * - `'length'` (default): horizontal bar whose width equals the token's dimension.\n * - `'radius'`: 56×56 square with the token applied as `border-radius`.\n * - `'size'`: a square sized to the token's dimension.\n */\n kind?: DimensionKind;\n /** Override the caption. */\n caption?: string;\n}\n\nconst MAX_RENDER_PX = 480;\n\nconst styles = {\n wrapper: surfaceStyle,\n caption: captionStyle,\n empty: emptyStyle,\n row: {\n display: 'grid',\n gridTemplateColumns: 'minmax(160px, 220px) 1fr auto',\n gap: 16,\n alignItems: 'center',\n padding: '10px 0',\n borderBottom: BORDER_DEFAULT,\n } satisfies CSSProperties,\n meta: {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n minWidth: 0,\n } satisfies CSSProperties,\n path: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } satisfies CSSProperties,\n specs: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n opacity: 0.7,\n } satisfies CSSProperties,\n visualCell: {\n display: 'flex',\n alignItems: 'center',\n minWidth: 0,\n } satisfies CSSProperties,\n cssVar: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n opacity: 0.7,\n whiteSpace: 'nowrap',\n } satisfies CSSProperties,\n cap: {\n fontFamily: MONO_STACK,\n fontSize: 10,\n opacity: 0.6,\n marginLeft: 6,\n } satisfies CSSProperties,\n};\n\ninterface Row {\n path: string;\n cssVar: string;\n displayValue: string;\n pxValue: number;\n capped: boolean;\n}\n\n/**\n * Convert a DTCG dimension `$value` (`{ value, unit }`) to pixels for the\n * purpose of ordering and deciding whether to show a cap indicator.\n */\nfunction toPixels(raw: unknown): number {\n if (raw == null || typeof raw !== 'object') return Number.NaN;\n const v = raw as { value?: unknown; unit?: unknown };\n if (typeof v.value !== 'number' || typeof v.unit !== 'string') return Number.NaN;\n switch (v.unit) {\n case 'px':\n return v.value;\n case 'rem':\n case 'em':\n return v.value * 16;\n default:\n return Number.NaN;\n }\n}\n\nexport function DimensionScale({\n filter = 'dimension',\n kind = 'length',\n caption,\n}: DimensionScaleProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo(() => {\n const collected: Row[] = [];\n for (const [path, token] of Object.entries(resolved)) {\n if (token.$type !== 'dimension') continue;\n if (!globMatch(path, filter)) continue;\n const pxValue = toPixels(token.$value);\n collected.push({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n displayValue: formatValue(token.$value),\n pxValue,\n capped: Number.isFinite(pxValue) && pxValue > MAX_RENDER_PX,\n });\n }\n collected.sort((a, b) => {\n if (Number.isFinite(a.pxValue) && Number.isFinite(b.pxValue)) return a.pxValue - b.pxValue;\n return a.path.localeCompare(b.path, undefined, { numeric: true });\n });\n return collected;\n }, [resolved, filter, cssVarPrefix]);\n\n const captionText =\n caption ??\n `${rows.length} dimension${rows.length === 1 ? '' : 's'}${filter ? ` matching \\`${filter}\\`` : ''} · ${activeTheme}`;\n\n if (rows.length === 0) {\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.empty}>No dimension tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.caption}>{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} style={styles.row}>\n <div style={styles.meta}>\n <span style={styles.path}>{row.path}</span>\n <span style={styles.specs}>{row.displayValue}</span>\n </div>\n <div style={styles.visualCell}>\n <DimensionBar path={row.path} kind={kind} />\n {row.capped && <span style={styles.cap}>capped at {MAX_RENDER_PX}px</span>}\n </div>\n <span style={styles.cssVar}>{row.cssVar}</span>\n </div>\n ))}\n </div>\n );\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport {\n BORDER_DEFAULT,\n captionStyle,\n emptyStyle,\n MONO_STACK,\n surfaceStyle,\n} from '#/internal/styles.ts';\nimport { globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport interface FontFamilySampleProps {\n /**\n * Token-path filter. Defaults to every `fontFamily` token. Use e.g.\n * `\"font.ref.family.*\"` to scope to the ref layer.\n */\n filter?: string;\n /** Override the sample text rendered for each token. */\n sample?: string;\n /** Override the caption. */\n caption?: string;\n}\n\nconst styles = {\n wrapper: surfaceStyle,\n caption: captionStyle,\n row: {\n display: 'grid',\n gridTemplateColumns: 'minmax(160px, 220px) 1fr auto',\n gap: 16,\n alignItems: 'baseline',\n padding: '14px 0',\n borderBottom: BORDER_DEFAULT,\n } satisfies CSSProperties,\n meta: {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n minWidth: 0,\n } satisfies CSSProperties,\n path: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } satisfies CSSProperties,\n stack: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n sample: {\n fontSize: 22,\n lineHeight: 1.2,\n } satisfies CSSProperties,\n cssVar: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n empty: emptyStyle,\n};\n\ninterface Row {\n path: string;\n cssVar: string;\n stack: string;\n}\n\nfunction stackString(raw: unknown): string {\n if (typeof raw === 'string') return raw;\n if (Array.isArray(raw)) return raw.map(String).join(', ');\n return '';\n}\n\nexport function FontFamilySample({\n filter = 'fontFamily',\n sample = 'The quick brown fox jumps over the lazy dog.',\n caption,\n}: FontFamilySampleProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n return Object.entries(resolved)\n .filter(([path, token]) => {\n if (token.$type !== 'fontFamily') return false;\n return globMatch(path, filter);\n })\n .toSorted(([a], [b]) => a.localeCompare(b, undefined, { numeric: true }))\n .map(([path, token]) => ({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n stack: stackString(token.$value),\n }));\n }, [resolved, filter, cssVarPrefix]);\n\n const captionText =\n caption ??\n `${rows.length} fontFamily token${rows.length === 1 ? '' : 's'}${filter && filter !== 'fontFamily' ? ` matching \\`${filter}\\`` : ''} · ${activeTheme}`;\n\n if (rows.length === 0) {\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.empty}>No fontFamily tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.caption}>{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} style={styles.row}>\n <div style={styles.meta}>\n <span style={styles.path}>{row.path}</span>\n <span style={styles.stack}>{row.stack}</span>\n </div>\n <div style={{ ...styles.sample, fontFamily: row.cssVar }}>{sample}</div>\n <span style={styles.cssVar}>{row.cssVar}</span>\n </div>\n ))}\n </div>\n );\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport {\n BORDER_DEFAULT,\n captionStyle,\n emptyStyle,\n MONO_STACK,\n surfaceStyle,\n} from '#/internal/styles.ts';\nimport { globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport interface FontWeightScaleProps {\n /**\n * Token-path filter. Defaults to every `fontWeight` token. Use e.g.\n * `\"font.ref.weight.*\"` to scope to the ref layer.\n */\n filter?: string;\n /** Override the sample text rendered for each token. */\n sample?: string;\n /** Override the caption. */\n caption?: string;\n}\n\nconst styles = {\n wrapper: surfaceStyle,\n caption: captionStyle,\n empty: emptyStyle,\n row: {\n display: 'grid',\n gridTemplateColumns: 'minmax(160px, 220px) 1fr auto',\n gap: 16,\n alignItems: 'baseline',\n padding: '12px 0',\n borderBottom: BORDER_DEFAULT,\n } satisfies CSSProperties,\n meta: {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n minWidth: 0,\n } satisfies CSSProperties,\n path: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } satisfies CSSProperties,\n value: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n sample: {\n fontSize: 28,\n lineHeight: 1,\n } satisfies CSSProperties,\n cssVar: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n};\n\ninterface Row {\n path: string;\n cssVar: string;\n display: string;\n weight: number;\n}\n\nfunction toWeight(raw: unknown): number {\n if (typeof raw === 'number') return raw;\n if (typeof raw === 'string') {\n const n = Number.parseInt(raw, 10);\n return Number.isFinite(n) ? n : Number.NaN;\n }\n return Number.NaN;\n}\n\nexport function FontWeightScale({\n filter = 'fontWeight',\n sample = 'Aa',\n caption,\n}: FontWeightScaleProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n const collected: Row[] = [];\n for (const [path, token] of Object.entries(resolved)) {\n if (token.$type !== 'fontWeight') continue;\n if (!globMatch(path, filter)) continue;\n collected.push({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n display: token.$value == null ? '' : String(token.$value),\n weight: toWeight(token.$value),\n });\n }\n collected.sort((a, b) => {\n if (Number.isFinite(a.weight) && Number.isFinite(b.weight)) return a.weight - b.weight;\n return a.path.localeCompare(b.path, undefined, { numeric: true });\n });\n return collected;\n }, [resolved, filter, cssVarPrefix]);\n\n const captionText =\n caption ??\n `${rows.length} fontWeight token${rows.length === 1 ? '' : 's'}${filter && filter !== 'fontWeight' ? ` matching \\`${filter}\\`` : ''} · ${activeTheme}`;\n\n if (rows.length === 0) {\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.empty}>No fontWeight tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.caption}>{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} style={styles.row}>\n <div style={styles.meta}>\n <span style={styles.path}>{row.path}</span>\n <span style={styles.value}>{row.display}</span>\n </div>\n <div\n style={{\n ...styles.sample,\n fontWeight: row.cssVar as unknown as CSSProperties['fontWeight'],\n }}\n >\n {sample}\n </div>\n <span style={styles.cssVar}>{row.cssVar}</span>\n </div>\n ))}\n </div>\n );\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport {\n BORDER_DEFAULT,\n BORDER_FAINT,\n captionStyle,\n emptyStyle,\n MONO_STACK,\n surfaceStyle,\n} from '#/internal/styles.ts';\nimport { globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport interface GradientPaletteProps {\n /**\n * Token-path filter. Defaults to every `gradient` token. Use e.g.\n * `\"gradient.ref.*\"` or `\"gradient.sys.accent\"` to scope.\n */\n filter?: string;\n /** Override the caption. */\n caption?: string;\n}\n\nconst styles = {\n wrapper: surfaceStyle,\n caption: captionStyle,\n empty: emptyStyle,\n row: {\n display: 'grid',\n gridTemplateColumns: 'minmax(180px, 240px) 1fr minmax(140px, 220px)',\n gap: 16,\n alignItems: 'center',\n padding: '16px 0',\n borderBottom: BORDER_DEFAULT,\n } satisfies CSSProperties,\n meta: {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n minWidth: 0,\n } satisfies CSSProperties,\n path: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } satisfies CSSProperties,\n cssVar: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n opacity: 0.7,\n } satisfies CSSProperties,\n sample: {\n height: 56,\n borderRadius: 6,\n border: BORDER_FAINT,\n } satisfies CSSProperties,\n stops: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n } satisfies CSSProperties,\n stopRow: {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n } satisfies CSSProperties,\n stopSwatch: {\n width: 10,\n height: 10,\n borderRadius: 2,\n border: '1px solid var(--sb-color-sys-border-default, rgba(0,0,0,0.1))',\n flex: '0 0 auto',\n } satisfies CSSProperties,\n stopPosition: {\n opacity: 0.6,\n } satisfies CSSProperties,\n};\n\ninterface GradientStop {\n color?: {\n colorSpace?: string;\n components?: readonly number[];\n alpha?: number;\n };\n position?: number;\n}\n\ninterface Row {\n path: string;\n cssVar: string;\n stops: GradientStop[];\n}\n\nfunction asStops(raw: unknown): GradientStop[] {\n if (!Array.isArray(raw)) return [];\n return raw as GradientStop[];\n}\n\nconst pct = (n: number): string => `${(n * 100).toFixed(3)}%`;\n\nfunction stopCssColor(stop: GradientStop): string {\n const color = stop.color;\n if (!color || !Array.isArray(color.components) || color.components.length < 3) {\n return 'transparent';\n }\n const [r, g, b] = color.components;\n if (r === undefined || g === undefined || b === undefined) return 'transparent';\n const alpha = color.alpha ?? 1;\n return alpha === 1\n ? `rgb(${pct(r)} ${pct(g)} ${pct(b)})`\n : `rgb(${pct(r)} ${pct(g)} ${pct(b)} / ${alpha})`;\n}\n\nfunction stopKey(path: string, stop: GradientStop, fallback: number): string {\n return `${path}|${stop.position ?? fallback}|${stopCssColor(stop)}`;\n}\n\nexport function GradientPalette({\n filter = 'gradient',\n caption,\n}: GradientPaletteProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo(() => {\n const collected: Row[] = [];\n for (const [path, token] of Object.entries(resolved)) {\n if (token.$type !== 'gradient') continue;\n if (!globMatch(path, filter)) continue;\n collected.push({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n stops: asStops(token.$value),\n });\n }\n collected.sort((a, b) => a.path.localeCompare(b.path, undefined, { numeric: true }));\n return collected;\n }, [resolved, filter, cssVarPrefix]);\n\n const captionText =\n caption ??\n `${rows.length} gradient${rows.length === 1 ? '' : 's'}${filter ? ` matching \\`${filter}\\`` : ''} · ${activeTheme}`;\n\n if (rows.length === 0) {\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.empty}>No gradient tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.caption}>{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} style={styles.row}>\n <div style={styles.meta}>\n <span style={styles.path}>{row.path}</span>\n <span style={styles.cssVar}>{row.cssVar}</span>\n </div>\n <div\n style={{ ...styles.sample, background: `linear-gradient(to right, ${row.cssVar})` }}\n aria-hidden\n />\n <div style={styles.stops}>\n {row.stops.map((stop, i) => (\n <div key={stopKey(row.path, stop, i)} style={styles.stopRow}>\n <span\n style={{ ...styles.stopSwatch, background: stopCssColor(stop) }}\n aria-hidden\n />\n <span>{stopCssColor(stop)}</span>\n <span style={styles.stopPosition}>\n @ {((stop.position ?? 0) * 100).toFixed(0)}%\n </span>\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\n\n/**\n * Reactive `prefers-reduced-motion: reduce` detector. Returns the current\n * match and updates if the user toggles the OS-level preference.\n */\nexport function usePrefersReducedMotion(): boolean {\n const [reduced, setReduced] = useState(false);\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const query = window.matchMedia('(prefers-reduced-motion: reduce)');\n setReduced(query.matches);\n const onChange = (e: MediaQueryListEvent): void => setReduced(e.matches);\n query.addEventListener('change', onChange);\n return () => query.removeEventListener('change', onChange);\n }, []);\n return reduced;\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { usePrefersReducedMotion } from '#/internal/prefers-reduced-motion.ts';\nimport { useProject } from '#/internal/use-project.ts';\n\nexport type MotionSpeed = 0.25 | 0.5 | 1 | 2;\n\nexport interface MotionSampleProps {\n /** Full dot-path of the motion token (`transition`, `duration`, or `cubicBezier`). */\n path: string;\n /** Playback speed multiplier. Defaults to `1`. */\n speed?: MotionSpeed;\n /**\n * Change this value to force the animation to restart. Useful when an\n * outer block exposes a \"replay\" button that should re-trigger every\n * sample at once.\n */\n runKey?: number;\n}\n\nconst DEFAULT_DURATION_MS = 300;\nconst DEFAULT_EASING = 'cubic-bezier(0.2, 0, 0, 1)';\n\nconst styles = {\n track: {\n position: 'relative',\n height: 36,\n background: 'var(--sb-color-sys-surface-muted, rgba(128,128,128,0.08))',\n borderRadius: 18,\n overflow: 'hidden',\n } satisfies CSSProperties,\n ball: {\n position: 'absolute',\n top: '50%',\n width: 28,\n height: 28,\n marginTop: -14,\n borderRadius: '50%',\n background: 'var(--sb-color-sys-accent-bg, #3b82f6)',\n } satisfies CSSProperties,\n reducedMotion: {\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n fontStyle: 'italic',\n } satisfies CSSProperties,\n};\n\ninterface Spec {\n durationMs: number;\n easing: string;\n}\n\nfunction extractDurationMs(raw: unknown): number {\n if (raw == null) return Number.NaN;\n if (typeof raw === 'object') {\n const v = raw as { value?: unknown; unit?: unknown };\n if (typeof v.value === 'number' && typeof v.unit === 'string') {\n if (v.unit === 'ms') return v.value;\n if (v.unit === 's') return v.value * 1000;\n }\n }\n return Number.NaN;\n}\n\nfunction extractCubicBezier(raw: unknown): string | null {\n if (Array.isArray(raw) && raw.length === 4 && raw.every((n) => typeof n === 'number')) {\n return `cubic-bezier(${raw.map((n) => Number(n).toFixed(3)).join(', ')})`;\n }\n return null;\n}\n\nfunction asDuration(\n raw: unknown,\n themeTokens: Record<string, { $value?: unknown }>,\n fallback: number,\n): number {\n const direct = extractDurationMs(raw);\n if (Number.isFinite(direct)) return direct;\n if (typeof raw === 'string') {\n const match = raw.match(/^\\{([^}]+)\\}$/);\n if (match && match[1]) {\n const referenced = themeTokens[match[1]];\n const resolved = extractDurationMs(referenced?.$value);\n if (Number.isFinite(resolved)) return resolved;\n }\n }\n return fallback;\n}\n\nfunction asEasing(\n raw: unknown,\n themeTokens: Record<string, { $value?: unknown }>,\n fallback: string,\n): string {\n const direct = extractCubicBezier(raw);\n if (direct) return direct;\n if (typeof raw === 'string') {\n const match = raw.match(/^\\{([^}]+)\\}$/);\n if (match && match[1]) {\n const referenced = themeTokens[match[1]];\n const resolved = extractCubicBezier(referenced?.$value);\n if (resolved) return resolved;\n }\n }\n return fallback;\n}\n\nexport function resolveMotionSpec(\n token: { $type?: string; $value?: unknown } | undefined,\n themeTokens: Record<string, { $value?: unknown }>,\n): Spec | null {\n if (!token) return null;\n const type = token.$type;\n if (type === 'transition') {\n const v = (token.$value ?? {}) as {\n duration?: unknown;\n timingFunction?: unknown;\n };\n return {\n durationMs: asDuration(v.duration, themeTokens, DEFAULT_DURATION_MS),\n easing: asEasing(v.timingFunction, themeTokens, DEFAULT_EASING),\n };\n }\n if (type === 'duration') {\n const durationMs = extractDurationMs(token.$value);\n if (!Number.isFinite(durationMs)) return null;\n return { durationMs, easing: DEFAULT_EASING };\n }\n if (type === 'cubicBezier') {\n const easing = extractCubicBezier(token.$value);\n if (!easing) return null;\n return { durationMs: DEFAULT_DURATION_MS, easing };\n }\n return null;\n}\n\nexport function MotionSample({ path, speed = 1, runKey = 0 }: MotionSampleProps): ReactElement {\n const { resolved } = useProject();\n const reducedMotion = usePrefersReducedMotion();\n\n const spec = useMemo(() => resolveMotionSpec(resolved[path], resolved), [resolved, path]);\n\n const durationMs = spec?.durationMs ?? DEFAULT_DURATION_MS;\n const easing = spec?.easing ?? DEFAULT_EASING;\n const scaledDuration = Math.max(1, durationMs / speed);\n\n const [phase, setPhase] = useState<0 | 1>(0);\n\n useEffect(() => {\n if (reducedMotion) return;\n setPhase(0);\n const id = requestAnimationFrame(() => setPhase(1));\n const loop = window.setInterval(() => {\n setPhase((p) => (p === 0 ? 1 : 0));\n }, scaledDuration * 2);\n return () => {\n cancelAnimationFrame(id);\n window.clearInterval(loop);\n };\n }, [scaledDuration, runKey, reducedMotion]);\n\n if (reducedMotion) {\n return (\n <div style={styles.reducedMotion}>\n Animation suppressed by `prefers-reduced-motion: reduce`.\n </div>\n );\n }\n\n return (\n <div style={styles.track}>\n <div\n style={{\n ...styles.ball,\n left: phase === 1 ? 'calc(100% - 32px)' : '4px',\n transition: `left ${scaledDuration}ms ${easing}`,\n }}\n aria-hidden\n />\n </div>\n );\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useMemo, useState } from 'react';\nimport { usePrefersReducedMotion } from '#/internal/prefers-reduced-motion.ts';\nimport { BORDER_DEFAULT, MONO_STACK, surfaceStyle } from '#/internal/styles.ts';\nimport { globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\nimport {\n MotionSample,\n type MotionSpeed,\n resolveMotionSpec,\n} from '#/motion-preview/MotionSample.tsx';\n\nexport type { MotionSpeed };\n\nexport interface MotionPreviewProps {\n /**\n * Token-path filter. Defaults to transition + duration + cubicBezier\n * tokens. Use e.g. `\"motion.sys.*\"` to scope to the semantic layer.\n */\n filter?: string;\n /** Override the caption. */\n caption?: string;\n}\n\nconst SPEEDS: MotionSpeed[] = [0.25, 0.5, 1, 2];\n\nconst styles = {\n wrapper: surfaceStyle,\n caption: {\n padding: '4px 0 4px',\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n fontSize: 12,\n } satisfies CSSProperties,\n controls: {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '8px 0 12px',\n } satisfies CSSProperties,\n controlLabel: {\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n } satisfies CSSProperties,\n speedBtn: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n padding: '4px 8px',\n background: 'transparent',\n color: 'inherit',\n border: '1px solid var(--sb-color-sys-border-default, rgba(128,128,128,0.3))',\n borderRadius: 4,\n cursor: 'pointer',\n } satisfies CSSProperties,\n speedBtnActive: {\n background: 'var(--sb-color-sys-accent-bg, #3b82f6)',\n color: 'var(--sb-color-sys-accent-fg, #fff)',\n borderColor: 'transparent',\n } satisfies CSSProperties,\n replayBtn: {\n fontSize: 11,\n padding: '4px 10px',\n marginLeft: 'auto',\n background: 'transparent',\n color: 'inherit',\n border: '1px solid var(--sb-color-sys-border-default, rgba(128,128,128,0.3))',\n borderRadius: 4,\n cursor: 'pointer',\n } satisfies CSSProperties,\n row: {\n display: 'grid',\n gridTemplateColumns: 'minmax(180px, 240px) 1fr auto',\n gap: 16,\n alignItems: 'center',\n padding: '14px 0',\n borderBottom: BORDER_DEFAULT,\n } satisfies CSSProperties,\n meta: {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n minWidth: 0,\n } satisfies CSSProperties,\n path: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } satisfies CSSProperties,\n specs: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n cssVar: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n whiteSpace: 'nowrap',\n } satisfies CSSProperties,\n empty: {\n padding: '24px 12px',\n textAlign: 'center',\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n};\n\ninterface Row {\n path: string;\n cssVar: string;\n durationMs: number;\n easing: string;\n kind: 'transition' | 'duration' | 'cubicBezier';\n}\n\nfunction formatSpec(row: Row): string {\n switch (row.kind) {\n case 'transition':\n return `transition · ${Math.round(row.durationMs)}ms · ${row.easing}`;\n case 'duration':\n return `duration · ${Math.round(row.durationMs)}ms`;\n case 'cubicBezier':\n return `cubicBezier · ${row.easing}`;\n }\n}\n\nexport function MotionPreview({ filter, caption }: MotionPreviewProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n const [speed, setSpeed] = useState<MotionSpeed>(1);\n const [run, setRun] = useState(0);\n const reducedMotion = usePrefersReducedMotion();\n\n const rows = useMemo(() => {\n const collected: Row[] = [];\n for (const [path, token] of Object.entries(resolved)) {\n if (filter && !globMatch(path, filter)) continue;\n if (!filter && !['transition', 'duration', 'cubicBezier'].includes(token.$type ?? '')) {\n continue;\n }\n const kind = token.$type as Row['kind'] | undefined;\n if (!kind) continue;\n const spec = resolveMotionSpec(token, resolved);\n if (!spec) continue;\n collected.push({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n durationMs: spec.durationMs,\n easing: spec.easing,\n kind,\n });\n }\n collected.sort((a, b) => {\n if (a.kind !== b.kind) return a.kind.localeCompare(b.kind);\n return a.path.localeCompare(b.path, undefined, { numeric: true });\n });\n return collected;\n }, [resolved, filter, cssVarPrefix]);\n\n const captionText =\n caption ??\n `${rows.length} motion token${rows.length === 1 ? '' : 's'}${filter ? ` matching \\`${filter}\\`` : ''} · ${activeTheme}`;\n\n if (rows.length === 0) {\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.empty}>No motion tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.caption}>{captionText}</div>\n <div style={styles.controls}>\n <span style={styles.controlLabel}>Speed</span>\n {SPEEDS.map((s) => (\n <button\n key={s}\n type='button'\n style={{ ...styles.speedBtn, ...(s === speed ? styles.speedBtnActive : {}) }}\n onClick={() => setSpeed(s)}\n >\n {s}×\n </button>\n ))}\n <button\n type='button'\n style={styles.replayBtn}\n onClick={() => setRun((n) => n + 1)}\n disabled={reducedMotion}\n title={reducedMotion ? 'Disabled by prefers-reduced-motion' : 'Replay all'}\n >\n ↻ Replay\n </button>\n </div>\n {rows.map((row) => (\n <div key={row.path} style={styles.row}>\n <div style={styles.meta}>\n <span style={styles.path}>{row.path}</span>\n <span style={styles.specs}>{formatSpec(row)}</span>\n </div>\n <MotionSample path={row.path} speed={speed} runKey={run} />\n <span style={styles.cssVar}>{row.cssVar}</span>\n </div>\n ))}\n </div>\n );\n}\n","import type { ReactElement, ReactNode } from 'react';\nimport { type ProjectSnapshot, SwatchbookContext, useOptionalSwatchbookData } from '#/contexts.ts';\n\nexport type { ProjectSnapshot };\n\nexport interface SwatchbookProviderProps {\n value: ProjectSnapshot;\n children: ReactNode;\n}\n\n/**\n * Wraps a tree of blocks with the token data they need to render.\n *\n * The Storybook addon's preview decorator mounts this automatically, so\n * story/MDX authors typically never see it. Outside Storybook — unit\n * tests, custom React apps, non-Storybook doc sites — consumers construct\n * a {@link ProjectSnapshot} (often imported from a JSON file) and wrap\n * their blocks in this provider.\n */\nexport function SwatchbookProvider({ value, children }: SwatchbookProviderProps): ReactElement {\n return <SwatchbookContext.Provider value={value}>{children}</SwatchbookContext.Provider>;\n}\n\n/**\n * Read the current {@link ProjectSnapshot}. Throws if called outside a\n * {@link SwatchbookProvider}; blocks that need to fall back to the\n * virtual module go through the internal `useProject()` hook instead.\n */\nexport function useSwatchbookData(): ProjectSnapshot {\n const value = useOptionalSwatchbookData();\n if (!value) {\n throw new Error(\n '[swatchbook-blocks] useSwatchbookData() called outside <SwatchbookProvider>. ' +\n 'Wrap your tree in <SwatchbookProvider value={snapshot}> or render inside a Storybook story.',\n );\n }\n return value;\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport interface ShadowSampleProps {\n /** Full dot-path of the shadow token to preview. */\n path: string;\n}\n\nconst sampleStyle: CSSProperties = {\n width: 120,\n height: 56,\n background: 'var(--sb-color-sys-surface-raised, #fff)',\n border: '1px solid var(--sb-color-sys-border-default, rgba(128,128,128,0.15))',\n borderRadius: 6,\n};\n\nexport function ShadowSample({ path }: ShadowSampleProps): ReactElement {\n const { cssVarPrefix } = useProject();\n const cssVar = makeCssVar(path, cssVarPrefix);\n return <div style={{ ...sampleStyle, boxShadow: cssVar }} aria-hidden />;\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport {\n BORDER_DEFAULT,\n captionStyle,\n emptyStyle,\n MONO_STACK,\n surfaceStyle,\n} from '#/internal/styles.ts';\nimport { globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\nimport { ShadowSample } from '#/shadow-preview/ShadowSample.tsx';\n\nexport interface ShadowPreviewProps {\n /**\n * Token-path filter. Defaults to every `shadow` token. Use e.g.\n * `\"shadow.sys.*\"` to scope to the semantic layer.\n */\n filter?: string;\n /** Override the caption. */\n caption?: string;\n}\n\nconst styles = {\n wrapper: surfaceStyle,\n caption: captionStyle,\n empty: emptyStyle,\n row: {\n display: 'grid',\n gridTemplateColumns: 'minmax(160px, 220px) 140px 1fr',\n gap: 16,\n alignItems: 'center',\n padding: '16px 0',\n borderBottom: BORDER_DEFAULT,\n } satisfies CSSProperties,\n meta: {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n minWidth: 0,\n } satisfies CSSProperties,\n path: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } satisfies CSSProperties,\n cssVar: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n opacity: 0.7,\n } satisfies CSSProperties,\n sampleCell: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: 96,\n } satisfies CSSProperties,\n breakdown: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n display: 'grid',\n gridTemplateColumns: 'auto 1fr',\n columnGap: 12,\n rowGap: 2,\n } satisfies CSSProperties,\n breakdownKey: {\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n layerHeader: {\n fontSize: 10,\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n marginTop: 6,\n } satisfies CSSProperties,\n};\n\ninterface ShadowLayer {\n color?: unknown;\n offsetX?: unknown;\n offsetY?: unknown;\n blur?: unknown;\n spread?: unknown;\n inset?: unknown;\n}\n\ninterface Row {\n path: string;\n cssVar: string;\n layers: ShadowLayer[];\n}\n\nfunction formatDimension(raw: unknown): string {\n if (raw == null) return '—';\n if (typeof raw === 'number') return String(raw);\n if (typeof raw === 'string') return raw;\n if (typeof raw === 'object') {\n const v = raw as { value?: unknown; unit?: unknown };\n if (typeof v.value === 'number' && typeof v.unit === 'string') {\n return `${v.value}${v.unit}`;\n }\n }\n return JSON.stringify(raw);\n}\n\nfunction formatColor(raw: unknown): string {\n if (raw == null) return '—';\n if (typeof raw === 'string') return raw;\n if (typeof raw === 'object') {\n const v = raw as { components?: unknown; alpha?: unknown; colorSpace?: unknown };\n if (Array.isArray(v.components) && typeof v.colorSpace === 'string') {\n const parts = v.components.map((c) => (typeof c === 'number' ? c.toFixed(3) : String(c)));\n const alpha = typeof v.alpha === 'number' && v.alpha !== 1 ? `, ${v.alpha}` : '';\n return `${v.colorSpace}(${parts.join(' ')}${alpha})`;\n }\n }\n return JSON.stringify(raw);\n}\n\nfunction asLayers(raw: unknown): ShadowLayer[] {\n if (Array.isArray(raw)) return raw as ShadowLayer[];\n if (raw && typeof raw === 'object') return [raw as ShadowLayer];\n return [];\n}\n\nfunction layerKey(path: string, layer: ShadowLayer, fallback: number): string {\n const off = `${formatDimension(layer.offsetX)},${formatDimension(layer.offsetY)}`;\n const blur = formatDimension(layer.blur);\n const spread = formatDimension(layer.spread);\n return `${path}|${off}|${blur}|${spread}|${fallback}`;\n}\n\nexport function ShadowPreview({ filter = 'shadow', caption }: ShadowPreviewProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo(() => {\n const collected: Row[] = [];\n for (const [path, token] of Object.entries(resolved)) {\n if (token.$type !== 'shadow') continue;\n if (!globMatch(path, filter)) continue;\n collected.push({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n layers: asLayers(token.$value),\n });\n }\n collected.sort((a, b) => a.path.localeCompare(b.path, undefined, { numeric: true }));\n return collected;\n }, [resolved, filter, cssVarPrefix]);\n\n const captionText =\n caption ??\n `${rows.length} shadow${rows.length === 1 ? '' : 's'}${filter ? ` matching \\`${filter}\\`` : ''} · ${activeTheme}`;\n\n if (rows.length === 0) {\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.empty}>No shadow tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.caption}>{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} style={styles.row}>\n <div style={styles.meta}>\n <span style={styles.path}>{row.path}</span>\n <span style={styles.cssVar}>{row.cssVar}</span>\n </div>\n <div style={styles.sampleCell}>\n <ShadowSample path={row.path} />\n </div>\n <div style={styles.breakdown}>\n {row.layers.length === 1\n ? renderLayer(row.layers[0])\n : row.layers.map((layer, i) => (\n <Layer\n key={layerKey(row.path, layer, i)}\n layer={layer}\n index={i}\n total={row.layers.length}\n />\n ))}\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction renderLayer(layer: ShadowLayer | undefined): ReactElement[] {\n if (!layer) return [];\n const entries: [string, string][] = [\n ['offset', `${formatDimension(layer.offsetX)} ${formatDimension(layer.offsetY)}`],\n ['blur', formatDimension(layer.blur)],\n ['spread', formatDimension(layer.spread)],\n ['color', formatColor(layer.color)],\n ];\n if (layer.inset) entries.push(['inset', String(layer.inset)]);\n return entries.flatMap(([k, v]) => [\n <span key={`k-${k}`} style={styles.breakdownKey}>\n {k}\n </span>,\n <span key={`v-${k}`}>{v}</span>,\n ]);\n}\n\nfunction Layer({\n layer,\n index,\n total,\n}: {\n layer: ShadowLayer;\n index: number;\n total: number;\n}): ReactElement {\n return (\n <div style={{ gridColumn: '1 / -1' }}>\n <div style={styles.layerHeader}>\n layer {index + 1} of {total}\n </div>\n <div style={{ ...styles.breakdown, marginTop: 2 }}>{renderLayer(layer)}</div>\n </div>\n );\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport {\n BORDER_DEFAULT,\n captionStyle,\n emptyStyle,\n MONO_STACK,\n surfaceStyle,\n} from '#/internal/styles.ts';\nimport { formatValue, globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport interface StrokeStyleSampleProps {\n /**\n * Token-path filter. Defaults to every `strokeStyle` token. Use e.g.\n * `\"stroke.ref.style.*\"` to scope to the ref layer.\n */\n filter?: string;\n /** Override the caption. */\n caption?: string;\n}\n\nconst STRING_STYLES = new Set([\n 'solid',\n 'dashed',\n 'dotted',\n 'double',\n 'groove',\n 'ridge',\n 'outset',\n 'inset',\n]);\n\nconst styles = {\n wrapper: surfaceStyle,\n caption: captionStyle,\n empty: emptyStyle,\n row: {\n display: 'grid',\n gridTemplateColumns: 'minmax(160px, 220px) 1fr auto',\n gap: 16,\n alignItems: 'center',\n padding: '14px 0',\n borderBottom: BORDER_DEFAULT,\n } satisfies CSSProperties,\n meta: {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n minWidth: 0,\n } satisfies CSSProperties,\n path: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } satisfies CSSProperties,\n value: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n line: {\n height: 0,\n borderTopWidth: 4,\n borderTopColor: 'var(--sb-color-sys-text-default, CanvasText)',\n width: '100%',\n } satisfies CSSProperties,\n objectFallback: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n cssVar: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n};\n\ninterface Row {\n path: string;\n cssVar: string;\n displayValue: string;\n cssStyle: string | null;\n}\n\nfunction extractCssStyle(value: unknown): string | null {\n if (typeof value === 'string' && STRING_STYLES.has(value)) return value;\n return null;\n}\n\nexport function StrokeStyleSample({\n filter = 'strokeStyle',\n caption,\n}: StrokeStyleSampleProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n return Object.entries(resolved)\n .filter(([path, token]) => {\n if (token.$type !== 'strokeStyle') return false;\n return globMatch(path, filter);\n })\n .toSorted(([a], [b]) => a.localeCompare(b, undefined, { numeric: true }))\n .map(([path, token]) => ({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n displayValue: formatValue(token.$value),\n cssStyle: extractCssStyle(token.$value),\n }));\n }, [resolved, filter, cssVarPrefix]);\n\n const captionText =\n caption ??\n `${rows.length} strokeStyle token${rows.length === 1 ? '' : 's'}${filter && filter !== 'strokeStyle' ? ` matching \\`${filter}\\`` : ''} · ${activeTheme}`;\n\n if (rows.length === 0) {\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.empty}>No strokeStyle tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.caption}>{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} style={styles.row}>\n <div style={styles.meta}>\n <span style={styles.path}>{row.path}</span>\n <span style={styles.value}>{row.displayValue}</span>\n </div>\n {row.cssStyle ? (\n <div\n style={{\n ...styles.line,\n borderTopStyle: row.cssStyle as CSSProperties['borderTopStyle'],\n }}\n aria-hidden\n />\n ) : (\n <span style={styles.objectFallback}>\n Object-form (dashArray + lineCap) — no pure CSS `border-style` equivalent.\n </span>\n )}\n <span style={styles.cssVar}>{row.cssVar}</span>\n </div>\n ))}\n </div>\n );\n}\n","import type { CSSProperties } from 'react';\nimport { BORDER_DEFAULT, BORDER_FAINT, MONO_STACK, surfaceStyle } from '#/internal/styles.ts';\n\nexport const styles = {\n wrapper: {\n ...surfaceStyle,\n padding: 16,\n border: BORDER_DEFAULT,\n } satisfies CSSProperties,\n heading: {\n margin: 0,\n fontFamily: MONO_STACK,\n fontSize: 16,\n } satisfies CSSProperties,\n subline: {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n margin: '4px 0 12px',\n fontSize: 12,\n opacity: 0.8,\n } satisfies CSSProperties,\n typePill: {\n display: 'inline-block',\n padding: '2px 6px',\n borderRadius: 4,\n fontSize: 10,\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n background: 'var(--sb-color-sys-surface-muted, rgba(128,128,128,0.15))',\n } satisfies CSSProperties,\n description: {\n margin: '0 0 12px',\n opacity: 0.85,\n } satisfies CSSProperties,\n sectionHeader: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n opacity: 0.6,\n margin: '12px 0 6px',\n } satisfies CSSProperties,\n chain: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: 6,\n alignItems: 'center',\n fontFamily: MONO_STACK,\n fontSize: 12,\n } satisfies CSSProperties,\n chainNode: {\n padding: '2px 6px',\n borderRadius: 4,\n border: BORDER_DEFAULT,\n } satisfies CSSProperties,\n arrow: {\n opacity: 0.5,\n } satisfies CSSProperties,\n themeTable: {\n width: '100%',\n borderCollapse: 'collapse',\n tableLayout: 'fixed',\n fontSize: 12,\n } satisfies CSSProperties,\n themeRow: {\n borderBottom: BORDER_FAINT,\n } satisfies CSSProperties,\n themeCell: {\n padding: '6px 8px',\n verticalAlign: 'middle',\n } satisfies CSSProperties,\n swatch: {\n display: 'inline-block',\n width: 14,\n height: 14,\n verticalAlign: 'middle',\n marginRight: 6,\n borderRadius: 3,\n border: '1px solid var(--sb-color-sys-border-default, rgba(0,0,0,0.1))',\n } satisfies CSSProperties,\n snippet: {\n display: 'block',\n padding: '8px 10px',\n borderRadius: 4,\n background: 'var(--sb-color-sys-surface-muted, rgba(128,128,128,0.1))',\n fontFamily: MONO_STACK,\n fontSize: 12,\n whiteSpace: 'pre',\n overflow: 'auto',\n } satisfies CSSProperties,\n missing: {\n padding: 12,\n opacity: 0.7,\n } satisfies CSSProperties,\n typographySample: {\n padding: '8px 0',\n } satisfies CSSProperties,\n shadowSample: {\n width: 140,\n height: 56,\n background: 'var(--sb-color-sys-surface-raised, #fff)',\n border: BORDER_FAINT,\n borderRadius: 6,\n } satisfies CSSProperties,\n borderSample: {\n width: 140,\n height: 56,\n background: 'var(--sb-color-sys-surface-raised, transparent)',\n borderRadius: 6,\n } satisfies CSSProperties,\n gradientSample: {\n width: 220,\n height: 56,\n borderRadius: 6,\n border: BORDER_FAINT,\n } satisfies CSSProperties,\n strokeStyleLine: {\n height: 0,\n borderTopWidth: 4,\n borderTopColor: 'var(--sb-color-sys-text-default, CanvasText)',\n width: 220,\n } satisfies CSSProperties,\n strokeStyleSvg: {\n width: 220,\n height: 24,\n color: 'var(--sb-color-sys-text-default, CanvasText)',\n } satisfies CSSProperties,\n strokeStyleFallback: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n colorSwatchRow: {\n display: 'flex',\n gap: 1,\n borderRadius: 6,\n overflow: 'hidden',\n border: BORDER_DEFAULT,\n width: 220,\n height: 56,\n } satisfies CSSProperties,\n colorSwatchLight: {\n flex: 1,\n boxShadow: 'inset 0 0 0 8px rgba(255, 255, 255, 0.9)',\n } satisfies CSSProperties,\n colorSwatchDark: {\n flex: 1,\n boxShadow: 'inset 0 0 0 8px rgba(17, 17, 17, 0.9)',\n } satisfies CSSProperties,\n breakdownSection: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n display: 'grid',\n gridTemplateColumns: 'auto 1fr',\n columnGap: 12,\n rowGap: 3,\n marginTop: 6,\n } satisfies CSSProperties,\n breakdownKey: {\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n breakdownLayerHeader: {\n gridColumn: '1 / -1',\n fontSize: 10,\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n marginTop: 4,\n } satisfies CSSProperties,\n fontFamilySample: {\n padding: '4px 0',\n fontSize: 22,\n lineHeight: 1.2,\n } satisfies CSSProperties,\n fontWeightSample: {\n padding: '4px 0',\n fontSize: 32,\n lineHeight: 1,\n } satisfies CSSProperties,\n dimensionTrack: {\n display: 'flex',\n alignItems: 'center',\n height: 32,\n maxWidth: '100%',\n overflow: 'hidden',\n } satisfies CSSProperties,\n dimensionBar: {\n height: 16,\n background: 'var(--sb-color-sys-accent-bg, #3b82f6)',\n borderRadius: 3,\n maxWidth: '100%',\n } satisfies CSSProperties,\n motionTrack: {\n position: 'relative',\n height: 32,\n width: '100%',\n maxWidth: 320,\n background: 'var(--sb-color-sys-surface-muted, rgba(128,128,128,0.08))',\n borderRadius: 16,\n overflow: 'hidden',\n } satisfies CSSProperties,\n motionBall: {\n position: 'absolute',\n top: '50%',\n width: 24,\n height: 24,\n marginTop: -12,\n borderRadius: '50%',\n background: 'var(--sb-color-sys-accent-bg, #3b82f6)',\n } satisfies CSSProperties,\n aliasedByList: {\n listStyle: 'none',\n margin: 0,\n padding: 0,\n fontFamily: MONO_STACK,\n fontSize: 12,\n } satisfies CSSProperties,\n aliasedByRow: {\n padding: '2px 0',\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n } satisfies CSSProperties,\n aliasedByTruncated: {\n fontSize: 11,\n opacity: 0.6,\n fontStyle: 'italic',\n marginTop: 4,\n } satisfies CSSProperties,\n reducedMotion: {\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n fontStyle: 'italic',\n } satisfies CSSProperties,\n tupleIndicator: {\n fontSize: 11,\n opacity: 0.7,\n margin: '0 0 6px',\n fontFamily: MONO_STACK,\n } satisfies CSSProperties,\n consumerRow: {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '6px 10px',\n marginBottom: 4,\n borderRadius: 4,\n background: 'var(--sb-color-sys-surface-muted, rgba(128,128,128,0.1))',\n } satisfies CSSProperties,\n consumerRowLabel: {\n fontFamily: MONO_STACK,\n fontSize: 10,\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n opacity: 0.6,\n minWidth: 32,\n flexShrink: 0,\n } satisfies CSSProperties,\n consumerRowValue: {\n flex: 1,\n fontFamily: MONO_STACK,\n fontSize: 12,\n whiteSpace: 'nowrap',\n overflow: 'auto',\n } satisfies CSSProperties,\n consumerRowCopy: {\n padding: '3px 8px',\n fontSize: 11,\n fontFamily: MONO_STACK,\n background: 'var(--sb-color-sys-surface-raised, Canvas)',\n color: 'var(--sb-color-sys-text-default, CanvasText)',\n border: '1px solid var(--sb-color-sys-border-default, rgba(128,128,128,0.3))',\n borderRadius: 4,\n cursor: 'pointer',\n flexShrink: 0,\n } satisfies CSSProperties,\n};\n","import { makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport interface DetailToken {\n $type?: string;\n $value?: unknown;\n $description?: string;\n aliasOf?: string;\n aliasChain?: readonly string[];\n aliasedBy?: readonly string[];\n}\n\nexport interface VirtualAxisLike {\n readonly name: string;\n readonly contexts: readonly string[];\n readonly default: string;\n readonly source: 'resolver' | 'synthetic';\n}\n\nexport interface VirtualThemeLike {\n readonly name: string;\n readonly input: Record<string, string>;\n}\n\nexport interface TokenDetailData {\n token: DetailToken | undefined;\n cssVar: string;\n activeTheme: string;\n activeAxes: Record<string, string>;\n axes: readonly VirtualAxisLike[];\n themes: readonly VirtualThemeLike[];\n themesResolved: Record<string, Record<string, DetailToken>>;\n resolved: Record<string, DetailToken>;\n cssVarPrefix: string;\n}\n\nexport function useTokenDetailData(path: string): TokenDetailData {\n const { activeTheme, activeAxes, axes, themes, themesResolved, resolved, cssVarPrefix } =\n useProject();\n const typedResolved = resolved as Record<string, DetailToken>;\n return {\n token: typedResolved[path],\n cssVar: makeCssVar(path, cssVarPrefix),\n activeTheme,\n activeAxes,\n axes,\n themes,\n themesResolved: themesResolved as Record<string, Record<string, DetailToken>>,\n resolved: typedResolved,\n cssVarPrefix,\n };\n}\n","import type { ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport { styles } from '#/token-detail/styles.ts';\nimport { useTokenDetailData } from '#/token-detail/internal.ts';\n\nexport interface AliasChainProps {\n /** Full dot-path of the token. */\n path: string;\n}\n\nexport function AliasChain({ path }: AliasChainProps): ReactElement | null {\n const { token } = useTokenDetailData(path);\n\n const chain = useMemo<string[]>(() => {\n if (!token) return [];\n if (Array.isArray(token.aliasChain) && token.aliasChain.length > 0) {\n return [path, ...token.aliasChain];\n }\n if (typeof token.aliasOf === 'string') return [path, token.aliasOf];\n return [path];\n }, [token, path]);\n\n if (chain.length <= 1) return null;\n\n return (\n <>\n <div style={styles.sectionHeader}>Alias chain</div>\n <div style={styles.chain}>\n {chain.map((step, i) => (\n <span key={step} style={styles.chain}>\n <span style={styles.chainNode}>{step}</span>\n {i < chain.length - 1 && <span style={styles.arrow}>→</span>}\n </span>\n ))}\n </div>\n </>\n );\n}\n","import type { ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport { styles } from '#/token-detail/styles.ts';\nimport { type DetailToken, useTokenDetailData } from '#/token-detail/internal.ts';\n\nexport interface AliasedByProps {\n /** Full dot-path of the token. */\n path: string;\n}\n\nconst ALIASED_BY_DEPTH_CAP = 6;\n\ninterface AliasedByNode {\n path: string;\n children: AliasedByNode[];\n truncated?: boolean;\n}\n\nconst GROUP_RANK: Record<string, number> = { ref: 0, sys: 1 };\n\nexport function AliasedBy({ path }: AliasedByProps): ReactElement | null {\n const { resolved } = useTokenDetailData(path);\n const tree = useMemo<AliasedByNode[]>(() => buildAliasedByTree(path, resolved), [path, resolved]);\n const truncated = useMemo(() => treeHasTruncation(tree), [tree]);\n\n if (tree.length === 0) return null;\n\n return (\n <>\n <div style={styles.sectionHeader}>Aliased by</div>\n <ul style={styles.aliasedByList}>\n {tree.map((node) => (\n <AliasedByRow key={node.path} node={node} depth={0} />\n ))}\n </ul>\n {truncated && (\n <div style={styles.aliasedByTruncated}>\n Further descendants truncated at depth {ALIASED_BY_DEPTH_CAP}.\n </div>\n )}\n </>\n );\n}\n\nfunction AliasedByRow({ node, depth }: { node: AliasedByNode; depth: number }): ReactElement {\n return (\n <li>\n <div style={{ ...styles.aliasedByRow, paddingLeft: depth * 16 }}>\n <span style={styles.chainNode}>{node.path}</span>\n </div>\n {node.children.length > 0 && (\n <ul style={styles.aliasedByList}>\n {node.children.map((child) => (\n <AliasedByRow key={child.path} node={child} depth={depth + 1} />\n ))}\n </ul>\n )}\n </li>\n );\n}\n\nfunction buildAliasedByTree(\n rootPath: string,\n resolved: Record<string, DetailToken>,\n): AliasedByNode[] {\n const root = resolved[rootPath];\n const direct = root?.aliasedBy;\n if (!direct || direct.length === 0) return [];\n const visited = new Set<string>([rootPath]);\n return sortPaths(direct).map((p) => walk(p, resolved, visited, 1));\n}\n\nfunction walk(\n path: string,\n resolved: Record<string, DetailToken>,\n visited: Set<string>,\n depth: number,\n): AliasedByNode {\n if (visited.has(path)) return { path, children: [] };\n visited.add(path);\n const token = resolved[path];\n const parents = token?.aliasedBy;\n if (!parents || parents.length === 0) return { path, children: [] };\n if (depth >= ALIASED_BY_DEPTH_CAP) {\n return { path, children: [], truncated: true };\n }\n const children = sortPaths(parents).map((p) => walk(p, resolved, visited, depth + 1));\n return { path, children };\n}\n\nfunction sortPaths(paths: readonly string[]): string[] {\n return paths.toSorted((a, b) => {\n const ra = GROUP_RANK[a.split('.')[0] ?? ''] ?? 2;\n const rb = GROUP_RANK[b.split('.')[0] ?? ''] ?? 2;\n return ra !== rb ? ra - rb : a.localeCompare(b, undefined, { numeric: true });\n });\n}\n\nfunction treeHasTruncation(nodes: AliasedByNode[]): boolean {\n for (const n of nodes) {\n if (n.truncated) return true;\n if (treeHasTruncation(n.children)) return true;\n }\n return false;\n}\n","import type { ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport { useColorFormat } from '#/contexts.ts';\nimport { type ColorFormat, formatColor } from '#/format-color.ts';\nimport { formatValue } from '#/internal/use-project.ts';\nimport { styles } from '#/token-detail/styles.ts';\nimport {\n type DetailToken,\n type VirtualAxisLike,\n type VirtualThemeLike,\n useTokenDetailData,\n} from '#/token-detail/internal.ts';\n\nexport interface AxisVarianceProps {\n /** Full dot-path of the token. */\n path: string;\n}\n\ninterface Variance {\n kind: 'constant' | 'one-axis' | 'multi-axis';\n varyingAxes: readonly string[];\n}\n\nexport function AxisVariance({ path }: AxisVarianceProps): ReactElement {\n const { token, cssVar, axes, themes, themesResolved, activeAxes } = useTokenDetailData(path);\n const colorFormat = useColorFormat();\n const isColor = token?.$type === 'color';\n const formatFn = (t: DetailToken | undefined): string => valueFor(t, isColor, colorFormat);\n\n const variance = useMemo(\n () => analyzeVariance(path, axes, themes, themesResolved),\n [path, axes, themes, themesResolved],\n );\n\n if (themes.length === 0) {\n return <></>;\n }\n\n if (variance.kind === 'constant') {\n const anyTheme = themes[0];\n const value = anyTheme ? formatFn(themesResolved[anyTheme.name]?.[path]) : '—';\n return (\n <>\n <div style={styles.sectionHeader}>Values across axes</div>\n <table style={styles.themeTable} data-testid='token-detail-values'>\n <tbody>\n <tr style={styles.themeRow}>\n <td style={styles.themeCell} data-testid='token-detail-constant'>\n {isColor && <span style={{ ...styles.swatch, background: cssVar }} aria-hidden />}\n {value}\n <span style={{ opacity: 0.6, marginLeft: 8 }}>\n same across all {themes.length} tuples\n </span>\n </td>\n </tr>\n </tbody>\n </table>\n </>\n );\n }\n\n if (variance.kind === 'one-axis') {\n const axisName = variance.varyingAxes[0];\n if (!axisName) return <></>;\n const axis = axes.find((a) => a.name === axisName);\n if (!axis) return <></>;\n const contextValues = axis.contexts.map((ctx) => {\n const target = { ...activeAxes, [axisName]: ctx };\n const match = themes.find((t) => {\n const input = t.input;\n return Object.keys(input).every((k) => input[k] === target[k]);\n });\n const name = match?.name ?? '';\n return {\n ctx,\n themeName: name,\n value: name ? formatFn(themesResolved[name]?.[path]) : '—',\n };\n });\n return (\n <>\n <div style={styles.sectionHeader}>Varies with {axisName}</div>\n <table style={styles.themeTable} data-testid='token-detail-values'>\n <tbody>\n {contextValues.map((row) => (\n <tr key={row.ctx} style={styles.themeRow} data-axis={axisName} data-context={row.ctx}>\n <td style={{ ...styles.themeCell, width: '30%' }}>{row.ctx}</td>\n <td style={styles.themeCell}>\n {isColor && row.themeName && (\n <span\n style={{ ...styles.swatch, background: cssVar }}\n data-theme={row.themeName}\n aria-hidden\n />\n )}\n {row.value}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </>\n );\n }\n\n const varying = variance.varyingAxes\n .map((name) => axes.find((a) => a.name === name))\n .filter((a): a is VirtualAxisLike => Boolean(a))\n .toSorted((a, b) => b.contexts.length - a.contexts.length);\n const [rowAxis, colAxis, ...extra] = varying;\n if (!rowAxis || !colAxis) return <></>;\n\n return (\n <>\n <div style={styles.sectionHeader}>Varies with {variance.varyingAxes.join(' × ')}</div>\n <table style={styles.themeTable} data-testid='token-detail-values'>\n <thead>\n <tr style={styles.themeRow}>\n <th style={{ ...styles.themeCell, textAlign: 'left', opacity: 0.7 }}>\n {rowAxis.name} \\ {colAxis.name}\n </th>\n {colAxis.contexts.map((col) => (\n <th key={col} style={{ ...styles.themeCell, textAlign: 'left', opacity: 0.7 }}>\n {col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rowAxis.contexts.map((row) => (\n <tr key={row} style={styles.themeRow}>\n <td style={styles.themeCell}>{row}</td>\n {colAxis.contexts.map((col) => {\n const target: Record<string, string> = {\n ...activeAxes,\n [rowAxis.name]: row,\n [colAxis.name]: col,\n };\n const name = tupleName(themes, target);\n const value = name ? formatFn(themesResolved[name]?.[path]) : '—';\n return (\n <td key={col} style={styles.themeCell} data-row={row} data-col={col}>\n {isColor && name && (\n <span\n style={{ ...styles.swatch, background: cssVar }}\n data-theme={name}\n aria-hidden\n />\n )}\n {value}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n {extra.length > 0 && (\n <div style={{ ...styles.aliasedByTruncated, marginTop: 6 }}>\n Values also vary with {extra.map((a) => a.name).join(', ')}; matrix shows the slice for\n the active selection.\n </div>\n )}\n </>\n );\n}\n\nfunction valueFor(token: DetailToken | undefined, isColor: boolean, format: ColorFormat): string {\n if (!token) return '—';\n if (isColor) return formatColor(token.$value, format).value;\n return formatValue(token.$value);\n}\n\nfunction themeValue(\n themesResolved: Record<string, Record<string, DetailToken>>,\n themeName: string,\n path: string,\n): string {\n const t = themesResolved[themeName]?.[path];\n return t ? formatValue(t.$value) : '—';\n}\n\nfunction tupleName(\n themes: readonly VirtualThemeLike[],\n tuple: Record<string, string>,\n): string | undefined {\n const match = themes.find((t) => {\n const input = t.input;\n const keys = Object.keys(input);\n return keys.every((k) => input[k] === tuple[k]);\n });\n return match?.name;\n}\n\nfunction analyzeVariance(\n path: string,\n axes: readonly VirtualAxisLike[],\n themes: readonly VirtualThemeLike[],\n themesResolved: Record<string, Record<string, DetailToken>>,\n): Variance {\n const varyingAxes: string[] = [];\n for (const axis of axes) {\n const byOthers = new Map<string, Map<string, string>>();\n for (const theme of themes) {\n const others = axes\n .filter((a) => a.name !== axis.name)\n .map((a) => `${a.name}=${theme.input[a.name] ?? ''}`)\n .join('|');\n const ctx = theme.input[axis.name] ?? '';\n const bucket = byOthers.get(others) ?? new Map<string, string>();\n bucket.set(ctx, themeValue(themesResolved, theme.name, path));\n byOthers.set(others, bucket);\n }\n let varies = false;\n for (const bucket of byOthers.values()) {\n const values = new Set(bucket.values());\n if (values.size > 1) {\n varies = true;\n break;\n }\n }\n if (varies) varyingAxes.push(axis.name);\n }\n if (varyingAxes.length === 0) return { kind: 'constant', varyingAxes };\n if (varyingAxes.length === 1) return { kind: 'one-axis', varyingAxes };\n return { kind: 'multi-axis', varyingAxes };\n}\n","import type { ReactElement } from 'react';\nimport { styles } from '#/token-detail/styles.ts';\nimport { useTokenDetailData } from '#/token-detail/internal.ts';\n\nexport interface CompositeBreakdownProps {\n /** Full dot-path of the token. */\n path: string;\n}\n\nexport function CompositeBreakdown({ path }: CompositeBreakdownProps): ReactElement | null {\n const { token } = useTokenDetailData(path);\n if (!token) return null;\n return <CompositeBreakdownContent type={token.$type} rawValue={token.$value} />;\n}\n\nexport function CompositeBreakdownContent({\n type,\n rawValue,\n}: {\n type: string | undefined;\n rawValue: unknown;\n}): ReactElement | null {\n if (!rawValue || typeof rawValue !== 'object') return null;\n\n if (type === 'typography') {\n const v = rawValue as Record<string, unknown>;\n return renderKeyValueList([\n ['fontFamily', formatFontFamily(v['fontFamily'])],\n ['fontSize', formatDimensionValue(v['fontSize'])],\n ['fontWeight', formatPrimitive(v['fontWeight'])],\n ['lineHeight', formatPrimitive(v['lineHeight'])],\n ['letterSpacing', formatDimensionValue(v['letterSpacing'])],\n ]);\n }\n\n if (type === 'border') {\n const v = rawValue as Record<string, unknown>;\n return renderKeyValueList([\n ['color', formatColorValue(v['color'])],\n ['width', formatDimensionValue(v['width'])],\n ['style', formatPrimitive(v['style'])],\n ]);\n }\n\n if (type === 'transition') {\n const v = rawValue as Record<string, unknown>;\n return renderKeyValueList([\n ['duration', formatDimensionValue(v['duration'])],\n ['timingFunction', formatPrimitive(v['timingFunction'])],\n ['delay', formatDimensionValue(v['delay'])],\n ]);\n }\n\n if (type === 'shadow') {\n const layers = Array.isArray(rawValue) ? rawValue : [rawValue];\n const multi = layers.length > 1;\n return (\n <div style={styles.breakdownSection}>\n {layers.map((layer, i) => {\n const v = layer as Record<string, unknown>;\n return (\n <div key={shadowLayerKey(v, i)} style={{ display: 'contents' }}>\n {multi && <div style={styles.breakdownLayerHeader}>Layer {i + 1}</div>}\n <KeyValueRow label='color' value={formatColorValue(v['color'])} />\n <KeyValueRow label='offsetX' value={formatDimensionValue(v['offsetX'])} />\n <KeyValueRow label='offsetY' value={formatDimensionValue(v['offsetY'])} />\n <KeyValueRow label='blur' value={formatDimensionValue(v['blur'])} />\n <KeyValueRow label='spread' value={formatDimensionValue(v['spread'])} />\n {'inset' in v && <KeyValueRow label='inset' value={formatPrimitive(v['inset'])} />}\n </div>\n );\n })}\n </div>\n );\n }\n\n if (type === 'gradient') {\n const stops = Array.isArray(rawValue) ? rawValue : [];\n if (stops.length === 0) return null;\n return (\n <div style={styles.breakdownSection}>\n {stops.map((stop, i) => {\n const v = stop as Record<string, unknown>;\n const position = typeof v['position'] === 'number' ? v['position'] : 0;\n return (\n <KeyValueRow\n key={gradientStopKey(v, i)}\n label={`${(position * 100).toFixed(0)}%`}\n value={formatColorValue(v['color'])}\n />\n );\n })}\n </div>\n );\n }\n\n return null;\n}\n\nfunction renderKeyValueList(rows: Array<[string, string | null]>): ReactElement {\n return (\n <div style={styles.breakdownSection}>\n {rows\n .filter(([, v]) => v !== null)\n .map(([k, v]) => (\n <KeyValueRow key={k} label={k} value={v ?? ''} />\n ))}\n </div>\n );\n}\n\nfunction KeyValueRow({ label, value }: { label: string; value: string | null }): ReactElement {\n return (\n <>\n <span style={styles.breakdownKey}>{label}</span>\n <span>{value ?? '—'}</span>\n </>\n );\n}\n\nfunction formatPrimitive(v: unknown): string | null {\n if (v == null) return null;\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') return String(v);\n return JSON.stringify(v);\n}\n\nfunction formatFontFamily(v: unknown): string | null {\n if (v == null) return null;\n if (typeof v === 'string') return v;\n if (Array.isArray(v)) return v.map(String).join(', ');\n return JSON.stringify(v);\n}\n\nfunction formatDimensionValue(v: unknown): string | null {\n if (v == null) return null;\n if (typeof v === 'string' || typeof v === 'number') return String(v);\n if (typeof v === 'object') {\n const d = v as { value?: unknown; unit?: unknown };\n if (typeof d.value === 'number' && typeof d.unit === 'string') return `${d.value}${d.unit}`;\n }\n return JSON.stringify(v);\n}\n\nfunction formatColorValue(v: unknown): string | null {\n if (v == null) return null;\n if (typeof v === 'string') return v;\n if (typeof v === 'object') {\n const c = v as { colorSpace?: unknown; components?: unknown; alpha?: unknown };\n if (Array.isArray(c.components) && typeof c.colorSpace === 'string') {\n const parts = c.components.map((n) => (typeof n === 'number' ? n.toFixed(3) : String(n)));\n const alpha = typeof c.alpha === 'number' && c.alpha !== 1 ? ` / ${c.alpha}` : '';\n return `${c.colorSpace}(${parts.join(' ')}${alpha})`;\n }\n }\n return JSON.stringify(v);\n}\n\nfunction shadowLayerKey(layer: Record<string, unknown>, fallback: number): string {\n const parts = [\n layer['color'],\n layer['offsetX'],\n layer['offsetY'],\n layer['blur'],\n layer['spread'],\n layer['inset'],\n ].map((p) => (p === undefined ? '' : JSON.stringify(p)));\n return `shadow|${parts.join('|')}|${fallback}`;\n}\n\nfunction gradientStopKey(stop: Record<string, unknown>, fallback: number): string {\n return `stop|${stop['position'] ?? fallback}|${JSON.stringify(stop['color'])}`;\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useEffect, useState } from 'react';\nimport { usePrefersReducedMotion } from '#/internal/prefers-reduced-motion.ts';\nimport { styles } from '#/token-detail/styles.ts';\nimport { useTokenDetailData } from '#/token-detail/internal.ts';\n\nexport interface CompositePreviewProps {\n /** Full dot-path of the token to preview. */\n path: string;\n}\n\nconst PANGRAM = 'Sphinx of black quartz, judge my vow.';\n\nconst STROKE_STYLE_STRINGS = new Set([\n 'solid',\n 'dashed',\n 'dotted',\n 'double',\n 'groove',\n 'ridge',\n 'outset',\n 'inset',\n]);\n\nexport function CompositePreview({ path }: CompositePreviewProps): ReactElement | null {\n const { token, cssVar } = useTokenDetailData(path);\n if (!token) return null;\n return <CompositePreviewContent type={token.$type} cssVar={cssVar} rawValue={token.$value} />;\n}\n\nexport function CompositePreviewContent({\n type,\n cssVar,\n rawValue,\n}: {\n type: string | undefined;\n cssVar: string;\n rawValue: unknown;\n}): ReactElement | null {\n if (type === 'typography') {\n const base = cssVar.replace(/^var\\(/, '').replace(/\\)$/, '');\n return (\n <div\n style={{\n ...styles.typographySample,\n fontFamily: `var(${base}-font-family)`,\n fontSize: `var(${base}-font-size)`,\n fontWeight: `var(${base}-font-weight)` as unknown as number,\n lineHeight: `var(${base}-line-height)` as unknown as number,\n letterSpacing: `var(${base}-letter-spacing)`,\n }}\n >\n {PANGRAM}\n </div>\n );\n }\n if (type === 'shadow') {\n return <div style={{ ...styles.shadowSample, boxShadow: cssVar }} aria-hidden />;\n }\n if (type === 'border') {\n return <div style={{ ...styles.borderSample, border: cssVar }} aria-hidden />;\n }\n if (type === 'transition') {\n return <TransitionSample transition={cssVar} />;\n }\n if (type === 'dimension') {\n return (\n <div style={styles.dimensionTrack}>\n <div style={{ ...styles.dimensionBar, width: cssVar }} aria-hidden />\n </div>\n );\n }\n if (type === 'duration') {\n return <TransitionSample transition={`left ${cssVar} ease`} />;\n }\n if (type === 'fontFamily') {\n return <div style={{ ...styles.fontFamilySample, fontFamily: cssVar }}>{PANGRAM}</div>;\n }\n if (type === 'fontWeight') {\n return (\n <div\n style={{\n ...styles.fontWeightSample,\n fontWeight: cssVar as unknown as number,\n }}\n >\n Aa\n </div>\n );\n }\n if (type === 'cubicBezier') {\n return <TransitionSample transition={`left 800ms ${cssVar}`} />;\n }\n if (type === 'gradient') {\n return (\n <div\n style={{ ...styles.gradientSample, background: `linear-gradient(to right, ${cssVar})` }}\n aria-hidden\n />\n );\n }\n if (type === 'strokeStyle') {\n return <StrokeStylePreview value={rawValue} />;\n }\n if (type === 'color') {\n return (\n <div style={styles.colorSwatchRow} aria-hidden>\n <div style={{ ...styles.colorSwatchLight, background: cssVar }} />\n <div style={{ ...styles.colorSwatchDark, background: cssVar }} />\n </div>\n );\n }\n return null;\n}\n\nfunction StrokeStylePreview({ value }: { value: unknown }): ReactElement {\n if (typeof value === 'string' && STROKE_STYLE_STRINGS.has(value)) {\n return (\n <div\n style={{\n ...styles.strokeStyleLine,\n borderTopStyle: value as CSSProperties['borderTopStyle'],\n }}\n aria-hidden\n />\n );\n }\n if (value && typeof value === 'object' && 'dashArray' in value) {\n const v = value as {\n dashArray?: unknown;\n lineCap?: unknown;\n };\n const lengths = asDashLengths(v.dashArray);\n if (lengths.length === 0) {\n return (\n <div style={styles.strokeStyleFallback}>\n Object-form strokeStyle with no resolvable dashArray.\n </div>\n );\n }\n const cap = typeof v.lineCap === 'string' ? v.lineCap : 'butt';\n return (\n <svg\n style={styles.strokeStyleSvg}\n viewBox='0 0 220 24'\n preserveAspectRatio='none'\n aria-hidden\n >\n <line\n x1='4'\n y1='12'\n x2='216'\n y2='12'\n stroke='currentColor'\n strokeWidth='4'\n strokeDasharray={lengths.join(' ')}\n strokeLinecap={cap as 'butt' | 'round' | 'square'}\n />\n </svg>\n );\n }\n return <div style={styles.strokeStyleFallback}>strokeStyle value could not be previewed.</div>;\n}\n\nfunction asDashLengths(raw: unknown): number[] {\n if (!Array.isArray(raw)) return [];\n const out: number[] = [];\n for (const entry of raw) {\n if (typeof entry === 'number') {\n out.push(entry);\n continue;\n }\n if (entry && typeof entry === 'object') {\n const e = entry as { value?: unknown };\n if (typeof e.value === 'number') out.push(e.value);\n }\n }\n return out;\n}\n\nfunction TransitionSample({ transition }: { transition: string }): ReactElement {\n const reduced = usePrefersReducedMotion();\n const [phase, setPhase] = useState<0 | 1>(0);\n\n useEffect(() => {\n if (reduced) return;\n const id = requestAnimationFrame(() => setPhase(1));\n const loop = window.setInterval(() => {\n setPhase((p) => (p === 0 ? 1 : 0));\n }, 1200);\n return () => {\n cancelAnimationFrame(id);\n window.clearInterval(loop);\n };\n }, [reduced]);\n\n if (reduced) {\n return (\n <div style={styles.reducedMotion}>\n Animation suppressed by `prefers-reduced-motion: reduce`.\n </div>\n );\n }\n\n return (\n <div style={styles.motionTrack}>\n <div\n style={{\n ...styles.motionBall,\n left: phase === 1 ? 'calc(100% - 28px)' : '4px',\n transition,\n }}\n aria-hidden\n />\n </div>\n );\n}\n","import type { ReactElement } from 'react';\nimport { useState } from 'react';\nimport { styles } from '#/token-detail/styles.ts';\nimport { useTokenDetailData } from '#/token-detail/internal.ts';\n\nexport interface ConsumerOutputProps {\n /** Full dot-path of the token. */\n path: string;\n}\n\nexport function ConsumerOutput({ path }: ConsumerOutputProps): ReactElement | null {\n const { token, cssVar, activeAxes } = useTokenDetailData(path);\n\n if (!token) return null;\n\n const tupleLabel = Object.entries(activeAxes)\n .map(([k, v]) => `${k}=${v}`)\n .join(', ');\n\n return (\n <>\n <div style={styles.sectionHeader}>Consumer output</div>\n {tupleLabel && (\n <div style={styles.tupleIndicator}>\n Active tuple: <strong>{tupleLabel}</strong>\n </div>\n )}\n <OutputRow label='Path' value={path} testId='consumer-output-path' />\n <OutputRow label='CSS' value={cssVar} testId='consumer-output-css' />\n </>\n );\n}\n\ninterface OutputRowProps {\n label: string;\n value: string;\n testId: string;\n}\n\nfunction OutputRow({ label, value, testId }: OutputRowProps): ReactElement {\n return (\n <div style={styles.consumerRow}>\n <span style={styles.consumerRowLabel}>{label}</span>\n <code style={styles.consumerRowValue} data-testid={testId}>\n {value}\n </code>\n <CopyButton text={value} testId={`${testId}-copy`} />\n </div>\n );\n}\n\nfunction CopyButton({ text, testId }: { text: string; testId: string }): ReactElement {\n const [copied, setCopied] = useState(false);\n return (\n <button\n type='button'\n style={styles.consumerRowCopy}\n data-testid={testId}\n onClick={() => {\n void copyToClipboard(text).then((ok) => {\n if (!ok) return;\n setCopied(true);\n window.setTimeout(() => setCopied(false), 1200);\n });\n }}\n >\n {copied ? 'Copied' : 'Copy'}\n </button>\n );\n}\n\nasync function copyToClipboard(text: string): Promise<boolean> {\n if (typeof navigator === 'undefined' || !navigator.clipboard) return false;\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n return false;\n }\n}\n","import type { ReactElement } from 'react';\nimport { styles } from '#/token-detail/styles.ts';\nimport { useTokenDetailData } from '#/token-detail/internal.ts';\n\nexport interface TokenHeaderProps {\n /** Full dot-path of the token. */\n path: string;\n /** Override the heading. Defaults to the path. */\n heading?: string;\n}\n\nexport function TokenHeader({ path, heading }: TokenHeaderProps): ReactElement {\n const { token, cssVar, activeTheme } = useTokenDetailData(path);\n\n if (!token) {\n return (\n <div style={styles.missing}>\n Token <code>{path}</code> not found in theme <strong>{activeTheme}</strong>.\n </div>\n );\n }\n\n return (\n <>\n <h3 style={styles.heading}>{heading ?? path}</h3>\n <div style={styles.subline}>\n {token.$type && <span style={styles.typePill}>{token.$type}</span>}\n <span>{cssVar}</span>\n </div>\n {token.$description && <p style={styles.description}>{token.$description}</p>}\n </>\n );\n}\n","import type { ReactElement } from 'react';\nimport { styles } from '#/token-detail/styles.ts';\nimport { useTokenDetailData } from '#/token-detail/internal.ts';\n\nexport interface TokenUsageSnippetProps {\n /** Full dot-path of the token. */\n path: string;\n}\n\nexport function TokenUsageSnippet({ path }: TokenUsageSnippetProps): ReactElement | null {\n const { token, cssVar } = useTokenDetailData(path);\n if (!token) return null;\n return (\n <>\n <div style={styles.sectionHeader}>Usage</div>\n <code style={styles.snippet}>{`color: ${cssVar};`}</code>\n </>\n );\n}\n","import type { ReactElement } from 'react';\nimport { useColorFormat } from '#/contexts.ts';\nimport { formatColor } from '#/format-color.ts';\nimport { formatValue } from '#/internal/use-project.ts';\nimport { AliasChain } from '#/token-detail/AliasChain.tsx';\nimport { AliasedBy } from '#/token-detail/AliasedBy.tsx';\nimport { AxisVariance } from '#/token-detail/AxisVariance.tsx';\nimport { CompositeBreakdown } from '#/token-detail/CompositeBreakdown.tsx';\nimport { CompositePreview } from '#/token-detail/CompositePreview.tsx';\nimport { ConsumerOutput } from '#/token-detail/ConsumerOutput.tsx';\nimport { styles } from '#/token-detail/styles.ts';\nimport { TokenHeader } from '#/token-detail/TokenHeader.tsx';\nimport { TokenUsageSnippet } from '#/token-detail/TokenUsageSnippet.tsx';\nimport { useTokenDetailData } from '#/token-detail/internal.ts';\n\nexport interface TokenDetailProps {\n /** Full dot-path of the token to inspect. */\n path: string;\n /** Override the heading. Defaults to the path. */\n heading?: string;\n}\n\nexport function TokenDetail({ path, heading }: TokenDetailProps): ReactElement {\n const { token, cssVar, activeTheme } = useTokenDetailData(path);\n const colorFormat = useColorFormat();\n\n if (!token) {\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.missing}>\n Token <code>{path}</code> not found in theme <strong>{activeTheme}</strong>.\n </div>\n </div>\n );\n }\n\n const isColor = token.$type === 'color';\n const formatted = isColor ? formatColor(token.$value, colorFormat) : null;\n const value = formatted ? formatted.value : formatValue(token.$value);\n const outOfGamut = formatted?.outOfGamut ?? false;\n\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <TokenHeader path={path} {...(heading !== undefined && { heading })} />\n\n <div style={styles.sectionHeader}>Resolved value · {activeTheme}</div>\n <CompositePreview path={path} />\n <CompositeBreakdown path={path} />\n <div style={styles.chain}>\n {isColor && <span style={{ ...styles.swatch, background: cssVar }} aria-hidden />}\n <span>{value}</span>\n {outOfGamut && (\n <span\n title='Out of sRGB gamut for this format'\n aria-label='out of gamut'\n style={{ marginLeft: 6 }}\n >\n ⚠\n </span>\n )}\n </div>\n\n <AliasChain path={path} />\n <AliasedBy path={path} />\n <TokenUsageSnippet path={path} />\n <ConsumerOutput path={path} />\n <AxisVariance path={path} />\n </div>\n );\n}\n","import type { CSSProperties, KeyboardEvent, ReactElement } from 'react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { BorderSample } from '#/border-preview/BorderSample.tsx';\nimport { useColorFormat } from '#/contexts.ts';\nimport { DimensionBar } from '#/dimension-scale/DimensionBar.tsx';\nimport { formatColor } from '#/format-color.ts';\nimport { BORDER_DEFAULT, MONO_STACK, surfaceStyle } from '#/internal/styles.ts';\nimport { formatValue, makeCssVar, useProject } from '#/internal/use-project.ts';\nimport { MotionSample } from '#/motion-preview/MotionSample.tsx';\nimport { ShadowSample } from '#/shadow-preview/ShadowSample.tsx';\nimport { TokenDetail } from '#/TokenDetail.tsx';\nimport type { VirtualToken } from '#/types.ts';\n\nexport interface TokenNavigatorProps {\n /** If provided, mount at this dot-path subtree and hide everything outside it. */\n root?: string;\n /**\n * Depth (from the mounted root) that is expanded on first render.\n * `0` = everything collapsed, `1` = top-level groups open (default),\n * `2` = one level deeper, etc.\n */\n initiallyExpanded?: number;\n /**\n * Called with a leaf's full dot-path when it is clicked. When set, the\n * inline `<TokenDetail>` slide-over is suppressed — the consumer owns\n * the follow-up UI.\n */\n onSelect?(path: string): void;\n}\n\ninterface LeafNode {\n kind: 'leaf';\n segment: string;\n path: string;\n token: VirtualToken;\n}\n\ninterface GroupNode {\n kind: 'group';\n segment: string;\n path: string;\n children: TreeNode[];\n}\n\ntype TreeNode = LeafNode | GroupNode;\n\nconst styles = {\n wrapper: surfaceStyle,\n caption: {\n padding: '4px 0 12px',\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n fontSize: 12,\n } satisfies CSSProperties,\n tree: {\n listStyle: 'none',\n margin: 0,\n padding: 0,\n } satisfies CSSProperties,\n nested: {\n listStyle: 'none',\n margin: 0,\n paddingLeft: 18,\n borderLeft: BORDER_DEFAULT,\n } satisfies CSSProperties,\n groupRow: {\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '4px 6px',\n borderRadius: 4,\n cursor: 'pointer',\n userSelect: 'none',\n fontFamily: MONO_STACK,\n fontSize: 12,\n } satisfies CSSProperties,\n leafRow: {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '4px 6px',\n borderRadius: 4,\n cursor: 'pointer',\n fontFamily: MONO_STACK,\n fontSize: 12,\n } satisfies CSSProperties,\n caret: {\n display: 'inline-block',\n width: 12,\n textAlign: 'center',\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n tail: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n } satisfies CSSProperties,\n typePill: {\n display: 'inline-block',\n padding: '1px 6px',\n borderRadius: 4,\n fontSize: 10,\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n background: 'var(--sb-color-sys-surface-muted, rgba(128,128,128,0.15))',\n } satisfies CSSProperties,\n value: {\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n marginLeft: 'auto',\n wordBreak: 'break-all',\n maxWidth: '40%',\n textAlign: 'right',\n } satisfies CSSProperties,\n count: {\n marginLeft: 'auto',\n fontSize: 11,\n color: 'var(--sb-color-sys-text-default, CanvasText)',\n } satisfies CSSProperties,\n colorSwatch: {\n display: 'inline-block',\n width: 14,\n height: 14,\n borderRadius: 3,\n border: '1px solid var(--sb-color-sys-border-default, rgba(0,0,0,0.1))',\n } satisfies CSSProperties,\n previewBox: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n marginLeft: 'auto',\n } satisfies CSSProperties,\n empty: {\n padding: '24px 12px',\n textAlign: 'center',\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n backdrop: {\n position: 'fixed',\n inset: 0,\n background: 'rgba(0,0,0,0.4)',\n zIndex: 10000,\n display: 'flex',\n alignItems: 'stretch',\n justifyContent: 'flex-end',\n } satisfies CSSProperties,\n panel: {\n width: 'min(560px, 100%)',\n height: '100%',\n overflowY: 'auto',\n background: 'var(--sb-color-sys-surface-default, Canvas)',\n color: 'var(--sb-color-sys-text-default, CanvasText)',\n boxShadow: '-8px 0 24px rgba(0,0,0,0.2)',\n padding: 16,\n position: 'relative',\n } satisfies CSSProperties,\n closeButton: {\n position: 'absolute',\n top: 8,\n right: 8,\n width: 32,\n height: 32,\n borderRadius: 4,\n border: '1px solid var(--sb-color-sys-border-default, rgba(128,128,128,0.3))',\n background: 'transparent',\n color: 'inherit',\n cursor: 'pointer',\n fontSize: 16,\n lineHeight: 1,\n } satisfies CSSProperties,\n};\n\nfunction buildTree(resolved: Record<string, VirtualToken>, root: string | undefined): TreeNode[] {\n const rootPrefix = root && root.length > 0 ? `${root}.` : '';\n const rootSegments = root ? root.split('.') : [];\n\n const entries = Object.entries(resolved).filter(([path]) => {\n if (!root) return true;\n return path === root || path.startsWith(rootPrefix);\n });\n\n const rootNode: GroupNode = { kind: 'group', segment: '', path: '', children: [] };\n\n for (const [path, token] of entries) {\n const remainder = root ? (path === root ? '' : path.slice(rootPrefix.length)) : path;\n const segments = remainder.length > 0 ? remainder.split('.') : [];\n\n let node: GroupNode = rootNode;\n for (let i = 0; i < segments.length - 1; i += 1) {\n const seg = segments[i] as string;\n const prefix = [...rootSegments, ...segments.slice(0, i + 1)].join('.');\n let child = node.children.find(\n (c): c is GroupNode => c.kind === 'group' && c.segment === seg,\n );\n if (!child) {\n child = { kind: 'group', segment: seg, path: prefix, children: [] };\n node.children.push(child);\n }\n node = child;\n }\n\n const leafSegment = segments[segments.length - 1];\n if (leafSegment === undefined) {\n node.children.push({\n kind: 'leaf',\n segment: root ? (rootSegments[rootSegments.length - 1] ?? path) : path,\n path,\n token,\n });\n } else {\n node.children.push({ kind: 'leaf', segment: leafSegment, path, token });\n }\n }\n\n sortTree(rootNode);\n\n return rootNode.children;\n}\n\nfunction sortTree(node: GroupNode): void {\n node.children.sort((a, b) => {\n if (a.kind !== b.kind) return a.kind === 'group' ? -1 : 1;\n return a.segment.localeCompare(b.segment, undefined, { numeric: true });\n });\n for (const c of node.children) {\n if (c.kind === 'group') sortTree(c);\n }\n}\n\nfunction collectInitialExpanded(nodes: TreeNode[], remainingDepth: number, out: Set<string>): void {\n if (remainingDepth <= 0) return;\n for (const node of nodes) {\n if (node.kind !== 'group') continue;\n out.add(node.path);\n collectInitialExpanded(node.children, remainingDepth - 1, out);\n }\n}\n\nfunction countLeaves(node: TreeNode): number {\n if (node.kind === 'leaf') return 1;\n let n = 0;\n for (const c of node.children) n += countLeaves(c);\n return n;\n}\n\nexport function TokenNavigator({\n root,\n initiallyExpanded = 1,\n onSelect,\n}: TokenNavigatorProps): ReactElement {\n const { resolved, activeTheme } = useProject();\n\n const tree = useMemo(() => buildTree(resolved, root), [resolved, root]);\n\n const initialExpanded = useMemo(() => {\n const out = new Set<string>();\n collectInitialExpanded(tree, initiallyExpanded, out);\n return out;\n }, [tree, initiallyExpanded]);\n\n const [expanded, setExpanded] = useState<Set<string>>(initialExpanded);\n useEffect(() => {\n setExpanded(initialExpanded);\n }, [initialExpanded]);\n\n const [selectedPath, setSelectedPath] = useState<string | null>(null);\n\n const toggle = useCallback((path: string): void => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(path)) next.delete(path);\n else next.add(path);\n return next;\n });\n }, []);\n\n const handleLeafClick = useCallback(\n (path: string) => {\n if (onSelect) onSelect(path);\n else setSelectedPath(path);\n },\n [onSelect],\n );\n\n if (tree.length === 0) {\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.empty}>\n {root ? `No tokens under \"${root}\".` : 'No tokens in the active theme.'}\n </div>\n </div>\n );\n }\n\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.caption}>\n {root ? `Tokens under ${root}` : 'Token graph'} · {activeTheme}\n </div>\n <ul style={styles.tree} role='tree'>\n {tree.map((node) => (\n <TreeNodeRow\n key={node.path || node.segment}\n node={node}\n expanded={expanded}\n onToggle={toggle}\n onLeafClick={handleLeafClick}\n />\n ))}\n </ul>\n\n {selectedPath !== null && (\n <DetailOverlay path={selectedPath} onClose={() => setSelectedPath(null)} />\n )}\n </div>\n );\n}\n\ninterface TreeNodeRowProps {\n node: TreeNode;\n expanded: Set<string>;\n onToggle(path: string): void;\n onLeafClick(path: string): void;\n}\n\nfunction TreeNodeRow({ node, expanded, onToggle, onLeafClick }: TreeNodeRowProps): ReactElement {\n if (node.kind === 'leaf') {\n return <LeafRow node={node} onLeafClick={onLeafClick} />;\n }\n const isOpen = expanded.has(node.path);\n const onKey = (e: KeyboardEvent<HTMLDivElement>): void => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onToggle(node.path);\n }\n };\n return (\n <li role='treeitem' aria-expanded={isOpen}>\n <div\n role='button'\n tabIndex={0}\n style={styles.groupRow}\n onClick={() => onToggle(node.path)}\n onKeyDown={onKey}\n data-path={node.path}\n data-testid='token-navigator-group'\n >\n <span style={styles.caret} aria-hidden>\n {isOpen ? '▾' : '▸'}\n </span>\n <span>{node.segment}</span>\n <span style={styles.count}>{countLeaves(node)}</span>\n </div>\n {isOpen && (\n <ul style={styles.nested} role='group'>\n {node.children.map((c) => (\n <TreeNodeRow\n key={c.path || c.segment}\n node={c}\n expanded={expanded}\n onToggle={onToggle}\n onLeafClick={onLeafClick}\n />\n ))}\n </ul>\n )}\n </li>\n );\n}\n\ninterface LeafRowProps {\n node: LeafNode;\n onLeafClick(path: string): void;\n}\n\nfunction LeafRow({ node, onLeafClick }: LeafRowProps): ReactElement {\n const onKey = (e: KeyboardEvent<HTMLDivElement>): void => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onLeafClick(node.path);\n }\n };\n const type = node.token.$type ?? '';\n return (\n <li role='treeitem'>\n <div\n role='button'\n tabIndex={0}\n style={styles.leafRow}\n onClick={() => onLeafClick(node.path)}\n onKeyDown={onKey}\n data-path={node.path}\n data-testid='token-navigator-leaf'\n >\n <span style={styles.caret} aria-hidden>\n •\n </span>\n <span style={styles.tail}>{node.segment}</span>\n {type && <span style={styles.typePill}>{type}</span>}\n <LeafPreview path={node.path} token={node.token} />\n </div>\n </li>\n );\n}\n\ninterface LeafPreviewProps {\n path: string;\n token: VirtualToken;\n}\n\nfunction LeafPreview({ path, token }: LeafPreviewProps): ReactElement {\n const { cssVarPrefix } = useProject();\n const colorFormat = useColorFormat();\n const type = token.$type;\n\n if (type === 'color') {\n const cssVar = makeCssVar(path, cssVarPrefix);\n const formatted = formatColor(token.$value, colorFormat);\n return (\n <span style={styles.previewBox}>\n <span style={styles.value}>{formatted?.value ?? formatValue(token.$value)}</span>\n <span style={{ ...styles.colorSwatch, background: cssVar, marginLeft: 8 }} aria-hidden />\n </span>\n );\n }\n if (type === 'dimension') {\n return (\n <span style={styles.previewBox}>\n <span style={styles.value}>{formatValue(token.$value)}</span>\n <span style={{ marginLeft: 8, display: 'inline-block', minWidth: 40, maxWidth: 120 }}>\n <DimensionBar path={path} kind='length' />\n </span>\n </span>\n );\n }\n if (type === 'shadow') {\n return (\n <span style={styles.previewBox}>\n <span\n style={{\n marginLeft: 8,\n display: 'inline-block',\n transform: 'scale(0.5)',\n transformOrigin: 'right center',\n }}\n >\n <ShadowSample path={path} />\n </span>\n </span>\n );\n }\n if (type === 'border') {\n return (\n <span style={styles.previewBox}>\n <span\n style={{\n marginLeft: 8,\n display: 'inline-block',\n transform: 'scale(0.5)',\n transformOrigin: 'right center',\n }}\n >\n <BorderSample path={path} />\n </span>\n </span>\n );\n }\n if (type === 'transition' || type === 'duration' || type === 'cubicBezier') {\n return (\n <span style={styles.previewBox}>\n <span style={{ marginLeft: 8, display: 'inline-block', width: 80 }}>\n <MotionSample path={path} />\n </span>\n </span>\n );\n }\n\n return (\n <span style={styles.previewBox}>\n <span style={styles.value}>{formatValue(token.$value)}</span>\n </span>\n );\n}\n\ninterface DetailOverlayProps {\n path: string;\n onClose(): void;\n}\n\nfunction DetailOverlay({ path, onClose }: DetailOverlayProps): ReactElement {\n useEffect(() => {\n const onKey = (e: globalThis.KeyboardEvent): void => {\n if (e.key === 'Escape') onClose();\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [onClose]);\n\n return (\n <div\n style={styles.backdrop}\n onClick={onClose}\n role='presentation'\n data-testid='token-navigator-overlay'\n >\n <div\n style={styles.panel}\n onClick={(e) => e.stopPropagation()}\n role='dialog'\n aria-modal='true'\n aria-label={`Token detail for ${path}`}\n >\n <button\n type='button'\n style={styles.closeButton}\n onClick={onClose}\n aria-label='Close'\n data-testid='token-navigator-close'\n >\n ×\n </button>\n <TokenDetail path={path} />\n </div>\n </div>\n );\n}\n","import type { ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport { useColorFormat } from '#/contexts.ts';\nimport { formatColor } from '#/format-color.ts';\nimport { BORDER_FAINT, emptyStyle, MONO_STACK, surfaceStyle } from '#/internal/styles.ts';\nimport { formatValue, globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport interface TokenTableProps {\n /**\n * Token-path filter. `\"color.sys.*\"` matches every `color.sys.…` token;\n * omit to include everything. Combines with `type` (both must match).\n */\n filter?: string;\n /** Restrict to one DTCG `$type`. */\n type?: string;\n /** Show the CSS variable reference column. Defaults to `true`. */\n showVar?: boolean;\n /** Override the table caption. */\n caption?: string;\n}\n\nconst styles = {\n wrapper: surfaceStyle,\n empty: emptyStyle,\n caption: {\n captionSide: 'top',\n textAlign: 'left',\n padding: '8px 0',\n opacity: 0.7,\n fontSize: 12,\n } satisfies React.CSSProperties,\n table: {\n width: '100%',\n borderCollapse: 'collapse',\n tableLayout: 'fixed',\n } satisfies React.CSSProperties,\n th: {\n textAlign: 'left',\n padding: '8px 12px',\n fontSize: 11,\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n opacity: 0.6,\n borderBottom: '1px solid var(--sb-color-sys-border-default, rgba(128,128,128,0.3))',\n } satisfies React.CSSProperties,\n td: {\n padding: '8px 12px',\n borderBottom: BORDER_FAINT,\n verticalAlign: 'top',\n } satisfies React.CSSProperties,\n path: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n } satisfies React.CSSProperties,\n typePill: {\n display: 'inline-block',\n padding: '2px 6px',\n borderRadius: 4,\n fontSize: 10,\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n background: 'var(--sb-color-sys-surface-muted, rgba(128,128,128,0.15))',\n } satisfies React.CSSProperties,\n value: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n opacity: 0.85,\n wordBreak: 'break-all',\n } satisfies React.CSSProperties,\n swatch: {\n display: 'inline-block',\n width: 14,\n height: 14,\n verticalAlign: 'middle',\n marginRight: 6,\n borderRadius: 3,\n border: '1px solid var(--sb-color-sys-border-default, rgba(0,0,0,0.1))',\n } satisfies React.CSSProperties,\n};\n\nexport function TokenTable({\n filter,\n type,\n showVar = true,\n caption,\n}: TokenTableProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n const colorFormat = useColorFormat();\n\n const rows = useMemo(() => {\n const entries = Object.entries(resolved)\n .filter(([path, token]) => {\n if (!globMatch(path, filter)) return false;\n if (type && token.$type !== type) return false;\n return true;\n })\n .toSorted(([a], [b]) => a.localeCompare(b, undefined, { numeric: true }));\n return entries.map(([path, token]) => {\n const isColor = token.$type === 'color';\n const color = isColor ? formatColor(token.$value, colorFormat) : null;\n return {\n path,\n type: token.$type ?? '',\n value: color ? color.value : formatValue(token.$value),\n outOfGamut: color?.outOfGamut ?? false,\n description: token.$description ?? '',\n cssVar: makeCssVar(path, cssVarPrefix),\n isColor,\n };\n });\n }, [resolved, filter, type, cssVarPrefix, colorFormat]);\n\n const captionText =\n caption ??\n `${rows.length} token${rows.length === 1 ? '' : 's'}${filter ? ` matching \\`${filter}\\`` : ''}${type ? ` · $type=${type}` : ''} · ${activeTheme}`;\n\n if (rows.length === 0) {\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.empty}>No tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <table style={styles.table}>\n <caption style={styles.caption}>{captionText}</caption>\n <colgroup>\n <col style={{ width: '30%' }} />\n <col style={{ width: '8%' }} />\n <col style={{ width: showVar ? '28%' : '40%' }} />\n {showVar && <col style={{ width: '24%' }} />}\n <col />\n </colgroup>\n <thead>\n <tr>\n <th style={styles.th}>Path</th>\n <th style={styles.th}>Type</th>\n <th style={styles.th}>Value</th>\n {showVar && <th style={styles.th}>CSS var</th>}\n <th style={styles.th}>Description</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.path}>\n <td style={{ ...styles.td, ...styles.path }}>{row.path}</td>\n <td style={styles.td}>\n {row.type && <span style={styles.typePill}>{row.type}</span>}\n </td>\n <td style={{ ...styles.td, ...styles.value }}>\n {row.isColor && (\n <span style={{ ...styles.swatch, background: row.cssVar }} aria-hidden />\n )}\n <span>{row.value}</span>\n {row.outOfGamut && (\n <span\n title='Out of sRGB gamut for this format'\n aria-label='out of gamut'\n style={{ marginLeft: 6 }}\n >\n ⚠\n </span>\n )}\n </td>\n {showVar && <td style={{ ...styles.td, ...styles.value }}>{row.cssVar}</td>}\n <td style={styles.td}>{row.description}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport {\n BORDER_DEFAULT,\n captionStyle,\n emptyStyle,\n MONO_STACK,\n surfaceStyle,\n} from '#/internal/styles.ts';\nimport { globMatch, useProject } from '#/internal/use-project.ts';\n\nexport interface TypographyScaleProps {\n /**\n * Token-path filter. Defaults to every `typography` token. Use e.g.\n * `\"typography.sys.*\"` to scope to the semantic layer.\n */\n filter?: string;\n /** Override the sample text rendered for each token. */\n sample?: string;\n /** Override the caption. */\n caption?: string;\n}\n\nconst styles = {\n wrapper: surfaceStyle,\n caption: captionStyle,\n empty: emptyStyle,\n row: {\n display: 'grid',\n gridTemplateColumns: 'minmax(160px, 220px) 1fr',\n gap: 16,\n alignItems: 'baseline',\n padding: '14px 0',\n borderBottom: BORDER_DEFAULT,\n } satisfies CSSProperties,\n meta: {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n } satisfies CSSProperties,\n path: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n } satisfies CSSProperties,\n specs: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n opacity: 0.7,\n } satisfies CSSProperties,\n};\n\ninterface Row {\n path: string;\n sampleStyle: CSSProperties;\n specs: string;\n}\n\nfunction asDimension(raw: unknown): string | undefined {\n if (raw == null) return undefined;\n if (typeof raw === 'string' || typeof raw === 'number') return String(raw);\n if (typeof raw === 'object') {\n const v = raw as Record<string, unknown>;\n if ('value' in v && 'unit' in v) return `${String(v['value'])}${String(v['unit'])}`;\n }\n return undefined;\n}\n\nfunction asFontFamily(raw: unknown): string | undefined {\n if (typeof raw === 'string') return raw;\n if (Array.isArray(raw)) return raw.map(String).join(', ');\n return undefined;\n}\n\nfunction buildRow(path: string, composite: Record<string, unknown>): Row {\n const fontFamily = asFontFamily(composite['fontFamily']);\n const fontSize = asDimension(composite['fontSize']);\n const fontWeight = composite['fontWeight'] == null ? undefined : String(composite['fontWeight']);\n const lineHeight = composite['lineHeight'] == null ? undefined : String(composite['lineHeight']);\n const letterSpacing = asDimension(composite['letterSpacing']);\n\n const sampleStyle: CSSProperties = {};\n if (fontFamily) sampleStyle.fontFamily = fontFamily;\n if (fontSize) sampleStyle.fontSize = fontSize;\n if (fontWeight) sampleStyle.fontWeight = fontWeight as CSSProperties['fontWeight'];\n if (lineHeight) sampleStyle.lineHeight = lineHeight;\n if (letterSpacing) sampleStyle.letterSpacing = letterSpacing;\n\n const parts = [\n fontSize,\n fontWeight ? `w${fontWeight}` : undefined,\n lineHeight ? `lh ${lineHeight}` : undefined,\n ]\n .filter(Boolean)\n .join(' · ');\n\n return { path, sampleStyle, specs: parts };\n}\n\nexport function TypographyScale({\n filter = 'typography',\n sample = 'The quick brown fox jumps over the lazy dog.',\n caption,\n}: TypographyScaleProps): ReactElement {\n const { resolved, activeTheme } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n return Object.entries(resolved)\n .filter(([path, token]) => {\n if (token.$type !== 'typography') return false;\n return globMatch(path, filter);\n })\n .toSorted(([a], [b]) => a.localeCompare(b, undefined, { numeric: true }))\n .map(([path, token]) => {\n const value = token.$value;\n if (!value || typeof value !== 'object') {\n return { path, sampleStyle: {}, specs: '' };\n }\n return buildRow(path, value as Record<string, unknown>);\n });\n }, [resolved, filter]);\n\n const captionText =\n caption ??\n `${rows.length} typography token${rows.length === 1 ? '' : 's'}${filter && filter !== 'typography' ? ` matching \\`${filter}\\`` : ''} · ${activeTheme}`;\n\n if (rows.length === 0) {\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.empty}>No typography tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div data-theme={activeTheme} style={styles.wrapper}>\n <div style={styles.caption}>{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} style={styles.row}>\n <div style={styles.meta}>\n <span style={styles.path}>{row.path}</span>\n {row.specs && <span style={styles.specs}>{row.specs}</span>}\n </div>\n <div style={row.sampleStyle}>{sample}</div>\n </div>\n ))}\n </div>\n );\n}\n"],"mappings":";;;;;;AAkBA,MAAa,gBAAwC;CAAC;CAAO;CAAO;CAAO;CAAS;CAAM;AAyB1F,MAAM,mBAAmB;;;;;;AAOzB,SAAgB,YACd,OACA,QACA,WAAmB,kBACA;CACnB,MAAM,aAAa,OAAO,MAAM;AAChC,KAAI,CAAC,WAAY,QAAO;EAAE,OAAO,kBAAkB,OAAO,SAAS;EAAE,YAAY;EAAO;AAExF,KAAI,WAAW,MACb,QAAO;EAAE,OAAO,YAAY,WAAW;EAAE,YAAY;EAAO;CAG9D,MAAM,QAAQ,QAAQ,WAAW;AACjC,KAAI,CAAC,MAAO,QAAO;EAAE,OAAO,kBAAkB,OAAO,SAAS;EAAE,YAAY;EAAO;CAEnF,MAAM,QAAQ,OAAO,WAAW,UAAU,WAAW,WAAW,QAAQ;AAExE,KAAI,WAAW,MAAO,QAAO,UAAU,OAAO,MAAM;AACpD,KAAI,WAAW,MAAO,QAAO,UAAU,OAAO,MAAM;AACpD,KAAI,WAAW,MAAO,QAAO,UAAU,OAAO,MAAM;AACpD,QAAO,YAAY,OAAO,MAAM;;AAGlC,SAAS,OAAO,OAAwC;AACtD,KAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;CAChD,MAAM,IAAI;CACV,MAAM,aAAa,OAAO,EAAE,kBAAkB,WAAY,EAAE,gBAA2B,KAAA;CACvF,MAAM,aAAa,MAAM,QAAQ,EAAE,cAAc,GAC5C,EAAE,gBACH,MAAM,QAAQ,EAAE,YAAY,GACzB,EAAE,cACH,KAAA;AACN,KAAI,CAAC,cAAc,CAAC,YAAY;AAC9B,MAAI,OAAO,EAAE,WAAW,SACtB,QAAO;GAAE,YAAY;GAAQ,YAAY,gBAAgB,EAAE,OAAiB;GAAE;AAEhF,SAAO;;CAET,MAAM,QAAQ,OAAO,EAAE,aAAa,WAAY,EAAE,WAAsB,KAAA;CACxE,MAAM,MAAM,OAAO,EAAE,WAAW,WAAY,EAAE,SAAoB,KAAA;AAClE,QAAO;EACL;EACA;EACA,GAAI,UAAU,KAAA,KAAa,EAAE,OAAO;EACpC,GAAI,QAAQ,KAAA,KAAa,EAAE,KAAK;EACjC;;AAGH,SAAS,gBAAgB,KAAuB;CAC9C,MAAM,IAAI,IAAI,QAAQ,KAAK,GAAG;CAC9B,MAAM,WACJ,EAAE,WAAW,KAAK,EAAE,WAAW,IAC3B,EACG,MAAM,GAAG,CACT,KAAK,MAAM,IAAI,EAAE,CACjB,KAAK,GAAG,GACX;AAIN,QAAO;EAHG,SAAS,SAAS,MAAM,GAAG,EAAE,EAAE,GAAG,GAAG;EACrC,SAAS,SAAS,MAAM,GAAG,EAAE,EAAE,GAAG,GAAG;EACrC,SAAS,SAAS,MAAM,GAAG,EAAE,EAAE,GAAG,GAAG;EAC/B;;;;;;AAOlB,MAAM,wBAAgD;CACpD,cAAc;CACd,WAAW;CACX,gBAAgB;CACjB;AAED,SAAS,QAAQ,YAA2C;CAC1D,MAAM,SAAS,WAAW,cAAc,WAAW,YAAY,EAAE;CACjE,MAAM,SAAmC;EACvC,aAAa,OAAO,GAAG;EACvB,aAAa,OAAO,GAAG;EACvB,aAAa,OAAO,GAAG;EACxB;CACD,MAAM,QAAQ,sBAAsB,WAAW,eAAe,WAAW;AACzE,KAAI;AACF,SAAO,IAAI,MAAM,OAAO,QAAQ,WAAW,SAAS,EAAE;SAChD;AACN,SAAO;;;AAIX,SAAS,aAAa,GAAsC;AAC1D,QAAO,OAAO,MAAM,YAAY,CAAC,OAAO,MAAM,EAAE,GAAG,IAAI;;AAGzD,SAAS,MAAM,OAAc,GAAmB;CAC9C,MAAM,IAAI,MAAM,OAAO;AACvB,QAAO,OAAO,MAAM,YAAY,CAAC,OAAO,MAAM,EAAE,GAAG,IAAI;;AAGzD,SAAS,UAAU,OAAc,OAAkC;CACjE,MAAM,OAAO,MAAM,GAAG,OAAO;AAE7B,KAAI,CADY,KAAK,QAAQ,OAAO,CAGlC,QAAO;EAAE,OADG,UAAU,OAAO,MAAM,CACf;EAAO,YAAY;EAAM;CAE/C,MAAM,IAAI,SAAS,MAAM,MAAM,EAAE,CAAC;CAClC,MAAM,IAAI,SAAS,MAAM,MAAM,EAAE,CAAC;CAClC,MAAM,IAAI,SAAS,MAAM,MAAM,EAAE,CAAC;CAClC,MAAM,OAAO,IAAI,UAAU,EAAE,GAAG,UAAU,EAAE,GAAG,UAAU,EAAE;AAC3D,KAAI,SAAS,EAAG,QAAO;EAAE,OAAO;EAAM,YAAY;EAAO;AAEzD,QAAO;EAAE,OAAO,GAAG,OAAO,UADhB,SAAS,MAAM,CACa;EAAI,YAAY;EAAO;;AAG/D,SAAS,UAAU,OAAc,OAAkC;CACjE,MAAM,OAAO,MAAM,GAAG,OAAO;CAC7B,MAAM,UAAU,KAAK,QAAQ,OAAO;CAIpC,MAAM,OAAO,GAHH,KAAK,MAAM,UAAU,MAAM,MAAM,EAAE,CAAC,GAAG,IAAI,CAGnC,GAFR,KAAK,MAAM,UAAU,MAAM,MAAM,EAAE,CAAC,GAAG,IAAI,CAE9B,GADb,KAAK,MAAM,UAAU,MAAM,MAAM,EAAE,CAAC,GAAG,IAAI;AAGrD,QAAO;EAAE,OADK,SAAS,IAAI,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK,WAAW,MAAM,CAAC;EAC/D,YAAY,CAAC;EAAS;;AAGxC,SAAS,UAAU,OAAc,OAAkC;CACjE,MAAM,MAAM,MAAM,GAAG,MAAM;CAE3B,MAAM,UADO,MAAM,GAAG,OAAO,CACR,QAAQ,OAAO;CAIpC,MAAM,OAAO,GAHD,SAAS,MAAM,KAAK,EAAE,CAAC,CAGf,GAFR,aAAa,MAAM,KAAK,EAAE,CAAC,CAEZ,IADb,aAAa,MAAM,KAAK,EAAE,CAAC,CACJ;AAErC,QAAO;EAAE,OADK,SAAS,IAAI,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK,WAAW,MAAM,CAAC;EAC/D,YAAY,CAAC;EAAS;;AAGxC,SAAS,YAAY,OAAc,OAAkC;CACnE,MAAM,QAAQ,MAAM,GAAG,QAAQ;CAI/B,MAAM,OAAO,GAHH,QAAQ,MAAM,OAAO,EAAE,EAAE,EAAE,CAGnB,GAFR,QAAQ,MAAM,OAAO,EAAE,EAAE,EAAE,CAEd,GADb,QAAQ,MAAM,OAAO,EAAE,EAAE,EAAE;AAGrC,QAAO;EAAE,OADK,SAAS,IAAI,SAAS,KAAK,KAAK,SAAS,KAAK,KAAK,WAAW,MAAM,CAAC;EACnE,YAAY;EAAO;;AAGrC,SAAS,SAAS,GAAmB;AACnC,QAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC;;AAGxD,SAAS,UAAU,GAAmB;AACpC,QAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC;;AAGpC,SAAS,UAAU,GAAmB;AACpC,QAAO,EAAE,SAAS,GAAG,CAAC,SAAS,GAAG,IAAI;;AAGxC,SAAS,QAAQ,GAAW,QAAwB;CAClD,MAAM,IAAI,MAAM;AAChB,QAAO,KAAK,MAAM,IAAI,EAAE,GAAG;;AAG7B,SAAS,SAAS,GAAmB;AACnC,QAAO,SAAU,IAAI,MAAO,OAAO,KAAK,EAAE;;AAG5C,SAAS,aAAa,GAAmB;AACvC,QAAO,KAAK,MAAM,IAAI,GAAG,GAAG;;AAG9B,SAAS,WAAW,GAAmB;AACrC,QAAO,QAAQ,GAAG,EAAE;;AAGtB,SAAS,YAAY,OAAgC;CACnD,MAAM,QAAkB,CAAC,gBAAgB,KAAK,UAAU,MAAM,WAAW,GAAG;CAC5E,MAAM,aAAa,MAAM,cAAc,MAAM;AAC7C,KAAI,WACF,OAAM,KAAK,iBAAiB,WAAW,KAAK,MAAO,MAAM,OAAO,SAAS,EAAG,CAAC,KAAK,KAAK,CAAC,GAAG;AAE7F,KAAI,OAAO,MAAM,UAAU,YAAY,MAAM,UAAU,EACrD,OAAM,KAAK,WAAW,MAAM,QAAQ;AAEtC,QAAO,KAAK,MAAM,KAAK,KAAK,CAAC;;AAG/B,SAAS,kBAAkB,OAAgB,UAA0B;AACnE,KAAI,SAAS,KAAM,QAAO;AAC1B,KAAI,OAAO,UAAU,YAAY,OAAO,UAAU,SAAU,QAAO,OAAO,MAAM;AAChF,QAAO;;;;ACzNT,MAAM,kBAAkB;AACxB,MAAM,mBAAmB;AACzB,MAAM,0BAA0B;AAEhC,IAAI,WAA2B;CAAE,MAAM;CAAM,OAAO;CAAM,QAAQ;CAAM;AACxE,MAAM,4BAAY,IAAI,KAAiB;AACvC,IAAI,aAAa;AAEjB,SAAS,cAAc,OAAsC;AAC3D,QAAO,OAAO,UAAU,YAAa,cAAoC,SAAS,MAAM;;AAG1F,SAAS,mBAAyB;AAChC,KAAI,cAAc,OAAO,WAAW,YAAa;AACjD,cAAa;CACb,MAAM,UAAU,OAAO,YAAY;CACnC,MAAM,aAAa,YAAyD;EAC1E,MAAM,UAAU,QAAQ;AACxB,MAAI,CAAC,QAAS;EACd,IAAI,OAAO;EACX,MAAM,WAAW,QAAQ;AACzB,MAAI,YAAY,OAAO,aAAa,SAClC,QAAO;GAAE,GAAG;GAAM,MAAM;GAAoC;EAE9D,MAAM,YAAY,QAAQ;AAC1B,MAAI,OAAO,cAAc,SACvB,QAAO;GAAE,GAAG;GAAM,OAAO;GAAW;EAEtC,MAAM,aAAa,QAAQ;AAC3B,MAAI,cAAc,WAAW,CAC3B,QAAO;GAAE,GAAG;GAAM,QAAQ;GAAY;AAExC,MAAI,SAAS,UAAU;AACrB,cAAW;AACX,QAAK,MAAM,MAAM,UAAW,KAAI;;;;;;;;;;;AAWpC,SAAQ,GAAG,kBAAkB,UAAU;AACvC,SAAQ,GAAG,iBAAiB,UAAU;AACtC,SAAQ,GAAG,cAAc,UAAU;;;;;;;AAQrC,kBAAkB;AAElB,SAAS,UAAU,IAA4B;AAC7C,mBAAkB;AAClB,WAAU,IAAI,GAAG;AACjB,cAAa;AACX,YAAU,OAAO,GAAG;;;AAIxB,SAAS,cAA8B;AACrC,QAAO;;AAGT,SAAS,oBAAoC;AAC3C,QAAO;;AAGT,SAAgB,oBAAoC;AAClD,QAAO,qBAAqB,WAAW,aAAa,kBAAkB;;;;;;;;;ACtBxE,MAAa,oBAAoB,cAAsC,KAAK;AAE5E,SAAgB,4BAAoD;AAClE,QAAO,WAAW,kBAAkB;;;;;;;;;;;AAYtC,MAAa,eAAe,cAAsB,GAAG;AAErD,SAAgB,iBAAyB;AACvC,QAAO,WAAW,aAAa;;;;;;;;AASjC,MAAa,cAAc,cAAgD,EAAE,CAAC;AAE9E,SAAgB,gBAAkD;AAChE,QAAO,WAAW,YAAY;;;;;;;;;;;;;AAchC,MAAa,qBAAqB,cAAkC,KAAK;AAEzE,SAAgB,iBAA8B;CAC5C,MAAM,eAAe,WAAW,mBAAmB;CACnD,MAAM,iBAAiB,mBAAmB;AAC1C,QAAO,gBAAgB,eAAe,UAAU;;;;ACnGlD,MAAM,mBAAmB;AAEzB,SAAS,iBAAiB,KAAmB;AAC3C,KAAI,OAAO,aAAa,YAAa;CACrC,IAAI,QAAQ,SAAS,eAAe,iBAAiB;AACrD,KAAI,CAAC,OAAO;AACV,UAAQ,SAAS,cAAc,QAAQ;AACvC,QAAM,KAAK;AACX,WAAS,KAAK,YAAY,MAAM;;AAElC,KAAI,MAAM,gBAAgB,IAAK,OAAM,cAAc;;AAGrD,SAAS,aAAa,MAAsD;CAC1E,MAAM,MAA8B,EAAE;AACtC,MAAK,MAAM,QAAQ,KAAM,KAAI,KAAK,QAAQ,KAAK;AAC/C,QAAO;;AAGT,SAAS,aACP,YACA,MACoC;AAEpC,QADc,WAAW,MAAM,MAAM,EAAE,SAAS,KAAK,EACvC;;AAGhB,SAAS,YAAY,GAA2B,GAAoC;CAClF,MAAM,OAAO,IAAI,IAAI,CAAC,GAAG,OAAO,KAAK,EAAE,EAAE,GAAG,OAAO,KAAK,EAAE,CAAC,CAAC;AAC5D,MAAK,MAAM,KAAK,KACd,KAAI,EAAE,OAAO,EAAE,GAAI,QAAO;AAE5B,QAAO;;AAGT,SAAS,aACP,YACA,OACoB;AAEpB,QADc,WAAW,MAAM,MAAM,YAAY,EAAE,OAAiC,MAAM,CAAC,EAC7E;;AAGhB,SAAS,eAAe,UAAwC;AAC9D,QAAO;EACL,aAAa,SAAS;EACtB,YAAY,EAAE,GAAG,SAAS,YAAY;EACtC,MAAM,SAAS;EACf,QAAQ,SAAS;EACjB,gBAAgB,SAAS;EACzB,UAAU,SAAS,eAAe,SAAS,gBAAgB,EAAE;EAC7D,cAAc,SAAS;EACxB;;;;;;;;;;;;;;AAeH,SAAgB,aAA0B;CACxC,MAAM,WAAW,2BAA2B;CAC5C,MAAM,WAAW,yBAAyB,aAAa,KAAK;AAC5D,QAAO,aAAa,OAAO,eAAe,SAAS,GAAG;;AAGxD,SAAS,yBAAyB,SAA+B;CAC/D,MAAM,eAAe,gBAAgB;CACrC,MAAM,cAAc,eAAe;CACnC,MAAM,iBAAiB,mBAAmB;AAE1C,iBAAgB;AACd,MAAI,CAAC,QAAS;AACd,mBAAiBA,IAAa;IAC7B,CAAC,QAAQ,CAAC;CAGb,MAAM,aADiB,OAAO,KAAK,YAAY,CAAC,SAAS,IAErD,EAAE,GAAG,aAAa,GACjB,eAAe,QAAQ,aAAaC,KAAY;CAErD,MAAM,cAAc,aAAa,QAAQ,WAAW;CACpD,MAAM,eAAe,eAAe;CACpC,MAAM,oBACJ,gBAAgB,aAAa,QAAQ,aAAa,GAAG,eAAe;CACtE,MAAM,cACJ,gBACA,eACA,qBACA,gBACA,gBACA,OAAO,IAAI,QACX;AAEF,QAAO;EACL;EACA;EACMA;EACN;EACA;EACA,UAAU,eAAe,gBAAgB,EAAE;EAC3C;EACD;;AAGH,SAAgB,WAAW,MAAc,QAAwB;CAC/D,MAAM,OAAO,KAAK,WAAW,KAAK,IAAI;AACtC,QAAO,SAAS,SAAS,OAAO,GAAG,KAAK,KAAK,SAAS,KAAK;;AAG7D,SAAgB,UAAU,MAAc,MAAmC;AACzE,KAAI,CAAC,KAAM,QAAO;AAClB,KAAI,SAAS,OAAO,SAAS,KAAM,QAAO;AAC1C,KAAI,KAAK,SAAS,KAAK,CAAE,QAAO,KAAK,WAAW,GAAG,KAAK,MAAM,GAAG,GAAG,CAAC,GAAG;AACxE,KAAI,KAAK,SAAS,KAAK,CAAE,QAAO,KAAK,WAAW,KAAK,MAAM,GAAG,GAAG,CAAC;AAClE,QAAO,SAAS,QAAQ,KAAK,WAAW,GAAG,KAAK,GAAG;;AAGrD,SAAgB,YAAY,OAAwB;AAClD,KAAI,SAAS,KAAM,QAAO;AAC1B,KAAI,OAAO,UAAU,YAAY,OAAO,UAAU,SAAU,QAAO,OAAO,MAAM;AAChF,KAAI,OAAO,UAAU,UAAU;EAC7B,MAAM,IAAI;AACV,MAAI,OAAO,EAAE,WAAW,SAAU,QAAO,EAAE;AAC3C,MAAI,WAAW,KAAK,UAAU,EAAG,QAAO,GAAG,OAAO,EAAE,SAAS,GAAG,OAAO,EAAE,QAAQ;AACjF,SAAO,KAAK,UAAU,MAAM,CAAC,MAAM,GAAG,IAAI;;AAE5C,QAAO,OAAO,MAAM;;;;ACvJtB,MAAMC,gBAA6B;CACjC,OAAO;CACP,QAAQ;CACR,YAAY;CACZ,cAAc;CACf;AAED,SAAgB,aAAa,EAAE,QAAyC;CACtE,MAAM,EAAE,iBAAiB,YAAY;CACrC,MAAM,SAAS,WAAW,MAAM,aAAa;AAC7C,QAAO,oBAAC,OAAD;EAAK,OAAO;GAAE,GAAGA;GAAa,QAAQ;GAAQ;EAAE,eAAA;EAAc,CAAA;;;;AChBvE,MAAa,aAAa;AAE1B,MAAa,iBAAiB;AAE9B,MAAa,eAAe;AAE5B,MAAa,eAAe;CAC1B,YAAY;CACZ,UAAU;CACV,OAAO;CACP,YAAY;CACZ,SAAS;CACT,cAAc;CACf;AAED,MAAa,eAAe;CAC1B,SAAS;CACT,SAAS;CACT,UAAU;CACX;AAED,MAAa,aAAa;CACxB,SAAS;CACT,WAAW;CACX,SAAS;CACV;;;ACLD,MAAMC,YAAS;CACb,SAAS;CACT,SAAS;CACT,OAAO;CACP,KAAK;EACH,SAAS;EACT,qBAAqB;EACrB,KAAK;EACL,YAAY;EACZ,SAAS;EACT,cAAc;EACf;CACD,MAAM;EACJ,SAAS;EACT,eAAe;EACf,KAAK;EACL,UAAU;EACX;CACD,MAAM;EACJ,YAAY;EACZ,UAAU;EACV,UAAU;EACV,cAAc;EACd,YAAY;EACb;CACD,QAAQ;EACN,YAAY;EACZ,UAAU;EACV,SAAS;EACV;CACD,YAAY;EACV,SAAS;EACT,YAAY;EACZ,gBAAgB;EACjB;CACD,WAAW;EACT,YAAY;EACZ,UAAU;EACV,SAAS;EACT,qBAAqB;EACrB,WAAW;EACX,QAAQ;EACT;CACD,cAAc,EACZ,OAAO,8CACR;CACF;AAcD,SAASC,kBAAgB,KAAsB;AAC7C,KAAI,OAAO,KAAM,QAAO;AACxB,KAAI,OAAO,QAAQ,SAAU,QAAO,OAAO,IAAI;AAC/C,KAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,KAAI,OAAO,QAAQ,UAAU;EAC3B,MAAM,IAAI;AACV,MAAI,OAAO,EAAE,UAAU,YAAY,OAAO,EAAE,SAAS,SACnD,QAAO,GAAG,EAAE,QAAQ,EAAE;;AAG1B,QAAO,KAAK,UAAU,IAAI;;AAG5B,SAASC,cAAY,KAAsB;AACzC,KAAI,OAAO,KAAM,QAAO;AACxB,KAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,KAAI,OAAO,QAAQ,UAAU;EAC3B,MAAM,IAAI;AACV,MAAI,MAAM,QAAQ,EAAE,WAAW,IAAI,OAAO,EAAE,eAAe,UAAU;GACnE,MAAM,QAAQ,EAAE,WAAW,KAAK,MAAO,OAAO,MAAM,WAAW,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAE;GACzF,MAAM,QAAQ,OAAO,EAAE,UAAU,YAAY,EAAE,UAAU,IAAI,KAAK,EAAE,UAAU;AAC9E,UAAO,GAAG,EAAE,WAAW,GAAG,MAAM,KAAK,IAAI,GAAG,MAAM;;;AAGtD,QAAO,KAAK,UAAU,IAAI;;AAG5B,SAAgB,cAAc,EAAE,SAAS,UAAU,WAA6C;CAC9F,MAAM,EAAE,UAAU,aAAa,iBAAiB,YAAY;CAE5D,MAAM,OAAO,cAAc;EACzB,MAAM,YAAmB,EAAE;AAC3B,OAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,SAAS,EAAE;AACpD,OAAI,MAAM,UAAU,SAAU;AAC9B,OAAI,CAAC,UAAU,MAAM,OAAO,CAAE;AAC9B,aAAU,KAAK;IACb;IACA,QAAQ,WAAW,MAAM,aAAa;IACtC,OAAQ,MAAM,UAAU,EAAE;IAC3B,CAAC;;AAEJ,YAAU,MAAM,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,KAAA,GAAW,EAAE,SAAS,MAAM,CAAC,CAAC;AACpF,SAAO;IACN;EAAC;EAAU;EAAQ;EAAa,CAAC;CAEpC,MAAM,cACJ,WACA,GAAG,KAAK,OAAO,SAAS,KAAK,WAAW,IAAI,KAAK,MAAM,SAAS,eAAe,OAAO,MAAM,GAAG,KAAK;AAEtG,KAAI,KAAK,WAAW,EAClB,QACE,oBAAC,OAAD;EAAK,cAAY;EAAa,OAAOF,UAAO;YAC1C,oBAAC,OAAD;GAAK,OAAOA,UAAO;aAAO;GAAyC,CAAA;EAC/D,CAAA;AAIV,QACE,qBAAC,OAAD;EAAK,cAAY;EAAa,OAAOA,UAAO;YAA5C,CACE,oBAAC,OAAD;GAAK,OAAOA,UAAO;aAAU;GAAkB,CAAA,EAC9C,KAAK,KAAK,QACT,qBAAC,OAAD;GAAoB,OAAOA,UAAO;aAAlC;IACE,qBAAC,OAAD;KAAK,OAAOA,UAAO;eAAnB,CACE,oBAAC,QAAD;MAAM,OAAOA,UAAO;gBAAO,IAAI;MAAY,CAAA,EAC3C,oBAAC,QAAD;MAAM,OAAOA,UAAO;gBAAS,IAAI;MAAc,CAAA,CAC3C;;IACN,oBAAC,OAAD;KAAK,OAAOA,UAAO;eACjB,oBAAC,cAAD,EAAc,MAAM,IAAI,MAAQ,CAAA;KAC5B,CAAA;IACN,qBAAC,OAAD;KAAK,OAAOA,UAAO;eAAnB;MACE,oBAAC,QAAD;OAAM,OAAOA,UAAO;iBAAc;OAAY,CAAA;MAC9C,oBAAC,QAAD,EAAA,UAAOC,kBAAgB,IAAI,MAAM,MAAM,EAAQ,CAAA;MAC/C,oBAAC,QAAD;OAAM,OAAOD,UAAO;iBAAc;OAAY,CAAA;MAC9C,oBAAC,QAAD,EAAA,UAAO,IAAI,MAAM,SAAS,OAAO,OAAO,IAAI,MAAM,MAAM,GAAG,KAAW,CAAA;MACtE,oBAAC,QAAD;OAAM,OAAOA,UAAO;iBAAc;OAAY,CAAA;MAC9C,oBAAC,QAAD,EAAA,UAAOE,cAAY,IAAI,MAAM,MAAM,EAAQ,CAAA;MACvC;;IACF;KAhBI,IAAI,KAgBR,CACN,CACE;;;;;AC7HV,MAAMC,YAAS;CACb,SAAS;CACT,SAAS;CACT,OAAO;CACP,OAAO,EACL,cAAc,IACf;CACD,aAAa;EACX,YAAY;EACZ,UAAU;EACV,eAAe;EACf,eAAe;EACf,SAAS;EACT,cAAc;EACf;CACD,MAAM;EACJ,SAAS;EACT,qBAAqB;EACrB,KAAK;EACN;CACD,MAAM;EACJ,QAAQ;EACR,cAAc;EACd,UAAU;EACV,SAAS;EACT,eAAe;EAChB;CACD,QAAQ;EACN,QAAQ;EACR,OAAO;EACP,cAAc;EACf;CACD,MAAM;EACJ,SAAS;EACT,SAAS;EACT,eAAe;EACf,KAAK;EACN;CACD,MAAM;EACJ,YAAY;EACZ,UAAU;EACX;CACD,OAAO;EACL,YAAY;EACZ,UAAU;EACV,SAAS;EACV;CACF;;;;;AAcD,SAAS,kBAAkB,QAAoC;AAC7D,KAAI,CAAC,OAAQ,QAAO;CACpB,MAAM,WAAW,OAAO,MAAM,IAAI;CAClC,IAAI,QAAQ;AACZ,MAAK,MAAM,OAAO,UAAU;AAC1B,MAAI,QAAQ,OAAO,QAAQ,KAAM;AACjC,WAAS;;AAEX,QAAO;;AAGT,SAAgB,aAAa,EAC3B,SAAS,SACT,SACA,WACkC;CAClC,MAAM,EAAE,UAAU,aAAa,iBAAiB,YAAY;CAC5D,MAAM,cAAc,gBAAgB;CAEpC,MAAM,SAAS,cAAc;EAC3B,MAAM,UAAU,OAAO,QAAQ,SAAS,CACrC,QAAQ,CAAC,MAAM,WAAW;AACzB,OAAI,MAAM,UAAU,QAAS,QAAO;AACpC,UAAO,UAAU,MAAM,OAAO;IAC9B,CACD,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,KAAA,GAAW,EAAE,SAAS,MAAM,CAAC,CAAC;EAE3E,MAAM,WAAW,QAAQ,QAAQ,GAAG,CAAC,OAAO,KAAK,IAAI,GAAG,EAAE,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE;;;;;;;;EAQhF,MAAM,mBACJ,WAAW,KAAK,IAAI,kBAAkB,OAAO,GAAG,GAAG,KAAK,IAAI,WAAW,GAAG,EAAE,CAAC;EAE/E,MAAM,yBAAS,IAAI,KAAuB;AAC1C,OAAK,MAAM,CAAC,MAAM,UAAU,SAAS;GACnC,MAAM,WAAW,KAAK,MAAM,IAAI;GAChC,MAAM,WAAW,SAAS,MAAM,GAAG,iBAAiB,CAAC,KAAK,IAAI;GAC9D,MAAM,OAAO,SAAS,MAAM,iBAAiB,CAAC,KAAK,IAAI,IAAI,SAAS,GAAG,GAAG,IAAI;GAC9E,MAAM,OAAO,OAAO,IAAI,SAAS,IAAI,EAAE;GACvC,MAAM,YAAY,YAAY,MAAM,QAAQ,YAAY;AACxD,QAAK,KAAK;IACR;IACA;IACA,QAAQ,WAAW,MAAM,aAAa;IACtC,OAAO,UAAU;IACjB,YAAY,UAAU;IACvB,CAAC;AACF,UAAO,IAAI,UAAU,KAAK;;AAG5B,SAAO,CAAC,GAAG,OAAO,SAAS,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,OAC3C,EAAE,cAAc,GAAG,KAAA,GAAW,EAAE,SAAS,MAAM,CAAC,CACjD;IACA;EAAC;EAAU;EAAQ;EAAS;EAAc;EAAY,CAAC;CAE1D,MAAM,aAAa,OAAO,QAAQ,KAAK,GAAG,cAAc,MAAM,SAAS,QAAQ,EAAE;CACjF,MAAM,cACJ,WACA,GAAG,WAAW,QAAQ,eAAe,IAAI,KAAK,MAAM,SAAS,eAAe,OAAO,MAAM,GAAG,KAAK;AAEnG,KAAI,eAAe,EACjB,QACE,oBAAC,OAAD;EAAK,cAAY;EAAa,OAAOA,UAAO;YAC1C,oBAAC,OAAD;GAAK,OAAOA,UAAO;aAAO;GAAwC,CAAA;EAC9D,CAAA;AAIV,QACE,qBAAC,OAAD;EAAK,cAAY;EAAa,OAAOA,UAAO;YAA5C,CACE,oBAAC,OAAD;GAAK,OAAOA,UAAO;aAAU;GAAkB,CAAA,EAC9C,OAAO,KAAK,CAAC,OAAO,cACnB,qBAAC,WAAD;GAAqB,OAAOA,UAAO;aAAnC,CACE,oBAAC,OAAD;IAAK,OAAOA,UAAO;cAAc;IAAY,CAAA,EAC7C,oBAAC,OAAD;IAAK,OAAOA,UAAO;cAChB,SAAS,KAAK,WACb,qBAAC,OAAD;KAAuB,OAAOA,UAAO;eAArC,CACE,oBAAC,OAAD;MAAK,OAAO;OAAE,GAAGA,UAAO;OAAQ,YAAY,OAAO;OAAQ;MAAE,eAAA;MAAc,CAAA,EAC3E,qBAAC,OAAD;MAAK,OAAOA,UAAO;gBAAnB,CACE,oBAAC,QAAD;OAAM,OAAOA,UAAO;iBAAO,OAAO;OAAY,CAAA,EAC9C,qBAAC,QAAD;OAAM,OAAOA,UAAO;iBAApB,CACG,OAAO,OACP,OAAO,cACN,qBAAC,QAAD;QACE,OAAM;QACN,cAAW;QACX,OAAO,EAAE,YAAY,GAAG;kBAH1B,CAKG,KAAI,IAEA;UAEJ;SACH;QACF;OAlBI,OAAO,KAkBX,CACN;IACE,CAAA,CACE;KAzBI,MAyBJ,CACV,CACE;;;;;ACxLV,MAAMC,kBAAgB;AAEtB,MAAMC,YAAS;CACb,KAAK;EACH,QAAQ;EACR,YAAY;EACZ,cAAc;EACd,UAAU;EACX;CACD,cAAc;EACZ,OAAO;EACP,QAAQ;EACR,YAAY;EACZ,QAAQ;EACT;CACD,YAAY;EACV,YAAY;EACZ,QAAQ;EACR,UAAU;EACV,WAAW;EACZ;CACF;;;;;;;AAQD,SAASC,WAAS,KAAsB;AACtC,KAAI,OAAO,QAAQ,OAAO,QAAQ,SAAU,QAAO;CACnD,MAAM,IAAI;AACV,KAAI,OAAO,EAAE,UAAU,YAAY,OAAO,EAAE,SAAS,SAAU,QAAO;AACtE,SAAQ,EAAE,MAAV;EACE,KAAK,KACH,QAAO,EAAE;EACX,KAAK;EACL,KAAK,KACH,QAAO,EAAE,QAAQ;EACnB,QACE,QAAO;;;AAIb,SAAgB,aAAa,EAAE,MAAM,OAAO,YAA6C;CACvF,MAAM,EAAE,UAAU,iBAAiB,YAAY;CAC/C,MAAM,SAAS,WAAW,MAAM,aAAa;CAC7C,MAAM,QAAQ,SAAS;CACvB,MAAM,UAAUA,WAAS,OAAO,OAAO;CAEvC,MAAM,cADS,OAAO,SAAS,QAAQ,IAAI,UAAUF,kBACxB,GAAGA,gBAAc,MAAM;AAEpD,SAAQ,MAAR;EACE,KAAK,SACH,QAAO,oBAAC,OAAD;GAAK,OAAO;IAAE,GAAGC,UAAO;IAAc,cAAc;IAAQ;GAAE,eAAA;GAAc,CAAA;EACrF,KAAK,OACH,QACE,oBAAC,OAAD;GACE,OAAO;IAAE,GAAGA,UAAO;IAAY,OAAO;IAAa,QAAQ;IAAa;GACxE,eAAA;GACA,CAAA;EAGN,QACE,QAAO,oBAAC,OAAD;GAAK,OAAO;IAAE,GAAGA,UAAO;IAAK,OAAO;IAAa;GAAE,eAAA;GAAc,CAAA;;;;;AClD9E,MAAM,gBAAgB;AAEtB,MAAME,YAAS;CACb,SAAS;CACT,SAAS;CACT,OAAO;CACP,KAAK;EACH,SAAS;EACT,qBAAqB;EACrB,KAAK;EACL,YAAY;EACZ,SAAS;EACT,cAAc;EACf;CACD,MAAM;EACJ,SAAS;EACT,eAAe;EACf,KAAK;EACL,UAAU;EACX;CACD,MAAM;EACJ,YAAY;EACZ,UAAU;EACV,UAAU;EACV,cAAc;EACd,YAAY;EACb;CACD,OAAO;EACL,YAAY;EACZ,UAAU;EACV,SAAS;EACV;CACD,YAAY;EACV,SAAS;EACT,YAAY;EACZ,UAAU;EACX;CACD,QAAQ;EACN,YAAY;EACZ,UAAU;EACV,SAAS;EACT,YAAY;EACb;CACD,KAAK;EACH,YAAY;EACZ,UAAU;EACV,SAAS;EACT,YAAY;EACb;CACF;;;;;AAcD,SAAS,SAAS,KAAsB;AACtC,KAAI,OAAO,QAAQ,OAAO,QAAQ,SAAU,QAAO;CACnD,MAAM,IAAI;AACV,KAAI,OAAO,EAAE,UAAU,YAAY,OAAO,EAAE,SAAS,SAAU,QAAO;AACtE,SAAQ,EAAE,MAAV;EACE,KAAK,KACH,QAAO,EAAE;EACX,KAAK;EACL,KAAK,KACH,QAAO,EAAE,QAAQ;EACnB,QACE,QAAO;;;AAIb,SAAgB,eAAe,EAC7B,SAAS,aACT,OAAO,UACP,WACoC;CACpC,MAAM,EAAE,UAAU,aAAa,iBAAiB,YAAY;CAE5D,MAAM,OAAO,cAAc;EACzB,MAAM,YAAmB,EAAE;AAC3B,OAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,SAAS,EAAE;AACpD,OAAI,MAAM,UAAU,YAAa;AACjC,OAAI,CAAC,UAAU,MAAM,OAAO,CAAE;GAC9B,MAAM,UAAU,SAAS,MAAM,OAAO;AACtC,aAAU,KAAK;IACb;IACA,QAAQ,WAAW,MAAM,aAAa;IACtC,cAAc,YAAY,MAAM,OAAO;IACvC;IACA,QAAQ,OAAO,SAAS,QAAQ,IAAI,UAAU;IAC/C,CAAC;;AAEJ,YAAU,MAAM,GAAG,MAAM;AACvB,OAAI,OAAO,SAAS,EAAE,QAAQ,IAAI,OAAO,SAAS,EAAE,QAAQ,CAAE,QAAO,EAAE,UAAU,EAAE;AACnF,UAAO,EAAE,KAAK,cAAc,EAAE,MAAM,KAAA,GAAW,EAAE,SAAS,MAAM,CAAC;IACjE;AACF,SAAO;IACN;EAAC;EAAU;EAAQ;EAAa,CAAC;CAEpC,MAAM,cACJ,WACA,GAAG,KAAK,OAAO,YAAY,KAAK,WAAW,IAAI,KAAK,MAAM,SAAS,eAAe,OAAO,MAAM,GAAG,KAAK;AAEzG,KAAI,KAAK,WAAW,EAClB,QACE,oBAAC,OAAD;EAAK,cAAY;EAAa,OAAOA,UAAO;YAC1C,oBAAC,OAAD;GAAK,OAAOA,UAAO;aAAO;GAA4C,CAAA;EAClE,CAAA;AAIV,QACE,qBAAC,OAAD;EAAK,cAAY;EAAa,OAAOA,UAAO;YAA5C,CACE,oBAAC,OAAD;GAAK,OAAOA,UAAO;aAAU;GAAkB,CAAA,EAC9C,KAAK,KAAK,QACT,qBAAC,OAAD;GAAoB,OAAOA,UAAO;aAAlC;IACE,qBAAC,OAAD;KAAK,OAAOA,UAAO;eAAnB,CACE,oBAAC,QAAD;MAAM,OAAOA,UAAO;gBAAO,IAAI;MAAY,CAAA,EAC3C,oBAAC,QAAD;MAAM,OAAOA,UAAO;gBAAQ,IAAI;MAAoB,CAAA,CAChD;;IACN,qBAAC,OAAD;KAAK,OAAOA,UAAO;eAAnB,CACE,oBAAC,cAAD;MAAc,MAAM,IAAI;MAAY;MAAQ,CAAA,EAC3C,IAAI,UAAU,qBAAC,QAAD;MAAM,OAAOA,UAAO;gBAApB;OAAyB;OAAW;OAAc;OAAS;QACtE;;IACN,oBAAC,QAAD;KAAM,OAAOA,UAAO;eAAS,IAAI;KAAc,CAAA;IAC3C;KAVI,IAAI,KAUR,CACN,CACE;;;;;AC9IV,MAAMC,YAAS;CACb,SAAS;CACT,SAAS;CACT,KAAK;EACH,SAAS;EACT,qBAAqB;EACrB,KAAK;EACL,YAAY;EACZ,SAAS;EACT,cAAc;EACf;CACD,MAAM;EACJ,SAAS;EACT,eAAe;EACf,KAAK;EACL,UAAU;EACX;CACD,MAAM;EACJ,YAAY;EACZ,UAAU;EACV,UAAU;EACV,cAAc;EACd,YAAY;EACb;CACD,OAAO;EACL,YAAY;EACZ,UAAU;EACV,OAAO;EACR;CACD,QAAQ;EACN,UAAU;EACV,YAAY;EACb;CACD,QAAQ;EACN,YAAY;EACZ,UAAU;EACV,OAAO;EACR;CACD,OAAO;CACR;AAQD,SAAS,YAAY,KAAsB;AACzC,KAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,KAAI,MAAM,QAAQ,IAAI,CAAE,QAAO,IAAI,IAAI,OAAO,CAAC,KAAK,KAAK;AACzD,QAAO;;AAGT,SAAgB,iBAAiB,EAC/B,SAAS,cACT,SAAS,gDACT,WACsC;CACtC,MAAM,EAAE,UAAU,aAAa,iBAAiB,YAAY;CAE5D,MAAM,OAAO,cAAqB;AAChC,SAAO,OAAO,QAAQ,SAAS,CAC5B,QAAQ,CAAC,MAAM,WAAW;AACzB,OAAI,MAAM,UAAU,aAAc,QAAO;AACzC,UAAO,UAAU,MAAM,OAAO;IAC9B,CACD,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,KAAA,GAAW,EAAE,SAAS,MAAM,CAAC,CAAC,CACxE,KAAK,CAAC,MAAM,YAAY;GACvB;GACA,QAAQ,WAAW,MAAM,aAAa;GACtC,OAAO,YAAY,MAAM,OAAO;GACjC,EAAE;IACJ;EAAC;EAAU;EAAQ;EAAa,CAAC;CAEpC,MAAM,cACJ,WACA,GAAG,KAAK,OAAO,mBAAmB,KAAK,WAAW,IAAI,KAAK,MAAM,UAAU,WAAW,eAAe,eAAe,OAAO,MAAM,GAAG,KAAK;AAE3I,KAAI,KAAK,WAAW,EAClB,QACE,oBAAC,OAAD;EAAK,cAAY;EAAa,OAAOA,UAAO;YAC1C,oBAAC,OAAD;GAAK,OAAOA,UAAO;aAAO;GAA6C,CAAA;EACnE,CAAA;AAIV,QACE,qBAAC,OAAD;EAAK,cAAY;EAAa,OAAOA,UAAO;YAA5C,CACE,oBAAC,OAAD;GAAK,OAAOA,UAAO;aAAU;GAAkB,CAAA,EAC9C,KAAK,KAAK,QACT,qBAAC,OAAD;GAAoB,OAAOA,UAAO;aAAlC;IACE,qBAAC,OAAD;KAAK,OAAOA,UAAO;eAAnB,CACE,oBAAC,QAAD;MAAM,OAAOA,UAAO;gBAAO,IAAI;MAAY,CAAA,EAC3C,oBAAC,QAAD;MAAM,OAAOA,UAAO;gBAAQ,IAAI;MAAa,CAAA,CACzC;;IACN,oBAAC,OAAD;KAAK,OAAO;MAAE,GAAGA,UAAO;MAAQ,YAAY,IAAI;MAAQ;eAAG;KAAa,CAAA;IACxE,oBAAC,QAAD;KAAM,OAAOA,UAAO;eAAS,IAAI;KAAc,CAAA;IAC3C;KAPI,IAAI,KAOR,CACN,CACE;;;;;ACnGV,MAAMC,WAAS;CACb,SAAS;CACT,SAAS;CACT,OAAO;CACP,KAAK;EACH,SAAS;EACT,qBAAqB;EACrB,KAAK;EACL,YAAY;EACZ,SAAS;EACT,cAAc;EACf;CACD,MAAM;EACJ,SAAS;EACT,eAAe;EACf,KAAK;EACL,UAAU;EACX;CACD,MAAM;EACJ,YAAY;EACZ,UAAU;EACV,UAAU;EACV,cAAc;EACd,YAAY;EACb;CACD,OAAO;EACL,YAAY;EACZ,UAAU;EACV,OAAO;EACR;CACD,QAAQ;EACN,UAAU;EACV,YAAY;EACb;CACD,QAAQ;EACN,YAAY;EACZ,UAAU;EACV,OAAO;EACR;CACF;AASD,SAAS,SAAS,KAAsB;AACtC,KAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,KAAI,OAAO,QAAQ,UAAU;EAC3B,MAAM,IAAI,OAAO,SAAS,KAAK,GAAG;AAClC,SAAO,OAAO,SAAS,EAAE,GAAG,IAAI;;AAElC,QAAO;;AAGT,SAAgB,gBAAgB,EAC9B,SAAS,cACT,SAAS,MACT,WACqC;CACrC,MAAM,EAAE,UAAU,aAAa,iBAAiB,YAAY;CAE5D,MAAM,OAAO,cAAqB;EAChC,MAAM,YAAmB,EAAE;AAC3B,OAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,SAAS,EAAE;AACpD,OAAI,MAAM,UAAU,aAAc;AAClC,OAAI,CAAC,UAAU,MAAM,OAAO,CAAE;AAC9B,aAAU,KAAK;IACb;IACA,QAAQ,WAAW,MAAM,aAAa;IACtC,SAAS,MAAM,UAAU,OAAO,KAAK,OAAO,MAAM,OAAO;IACzD,QAAQ,SAAS,MAAM,OAAO;IAC/B,CAAC;;AAEJ,YAAU,MAAM,GAAG,MAAM;AACvB,OAAI,OAAO,SAAS,EAAE,OAAO,IAAI,OAAO,SAAS,EAAE,OAAO,CAAE,QAAO,EAAE,SAAS,EAAE;AAChF,UAAO,EAAE,KAAK,cAAc,EAAE,MAAM,KAAA,GAAW,EAAE,SAAS,MAAM,CAAC;IACjE;AACF,SAAO;IACN;EAAC;EAAU;EAAQ;EAAa,CAAC;CAEpC,MAAM,cACJ,WACA,GAAG,KAAK,OAAO,mBAAmB,KAAK,WAAW,IAAI,KAAK,MAAM,UAAU,WAAW,eAAe,eAAe,OAAO,MAAM,GAAG,KAAK;AAE3I,KAAI,KAAK,WAAW,EAClB,QACE,oBAAC,OAAD;EAAK,cAAY;EAAa,OAAOA,SAAO;YAC1C,oBAAC,OAAD;GAAK,OAAOA,SAAO;aAAO;GAA6C,CAAA;EACnE,CAAA;AAIV,QACE,qBAAC,OAAD;EAAK,cAAY;EAAa,OAAOA,SAAO;YAA5C,CACE,oBAAC,OAAD;GAAK,OAAOA,SAAO;aAAU;GAAkB,CAAA,EAC9C,KAAK,KAAK,QACT,qBAAC,OAAD;GAAoB,OAAOA,SAAO;aAAlC;IACE,qBAAC,OAAD;KAAK,OAAOA,SAAO;eAAnB,CACE,oBAAC,QAAD;MAAM,OAAOA,SAAO;gBAAO,IAAI;MAAY,CAAA,EAC3C,oBAAC,QAAD;MAAM,OAAOA,SAAO;gBAAQ,IAAI;MAAe,CAAA,CAC3C;;IACN,oBAAC,OAAD;KACE,OAAO;MACL,GAAGA,SAAO;MACV,YAAY,IAAI;MACjB;eAEA;KACG,CAAA;IACN,oBAAC,QAAD;KAAM,OAAOA,SAAO;eAAS,IAAI;KAAc,CAAA;IAC3C;KAdI,IAAI,KAcR,CACN,CACE;;;;;ACpHV,MAAMC,WAAS;CACb,SAAS;CACT,SAAS;CACT,OAAO;CACP,KAAK;EACH,SAAS;EACT,qBAAqB;EACrB,KAAK;EACL,YAAY;EACZ,SAAS;EACT,cAAc;EACf;CACD,MAAM;EACJ,SAAS;EACT,eAAe;EACf,KAAK;EACL,UAAU;EACX;CACD,MAAM;EACJ,YAAY;EACZ,UAAU;EACV,UAAU;EACV,cAAc;EACd,YAAY;EACb;CACD,QAAQ;EACN,YAAY;EACZ,UAAU;EACV,SAAS;EACV;CACD,QAAQ;EACN,QAAQ;EACR,cAAc;EACd,QAAQ;EACT;CACD,OAAO;EACL,YAAY;EACZ,UAAU;EACV,SAAS;EACT,eAAe;EACf,KAAK;EACN;CACD,SAAS;EACP,SAAS;EACT,YAAY;EACZ,KAAK;EACN;CACD,YAAY;EACV,OAAO;EACP,QAAQ;EACR,cAAc;EACd,QAAQ;EACR,MAAM;EACP;CACD,cAAc,EACZ,SAAS,IACV;CACF;AAiBD,SAAS,QAAQ,KAA8B;AAC7C,KAAI,CAAC,MAAM,QAAQ,IAAI,CAAE,QAAO,EAAE;AAClC,QAAO;;AAGT,MAAM,OAAO,MAAsB,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;AAE3D,SAAS,aAAa,MAA4B;CAChD,MAAM,QAAQ,KAAK;AACnB,KAAI,CAAC,SAAS,CAAC,MAAM,QAAQ,MAAM,WAAW,IAAI,MAAM,WAAW,SAAS,EAC1E,QAAO;CAET,MAAM,CAAC,GAAG,GAAG,KAAK,MAAM;AACxB,KAAI,MAAM,KAAA,KAAa,MAAM,KAAA,KAAa,MAAM,KAAA,EAAW,QAAO;CAClE,MAAM,QAAQ,MAAM,SAAS;AAC7B,QAAO,UAAU,IACb,OAAO,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAClC,OAAO,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,MAAM;;AAGnD,SAAS,QAAQ,MAAc,MAAoB,UAA0B;AAC3E,QAAO,GAAG,KAAK,GAAG,KAAK,YAAY,SAAS,GAAG,aAAa,KAAK;;AAGnE,SAAgB,gBAAgB,EAC9B,SAAS,YACT,WACqC;CACrC,MAAM,EAAE,UAAU,aAAa,iBAAiB,YAAY;CAE5D,MAAM,OAAO,cAAc;EACzB,MAAM,YAAmB,EAAE;AAC3B,OAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,SAAS,EAAE;AACpD,OAAI,MAAM,UAAU,WAAY;AAChC,OAAI,CAAC,UAAU,MAAM,OAAO,CAAE;AAC9B,aAAU,KAAK;IACb;IACA,QAAQ,WAAW,MAAM,aAAa;IACtC,OAAO,QAAQ,MAAM,OAAO;IAC7B,CAAC;;AAEJ,YAAU,MAAM,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,KAAA,GAAW,EAAE,SAAS,MAAM,CAAC,CAAC;AACpF,SAAO;IACN;EAAC;EAAU;EAAQ;EAAa,CAAC;CAEpC,MAAM,cACJ,WACA,GAAG,KAAK,OAAO,WAAW,KAAK,WAAW,IAAI,KAAK,MAAM,SAAS,eAAe,OAAO,MAAM,GAAG,KAAK;AAExG,KAAI,KAAK,WAAW,EAClB,QACE,oBAAC,OAAD;EAAK,cAAY;EAAa,OAAOA,SAAO;YAC1C,oBAAC,OAAD;GAAK,OAAOA,SAAO;aAAO;GAA2C,CAAA;EACjE,CAAA;AAIV,QACE,qBAAC,OAAD;EAAK,cAAY;EAAa,OAAOA,SAAO;YAA5C,CACE,oBAAC,OAAD;GAAK,OAAOA,SAAO;aAAU;GAAkB,CAAA,EAC9C,KAAK,KAAK,QACT,qBAAC,OAAD;GAAoB,OAAOA,SAAO;aAAlC;IACE,qBAAC,OAAD;KAAK,OAAOA,SAAO;eAAnB,CACE,oBAAC,QAAD;MAAM,OAAOA,SAAO;gBAAO,IAAI;MAAY,CAAA,EAC3C,oBAAC,QAAD;MAAM,OAAOA,SAAO;gBAAS,IAAI;MAAc,CAAA,CAC3C;;IACN,oBAAC,OAAD;KACE,OAAO;MAAE,GAAGA,SAAO;MAAQ,YAAY,6BAA6B,IAAI,OAAO;MAAI;KACnF,eAAA;KACA,CAAA;IACF,oBAAC,OAAD;KAAK,OAAOA,SAAO;eAChB,IAAI,MAAM,KAAK,MAAM,MACpB,qBAAC,OAAD;MAAsC,OAAOA,SAAO;gBAApD;OACE,oBAAC,QAAD;QACE,OAAO;SAAE,GAAGA,SAAO;SAAY,YAAY,aAAa,KAAK;SAAE;QAC/D,eAAA;QACA,CAAA;OACF,oBAAC,QAAD,EAAA,UAAO,aAAa,KAAK,EAAQ,CAAA;OACjC,qBAAC,QAAD;QAAM,OAAOA,SAAO;kBAApB;SAAkC;WAC3B,KAAK,YAAY,KAAK,KAAK,QAAQ,EAAE;SAAC;SACtC;;OACH;QATI,QAAQ,IAAI,MAAM,MAAM,EAAE,CAS9B,CACN;KACE,CAAA;IACF;KAvBI,IAAI,KAuBR,CACN,CACE;;;;;;;;;AChLV,SAAgB,0BAAmC;CACjD,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;AAC7C,iBAAgB;AACd,MAAI,OAAO,WAAW,YAAa;EACnC,MAAM,QAAQ,OAAO,WAAW,mCAAmC;AACnE,aAAW,MAAM,QAAQ;EACzB,MAAM,YAAY,MAAiC,WAAW,EAAE,QAAQ;AACxE,QAAM,iBAAiB,UAAU,SAAS;AAC1C,eAAa,MAAM,oBAAoB,UAAU,SAAS;IACzD,EAAE,CAAC;AACN,QAAO;;;;ACIT,MAAM,sBAAsB;AAC5B,MAAM,iBAAiB;AAEvB,MAAMC,WAAS;CACb,OAAO;EACL,UAAU;EACV,QAAQ;EACR,YAAY;EACZ,cAAc;EACd,UAAU;EACX;CACD,MAAM;EACJ,UAAU;EACV,KAAK;EACL,OAAO;EACP,QAAQ;EACR,WAAW;EACX,cAAc;EACd,YAAY;EACb;CACD,eAAe;EACb,UAAU;EACV,OAAO;EACP,WAAW;EACZ;CACF;AAOD,SAAS,kBAAkB,KAAsB;AAC/C,KAAI,OAAO,KAAM,QAAO;AACxB,KAAI,OAAO,QAAQ,UAAU;EAC3B,MAAM,IAAI;AACV,MAAI,OAAO,EAAE,UAAU,YAAY,OAAO,EAAE,SAAS,UAAU;AAC7D,OAAI,EAAE,SAAS,KAAM,QAAO,EAAE;AAC9B,OAAI,EAAE,SAAS,IAAK,QAAO,EAAE,QAAQ;;;AAGzC,QAAO;;AAGT,SAAS,mBAAmB,KAA6B;AACvD,KAAI,MAAM,QAAQ,IAAI,IAAI,IAAI,WAAW,KAAK,IAAI,OAAO,MAAM,OAAO,MAAM,SAAS,CACnF,QAAO,gBAAgB,IAAI,KAAK,MAAM,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC;AAEzE,QAAO;;AAGT,SAAS,WACP,KACA,aACA,UACQ;CACR,MAAM,SAAS,kBAAkB,IAAI;AACrC,KAAI,OAAO,SAAS,OAAO,CAAE,QAAO;AACpC,KAAI,OAAO,QAAQ,UAAU;EAC3B,MAAM,QAAQ,IAAI,MAAM,gBAAgB;AACxC,MAAI,SAAS,MAAM,IAAI;GACrB,MAAM,aAAa,YAAY,MAAM;GACrC,MAAM,WAAW,kBAAkB,YAAY,OAAO;AACtD,OAAI,OAAO,SAAS,SAAS,CAAE,QAAO;;;AAG1C,QAAO;;AAGT,SAAS,SACP,KACA,aACA,UACQ;CACR,MAAM,SAAS,mBAAmB,IAAI;AACtC,KAAI,OAAQ,QAAO;AACnB,KAAI,OAAO,QAAQ,UAAU;EAC3B,MAAM,QAAQ,IAAI,MAAM,gBAAgB;AACxC,MAAI,SAAS,MAAM,IAAI;GACrB,MAAM,aAAa,YAAY,MAAM;GACrC,MAAM,WAAW,mBAAmB,YAAY,OAAO;AACvD,OAAI,SAAU,QAAO;;;AAGzB,QAAO;;AAGT,SAAgB,kBACd,OACA,aACa;AACb,KAAI,CAAC,MAAO,QAAO;CACnB,MAAM,OAAO,MAAM;AACnB,KAAI,SAAS,cAAc;EACzB,MAAM,IAAK,MAAM,UAAU,EAAE;AAI7B,SAAO;GACL,YAAY,WAAW,EAAE,UAAU,aAAa,oBAAoB;GACpE,QAAQ,SAAS,EAAE,gBAAgB,aAAa,eAAe;GAChE;;AAEH,KAAI,SAAS,YAAY;EACvB,MAAM,aAAa,kBAAkB,MAAM,OAAO;AAClD,MAAI,CAAC,OAAO,SAAS,WAAW,CAAE,QAAO;AACzC,SAAO;GAAE;GAAY,QAAQ;GAAgB;;AAE/C,KAAI,SAAS,eAAe;EAC1B,MAAM,SAAS,mBAAmB,MAAM,OAAO;AAC/C,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO;GAAE,YAAY;GAAqB;GAAQ;;AAEpD,QAAO;;AAGT,SAAgB,aAAa,EAAE,MAAM,QAAQ,GAAG,SAAS,KAAsC;CAC7F,MAAM,EAAE,aAAa,YAAY;CACjC,MAAM,gBAAgB,yBAAyB;CAE/C,MAAM,OAAO,cAAc,kBAAkB,SAAS,OAAO,SAAS,EAAE,CAAC,UAAU,KAAK,CAAC;CAEzF,MAAM,aAAa,MAAM,cAAc;CACvC,MAAM,SAAS,MAAM,UAAU;CAC/B,MAAM,iBAAiB,KAAK,IAAI,GAAG,aAAa,MAAM;CAEtD,MAAM,CAAC,OAAO,YAAY,SAAgB,EAAE;AAE5C,iBAAgB;AACd,MAAI,cAAe;AACnB,WAAS,EAAE;EACX,MAAM,KAAK,4BAA4B,SAAS,EAAE,CAAC;EACnD,MAAM,OAAO,OAAO,kBAAkB;AACpC,aAAU,MAAO,MAAM,IAAI,IAAI,EAAG;KACjC,iBAAiB,EAAE;AACtB,eAAa;AACX,wBAAqB,GAAG;AACxB,UAAO,cAAc,KAAK;;IAE3B;EAAC;EAAgB;EAAQ;EAAc,CAAC;AAE3C,KAAI,cACF,QACE,oBAAC,OAAD;EAAK,OAAOA,SAAO;YAAe;EAE5B,CAAA;AAIV,QACE,oBAAC,OAAD;EAAK,OAAOA,SAAO;YACjB,oBAAC,OAAD;GACE,OAAO;IACL,GAAGA,SAAO;IACV,MAAM,UAAU,IAAI,sBAAsB;IAC1C,YAAY,QAAQ,eAAe,KAAK;IACzC;GACD,eAAA;GACA,CAAA;EACE,CAAA;;;;AC5JV,MAAM,SAAwB;CAAC;CAAM;CAAK;CAAG;CAAE;AAE/C,MAAMC,WAAS;CACb,SAAS;CACT,SAAS;EACP,SAAS;EACT,OAAO;EACP,UAAU;EACX;CACD,UAAU;EACR,SAAS;EACT,YAAY;EACZ,KAAK;EACL,SAAS;EACV;CACD,cAAc;EACZ,UAAU;EACV,OAAO;EACP,eAAe;EACf,eAAe;EAChB;CACD,UAAU;EACR,YAAY;EACZ,UAAU;EACV,SAAS;EACT,YAAY;EACZ,OAAO;EACP,QAAQ;EACR,cAAc;EACd,QAAQ;EACT;CACD,gBAAgB;EACd,YAAY;EACZ,OAAO;EACP,aAAa;EACd;CACD,WAAW;EACT,UAAU;EACV,SAAS;EACT,YAAY;EACZ,YAAY;EACZ,OAAO;EACP,QAAQ;EACR,cAAc;EACd,QAAQ;EACT;CACD,KAAK;EACH,SAAS;EACT,qBAAqB;EACrB,KAAK;EACL,YAAY;EACZ,SAAS;EACT,cAAc;EACf;CACD,MAAM;EACJ,SAAS;EACT,eAAe;EACf,KAAK;EACL,UAAU;EACX;CACD,MAAM;EACJ,YAAY;EACZ,UAAU;EACV,UAAU;EACV,cAAc;EACd,YAAY;EACb;CACD,OAAO;EACL,YAAY;EACZ,UAAU;EACV,OAAO;EACR;CACD,QAAQ;EACN,YAAY;EACZ,UAAU;EACV,OAAO;EACP,YAAY;EACb;CACD,OAAO;EACL,SAAS;EACT,WAAW;EACX,OAAO;EACR;CACF;AAUD,SAAS,WAAW,KAAkB;AACpC,SAAQ,IAAI,MAAZ;EACE,KAAK,aACH,QAAO,gBAAgB,KAAK,MAAM,IAAI,WAAW,CAAC,OAAO,IAAI;EAC/D,KAAK,WACH,QAAO,cAAc,KAAK,MAAM,IAAI,WAAW,CAAC;EAClD,KAAK,cACH,QAAO,iBAAiB,IAAI;;;AAIlC,SAAgB,cAAc,EAAE,QAAQ,WAA6C;CACnF,MAAM,EAAE,UAAU,aAAa,iBAAiB,YAAY;CAC5D,MAAM,CAAC,OAAO,YAAY,SAAsB,EAAE;CAClD,MAAM,CAAC,KAAK,UAAU,SAAS,EAAE;CACjC,MAAM,gBAAgB,yBAAyB;CAE/C,MAAM,OAAO,cAAc;EACzB,MAAM,YAAmB,EAAE;AAC3B,OAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,SAAS,EAAE;AACpD,OAAI,UAAU,CAAC,UAAU,MAAM,OAAO,CAAE;AACxC,OAAI,CAAC,UAAU,CAAC;IAAC;IAAc;IAAY;IAAc,CAAC,SAAS,MAAM,SAAS,GAAG,CACnF;GAEF,MAAM,OAAO,MAAM;AACnB,OAAI,CAAC,KAAM;GACX,MAAM,OAAO,kBAAkB,OAAO,SAAS;AAC/C,OAAI,CAAC,KAAM;AACX,aAAU,KAAK;IACb;IACA,QAAQ,WAAW,MAAM,aAAa;IACtC,YAAY,KAAK;IACjB,QAAQ,KAAK;IACb;IACD,CAAC;;AAEJ,YAAU,MAAM,GAAG,MAAM;AACvB,OAAI,EAAE,SAAS,EAAE,KAAM,QAAO,EAAE,KAAK,cAAc,EAAE,KAAK;AAC1D,UAAO,EAAE,KAAK,cAAc,EAAE,MAAM,KAAA,GAAW,EAAE,SAAS,MAAM,CAAC;IACjE;AACF,SAAO;IACN;EAAC;EAAU;EAAQ;EAAa,CAAC;CAEpC,MAAM,cACJ,WACA,GAAG,KAAK,OAAO,eAAe,KAAK,WAAW,IAAI,KAAK,MAAM,SAAS,eAAe,OAAO,MAAM,GAAG,KAAK;AAE5G,KAAI,KAAK,WAAW,EAClB,QACE,oBAAC,OAAD;EAAK,cAAY;EAAa,OAAOA,SAAO;YAC1C,oBAAC,OAAD;GAAK,OAAOA,SAAO;aAAO;GAAyC,CAAA;EAC/D,CAAA;AAIV,QACE,qBAAC,OAAD;EAAK,cAAY;EAAa,OAAOA,SAAO;YAA5C;GACE,oBAAC,OAAD;IAAK,OAAOA,SAAO;cAAU;IAAkB,CAAA;GAC/C,qBAAC,OAAD;IAAK,OAAOA,SAAO;cAAnB;KACE,oBAAC,QAAD;MAAM,OAAOA,SAAO;gBAAc;MAAY,CAAA;KAC7C,OAAO,KAAK,MACX,qBAAC,UAAD;MAEE,MAAK;MACL,OAAO;OAAE,GAAGA,SAAO;OAAU,GAAI,MAAM,QAAQA,SAAO,iBAAiB,EAAE;OAAG;MAC5E,eAAe,SAAS,EAAE;gBAJ5B,CAMG,GAAE,IACI;QANF,EAME,CACT;KACF,oBAAC,UAAD;MACE,MAAK;MACL,OAAOA,SAAO;MACd,eAAe,QAAQ,MAAM,IAAI,EAAE;MACnC,UAAU;MACV,OAAO,gBAAgB,uCAAuC;gBAC/D;MAEQ,CAAA;KACL;;GACL,KAAK,KAAK,QACT,qBAAC,OAAD;IAAoB,OAAOA,SAAO;cAAlC;KACE,qBAAC,OAAD;MAAK,OAAOA,SAAO;gBAAnB,CACE,oBAAC,QAAD;OAAM,OAAOA,SAAO;iBAAO,IAAI;OAAY,CAAA,EAC3C,oBAAC,QAAD;OAAM,OAAOA,SAAO;iBAAQ,WAAW,IAAI;OAAQ,CAAA,CAC/C;;KACN,oBAAC,cAAD;MAAc,MAAM,IAAI;MAAa;MAAO,QAAQ;MAAO,CAAA;KAC3D,oBAAC,QAAD;MAAM,OAAOA,SAAO;gBAAS,IAAI;MAAc,CAAA;KAC3C;MAPI,IAAI,KAOR,CACN;GACE;;;;;;;;;;;;;;AC3LV,SAAgB,mBAAmB,EAAE,OAAO,YAAmD;AAC7F,QAAO,oBAAC,kBAAkB,UAAnB;EAAmC;EAAQ;EAAsC,CAAA;;;;;;;AAQ1F,SAAgB,oBAAqC;CACnD,MAAM,QAAQ,2BAA2B;AACzC,KAAI,CAAC,MACH,OAAM,IAAI,MACR,2KAED;AAEH,QAAO;;;;AC5BT,MAAM,cAA6B;CACjC,OAAO;CACP,QAAQ;CACR,YAAY;CACZ,QAAQ;CACR,cAAc;CACf;AAED,SAAgB,aAAa,EAAE,QAAyC;CACtE,MAAM,EAAE,iBAAiB,YAAY;CACrC,MAAM,SAAS,WAAW,MAAM,aAAa;AAC7C,QAAO,oBAAC,OAAD;EAAK,OAAO;GAAE,GAAG;GAAa,WAAW;GAAQ;EAAE,eAAA;EAAc,CAAA;;;;ACG1E,MAAMC,WAAS;CACb,SAAS;CACT,SAAS;CACT,OAAO;CACP,KAAK;EACH,SAAS;EACT,qBAAqB;EACrB,KAAK;EACL,YAAY;EACZ,SAAS;EACT,cAAc;EACf;CACD,MAAM;EACJ,SAAS;EACT,eAAe;EACf,KAAK;EACL,UAAU;EACX;CACD,MAAM;EACJ,YAAY;EACZ,UAAU;EACV,UAAU;EACV,cAAc;EACd,YAAY;EACb;CACD,QAAQ;EACN,YAAY;EACZ,UAAU;EACV,SAAS;EACV;CACD,YAAY;EACV,SAAS;EACT,YAAY;EACZ,gBAAgB;EAChB,QAAQ;EACT;CACD,WAAW;EACT,YAAY;EACZ,UAAU;EACV,SAAS;EACT,qBAAqB;EACrB,WAAW;EACX,QAAQ;EACT;CACD,cAAc,EACZ,OAAO,8CACR;CACD,aAAa;EACX,UAAU;EACV,eAAe;EACf,eAAe;EACf,OAAO;EACP,WAAW;EACZ;CACF;AAiBD,SAAS,gBAAgB,KAAsB;AAC7C,KAAI,OAAO,KAAM,QAAO;AACxB,KAAI,OAAO,QAAQ,SAAU,QAAO,OAAO,IAAI;AAC/C,KAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,KAAI,OAAO,QAAQ,UAAU;EAC3B,MAAM,IAAI;AACV,MAAI,OAAO,EAAE,UAAU,YAAY,OAAO,EAAE,SAAS,SACnD,QAAO,GAAG,EAAE,QAAQ,EAAE;;AAG1B,QAAO,KAAK,UAAU,IAAI;;AAG5B,SAASC,cAAY,KAAsB;AACzC,KAAI,OAAO,KAAM,QAAO;AACxB,KAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,KAAI,OAAO,QAAQ,UAAU;EAC3B,MAAM,IAAI;AACV,MAAI,MAAM,QAAQ,EAAE,WAAW,IAAI,OAAO,EAAE,eAAe,UAAU;GACnE,MAAM,QAAQ,EAAE,WAAW,KAAK,MAAO,OAAO,MAAM,WAAW,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAE;GACzF,MAAM,QAAQ,OAAO,EAAE,UAAU,YAAY,EAAE,UAAU,IAAI,KAAK,EAAE,UAAU;AAC9E,UAAO,GAAG,EAAE,WAAW,GAAG,MAAM,KAAK,IAAI,GAAG,MAAM;;;AAGtD,QAAO,KAAK,UAAU,IAAI;;AAG5B,SAAS,SAAS,KAA6B;AAC7C,KAAI,MAAM,QAAQ,IAAI,CAAE,QAAO;AAC/B,KAAI,OAAO,OAAO,QAAQ,SAAU,QAAO,CAAC,IAAmB;AAC/D,QAAO,EAAE;;AAGX,SAAS,SAAS,MAAc,OAAoB,UAA0B;AAI5E,QAAO,GAAG,KAAK,GAHH,GAAG,gBAAgB,MAAM,QAAQ,CAAC,GAAG,gBAAgB,MAAM,QAAQ,GAGzD,GAFT,gBAAgB,MAAM,KAAK,CAEV,GADf,gBAAgB,MAAM,OAAO,CACJ,GAAG;;AAG7C,SAAgB,cAAc,EAAE,SAAS,UAAU,WAA6C;CAC9F,MAAM,EAAE,UAAU,aAAa,iBAAiB,YAAY;CAE5D,MAAM,OAAO,cAAc;EACzB,MAAM,YAAmB,EAAE;AAC3B,OAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,SAAS,EAAE;AACpD,OAAI,MAAM,UAAU,SAAU;AAC9B,OAAI,CAAC,UAAU,MAAM,OAAO,CAAE;AAC9B,aAAU,KAAK;IACb;IACA,QAAQ,WAAW,MAAM,aAAa;IACtC,QAAQ,SAAS,MAAM,OAAO;IAC/B,CAAC;;AAEJ,YAAU,MAAM,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,KAAA,GAAW,EAAE,SAAS,MAAM,CAAC,CAAC;AACpF,SAAO;IACN;EAAC;EAAU;EAAQ;EAAa,CAAC;CAEpC,MAAM,cACJ,WACA,GAAG,KAAK,OAAO,SAAS,KAAK,WAAW,IAAI,KAAK,MAAM,SAAS,eAAe,OAAO,MAAM,GAAG,KAAK;AAEtG,KAAI,KAAK,WAAW,EAClB,QACE,oBAAC,OAAD;EAAK,cAAY;EAAa,OAAOD,SAAO;YAC1C,oBAAC,OAAD;GAAK,OAAOA,SAAO;aAAO;GAAyC,CAAA;EAC/D,CAAA;AAIV,QACE,qBAAC,OAAD;EAAK,cAAY;EAAa,OAAOA,SAAO;YAA5C,CACE,oBAAC,OAAD;GAAK,OAAOA,SAAO;aAAU;GAAkB,CAAA,EAC9C,KAAK,KAAK,QACT,qBAAC,OAAD;GAAoB,OAAOA,SAAO;aAAlC;IACE,qBAAC,OAAD;KAAK,OAAOA,SAAO;eAAnB,CACE,oBAAC,QAAD;MAAM,OAAOA,SAAO;gBAAO,IAAI;MAAY,CAAA,EAC3C,oBAAC,QAAD;MAAM,OAAOA,SAAO;gBAAS,IAAI;MAAc,CAAA,CAC3C;;IACN,oBAAC,OAAD;KAAK,OAAOA,SAAO;eACjB,oBAAC,cAAD,EAAc,MAAM,IAAI,MAAQ,CAAA;KAC5B,CAAA;IACN,oBAAC,OAAD;KAAK,OAAOA,SAAO;eAChB,IAAI,OAAO,WAAW,IACnB,YAAY,IAAI,OAAO,GAAG,GAC1B,IAAI,OAAO,KAAK,OAAO,MACrB,oBAAC,OAAD;MAES;MACP,OAAO;MACP,OAAO,IAAI,OAAO;MAClB,EAJK,SAAS,IAAI,MAAM,OAAO,EAAE,CAIjC,CACF;KACF,CAAA;IACF;KApBI,IAAI,KAoBR,CACN,CACE;;;AAIV,SAAS,YAAY,OAAgD;AACnE,KAAI,CAAC,MAAO,QAAO,EAAE;CACrB,MAAM,UAA8B;EAClC,CAAC,UAAU,GAAG,gBAAgB,MAAM,QAAQ,CAAC,GAAG,gBAAgB,MAAM,QAAQ,GAAG;EACjF,CAAC,QAAQ,gBAAgB,MAAM,KAAK,CAAC;EACrC,CAAC,UAAU,gBAAgB,MAAM,OAAO,CAAC;EACzC,CAAC,SAASC,cAAY,MAAM,MAAM,CAAC;EACpC;AACD,KAAI,MAAM,MAAO,SAAQ,KAAK,CAAC,SAAS,OAAO,MAAM,MAAM,CAAC,CAAC;AAC7D,QAAO,QAAQ,SAAS,CAAC,GAAG,OAAO,CACjC,oBAAC,QAAD;EAAqB,OAAOD,SAAO;YAChC;EACI,EAFI,KAAK,IAET,EACP,oBAAC,QAAD,EAAA,UAAsB,GAAS,EAApB,KAAK,IAAe,CAChC,CAAC;;AAGJ,SAAS,MAAM,EACb,OACA,OACA,SAKe;AACf,QACE,qBAAC,OAAD;EAAK,OAAO,EAAE,YAAY,UAAU;YAApC,CACE,qBAAC,OAAD;GAAK,OAAOA,SAAO;aAAnB;IAAgC;IACvB,QAAQ;IAAE;IAAK;IAClB;MACN,oBAAC,OAAD;GAAK,OAAO;IAAE,GAAGA,SAAO;IAAW,WAAW;IAAG;aAAG,YAAY,MAAM;GAAO,CAAA,CACzE;;;;;AC5MV,MAAM,gBAAgB,IAAI,IAAI;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,MAAME,WAAS;CACb,SAAS;CACT,SAAS;CACT,OAAO;CACP,KAAK;EACH,SAAS;EACT,qBAAqB;EACrB,KAAK;EACL,YAAY;EACZ,SAAS;EACT,cAAc;EACf;CACD,MAAM;EACJ,SAAS;EACT,eAAe;EACf,KAAK;EACL,UAAU;EACX;CACD,MAAM;EACJ,YAAY;EACZ,UAAU;EACV,UAAU;EACV,cAAc;EACd,YAAY;EACb;CACD,OAAO;EACL,YAAY;EACZ,UAAU;EACV,OAAO;EACR;CACD,MAAM;EACJ,QAAQ;EACR,gBAAgB;EAChB,gBAAgB;EAChB,OAAO;EACR;CACD,gBAAgB;EACd,YAAY;EACZ,UAAU;EACV,OAAO;EACR;CACD,QAAQ;EACN,YAAY;EACZ,UAAU;EACV,OAAO;EACR;CACF;AASD,SAAS,gBAAgB,OAA+B;AACtD,KAAI,OAAO,UAAU,YAAY,cAAc,IAAI,MAAM,CAAE,QAAO;AAClE,QAAO;;AAGT,SAAgB,kBAAkB,EAChC,SAAS,eACT,WACuC;CACvC,MAAM,EAAE,UAAU,aAAa,iBAAiB,YAAY;CAE5D,MAAM,OAAO,cAAqB;AAChC,SAAO,OAAO,QAAQ,SAAS,CAC5B,QAAQ,CAAC,MAAM,WAAW;AACzB,OAAI,MAAM,UAAU,cAAe,QAAO;AAC1C,UAAO,UAAU,MAAM,OAAO;IAC9B,CACD,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,KAAA,GAAW,EAAE,SAAS,MAAM,CAAC,CAAC,CACxE,KAAK,CAAC,MAAM,YAAY;GACvB;GACA,QAAQ,WAAW,MAAM,aAAa;GACtC,cAAc,YAAY,MAAM,OAAO;GACvC,UAAU,gBAAgB,MAAM,OAAO;GACxC,EAAE;IACJ;EAAC;EAAU;EAAQ;EAAa,CAAC;CAEpC,MAAM,cACJ,WACA,GAAG,KAAK,OAAO,oBAAoB,KAAK,WAAW,IAAI,KAAK,MAAM,UAAU,WAAW,gBAAgB,eAAe,OAAO,MAAM,GAAG,KAAK;AAE7I,KAAI,KAAK,WAAW,EAClB,QACE,oBAAC,OAAD;EAAK,cAAY;EAAa,OAAOA,SAAO;YAC1C,oBAAC,OAAD;GAAK,OAAOA,SAAO;aAAO;GAA8C,CAAA;EACpE,CAAA;AAIV,QACE,qBAAC,OAAD;EAAK,cAAY;EAAa,OAAOA,SAAO;YAA5C,CACE,oBAAC,OAAD;GAAK,OAAOA,SAAO;aAAU;GAAkB,CAAA,EAC9C,KAAK,KAAK,QACT,qBAAC,OAAD;GAAoB,OAAOA,SAAO;aAAlC;IACE,qBAAC,OAAD;KAAK,OAAOA,SAAO;eAAnB,CACE,oBAAC,QAAD;MAAM,OAAOA,SAAO;gBAAO,IAAI;MAAY,CAAA,EAC3C,oBAAC,QAAD;MAAM,OAAOA,SAAO;gBAAQ,IAAI;MAAoB,CAAA,CAChD;;IACL,IAAI,WACH,oBAAC,OAAD;KACE,OAAO;MACL,GAAGA,SAAO;MACV,gBAAgB,IAAI;MACrB;KACD,eAAA;KACA,CAAA,GAEF,oBAAC,QAAD;KAAM,OAAOA,SAAO;eAAgB;KAE7B,CAAA;IAET,oBAAC,QAAD;KAAM,OAAOA,SAAO;eAAS,IAAI;KAAc,CAAA;IAC3C;KAnBI,IAAI,KAmBR,CACN,CACE;;;;;ACnJV,MAAaC,WAAS;CACpB,SAAS;EACP,GAAG;EACH,SAAS;EACT,QAAQ;EACT;CACD,SAAS;EACP,QAAQ;EACR,YAAY;EACZ,UAAU;EACX;CACD,SAAS;EACP,SAAS;EACT,YAAY;EACZ,KAAK;EACL,QAAQ;EACR,UAAU;EACV,SAAS;EACV;CACD,UAAU;EACR,SAAS;EACT,SAAS;EACT,cAAc;EACd,UAAU;EACV,eAAe;EACf,eAAe;EACf,YAAY;EACb;CACD,aAAa;EACX,QAAQ;EACR,SAAS;EACV;CACD,eAAe;EACb,YAAY;EACZ,UAAU;EACV,eAAe;EACf,eAAe;EACf,SAAS;EACT,QAAQ;EACT;CACD,OAAO;EACL,SAAS;EACT,UAAU;EACV,KAAK;EACL,YAAY;EACZ,YAAY;EACZ,UAAU;EACX;CACD,WAAW;EACT,SAAS;EACT,cAAc;EACd,QAAQ;EACT;CACD,OAAO,EACL,SAAS,IACV;CACD,YAAY;EACV,OAAO;EACP,gBAAgB;EAChB,aAAa;EACb,UAAU;EACX;CACD,UAAU,EACR,cAAc,cACf;CACD,WAAW;EACT,SAAS;EACT,eAAe;EAChB;CACD,QAAQ;EACN,SAAS;EACT,OAAO;EACP,QAAQ;EACR,eAAe;EACf,aAAa;EACb,cAAc;EACd,QAAQ;EACT;CACD,SAAS;EACP,SAAS;EACT,SAAS;EACT,cAAc;EACd,YAAY;EACZ,YAAY;EACZ,UAAU;EACV,YAAY;EACZ,UAAU;EACX;CACD,SAAS;EACP,SAAS;EACT,SAAS;EACV;CACD,kBAAkB,EAChB,SAAS,SACV;CACD,cAAc;EACZ,OAAO;EACP,QAAQ;EACR,YAAY;EACZ,QAAQ;EACR,cAAc;EACf;CACD,cAAc;EACZ,OAAO;EACP,QAAQ;EACR,YAAY;EACZ,cAAc;EACf;CACD,gBAAgB;EACd,OAAO;EACP,QAAQ;EACR,cAAc;EACd,QAAQ;EACT;CACD,iBAAiB;EACf,QAAQ;EACR,gBAAgB;EAChB,gBAAgB;EAChB,OAAO;EACR;CACD,gBAAgB;EACd,OAAO;EACP,QAAQ;EACR,OAAO;EACR;CACD,qBAAqB;EACnB,YAAY;EACZ,UAAU;EACV,OAAO;EACR;CACD,gBAAgB;EACd,SAAS;EACT,KAAK;EACL,cAAc;EACd,UAAU;EACV,QAAQ;EACR,OAAO;EACP,QAAQ;EACT;CACD,kBAAkB;EAChB,MAAM;EACN,WAAW;EACZ;CACD,iBAAiB;EACf,MAAM;EACN,WAAW;EACZ;CACD,kBAAkB;EAChB,YAAY;EACZ,UAAU;EACV,SAAS;EACT,qBAAqB;EACrB,WAAW;EACX,QAAQ;EACR,WAAW;EACZ;CACD,cAAc,EACZ,OAAO,8CACR;CACD,sBAAsB;EACpB,YAAY;EACZ,UAAU;EACV,eAAe;EACf,eAAe;EACf,OAAO;EACP,WAAW;EACZ;CACD,kBAAkB;EAChB,SAAS;EACT,UAAU;EACV,YAAY;EACb;CACD,kBAAkB;EAChB,SAAS;EACT,UAAU;EACV,YAAY;EACb;CACD,gBAAgB;EACd,SAAS;EACT,YAAY;EACZ,QAAQ;EACR,UAAU;EACV,UAAU;EACX;CACD,cAAc;EACZ,QAAQ;EACR,YAAY;EACZ,cAAc;EACd,UAAU;EACX;CACD,aAAa;EACX,UAAU;EACV,QAAQ;EACR,OAAO;EACP,UAAU;EACV,YAAY;EACZ,cAAc;EACd,UAAU;EACX;CACD,YAAY;EACV,UAAU;EACV,KAAK;EACL,OAAO;EACP,QAAQ;EACR,WAAW;EACX,cAAc;EACd,YAAY;EACb;CACD,eAAe;EACb,WAAW;EACX,QAAQ;EACR,SAAS;EACT,YAAY;EACZ,UAAU;EACX;CACD,cAAc;EACZ,SAAS;EACT,SAAS;EACT,YAAY;EACZ,KAAK;EACN;CACD,oBAAoB;EAClB,UAAU;EACV,SAAS;EACT,WAAW;EACX,WAAW;EACZ;CACD,eAAe;EACb,UAAU;EACV,OAAO;EACP,WAAW;EACZ;CACD,gBAAgB;EACd,UAAU;EACV,SAAS;EACT,QAAQ;EACR,YAAY;EACb;CACD,aAAa;EACX,SAAS;EACT,YAAY;EACZ,KAAK;EACL,SAAS;EACT,cAAc;EACd,cAAc;EACd,YAAY;EACb;CACD,kBAAkB;EAChB,YAAY;EACZ,UAAU;EACV,eAAe;EACf,eAAe;EACf,SAAS;EACT,UAAU;EACV,YAAY;EACb;CACD,kBAAkB;EAChB,MAAM;EACN,YAAY;EACZ,UAAU;EACV,YAAY;EACZ,UAAU;EACX;CACD,iBAAiB;EACf,SAAS;EACT,UAAU;EACV,YAAY;EACZ,YAAY;EACZ,OAAO;EACP,QAAQ;EACR,cAAc;EACd,QAAQ;EACR,YAAY;EACb;CACF;;;AClPD,SAAgB,mBAAmB,MAA+B;CAChE,MAAM,EAAE,aAAa,YAAY,MAAM,QAAQ,gBAAgB,UAAU,iBACvE,YAAY;CACd,MAAM,gBAAgB;AACtB,QAAO;EACL,OAAO,cAAc;EACrB,QAAQ,WAAW,MAAM,aAAa;EACtC;EACA;EACA;EACA;EACgB;EAChB,UAAU;EACV;EACD;;;;ACvCH,SAAgB,WAAW,EAAE,QAA8C;CACzE,MAAM,EAAE,UAAU,mBAAmB,KAAK;CAE1C,MAAM,QAAQ,cAAwB;AACpC,MAAI,CAAC,MAAO,QAAO,EAAE;AACrB,MAAI,MAAM,QAAQ,MAAM,WAAW,IAAI,MAAM,WAAW,SAAS,EAC/D,QAAO,CAAC,MAAM,GAAG,MAAM,WAAW;AAEpC,MAAI,OAAO,MAAM,YAAY,SAAU,QAAO,CAAC,MAAM,MAAM,QAAQ;AACnE,SAAO,CAAC,KAAK;IACZ,CAAC,OAAO,KAAK,CAAC;AAEjB,KAAI,MAAM,UAAU,EAAG,QAAO;AAE9B,QACE,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,OAAD;EAAK,OAAOC,SAAO;YAAe;EAAiB,CAAA,EACnD,oBAAC,OAAD;EAAK,OAAOA,SAAO;YAChB,MAAM,KAAK,MAAM,MAChB,qBAAC,QAAD;GAAiB,OAAOA,SAAO;aAA/B,CACE,oBAAC,QAAD;IAAM,OAAOA,SAAO;cAAY;IAAY,CAAA,EAC3C,IAAI,MAAM,SAAS,KAAK,oBAAC,QAAD;IAAM,OAAOA,SAAO;cAAO;IAAQ,CAAA,CACvD;KAHI,KAGJ,CACP;EACE,CAAA,CACL,EAAA,CAAA;;;;ACzBP,MAAM,uBAAuB;AAQ7B,MAAM,aAAqC;CAAE,KAAK;CAAG,KAAK;CAAG;AAE7D,SAAgB,UAAU,EAAE,QAA6C;CACvE,MAAM,EAAE,aAAa,mBAAmB,KAAK;CAC7C,MAAM,OAAO,cAA+B,mBAAmB,MAAM,SAAS,EAAE,CAAC,MAAM,SAAS,CAAC;CACjG,MAAM,YAAY,cAAc,kBAAkB,KAAK,EAAE,CAAC,KAAK,CAAC;AAEhE,KAAI,KAAK,WAAW,EAAG,QAAO;AAE9B,QACE,qBAAA,UAAA,EAAA,UAAA;EACE,oBAAC,OAAD;GAAK,OAAOC,SAAO;aAAe;GAAgB,CAAA;EAClD,oBAAC,MAAD;GAAI,OAAOA,SAAO;aACf,KAAK,KAAK,SACT,oBAAC,cAAD;IAAoC;IAAM,OAAO;IAAK,EAAnC,KAAK,KAA8B,CACtD;GACC,CAAA;EACJ,aACC,qBAAC,OAAD;GAAK,OAAOA,SAAO;aAAnB;IAAuC;IACG;IAAqB;IACzD;;EAEP,EAAA,CAAA;;AAIP,SAAS,aAAa,EAAE,MAAM,SAA+D;AAC3F,QACE,qBAAC,MAAD,EAAA,UAAA,CACE,oBAAC,OAAD;EAAK,OAAO;GAAE,GAAGA,SAAO;GAAc,aAAa,QAAQ;GAAI;YAC7D,oBAAC,QAAD;GAAM,OAAOA,SAAO;aAAY,KAAK;GAAY,CAAA;EAC7C,CAAA,EACL,KAAK,SAAS,SAAS,KACtB,oBAAC,MAAD;EAAI,OAAOA,SAAO;YACf,KAAK,SAAS,KAAK,UAClB,oBAAC,cAAD;GAA+B,MAAM;GAAO,OAAO,QAAQ;GAAK,EAA7C,MAAM,KAAuC,CAChE;EACC,CAAA,CAEJ,EAAA,CAAA;;AAIT,SAAS,mBACP,UACA,UACiB;CAEjB,MAAM,SADO,SAAS,WACD;AACrB,KAAI,CAAC,UAAU,OAAO,WAAW,EAAG,QAAO,EAAE;CAC7C,MAAM,UAAU,IAAI,IAAY,CAAC,SAAS,CAAC;AAC3C,QAAO,UAAU,OAAO,CAAC,KAAK,MAAM,KAAK,GAAG,UAAU,SAAS,EAAE,CAAC;;AAGpE,SAAS,KACP,MACA,UACA,SACA,OACe;AACf,KAAI,QAAQ,IAAI,KAAK,CAAE,QAAO;EAAE;EAAM,UAAU,EAAE;EAAE;AACpD,SAAQ,IAAI,KAAK;CAEjB,MAAM,UADQ,SAAS,OACA;AACvB,KAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO;EAAE;EAAM,UAAU,EAAE;EAAE;AACnE,KAAI,SAAS,qBACX,QAAO;EAAE;EAAM,UAAU,EAAE;EAAE,WAAW;EAAM;AAGhD,QAAO;EAAE;EAAM,UADE,UAAU,QAAQ,CAAC,KAAK,MAAM,KAAK,GAAG,UAAU,SAAS,QAAQ,EAAE,CAAC;EAC5D;;AAG3B,SAAS,UAAU,OAAoC;AACrD,QAAO,MAAM,UAAU,GAAG,MAAM;EAC9B,MAAM,KAAK,WAAW,EAAE,MAAM,IAAI,CAAC,MAAM,OAAO;EAChD,MAAM,KAAK,WAAW,EAAE,MAAM,IAAI,CAAC,MAAM,OAAO;AAChD,SAAO,OAAO,KAAK,KAAK,KAAK,EAAE,cAAc,GAAG,KAAA,GAAW,EAAE,SAAS,MAAM,CAAC;GAC7E;;AAGJ,SAAS,kBAAkB,OAAiC;AAC1D,MAAK,MAAM,KAAK,OAAO;AACrB,MAAI,EAAE,UAAW,QAAO;AACxB,MAAI,kBAAkB,EAAE,SAAS,CAAE,QAAO;;AAE5C,QAAO;;;;AChFT,SAAgB,aAAa,EAAE,QAAyC;CACtE,MAAM,EAAE,OAAO,QAAQ,MAAM,QAAQ,gBAAgB,eAAe,mBAAmB,KAAK;CAC5F,MAAM,cAAc,gBAAgB;CACpC,MAAM,UAAU,OAAO,UAAU;CACjC,MAAM,YAAY,MAAuC,SAAS,GAAG,SAAS,YAAY;CAE1F,MAAM,WAAW,cACT,gBAAgB,MAAM,MAAM,QAAQ,eAAe,EACzD;EAAC;EAAM;EAAM;EAAQ;EAAe,CACrC;AAED,KAAI,OAAO,WAAW,EACpB,QAAO,oBAAA,UAAA,EAAK,CAAA;AAGd,KAAI,SAAS,SAAS,YAAY;EAChC,MAAM,WAAW,OAAO;EACxB,MAAM,QAAQ,WAAW,SAAS,eAAe,SAAS,QAAQ,MAAM,GAAG;AAC3E,SACE,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,OAAD;GAAK,OAAOC,SAAO;aAAe;GAAwB,CAAA,EAC1D,oBAAC,SAAD;GAAO,OAAOA,SAAO;GAAY,eAAY;aAC3C,oBAAC,SAAD,EAAA,UACE,oBAAC,MAAD;IAAI,OAAOA,SAAO;cAChB,qBAAC,MAAD;KAAI,OAAOA,SAAO;KAAW,eAAY;eAAzC;MACG,WAAW,oBAAC,QAAD;OAAM,OAAO;QAAE,GAAGA,SAAO;QAAQ,YAAY;QAAQ;OAAE,eAAA;OAAc,CAAA;MAChF;MACD,qBAAC,QAAD;OAAM,OAAO;QAAE,SAAS;QAAK,YAAY;QAAG;iBAA5C;QAA8C;QAC3B,OAAO;QAAO;QAC1B;;MACJ;;IACF,CAAA,EACC,CAAA;GACF,CAAA,CACP,EAAA,CAAA;;AAIP,KAAI,SAAS,SAAS,YAAY;EAChC,MAAM,WAAW,SAAS,YAAY;AACtC,MAAI,CAAC,SAAU,QAAO,oBAAA,UAAA,EAAK,CAAA;EAC3B,MAAM,OAAO,KAAK,MAAM,MAAM,EAAE,SAAS,SAAS;AAClD,MAAI,CAAC,KAAM,QAAO,oBAAA,UAAA,EAAK,CAAA;EACvB,MAAM,gBAAgB,KAAK,SAAS,KAAK,QAAQ;GAC/C,MAAM,SAAS;IAAE,GAAG;KAAa,WAAW;IAAK;GAKjD,MAAM,OAJQ,OAAO,MAAM,MAAM;IAC/B,MAAM,QAAQ,EAAE;AAChB,WAAO,OAAO,KAAK,MAAM,CAAC,OAAO,MAAM,MAAM,OAAO,OAAO,GAAG;KAC9D,EACkB,QAAQ;AAC5B,UAAO;IACL;IACA,WAAW;IACX,OAAO,OAAO,SAAS,eAAe,QAAQ,MAAM,GAAG;IACxD;IACD;AACF,SACE,qBAAA,UAAA,EAAA,UAAA,CACE,qBAAC,OAAD;GAAK,OAAOA,SAAO;aAAnB,CAAkC,gBAAa,SAAe;MAC9D,oBAAC,SAAD;GAAO,OAAOA,SAAO;GAAY,eAAY;aAC3C,oBAAC,SAAD,EAAA,UACG,cAAc,KAAK,QAClB,qBAAC,MAAD;IAAkB,OAAOA,SAAO;IAAU,aAAW;IAAU,gBAAc,IAAI;cAAjF,CACE,oBAAC,MAAD;KAAI,OAAO;MAAE,GAAGA,SAAO;MAAW,OAAO;MAAO;eAAG,IAAI;KAAS,CAAA,EAChE,qBAAC,MAAD;KAAI,OAAOA,SAAO;eAAlB,CACG,WAAW,IAAI,aACd,oBAAC,QAAD;MACE,OAAO;OAAE,GAAGA,SAAO;OAAQ,YAAY;OAAQ;MAC/C,cAAY,IAAI;MAChB,eAAA;MACA,CAAA,EAEH,IAAI,MACF;OACF;MAZI,IAAI,IAYR,CACL,EACI,CAAA;GACF,CAAA,CACP,EAAA,CAAA;;CAQP,MAAM,CAAC,SAAS,SAAS,GAAG,SAJZ,SAAS,YACtB,KAAK,SAAS,KAAK,MAAM,MAAM,EAAE,SAAS,KAAK,CAAC,CAChD,QAAQ,MAA4B,QAAQ,EAAE,CAAC,CAC/C,UAAU,GAAG,MAAM,EAAE,SAAS,SAAS,EAAE,SAAS,OAAO;AAE5D,KAAI,CAAC,WAAW,CAAC,QAAS,QAAO,oBAAA,UAAA,EAAK,CAAA;AAEtC,QACE,qBAAA,UAAA,EAAA,UAAA;EACE,qBAAC,OAAD;GAAK,OAAOA,SAAO;aAAnB,CAAkC,gBAAa,SAAS,YAAY,KAAK,MAAM,CAAO;;EACtF,qBAAC,SAAD;GAAO,OAAOA,SAAO;GAAY,eAAY;aAA7C,CACE,oBAAC,SAAD,EAAA,UACE,qBAAC,MAAD;IAAI,OAAOA,SAAO;cAAlB,CACE,qBAAC,MAAD;KAAI,OAAO;MAAE,GAAGA,SAAO;MAAW,WAAW;MAAQ,SAAS;MAAK;eAAnE;MACG,QAAQ;MAAK;MAAI,QAAQ;MACvB;QACJ,QAAQ,SAAS,KAAK,QACrB,oBAAC,MAAD;KAAc,OAAO;MAAE,GAAGA,SAAO;MAAW,WAAW;MAAQ,SAAS;MAAK;eAC1E;KACE,EAFI,IAEJ,CACL,CACC;OACC,CAAA,EACR,oBAAC,SAAD,EAAA,UACG,QAAQ,SAAS,KAAK,QACrB,qBAAC,MAAD;IAAc,OAAOA,SAAO;cAA5B,CACE,oBAAC,MAAD;KAAI,OAAOA,SAAO;eAAY;KAAS,CAAA,EACtC,QAAQ,SAAS,KAAK,QAAQ;KAM7B,MAAM,OAAO,UAAU,QALgB;MACrC,GAAG;OACF,QAAQ,OAAO;OACf,QAAQ,OAAO;MACjB,CACqC;KACtC,MAAM,QAAQ,OAAO,SAAS,eAAe,QAAQ,MAAM,GAAG;AAC9D,YACE,qBAAC,MAAD;MAAc,OAAOA,SAAO;MAAW,YAAU;MAAK,YAAU;gBAAhE,CACG,WAAW,QACV,oBAAC,QAAD;OACE,OAAO;QAAE,GAAGA,SAAO;QAAQ,YAAY;QAAQ;OAC/C,cAAY;OACZ,eAAA;OACA,CAAA,EAEH,MACE;QATI,IASJ;MAEP,CACC;MAvBI,IAuBJ,CACL,EACI,CAAA,CACF;;EACP,MAAM,SAAS,KACd,qBAAC,OAAD;GAAK,OAAO;IAAE,GAAGA,SAAO;IAAoB,WAAW;IAAG;aAA1D;IAA4D;IACnC,MAAM,KAAK,MAAM,EAAE,KAAK,CAAC,KAAK,KAAK;IAAC;IAEvD;;EAEP,EAAA,CAAA;;AAIP,SAAS,SAAS,OAAgC,SAAkB,QAA6B;AAC/F,KAAI,CAAC,MAAO,QAAO;AACnB,KAAI,QAAS,QAAO,YAAY,MAAM,QAAQ,OAAO,CAAC;AACtD,QAAO,YAAY,MAAM,OAAO;;AAGlC,SAAS,WACP,gBACA,WACA,MACQ;CACR,MAAM,IAAI,eAAe,aAAa;AACtC,QAAO,IAAI,YAAY,EAAE,OAAO,GAAG;;AAGrC,SAAS,UACP,QACA,OACoB;AAMpB,QALc,OAAO,MAAM,MAAM;EAC/B,MAAM,QAAQ,EAAE;AAEhB,SADa,OAAO,KAAK,MAAM,CACnB,OAAO,MAAM,MAAM,OAAO,MAAM,GAAG;GAC/C,EACY;;AAGhB,SAAS,gBACP,MACA,MACA,QACA,gBACU;CACV,MAAM,cAAwB,EAAE;AAChC,MAAK,MAAM,QAAQ,MAAM;EACvB,MAAM,2BAAW,IAAI,KAAkC;AACvD,OAAK,MAAM,SAAS,QAAQ;GAC1B,MAAM,SAAS,KACZ,QAAQ,MAAM,EAAE,SAAS,KAAK,KAAK,CACnC,KAAK,MAAM,GAAG,EAAE,KAAK,GAAG,MAAM,MAAM,EAAE,SAAS,KAAK,CACpD,KAAK,IAAI;GACZ,MAAM,MAAM,MAAM,MAAM,KAAK,SAAS;GACtC,MAAM,SAAS,SAAS,IAAI,OAAO,oBAAI,IAAI,KAAqB;AAChE,UAAO,IAAI,KAAK,WAAW,gBAAgB,MAAM,MAAM,KAAK,CAAC;AAC7D,YAAS,IAAI,QAAQ,OAAO;;EAE9B,IAAI,SAAS;AACb,OAAK,MAAM,UAAU,SAAS,QAAQ,CAEpC,KADe,IAAI,IAAI,OAAO,QAAQ,CAAC,CAC5B,OAAO,GAAG;AACnB,YAAS;AACT;;AAGJ,MAAI,OAAQ,aAAY,KAAK,KAAK,KAAK;;AAEzC,KAAI,YAAY,WAAW,EAAG,QAAO;EAAE,MAAM;EAAY;EAAa;AACtE,KAAI,YAAY,WAAW,EAAG,QAAO;EAAE,MAAM;EAAY;EAAa;AACtE,QAAO;EAAE,MAAM;EAAc;EAAa;;;;ACxN5C,SAAgB,mBAAmB,EAAE,QAAsD;CACzF,MAAM,EAAE,UAAU,mBAAmB,KAAK;AAC1C,KAAI,CAAC,MAAO,QAAO;AACnB,QAAO,oBAAC,2BAAD;EAA2B,MAAM,MAAM;EAAO,UAAU,MAAM;EAAU,CAAA;;AAGjF,SAAgB,0BAA0B,EACxC,MACA,YAIsB;AACtB,KAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AAEtD,KAAI,SAAS,cAAc;EACzB,MAAM,IAAI;AACV,SAAO,mBAAmB;GACxB,CAAC,cAAc,iBAAiB,EAAE,cAAc,CAAC;GACjD,CAAC,YAAY,qBAAqB,EAAE,YAAY,CAAC;GACjD,CAAC,cAAc,gBAAgB,EAAE,cAAc,CAAC;GAChD,CAAC,cAAc,gBAAgB,EAAE,cAAc,CAAC;GAChD,CAAC,iBAAiB,qBAAqB,EAAE,iBAAiB,CAAC;GAC5D,CAAC;;AAGJ,KAAI,SAAS,UAAU;EACrB,MAAM,IAAI;AACV,SAAO,mBAAmB;GACxB,CAAC,SAAS,iBAAiB,EAAE,SAAS,CAAC;GACvC,CAAC,SAAS,qBAAqB,EAAE,SAAS,CAAC;GAC3C,CAAC,SAAS,gBAAgB,EAAE,SAAS,CAAC;GACvC,CAAC;;AAGJ,KAAI,SAAS,cAAc;EACzB,MAAM,IAAI;AACV,SAAO,mBAAmB;GACxB,CAAC,YAAY,qBAAqB,EAAE,YAAY,CAAC;GACjD,CAAC,kBAAkB,gBAAgB,EAAE,kBAAkB,CAAC;GACxD,CAAC,SAAS,qBAAqB,EAAE,SAAS,CAAC;GAC5C,CAAC;;AAGJ,KAAI,SAAS,UAAU;EACrB,MAAM,SAAS,MAAM,QAAQ,SAAS,GAAG,WAAW,CAAC,SAAS;EAC9D,MAAM,QAAQ,OAAO,SAAS;AAC9B,SACE,oBAAC,OAAD;GAAK,OAAOC,SAAO;aAChB,OAAO,KAAK,OAAO,MAAM;IACxB,MAAM,IAAI;AACV,WACE,qBAAC,OAAD;KAAgC,OAAO,EAAE,SAAS,YAAY;eAA9D;MACG,SAAS,qBAAC,OAAD;OAAK,OAAOA,SAAO;iBAAnB,CAAyC,UAAO,IAAI,EAAQ;;MACtE,oBAAC,aAAD;OAAa,OAAM;OAAQ,OAAO,iBAAiB,EAAE,SAAS;OAAI,CAAA;MAClE,oBAAC,aAAD;OAAa,OAAM;OAAU,OAAO,qBAAqB,EAAE,WAAW;OAAI,CAAA;MAC1E,oBAAC,aAAD;OAAa,OAAM;OAAU,OAAO,qBAAqB,EAAE,WAAW;OAAI,CAAA;MAC1E,oBAAC,aAAD;OAAa,OAAM;OAAO,OAAO,qBAAqB,EAAE,QAAQ;OAAI,CAAA;MACpE,oBAAC,aAAD;OAAa,OAAM;OAAS,OAAO,qBAAqB,EAAE,UAAU;OAAI,CAAA;MACvE,WAAW,KAAK,oBAAC,aAAD;OAAa,OAAM;OAAQ,OAAO,gBAAgB,EAAE,SAAS;OAAI,CAAA;MAC9E;OARI,eAAe,GAAG,EAAE,CAQxB;KAER;GACE,CAAA;;AAIV,KAAI,SAAS,YAAY;EACvB,MAAM,QAAQ,MAAM,QAAQ,SAAS,GAAG,WAAW,EAAE;AACrD,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SACE,oBAAC,OAAD;GAAK,OAAOA,SAAO;aAChB,MAAM,KAAK,MAAM,MAAM;IACtB,MAAM,IAAI;AAEV,WACE,oBAAC,aAAD;KAEE,OAAO,KAJM,OAAO,EAAE,gBAAgB,WAAW,EAAE,cAAc,KAI3C,KAAK,QAAQ,EAAE,CAAC;KACtC,OAAO,iBAAiB,EAAE,SAAS;KACnC,EAHK,gBAAgB,GAAG,EAAE,CAG1B;KAEJ;GACE,CAAA;;AAIV,QAAO;;AAGT,SAAS,mBAAmB,MAAoD;AAC9E,QACE,oBAAC,OAAD;EAAK,OAAOA,SAAO;YAChB,KACE,QAAQ,GAAG,OAAO,MAAM,KAAK,CAC7B,KAAK,CAAC,GAAG,OACR,oBAAC,aAAD;GAAqB,OAAO;GAAG,OAAO,KAAK;GAAM,EAA/B,EAA+B,CACjD;EACA,CAAA;;AAIV,SAAS,YAAY,EAAE,OAAO,SAAgE;AAC5F,QACE,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,QAAD;EAAM,OAAOA,SAAO;YAAe;EAAa,CAAA,EAChD,oBAAC,QAAD,EAAA,UAAO,SAAS,KAAW,CAAA,CAC1B,EAAA,CAAA;;AAIP,SAAS,gBAAgB,GAA2B;AAClD,KAAI,KAAK,KAAM,QAAO;AACtB,KAAI,OAAO,MAAM,YAAY,OAAO,MAAM,YAAY,OAAO,MAAM,UAAW,QAAO,OAAO,EAAE;AAC9F,QAAO,KAAK,UAAU,EAAE;;AAG1B,SAAS,iBAAiB,GAA2B;AACnD,KAAI,KAAK,KAAM,QAAO;AACtB,KAAI,OAAO,MAAM,SAAU,QAAO;AAClC,KAAI,MAAM,QAAQ,EAAE,CAAE,QAAO,EAAE,IAAI,OAAO,CAAC,KAAK,KAAK;AACrD,QAAO,KAAK,UAAU,EAAE;;AAG1B,SAAS,qBAAqB,GAA2B;AACvD,KAAI,KAAK,KAAM,QAAO;AACtB,KAAI,OAAO,MAAM,YAAY,OAAO,MAAM,SAAU,QAAO,OAAO,EAAE;AACpE,KAAI,OAAO,MAAM,UAAU;EACzB,MAAM,IAAI;AACV,MAAI,OAAO,EAAE,UAAU,YAAY,OAAO,EAAE,SAAS,SAAU,QAAO,GAAG,EAAE,QAAQ,EAAE;;AAEvF,QAAO,KAAK,UAAU,EAAE;;AAG1B,SAAS,iBAAiB,GAA2B;AACnD,KAAI,KAAK,KAAM,QAAO;AACtB,KAAI,OAAO,MAAM,SAAU,QAAO;AAClC,KAAI,OAAO,MAAM,UAAU;EACzB,MAAM,IAAI;AACV,MAAI,MAAM,QAAQ,EAAE,WAAW,IAAI,OAAO,EAAE,eAAe,UAAU;GACnE,MAAM,QAAQ,EAAE,WAAW,KAAK,MAAO,OAAO,MAAM,WAAW,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAE;GACzF,MAAM,QAAQ,OAAO,EAAE,UAAU,YAAY,EAAE,UAAU,IAAI,MAAM,EAAE,UAAU;AAC/E,UAAO,GAAG,EAAE,WAAW,GAAG,MAAM,KAAK,IAAI,GAAG,MAAM;;;AAGtD,QAAO,KAAK,UAAU,EAAE;;AAG1B,SAAS,eAAe,OAAgC,UAA0B;AAShF,QAAO,UARO;EACZ,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACP,CAAC,KAAK,MAAO,MAAM,KAAA,IAAY,KAAK,KAAK,UAAU,EAAE,CAAE,CACjC,KAAK,IAAI,CAAC,GAAG;;AAGtC,SAAS,gBAAgB,MAA+B,UAA0B;AAChF,QAAO,QAAQ,KAAK,eAAe,SAAS,GAAG,KAAK,UAAU,KAAK,SAAS;;;;AC/J9E,MAAM,UAAU;AAEhB,MAAM,uBAAuB,IAAI,IAAI;CACnC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAgB,iBAAiB,EAAE,QAAoD;CACrF,MAAM,EAAE,OAAO,WAAW,mBAAmB,KAAK;AAClD,KAAI,CAAC,MAAO,QAAO;AACnB,QAAO,oBAAC,yBAAD;EAAyB,MAAM,MAAM;EAAe;EAAQ,UAAU,MAAM;EAAU,CAAA;;AAG/F,SAAgB,wBAAwB,EACtC,MACA,QACA,YAKsB;AACtB,KAAI,SAAS,cAAc;EACzB,MAAM,OAAO,OAAO,QAAQ,UAAU,GAAG,CAAC,QAAQ,OAAO,GAAG;AAC5D,SACE,oBAAC,OAAD;GACE,OAAO;IACL,GAAGC,SAAO;IACV,YAAY,OAAO,KAAK;IACxB,UAAU,OAAO,KAAK;IACtB,YAAY,OAAO,KAAK;IACxB,YAAY,OAAO,KAAK;IACxB,eAAe,OAAO,KAAK;IAC5B;aAEA;GACG,CAAA;;AAGV,KAAI,SAAS,SACX,QAAO,oBAAC,OAAD;EAAK,OAAO;GAAE,GAAGA,SAAO;GAAc,WAAW;GAAQ;EAAE,eAAA;EAAc,CAAA;AAElF,KAAI,SAAS,SACX,QAAO,oBAAC,OAAD;EAAK,OAAO;GAAE,GAAGA,SAAO;GAAc,QAAQ;GAAQ;EAAE,eAAA;EAAc,CAAA;AAE/E,KAAI,SAAS,aACX,QAAO,oBAAC,kBAAD,EAAkB,YAAY,QAAU,CAAA;AAEjD,KAAI,SAAS,YACX,QACE,oBAAC,OAAD;EAAK,OAAOA,SAAO;YACjB,oBAAC,OAAD;GAAK,OAAO;IAAE,GAAGA,SAAO;IAAc,OAAO;IAAQ;GAAE,eAAA;GAAc,CAAA;EACjE,CAAA;AAGV,KAAI,SAAS,WACX,QAAO,oBAAC,kBAAD,EAAkB,YAAY,QAAQ,OAAO,QAAU,CAAA;AAEhE,KAAI,SAAS,aACX,QAAO,oBAAC,OAAD;EAAK,OAAO;GAAE,GAAGA,SAAO;GAAkB,YAAY;GAAQ;YAAG;EAAc,CAAA;AAExF,KAAI,SAAS,aACX,QACE,oBAAC,OAAD;EACE,OAAO;GACL,GAAGA,SAAO;GACV,YAAY;GACb;YACF;EAEK,CAAA;AAGV,KAAI,SAAS,cACX,QAAO,oBAAC,kBAAD,EAAkB,YAAY,cAAc,UAAY,CAAA;AAEjE,KAAI,SAAS,WACX,QACE,oBAAC,OAAD;EACE,OAAO;GAAE,GAAGA,SAAO;GAAgB,YAAY,6BAA6B,OAAO;GAAI;EACvF,eAAA;EACA,CAAA;AAGN,KAAI,SAAS,cACX,QAAO,oBAAC,oBAAD,EAAoB,OAAO,UAAY,CAAA;AAEhD,KAAI,SAAS,QACX,QACE,qBAAC,OAAD;EAAK,OAAOA,SAAO;EAAgB,eAAA;YAAnC,CACE,oBAAC,OAAD,EAAK,OAAO;GAAE,GAAGA,SAAO;GAAkB,YAAY;GAAQ,EAAI,CAAA,EAClE,oBAAC,OAAD,EAAK,OAAO;GAAE,GAAGA,SAAO;GAAiB,YAAY;GAAQ,EAAI,CAAA,CAC7D;;AAGV,QAAO;;AAGT,SAAS,mBAAmB,EAAE,SAA2C;AACvE,KAAI,OAAO,UAAU,YAAY,qBAAqB,IAAI,MAAM,CAC9D,QACE,oBAAC,OAAD;EACE,OAAO;GACL,GAAGA,SAAO;GACV,gBAAgB;GACjB;EACD,eAAA;EACA,CAAA;AAGN,KAAI,SAAS,OAAO,UAAU,YAAY,eAAe,OAAO;EAC9D,MAAM,IAAI;EAIV,MAAM,UAAU,cAAc,EAAE,UAAU;AAC1C,MAAI,QAAQ,WAAW,EACrB,QACE,oBAAC,OAAD;GAAK,OAAOA,SAAO;aAAqB;GAElC,CAAA;EAGV,MAAM,MAAM,OAAO,EAAE,YAAY,WAAW,EAAE,UAAU;AACxD,SACE,oBAAC,OAAD;GACE,OAAOA,SAAO;GACd,SAAQ;GACR,qBAAoB;GACpB,eAAA;aAEA,oBAAC,QAAD;IACE,IAAG;IACH,IAAG;IACH,IAAG;IACH,IAAG;IACH,QAAO;IACP,aAAY;IACZ,iBAAiB,QAAQ,KAAK,IAAI;IAClC,eAAe;IACf,CAAA;GACE,CAAA;;AAGV,QAAO,oBAAC,OAAD;EAAK,OAAOA,SAAO;YAAqB;EAA+C,CAAA;;AAGhG,SAAS,cAAc,KAAwB;AAC7C,KAAI,CAAC,MAAM,QAAQ,IAAI,CAAE,QAAO,EAAE;CAClC,MAAM,MAAgB,EAAE;AACxB,MAAK,MAAM,SAAS,KAAK;AACvB,MAAI,OAAO,UAAU,UAAU;AAC7B,OAAI,KAAK,MAAM;AACf;;AAEF,MAAI,SAAS,OAAO,UAAU,UAAU;GACtC,MAAM,IAAI;AACV,OAAI,OAAO,EAAE,UAAU,SAAU,KAAI,KAAK,EAAE,MAAM;;;AAGtD,QAAO;;AAGT,SAAS,iBAAiB,EAAE,cAAoD;CAC9E,MAAM,UAAU,yBAAyB;CACzC,MAAM,CAAC,OAAO,YAAY,SAAgB,EAAE;AAE5C,iBAAgB;AACd,MAAI,QAAS;EACb,MAAM,KAAK,4BAA4B,SAAS,EAAE,CAAC;EACnD,MAAM,OAAO,OAAO,kBAAkB;AACpC,aAAU,MAAO,MAAM,IAAI,IAAI,EAAG;KACjC,KAAK;AACR,eAAa;AACX,wBAAqB,GAAG;AACxB,UAAO,cAAc,KAAK;;IAE3B,CAAC,QAAQ,CAAC;AAEb,KAAI,QACF,QACE,oBAAC,OAAD;EAAK,OAAOA,SAAO;YAAe;EAE5B,CAAA;AAIV,QACE,oBAAC,OAAD;EAAK,OAAOA,SAAO;YACjB,oBAAC,OAAD;GACE,OAAO;IACL,GAAGA,SAAO;IACV,MAAM,UAAU,IAAI,sBAAsB;IAC1C;IACD;GACD,eAAA;GACA,CAAA;EACE,CAAA;;;;AC5MV,SAAgB,eAAe,EAAE,QAAkD;CACjF,MAAM,EAAE,OAAO,QAAQ,eAAe,mBAAmB,KAAK;AAE9D,KAAI,CAAC,MAAO,QAAO;CAEnB,MAAM,aAAa,OAAO,QAAQ,WAAW,CAC1C,KAAK,CAAC,GAAG,OAAO,GAAG,EAAE,GAAG,IAAI,CAC5B,KAAK,KAAK;AAEb,QACE,qBAAA,UAAA,EAAA,UAAA;EACE,oBAAC,OAAD;GAAK,OAAOC,SAAO;aAAe;GAAqB,CAAA;EACtD,cACC,qBAAC,OAAD;GAAK,OAAOA,SAAO;aAAnB,CAAmC,kBACnB,oBAAC,UAAD,EAAA,UAAS,YAAoB,CAAA,CACvC;;EAER,oBAAC,WAAD;GAAW,OAAM;GAAO,OAAO;GAAM,QAAO;GAAyB,CAAA;EACrE,oBAAC,WAAD;GAAW,OAAM;GAAM,OAAO;GAAQ,QAAO;GAAwB,CAAA;EACpE,EAAA,CAAA;;AAUP,SAAS,UAAU,EAAE,OAAO,OAAO,UAAwC;AACzE,QACE,qBAAC,OAAD;EAAK,OAAOA,SAAO;YAAnB;GACE,oBAAC,QAAD;IAAM,OAAOA,SAAO;cAAmB;IAAa,CAAA;GACpD,oBAAC,QAAD;IAAM,OAAOA,SAAO;IAAkB,eAAa;cAChD;IACI,CAAA;GACP,oBAAC,YAAD;IAAY,MAAM;IAAO,QAAQ,GAAG,OAAO;IAAU,CAAA;GACjD;;;AAIV,SAAS,WAAW,EAAE,MAAM,UAA0D;CACpF,MAAM,CAAC,QAAQ,aAAa,SAAS,MAAM;AAC3C,QACE,oBAAC,UAAD;EACE,MAAK;EACL,OAAOA,SAAO;EACd,eAAa;EACb,eAAe;AACR,mBAAgB,KAAK,CAAC,MAAM,OAAO;AACtC,QAAI,CAAC,GAAI;AACT,cAAU,KAAK;AACf,WAAO,iBAAiB,UAAU,MAAM,EAAE,KAAK;KAC/C;;YAGH,SAAS,WAAW;EACd,CAAA;;AAIb,eAAe,gBAAgB,MAAgC;AAC7D,KAAI,OAAO,cAAc,eAAe,CAAC,UAAU,UAAW,QAAO;AACrE,KAAI;AACF,QAAM,UAAU,UAAU,UAAU,KAAK;AACzC,SAAO;SACD;AACN,SAAO;;;;;AClEX,SAAgB,YAAY,EAAE,MAAM,WAA2C;CAC7E,MAAM,EAAE,OAAO,QAAQ,gBAAgB,mBAAmB,KAAK;AAE/D,KAAI,CAAC,MACH,QACE,qBAAC,OAAD;EAAK,OAAOC,SAAO;YAAnB;GAA4B;GACpB,oBAAC,QAAD,EAAA,UAAO,MAAY,CAAA;;GAAoB,oBAAC,UAAD,EAAA,UAAS,aAAqB,CAAA;;GACvE;;AAIV,QACE,qBAAA,UAAA,EAAA,UAAA;EACE,oBAAC,MAAD;GAAI,OAAOA,SAAO;aAAU,WAAW;GAAU,CAAA;EACjD,qBAAC,OAAD;GAAK,OAAOA,SAAO;aAAnB,CACG,MAAM,SAAS,oBAAC,QAAD;IAAM,OAAOA,SAAO;cAAW,MAAM;IAAa,CAAA,EAClE,oBAAC,QAAD,EAAA,UAAO,QAAc,CAAA,CACjB;;EACL,MAAM,gBAAgB,oBAAC,KAAD;GAAG,OAAOA,SAAO;aAAc,MAAM;GAAiB,CAAA;EAC5E,EAAA,CAAA;;;;ACrBP,SAAgB,kBAAkB,EAAE,QAAqD;CACvF,MAAM,EAAE,OAAO,WAAW,mBAAmB,KAAK;AAClD,KAAI,CAAC,MAAO,QAAO;AACnB,QACE,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,OAAD;EAAK,OAAOC,SAAO;YAAe;EAAW,CAAA,EAC7C,oBAAC,QAAD;EAAM,OAAOA,SAAO;YAAU,UAAU,OAAO;EAAU,CAAA,CACxD,EAAA,CAAA;;;;ACMP,SAAgB,YAAY,EAAE,MAAM,WAA2C;CAC7E,MAAM,EAAE,OAAO,QAAQ,gBAAgB,mBAAmB,KAAK;CAC/D,MAAM,cAAc,gBAAgB;AAEpC,KAAI,CAAC,MACH,QACE,oBAAC,OAAD;EAAK,cAAY;EAAa,OAAOC,SAAO;YAC1C,qBAAC,OAAD;GAAK,OAAOA,SAAO;aAAnB;IAA4B;IACpB,oBAAC,QAAD,EAAA,UAAO,MAAY,CAAA;;IAAoB,oBAAC,UAAD,EAAA,UAAS,aAAqB,CAAA;;IACvE;;EACF,CAAA;CAIV,MAAM,UAAU,MAAM,UAAU;CAChC,MAAM,YAAY,UAAU,YAAY,MAAM,QAAQ,YAAY,GAAG;CACrE,MAAM,QAAQ,YAAY,UAAU,QAAQ,YAAY,MAAM,OAAO;CACrE,MAAM,aAAa,WAAW,cAAc;AAE5C,QACE,qBAAC,OAAD;EAAK,cAAY;EAAa,OAAOA,SAAO;YAA5C;GACE,oBAAC,aAAD;IAAmB;IAAM,GAAK,YAAY,KAAA,KAAa,EAAE,SAAS;IAAK,CAAA;GAEvE,qBAAC,OAAD;IAAK,OAAOA,SAAO;cAAnB,CAAkC,qBAAkB,YAAkB;;GACtE,oBAAC,kBAAD,EAAwB,MAAQ,CAAA;GAChC,oBAAC,oBAAD,EAA0B,MAAQ,CAAA;GAClC,qBAAC,OAAD;IAAK,OAAOA,SAAO;cAAnB;KACG,WAAW,oBAAC,QAAD;MAAM,OAAO;OAAE,GAAGA,SAAO;OAAQ,YAAY;OAAQ;MAAE,eAAA;MAAc,CAAA;KACjF,oBAAC,QAAD,EAAA,UAAO,OAAa,CAAA;KACnB,cACC,oBAAC,QAAD;MACE,OAAM;MACN,cAAW;MACX,OAAO,EAAE,YAAY,GAAG;gBACzB;MAEM,CAAA;KAEL;;GAEN,oBAAC,YAAD,EAAkB,MAAQ,CAAA;GAC1B,oBAAC,WAAD,EAAiB,MAAQ,CAAA;GACzB,oBAAC,mBAAD,EAAyB,MAAQ,CAAA;GACjC,oBAAC,gBAAD,EAAsB,MAAQ,CAAA;GAC9B,oBAAC,cAAD,EAAoB,MAAQ,CAAA;GACxB;;;;;ACrBV,MAAMC,WAAS;CACb,SAAS;CACT,SAAS;EACP,SAAS;EACT,OAAO;EACP,UAAU;EACX;CACD,MAAM;EACJ,WAAW;EACX,QAAQ;EACR,SAAS;EACV;CACD,QAAQ;EACN,WAAW;EACX,QAAQ;EACR,aAAa;EACb,YAAY;EACb;CACD,UAAU;EACR,SAAS;EACT,YAAY;EACZ,KAAK;EACL,SAAS;EACT,cAAc;EACd,QAAQ;EACR,YAAY;EACZ,YAAY;EACZ,UAAU;EACX;CACD,SAAS;EACP,SAAS;EACT,YAAY;EACZ,KAAK;EACL,SAAS;EACT,cAAc;EACd,QAAQ;EACR,YAAY;EACZ,UAAU;EACX;CACD,OAAO;EACL,SAAS;EACT,OAAO;EACP,WAAW;EACX,OAAO;EACR;CACD,MAAM;EACJ,YAAY;EACZ,UAAU;EACX;CACD,UAAU;EACR,SAAS;EACT,SAAS;EACT,cAAc;EACd,UAAU;EACV,eAAe;EACf,eAAe;EACf,YAAY;EACb;CACD,OAAO;EACL,UAAU;EACV,OAAO;EACP,YAAY;EACZ,WAAW;EACX,UAAU;EACV,WAAW;EACZ;CACD,OAAO;EACL,YAAY;EACZ,UAAU;EACV,OAAO;EACR;CACD,aAAa;EACX,SAAS;EACT,OAAO;EACP,QAAQ;EACR,cAAc;EACd,QAAQ;EACT;CACD,YAAY;EACV,SAAS;EACT,YAAY;EACZ,gBAAgB;EAChB,YAAY;EACb;CACD,OAAO;EACL,SAAS;EACT,WAAW;EACX,OAAO;EACR;CACD,UAAU;EACR,UAAU;EACV,OAAO;EACP,YAAY;EACZ,QAAQ;EACR,SAAS;EACT,YAAY;EACZ,gBAAgB;EACjB;CACD,OAAO;EACL,OAAO;EACP,QAAQ;EACR,WAAW;EACX,YAAY;EACZ,OAAO;EACP,WAAW;EACX,SAAS;EACT,UAAU;EACX;CACD,aAAa;EACX,UAAU;EACV,KAAK;EACL,OAAO;EACP,OAAO;EACP,QAAQ;EACR,cAAc;EACd,QAAQ;EACR,YAAY;EACZ,OAAO;EACP,QAAQ;EACR,UAAU;EACV,YAAY;EACb;CACF;AAED,SAAS,UAAU,UAAwC,MAAsC;CAC/F,MAAM,aAAa,QAAQ,KAAK,SAAS,IAAI,GAAG,KAAK,KAAK;CAC1D,MAAM,eAAe,OAAO,KAAK,MAAM,IAAI,GAAG,EAAE;CAEhD,MAAM,UAAU,OAAO,QAAQ,SAAS,CAAC,QAAQ,CAAC,UAAU;AAC1D,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,SAAS,QAAQ,KAAK,WAAW,WAAW;GACnD;CAEF,MAAM,WAAsB;EAAE,MAAM;EAAS,SAAS;EAAI,MAAM;EAAI,UAAU,EAAE;EAAE;AAElF,MAAK,MAAM,CAAC,MAAM,UAAU,SAAS;EACnC,MAAM,YAAY,OAAQ,SAAS,OAAO,KAAK,KAAK,MAAM,WAAW,OAAO,GAAI;EAChF,MAAM,WAAW,UAAU,SAAS,IAAI,UAAU,MAAM,IAAI,GAAG,EAAE;EAEjE,IAAI,OAAkB;AACtB,OAAK,IAAI,IAAI,GAAG,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG;GAC/C,MAAM,MAAM,SAAS;GACrB,MAAM,SAAS,CAAC,GAAG,cAAc,GAAG,SAAS,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC,KAAK,IAAI;GACvE,IAAI,QAAQ,KAAK,SAAS,MACvB,MAAsB,EAAE,SAAS,WAAW,EAAE,YAAY,IAC5D;AACD,OAAI,CAAC,OAAO;AACV,YAAQ;KAAE,MAAM;KAAS,SAAS;KAAK,MAAM;KAAQ,UAAU,EAAE;KAAE;AACnE,SAAK,SAAS,KAAK,MAAM;;AAE3B,UAAO;;EAGT,MAAM,cAAc,SAAS,SAAS,SAAS;AAC/C,MAAI,gBAAgB,KAAA,EAClB,MAAK,SAAS,KAAK;GACjB,MAAM;GACN,SAAS,OAAQ,aAAa,aAAa,SAAS,MAAM,OAAQ;GAClE;GACA;GACD,CAAC;MAEF,MAAK,SAAS,KAAK;GAAE,MAAM;GAAQ,SAAS;GAAa;GAAM;GAAO,CAAC;;AAI3E,UAAS,SAAS;AAElB,QAAO,SAAS;;AAGlB,SAAS,SAAS,MAAuB;AACvC,MAAK,SAAS,MAAM,GAAG,MAAM;AAC3B,MAAI,EAAE,SAAS,EAAE,KAAM,QAAO,EAAE,SAAS,UAAU,KAAK;AACxD,SAAO,EAAE,QAAQ,cAAc,EAAE,SAAS,KAAA,GAAW,EAAE,SAAS,MAAM,CAAC;GACvE;AACF,MAAK,MAAM,KAAK,KAAK,SACnB,KAAI,EAAE,SAAS,QAAS,UAAS,EAAE;;AAIvC,SAAS,uBAAuB,OAAmB,gBAAwB,KAAwB;AACjG,KAAI,kBAAkB,EAAG;AACzB,MAAK,MAAM,QAAQ,OAAO;AACxB,MAAI,KAAK,SAAS,QAAS;AAC3B,MAAI,IAAI,KAAK,KAAK;AAClB,yBAAuB,KAAK,UAAU,iBAAiB,GAAG,IAAI;;;AAIlE,SAAS,YAAY,MAAwB;AAC3C,KAAI,KAAK,SAAS,OAAQ,QAAO;CACjC,IAAI,IAAI;AACR,MAAK,MAAM,KAAK,KAAK,SAAU,MAAK,YAAY,EAAE;AAClD,QAAO;;AAGT,SAAgB,eAAe,EAC7B,MACA,oBAAoB,GACpB,YACoC;CACpC,MAAM,EAAE,UAAU,gBAAgB,YAAY;CAE9C,MAAM,OAAO,cAAc,UAAU,UAAU,KAAK,EAAE,CAAC,UAAU,KAAK,CAAC;CAEvE,MAAM,kBAAkB,cAAc;EACpC,MAAM,sBAAM,IAAI,KAAa;AAC7B,yBAAuB,MAAM,mBAAmB,IAAI;AACpD,SAAO;IACN,CAAC,MAAM,kBAAkB,CAAC;CAE7B,MAAM,CAAC,UAAU,eAAe,SAAsB,gBAAgB;AACtE,iBAAgB;AACd,cAAY,gBAAgB;IAC3B,CAAC,gBAAgB,CAAC;CAErB,MAAM,CAAC,cAAc,mBAAmB,SAAwB,KAAK;CAErE,MAAM,SAAS,aAAa,SAAuB;AACjD,eAAa,SAAS;GACpB,MAAM,OAAO,IAAI,IAAI,KAAK;AAC1B,OAAI,KAAK,IAAI,KAAK,CAAE,MAAK,OAAO,KAAK;OAChC,MAAK,IAAI,KAAK;AACnB,UAAO;IACP;IACD,EAAE,CAAC;CAEN,MAAM,kBAAkB,aACrB,SAAiB;AAChB,MAAI,SAAU,UAAS,KAAK;MACvB,iBAAgB,KAAK;IAE5B,CAAC,SAAS,CACX;AAED,KAAI,KAAK,WAAW,EAClB,QACE,oBAAC,OAAD;EAAK,cAAY;EAAa,OAAOA,SAAO;YAC1C,oBAAC,OAAD;GAAK,OAAOA,SAAO;aAChB,OAAO,oBAAoB,KAAK,MAAM;GACnC,CAAA;EACF,CAAA;AAIV,QACE,qBAAC,OAAD;EAAK,cAAY;EAAa,OAAOA,SAAO;YAA5C;GACE,qBAAC,OAAD;IAAK,OAAOA,SAAO;cAAnB;KACG,OAAO,gBAAgB,SAAS;KAAc;KAAI;KAC/C;;GACN,oBAAC,MAAD;IAAI,OAAOA,SAAO;IAAM,MAAK;cAC1B,KAAK,KAAK,SACT,oBAAC,aAAD;KAEQ;KACI;KACV,UAAU;KACV,aAAa;KACb,EALK,KAAK,QAAQ,KAAK,QAKvB,CACF;IACC,CAAA;GAEJ,iBAAiB,QAChB,oBAAC,eAAD;IAAe,MAAM;IAAc,eAAe,gBAAgB,KAAK;IAAI,CAAA;GAEzE;;;AAWV,SAAS,YAAY,EAAE,MAAM,UAAU,UAAU,eAA+C;AAC9F,KAAI,KAAK,SAAS,OAChB,QAAO,oBAAC,SAAD;EAAe;EAAmB;EAAe,CAAA;CAE1D,MAAM,SAAS,SAAS,IAAI,KAAK,KAAK;CACtC,MAAM,SAAS,MAA2C;AACxD,MAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,KAAE,gBAAgB;AAClB,YAAS,KAAK,KAAK;;;AAGvB,QACE,qBAAC,MAAD;EAAI,MAAK;EAAW,iBAAe;YAAnC,CACE,qBAAC,OAAD;GACE,MAAK;GACL,UAAU;GACV,OAAOA,SAAO;GACd,eAAe,SAAS,KAAK,KAAK;GAClC,WAAW;GACX,aAAW,KAAK;GAChB,eAAY;aAPd;IASE,oBAAC,QAAD;KAAM,OAAOA,SAAO;KAAO,eAAA;eACxB,SAAS,MAAM;KACX,CAAA;IACP,oBAAC,QAAD,EAAA,UAAO,KAAK,SAAe,CAAA;IAC3B,oBAAC,QAAD;KAAM,OAAOA,SAAO;eAAQ,YAAY,KAAK;KAAQ,CAAA;IACjD;MACL,UACC,oBAAC,MAAD;GAAI,OAAOA,SAAO;GAAQ,MAAK;aAC5B,KAAK,SAAS,KAAK,MAClB,oBAAC,aAAD;IAEE,MAAM;IACI;IACA;IACG;IACb,EALK,EAAE,QAAQ,EAAE,QAKjB,CACF;GACC,CAAA,CAEJ;;;AAST,SAAS,QAAQ,EAAE,MAAM,eAA2C;CAClE,MAAM,SAAS,MAA2C;AACxD,MAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,KAAE,gBAAgB;AAClB,eAAY,KAAK,KAAK;;;CAG1B,MAAM,OAAO,KAAK,MAAM,SAAS;AACjC,QACE,oBAAC,MAAD;EAAI,MAAK;YACP,qBAAC,OAAD;GACE,MAAK;GACL,UAAU;GACV,OAAOA,SAAO;GACd,eAAe,YAAY,KAAK,KAAK;GACrC,WAAW;GACX,aAAW,KAAK;GAChB,eAAY;aAPd;IASE,oBAAC,QAAD;KAAM,OAAOA,SAAO;KAAO,eAAA;eAAY;KAEhC,CAAA;IACP,oBAAC,QAAD;KAAM,OAAOA,SAAO;eAAO,KAAK;KAAe,CAAA;IAC9C,QAAQ,oBAAC,QAAD;KAAM,OAAOA,SAAO;eAAW;KAAY,CAAA;IACpD,oBAAC,aAAD;KAAa,MAAM,KAAK;KAAM,OAAO,KAAK;KAAS,CAAA;IAC/C;;EACH,CAAA;;AAST,SAAS,YAAY,EAAE,MAAM,SAAyC;CACpE,MAAM,EAAE,iBAAiB,YAAY;CACrC,MAAM,cAAc,gBAAgB;CACpC,MAAM,OAAO,MAAM;AAEnB,KAAI,SAAS,SAAS;EACpB,MAAM,SAAS,WAAW,MAAM,aAAa;EAC7C,MAAM,YAAY,YAAY,MAAM,QAAQ,YAAY;AACxD,SACE,qBAAC,QAAD;GAAM,OAAOA,SAAO;aAApB,CACE,oBAAC,QAAD;IAAM,OAAOA,SAAO;cAAQ,WAAW,SAAS,YAAY,MAAM,OAAO;IAAQ,CAAA,EACjF,oBAAC,QAAD;IAAM,OAAO;KAAE,GAAGA,SAAO;KAAa,YAAY;KAAQ,YAAY;KAAG;IAAE,eAAA;IAAc,CAAA,CACpF;;;AAGX,KAAI,SAAS,YACX,QACE,qBAAC,QAAD;EAAM,OAAOA,SAAO;YAApB,CACE,oBAAC,QAAD;GAAM,OAAOA,SAAO;aAAQ,YAAY,MAAM,OAAO;GAAQ,CAAA,EAC7D,oBAAC,QAAD;GAAM,OAAO;IAAE,YAAY;IAAG,SAAS;IAAgB,UAAU;IAAI,UAAU;IAAK;aAClF,oBAAC,cAAD;IAAoB;IAAM,MAAK;IAAW,CAAA;GACrC,CAAA,CACF;;AAGX,KAAI,SAAS,SACX,QACE,oBAAC,QAAD;EAAM,OAAOA,SAAO;YAClB,oBAAC,QAAD;GACE,OAAO;IACL,YAAY;IACZ,SAAS;IACT,WAAW;IACX,iBAAiB;IAClB;aAED,oBAAC,cAAD,EAAoB,MAAQ,CAAA;GACvB,CAAA;EACF,CAAA;AAGX,KAAI,SAAS,SACX,QACE,oBAAC,QAAD;EAAM,OAAOA,SAAO;YAClB,oBAAC,QAAD;GACE,OAAO;IACL,YAAY;IACZ,SAAS;IACT,WAAW;IACX,iBAAiB;IAClB;aAED,oBAAC,cAAD,EAAoB,MAAQ,CAAA;GACvB,CAAA;EACF,CAAA;AAGX,KAAI,SAAS,gBAAgB,SAAS,cAAc,SAAS,cAC3D,QACE,oBAAC,QAAD;EAAM,OAAOA,SAAO;YAClB,oBAAC,QAAD;GAAM,OAAO;IAAE,YAAY;IAAG,SAAS;IAAgB,OAAO;IAAI;aAChE,oBAAC,cAAD,EAAoB,MAAQ,CAAA;GACvB,CAAA;EACF,CAAA;AAIX,QACE,oBAAC,QAAD;EAAM,OAAOA,SAAO;YAClB,oBAAC,QAAD;GAAM,OAAOA,SAAO;aAAQ,YAAY,MAAM,OAAO;GAAQ,CAAA;EACxD,CAAA;;AASX,SAAS,cAAc,EAAE,MAAM,WAA6C;AAC1E,iBAAgB;EACd,MAAM,SAAS,MAAsC;AACnD,OAAI,EAAE,QAAQ,SAAU,UAAS;;AAEnC,SAAO,iBAAiB,WAAW,MAAM;AACzC,eAAa,OAAO,oBAAoB,WAAW,MAAM;IACxD,CAAC,QAAQ,CAAC;AAEb,QACE,oBAAC,OAAD;EACE,OAAOA,SAAO;EACd,SAAS;EACT,MAAK;EACL,eAAY;YAEZ,qBAAC,OAAD;GACE,OAAOA,SAAO;GACd,UAAU,MAAM,EAAE,iBAAiB;GACnC,MAAK;GACL,cAAW;GACX,cAAY,oBAAoB;aALlC,CAOE,oBAAC,UAAD;IACE,MAAK;IACL,OAAOA,SAAO;IACd,SAAS;IACT,cAAW;IACX,eAAY;cACb;IAEQ,CAAA,EACT,oBAAC,aAAD,EAAmB,MAAQ,CAAA,CACvB;;EACF,CAAA;;;;ACpfV,MAAMC,WAAS;CACb,SAAS;CACT,OAAO;CACP,SAAS;EACP,aAAa;EACb,WAAW;EACX,SAAS;EACT,SAAS;EACT,UAAU;EACX;CACD,OAAO;EACL,OAAO;EACP,gBAAgB;EAChB,aAAa;EACd;CACD,IAAI;EACF,WAAW;EACX,SAAS;EACT,UAAU;EACV,eAAe;EACf,eAAe;EACf,SAAS;EACT,cAAc;EACf;CACD,IAAI;EACF,SAAS;EACT,cAAc;EACd,eAAe;EAChB;CACD,MAAM;EACJ,YAAY;EACZ,UAAU;EACX;CACD,UAAU;EACR,SAAS;EACT,SAAS;EACT,cAAc;EACd,UAAU;EACV,eAAe;EACf,eAAe;EACf,YAAY;EACb;CACD,OAAO;EACL,YAAY;EACZ,UAAU;EACV,SAAS;EACT,WAAW;EACZ;CACD,QAAQ;EACN,SAAS;EACT,OAAO;EACP,QAAQ;EACR,eAAe;EACf,aAAa;EACb,cAAc;EACd,QAAQ;EACT;CACF;AAED,SAAgB,WAAW,EACzB,QACA,MACA,UAAU,MACV,WACgC;CAChC,MAAM,EAAE,UAAU,aAAa,iBAAiB,YAAY;CAC5D,MAAM,cAAc,gBAAgB;CAEpC,MAAM,OAAO,cAAc;AAQzB,SAPgB,OAAO,QAAQ,SAAS,CACrC,QAAQ,CAAC,MAAM,WAAW;AACzB,OAAI,CAAC,UAAU,MAAM,OAAO,CAAE,QAAO;AACrC,OAAI,QAAQ,MAAM,UAAU,KAAM,QAAO;AACzC,UAAO;IACP,CACD,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,KAAA,GAAW,EAAE,SAAS,MAAM,CAAC,CAAC,CAC5D,KAAK,CAAC,MAAM,WAAW;GACpC,MAAM,UAAU,MAAM,UAAU;GAChC,MAAM,QAAQ,UAAU,YAAY,MAAM,QAAQ,YAAY,GAAG;AACjE,UAAO;IACL;IACA,MAAM,MAAM,SAAS;IACrB,OAAO,QAAQ,MAAM,QAAQ,YAAY,MAAM,OAAO;IACtD,YAAY,OAAO,cAAc;IACjC,aAAa,MAAM,gBAAgB;IACnC,QAAQ,WAAW,MAAM,aAAa;IACtC;IACD;IACD;IACD;EAAC;EAAU;EAAQ;EAAM;EAAc;EAAY,CAAC;CAEvD,MAAM,cACJ,WACA,GAAG,KAAK,OAAO,QAAQ,KAAK,WAAW,IAAI,KAAK,MAAM,SAAS,eAAe,OAAO,MAAM,KAAK,OAAO,YAAY,SAAS,GAAG,KAAK;AAEtI,KAAI,KAAK,WAAW,EAClB,QACE,oBAAC,OAAD;EAAK,cAAY;EAAa,OAAOA,SAAO;YAC1C,oBAAC,OAAD;GAAK,OAAOA,SAAO;aAAO;GAAkC,CAAA;EACxD,CAAA;AAIV,QACE,oBAAC,OAAD;EAAK,cAAY;EAAa,OAAOA,SAAO;YAC1C,qBAAC,SAAD;GAAO,OAAOA,SAAO;aAArB;IACE,oBAAC,WAAD;KAAS,OAAOA,SAAO;eAAU;KAAsB,CAAA;IACvD,qBAAC,YAAD,EAAA,UAAA;KACE,oBAAC,OAAD,EAAK,OAAO,EAAE,OAAO,OAAO,EAAI,CAAA;KAChC,oBAAC,OAAD,EAAK,OAAO,EAAE,OAAO,MAAM,EAAI,CAAA;KAC/B,oBAAC,OAAD,EAAK,OAAO,EAAE,OAAO,UAAU,QAAQ,OAAO,EAAI,CAAA;KACjD,WAAW,oBAAC,OAAD,EAAK,OAAO,EAAE,OAAO,OAAO,EAAI,CAAA;KAC5C,oBAAC,OAAD,EAAO,CAAA;KACE,EAAA,CAAA;IACX,oBAAC,SAAD,EAAA,UACE,qBAAC,MAAD,EAAA,UAAA;KACE,oBAAC,MAAD;MAAI,OAAOA,SAAO;gBAAI;MAAS,CAAA;KAC/B,oBAAC,MAAD;MAAI,OAAOA,SAAO;gBAAI;MAAS,CAAA;KAC/B,oBAAC,MAAD;MAAI,OAAOA,SAAO;gBAAI;MAAU,CAAA;KAC/B,WAAW,oBAAC,MAAD;MAAI,OAAOA,SAAO;gBAAI;MAAY,CAAA;KAC9C,oBAAC,MAAD;MAAI,OAAOA,SAAO;gBAAI;MAAgB,CAAA;KACnC,EAAA,CAAA,EACC,CAAA;IACR,oBAAC,SAAD,EAAA,UACG,KAAK,KAAK,QACT,qBAAC,MAAD,EAAA,UAAA;KACE,oBAAC,MAAD;MAAI,OAAO;OAAE,GAAGA,SAAO;OAAI,GAAGA,SAAO;OAAM;gBAAG,IAAI;MAAU,CAAA;KAC5D,oBAAC,MAAD;MAAI,OAAOA,SAAO;gBACf,IAAI,QAAQ,oBAAC,QAAD;OAAM,OAAOA,SAAO;iBAAW,IAAI;OAAY,CAAA;MACzD,CAAA;KACL,qBAAC,MAAD;MAAI,OAAO;OAAE,GAAGA,SAAO;OAAI,GAAGA,SAAO;OAAO;gBAA5C;OACG,IAAI,WACH,oBAAC,QAAD;QAAM,OAAO;SAAE,GAAGA,SAAO;SAAQ,YAAY,IAAI;SAAQ;QAAE,eAAA;QAAc,CAAA;OAE3E,oBAAC,QAAD,EAAA,UAAO,IAAI,OAAa,CAAA;OACvB,IAAI,cACH,oBAAC,QAAD;QACE,OAAM;QACN,cAAW;QACX,OAAO,EAAE,YAAY,GAAG;kBACzB;QAEM,CAAA;OAEN;;KACJ,WAAW,oBAAC,MAAD;MAAI,OAAO;OAAE,GAAGA,SAAO;OAAI,GAAGA,SAAO;OAAO;gBAAG,IAAI;MAAY,CAAA;KAC3E,oBAAC,MAAD;MAAI,OAAOA,SAAO;gBAAK,IAAI;MAAiB,CAAA;KACzC,EAAA,EAtBI,IAAI,KAsBR,CACL,EACI,CAAA;IACF;;EACJ,CAAA;;;;ACrJV,MAAM,SAAS;CACb,SAAS;CACT,SAAS;CACT,OAAO;CACP,KAAK;EACH,SAAS;EACT,qBAAqB;EACrB,KAAK;EACL,YAAY;EACZ,SAAS;EACT,cAAc;EACf;CACD,MAAM;EACJ,SAAS;EACT,eAAe;EACf,KAAK;EACN;CACD,MAAM;EACJ,YAAY;EACZ,UAAU;EACX;CACD,OAAO;EACL,YAAY;EACZ,UAAU;EACV,SAAS;EACV;CACF;AAQD,SAAS,YAAY,KAAkC;AACrD,KAAI,OAAO,KAAM,QAAO,KAAA;AACxB,KAAI,OAAO,QAAQ,YAAY,OAAO,QAAQ,SAAU,QAAO,OAAO,IAAI;AAC1E,KAAI,OAAO,QAAQ,UAAU;EAC3B,MAAM,IAAI;AACV,MAAI,WAAW,KAAK,UAAU,EAAG,QAAO,GAAG,OAAO,EAAE,SAAS,GAAG,OAAO,EAAE,QAAQ;;;AAKrF,SAAS,aAAa,KAAkC;AACtD,KAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,KAAI,MAAM,QAAQ,IAAI,CAAE,QAAO,IAAI,IAAI,OAAO,CAAC,KAAK,KAAK;;AAI3D,SAAS,SAAS,MAAc,WAAyC;CACvE,MAAM,aAAa,aAAa,UAAU,cAAc;CACxD,MAAM,WAAW,YAAY,UAAU,YAAY;CACnD,MAAM,aAAa,UAAU,iBAAiB,OAAO,KAAA,IAAY,OAAO,UAAU,cAAc;CAChG,MAAM,aAAa,UAAU,iBAAiB,OAAO,KAAA,IAAY,OAAO,UAAU,cAAc;CAChG,MAAM,gBAAgB,YAAY,UAAU,iBAAiB;CAE7D,MAAM,cAA6B,EAAE;AACrC,KAAI,WAAY,aAAY,aAAa;AACzC,KAAI,SAAU,aAAY,WAAW;AACrC,KAAI,WAAY,aAAY,aAAa;AACzC,KAAI,WAAY,aAAY,aAAa;AACzC,KAAI,cAAe,aAAY,gBAAgB;AAU/C,QAAO;EAAE;EAAM;EAAa,OARd;GACZ;GACA,aAAa,IAAI,eAAe,KAAA;GAChC,aAAa,MAAM,eAAe,KAAA;GACnC,CACE,OAAO,QAAQ,CACf,KAAK,MAAM;EAE4B;;AAG5C,SAAgB,gBAAgB,EAC9B,SAAS,cACT,SAAS,gDACT,WACqC;CACrC,MAAM,EAAE,UAAU,gBAAgB,YAAY;CAE9C,MAAM,OAAO,cAAqB;AAChC,SAAO,OAAO,QAAQ,SAAS,CAC5B,QAAQ,CAAC,MAAM,WAAW;AACzB,OAAI,MAAM,UAAU,aAAc,QAAO;AACzC,UAAO,UAAU,MAAM,OAAO;IAC9B,CACD,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,GAAG,KAAA,GAAW,EAAE,SAAS,MAAM,CAAC,CAAC,CACxE,KAAK,CAAC,MAAM,WAAW;GACtB,MAAM,QAAQ,MAAM;AACpB,OAAI,CAAC,SAAS,OAAO,UAAU,SAC7B,QAAO;IAAE;IAAM,aAAa,EAAE;IAAE,OAAO;IAAI;AAE7C,UAAO,SAAS,MAAM,MAAiC;IACvD;IACH,CAAC,UAAU,OAAO,CAAC;CAEtB,MAAM,cACJ,WACA,GAAG,KAAK,OAAO,mBAAmB,KAAK,WAAW,IAAI,KAAK,MAAM,UAAU,WAAW,eAAe,eAAe,OAAO,MAAM,GAAG,KAAK;AAE3I,KAAI,KAAK,WAAW,EAClB,QACE,oBAAC,OAAD;EAAK,cAAY;EAAa,OAAO,OAAO;YAC1C,oBAAC,OAAD;GAAK,OAAO,OAAO;aAAO;GAA6C,CAAA;EACnE,CAAA;AAIV,QACE,qBAAC,OAAD;EAAK,cAAY;EAAa,OAAO,OAAO;YAA5C,CACE,oBAAC,OAAD;GAAK,OAAO,OAAO;aAAU;GAAkB,CAAA,EAC9C,KAAK,KAAK,QACT,qBAAC,OAAD;GAAoB,OAAO,OAAO;aAAlC,CACE,qBAAC,OAAD;IAAK,OAAO,OAAO;cAAnB,CACE,oBAAC,QAAD;KAAM,OAAO,OAAO;eAAO,IAAI;KAAY,CAAA,EAC1C,IAAI,SAAS,oBAAC,QAAD;KAAM,OAAO,OAAO;eAAQ,IAAI;KAAa,CAAA,CACvD;OACN,oBAAC,OAAD;IAAK,OAAO,IAAI;cAAc;IAAa,CAAA,CACvC;KANI,IAAI,KAMR,CACN,CACE"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["generatedCss","virtualAxes","sampleStyle","styles","formatDimension","formatColor","styles","MAX_RENDER_PX","styles","toPixels","styles","styles","styles","styles","styles","styles","styles","formatColor","styles","styles","styles","styles","styles","styles","styles","styles","styles","styles","styles","styles","styles"],"sources":["../src/format-color.ts","../src/internal/data-attr.ts","../src/internal/channel-globals.ts","../src/contexts.ts","../src/internal/use-project.ts","../src/border-preview/BorderSample.tsx","../src/internal/styles.ts","../src/BorderPreview.tsx","../src/ColorPalette.tsx","../src/dimension-scale/DimensionBar.tsx","../src/DimensionScale.tsx","../src/FontFamilySample.tsx","../src/FontWeightScale.tsx","../src/GradientPalette.tsx","../src/internal/prefers-reduced-motion.ts","../src/motion-preview/MotionSample.tsx","../src/MotionPreview.tsx","../src/provider.tsx","../src/shadow-preview/ShadowSample.tsx","../src/ShadowPreview.tsx","../src/StrokeStyleSample.tsx","../src/token-detail/styles.ts","../src/token-detail/internal.ts","../src/token-detail/AliasChain.tsx","../src/token-detail/AliasedBy.tsx","../src/token-detail/AxisVariance.tsx","../src/token-detail/CompositeBreakdown.tsx","../src/token-detail/CompositePreview.tsx","../src/token-detail/ConsumerOutput.tsx","../src/token-detail/TokenHeader.tsx","../src/token-detail/TokenUsageSnippet.tsx","../src/TokenDetail.tsx","../src/TokenNavigator.tsx","../src/TokenTable.tsx","../src/TypographyScale.tsx"],"sourcesContent":["import Color from 'colorjs.io';\n\n/**\n * Color display formats understood by {@link formatColor}.\n *\n * - `hex` — sRGB hex (`#rrggbb` or `#rrggbbaa`). Out-of-gamut or wide-gamut\n * colors fall back to `rgb()` and surface `outOfGamut: true` so callers\n * can render a ⚠ glyph.\n * - `rgb` / `hsl` — modern CSS Color 4 space-separated syntax, converted\n * from the source colorspace. Out-of-gamut values are still stringified\n * (the browser will clip when actually rendering) and flagged.\n * - `oklch` — perceptual wide-gamut form. Never marks out-of-gamut because\n * every color expressible in sRGB/P3 fits in oklch.\n * - `raw` — compact JSON of the normalized Terrazzo shape. For DTCG\n * authors who want to see what the parser actually stored.\n */\nexport type ColorFormat = 'hex' | 'rgb' | 'hsl' | 'oklch' | 'raw';\n\nexport const COLOR_FORMATS: readonly ColorFormat[] = ['hex', 'rgb', 'hsl', 'oklch', 'raw'];\n\n/**\n * Terrazzo's `ColorValueNormalized`, copied inline to avoid a hard dep on\n * `@terrazzo/token-tools` from blocks. Matches the shape documented at\n * https://terrazzo.app/docs/cli/reference/token-tools/ColorValueNormalized.\n *\n * Some token payloads we see in the wild use the legacy DTCG-ish `channels`\n * field in place of `components`; we accept either.\n */\nexport interface NormalizedColor {\n colorSpace: string;\n components?: readonly (number | null)[];\n channels?: readonly (number | null)[];\n alpha?: number;\n hex?: string;\n}\n\nexport interface FormatColorResult {\n /** Display string — e.g. `rgb(59 132 246)`, `#3b82f6`. */\n value: string;\n /** True when the requested format can't losslessly represent the color. */\n outOfGamut: boolean;\n}\n\nconst DEFAULT_FALLBACK = '—';\n\n/**\n * Convert Terrazzo's normalized color payload into a display string in the\n * requested format. Pure function — never throws; returns `{ value: '—' }`\n * for unrecognized input so calling blocks don't need try/catch.\n */\nexport function formatColor(\n value: unknown,\n format: ColorFormat,\n fallback: string = DEFAULT_FALLBACK,\n): FormatColorResult {\n const normalized = coerce(value);\n if (!normalized) return { value: stringifyFallback(value, fallback), outOfGamut: false };\n\n if (format === 'raw') {\n return { value: compactJson(normalized), outOfGamut: false };\n }\n\n const color = toColor(normalized);\n if (!color) return { value: stringifyFallback(value, fallback), outOfGamut: false };\n\n const alpha = typeof normalized.alpha === 'number' ? normalized.alpha : 1;\n\n if (format === 'hex') return formatHex(color, alpha);\n if (format === 'rgb') return formatRgb(color, alpha);\n if (format === 'hsl') return formatHsl(color, alpha);\n return formatOklch(color, alpha);\n}\n\nfunction coerce(value: unknown): NormalizedColor | null {\n if (!value || typeof value !== 'object') return null;\n const v = value as Record<string, unknown>;\n const colorSpace = typeof v['colorSpace'] === 'string' ? (v['colorSpace'] as string) : undefined;\n const components = Array.isArray(v['components'])\n ? (v['components'] as (number | null)[])\n : Array.isArray(v['channels'])\n ? (v['channels'] as (number | null)[])\n : undefined;\n if (!colorSpace || !components) {\n if (typeof v['hex'] === 'string') {\n return { colorSpace: 'srgb', components: hexToComponents(v['hex'] as string) };\n }\n return null;\n }\n const alpha = typeof v['alpha'] === 'number' ? (v['alpha'] as number) : undefined;\n const hex = typeof v['hex'] === 'string' ? (v['hex'] as string) : undefined;\n return {\n colorSpace,\n components,\n ...(alpha !== undefined && { alpha }),\n ...(hex !== undefined && { hex }),\n };\n}\n\nfunction hexToComponents(hex: string): number[] {\n const h = hex.replace('#', '');\n const expanded =\n h.length === 3 || h.length === 4\n ? h\n .split('')\n .map((c) => c + c)\n .join('')\n : h;\n const r = parseInt(expanded.slice(0, 2), 16) / 255;\n const g = parseInt(expanded.slice(2, 4), 16) / 255;\n const b = parseInt(expanded.slice(4, 6), 16) / 255;\n return [r, g, b];\n}\n\n/**\n * Map Terrazzo's canonical CSS Color 4 space identifiers to the shorter\n * identifiers colorjs.io registers. Only the ones that differ need an entry.\n */\nconst COLORJS_SPACE_ALIASES: Record<string, string> = {\n 'display-p3': 'p3',\n 'a98-rgb': 'a98rgb',\n 'prophoto-rgb': 'prophoto',\n};\n\nfunction toColor(normalized: NormalizedColor): Color | null {\n const source = normalized.components ?? normalized.channels ?? [];\n const coords: [number, number, number] = [\n numberOrZero(source[0]),\n numberOrZero(source[1]),\n numberOrZero(source[2]),\n ];\n const space = COLORJS_SPACE_ALIASES[normalized.colorSpace] ?? normalized.colorSpace;\n try {\n return new Color(space, coords, normalized.alpha ?? 1);\n } catch {\n return null;\n }\n}\n\nfunction numberOrZero(n: number | null | undefined): number {\n return typeof n === 'number' && !Number.isNaN(n) ? n : 0;\n}\n\nfunction coord(color: Color, i: number): number {\n const c = color.coords[i];\n return typeof c === 'number' && !Number.isNaN(c) ? c : 0;\n}\n\nfunction formatHex(color: Color, alpha: number): FormatColorResult {\n const srgb = color.to('srgb');\n const inGamut = srgb.inGamut('srgb');\n if (!inGamut) {\n const rgb = formatRgb(color, alpha);\n return { value: rgb.value, outOfGamut: true };\n }\n const r = clamp255(coord(srgb, 0));\n const g = clamp255(coord(srgb, 1));\n const b = clamp255(coord(srgb, 2));\n const base = `#${toHexByte(r)}${toHexByte(g)}${toHexByte(b)}`;\n if (alpha >= 1) return { value: base, outOfGamut: false };\n const a = clamp255(alpha);\n return { value: `${base}${toHexByte(a)}`, outOfGamut: false };\n}\n\nfunction formatRgb(color: Color, alpha: number): FormatColorResult {\n const srgb = color.to('srgb');\n const inGamut = srgb.inGamut('srgb');\n const r = Math.round(clampUnit(coord(srgb, 0)) * 255);\n const g = Math.round(clampUnit(coord(srgb, 1)) * 255);\n const b = Math.round(clampUnit(coord(srgb, 2)) * 255);\n const body = `${r} ${g} ${b}`;\n const value = alpha >= 1 ? `rgb(${body})` : `rgb(${body} / ${roundAlpha(alpha)})`;\n return { value, outOfGamut: !inGamut };\n}\n\nfunction formatHsl(color: Color, alpha: number): FormatColorResult {\n const hsl = color.to('hsl');\n const srgb = color.to('srgb');\n const inGamut = srgb.inGamut('srgb');\n const hue = roundHue(coord(hsl, 0));\n const sat = roundPercent(coord(hsl, 1));\n const light = roundPercent(coord(hsl, 2));\n const body = `${hue} ${sat}% ${light}%`;\n const value = alpha >= 1 ? `hsl(${body})` : `hsl(${body} / ${roundAlpha(alpha)})`;\n return { value, outOfGamut: !inGamut };\n}\n\nfunction formatOklch(color: Color, alpha: number): FormatColorResult {\n const oklch = color.to('oklch');\n const L = roundTo(coord(oklch, 0), 3);\n const C = roundTo(coord(oklch, 1), 3);\n const H = roundTo(coord(oklch, 2), 2);\n const body = `${L} ${C} ${H}`;\n const value = alpha >= 1 ? `oklch(${body})` : `oklch(${body} / ${roundAlpha(alpha)})`;\n return { value, outOfGamut: false };\n}\n\nfunction clamp255(n: number): number {\n return Math.max(0, Math.min(255, Math.round(n * 255)));\n}\n\nfunction clampUnit(n: number): number {\n return Math.max(0, Math.min(1, n));\n}\n\nfunction toHexByte(n: number): string {\n return n.toString(16).padStart(2, '0');\n}\n\nfunction roundTo(n: number, digits: number): number {\n const f = 10 ** digits;\n return Math.round(n * f) / f;\n}\n\nfunction roundHue(h: number): number {\n return roundTo(((h % 360) + 360) % 360, 1);\n}\n\nfunction roundPercent(n: number): number {\n return Math.round(n * 10) / 10;\n}\n\nfunction roundAlpha(a: number): number {\n return roundTo(a, 3);\n}\n\nfunction compactJson(value: NormalizedColor): string {\n const parts: string[] = [`\"colorSpace\":${JSON.stringify(value.colorSpace)}`];\n const components = value.components ?? value.channels;\n if (components) {\n parts.push(`\"components\":[${components.map((c) => (c === null ? 'null' : c)).join(', ')}]`);\n }\n if (typeof value.alpha === 'number' && value.alpha !== 1) {\n parts.push(`\"alpha\":${value.alpha}`);\n }\n return `{ ${parts.join(', ')} }`;\n}\n\nfunction stringifyFallback(value: unknown, fallback: string): string {\n if (value == null) return fallback;\n if (typeof value === 'string' || typeof value === 'number') return String(value);\n return fallback;\n}\n","import type { CSSProperties } from 'react';\n\n/**\n * Produce a prefixed `data-*` attribute name when `prefix` is set, bare\n * `data-<key>` otherwise. Mirrors `dataAttr` in `@unpunnyfuns/swatchbook-core`\n * so block wrappers and emitted-CSS selectors stay in lockstep without\n * blocks taking a runtime dep on core.\n */\nexport function dataAttr(prefix: string, key: string): string {\n return prefix ? `data-${prefix}-${key}` : `data-${key}`;\n}\n\n/**\n * Spread helper for the common `<div data-<prefix>-theme=\"…\">` block\n * wrapper. Returns an object keyed on the prefixed attribute name so the\n * call site stays readable: `<div {...themeAttrs(prefix, theme)} />`.\n */\nexport function themeAttrs(prefix: string, themeName: string): Record<string, string> {\n return { [dataAttr(prefix, 'theme')]: themeName };\n}\n\n/**\n * Vars block chrome reads by literal `var(--sb-*)` regardless of what the\n * project's actual `cssVarPrefix` is. Keeping the literal spelling means we\n * only need to alias these few names on each block wrapper; the bulk of\n * block styling stays untouched.\n */\nconst CHROME_VARS = [\n 'color-sys-border-default',\n 'color-sys-surface-default',\n 'color-sys-surface-muted',\n 'color-sys-surface-raised',\n 'color-sys-text-default',\n 'color-sys-text-muted',\n 'color-sys-accent-bg',\n 'color-sys-accent-fg',\n 'typography-sys-body-font-family',\n 'typography-sys-body-font-size',\n] as const;\n\n/**\n * CSS custom-property aliases that redirect the block chrome's `var(--sb-*)`\n * reads to the project's actual `cssVarPrefix`. Block components spread the\n * return into their wrapper's inline `style`, so the aliases cascade down\n * into every nested block / sample / token-detail piece without each one\n * re-reading the prefix.\n *\n * When `prefix === 'sb'` the aliases are self-references — we skip emission\n * to keep the inline style shorter. When `prefix === ''` (opt-out) the\n * aliases point at the bare `var(--color-sys-…)` names core emitted.\n */\nexport function chromeAliases(prefix: string): CSSProperties {\n if (prefix === 'sb') return {};\n const out: Record<string, string> = {};\n const head = prefix ? `${prefix}-` : '';\n for (const name of CHROME_VARS) {\n out[`--sb-${name}`] = `var(--${head}${name})`;\n }\n return out as CSSProperties;\n}\n","import { useSyncExternalStore } from 'react';\nimport { addons } from 'storybook/preview-api';\nimport { COLOR_FORMATS, type ColorFormat } from '#/format-color.ts';\n\n/**\n * Shared subscription to Storybook's globals channel, lifted out of React\n * component state so the values survive docs-mode remounts.\n *\n * On MDX docs pages, Storybook force-rerenders the docs container on every\n * `updateGlobals` (see `preview/runtime.js` → `onUpdateGlobals`), which\n * unmounts and remounts any embedded blocks. A `useState(null)` initializer\n * inside the block would reset to null on each remount — the symptom is a\n * one-frame flicker to the correct value, then revert to the defaults.\n * Module-level state persists; React reads it through `useSyncExternalStore`\n * and stays concurrent-safe.\n */\n\nexport interface ChannelGlobals {\n axes: Record<string, string> | null;\n theme: string | null;\n format: ColorFormat | null;\n}\n\nconst AXES_GLOBAL_KEY = 'swatchbookAxes';\nconst THEME_GLOBAL_KEY = 'swatchbookTheme';\nconst COLOR_FORMAT_GLOBAL_KEY = 'swatchbookColorFormat';\n\nlet snapshot: ChannelGlobals = { axes: null, theme: null, format: null };\nconst listeners = new Set<() => void>();\nlet subscribed = false;\n\nfunction isColorFormat(value: unknown): value is ColorFormat {\n return typeof value === 'string' && (COLOR_FORMATS as readonly string[]).includes(value);\n}\n\nfunction ensureSubscribed(): void {\n if (subscribed || typeof window === 'undefined') return;\n subscribed = true;\n const channel = addons.getChannel();\n const onGlobals = (payload: { globals?: Record<string, unknown> }): void => {\n const globals = payload.globals;\n if (!globals) return;\n let next = snapshot;\n const nextAxes = globals[AXES_GLOBAL_KEY];\n if (nextAxes && typeof nextAxes === 'object') {\n next = { ...next, axes: nextAxes as Record<string, string> };\n }\n const nextTheme = globals[THEME_GLOBAL_KEY];\n if (typeof nextTheme === 'string') {\n next = { ...next, theme: nextTheme };\n }\n const nextFormat = globals[COLOR_FORMAT_GLOBAL_KEY];\n if (isColorFormat(nextFormat)) {\n next = { ...next, format: nextFormat };\n }\n if (next !== snapshot) {\n snapshot = next;\n for (const cb of listeners) cb();\n }\n };\n /**\n * `setGlobals` fires once on preview init carrying the URL-persisted user\n * globals (Storybook stores toolbar selections in `?globals=…`). Without\n * this listener, deeplinking to an MDX page with a non-default axis tuple\n * or color format renders defaults for one frame before the first\n * `updateGlobals` arrives. `emitGlobals()` reads from `userGlobals.get()`\n * (current state), so the payload is never stale — safe to handle.\n */\n channel.on('globalsUpdated', onGlobals);\n channel.on('updateGlobals', onGlobals);\n channel.on('setGlobals', onGlobals);\n}\n\n/**\n * Subscribe at module load so the `SET_GLOBALS` emission from preview init\n * lands in our snapshot before any block renders. Running `useSyncExternalStore`'s\n * `subscribe` lazily on first hook call would miss the event in most cases.\n */\nensureSubscribed();\n\nfunction subscribe(cb: () => void): () => void {\n ensureSubscribed();\n listeners.add(cb);\n return () => {\n listeners.delete(cb);\n };\n}\n\nfunction getSnapshot(): ChannelGlobals {\n return snapshot;\n}\n\nfunction getServerSnapshot(): ChannelGlobals {\n return snapshot;\n}\n\nexport function useChannelGlobals(): ChannelGlobals {\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\n}\n","import { createContext, useContext } from 'react';\nimport { useChannelGlobals } from '#/internal/channel-globals.ts';\nimport type { ColorFormat } from '#/format-color.ts';\n\n/**\n * Typed shape of the addon's `virtual:swatchbook/tokens` module, duplicated\n * as value-importable interfaces so consumers outside the addon's Vite\n * plugin (unit tests, custom React apps) can construct a snapshot by hand.\n *\n * The ambient `declare module 'virtual:swatchbook/tokens'` declarations in\n * `packages/addon/src/virtual.d.ts` describe the same payload; the two\n * stay in sync by eye.\n */\nexport interface VirtualAxisShape {\n name: string;\n contexts: readonly string[];\n default: string;\n description?: string;\n source: 'resolver' | 'layered' | 'synthetic';\n}\n\nexport interface VirtualThemeShape {\n name: string;\n input: Record<string, string>;\n sources: string[];\n}\n\nexport interface VirtualDiagnosticShape {\n severity: 'error' | 'warn' | 'info';\n group: string;\n message: string;\n filename?: string;\n line?: number;\n column?: number;\n}\n\nexport interface VirtualTokenShape {\n $type?: string;\n $value?: unknown;\n $description?: string;\n aliasOf?: string;\n aliasChain?: readonly string[];\n aliasedBy?: readonly string[];\n}\n\nexport interface VirtualPresetShape {\n name: string;\n axes: Partial<Record<string, string>>;\n description?: string;\n}\n\n/**\n * Full project data read by blocks. Populated by the addon's preview\n * decorator (from the virtual module) or constructed by hand in\n * non-Storybook consumers.\n */\nexport interface ProjectSnapshot {\n axes: readonly VirtualAxisShape[];\n /** Axis names suppressed via `config.disabledAxes` — pinned to their defaults, hidden from the toolbar. */\n disabledAxes: readonly string[];\n presets: readonly VirtualPresetShape[];\n themes: readonly VirtualThemeShape[];\n themesResolved: Record<string, Record<string, VirtualTokenShape>>;\n activeTheme: string;\n activeAxes: Readonly<Record<string, string>>;\n cssVarPrefix: string;\n diagnostics: readonly VirtualDiagnosticShape[];\n css: string;\n}\n\n/**\n * Context carrying the full {@link ProjectSnapshot}. `null` sentinel lets\n * `useSwatchbookData()` tell \"provider present\" from \"fall back to the\n * virtual module\".\n */\nexport const SwatchbookContext = createContext<ProjectSnapshot | null>(null);\n\nexport function useOptionalSwatchbookData(): ProjectSnapshot | null {\n return useContext(SwatchbookContext);\n}\n\n/**\n * Active swatchbook theme for the current story/docs render. Populated by\n * the addon's preview decorator and consumed by `useToken` + any future\n * consumer hooks.\n *\n * This runs through plain React context rather than Storybook's\n * `useGlobals` so the same hook works in autodocs / MDX renders where the\n * preview-hooks context isn't available.\n */\nexport const ThemeContext = createContext<string>('');\n\nexport function useActiveTheme(): string {\n return useContext(ThemeContext);\n}\n\n/**\n * Active axis tuple for the current story/docs render — `Record<axisName,\n * contextName>`. Derived from the same input as {@link ThemeContext}; split\n * out so consumers needing per-axis info (toolbar, panel, tuple-aware\n * blocks) don't have to reparse the composed permutation ID.\n */\nexport const AxesContext = createContext<Readonly<Record<string, string>>>({});\n\nexport function useActiveAxes(): Readonly<Record<string, string>> {\n return useContext(AxesContext);\n}\n\n/**\n * Active color-display format for the current story/docs render. Populated\n * by the addon's preview decorator from the `swatchbookColorFormat` global\n * (per-story `globals` or toolbar dropdown) and consumed by blocks that\n * render color-token values. Emitted CSS is unaffected.\n *\n * Runs through plain React context rather than Storybook's `useGlobals` so\n * per-story seeded globals flow through on first render and the same hook\n * is safe to call from MDX doc blocks (where the preview-hooks context\n * isn't available).\n */\nexport const ColorFormatContext = createContext<ColorFormat | null>(null);\n\nexport function useColorFormat(): ColorFormat {\n const contextValue = useContext(ColorFormatContext);\n const channelGlobals = useChannelGlobals();\n return contextValue ?? channelGlobals.format ?? 'hex';\n}\n","import { useEffect } from 'react';\nimport { useActiveAxes, useActiveTheme, useOptionalSwatchbookData } from '#/contexts.ts';\nimport { useChannelGlobals } from '#/internal/channel-globals.ts';\nimport {\n axes as virtualAxes,\n css as generatedCss,\n cssVarPrefix,\n defaultTheme,\n themes,\n themesResolved,\n} from 'virtual:swatchbook/tokens';\nimport type { ProjectSnapshot, VirtualAxis, VirtualTheme, VirtualToken } from '#/types.ts';\n\ntype ResolvedTokens = Record<string, VirtualToken>;\n\nexport interface ProjectData {\n activeTheme: string;\n activeAxes: Record<string, string>;\n axes: readonly VirtualAxis[];\n themes: readonly VirtualTheme[];\n resolved: ResolvedTokens;\n themesResolved: Record<string, ResolvedTokens>;\n cssVarPrefix: string;\n}\n\nconst STYLE_ELEMENT_ID = 'swatchbook-tokens';\n\nfunction ensureStylesheet(css: string): void {\n if (typeof document === 'undefined') return;\n let style = document.getElementById(STYLE_ELEMENT_ID) as HTMLStyleElement | null;\n if (!style) {\n style = document.createElement('style');\n style.id = STYLE_ELEMENT_ID;\n document.head.appendChild(style);\n }\n if (style.textContent !== css) style.textContent = css;\n}\n\nfunction defaultTuple(axes: readonly VirtualAxis[]): Record<string, string> {\n const out: Record<string, string> = {};\n for (const axis of axes) out[axis.name] = axis.default;\n return out;\n}\n\nfunction tupleForName(\n themesList: readonly VirtualTheme[],\n name: string,\n): Record<string, string> | undefined {\n const match = themesList.find((t) => t.name === name);\n return match?.input;\n}\n\nfunction tuplesEqual(a: Record<string, string>, b: Record<string, string>): boolean {\n const keys = new Set([...Object.keys(a), ...Object.keys(b)]);\n for (const k of keys) {\n if (a[k] !== b[k]) return false;\n }\n return true;\n}\n\nfunction nameForTuple(\n themesList: readonly VirtualTheme[],\n tuple: Record<string, string>,\n): string | undefined {\n const match = themesList.find((t) => tuplesEqual(t.input as Record<string, string>, tuple));\n return match?.name;\n}\n\nfunction snapshotToData(snapshot: ProjectSnapshot): ProjectData {\n return {\n activeTheme: snapshot.activeTheme,\n activeAxes: { ...snapshot.activeAxes },\n axes: snapshot.axes,\n themes: snapshot.themes,\n themesResolved: snapshot.themesResolved,\n resolved: snapshot.themesResolved[snapshot.activeTheme] ?? {},\n cssVarPrefix: snapshot.cssVarPrefix,\n };\n}\n\n/**\n * Reads project data either from a mounted {@link SwatchbookProvider}\n * (preferred — the addon's preview decorator installs one around every\n * story) or — as a back-compat fallback — directly from the virtual\n * module plus Storybook globals.\n *\n * The fallback path is what makes the hook safe to call from MDX doc\n * blocks and autodocs renders where no story is active. It self-mounts\n * the virtual module's per-theme CSS and tracks the active tuple via the\n * `globalsUpdated` channel event; {@link useGlobals} from\n * `storybook/preview-api` would throw outside a story render.\n */\nexport function useProject(): ProjectData {\n const snapshot = useOptionalSwatchbookData();\n const fallback = useVirtualModuleFallback(snapshot === null);\n return snapshot !== null ? snapshotToData(snapshot) : fallback;\n}\n\nfunction useVirtualModuleFallback(enabled: boolean): ProjectData {\n const contextTheme = useActiveTheme();\n const contextAxes = useActiveAxes();\n const channelGlobals = useChannelGlobals();\n\n useEffect(() => {\n if (!enabled) return;\n ensureStylesheet(generatedCss);\n }, [enabled]);\n\n const hasContextAxes = Object.keys(contextAxes).length > 0;\n const activeAxes: Record<string, string> = hasContextAxes\n ? { ...contextAxes }\n : (channelGlobals.axes ?? defaultTuple(virtualAxes));\n\n const derivedName = nameForTuple(themes, activeAxes);\n const channelTheme = channelGlobals.theme;\n const fallbackTupleName =\n channelTheme && tupleForName(themes, channelTheme) ? channelTheme : null;\n const activeTheme =\n contextTheme ||\n derivedName ||\n fallbackTupleName ||\n channelTheme ||\n defaultTheme ||\n themes[0]?.name ||\n '';\n\n return {\n activeTheme,\n activeAxes,\n axes: virtualAxes,\n themes,\n themesResolved,\n resolved: themesResolved[activeTheme] ?? {},\n cssVarPrefix,\n };\n}\n\nexport function makeCssVar(path: string, prefix: string): string {\n const tail = path.replaceAll('.', '-');\n return prefix ? `var(--${prefix}-${tail})` : `var(--${tail})`;\n}\n\nexport function globMatch(path: string, glob: string | undefined): boolean {\n if (!glob) return true;\n if (glob === '*' || glob === '**') return true;\n if (glob.endsWith('.*')) return path.startsWith(`${glob.slice(0, -2)}.`);\n if (glob.endsWith('**')) return path.startsWith(glob.slice(0, -2));\n return path === glob || path.startsWith(`${glob}.`);\n}\n\nexport function formatValue(value: unknown): string {\n if (value == null) return '';\n if (typeof value === 'string' || typeof value === 'number') return String(value);\n if (typeof value === 'object') {\n const v = value as Record<string, unknown>;\n if (typeof v['hex'] === 'string') return v['hex'] as string;\n if ('value' in v && 'unit' in v) return `${String(v['value'])}${String(v['unit'])}`;\n return JSON.stringify(value).slice(0, 120);\n }\n return String(value);\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { chromeAliases } from '#/internal/data-attr.ts';\nimport { makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport interface BorderSampleProps {\n /** Full dot-path of the border token to preview. */\n path: string;\n}\n\nconst sampleStyle: CSSProperties = {\n width: 120,\n height: 56,\n background: 'var(--sb-color-sys-surface-raised, transparent)',\n borderRadius: 6,\n};\n\nexport function BorderSample({ path }: BorderSampleProps): ReactElement {\n const { cssVarPrefix } = useProject();\n const cssVar = makeCssVar(path, cssVarPrefix);\n return (\n <div style={{ ...chromeAliases(cssVarPrefix), ...sampleStyle, border: cssVar }} aria-hidden />\n );\n}\n","import type { CSSProperties } from 'react';\n\nexport const MONO_STACK = 'ui-monospace, SFMono-Regular, Menlo, monospace';\n\nexport const BORDER_DEFAULT = '1px solid var(--sb-color-sys-border-default, rgba(128,128,128,0.2))';\n\nexport const BORDER_FAINT = '1px solid var(--sb-color-sys-border-default, rgba(128,128,128,0.15))';\n\nexport const surfaceStyle = {\n fontFamily: 'var(--sb-typography-sys-body-font-family, system-ui)',\n fontSize: 'var(--sb-typography-sys-body-font-size, 14px)',\n color: 'var(--sb-color-sys-text-default, CanvasText)',\n background: 'var(--sb-color-sys-surface-default, Canvas)',\n padding: 12,\n borderRadius: 6,\n} satisfies CSSProperties;\n\nexport const captionStyle = {\n padding: '4px 0 12px',\n opacity: 0.7,\n fontSize: 12,\n} satisfies CSSProperties;\n\nexport const emptyStyle = {\n padding: '24px 12px',\n textAlign: 'center',\n opacity: 0.6,\n} satisfies CSSProperties;\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport { BorderSample } from '#/border-preview/BorderSample.tsx';\nimport {\n BORDER_DEFAULT,\n captionStyle,\n emptyStyle,\n MONO_STACK,\n surfaceStyle,\n} from '#/internal/styles.ts';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport interface BorderPreviewProps {\n /**\n * Token-path filter. Defaults to every `border` token. Use e.g.\n * `\"border.sys.*\"` to scope to the semantic layer.\n */\n filter?: string;\n /** Override the caption. */\n caption?: string;\n}\n\nconst styles = {\n wrapper: surfaceStyle,\n caption: captionStyle,\n empty: emptyStyle,\n row: {\n display: 'grid',\n gridTemplateColumns: 'minmax(160px, 220px) 140px 1fr',\n gap: 16,\n alignItems: 'center',\n padding: '14px 0',\n borderBottom: BORDER_DEFAULT,\n } satisfies CSSProperties,\n meta: {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n minWidth: 0,\n } satisfies CSSProperties,\n path: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } satisfies CSSProperties,\n cssVar: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n opacity: 0.7,\n } satisfies CSSProperties,\n sampleCell: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n } satisfies CSSProperties,\n breakdown: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n display: 'grid',\n gridTemplateColumns: 'auto 1fr',\n columnGap: 12,\n rowGap: 2,\n } satisfies CSSProperties,\n breakdownKey: {\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n};\n\ninterface BorderValue {\n color?: unknown;\n width?: unknown;\n style?: unknown;\n}\n\ninterface Row {\n path: string;\n cssVar: string;\n value: BorderValue;\n}\n\nfunction formatDimension(raw: unknown): string {\n if (raw == null) return '—';\n if (typeof raw === 'number') return String(raw);\n if (typeof raw === 'string') return raw;\n if (typeof raw === 'object') {\n const v = raw as { value?: unknown; unit?: unknown };\n if (typeof v.value === 'number' && typeof v.unit === 'string') {\n return `${v.value}${v.unit}`;\n }\n }\n return JSON.stringify(raw);\n}\n\nfunction formatColor(raw: unknown): string {\n if (raw == null) return '—';\n if (typeof raw === 'string') return raw;\n if (typeof raw === 'object') {\n const v = raw as { components?: unknown; alpha?: unknown; colorSpace?: unknown };\n if (Array.isArray(v.components) && typeof v.colorSpace === 'string') {\n const parts = v.components.map((c) => (typeof c === 'number' ? c.toFixed(3) : String(c)));\n const alpha = typeof v.alpha === 'number' && v.alpha !== 1 ? `, ${v.alpha}` : '';\n return `${v.colorSpace}(${parts.join(' ')}${alpha})`;\n }\n }\n return JSON.stringify(raw);\n}\n\nexport function BorderPreview({ filter = 'border', caption }: BorderPreviewProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo(() => {\n const collected: Row[] = [];\n for (const [path, token] of Object.entries(resolved)) {\n if (token.$type !== 'border') continue;\n if (!globMatch(path, filter)) continue;\n collected.push({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n value: (token.$value ?? {}) as BorderValue,\n });\n }\n collected.sort((a, b) => a.path.localeCompare(b.path, undefined, { numeric: true }));\n return collected;\n }, [resolved, filter, cssVarPrefix]);\n\n const captionText =\n caption ??\n `${rows.length} border${rows.length === 1 ? '' : 's'}${filter ? ` matching \\`${filter}\\`` : ''} · ${activeTheme}`;\n\n if (rows.length === 0) {\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <div style={styles.empty}>No border tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <div style={styles.caption}>{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} style={styles.row}>\n <div style={styles.meta}>\n <span style={styles.path}>{row.path}</span>\n <span style={styles.cssVar}>{row.cssVar}</span>\n </div>\n <div style={styles.sampleCell}>\n <BorderSample path={row.path} />\n </div>\n <div style={styles.breakdown}>\n <span style={styles.breakdownKey}>width</span>\n <span>{formatDimension(row.value.width)}</span>\n <span style={styles.breakdownKey}>style</span>\n <span>{row.value.style != null ? String(row.value.style) : '—'}</span>\n <span style={styles.breakdownKey}>color</span>\n <span>{formatColor(row.value.color)}</span>\n </div>\n </div>\n ))}\n </div>\n );\n}\n","import type { ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport { useColorFormat } from '#/contexts.ts';\nimport { formatColor } from '#/format-color.ts';\nimport {\n BORDER_DEFAULT,\n captionStyle,\n emptyStyle,\n MONO_STACK,\n surfaceStyle,\n} from '#/internal/styles.ts';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport interface ColorPaletteProps {\n /**\n * Token-path filter. Defaults to every `color` token. Use e.g.\n * `\"color.sys.*\"` to scope to the semantic layer, or `\"color.ref.blue.*\"`\n * for a single ref ramp.\n */\n filter?: string;\n /**\n * Grouping depth. Tokens are grouped by the first `groupBy` dot-segments\n * of their path. `2` yields groups like `color.sys`, `color.ref`; `3`\n * yields `color.sys.surface`, `color.sys.text`, etc.\n *\n * If omitted, groupBy is derived from the filter: one level below the\n * filter's fixed prefix (segments before the first `*`), clamped so each\n * swatch still carries a leaf label. `\"color.sys.*\"` → groups at\n * `color.sys.<family>`; `\"color.ref.blue.*\"` collapses all shades into\n * one `color.ref.blue` group because the tokens have no deeper level.\n */\n groupBy?: number;\n /** Override the section caption. */\n caption?: string;\n}\n\nconst styles = {\n wrapper: surfaceStyle,\n caption: captionStyle,\n empty: emptyStyle,\n group: {\n marginBottom: 20,\n } satisfies React.CSSProperties,\n groupHeader: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n opacity: 0.6,\n marginBottom: 8,\n } satisfies React.CSSProperties,\n grid: {\n display: 'grid',\n gridTemplateColumns: 'repeat(auto-fill, minmax(120px, 1fr))',\n gap: 8,\n } satisfies React.CSSProperties,\n card: {\n border: BORDER_DEFAULT,\n borderRadius: 6,\n overflow: 'hidden',\n display: 'flex',\n flexDirection: 'column',\n } satisfies React.CSSProperties,\n swatch: {\n height: 56,\n width: '100%',\n borderBottom: '1px solid var(--sb-color-sys-border-default, rgba(0,0,0,0.08))',\n } satisfies React.CSSProperties,\n meta: {\n padding: '8px 10px',\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n } satisfies React.CSSProperties,\n leaf: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n } satisfies React.CSSProperties,\n value: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n opacity: 0.7,\n } satisfies React.CSSProperties,\n};\n\ninterface Swatch {\n path: string;\n leaf: string;\n cssVar: string;\n value: string;\n outOfGamut: boolean;\n}\n\n/**\n * Count segments in the filter before the first glob (`*` / `**`).\n * `color.ref.*` → 2; `color.sys.surface.*` → 3; `color` → 1; undefined → 0.\n */\nfunction fixedPrefixLength(filter: string | undefined): number {\n if (!filter) return 0;\n const segments = filter.split('.');\n let fixed = 0;\n for (const seg of segments) {\n if (seg === '*' || seg === '**') break;\n fixed += 1;\n }\n return fixed;\n}\n\nexport function ColorPalette({\n filter = 'color',\n groupBy,\n caption,\n}: ColorPaletteProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n const colorFormat = useColorFormat();\n\n const groups = useMemo(() => {\n const entries = Object.entries(resolved)\n .filter(([path, token]) => {\n if (token.$type !== 'color') return false;\n return globMatch(path, filter);\n })\n .toSorted(([a], [b]) => a.localeCompare(b, undefined, { numeric: true }));\n\n const maxDepth = entries.reduce((m, [p]) => Math.max(m, p.split('.').length), 0);\n /**\n * Auto-derive: group one level below the filter's fixed prefix, but\n * clamp so each swatch retains at least one leaf segment. A filter\n * like `color.ref.blue.*` (fixed length 3) with only 4-segment tokens\n * would try groupBy=4 → one-per-group; clamp to `maxDepth - 1` so the\n * whole ramp lands in one group with each shade as a leaf.\n */\n const effectiveGroupBy =\n groupBy ?? Math.min(fixedPrefixLength(filter) + 1, Math.max(maxDepth - 1, 1));\n\n const bucket = new Map<string, Swatch[]>();\n for (const [path, token] of entries) {\n const segments = path.split('.');\n const groupKey = segments.slice(0, effectiveGroupBy).join('.');\n const leaf = segments.slice(effectiveGroupBy).join('.') || segments.at(-1) || path;\n const list = bucket.get(groupKey) ?? [];\n const formatted = formatColor(token.$value, colorFormat);\n list.push({\n path,\n leaf,\n cssVar: makeCssVar(path, cssVarPrefix),\n value: formatted.value,\n outOfGamut: formatted.outOfGamut,\n });\n bucket.set(groupKey, list);\n }\n\n return [...bucket.entries()].toSorted(([a], [b]) =>\n a.localeCompare(b, undefined, { numeric: true }),\n );\n }, [resolved, filter, groupBy, cssVarPrefix, colorFormat]);\n\n const totalCount = groups.reduce((acc, [, swatches]) => acc + swatches.length, 0);\n const captionText =\n caption ??\n `${totalCount} color${totalCount === 1 ? '' : 's'}${filter ? ` matching \\`${filter}\\`` : ''} · ${activeTheme}`;\n\n if (totalCount === 0) {\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <div style={styles.empty}>No color tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div {...themeAttrs(cssVarPrefix, activeTheme)} style={styles.wrapper}>\n <div style={styles.caption}>{captionText}</div>\n {groups.map(([group, swatches]) => (\n <section key={group} style={styles.group}>\n <div style={styles.groupHeader}>{group}</div>\n <div style={styles.grid}>\n {swatches.map((swatch) => (\n <div key={swatch.path} style={styles.card}>\n <div style={{ ...styles.swatch, background: swatch.cssVar }} aria-hidden />\n <div style={styles.meta}>\n <span style={styles.leaf}>{swatch.leaf}</span>\n <span style={styles.value}>\n {swatch.value}\n {swatch.outOfGamut && (\n <span\n title='Out of sRGB gamut for this format'\n aria-label='out of gamut'\n style={{ marginLeft: 4 }}\n >\n {' '}\n ⚠\n </span>\n )}\n </span>\n </div>\n </div>\n ))}\n </div>\n </section>\n ))}\n </div>\n );\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { chromeAliases } from '#/internal/data-attr.ts';\nimport { makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport type DimensionKind = 'length' | 'radius' | 'size';\n\nexport interface DimensionBarProps {\n /** Full dot-path of the dimension token to preview. */\n path: string;\n /**\n * Visualization kind:\n * - `'length'` (default): horizontal bar whose width equals the token's dimension.\n * - `'radius'`: 56×56 square with the token applied as `border-radius`.\n * - `'size'`: a square sized to the token's dimension.\n */\n kind?: DimensionKind;\n}\n\nconst MAX_RENDER_PX = 480;\n\nconst styles = {\n bar: {\n height: 14,\n background: 'var(--sb-color-sys-accent-bg, #3b82f6)',\n borderRadius: 2,\n minWidth: 1,\n } satisfies CSSProperties,\n radiusSample: {\n width: 56,\n height: 56,\n background: 'var(--sb-color-sys-accent-bg, #3b82f6)',\n border: '1px solid var(--sb-color-sys-border-default, rgba(128,128,128,0.3))',\n } satisfies CSSProperties,\n sizeSample: {\n background: 'var(--sb-color-sys-accent-bg, #3b82f6)',\n border: '1px solid var(--sb-color-sys-border-default, rgba(128,128,128,0.3))',\n minWidth: 1,\n minHeight: 1,\n } satisfies CSSProperties,\n};\n\n/**\n * Convert a DTCG dimension `$value` (`{ value, unit }`) to pixels for the\n * purpose of deciding whether to cap the rendered bar. Returns `NaN` for\n * units we can't reasonably approximate (ex / ch / %), which the caller\n * treats as \"render at cssVar but don't cap\".\n */\nfunction toPixels(raw: unknown): number {\n if (raw == null || typeof raw !== 'object') return Number.NaN;\n const v = raw as { value?: unknown; unit?: unknown };\n if (typeof v.value !== 'number' || typeof v.unit !== 'string') return Number.NaN;\n switch (v.unit) {\n case 'px':\n return v.value;\n case 'rem':\n case 'em':\n return v.value * 16;\n default:\n return Number.NaN;\n }\n}\n\nexport function DimensionBar({ path, kind = 'length' }: DimensionBarProps): ReactElement {\n const { resolved, cssVarPrefix } = useProject();\n const cssVar = makeCssVar(path, cssVarPrefix);\n const token = resolved[path];\n const pxValue = toPixels(token?.$value);\n const capped = Number.isFinite(pxValue) && pxValue > MAX_RENDER_PX;\n const cappedValue = capped ? `${MAX_RENDER_PX}px` : cssVar;\n\n const aliases = chromeAliases(cssVarPrefix);\n switch (kind) {\n case 'radius':\n return (\n <div style={{ ...aliases, ...styles.radiusSample, borderRadius: cssVar }} aria-hidden />\n );\n case 'size':\n return (\n <div\n style={{ ...aliases, ...styles.sizeSample, width: cappedValue, height: cappedValue }}\n aria-hidden\n />\n );\n case 'length':\n default:\n return <div style={{ ...aliases, ...styles.bar, width: cappedValue }} aria-hidden />;\n }\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport { DimensionBar, type DimensionKind } from '#/dimension-scale/DimensionBar.tsx';\nimport {\n BORDER_DEFAULT,\n captionStyle,\n emptyStyle,\n MONO_STACK,\n surfaceStyle,\n} from '#/internal/styles.ts';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { formatValue, globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport type { DimensionKind };\n\nexport interface DimensionScaleProps {\n /**\n * Token-path filter. Defaults to every `dimension` token. Use e.g.\n * `\"space.sys.*\"` to scope to the spacing scale.\n */\n filter?: string;\n /**\n * Visualization kind:\n * - `'length'` (default): horizontal bar whose width equals the token's dimension.\n * - `'radius'`: 56×56 square with the token applied as `border-radius`.\n * - `'size'`: a square sized to the token's dimension.\n */\n kind?: DimensionKind;\n /** Override the caption. */\n caption?: string;\n}\n\nconst MAX_RENDER_PX = 480;\n\nconst styles = {\n wrapper: surfaceStyle,\n caption: captionStyle,\n empty: emptyStyle,\n row: {\n display: 'grid',\n gridTemplateColumns: 'minmax(160px, 220px) 1fr auto',\n gap: 16,\n alignItems: 'center',\n padding: '10px 0',\n borderBottom: BORDER_DEFAULT,\n } satisfies CSSProperties,\n meta: {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n minWidth: 0,\n } satisfies CSSProperties,\n path: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } satisfies CSSProperties,\n specs: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n opacity: 0.7,\n } satisfies CSSProperties,\n visualCell: {\n display: 'flex',\n alignItems: 'center',\n minWidth: 0,\n } satisfies CSSProperties,\n cssVar: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n opacity: 0.7,\n whiteSpace: 'nowrap',\n } satisfies CSSProperties,\n cap: {\n fontFamily: MONO_STACK,\n fontSize: 10,\n opacity: 0.6,\n marginLeft: 6,\n } satisfies CSSProperties,\n};\n\ninterface Row {\n path: string;\n cssVar: string;\n displayValue: string;\n pxValue: number;\n capped: boolean;\n}\n\n/**\n * Convert a DTCG dimension `$value` (`{ value, unit }`) to pixels for the\n * purpose of ordering and deciding whether to show a cap indicator.\n */\nfunction toPixels(raw: unknown): number {\n if (raw == null || typeof raw !== 'object') return Number.NaN;\n const v = raw as { value?: unknown; unit?: unknown };\n if (typeof v.value !== 'number' || typeof v.unit !== 'string') return Number.NaN;\n switch (v.unit) {\n case 'px':\n return v.value;\n case 'rem':\n case 'em':\n return v.value * 16;\n default:\n return Number.NaN;\n }\n}\n\nexport function DimensionScale({\n filter = 'dimension',\n kind = 'length',\n caption,\n}: DimensionScaleProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo(() => {\n const collected: Row[] = [];\n for (const [path, token] of Object.entries(resolved)) {\n if (token.$type !== 'dimension') continue;\n if (!globMatch(path, filter)) continue;\n const pxValue = toPixels(token.$value);\n collected.push({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n displayValue: formatValue(token.$value),\n pxValue,\n capped: Number.isFinite(pxValue) && pxValue > MAX_RENDER_PX,\n });\n }\n collected.sort((a, b) => {\n if (Number.isFinite(a.pxValue) && Number.isFinite(b.pxValue)) return a.pxValue - b.pxValue;\n return a.path.localeCompare(b.path, undefined, { numeric: true });\n });\n return collected;\n }, [resolved, filter, cssVarPrefix]);\n\n const captionText =\n caption ??\n `${rows.length} dimension${rows.length === 1 ? '' : 's'}${filter ? ` matching \\`${filter}\\`` : ''} · ${activeTheme}`;\n\n if (rows.length === 0) {\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <div style={styles.empty}>No dimension tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <div style={styles.caption}>{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} style={styles.row}>\n <div style={styles.meta}>\n <span style={styles.path}>{row.path}</span>\n <span style={styles.specs}>{row.displayValue}</span>\n </div>\n <div style={styles.visualCell}>\n <DimensionBar path={row.path} kind={kind} />\n {row.capped && <span style={styles.cap}>capped at {MAX_RENDER_PX}px</span>}\n </div>\n <span style={styles.cssVar}>{row.cssVar}</span>\n </div>\n ))}\n </div>\n );\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport {\n BORDER_DEFAULT,\n captionStyle,\n emptyStyle,\n MONO_STACK,\n surfaceStyle,\n} from '#/internal/styles.ts';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport interface FontFamilySampleProps {\n /**\n * Token-path filter. Defaults to every `fontFamily` token. Use e.g.\n * `\"font.ref.family.*\"` to scope to the ref layer.\n */\n filter?: string;\n /** Override the sample text rendered for each token. */\n sample?: string;\n /** Override the caption. */\n caption?: string;\n}\n\nconst styles = {\n wrapper: surfaceStyle,\n caption: captionStyle,\n row: {\n display: 'grid',\n gridTemplateColumns: 'minmax(160px, 220px) 1fr auto',\n gap: 16,\n alignItems: 'baseline',\n padding: '14px 0',\n borderBottom: BORDER_DEFAULT,\n } satisfies CSSProperties,\n meta: {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n minWidth: 0,\n } satisfies CSSProperties,\n path: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } satisfies CSSProperties,\n stack: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n sample: {\n fontSize: 22,\n lineHeight: 1.2,\n } satisfies CSSProperties,\n cssVar: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n empty: emptyStyle,\n};\n\ninterface Row {\n path: string;\n cssVar: string;\n stack: string;\n}\n\nfunction stackString(raw: unknown): string {\n if (typeof raw === 'string') return raw;\n if (Array.isArray(raw)) return raw.map(String).join(', ');\n return '';\n}\n\nexport function FontFamilySample({\n filter = 'fontFamily',\n sample = 'The quick brown fox jumps over the lazy dog.',\n caption,\n}: FontFamilySampleProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n return Object.entries(resolved)\n .filter(([path, token]) => {\n if (token.$type !== 'fontFamily') return false;\n return globMatch(path, filter);\n })\n .toSorted(([a], [b]) => a.localeCompare(b, undefined, { numeric: true }))\n .map(([path, token]) => ({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n stack: stackString(token.$value),\n }));\n }, [resolved, filter, cssVarPrefix]);\n\n const captionText =\n caption ??\n `${rows.length} fontFamily token${rows.length === 1 ? '' : 's'}${filter && filter !== 'fontFamily' ? ` matching \\`${filter}\\`` : ''} · ${activeTheme}`;\n\n if (rows.length === 0) {\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <div style={styles.empty}>No fontFamily tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <div style={styles.caption}>{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} style={styles.row}>\n <div style={styles.meta}>\n <span style={styles.path}>{row.path}</span>\n <span style={styles.stack}>{row.stack}</span>\n </div>\n <div style={{ ...styles.sample, fontFamily: row.cssVar }}>{sample}</div>\n <span style={styles.cssVar}>{row.cssVar}</span>\n </div>\n ))}\n </div>\n );\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport {\n BORDER_DEFAULT,\n captionStyle,\n emptyStyle,\n MONO_STACK,\n surfaceStyle,\n} from '#/internal/styles.ts';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport interface FontWeightScaleProps {\n /**\n * Token-path filter. Defaults to every `fontWeight` token. Use e.g.\n * `\"font.ref.weight.*\"` to scope to the ref layer.\n */\n filter?: string;\n /** Override the sample text rendered for each token. */\n sample?: string;\n /** Override the caption. */\n caption?: string;\n}\n\nconst styles = {\n wrapper: surfaceStyle,\n caption: captionStyle,\n empty: emptyStyle,\n row: {\n display: 'grid',\n gridTemplateColumns: 'minmax(160px, 220px) 1fr auto',\n gap: 16,\n alignItems: 'baseline',\n padding: '12px 0',\n borderBottom: BORDER_DEFAULT,\n } satisfies CSSProperties,\n meta: {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n minWidth: 0,\n } satisfies CSSProperties,\n path: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } satisfies CSSProperties,\n value: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n sample: {\n fontSize: 28,\n lineHeight: 1,\n } satisfies CSSProperties,\n cssVar: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n};\n\ninterface Row {\n path: string;\n cssVar: string;\n display: string;\n weight: number;\n}\n\nfunction toWeight(raw: unknown): number {\n if (typeof raw === 'number') return raw;\n if (typeof raw === 'string') {\n const n = Number.parseInt(raw, 10);\n return Number.isFinite(n) ? n : Number.NaN;\n }\n return Number.NaN;\n}\n\nexport function FontWeightScale({\n filter = 'fontWeight',\n sample = 'Aa',\n caption,\n}: FontWeightScaleProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n const collected: Row[] = [];\n for (const [path, token] of Object.entries(resolved)) {\n if (token.$type !== 'fontWeight') continue;\n if (!globMatch(path, filter)) continue;\n collected.push({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n display: token.$value == null ? '' : String(token.$value),\n weight: toWeight(token.$value),\n });\n }\n collected.sort((a, b) => {\n if (Number.isFinite(a.weight) && Number.isFinite(b.weight)) return a.weight - b.weight;\n return a.path.localeCompare(b.path, undefined, { numeric: true });\n });\n return collected;\n }, [resolved, filter, cssVarPrefix]);\n\n const captionText =\n caption ??\n `${rows.length} fontWeight token${rows.length === 1 ? '' : 's'}${filter && filter !== 'fontWeight' ? ` matching \\`${filter}\\`` : ''} · ${activeTheme}`;\n\n if (rows.length === 0) {\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <div style={styles.empty}>No fontWeight tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <div style={styles.caption}>{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} style={styles.row}>\n <div style={styles.meta}>\n <span style={styles.path}>{row.path}</span>\n <span style={styles.value}>{row.display}</span>\n </div>\n <div\n style={{\n ...styles.sample,\n fontWeight: row.cssVar as unknown as CSSProperties['fontWeight'],\n }}\n >\n {sample}\n </div>\n <span style={styles.cssVar}>{row.cssVar}</span>\n </div>\n ))}\n </div>\n );\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport {\n BORDER_DEFAULT,\n BORDER_FAINT,\n captionStyle,\n emptyStyle,\n MONO_STACK,\n surfaceStyle,\n} from '#/internal/styles.ts';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport interface GradientPaletteProps {\n /**\n * Token-path filter. Defaults to every `gradient` token. Use e.g.\n * `\"gradient.ref.*\"` or `\"gradient.sys.accent\"` to scope.\n */\n filter?: string;\n /** Override the caption. */\n caption?: string;\n}\n\nconst styles = {\n wrapper: surfaceStyle,\n caption: captionStyle,\n empty: emptyStyle,\n row: {\n display: 'grid',\n gridTemplateColumns: 'minmax(180px, 240px) 1fr minmax(140px, 220px)',\n gap: 16,\n alignItems: 'center',\n padding: '16px 0',\n borderBottom: BORDER_DEFAULT,\n } satisfies CSSProperties,\n meta: {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n minWidth: 0,\n } satisfies CSSProperties,\n path: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } satisfies CSSProperties,\n cssVar: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n opacity: 0.7,\n } satisfies CSSProperties,\n sample: {\n height: 56,\n borderRadius: 6,\n border: BORDER_FAINT,\n } satisfies CSSProperties,\n stops: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n } satisfies CSSProperties,\n stopRow: {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n } satisfies CSSProperties,\n stopSwatch: {\n width: 10,\n height: 10,\n borderRadius: 2,\n border: '1px solid var(--sb-color-sys-border-default, rgba(0,0,0,0.1))',\n flex: '0 0 auto',\n } satisfies CSSProperties,\n stopPosition: {\n opacity: 0.6,\n } satisfies CSSProperties,\n};\n\ninterface GradientStop {\n color?: {\n colorSpace?: string;\n components?: readonly number[];\n alpha?: number;\n };\n position?: number;\n}\n\ninterface Row {\n path: string;\n cssVar: string;\n stops: GradientStop[];\n}\n\nfunction asStops(raw: unknown): GradientStop[] {\n if (!Array.isArray(raw)) return [];\n return raw as GradientStop[];\n}\n\nconst pct = (n: number): string => `${(n * 100).toFixed(3)}%`;\n\nfunction stopCssColor(stop: GradientStop): string {\n const color = stop.color;\n if (!color || !Array.isArray(color.components) || color.components.length < 3) {\n return 'transparent';\n }\n const [r, g, b] = color.components;\n if (r === undefined || g === undefined || b === undefined) return 'transparent';\n const alpha = color.alpha ?? 1;\n return alpha === 1\n ? `rgb(${pct(r)} ${pct(g)} ${pct(b)})`\n : `rgb(${pct(r)} ${pct(g)} ${pct(b)} / ${alpha})`;\n}\n\nfunction stopKey(path: string, stop: GradientStop, fallback: number): string {\n return `${path}|${stop.position ?? fallback}|${stopCssColor(stop)}`;\n}\n\nexport function GradientPalette({\n filter = 'gradient',\n caption,\n}: GradientPaletteProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo(() => {\n const collected: Row[] = [];\n for (const [path, token] of Object.entries(resolved)) {\n if (token.$type !== 'gradient') continue;\n if (!globMatch(path, filter)) continue;\n collected.push({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n stops: asStops(token.$value),\n });\n }\n collected.sort((a, b) => a.path.localeCompare(b.path, undefined, { numeric: true }));\n return collected;\n }, [resolved, filter, cssVarPrefix]);\n\n const captionText =\n caption ??\n `${rows.length} gradient${rows.length === 1 ? '' : 's'}${filter ? ` matching \\`${filter}\\`` : ''} · ${activeTheme}`;\n\n if (rows.length === 0) {\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <div style={styles.empty}>No gradient tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <div style={styles.caption}>{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} style={styles.row}>\n <div style={styles.meta}>\n <span style={styles.path}>{row.path}</span>\n <span style={styles.cssVar}>{row.cssVar}</span>\n </div>\n <div\n style={{ ...styles.sample, background: `linear-gradient(to right, ${row.cssVar})` }}\n aria-hidden\n />\n <div style={styles.stops}>\n {row.stops.map((stop, i) => (\n <div key={stopKey(row.path, stop, i)} style={styles.stopRow}>\n <span\n style={{ ...styles.stopSwatch, background: stopCssColor(stop) }}\n aria-hidden\n />\n <span>{stopCssColor(stop)}</span>\n <span style={styles.stopPosition}>\n @ {((stop.position ?? 0) * 100).toFixed(0)}%\n </span>\n </div>\n ))}\n </div>\n </div>\n ))}\n </div>\n );\n}\n","import { useEffect, useState } from 'react';\n\n/**\n * Reactive `prefers-reduced-motion: reduce` detector. Returns the current\n * match and updates if the user toggles the OS-level preference.\n */\nexport function usePrefersReducedMotion(): boolean {\n const [reduced, setReduced] = useState(false);\n useEffect(() => {\n if (typeof window === 'undefined') return;\n const query = window.matchMedia('(prefers-reduced-motion: reduce)');\n setReduced(query.matches);\n const onChange = (e: MediaQueryListEvent): void => setReduced(e.matches);\n query.addEventListener('change', onChange);\n return () => query.removeEventListener('change', onChange);\n }, []);\n return reduced;\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useEffect, useMemo, useState } from 'react';\nimport { chromeAliases } from '#/internal/data-attr.ts';\nimport { usePrefersReducedMotion } from '#/internal/prefers-reduced-motion.ts';\nimport { useProject } from '#/internal/use-project.ts';\n\nexport type MotionSpeed = 0.25 | 0.5 | 1 | 2;\n\nexport interface MotionSampleProps {\n /** Full dot-path of the motion token (`transition`, `duration`, or `cubicBezier`). */\n path: string;\n /** Playback speed multiplier. Defaults to `1`. */\n speed?: MotionSpeed;\n /**\n * Change this value to force the animation to restart. Useful when an\n * outer block exposes a \"replay\" button that should re-trigger every\n * sample at once.\n */\n runKey?: number;\n}\n\nconst DEFAULT_DURATION_MS = 300;\nconst DEFAULT_EASING = 'cubic-bezier(0.2, 0, 0, 1)';\n\nconst styles = {\n track: {\n position: 'relative',\n height: 36,\n background: 'var(--sb-color-sys-surface-muted, rgba(128,128,128,0.08))',\n borderRadius: 18,\n overflow: 'hidden',\n } satisfies CSSProperties,\n ball: {\n position: 'absolute',\n top: '50%',\n width: 28,\n height: 28,\n marginTop: -14,\n borderRadius: '50%',\n background: 'var(--sb-color-sys-accent-bg, #3b82f6)',\n } satisfies CSSProperties,\n reducedMotion: {\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n fontStyle: 'italic',\n } satisfies CSSProperties,\n};\n\ninterface Spec {\n durationMs: number;\n easing: string;\n}\n\nfunction extractDurationMs(raw: unknown): number {\n if (raw == null) return Number.NaN;\n if (typeof raw === 'object') {\n const v = raw as { value?: unknown; unit?: unknown };\n if (typeof v.value === 'number' && typeof v.unit === 'string') {\n if (v.unit === 'ms') return v.value;\n if (v.unit === 's') return v.value * 1000;\n }\n }\n return Number.NaN;\n}\n\nfunction extractCubicBezier(raw: unknown): string | null {\n if (Array.isArray(raw) && raw.length === 4 && raw.every((n) => typeof n === 'number')) {\n return `cubic-bezier(${raw.map((n) => Number(n).toFixed(3)).join(', ')})`;\n }\n return null;\n}\n\nfunction asDuration(\n raw: unknown,\n themeTokens: Record<string, { $value?: unknown }>,\n fallback: number,\n): number {\n const direct = extractDurationMs(raw);\n if (Number.isFinite(direct)) return direct;\n if (typeof raw === 'string') {\n const match = raw.match(/^\\{([^}]+)\\}$/);\n if (match && match[1]) {\n const referenced = themeTokens[match[1]];\n const resolved = extractDurationMs(referenced?.$value);\n if (Number.isFinite(resolved)) return resolved;\n }\n }\n return fallback;\n}\n\nfunction asEasing(\n raw: unknown,\n themeTokens: Record<string, { $value?: unknown }>,\n fallback: string,\n): string {\n const direct = extractCubicBezier(raw);\n if (direct) return direct;\n if (typeof raw === 'string') {\n const match = raw.match(/^\\{([^}]+)\\}$/);\n if (match && match[1]) {\n const referenced = themeTokens[match[1]];\n const resolved = extractCubicBezier(referenced?.$value);\n if (resolved) return resolved;\n }\n }\n return fallback;\n}\n\nexport function resolveMotionSpec(\n token: { $type?: string; $value?: unknown } | undefined,\n themeTokens: Record<string, { $value?: unknown }>,\n): Spec | null {\n if (!token) return null;\n const type = token.$type;\n if (type === 'transition') {\n const v = (token.$value ?? {}) as {\n duration?: unknown;\n timingFunction?: unknown;\n };\n return {\n durationMs: asDuration(v.duration, themeTokens, DEFAULT_DURATION_MS),\n easing: asEasing(v.timingFunction, themeTokens, DEFAULT_EASING),\n };\n }\n if (type === 'duration') {\n const durationMs = extractDurationMs(token.$value);\n if (!Number.isFinite(durationMs)) return null;\n return { durationMs, easing: DEFAULT_EASING };\n }\n if (type === 'cubicBezier') {\n const easing = extractCubicBezier(token.$value);\n if (!easing) return null;\n return { durationMs: DEFAULT_DURATION_MS, easing };\n }\n return null;\n}\n\nexport function MotionSample({ path, speed = 1, runKey = 0 }: MotionSampleProps): ReactElement {\n const { resolved, cssVarPrefix } = useProject();\n const reducedMotion = usePrefersReducedMotion();\n\n const spec = useMemo(() => resolveMotionSpec(resolved[path], resolved), [resolved, path]);\n\n const durationMs = spec?.durationMs ?? DEFAULT_DURATION_MS;\n const easing = spec?.easing ?? DEFAULT_EASING;\n const scaledDuration = Math.max(1, durationMs / speed);\n\n const [phase, setPhase] = useState<0 | 1>(0);\n\n useEffect(() => {\n if (reducedMotion) return;\n setPhase(0);\n const id = requestAnimationFrame(() => setPhase(1));\n const loop = window.setInterval(() => {\n setPhase((p) => (p === 0 ? 1 : 0));\n }, scaledDuration * 2);\n return () => {\n cancelAnimationFrame(id);\n window.clearInterval(loop);\n };\n }, [scaledDuration, runKey, reducedMotion]);\n\n if (reducedMotion) {\n return (\n <div style={{ ...chromeAliases(cssVarPrefix), ...styles.reducedMotion }}>\n Animation suppressed by `prefers-reduced-motion: reduce`.\n </div>\n );\n }\n\n return (\n <div style={{ ...chromeAliases(cssVarPrefix), ...styles.track }}>\n <div\n style={{\n ...styles.ball,\n left: phase === 1 ? 'calc(100% - 32px)' : '4px',\n transition: `left ${scaledDuration}ms ${easing}`,\n }}\n aria-hidden\n />\n </div>\n );\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useMemo, useState } from 'react';\nimport { usePrefersReducedMotion } from '#/internal/prefers-reduced-motion.ts';\nimport { BORDER_DEFAULT, MONO_STACK, surfaceStyle } from '#/internal/styles.ts';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\nimport {\n MotionSample,\n type MotionSpeed,\n resolveMotionSpec,\n} from '#/motion-preview/MotionSample.tsx';\n\nexport type { MotionSpeed };\n\nexport interface MotionPreviewProps {\n /**\n * Token-path filter. Defaults to transition + duration + cubicBezier\n * tokens. Use e.g. `\"motion.sys.*\"` to scope to the semantic layer.\n */\n filter?: string;\n /** Override the caption. */\n caption?: string;\n}\n\nconst SPEEDS: MotionSpeed[] = [0.25, 0.5, 1, 2];\n\nconst styles = {\n wrapper: surfaceStyle,\n caption: {\n padding: '4px 0 4px',\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n fontSize: 12,\n } satisfies CSSProperties,\n controls: {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '8px 0 12px',\n } satisfies CSSProperties,\n controlLabel: {\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n } satisfies CSSProperties,\n speedBtn: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n padding: '4px 8px',\n background: 'transparent',\n color: 'inherit',\n border: '1px solid var(--sb-color-sys-border-default, rgba(128,128,128,0.3))',\n borderRadius: 4,\n cursor: 'pointer',\n } satisfies CSSProperties,\n speedBtnActive: {\n background: 'var(--sb-color-sys-accent-bg, #3b82f6)',\n color: 'var(--sb-color-sys-accent-fg, #fff)',\n borderColor: 'transparent',\n } satisfies CSSProperties,\n replayBtn: {\n fontSize: 11,\n padding: '4px 10px',\n marginLeft: 'auto',\n background: 'transparent',\n color: 'inherit',\n border: '1px solid var(--sb-color-sys-border-default, rgba(128,128,128,0.3))',\n borderRadius: 4,\n cursor: 'pointer',\n } satisfies CSSProperties,\n row: {\n display: 'grid',\n gridTemplateColumns: 'minmax(180px, 240px) 1fr auto',\n gap: 16,\n alignItems: 'center',\n padding: '14px 0',\n borderBottom: BORDER_DEFAULT,\n } satisfies CSSProperties,\n meta: {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n minWidth: 0,\n } satisfies CSSProperties,\n path: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } satisfies CSSProperties,\n specs: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n cssVar: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n whiteSpace: 'nowrap',\n } satisfies CSSProperties,\n empty: {\n padding: '24px 12px',\n textAlign: 'center',\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n};\n\ninterface Row {\n path: string;\n cssVar: string;\n durationMs: number;\n easing: string;\n kind: 'transition' | 'duration' | 'cubicBezier';\n}\n\nfunction formatSpec(row: Row): string {\n switch (row.kind) {\n case 'transition':\n return `transition · ${Math.round(row.durationMs)}ms · ${row.easing}`;\n case 'duration':\n return `duration · ${Math.round(row.durationMs)}ms`;\n case 'cubicBezier':\n return `cubicBezier · ${row.easing}`;\n }\n}\n\nexport function MotionPreview({ filter, caption }: MotionPreviewProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n const [speed, setSpeed] = useState<MotionSpeed>(1);\n const [run, setRun] = useState(0);\n const reducedMotion = usePrefersReducedMotion();\n\n const rows = useMemo(() => {\n const collected: Row[] = [];\n for (const [path, token] of Object.entries(resolved)) {\n if (filter && !globMatch(path, filter)) continue;\n if (!filter && !['transition', 'duration', 'cubicBezier'].includes(token.$type ?? '')) {\n continue;\n }\n const kind = token.$type as Row['kind'] | undefined;\n if (!kind) continue;\n const spec = resolveMotionSpec(token, resolved);\n if (!spec) continue;\n collected.push({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n durationMs: spec.durationMs,\n easing: spec.easing,\n kind,\n });\n }\n collected.sort((a, b) => {\n if (a.kind !== b.kind) return a.kind.localeCompare(b.kind);\n return a.path.localeCompare(b.path, undefined, { numeric: true });\n });\n return collected;\n }, [resolved, filter, cssVarPrefix]);\n\n const captionText =\n caption ??\n `${rows.length} motion token${rows.length === 1 ? '' : 's'}${filter ? ` matching \\`${filter}\\`` : ''} · ${activeTheme}`;\n\n if (rows.length === 0) {\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <div style={styles.empty}>No motion tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <div style={styles.caption}>{captionText}</div>\n <div style={styles.controls}>\n <span style={styles.controlLabel}>Speed</span>\n {SPEEDS.map((s) => (\n <button\n key={s}\n type='button'\n style={{ ...styles.speedBtn, ...(s === speed ? styles.speedBtnActive : {}) }}\n onClick={() => setSpeed(s)}\n >\n {s}×\n </button>\n ))}\n <button\n type='button'\n style={styles.replayBtn}\n onClick={() => setRun((n) => n + 1)}\n disabled={reducedMotion}\n title={reducedMotion ? 'Disabled by prefers-reduced-motion' : 'Replay all'}\n >\n ↻ Replay\n </button>\n </div>\n {rows.map((row) => (\n <div key={row.path} style={styles.row}>\n <div style={styles.meta}>\n <span style={styles.path}>{row.path}</span>\n <span style={styles.specs}>{formatSpec(row)}</span>\n </div>\n <MotionSample path={row.path} speed={speed} runKey={run} />\n <span style={styles.cssVar}>{row.cssVar}</span>\n </div>\n ))}\n </div>\n );\n}\n","import type { ReactElement, ReactNode } from 'react';\nimport { type ProjectSnapshot, SwatchbookContext, useOptionalSwatchbookData } from '#/contexts.ts';\n\nexport type { ProjectSnapshot };\n\nexport interface SwatchbookProviderProps {\n value: ProjectSnapshot;\n children: ReactNode;\n}\n\n/**\n * Wraps a tree of blocks with the token data they need to render.\n *\n * The Storybook addon's preview decorator mounts this automatically, so\n * story/MDX authors typically never see it. Outside Storybook — unit\n * tests, custom React apps, non-Storybook doc sites — consumers construct\n * a {@link ProjectSnapshot} (often imported from a JSON file) and wrap\n * their blocks in this provider.\n */\nexport function SwatchbookProvider({ value, children }: SwatchbookProviderProps): ReactElement {\n return <SwatchbookContext.Provider value={value}>{children}</SwatchbookContext.Provider>;\n}\n\n/**\n * Read the current {@link ProjectSnapshot}. Throws if called outside a\n * {@link SwatchbookProvider}; blocks that need to fall back to the\n * virtual module go through the internal `useProject()` hook instead.\n */\nexport function useSwatchbookData(): ProjectSnapshot {\n const value = useOptionalSwatchbookData();\n if (!value) {\n throw new Error(\n '[swatchbook-blocks] useSwatchbookData() called outside <SwatchbookProvider>. ' +\n 'Wrap your tree in <SwatchbookProvider value={snapshot}> or render inside a Storybook story.',\n );\n }\n return value;\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { chromeAliases } from '#/internal/data-attr.ts';\nimport { makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport interface ShadowSampleProps {\n /** Full dot-path of the shadow token to preview. */\n path: string;\n}\n\nconst sampleStyle: CSSProperties = {\n width: 120,\n height: 56,\n background: 'var(--sb-color-sys-surface-raised, #fff)',\n border: '1px solid var(--sb-color-sys-border-default, rgba(128,128,128,0.15))',\n borderRadius: 6,\n};\n\nexport function ShadowSample({ path }: ShadowSampleProps): ReactElement {\n const { cssVarPrefix } = useProject();\n const cssVar = makeCssVar(path, cssVarPrefix);\n return (\n <div\n style={{ ...chromeAliases(cssVarPrefix), ...sampleStyle, boxShadow: cssVar }}\n aria-hidden\n />\n );\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport {\n BORDER_DEFAULT,\n captionStyle,\n emptyStyle,\n MONO_STACK,\n surfaceStyle,\n} from '#/internal/styles.ts';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\nimport { ShadowSample } from '#/shadow-preview/ShadowSample.tsx';\n\nexport interface ShadowPreviewProps {\n /**\n * Token-path filter. Defaults to every `shadow` token. Use e.g.\n * `\"shadow.sys.*\"` to scope to the semantic layer.\n */\n filter?: string;\n /** Override the caption. */\n caption?: string;\n}\n\nconst styles = {\n wrapper: surfaceStyle,\n caption: captionStyle,\n empty: emptyStyle,\n row: {\n display: 'grid',\n gridTemplateColumns: 'minmax(160px, 220px) 140px 1fr',\n gap: 16,\n alignItems: 'center',\n padding: '16px 0',\n borderBottom: BORDER_DEFAULT,\n } satisfies CSSProperties,\n meta: {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n minWidth: 0,\n } satisfies CSSProperties,\n path: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } satisfies CSSProperties,\n cssVar: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n opacity: 0.7,\n } satisfies CSSProperties,\n sampleCell: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: 96,\n } satisfies CSSProperties,\n breakdown: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n display: 'grid',\n gridTemplateColumns: 'auto 1fr',\n columnGap: 12,\n rowGap: 2,\n } satisfies CSSProperties,\n breakdownKey: {\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n layerHeader: {\n fontSize: 10,\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n marginTop: 6,\n } satisfies CSSProperties,\n};\n\ninterface ShadowLayer {\n color?: unknown;\n offsetX?: unknown;\n offsetY?: unknown;\n blur?: unknown;\n spread?: unknown;\n inset?: unknown;\n}\n\ninterface Row {\n path: string;\n cssVar: string;\n layers: ShadowLayer[];\n}\n\nfunction formatDimension(raw: unknown): string {\n if (raw == null) return '—';\n if (typeof raw === 'number') return String(raw);\n if (typeof raw === 'string') return raw;\n if (typeof raw === 'object') {\n const v = raw as { value?: unknown; unit?: unknown };\n if (typeof v.value === 'number' && typeof v.unit === 'string') {\n return `${v.value}${v.unit}`;\n }\n }\n return JSON.stringify(raw);\n}\n\nfunction formatColor(raw: unknown): string {\n if (raw == null) return '—';\n if (typeof raw === 'string') return raw;\n if (typeof raw === 'object') {\n const v = raw as { components?: unknown; alpha?: unknown; colorSpace?: unknown };\n if (Array.isArray(v.components) && typeof v.colorSpace === 'string') {\n const parts = v.components.map((c) => (typeof c === 'number' ? c.toFixed(3) : String(c)));\n const alpha = typeof v.alpha === 'number' && v.alpha !== 1 ? `, ${v.alpha}` : '';\n return `${v.colorSpace}(${parts.join(' ')}${alpha})`;\n }\n }\n return JSON.stringify(raw);\n}\n\nfunction asLayers(raw: unknown): ShadowLayer[] {\n if (Array.isArray(raw)) return raw as ShadowLayer[];\n if (raw && typeof raw === 'object') return [raw as ShadowLayer];\n return [];\n}\n\nfunction layerKey(path: string, layer: ShadowLayer, fallback: number): string {\n const off = `${formatDimension(layer.offsetX)},${formatDimension(layer.offsetY)}`;\n const blur = formatDimension(layer.blur);\n const spread = formatDimension(layer.spread);\n return `${path}|${off}|${blur}|${spread}|${fallback}`;\n}\n\nexport function ShadowPreview({ filter = 'shadow', caption }: ShadowPreviewProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo(() => {\n const collected: Row[] = [];\n for (const [path, token] of Object.entries(resolved)) {\n if (token.$type !== 'shadow') continue;\n if (!globMatch(path, filter)) continue;\n collected.push({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n layers: asLayers(token.$value),\n });\n }\n collected.sort((a, b) => a.path.localeCompare(b.path, undefined, { numeric: true }));\n return collected;\n }, [resolved, filter, cssVarPrefix]);\n\n const captionText =\n caption ??\n `${rows.length} shadow${rows.length === 1 ? '' : 's'}${filter ? ` matching \\`${filter}\\`` : ''} · ${activeTheme}`;\n\n if (rows.length === 0) {\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <div style={styles.empty}>No shadow tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <div style={styles.caption}>{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} style={styles.row}>\n <div style={styles.meta}>\n <span style={styles.path}>{row.path}</span>\n <span style={styles.cssVar}>{row.cssVar}</span>\n </div>\n <div style={styles.sampleCell}>\n <ShadowSample path={row.path} />\n </div>\n <div style={styles.breakdown}>\n {row.layers.length === 1\n ? renderLayer(row.layers[0])\n : row.layers.map((layer, i) => (\n <Layer\n key={layerKey(row.path, layer, i)}\n layer={layer}\n index={i}\n total={row.layers.length}\n />\n ))}\n </div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction renderLayer(layer: ShadowLayer | undefined): ReactElement[] {\n if (!layer) return [];\n const entries: [string, string][] = [\n ['offset', `${formatDimension(layer.offsetX)} ${formatDimension(layer.offsetY)}`],\n ['blur', formatDimension(layer.blur)],\n ['spread', formatDimension(layer.spread)],\n ['color', formatColor(layer.color)],\n ];\n if (layer.inset) entries.push(['inset', String(layer.inset)]);\n return entries.flatMap(([k, v]) => [\n <span key={`k-${k}`} style={styles.breakdownKey}>\n {k}\n </span>,\n <span key={`v-${k}`}>{v}</span>,\n ]);\n}\n\nfunction Layer({\n layer,\n index,\n total,\n}: {\n layer: ShadowLayer;\n index: number;\n total: number;\n}): ReactElement {\n return (\n <div style={{ gridColumn: '1 / -1' }}>\n <div style={styles.layerHeader}>\n layer {index + 1} of {total}\n </div>\n <div style={{ ...styles.breakdown, marginTop: 2 }}>{renderLayer(layer)}</div>\n </div>\n );\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport {\n BORDER_DEFAULT,\n captionStyle,\n emptyStyle,\n MONO_STACK,\n surfaceStyle,\n} from '#/internal/styles.ts';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { formatValue, globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport interface StrokeStyleSampleProps {\n /**\n * Token-path filter. Defaults to every `strokeStyle` token. Use e.g.\n * `\"stroke.ref.style.*\"` to scope to the ref layer.\n */\n filter?: string;\n /** Override the caption. */\n caption?: string;\n}\n\nconst STRING_STYLES = new Set([\n 'solid',\n 'dashed',\n 'dotted',\n 'double',\n 'groove',\n 'ridge',\n 'outset',\n 'inset',\n]);\n\nconst styles = {\n wrapper: surfaceStyle,\n caption: captionStyle,\n empty: emptyStyle,\n row: {\n display: 'grid',\n gridTemplateColumns: 'minmax(160px, 220px) 1fr auto',\n gap: 16,\n alignItems: 'center',\n padding: '14px 0',\n borderBottom: BORDER_DEFAULT,\n } satisfies CSSProperties,\n meta: {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n minWidth: 0,\n } satisfies CSSProperties,\n path: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } satisfies CSSProperties,\n value: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n line: {\n height: 0,\n borderTopWidth: 4,\n borderTopColor: 'var(--sb-color-sys-text-default, CanvasText)',\n width: '100%',\n } satisfies CSSProperties,\n objectFallback: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n cssVar: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n};\n\ninterface Row {\n path: string;\n cssVar: string;\n displayValue: string;\n cssStyle: string | null;\n}\n\nfunction extractCssStyle(value: unknown): string | null {\n if (typeof value === 'string' && STRING_STYLES.has(value)) return value;\n return null;\n}\n\nexport function StrokeStyleSample({\n filter = 'strokeStyle',\n caption,\n}: StrokeStyleSampleProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n return Object.entries(resolved)\n .filter(([path, token]) => {\n if (token.$type !== 'strokeStyle') return false;\n return globMatch(path, filter);\n })\n .toSorted(([a], [b]) => a.localeCompare(b, undefined, { numeric: true }))\n .map(([path, token]) => ({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n displayValue: formatValue(token.$value),\n cssStyle: extractCssStyle(token.$value),\n }));\n }, [resolved, filter, cssVarPrefix]);\n\n const captionText =\n caption ??\n `${rows.length} strokeStyle token${rows.length === 1 ? '' : 's'}${filter && filter !== 'strokeStyle' ? ` matching \\`${filter}\\`` : ''} · ${activeTheme}`;\n\n if (rows.length === 0) {\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <div style={styles.empty}>No strokeStyle tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <div style={styles.caption}>{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} style={styles.row}>\n <div style={styles.meta}>\n <span style={styles.path}>{row.path}</span>\n <span style={styles.value}>{row.displayValue}</span>\n </div>\n {row.cssStyle ? (\n <div\n style={{\n ...styles.line,\n borderTopStyle: row.cssStyle as CSSProperties['borderTopStyle'],\n }}\n aria-hidden\n />\n ) : (\n <span style={styles.objectFallback}>\n Object-form (dashArray + lineCap) — no pure CSS `border-style` equivalent.\n </span>\n )}\n <span style={styles.cssVar}>{row.cssVar}</span>\n </div>\n ))}\n </div>\n );\n}\n","import type { CSSProperties } from 'react';\nimport { BORDER_DEFAULT, BORDER_FAINT, MONO_STACK, surfaceStyle } from '#/internal/styles.ts';\n\nexport const styles = {\n wrapper: {\n ...surfaceStyle,\n padding: 16,\n border: BORDER_DEFAULT,\n } satisfies CSSProperties,\n heading: {\n margin: 0,\n fontFamily: MONO_STACK,\n fontSize: 16,\n } satisfies CSSProperties,\n subline: {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n margin: '4px 0 12px',\n fontSize: 12,\n opacity: 0.8,\n } satisfies CSSProperties,\n typePill: {\n display: 'inline-block',\n padding: '2px 6px',\n borderRadius: 4,\n fontSize: 10,\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n background: 'var(--sb-color-sys-surface-muted, rgba(128,128,128,0.15))',\n } satisfies CSSProperties,\n description: {\n margin: '0 0 12px',\n opacity: 0.85,\n } satisfies CSSProperties,\n sectionHeader: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n opacity: 0.6,\n margin: '12px 0 6px',\n } satisfies CSSProperties,\n chain: {\n display: 'flex',\n flexWrap: 'wrap',\n gap: 6,\n alignItems: 'center',\n fontFamily: MONO_STACK,\n fontSize: 12,\n } satisfies CSSProperties,\n chainNode: {\n padding: '2px 6px',\n borderRadius: 4,\n border: BORDER_DEFAULT,\n } satisfies CSSProperties,\n arrow: {\n opacity: 0.5,\n } satisfies CSSProperties,\n themeTable: {\n width: '100%',\n borderCollapse: 'collapse',\n tableLayout: 'fixed',\n fontSize: 12,\n } satisfies CSSProperties,\n themeRow: {\n borderBottom: BORDER_FAINT,\n } satisfies CSSProperties,\n themeCell: {\n padding: '6px 8px',\n verticalAlign: 'middle',\n } satisfies CSSProperties,\n swatch: {\n display: 'inline-block',\n width: 14,\n height: 14,\n verticalAlign: 'middle',\n marginRight: 6,\n borderRadius: 3,\n border: '1px solid var(--sb-color-sys-border-default, rgba(0,0,0,0.1))',\n } satisfies CSSProperties,\n snippet: {\n display: 'block',\n padding: '8px 10px',\n borderRadius: 4,\n background: 'var(--sb-color-sys-surface-muted, rgba(128,128,128,0.1))',\n fontFamily: MONO_STACK,\n fontSize: 12,\n whiteSpace: 'pre',\n overflow: 'auto',\n } satisfies CSSProperties,\n missing: {\n padding: 12,\n opacity: 0.7,\n } satisfies CSSProperties,\n typographySample: {\n padding: '8px 0',\n } satisfies CSSProperties,\n shadowSample: {\n width: 140,\n height: 56,\n background: 'var(--sb-color-sys-surface-raised, #fff)',\n border: BORDER_FAINT,\n borderRadius: 6,\n } satisfies CSSProperties,\n borderSample: {\n width: 140,\n height: 56,\n background: 'var(--sb-color-sys-surface-raised, transparent)',\n borderRadius: 6,\n } satisfies CSSProperties,\n gradientSample: {\n width: 220,\n height: 56,\n borderRadius: 6,\n border: BORDER_FAINT,\n } satisfies CSSProperties,\n strokeStyleLine: {\n height: 0,\n borderTopWidth: 4,\n borderTopColor: 'var(--sb-color-sys-text-default, CanvasText)',\n width: 220,\n } satisfies CSSProperties,\n strokeStyleSvg: {\n width: 220,\n height: 24,\n color: 'var(--sb-color-sys-text-default, CanvasText)',\n } satisfies CSSProperties,\n strokeStyleFallback: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n colorSwatchRow: {\n display: 'flex',\n gap: 1,\n borderRadius: 6,\n overflow: 'hidden',\n border: BORDER_DEFAULT,\n width: 220,\n height: 56,\n } satisfies CSSProperties,\n colorSwatchLight: {\n flex: 1,\n boxShadow: 'inset 0 0 0 8px rgba(255, 255, 255, 0.9)',\n } satisfies CSSProperties,\n colorSwatchDark: {\n flex: 1,\n boxShadow: 'inset 0 0 0 8px rgba(17, 17, 17, 0.9)',\n } satisfies CSSProperties,\n breakdownSection: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n display: 'grid',\n gridTemplateColumns: 'auto 1fr',\n columnGap: 12,\n rowGap: 3,\n marginTop: 6,\n } satisfies CSSProperties,\n breakdownKey: {\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n breakdownLayerHeader: {\n gridColumn: '1 / -1',\n fontSize: 10,\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n marginTop: 4,\n } satisfies CSSProperties,\n fontFamilySample: {\n padding: '4px 0',\n fontSize: 22,\n lineHeight: 1.2,\n } satisfies CSSProperties,\n fontWeightSample: {\n padding: '4px 0',\n fontSize: 32,\n lineHeight: 1,\n } satisfies CSSProperties,\n dimensionTrack: {\n display: 'flex',\n alignItems: 'center',\n height: 32,\n maxWidth: '100%',\n overflow: 'hidden',\n } satisfies CSSProperties,\n dimensionBar: {\n height: 16,\n background: 'var(--sb-color-sys-accent-bg, #3b82f6)',\n borderRadius: 3,\n maxWidth: '100%',\n } satisfies CSSProperties,\n motionTrack: {\n position: 'relative',\n height: 32,\n width: '100%',\n maxWidth: 320,\n background: 'var(--sb-color-sys-surface-muted, rgba(128,128,128,0.08))',\n borderRadius: 16,\n overflow: 'hidden',\n } satisfies CSSProperties,\n motionBall: {\n position: 'absolute',\n top: '50%',\n width: 24,\n height: 24,\n marginTop: -12,\n borderRadius: '50%',\n background: 'var(--sb-color-sys-accent-bg, #3b82f6)',\n } satisfies CSSProperties,\n aliasedByList: {\n listStyle: 'none',\n margin: 0,\n padding: 0,\n fontFamily: MONO_STACK,\n fontSize: 12,\n } satisfies CSSProperties,\n aliasedByRow: {\n padding: '2px 0',\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n } satisfies CSSProperties,\n aliasedByTruncated: {\n fontSize: 11,\n opacity: 0.6,\n fontStyle: 'italic',\n marginTop: 4,\n } satisfies CSSProperties,\n reducedMotion: {\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n fontStyle: 'italic',\n } satisfies CSSProperties,\n tupleIndicator: {\n fontSize: 11,\n opacity: 0.7,\n margin: '0 0 6px',\n fontFamily: MONO_STACK,\n } satisfies CSSProperties,\n consumerRow: {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '6px 10px',\n marginBottom: 4,\n borderRadius: 4,\n background: 'var(--sb-color-sys-surface-muted, rgba(128,128,128,0.1))',\n } satisfies CSSProperties,\n consumerRowLabel: {\n fontFamily: MONO_STACK,\n fontSize: 10,\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n opacity: 0.6,\n minWidth: 32,\n flexShrink: 0,\n } satisfies CSSProperties,\n consumerRowValue: {\n flex: 1,\n fontFamily: MONO_STACK,\n fontSize: 12,\n whiteSpace: 'nowrap',\n overflow: 'auto',\n } satisfies CSSProperties,\n consumerRowCopy: {\n padding: '3px 8px',\n fontSize: 11,\n fontFamily: MONO_STACK,\n background: 'var(--sb-color-sys-surface-raised, Canvas)',\n color: 'var(--sb-color-sys-text-default, CanvasText)',\n border: '1px solid var(--sb-color-sys-border-default, rgba(128,128,128,0.3))',\n borderRadius: 4,\n cursor: 'pointer',\n flexShrink: 0,\n } satisfies CSSProperties,\n};\n","import { makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport interface DetailToken {\n $type?: string;\n $value?: unknown;\n $description?: string;\n aliasOf?: string;\n aliasChain?: readonly string[];\n aliasedBy?: readonly string[];\n}\n\nexport interface VirtualAxisLike {\n readonly name: string;\n readonly contexts: readonly string[];\n readonly default: string;\n readonly source: 'resolver' | 'layered' | 'synthetic';\n}\n\nexport interface VirtualThemeLike {\n readonly name: string;\n readonly input: Record<string, string>;\n}\n\nexport interface TokenDetailData {\n token: DetailToken | undefined;\n cssVar: string;\n activeTheme: string;\n activeAxes: Record<string, string>;\n axes: readonly VirtualAxisLike[];\n themes: readonly VirtualThemeLike[];\n themesResolved: Record<string, Record<string, DetailToken>>;\n resolved: Record<string, DetailToken>;\n cssVarPrefix: string;\n}\n\nexport function useTokenDetailData(path: string): TokenDetailData {\n const { activeTheme, activeAxes, axes, themes, themesResolved, resolved, cssVarPrefix } =\n useProject();\n const typedResolved = resolved as Record<string, DetailToken>;\n return {\n token: typedResolved[path],\n cssVar: makeCssVar(path, cssVarPrefix),\n activeTheme,\n activeAxes,\n axes,\n themes,\n themesResolved: themesResolved as Record<string, Record<string, DetailToken>>,\n resolved: typedResolved,\n cssVarPrefix,\n };\n}\n","import type { ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport { styles } from '#/token-detail/styles.ts';\nimport { useTokenDetailData } from '#/token-detail/internal.ts';\n\nexport interface AliasChainProps {\n /** Full dot-path of the token. */\n path: string;\n}\n\nexport function AliasChain({ path }: AliasChainProps): ReactElement | null {\n const { token } = useTokenDetailData(path);\n\n const chain = useMemo<string[]>(() => {\n if (!token) return [];\n if (Array.isArray(token.aliasChain) && token.aliasChain.length > 0) {\n return [path, ...token.aliasChain];\n }\n if (typeof token.aliasOf === 'string') return [path, token.aliasOf];\n return [path];\n }, [token, path]);\n\n if (chain.length <= 1) return null;\n\n return (\n <>\n <div style={styles.sectionHeader}>Alias chain</div>\n <div style={styles.chain}>\n {chain.map((step, i) => (\n <span key={step} style={styles.chain}>\n <span style={styles.chainNode}>{step}</span>\n {i < chain.length - 1 && <span style={styles.arrow}>→</span>}\n </span>\n ))}\n </div>\n </>\n );\n}\n","import type { ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport { styles } from '#/token-detail/styles.ts';\nimport { type DetailToken, useTokenDetailData } from '#/token-detail/internal.ts';\n\nexport interface AliasedByProps {\n /** Full dot-path of the token. */\n path: string;\n}\n\nconst ALIASED_BY_DEPTH_CAP = 6;\n\ninterface AliasedByNode {\n path: string;\n children: AliasedByNode[];\n truncated?: boolean;\n}\n\nconst GROUP_RANK: Record<string, number> = { ref: 0, sys: 1 };\n\nexport function AliasedBy({ path }: AliasedByProps): ReactElement | null {\n const { resolved } = useTokenDetailData(path);\n const tree = useMemo<AliasedByNode[]>(() => buildAliasedByTree(path, resolved), [path, resolved]);\n const truncated = useMemo(() => treeHasTruncation(tree), [tree]);\n\n if (tree.length === 0) return null;\n\n return (\n <>\n <div style={styles.sectionHeader}>Aliased by</div>\n <ul style={styles.aliasedByList}>\n {tree.map((node) => (\n <AliasedByRow key={node.path} node={node} depth={0} />\n ))}\n </ul>\n {truncated && (\n <div style={styles.aliasedByTruncated}>\n Further descendants truncated at depth {ALIASED_BY_DEPTH_CAP}.\n </div>\n )}\n </>\n );\n}\n\nfunction AliasedByRow({ node, depth }: { node: AliasedByNode; depth: number }): ReactElement {\n return (\n <li>\n <div style={{ ...styles.aliasedByRow, paddingLeft: depth * 16 }}>\n <span style={styles.chainNode}>{node.path}</span>\n </div>\n {node.children.length > 0 && (\n <ul style={styles.aliasedByList}>\n {node.children.map((child) => (\n <AliasedByRow key={child.path} node={child} depth={depth + 1} />\n ))}\n </ul>\n )}\n </li>\n );\n}\n\nfunction buildAliasedByTree(\n rootPath: string,\n resolved: Record<string, DetailToken>,\n): AliasedByNode[] {\n const root = resolved[rootPath];\n const direct = root?.aliasedBy;\n if (!direct || direct.length === 0) return [];\n const visited = new Set<string>([rootPath]);\n return sortPaths(direct).map((p) => walk(p, resolved, visited, 1));\n}\n\nfunction walk(\n path: string,\n resolved: Record<string, DetailToken>,\n visited: Set<string>,\n depth: number,\n): AliasedByNode {\n if (visited.has(path)) return { path, children: [] };\n visited.add(path);\n const token = resolved[path];\n const parents = token?.aliasedBy;\n if (!parents || parents.length === 0) return { path, children: [] };\n if (depth >= ALIASED_BY_DEPTH_CAP) {\n return { path, children: [], truncated: true };\n }\n const children = sortPaths(parents).map((p) => walk(p, resolved, visited, depth + 1));\n return { path, children };\n}\n\nfunction sortPaths(paths: readonly string[]): string[] {\n return paths.toSorted((a, b) => {\n const ra = GROUP_RANK[a.split('.')[0] ?? ''] ?? 2;\n const rb = GROUP_RANK[b.split('.')[0] ?? ''] ?? 2;\n return ra !== rb ? ra - rb : a.localeCompare(b, undefined, { numeric: true });\n });\n}\n\nfunction treeHasTruncation(nodes: AliasedByNode[]): boolean {\n for (const n of nodes) {\n if (n.truncated) return true;\n if (treeHasTruncation(n.children)) return true;\n }\n return false;\n}\n","import type { ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport { useColorFormat } from '#/contexts.ts';\nimport { type ColorFormat, formatColor } from '#/format-color.ts';\nimport { dataAttr } from '#/internal/data-attr.ts';\nimport { formatValue } from '#/internal/use-project.ts';\nimport { styles } from '#/token-detail/styles.ts';\nimport {\n type DetailToken,\n type VirtualAxisLike,\n type VirtualThemeLike,\n useTokenDetailData,\n} from '#/token-detail/internal.ts';\n\nexport interface AxisVarianceProps {\n /** Full dot-path of the token. */\n path: string;\n}\n\ninterface Variance {\n kind: 'constant' | 'one-axis' | 'multi-axis';\n varyingAxes: readonly string[];\n}\n\nexport function AxisVariance({ path }: AxisVarianceProps): ReactElement {\n const { token, cssVar, axes, themes, themesResolved, activeAxes, cssVarPrefix } =\n useTokenDetailData(path);\n const colorFormat = useColorFormat();\n const isColor = token?.$type === 'color';\n const formatFn = (t: DetailToken | undefined): string => valueFor(t, isColor, colorFormat);\n\n const variance = useMemo(\n () => analyzeVariance(path, axes, themes, themesResolved),\n [path, axes, themes, themesResolved],\n );\n\n if (themes.length === 0) {\n return <></>;\n }\n\n if (variance.kind === 'constant') {\n const anyTheme = themes[0];\n const value = anyTheme ? formatFn(themesResolved[anyTheme.name]?.[path]) : '—';\n return (\n <>\n <div style={styles.sectionHeader}>Values across axes</div>\n <table style={styles.themeTable} data-testid='token-detail-values'>\n <tbody>\n <tr style={styles.themeRow}>\n <td style={styles.themeCell} data-testid='token-detail-constant'>\n {isColor && <span style={{ ...styles.swatch, background: cssVar }} aria-hidden />}\n {value}\n <span style={{ opacity: 0.6, marginLeft: 8 }}>\n same across all {themes.length} tuples\n </span>\n </td>\n </tr>\n </tbody>\n </table>\n </>\n );\n }\n\n if (variance.kind === 'one-axis') {\n const axisName = variance.varyingAxes[0];\n if (!axisName) return <></>;\n const axis = axes.find((a) => a.name === axisName);\n if (!axis) return <></>;\n const contextValues = axis.contexts.map((ctx) => {\n const target = { ...activeAxes, [axisName]: ctx };\n const match = themes.find((t) => {\n const input = t.input;\n return Object.keys(input).every((k) => input[k] === target[k]);\n });\n const name = match?.name ?? '';\n return {\n ctx,\n themeName: name,\n value: name ? formatFn(themesResolved[name]?.[path]) : '—',\n };\n });\n return (\n <>\n <div style={styles.sectionHeader}>Varies with {axisName}</div>\n <table style={styles.themeTable} data-testid='token-detail-values'>\n <tbody>\n {contextValues.map((row) => (\n <tr key={row.ctx} style={styles.themeRow} data-axis={axisName} data-context={row.ctx}>\n <td style={{ ...styles.themeCell, width: '30%' }}>{row.ctx}</td>\n <td style={styles.themeCell}>\n {isColor && row.themeName && (\n <span\n style={{ ...styles.swatch, background: cssVar }}\n {...{ [dataAttr(cssVarPrefix, 'theme')]: row.themeName }}\n aria-hidden\n />\n )}\n {row.value}\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </>\n );\n }\n\n const varying = variance.varyingAxes\n .map((name) => axes.find((a) => a.name === name))\n .filter((a): a is VirtualAxisLike => Boolean(a))\n .toSorted((a, b) => b.contexts.length - a.contexts.length);\n const [rowAxis, colAxis, ...extra] = varying;\n if (!rowAxis || !colAxis) return <></>;\n\n return (\n <>\n <div style={styles.sectionHeader}>Varies with {variance.varyingAxes.join(' × ')}</div>\n <table style={styles.themeTable} data-testid='token-detail-values'>\n <thead>\n <tr style={styles.themeRow}>\n <th style={{ ...styles.themeCell, textAlign: 'left', opacity: 0.7 }}>\n {rowAxis.name} \\ {colAxis.name}\n </th>\n {colAxis.contexts.map((col) => (\n <th key={col} style={{ ...styles.themeCell, textAlign: 'left', opacity: 0.7 }}>\n {col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rowAxis.contexts.map((row) => (\n <tr key={row} style={styles.themeRow}>\n <td style={styles.themeCell}>{row}</td>\n {colAxis.contexts.map((col) => {\n const target: Record<string, string> = {\n ...activeAxes,\n [rowAxis.name]: row,\n [colAxis.name]: col,\n };\n const name = tupleName(themes, target);\n const value = name ? formatFn(themesResolved[name]?.[path]) : '—';\n return (\n <td key={col} style={styles.themeCell} data-row={row} data-col={col}>\n {isColor && name && (\n <span\n style={{ ...styles.swatch, background: cssVar }}\n {...{ [dataAttr(cssVarPrefix, 'theme')]: name }}\n aria-hidden\n />\n )}\n {value}\n </td>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n {extra.length > 0 && (\n <div style={{ ...styles.aliasedByTruncated, marginTop: 6 }}>\n Values also vary with {extra.map((a) => a.name).join(', ')}; matrix shows the slice for\n the active selection.\n </div>\n )}\n </>\n );\n}\n\nfunction valueFor(token: DetailToken | undefined, isColor: boolean, format: ColorFormat): string {\n if (!token) return '—';\n if (isColor) return formatColor(token.$value, format).value;\n return formatValue(token.$value);\n}\n\nfunction themeValue(\n themesResolved: Record<string, Record<string, DetailToken>>,\n themeName: string,\n path: string,\n): string {\n const t = themesResolved[themeName]?.[path];\n return t ? formatValue(t.$value) : '—';\n}\n\nfunction tupleName(\n themes: readonly VirtualThemeLike[],\n tuple: Record<string, string>,\n): string | undefined {\n const match = themes.find((t) => {\n const input = t.input;\n const keys = Object.keys(input);\n return keys.every((k) => input[k] === tuple[k]);\n });\n return match?.name;\n}\n\nfunction analyzeVariance(\n path: string,\n axes: readonly VirtualAxisLike[],\n themes: readonly VirtualThemeLike[],\n themesResolved: Record<string, Record<string, DetailToken>>,\n): Variance {\n const varyingAxes: string[] = [];\n for (const axis of axes) {\n const byOthers = new Map<string, Map<string, string>>();\n for (const theme of themes) {\n const others = axes\n .filter((a) => a.name !== axis.name)\n .map((a) => `${a.name}=${theme.input[a.name] ?? ''}`)\n .join('|');\n const ctx = theme.input[axis.name] ?? '';\n const bucket = byOthers.get(others) ?? new Map<string, string>();\n bucket.set(ctx, themeValue(themesResolved, theme.name, path));\n byOthers.set(others, bucket);\n }\n let varies = false;\n for (const bucket of byOthers.values()) {\n const values = new Set(bucket.values());\n if (values.size > 1) {\n varies = true;\n break;\n }\n }\n if (varies) varyingAxes.push(axis.name);\n }\n if (varyingAxes.length === 0) return { kind: 'constant', varyingAxes };\n if (varyingAxes.length === 1) return { kind: 'one-axis', varyingAxes };\n return { kind: 'multi-axis', varyingAxes };\n}\n","import type { ReactElement } from 'react';\nimport { styles } from '#/token-detail/styles.ts';\nimport { useTokenDetailData } from '#/token-detail/internal.ts';\n\nexport interface CompositeBreakdownProps {\n /** Full dot-path of the token. */\n path: string;\n}\n\nexport function CompositeBreakdown({ path }: CompositeBreakdownProps): ReactElement | null {\n const { token } = useTokenDetailData(path);\n if (!token) return null;\n return <CompositeBreakdownContent type={token.$type} rawValue={token.$value} />;\n}\n\nexport function CompositeBreakdownContent({\n type,\n rawValue,\n}: {\n type: string | undefined;\n rawValue: unknown;\n}): ReactElement | null {\n if (!rawValue || typeof rawValue !== 'object') return null;\n\n if (type === 'typography') {\n const v = rawValue as Record<string, unknown>;\n return renderKeyValueList([\n ['fontFamily', formatFontFamily(v['fontFamily'])],\n ['fontSize', formatDimensionValue(v['fontSize'])],\n ['fontWeight', formatPrimitive(v['fontWeight'])],\n ['lineHeight', formatPrimitive(v['lineHeight'])],\n ['letterSpacing', formatDimensionValue(v['letterSpacing'])],\n ]);\n }\n\n if (type === 'border') {\n const v = rawValue as Record<string, unknown>;\n return renderKeyValueList([\n ['color', formatColorValue(v['color'])],\n ['width', formatDimensionValue(v['width'])],\n ['style', formatPrimitive(v['style'])],\n ]);\n }\n\n if (type === 'transition') {\n const v = rawValue as Record<string, unknown>;\n return renderKeyValueList([\n ['duration', formatDimensionValue(v['duration'])],\n ['timingFunction', formatPrimitive(v['timingFunction'])],\n ['delay', formatDimensionValue(v['delay'])],\n ]);\n }\n\n if (type === 'shadow') {\n const layers = Array.isArray(rawValue) ? rawValue : [rawValue];\n const multi = layers.length > 1;\n return (\n <div style={styles.breakdownSection}>\n {layers.map((layer, i) => {\n const v = layer as Record<string, unknown>;\n return (\n <div key={shadowLayerKey(v, i)} style={{ display: 'contents' }}>\n {multi && <div style={styles.breakdownLayerHeader}>Layer {i + 1}</div>}\n <KeyValueRow label='color' value={formatColorValue(v['color'])} />\n <KeyValueRow label='offsetX' value={formatDimensionValue(v['offsetX'])} />\n <KeyValueRow label='offsetY' value={formatDimensionValue(v['offsetY'])} />\n <KeyValueRow label='blur' value={formatDimensionValue(v['blur'])} />\n <KeyValueRow label='spread' value={formatDimensionValue(v['spread'])} />\n {'inset' in v && <KeyValueRow label='inset' value={formatPrimitive(v['inset'])} />}\n </div>\n );\n })}\n </div>\n );\n }\n\n if (type === 'gradient') {\n const stops = Array.isArray(rawValue) ? rawValue : [];\n if (stops.length === 0) return null;\n return (\n <div style={styles.breakdownSection}>\n {stops.map((stop, i) => {\n const v = stop as Record<string, unknown>;\n const position = typeof v['position'] === 'number' ? v['position'] : 0;\n return (\n <KeyValueRow\n key={gradientStopKey(v, i)}\n label={`${(position * 100).toFixed(0)}%`}\n value={formatColorValue(v['color'])}\n />\n );\n })}\n </div>\n );\n }\n\n return null;\n}\n\nfunction renderKeyValueList(rows: Array<[string, string | null]>): ReactElement {\n return (\n <div style={styles.breakdownSection}>\n {rows\n .filter(([, v]) => v !== null)\n .map(([k, v]) => (\n <KeyValueRow key={k} label={k} value={v ?? ''} />\n ))}\n </div>\n );\n}\n\nfunction KeyValueRow({ label, value }: { label: string; value: string | null }): ReactElement {\n return (\n <>\n <span style={styles.breakdownKey}>{label}</span>\n <span>{value ?? '—'}</span>\n </>\n );\n}\n\nfunction formatPrimitive(v: unknown): string | null {\n if (v == null) return null;\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') return String(v);\n return JSON.stringify(v);\n}\n\nfunction formatFontFamily(v: unknown): string | null {\n if (v == null) return null;\n if (typeof v === 'string') return v;\n if (Array.isArray(v)) return v.map(String).join(', ');\n return JSON.stringify(v);\n}\n\nfunction formatDimensionValue(v: unknown): string | null {\n if (v == null) return null;\n if (typeof v === 'string' || typeof v === 'number') return String(v);\n if (typeof v === 'object') {\n const d = v as { value?: unknown; unit?: unknown };\n if (typeof d.value === 'number' && typeof d.unit === 'string') return `${d.value}${d.unit}`;\n }\n return JSON.stringify(v);\n}\n\nfunction formatColorValue(v: unknown): string | null {\n if (v == null) return null;\n if (typeof v === 'string') return v;\n if (typeof v === 'object') {\n const c = v as { colorSpace?: unknown; components?: unknown; alpha?: unknown };\n if (Array.isArray(c.components) && typeof c.colorSpace === 'string') {\n const parts = c.components.map((n) => (typeof n === 'number' ? n.toFixed(3) : String(n)));\n const alpha = typeof c.alpha === 'number' && c.alpha !== 1 ? ` / ${c.alpha}` : '';\n return `${c.colorSpace}(${parts.join(' ')}${alpha})`;\n }\n }\n return JSON.stringify(v);\n}\n\nfunction shadowLayerKey(layer: Record<string, unknown>, fallback: number): string {\n const parts = [\n layer['color'],\n layer['offsetX'],\n layer['offsetY'],\n layer['blur'],\n layer['spread'],\n layer['inset'],\n ].map((p) => (p === undefined ? '' : JSON.stringify(p)));\n return `shadow|${parts.join('|')}|${fallback}`;\n}\n\nfunction gradientStopKey(stop: Record<string, unknown>, fallback: number): string {\n return `stop|${stop['position'] ?? fallback}|${JSON.stringify(stop['color'])}`;\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useEffect, useState } from 'react';\nimport { usePrefersReducedMotion } from '#/internal/prefers-reduced-motion.ts';\nimport { styles } from '#/token-detail/styles.ts';\nimport { useTokenDetailData } from '#/token-detail/internal.ts';\n\nexport interface CompositePreviewProps {\n /** Full dot-path of the token to preview. */\n path: string;\n}\n\nconst PANGRAM = 'Sphinx of black quartz, judge my vow.';\n\nconst STROKE_STYLE_STRINGS = new Set([\n 'solid',\n 'dashed',\n 'dotted',\n 'double',\n 'groove',\n 'ridge',\n 'outset',\n 'inset',\n]);\n\nexport function CompositePreview({ path }: CompositePreviewProps): ReactElement | null {\n const { token, cssVar } = useTokenDetailData(path);\n if (!token) return null;\n return <CompositePreviewContent type={token.$type} cssVar={cssVar} rawValue={token.$value} />;\n}\n\nexport function CompositePreviewContent({\n type,\n cssVar,\n rawValue,\n}: {\n type: string | undefined;\n cssVar: string;\n rawValue: unknown;\n}): ReactElement | null {\n if (type === 'typography') {\n const base = cssVar.replace(/^var\\(/, '').replace(/\\)$/, '');\n return (\n <div\n style={{\n ...styles.typographySample,\n fontFamily: `var(${base}-font-family)`,\n fontSize: `var(${base}-font-size)`,\n fontWeight: `var(${base}-font-weight)` as unknown as number,\n lineHeight: `var(${base}-line-height)` as unknown as number,\n letterSpacing: `var(${base}-letter-spacing)`,\n }}\n >\n {PANGRAM}\n </div>\n );\n }\n if (type === 'shadow') {\n return <div style={{ ...styles.shadowSample, boxShadow: cssVar }} aria-hidden />;\n }\n if (type === 'border') {\n return <div style={{ ...styles.borderSample, border: cssVar }} aria-hidden />;\n }\n if (type === 'transition') {\n return <TransitionSample transition={cssVar} />;\n }\n if (type === 'dimension') {\n return (\n <div style={styles.dimensionTrack}>\n <div style={{ ...styles.dimensionBar, width: cssVar }} aria-hidden />\n </div>\n );\n }\n if (type === 'duration') {\n return <TransitionSample transition={`left ${cssVar} ease`} />;\n }\n if (type === 'fontFamily') {\n return <div style={{ ...styles.fontFamilySample, fontFamily: cssVar }}>{PANGRAM}</div>;\n }\n if (type === 'fontWeight') {\n return (\n <div\n style={{\n ...styles.fontWeightSample,\n fontWeight: cssVar as unknown as number,\n }}\n >\n Aa\n </div>\n );\n }\n if (type === 'cubicBezier') {\n return <TransitionSample transition={`left 800ms ${cssVar}`} />;\n }\n if (type === 'gradient') {\n return (\n <div\n style={{ ...styles.gradientSample, background: `linear-gradient(to right, ${cssVar})` }}\n aria-hidden\n />\n );\n }\n if (type === 'strokeStyle') {\n return <StrokeStylePreview value={rawValue} />;\n }\n if (type === 'color') {\n return (\n <div style={styles.colorSwatchRow} aria-hidden>\n <div style={{ ...styles.colorSwatchLight, background: cssVar }} />\n <div style={{ ...styles.colorSwatchDark, background: cssVar }} />\n </div>\n );\n }\n return null;\n}\n\nfunction StrokeStylePreview({ value }: { value: unknown }): ReactElement {\n if (typeof value === 'string' && STROKE_STYLE_STRINGS.has(value)) {\n return (\n <div\n style={{\n ...styles.strokeStyleLine,\n borderTopStyle: value as CSSProperties['borderTopStyle'],\n }}\n aria-hidden\n />\n );\n }\n if (value && typeof value === 'object' && 'dashArray' in value) {\n const v = value as {\n dashArray?: unknown;\n lineCap?: unknown;\n };\n const lengths = asDashLengths(v.dashArray);\n if (lengths.length === 0) {\n return (\n <div style={styles.strokeStyleFallback}>\n Object-form strokeStyle with no resolvable dashArray.\n </div>\n );\n }\n const cap = typeof v.lineCap === 'string' ? v.lineCap : 'butt';\n return (\n <svg\n style={styles.strokeStyleSvg}\n viewBox='0 0 220 24'\n preserveAspectRatio='none'\n aria-hidden\n >\n <line\n x1='4'\n y1='12'\n x2='216'\n y2='12'\n stroke='currentColor'\n strokeWidth='4'\n strokeDasharray={lengths.join(' ')}\n strokeLinecap={cap as 'butt' | 'round' | 'square'}\n />\n </svg>\n );\n }\n return <div style={styles.strokeStyleFallback}>strokeStyle value could not be previewed.</div>;\n}\n\nfunction asDashLengths(raw: unknown): number[] {\n if (!Array.isArray(raw)) return [];\n const out: number[] = [];\n for (const entry of raw) {\n if (typeof entry === 'number') {\n out.push(entry);\n continue;\n }\n if (entry && typeof entry === 'object') {\n const e = entry as { value?: unknown };\n if (typeof e.value === 'number') out.push(e.value);\n }\n }\n return out;\n}\n\nfunction TransitionSample({ transition }: { transition: string }): ReactElement {\n const reduced = usePrefersReducedMotion();\n const [phase, setPhase] = useState<0 | 1>(0);\n\n useEffect(() => {\n if (reduced) return;\n const id = requestAnimationFrame(() => setPhase(1));\n const loop = window.setInterval(() => {\n setPhase((p) => (p === 0 ? 1 : 0));\n }, 1200);\n return () => {\n cancelAnimationFrame(id);\n window.clearInterval(loop);\n };\n }, [reduced]);\n\n if (reduced) {\n return (\n <div style={styles.reducedMotion}>\n Animation suppressed by `prefers-reduced-motion: reduce`.\n </div>\n );\n }\n\n return (\n <div style={styles.motionTrack}>\n <div\n style={{\n ...styles.motionBall,\n left: phase === 1 ? 'calc(100% - 28px)' : '4px',\n transition,\n }}\n aria-hidden\n />\n </div>\n );\n}\n","import type { ReactElement } from 'react';\nimport { useState } from 'react';\nimport { styles } from '#/token-detail/styles.ts';\nimport { useTokenDetailData } from '#/token-detail/internal.ts';\n\nexport interface ConsumerOutputProps {\n /** Full dot-path of the token. */\n path: string;\n}\n\nexport function ConsumerOutput({ path }: ConsumerOutputProps): ReactElement | null {\n const { token, cssVar, activeAxes } = useTokenDetailData(path);\n\n if (!token) return null;\n\n const tupleLabel = Object.entries(activeAxes)\n .map(([k, v]) => `${k}=${v}`)\n .join(', ');\n\n return (\n <>\n <div style={styles.sectionHeader}>Consumer output</div>\n {tupleLabel && (\n <div style={styles.tupleIndicator}>\n Active tuple: <strong>{tupleLabel}</strong>\n </div>\n )}\n <OutputRow label='Path' value={path} testId='consumer-output-path' />\n <OutputRow label='CSS' value={cssVar} testId='consumer-output-css' />\n </>\n );\n}\n\ninterface OutputRowProps {\n label: string;\n value: string;\n testId: string;\n}\n\nfunction OutputRow({ label, value, testId }: OutputRowProps): ReactElement {\n return (\n <div style={styles.consumerRow}>\n <span style={styles.consumerRowLabel}>{label}</span>\n <code style={styles.consumerRowValue} data-testid={testId}>\n {value}\n </code>\n <CopyButton text={value} testId={`${testId}-copy`} />\n </div>\n );\n}\n\nfunction CopyButton({ text, testId }: { text: string; testId: string }): ReactElement {\n const [copied, setCopied] = useState(false);\n return (\n <button\n type='button'\n style={styles.consumerRowCopy}\n data-testid={testId}\n onClick={() => {\n void copyToClipboard(text).then((ok) => {\n if (!ok) return;\n setCopied(true);\n window.setTimeout(() => setCopied(false), 1200);\n });\n }}\n >\n {copied ? 'Copied' : 'Copy'}\n </button>\n );\n}\n\nasync function copyToClipboard(text: string): Promise<boolean> {\n if (typeof navigator === 'undefined' || !navigator.clipboard) return false;\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n return false;\n }\n}\n","import type { ReactElement } from 'react';\nimport { styles } from '#/token-detail/styles.ts';\nimport { useTokenDetailData } from '#/token-detail/internal.ts';\n\nexport interface TokenHeaderProps {\n /** Full dot-path of the token. */\n path: string;\n /** Override the heading. Defaults to the path. */\n heading?: string;\n}\n\nexport function TokenHeader({ path, heading }: TokenHeaderProps): ReactElement {\n const { token, cssVar, activeTheme } = useTokenDetailData(path);\n\n if (!token) {\n return (\n <div style={styles.missing}>\n Token <code>{path}</code> not found in theme <strong>{activeTheme}</strong>.\n </div>\n );\n }\n\n return (\n <>\n <h3 style={styles.heading}>{heading ?? path}</h3>\n <div style={styles.subline}>\n {token.$type && <span style={styles.typePill}>{token.$type}</span>}\n <span>{cssVar}</span>\n </div>\n {token.$description && <p style={styles.description}>{token.$description}</p>}\n </>\n );\n}\n","import type { ReactElement } from 'react';\nimport { styles } from '#/token-detail/styles.ts';\nimport { useTokenDetailData } from '#/token-detail/internal.ts';\n\nexport interface TokenUsageSnippetProps {\n /** Full dot-path of the token. */\n path: string;\n}\n\nexport function TokenUsageSnippet({ path }: TokenUsageSnippetProps): ReactElement | null {\n const { token, cssVar } = useTokenDetailData(path);\n if (!token) return null;\n return (\n <>\n <div style={styles.sectionHeader}>Usage</div>\n <code style={styles.snippet}>{`color: ${cssVar};`}</code>\n </>\n );\n}\n","import type { ReactElement } from 'react';\nimport { useColorFormat } from '#/contexts.ts';\nimport { formatColor } from '#/format-color.ts';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { formatValue } from '#/internal/use-project.ts';\nimport { AliasChain } from '#/token-detail/AliasChain.tsx';\nimport { AliasedBy } from '#/token-detail/AliasedBy.tsx';\nimport { AxisVariance } from '#/token-detail/AxisVariance.tsx';\nimport { CompositeBreakdown } from '#/token-detail/CompositeBreakdown.tsx';\nimport { CompositePreview } from '#/token-detail/CompositePreview.tsx';\nimport { ConsumerOutput } from '#/token-detail/ConsumerOutput.tsx';\nimport { styles } from '#/token-detail/styles.ts';\nimport { TokenHeader } from '#/token-detail/TokenHeader.tsx';\nimport { TokenUsageSnippet } from '#/token-detail/TokenUsageSnippet.tsx';\nimport { useTokenDetailData } from '#/token-detail/internal.ts';\n\nexport interface TokenDetailProps {\n /** Full dot-path of the token to inspect. */\n path: string;\n /** Override the heading. Defaults to the path. */\n heading?: string;\n}\n\nexport function TokenDetail({ path, heading }: TokenDetailProps): ReactElement {\n const { token, cssVar, activeTheme, cssVarPrefix } = useTokenDetailData(path);\n const colorFormat = useColorFormat();\n\n if (!token) {\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <div style={styles.missing}>\n Token <code>{path}</code> not found in theme <strong>{activeTheme}</strong>.\n </div>\n </div>\n );\n }\n\n const isColor = token.$type === 'color';\n const formatted = isColor ? formatColor(token.$value, colorFormat) : null;\n const value = formatted ? formatted.value : formatValue(token.$value);\n const outOfGamut = formatted?.outOfGamut ?? false;\n\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <TokenHeader path={path} {...(heading !== undefined && { heading })} />\n\n <div style={styles.sectionHeader}>Resolved value · {activeTheme}</div>\n <CompositePreview path={path} />\n <CompositeBreakdown path={path} />\n <div style={styles.chain}>\n {isColor && <span style={{ ...styles.swatch, background: cssVar }} aria-hidden />}\n <span>{value}</span>\n {outOfGamut && (\n <span\n title='Out of sRGB gamut for this format'\n aria-label='out of gamut'\n style={{ marginLeft: 6 }}\n >\n ⚠\n </span>\n )}\n </div>\n\n <AliasChain path={path} />\n <AliasedBy path={path} />\n <TokenUsageSnippet path={path} />\n <ConsumerOutput path={path} />\n <AxisVariance path={path} />\n </div>\n );\n}\n","import type { CSSProperties, KeyboardEvent, ReactElement } from 'react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport { BorderSample } from '#/border-preview/BorderSample.tsx';\nimport { useColorFormat } from '#/contexts.ts';\nimport { DimensionBar } from '#/dimension-scale/DimensionBar.tsx';\nimport { formatColor } from '#/format-color.ts';\nimport { BORDER_DEFAULT, MONO_STACK, surfaceStyle } from '#/internal/styles.ts';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { formatValue, makeCssVar, useProject } from '#/internal/use-project.ts';\nimport { MotionSample } from '#/motion-preview/MotionSample.tsx';\nimport { ShadowSample } from '#/shadow-preview/ShadowSample.tsx';\nimport { TokenDetail } from '#/TokenDetail.tsx';\nimport type { VirtualToken } from '#/types.ts';\n\nexport interface TokenNavigatorProps {\n /** If provided, mount at this dot-path subtree and hide everything outside it. */\n root?: string;\n /**\n * Depth (from the mounted root) that is expanded on first render.\n * `0` = everything collapsed, `1` = top-level groups open (default),\n * `2` = one level deeper, etc.\n */\n initiallyExpanded?: number;\n /**\n * Called with a leaf's full dot-path when it is clicked. When set, the\n * inline `<TokenDetail>` slide-over is suppressed — the consumer owns\n * the follow-up UI.\n */\n onSelect?(path: string): void;\n}\n\ninterface LeafNode {\n kind: 'leaf';\n segment: string;\n path: string;\n token: VirtualToken;\n}\n\ninterface GroupNode {\n kind: 'group';\n segment: string;\n path: string;\n children: TreeNode[];\n}\n\ntype TreeNode = LeafNode | GroupNode;\n\nconst styles = {\n wrapper: surfaceStyle,\n caption: {\n padding: '4px 0 12px',\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n fontSize: 12,\n } satisfies CSSProperties,\n tree: {\n listStyle: 'none',\n margin: 0,\n padding: 0,\n } satisfies CSSProperties,\n nested: {\n listStyle: 'none',\n margin: 0,\n paddingLeft: 18,\n borderLeft: BORDER_DEFAULT,\n } satisfies CSSProperties,\n groupRow: {\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '4px 6px',\n borderRadius: 4,\n cursor: 'pointer',\n userSelect: 'none',\n fontFamily: MONO_STACK,\n fontSize: 12,\n } satisfies CSSProperties,\n leafRow: {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '4px 6px',\n borderRadius: 4,\n cursor: 'pointer',\n fontFamily: MONO_STACK,\n fontSize: 12,\n } satisfies CSSProperties,\n caret: {\n display: 'inline-block',\n width: 12,\n textAlign: 'center',\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n tail: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n } satisfies CSSProperties,\n typePill: {\n display: 'inline-block',\n padding: '1px 6px',\n borderRadius: 4,\n fontSize: 10,\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n background: 'var(--sb-color-sys-surface-muted, rgba(128,128,128,0.15))',\n } satisfies CSSProperties,\n value: {\n fontSize: 11,\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n marginLeft: 'auto',\n wordBreak: 'break-all',\n maxWidth: '40%',\n textAlign: 'right',\n } satisfies CSSProperties,\n count: {\n marginLeft: 'auto',\n fontSize: 11,\n color: 'var(--sb-color-sys-text-default, CanvasText)',\n } satisfies CSSProperties,\n colorSwatch: {\n display: 'inline-block',\n width: 14,\n height: 14,\n borderRadius: 3,\n border: '1px solid var(--sb-color-sys-border-default, rgba(0,0,0,0.1))',\n } satisfies CSSProperties,\n previewBox: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n marginLeft: 'auto',\n } satisfies CSSProperties,\n empty: {\n padding: '24px 12px',\n textAlign: 'center',\n color: 'var(--sb-color-sys-text-muted, CanvasText)',\n } satisfies CSSProperties,\n backdrop: {\n position: 'fixed',\n inset: 0,\n background: 'rgba(0,0,0,0.4)',\n zIndex: 10000,\n display: 'flex',\n alignItems: 'stretch',\n justifyContent: 'flex-end',\n } satisfies CSSProperties,\n panel: {\n width: 'min(560px, 100%)',\n height: '100%',\n overflowY: 'auto',\n background: 'var(--sb-color-sys-surface-default, Canvas)',\n color: 'var(--sb-color-sys-text-default, CanvasText)',\n boxShadow: '-8px 0 24px rgba(0,0,0,0.2)',\n padding: 16,\n position: 'relative',\n } satisfies CSSProperties,\n closeButton: {\n position: 'absolute',\n top: 8,\n right: 8,\n width: 32,\n height: 32,\n borderRadius: 4,\n border: '1px solid var(--sb-color-sys-border-default, rgba(128,128,128,0.3))',\n background: 'transparent',\n color: 'inherit',\n cursor: 'pointer',\n fontSize: 16,\n lineHeight: 1,\n } satisfies CSSProperties,\n};\n\nfunction buildTree(resolved: Record<string, VirtualToken>, root: string | undefined): TreeNode[] {\n const rootPrefix = root && root.length > 0 ? `${root}.` : '';\n const rootSegments = root ? root.split('.') : [];\n\n const entries = Object.entries(resolved).filter(([path]) => {\n if (!root) return true;\n return path === root || path.startsWith(rootPrefix);\n });\n\n const rootNode: GroupNode = { kind: 'group', segment: '', path: '', children: [] };\n\n for (const [path, token] of entries) {\n const remainder = root ? (path === root ? '' : path.slice(rootPrefix.length)) : path;\n const segments = remainder.length > 0 ? remainder.split('.') : [];\n\n let node: GroupNode = rootNode;\n for (let i = 0; i < segments.length - 1; i += 1) {\n const seg = segments[i] as string;\n const prefix = [...rootSegments, ...segments.slice(0, i + 1)].join('.');\n let child = node.children.find(\n (c): c is GroupNode => c.kind === 'group' && c.segment === seg,\n );\n if (!child) {\n child = { kind: 'group', segment: seg, path: prefix, children: [] };\n node.children.push(child);\n }\n node = child;\n }\n\n const leafSegment = segments[segments.length - 1];\n if (leafSegment === undefined) {\n node.children.push({\n kind: 'leaf',\n segment: root ? (rootSegments[rootSegments.length - 1] ?? path) : path,\n path,\n token,\n });\n } else {\n node.children.push({ kind: 'leaf', segment: leafSegment, path, token });\n }\n }\n\n sortTree(rootNode);\n\n return rootNode.children;\n}\n\nfunction sortTree(node: GroupNode): void {\n node.children.sort((a, b) => {\n if (a.kind !== b.kind) return a.kind === 'group' ? -1 : 1;\n return a.segment.localeCompare(b.segment, undefined, { numeric: true });\n });\n for (const c of node.children) {\n if (c.kind === 'group') sortTree(c);\n }\n}\n\nfunction collectInitialExpanded(nodes: TreeNode[], remainingDepth: number, out: Set<string>): void {\n if (remainingDepth <= 0) return;\n for (const node of nodes) {\n if (node.kind !== 'group') continue;\n out.add(node.path);\n collectInitialExpanded(node.children, remainingDepth - 1, out);\n }\n}\n\nfunction countLeaves(node: TreeNode): number {\n if (node.kind === 'leaf') return 1;\n let n = 0;\n for (const c of node.children) n += countLeaves(c);\n return n;\n}\n\nexport function TokenNavigator({\n root,\n initiallyExpanded = 1,\n onSelect,\n}: TokenNavigatorProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const tree = useMemo(() => buildTree(resolved, root), [resolved, root]);\n\n const initialExpanded = useMemo(() => {\n const out = new Set<string>();\n collectInitialExpanded(tree, initiallyExpanded, out);\n return out;\n }, [tree, initiallyExpanded]);\n\n const [expanded, setExpanded] = useState<Set<string>>(initialExpanded);\n useEffect(() => {\n setExpanded(initialExpanded);\n }, [initialExpanded]);\n\n const [selectedPath, setSelectedPath] = useState<string | null>(null);\n\n const toggle = useCallback((path: string): void => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(path)) next.delete(path);\n else next.add(path);\n return next;\n });\n }, []);\n\n const handleLeafClick = useCallback(\n (path: string) => {\n if (onSelect) onSelect(path);\n else setSelectedPath(path);\n },\n [onSelect],\n );\n\n if (tree.length === 0) {\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <div style={styles.empty}>\n {root ? `No tokens under \"${root}\".` : 'No tokens in the active theme.'}\n </div>\n </div>\n );\n }\n\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <div style={styles.caption}>\n {root ? `Tokens under ${root}` : 'Token graph'} · {activeTheme}\n </div>\n <ul style={styles.tree} role='tree'>\n {tree.map((node) => (\n <TreeNodeRow\n key={node.path || node.segment}\n node={node}\n expanded={expanded}\n onToggle={toggle}\n onLeafClick={handleLeafClick}\n />\n ))}\n </ul>\n\n {selectedPath !== null && (\n <DetailOverlay path={selectedPath} onClose={() => setSelectedPath(null)} />\n )}\n </div>\n );\n}\n\ninterface TreeNodeRowProps {\n node: TreeNode;\n expanded: Set<string>;\n onToggle(path: string): void;\n onLeafClick(path: string): void;\n}\n\nfunction TreeNodeRow({ node, expanded, onToggle, onLeafClick }: TreeNodeRowProps): ReactElement {\n if (node.kind === 'leaf') {\n return <LeafRow node={node} onLeafClick={onLeafClick} />;\n }\n const isOpen = expanded.has(node.path);\n const onKey = (e: KeyboardEvent<HTMLDivElement>): void => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onToggle(node.path);\n }\n };\n return (\n <li role='treeitem' aria-expanded={isOpen}>\n <div\n role='button'\n tabIndex={0}\n style={styles.groupRow}\n onClick={() => onToggle(node.path)}\n onKeyDown={onKey}\n data-path={node.path}\n data-testid='token-navigator-group'\n >\n <span style={styles.caret} aria-hidden>\n {isOpen ? '▾' : '▸'}\n </span>\n <span>{node.segment}</span>\n <span style={styles.count}>{countLeaves(node)}</span>\n </div>\n {isOpen && (\n <ul style={styles.nested} role='group'>\n {node.children.map((c) => (\n <TreeNodeRow\n key={c.path || c.segment}\n node={c}\n expanded={expanded}\n onToggle={onToggle}\n onLeafClick={onLeafClick}\n />\n ))}\n </ul>\n )}\n </li>\n );\n}\n\ninterface LeafRowProps {\n node: LeafNode;\n onLeafClick(path: string): void;\n}\n\nfunction LeafRow({ node, onLeafClick }: LeafRowProps): ReactElement {\n const onKey = (e: KeyboardEvent<HTMLDivElement>): void => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onLeafClick(node.path);\n }\n };\n const type = node.token.$type ?? '';\n return (\n <li role='treeitem'>\n <div\n role='button'\n tabIndex={0}\n style={styles.leafRow}\n onClick={() => onLeafClick(node.path)}\n onKeyDown={onKey}\n data-path={node.path}\n data-testid='token-navigator-leaf'\n >\n <span style={styles.caret} aria-hidden>\n •\n </span>\n <span style={styles.tail}>{node.segment}</span>\n {type && <span style={styles.typePill}>{type}</span>}\n <LeafPreview path={node.path} token={node.token} />\n </div>\n </li>\n );\n}\n\ninterface LeafPreviewProps {\n path: string;\n token: VirtualToken;\n}\n\nfunction LeafPreview({ path, token }: LeafPreviewProps): ReactElement {\n const { cssVarPrefix } = useProject();\n const colorFormat = useColorFormat();\n const type = token.$type;\n\n if (type === 'color') {\n const cssVar = makeCssVar(path, cssVarPrefix);\n const formatted = formatColor(token.$value, colorFormat);\n return (\n <span style={styles.previewBox}>\n <span style={styles.value}>{formatted?.value ?? formatValue(token.$value)}</span>\n <span style={{ ...styles.colorSwatch, background: cssVar, marginLeft: 8 }} aria-hidden />\n </span>\n );\n }\n if (type === 'dimension') {\n return (\n <span style={styles.previewBox}>\n <span style={styles.value}>{formatValue(token.$value)}</span>\n <span style={{ marginLeft: 8, display: 'inline-block', minWidth: 40, maxWidth: 120 }}>\n <DimensionBar path={path} kind='length' />\n </span>\n </span>\n );\n }\n if (type === 'shadow') {\n return (\n <span style={styles.previewBox}>\n <span\n style={{\n marginLeft: 8,\n display: 'inline-block',\n transform: 'scale(0.5)',\n transformOrigin: 'right center',\n }}\n >\n <ShadowSample path={path} />\n </span>\n </span>\n );\n }\n if (type === 'border') {\n return (\n <span style={styles.previewBox}>\n <span\n style={{\n marginLeft: 8,\n display: 'inline-block',\n transform: 'scale(0.5)',\n transformOrigin: 'right center',\n }}\n >\n <BorderSample path={path} />\n </span>\n </span>\n );\n }\n if (type === 'transition' || type === 'duration' || type === 'cubicBezier') {\n return (\n <span style={styles.previewBox}>\n <span style={{ marginLeft: 8, display: 'inline-block', width: 80 }}>\n <MotionSample path={path} />\n </span>\n </span>\n );\n }\n\n return (\n <span style={styles.previewBox}>\n <span style={styles.value}>{formatValue(token.$value)}</span>\n </span>\n );\n}\n\ninterface DetailOverlayProps {\n path: string;\n onClose(): void;\n}\n\nfunction DetailOverlay({ path, onClose }: DetailOverlayProps): ReactElement {\n useEffect(() => {\n const onKey = (e: globalThis.KeyboardEvent): void => {\n if (e.key === 'Escape') onClose();\n };\n window.addEventListener('keydown', onKey);\n return () => window.removeEventListener('keydown', onKey);\n }, [onClose]);\n\n return (\n <div\n style={styles.backdrop}\n onClick={onClose}\n role='presentation'\n data-testid='token-navigator-overlay'\n >\n <div\n style={styles.panel}\n onClick={(e) => e.stopPropagation()}\n role='dialog'\n aria-modal='true'\n aria-label={`Token detail for ${path}`}\n >\n <button\n type='button'\n style={styles.closeButton}\n onClick={onClose}\n aria-label='Close'\n data-testid='token-navigator-close'\n >\n ×\n </button>\n <TokenDetail path={path} />\n </div>\n </div>\n );\n}\n","import type { ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport { useColorFormat } from '#/contexts.ts';\nimport { formatColor } from '#/format-color.ts';\nimport { BORDER_FAINT, emptyStyle, MONO_STACK, surfaceStyle } from '#/internal/styles.ts';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { formatValue, globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport interface TokenTableProps {\n /**\n * Token-path filter. `\"color.sys.*\"` matches every `color.sys.…` token;\n * omit to include everything. Combines with `type` (both must match).\n */\n filter?: string;\n /** Restrict to one DTCG `$type`. */\n type?: string;\n /** Show the CSS variable reference column. Defaults to `true`. */\n showVar?: boolean;\n /** Override the table caption. */\n caption?: string;\n}\n\nconst styles = {\n wrapper: surfaceStyle,\n empty: emptyStyle,\n caption: {\n captionSide: 'top',\n textAlign: 'left',\n padding: '8px 0',\n opacity: 0.7,\n fontSize: 12,\n } satisfies React.CSSProperties,\n table: {\n width: '100%',\n borderCollapse: 'collapse',\n tableLayout: 'fixed',\n } satisfies React.CSSProperties,\n th: {\n textAlign: 'left',\n padding: '8px 12px',\n fontSize: 11,\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n opacity: 0.6,\n borderBottom: '1px solid var(--sb-color-sys-border-default, rgba(128,128,128,0.3))',\n } satisfies React.CSSProperties,\n td: {\n padding: '8px 12px',\n borderBottom: BORDER_FAINT,\n verticalAlign: 'top',\n } satisfies React.CSSProperties,\n path: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n } satisfies React.CSSProperties,\n typePill: {\n display: 'inline-block',\n padding: '2px 6px',\n borderRadius: 4,\n fontSize: 10,\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n background: 'var(--sb-color-sys-surface-muted, rgba(128,128,128,0.15))',\n } satisfies React.CSSProperties,\n value: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n opacity: 0.85,\n wordBreak: 'break-all',\n } satisfies React.CSSProperties,\n swatch: {\n display: 'inline-block',\n width: 14,\n height: 14,\n verticalAlign: 'middle',\n marginRight: 6,\n borderRadius: 3,\n border: '1px solid var(--sb-color-sys-border-default, rgba(0,0,0,0.1))',\n } satisfies React.CSSProperties,\n};\n\nexport function TokenTable({\n filter,\n type,\n showVar = true,\n caption,\n}: TokenTableProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n const colorFormat = useColorFormat();\n\n const rows = useMemo(() => {\n const entries = Object.entries(resolved)\n .filter(([path, token]) => {\n if (!globMatch(path, filter)) return false;\n if (type && token.$type !== type) return false;\n return true;\n })\n .toSorted(([a], [b]) => a.localeCompare(b, undefined, { numeric: true }));\n return entries.map(([path, token]) => {\n const isColor = token.$type === 'color';\n const color = isColor ? formatColor(token.$value, colorFormat) : null;\n return {\n path,\n type: token.$type ?? '',\n value: color ? color.value : formatValue(token.$value),\n outOfGamut: color?.outOfGamut ?? false,\n description: token.$description ?? '',\n cssVar: makeCssVar(path, cssVarPrefix),\n isColor,\n };\n });\n }, [resolved, filter, type, cssVarPrefix, colorFormat]);\n\n const captionText =\n caption ??\n `${rows.length} token${rows.length === 1 ? '' : 's'}${filter ? ` matching \\`${filter}\\`` : ''}${type ? ` · $type=${type}` : ''} · ${activeTheme}`;\n\n if (rows.length === 0) {\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <div style={styles.empty}>No tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <table style={styles.table}>\n <caption style={styles.caption}>{captionText}</caption>\n <colgroup>\n <col style={{ width: '30%' }} />\n <col style={{ width: '8%' }} />\n <col style={{ width: showVar ? '28%' : '40%' }} />\n {showVar && <col style={{ width: '24%' }} />}\n <col />\n </colgroup>\n <thead>\n <tr>\n <th style={styles.th}>Path</th>\n <th style={styles.th}>Type</th>\n <th style={styles.th}>Value</th>\n {showVar && <th style={styles.th}>CSS var</th>}\n <th style={styles.th}>Description</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.path}>\n <td style={{ ...styles.td, ...styles.path }}>{row.path}</td>\n <td style={styles.td}>\n {row.type && <span style={styles.typePill}>{row.type}</span>}\n </td>\n <td style={{ ...styles.td, ...styles.value }}>\n {row.isColor && (\n <span style={{ ...styles.swatch, background: row.cssVar }} aria-hidden />\n )}\n <span>{row.value}</span>\n {row.outOfGamut && (\n <span\n title='Out of sRGB gamut for this format'\n aria-label='out of gamut'\n style={{ marginLeft: 6 }}\n >\n ⚠\n </span>\n )}\n </td>\n {showVar && <td style={{ ...styles.td, ...styles.value }}>{row.cssVar}</td>}\n <td style={styles.td}>{row.description}</td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport {\n BORDER_DEFAULT,\n captionStyle,\n emptyStyle,\n MONO_STACK,\n surfaceStyle,\n} from '#/internal/styles.ts';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { globMatch, useProject } from '#/internal/use-project.ts';\n\nexport interface TypographyScaleProps {\n /**\n * Token-path filter. Defaults to every `typography` token. Use e.g.\n * `\"typography.sys.*\"` to scope to the semantic layer.\n */\n filter?: string;\n /** Override the sample text rendered for each token. */\n sample?: string;\n /** Override the caption. */\n caption?: string;\n}\n\nconst styles = {\n wrapper: surfaceStyle,\n caption: captionStyle,\n empty: emptyStyle,\n row: {\n display: 'grid',\n gridTemplateColumns: 'minmax(160px, 220px) 1fr',\n gap: 16,\n alignItems: 'baseline',\n padding: '14px 0',\n borderBottom: BORDER_DEFAULT,\n } satisfies CSSProperties,\n meta: {\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n } satisfies CSSProperties,\n path: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n } satisfies CSSProperties,\n specs: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n opacity: 0.7,\n } satisfies CSSProperties,\n};\n\ninterface Row {\n path: string;\n sampleStyle: CSSProperties;\n specs: string;\n}\n\nfunction asDimension(raw: unknown): string | undefined {\n if (raw == null) return undefined;\n if (typeof raw === 'string' || typeof raw === 'number') return String(raw);\n if (typeof raw === 'object') {\n const v = raw as Record<string, unknown>;\n if ('value' in v && 'unit' in v) return `${String(v['value'])}${String(v['unit'])}`;\n }\n return undefined;\n}\n\nfunction asFontFamily(raw: unknown): string | undefined {\n if (typeof raw === 'string') return raw;\n if (Array.isArray(raw)) return raw.map(String).join(', ');\n return undefined;\n}\n\nfunction buildRow(path: string, composite: Record<string, unknown>): Row {\n const fontFamily = asFontFamily(composite['fontFamily']);\n const fontSize = asDimension(composite['fontSize']);\n const fontWeight = composite['fontWeight'] == null ? undefined : String(composite['fontWeight']);\n const lineHeight = composite['lineHeight'] == null ? undefined : String(composite['lineHeight']);\n const letterSpacing = asDimension(composite['letterSpacing']);\n\n const sampleStyle: CSSProperties = {};\n if (fontFamily) sampleStyle.fontFamily = fontFamily;\n if (fontSize) sampleStyle.fontSize = fontSize;\n if (fontWeight) sampleStyle.fontWeight = fontWeight as CSSProperties['fontWeight'];\n if (lineHeight) sampleStyle.lineHeight = lineHeight;\n if (letterSpacing) sampleStyle.letterSpacing = letterSpacing;\n\n const parts = [\n fontSize,\n fontWeight ? `w${fontWeight}` : undefined,\n lineHeight ? `lh ${lineHeight}` : undefined,\n ]\n .filter(Boolean)\n .join(' · ');\n\n return { path, sampleStyle, specs: parts };\n}\n\nexport function TypographyScale({\n filter = 'typography',\n sample = 'The quick brown fox jumps over the lazy dog.',\n caption,\n}: TypographyScaleProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n return Object.entries(resolved)\n .filter(([path, token]) => {\n if (token.$type !== 'typography') return false;\n return globMatch(path, filter);\n })\n .toSorted(([a], [b]) => a.localeCompare(b, undefined, { numeric: true }))\n .map(([path, token]) => {\n const value = token.$value;\n if (!value || typeof value !== 'object') {\n return { path, sampleStyle: {}, specs: '' };\n }\n return buildRow(path, value as Record<string, unknown>);\n });\n }, [resolved, filter]);\n\n const captionText =\n caption ??\n `${rows.length} typography token${rows.length === 1 ? '' : 's'}${filter && filter !== 'typography' ? ` matching \\`${filter}\\`` : ''} · ${activeTheme}`;\n\n if (rows.length === 0) {\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <div style={styles.empty}>No typography tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\n <div style={styles.caption}>{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} style={styles.row}>\n <div style={styles.meta}>\n <span style={styles.path}>{row.path}</span>\n {row.specs && <span style={styles.specs}>{row.specs}</span>}\n </div>\n <div style={row.sampleStyle}>{sample}</div>\n </div>\n ))}\n </div>\n );\n}\n"],"mappings":"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"}
|