@unpunnyfuns/swatchbook-blocks 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -7
- package/dist/index.d.mts +16 -16
- package/dist/index.mjs +321 -1646
- package/dist/index.mjs.map +1 -1
- package/dist/style.css +1131 -0
- package/package.json +6 -2
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["generatedCss","virtualAxes","virtualDiagnostics","sampleStyle","styles","formatDimension","formatColor","styles","styles","MAX_RENDER_PX","styles","toPixels","formatDimension","formatFontFamily","formatPrimitive","styles","styles","styles","styles","styles","styles","styles","formatColor","styles","styles","styles","styles","styles","styles","styles","styles","styles","styles","styles","styles","styles","styles"],"sources":["../src/format-color.ts","../src/internal/styles.tsx","../src/internal/data-attr.ts","../src/internal/channel-globals.ts","../src/contexts.ts","../src/internal/block-reset.ts","../src/internal/use-project.ts","../src/border-preview/BorderSample.tsx","../src/internal/sort-tokens.ts","../src/BorderPreview.tsx","../src/ColorPalette.tsx","../src/Diagnostics.tsx","../src/dimension-scale/DimensionBar.tsx","../src/internal/format-token-value.ts","../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/internal/DetailOverlay.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, ReactElement, ReactNode } from 'react';\n\n/**\n * Chrome-style primitives shared across every block. The `var(--sb-*)`\n * references resolve to the active `cssVarPrefix` via the wrapper's\n * `chromeAliases()` spread, so blocks stay theme-aware without each one\n * reimplementing the fallback chain.\n *\n * Add a new constant here when a second block needs it — not when the\n * first one does. Keep ad-hoc inline values out of blocks so restyling\n * the chrome is a one-file change.\n */\n\nexport const MONO_STACK = 'ui-monospace, SFMono-Regular, Menlo, monospace';\n\n// Text colors — every block uses these; keep the CSS-var fallbacks\n// identical across blocks so system-fallback rendering is consistent.\nexport const TEXT_DEFAULT = 'var(--sb-color-sys-text-default, CanvasText)';\nexport const TEXT_MUTED = 'var(--sb-color-sys-text-muted, CanvasText)';\n\n// Surface colors for nested chrome (swatch backs, pill bg, overlay\n// surfaces). Block wrappers use `surfaceStyle`'s `background` directly.\nexport const SURFACE_DEFAULT = 'var(--sb-color-sys-surface-default, Canvas)';\nexport const SURFACE_RAISED = 'var(--sb-color-sys-surface-raised, Canvas)';\nexport const SURFACE_MUTED = 'var(--sb-color-sys-surface-muted, rgba(128,128,128,0.15))';\n\n// Border primitives. DEFAULT is the normal row divider; FAINT is the\n// inside-cell separator inside a larger grouped block (TokenTable's\n// rows). Fallback alphas differ so the hierarchy reads even without\n// any tokens loaded.\nexport const BORDER_DEFAULT = `1px solid var(--sb-color-sys-border-default, rgba(128,128,128,0.2))`;\nexport const BORDER_FAINT = `1px solid var(--sb-color-sys-border-default, rgba(128,128,128,0.15))`;\nexport const BORDER_STRONG = `1px solid var(--sb-color-sys-border-default, rgba(128,128,128,0.3))`;\n\n// Typography sizes used across the chrome. Body text is the inherited\n// size from `surfaceStyle`; `SIZE_LABEL` / `SIZE_META` keep the smaller\n// secondary text identical across blocks.\nexport const SIZE_LABEL = 11;\nexport const SIZE_META = 12;\nexport const SIZE_PILL = 10;\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: TEXT_DEFAULT,\n background: SURFACE_DEFAULT,\n padding: 12,\n borderRadius: 6,\n} satisfies CSSProperties;\n\nexport const captionStyle = {\n padding: '4px 0 12px',\n color: TEXT_MUTED,\n fontSize: SIZE_META,\n} satisfies CSSProperties;\n\nexport const sectionHeaderStyle = {\n fontSize: SIZE_LABEL,\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n color: TEXT_MUTED,\n marginBottom: 8,\n} satisfies CSSProperties;\n\nexport const metaStyle = {\n fontFamily: MONO_STACK,\n fontSize: SIZE_LABEL,\n color: TEXT_MUTED,\n} satisfies CSSProperties;\n\nexport const typePillStyle = {\n display: 'inline-block',\n padding: '2px 6px',\n borderRadius: 4,\n fontSize: SIZE_PILL,\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n background: SURFACE_MUTED,\n} satisfies CSSProperties;\n\nexport const emptyStyle = {\n padding: '24px 12px',\n textAlign: 'center',\n color: TEXT_MUTED,\n} satisfies CSSProperties;\n\n/**\n * Inner content for a block's \"nothing to render\" state. Call sites wrap\n * it in their own block wrapper (which already carries `themeAttrs` +\n * `chromeAliases`), so the message itself just needs the muted type.\n */\nexport function EmptyState({ children }: { children: ReactNode }): ReactElement {\n return <div style={emptyStyle}>{children}</div>;\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 * Marker attribute set on every block wrapper. Used as the scope selector\n * for the defensive element-reset stylesheet in `block-reset.ts` so\n * Storybook MDX docs CSS (`.sbdocs table`, `.sbdocs ul`, …) can't bleed\n * into our chrome.\n */\nexport const BLOCK_ATTR = 'data-swatchbook-block';\n\n/**\n * Spread helper for the common `<div data-<prefix>-theme=\"…\" data-swatchbook-block>`\n * block wrapper. Returns an object keyed on the prefixed theme attribute\n * plus the scoping marker so the call site stays readable:\n * `<div {...themeAttrs(prefix, theme)} />`.\n */\nexport function themeAttrs(prefix: string, themeName: string): Record<string, string> {\n return {\n [dataAttr(prefix, 'theme')]: themeName,\n [BLOCK_ATTR]: '',\n };\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","/**\n * Defensive element reset scoped to every block wrapper.\n *\n * Storybook 10's MDX docs applies house-style CSS to semantic elements\n * (`.sbdocs table`, `.sbdocs th/td`, `.sbdocs ul/li`, `.sbdocs details/summary`)\n * that bleeds into any block rendered inside a docs page. Our blocks set\n * inline styles on those elements for the properties they care about, but\n * anything they don't touch (background, border, margin, etc.) inherits\n * the docs look. That's why the Dashboard tree/table looked different\n * inside MDX vs a regular story.\n *\n * The fix mounts one stylesheet once per browsing session that scopes\n * `all: revert` on the semantic elements used by blocks, under the\n * `[data-swatchbook-block]` attribute carried by every block's outer\n * wrapper (via `themeAttrs`). `all: revert` restores browser defaults —\n * the block's inline styles still win on top of that, and MDX house\n * styles stop leaking in.\n *\n * The reset excludes the wrapper itself (direct `[data-swatchbook-block]`\n * selector) because the wrapper's `surfaceStyle` is what we want to keep.\n */\n\nconst STYLE_ID = 'swatchbook-block-reset';\n\nconst RESET_CSS = `[data-swatchbook-block] table,\n[data-swatchbook-block] thead,\n[data-swatchbook-block] tbody,\n[data-swatchbook-block] tr,\n[data-swatchbook-block] th,\n[data-swatchbook-block] td,\n[data-swatchbook-block] caption,\n[data-swatchbook-block] ul,\n[data-swatchbook-block] ol,\n[data-swatchbook-block] li,\n[data-swatchbook-block] details,\n[data-swatchbook-block] summary,\n[data-swatchbook-block] code,\n[data-swatchbook-block] pre,\n[data-swatchbook-block] p,\n[data-swatchbook-block] h1,\n[data-swatchbook-block] h2,\n[data-swatchbook-block] h3,\n[data-swatchbook-block] h4,\n[data-swatchbook-block] h5,\n[data-swatchbook-block] h6 {\n all: revert-layer;\n}\n`;\n\nexport function ensureBlockResetStylesheet(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById(STYLE_ID)) return;\n const style = document.createElement('style');\n style.id = STYLE_ID;\n style.textContent = RESET_CSS;\n document.head.appendChild(style);\n}\n","import { useEffect } from 'react';\nimport { useActiveAxes, useActiveTheme, useOptionalSwatchbookData } from '#/contexts.ts';\nimport { ensureBlockResetStylesheet } from '#/internal/block-reset.ts';\nimport { useChannelGlobals } from '#/internal/channel-globals.ts';\nimport {\n axes as virtualAxes,\n css as generatedCss,\n cssVarPrefix,\n defaultTheme,\n diagnostics as virtualDiagnostics,\n themes,\n themesResolved,\n} from 'virtual:swatchbook/tokens';\nimport type {\n ProjectSnapshot,\n VirtualAxis,\n VirtualDiagnostic,\n VirtualTheme,\n VirtualToken,\n} 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 diagnostics: readonly VirtualDiagnostic[];\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 diagnostics: snapshot.diagnostics,\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 useEffect(() => {\n ensureBlockResetStylesheet();\n }, []);\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 diagnostics: virtualDiagnostics,\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\n/**\n * Match a dot-separated DTCG token path against a block `filter` prop.\n *\n * **Supported shapes** (the narrow subset we need — DTCG paths don't have\n * directories, brace expansion, or regex, so we skip a full glob engine):\n *\n * | Pattern | Matches |\n * | ------------------ | --------------------------------------------------- |\n * | `undefined` / `''` | everything |\n * | `*` or `**` | everything |\n * | `color` | exact path `color`, or any descendant `color.*` |\n * | `color.sys.*` | any path whose fixed prefix is `color.sys.` |\n * | `color**` | any path starting with `color` |\n *\n * Not supported (all pass through as literal segment matchers): brace\n * expansion (`{a,b}`), mid-path globs (`color.*.bg`), negation (`!foo`),\n * character classes (`[sys]`). If you hit those, pre-filter by hand.\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","import type { CSSProperties, ReactElement } from 'react';\nimport { SURFACE_RAISED } from '#/internal/styles.tsx';\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: SURFACE_RAISED,\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 Color from 'colorjs.io';\nimport type { VirtualToken } from '#/types.ts';\n\nexport type SortBy = 'path' | 'value' | 'none';\nexport type SortDir = 'asc' | 'desc';\n\nexport interface SortOptions {\n by?: SortBy;\n dir?: SortDir;\n}\n\ntype Entry = readonly [string, VirtualToken];\n\n/**\n * Stable sort for a filtered `[path, token][]` list.\n *\n * `sortBy: 'path'` — lexicographic on the dot-path (locale-aware, numeric).\n * `sortBy: 'value'` — per-`$type` ordering:\n * - `dimension` / `duration` → numeric pixels / ms (via `toMagnitude`).\n * - `fontWeight` / `opacity` / `number` / `lineHeight` → numeric.\n * - `color` → perceptual by oklch L → C → H.\n * - `fontFamily` / `strokeStyle` (string form) → lexicographic.\n * - Composites (`typography`, `shadow`, `border`, `gradient`, `transition`) →\n * fall back to path-alpha. No useful single-axis order.\n * `sortBy: 'none'` — preserve input order (still respects `sortDir: 'desc'`\n * as a reverse).\n */\nexport function sortTokens(entries: readonly Entry[], options: SortOptions = {}): Entry[] {\n const by = options.by ?? 'path';\n const dir = options.dir ?? 'asc';\n const sign = dir === 'desc' ? -1 : 1;\n\n if (by === 'none') {\n return dir === 'desc' ? [...entries].toReversed() : [...entries];\n }\n\n if (by === 'path') {\n return [...entries].toSorted(\n ([a], [b]) => sign * a.localeCompare(b, undefined, { numeric: true }),\n );\n }\n\n // by === 'value'\n return [...entries].toSorted(([aPath, aTok], [bPath, bTok]) => {\n const cmp = compareValue(aTok, bTok);\n if (cmp !== 0) return sign * cmp;\n // Stable tiebreak on path so the order is deterministic when values equal.\n return sign * aPath.localeCompare(bPath, undefined, { numeric: true });\n });\n}\n\nfunction compareValue(a: VirtualToken, b: VirtualToken): number {\n const type = a.$type;\n // When the two tokens differ in $type, fall back to type-alpha so at\n // least the mixed list clusters by type.\n if (type !== b.$type) return String(type ?? '').localeCompare(String(b.$type ?? ''));\n if (!type) return 0;\n\n if (\n type === 'dimension' ||\n type === 'duration' ||\n type === 'fontWeight' ||\n type === 'opacity' ||\n type === 'number' ||\n type === 'lineHeight'\n ) {\n const av = toMagnitude(a.$value);\n const bv = toMagnitude(b.$value);\n if (Number.isFinite(av) && Number.isFinite(bv)) return av - bv;\n if (Number.isFinite(av)) return -1;\n if (Number.isFinite(bv)) return 1;\n return 0;\n }\n\n if (type === 'color') {\n const ak = colorKey(a.$value);\n const bk = colorKey(b.$value);\n if (!ak && !bk) return 0;\n if (!ak) return 1;\n if (!bk) return -1;\n // L → C → H.\n if (ak.l !== bk.l) return ak.l - bk.l;\n if (ak.c !== bk.c) return ak.c - bk.c;\n return ak.h - bk.h;\n }\n\n if (type === 'fontFamily' || type === 'strokeStyle') {\n const as = toDisplayable(a.$value);\n const bs = toDisplayable(b.$value);\n return as.localeCompare(bs, undefined, { numeric: true });\n }\n\n // Composite types — no one-dimensional ordering. Callers should have\n // fallen through to 'path' for these; if they didn't, leave untouched.\n return 0;\n}\n\nfunction toMagnitude(v: unknown): number {\n if (typeof v === 'number') return v;\n if (v && typeof v === 'object') {\n const d = v as { value?: unknown; unit?: unknown };\n if (typeof d.value !== 'number') return Number.NaN;\n if (typeof d.unit !== 'string') return d.value;\n switch (d.unit) {\n case 'px':\n case 'ms':\n return d.value;\n case 's':\n return d.value * 1000;\n case 'rem':\n case 'em':\n return d.value * 16;\n default:\n return d.value;\n }\n }\n return Number.NaN;\n}\n\nfunction colorKey(v: unknown): { l: number; c: number; h: number } | null {\n if (!v || typeof v !== 'object') return null;\n try {\n const c = v as {\n colorSpace?: unknown;\n components?: unknown;\n channels?: unknown;\n hex?: unknown;\n };\n let source: unknown;\n if (typeof c.hex === 'string') source = c.hex;\n else if (typeof c.colorSpace === 'string') {\n const channels = Array.isArray(c.components)\n ? c.components\n : Array.isArray(c.channels)\n ? c.channels\n : undefined;\n if (!channels) return null;\n source = { space: c.colorSpace, coords: channels };\n } else return null;\n // Color.js's constructor signature is a string or PlainColorObject —\n // we've already narrowed `source` to one of those shapes above, but\n // the union ends up broader than Color.js's typed surface.\n const color = new Color(source as string);\n const [l, chroma, h] = color.to('oklch').coords;\n // Guard against NaN hue on achromatic colors so the sort stays stable.\n return {\n l: Number.isFinite(l) ? (l as number) : 0,\n c: Number.isFinite(chroma) ? (chroma as number) : 0,\n h: Number.isFinite(h) ? (h as number) : 0,\n };\n } catch {\n return null;\n }\n}\n\nfunction toDisplayable(v: unknown): string {\n if (typeof v === 'string') return v;\n if (Array.isArray(v)) return v.map(String).join(', ');\n if (v && typeof v === 'object') return JSON.stringify(v);\n return String(v ?? '');\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport { BorderSample } from '#/border-preview/BorderSample.tsx';\nimport {\n BORDER_DEFAULT,\n MONO_STACK,\n TEXT_MUTED,\n captionStyle,\n emptyStyle,\n surfaceStyle,\n} from '#/internal/styles.tsx';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { type SortBy, type SortDir, sortTokens } from '#/internal/sort-tokens.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 * Sort order. `'path'` (default) sorts lexicographically on the\n * dot-path; `'value'` falls through to path (borders don't have a\n * single-axis ordering); `'none'` preserves project order.\n */\n sortBy?: SortBy;\n /** `'asc'` (default) or `'desc'`. */\n sortDir?: SortDir;\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: TEXT_MUTED,\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({\n filter,\n caption,\n sortBy = 'path',\n sortDir = 'asc',\n}: BorderPreviewProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n const filtered = Object.entries(resolved).filter(([path, token]) => {\n if (token.$type !== 'border') return false;\n return globMatch(path, filter);\n });\n return sortTokens(filtered, { by: sortBy, dir: sortDir }).map(([path, token]) => ({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n value: (token.$value ?? {}) as BorderValue,\n }));\n }, [resolved, filter, cssVarPrefix, sortBy, sortDir]);\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 BORDER_FAINT,\n MONO_STACK,\n captionStyle,\n emptyStyle,\n surfaceStyle,\n} from '#/internal/styles.tsx';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { type SortBy, type SortDir, sortTokens } from '#/internal/sort-tokens.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 * Sort order within each group.\n * - `'path'` (default) — lexicographic on the dot-path.\n * - `'value'` — perceptual ordering: oklch L → C → H (ramps read\n * light→dark, then warm→cool within each lightness band).\n * - `'none'` — preserve project iteration order.\n */\n sortBy?: SortBy;\n /** `'asc'` (default) or `'desc'`. */\n sortDir?: SortDir;\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: BORDER_FAINT,\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,\n groupBy,\n caption,\n sortBy = 'path',\n sortDir = 'asc',\n}: ColorPaletteProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n const colorFormat = useColorFormat();\n\n const groups = useMemo(() => {\n const filtered = Object.entries(resolved).filter(([path, token]) => {\n if (token.$type !== 'color') return false;\n return globMatch(path, filter);\n });\n const entries = sortTokens(filtered, { by: sortBy, dir: sortDir });\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, sortBy, sortDir]);\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\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n >\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, themeAttrs } from '#/internal/data-attr.ts';\nimport { BORDER_FAINT, TEXT_MUTED, surfaceStyle } from '#/internal/styles.tsx';\nimport { useProject } from '#/internal/use-project.ts';\nimport type { VirtualDiagnostic } from '#/types.ts';\n\nexport interface DiagnosticsProps {\n /** Override the section caption. Defaults to a severity summary. */\n caption?: string;\n}\n\ntype DiagnosticSeverity = VirtualDiagnostic['severity'];\n\nconst severityColor: Record<DiagnosticSeverity, string> = {\n error: '#d64545',\n warn: '#b08900',\n info: 'inherit',\n};\n\nconst severityLabel: Record<DiagnosticSeverity, string> = {\n error: 'ERROR',\n warn: 'WARN',\n info: 'INFO',\n};\n\nconst styles = {\n wrapper: surfaceStyle,\n summary: {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '4px 0',\n fontSize: 13,\n cursor: 'pointer',\n listStyle: 'none',\n fontWeight: 600,\n } satisfies CSSProperties,\n list: {\n listStyle: 'none',\n margin: '8px 0 0',\n padding: 0,\n display: 'flex',\n flexDirection: 'column',\n } satisfies CSSProperties,\n row: {\n display: 'grid',\n gridTemplateColumns: '60px 1fr',\n gap: 12,\n padding: '8px 4px',\n borderTop: BORDER_FAINT,\n fontSize: 12,\n } satisfies CSSProperties,\n label: {\n fontWeight: 600,\n fontSize: 10,\n letterSpacing: 0.5,\n } satisfies CSSProperties,\n meta: {\n color: TEXT_MUTED,\n fontSize: 11,\n marginTop: 4,\n opacity: 0.7,\n } satisfies CSSProperties,\n};\n\nfunction summaryText(diagnostics: readonly VirtualDiagnostic[]): string {\n if (diagnostics.length === 0) return '✔ OK · no diagnostics';\n const counts = { error: 0, warn: 0, info: 0 };\n for (const d of diagnostics) counts[d.severity] += 1;\n const parts: string[] = [];\n if (counts.error > 0) parts.push(`✖ ${counts.error} error${counts.error === 1 ? '' : 's'}`);\n if (counts.warn > 0) parts.push(`⚠ ${counts.warn} warning${counts.warn === 1 ? '' : 's'}`);\n if (counts.info > 0) parts.push(`${counts.info} info`);\n return parts.join(' · ');\n}\n\nfunction diagnosticKey(d: VirtualDiagnostic, i: number): string {\n return `${d.severity}:${d.group}:${d.filename ?? ''}:${d.line ?? ''}:${d.message}:${i}`;\n}\n\nfunction summaryColor(diagnostics: readonly VirtualDiagnostic[]): string {\n if (diagnostics.length === 0) return '#30a46c';\n if (diagnostics.some((d) => d.severity === 'error')) return severityColor.error;\n if (diagnostics.some((d) => d.severity === 'warn')) return severityColor.warn;\n return 'inherit';\n}\n\n/**\n * Render the project's load diagnostics — parser errors, resolver warnings,\n * disabled-axes validation issues, etc. — as a collapsible list. Auto-opens\n * when the project carries errors or warnings; stays collapsed for clean\n * loads and info-only loads.\n *\n * Replaces the diagnostics section from the addon's (now-retired) Design\n * Tokens panel. Consumers compose it alongside TokenNavigator / TokenTable\n * on their own MDX pages.\n */\nexport function Diagnostics({ caption }: DiagnosticsProps = {}): ReactElement {\n const { activeTheme, cssVarPrefix, diagnostics } = useProject();\n\n const hasErrorsOrWarnings = diagnostics.some(\n (d) => d.severity === 'error' || d.severity === 'warn',\n );\n const headingText = caption ?? `Diagnostics · ${summaryText(diagnostics)}`;\n\n return (\n <div\n {...themeAttrs(cssVarPrefix, activeTheme)}\n style={{ ...chromeAliases(cssVarPrefix), ...styles.wrapper }}\n data-testid='diagnostics'\n >\n <details open={hasErrorsOrWarnings}>\n <summary style={{ ...styles.summary, color: summaryColor(diagnostics) }}>\n {headingText}\n </summary>\n {diagnostics.length > 0 && (\n <ul style={styles.list}>\n {diagnostics.map((d, i) => (\n <li key={diagnosticKey(d, i)} style={styles.row}>\n <span style={{ ...styles.label, color: severityColor[d.severity] }}>\n {severityLabel[d.severity]}\n </span>\n <div>\n <div>{d.message}</div>\n {(d.group || d.filename) && (\n <div style={styles.meta}>\n {[d.group, d.filename, d.line ? `:${d.line}` : '']\n .filter(Boolean)\n .join(' · ')}\n </div>\n )}\n </div>\n </li>\n ))}\n </ul>\n )}\n </details>\n </div>\n );\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { BORDER_STRONG } from '#/internal/styles.tsx';\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: BORDER_STRONG,\n } satisfies CSSProperties,\n sizeSample: {\n background: 'var(--sb-color-sys-accent-bg, #3b82f6)',\n border: BORDER_STRONG,\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 ColorFormat, formatColor } from '#/format-color.ts';\n\n/**\n * Produce a single-line display string for any DTCG token `$value`,\n * respecting the active color format for color-typed tokens and the\n * color sub-values of composite types (border, shadow, gradient).\n *\n * Replaces the old `formatValue` one-shot that hex-short-circuited\n * colors and fell through to raw JSON for known composites.\n *\n * Shape by type:\n * - `color` → `formatColor(value, colorFormat)` — e.g. `#3b82f6`, `oklch(...)`, `raw` JSON.\n * - `dimension|duration` → `value + unit` — e.g. `16px`, `200ms`.\n * - `fontFamily` → string or array joined with `, `.\n * - `fontWeight` → primitive.\n * - `cubicBezier` → `cubic-bezier(a, b, c, d)`.\n * - `strokeStyle` → primitive string, or `dashed · dashArray · lineCap` when it's the object shape.\n * - `shadow` → one or more `offsetX offsetY blur spread color` layers joined with `, `.\n * - `border` → `width style color`.\n * - `transition` → `duration easing [delay]`.\n * - `typography` → `family / size / line-height / weight`.\n * - `gradient` → `stops joined with →` — compact representation, not a CSS gradient string (those live in GradientPalette's preview).\n *\n * Unknown object shapes fall through to truncated JSON.\n */\nexport function formatTokenValue(\n value: unknown,\n $type: string | undefined,\n colorFormat: ColorFormat,\n): string {\n if (value == null) return '';\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n\n switch ($type) {\n case 'color':\n return formatColor(value, colorFormat).value;\n case 'dimension':\n case 'duration':\n return formatDimension(value);\n case 'fontFamily':\n return formatFontFamily(value);\n case 'fontWeight':\n case 'lineHeight':\n case 'letterSpacing':\n case 'opacity':\n case 'number':\n return formatPrimitive(value);\n case 'cubicBezier':\n return formatCubicBezier(value);\n case 'strokeStyle':\n return formatStrokeStyle(value);\n case 'shadow':\n return formatShadow(value, colorFormat);\n case 'border':\n return formatBorder(value, colorFormat);\n case 'transition':\n return formatTransition(value);\n case 'typography':\n return formatTypography(value);\n case 'gradient':\n return formatGradient(value, colorFormat);\n default:\n return formatUnknown(value);\n }\n}\n\nfunction formatDimension(v: unknown): string {\n if (typeof v === 'string' || typeof v === 'number') return String(v);\n if (v && 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 formatUnknown(v);\n}\n\nfunction formatFontFamily(v: unknown): string {\n if (typeof v === 'string') return v;\n if (Array.isArray(v)) return v.map(String).join(', ');\n return formatUnknown(v);\n}\n\nfunction formatPrimitive(v: unknown): string {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') return String(v);\n return formatUnknown(v);\n}\n\nfunction formatCubicBezier(v: unknown): string {\n if (Array.isArray(v) && v.length === 4) {\n return `cubic-bezier(${v.map((n) => (typeof n === 'number' ? n : 0)).join(', ')})`;\n }\n return formatUnknown(v);\n}\n\nfunction formatStrokeStyle(v: unknown): string {\n if (typeof v === 'string') return v;\n if (v && typeof v === 'object') {\n const s = v as { dashArray?: unknown; lineCap?: unknown };\n const parts: string[] = ['dashed'];\n if (Array.isArray(s.dashArray)) {\n parts.push(s.dashArray.map((n) => formatDimension(n)).join(' '));\n }\n if (typeof s.lineCap === 'string') parts.push(s.lineCap);\n return parts.join(' · ');\n }\n return formatUnknown(v);\n}\n\nfunction formatShadow(v: unknown, colorFormat: ColorFormat): string {\n const layers = Array.isArray(v) ? v : [v];\n const parts = layers.map((layer) => {\n if (!layer || typeof layer !== 'object') return formatUnknown(layer);\n const s = layer as Record<string, unknown>;\n const pieces = [\n formatDimension(s['offsetX']),\n formatDimension(s['offsetY']),\n formatDimension(s['blur']),\n formatDimension(s['spread']),\n formatColor(s['color'], colorFormat).value,\n ].filter((p) => p !== '');\n if (s['inset']) pieces.push('inset');\n return pieces.join(' ');\n });\n return parts.join(', ');\n}\n\nfunction formatBorder(v: unknown, colorFormat: ColorFormat): string {\n if (!v || typeof v !== 'object') return formatUnknown(v);\n const b = v as Record<string, unknown>;\n const width = formatDimension(b['width']);\n const style = formatPrimitive(b['style']);\n const color = formatColor(b['color'], colorFormat).value;\n return [width, style, color].filter((p) => p !== '').join(' ');\n}\n\nfunction formatTransition(v: unknown): string {\n if (!v || typeof v !== 'object') return formatUnknown(v);\n const t = v as Record<string, unknown>;\n const duration = formatDimension(t['duration']);\n const easing = formatPrimitive(t['timingFunction']);\n const delay = formatDimension(t['delay']);\n const parts = [duration, easing];\n // Only emit delay when non-zero. `0ms` / `0s` clutters the one-liner.\n if (!/^0\\D/.test(delay) && delay !== '') parts.push(delay);\n return parts.filter((p) => p !== '').join(' ');\n}\n\nfunction formatTypography(v: unknown): string {\n if (!v || typeof v !== 'object') return formatUnknown(v);\n const t = v as Record<string, unknown>;\n const family = formatFontFamily(t['fontFamily']);\n const size = formatDimension(t['fontSize']);\n const lineHeight = formatPrimitive(t['lineHeight']);\n const weight = formatPrimitive(t['fontWeight']);\n return [family, size, lineHeight, weight].filter((p) => p !== '').join(' / ');\n}\n\nfunction formatGradient(v: unknown, colorFormat: ColorFormat): string {\n if (!Array.isArray(v) || v.length === 0) return formatUnknown(v);\n const parts = v.map((stop) => {\n if (!stop || typeof stop !== 'object') return formatUnknown(stop);\n const s = stop as Record<string, unknown>;\n const position =\n typeof s['position'] === 'number' ? `${Math.round(s['position'] * 100)}%` : '?';\n const color = formatColor(s['color'], colorFormat).value;\n return `${color} ${position}`;\n });\n return parts.join(' → ');\n}\n\nfunction formatUnknown(v: unknown): string {\n if (v == null) return '';\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') return String(v);\n try {\n return JSON.stringify(v).slice(0, 120);\n } catch {\n return String(v);\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.tsx';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { formatTokenValue } from '#/internal/format-token-value.ts';\nimport { type SortBy, type SortDir, sortTokens } from '#/internal/sort-tokens.ts';\nimport { 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 * Sort order.\n * - `'value'` (default) — numeric by rendered pixel size (`px` / `rem` / `em`).\n * Non-convertible units (ex/ch/%) land after the convertible ones.\n * - `'path'` — lexicographic on the dot-path.\n * - `'none'` — preserve project iteration order.\n */\n sortBy?: SortBy;\n /** `'asc'` (default) or `'desc'`. */\n sortDir?: SortDir;\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,\n kind = 'length',\n caption,\n sortBy = 'value',\n sortDir = 'asc',\n}: DimensionScaleProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n const filtered = Object.entries(resolved).filter(([path, token]) => {\n if (token.$type !== 'dimension') return false;\n return globMatch(path, filter);\n });\n return sortTokens(filtered, { by: sortBy, dir: sortDir }).map(([path, token]) => {\n const pxValue = toPixels(token.$value);\n return {\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n displayValue: formatTokenValue(token.$value, token.$type, 'raw'),\n pxValue,\n capped: Number.isFinite(pxValue) && pxValue > MAX_RENDER_PX,\n };\n });\n }, [resolved, filter, cssVarPrefix, sortBy, sortDir]);\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 MONO_STACK,\n TEXT_MUTED,\n captionStyle,\n emptyStyle,\n surfaceStyle,\n} from '#/internal/styles.tsx';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\nimport { type SortBy, type SortDir, sortTokens } from '#/internal/sort-tokens.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 * Sort order. `'path'` (default) sorts lexicographically on the\n * dot-path; `'value'` ordering falls through to path for this block's\n * type (composite / non-numeric); `'none'` preserves project order.\n */\n sortBy?: SortBy;\n /** `'asc'` (default) or `'desc'`. */\n sortDir?: SortDir;\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: TEXT_MUTED,\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: TEXT_MUTED,\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,\n sample = 'The quick brown fox jumps over the lazy dog.',\n caption,\n sortBy = 'path',\n sortDir = 'asc',\n}: FontFamilySampleProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n const filtered = Object.entries(resolved).filter(([path, token]) => {\n if (token.$type !== 'fontFamily') return false;\n return globMatch(path, filter);\n });\n return sortTokens(filtered, { by: sortBy, dir: sortDir }).map(([path, token]) => ({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n stack: stackString(token.$value),\n }));\n }, [resolved, filter, cssVarPrefix, sortBy, sortDir]);\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 MONO_STACK,\n TEXT_MUTED,\n captionStyle,\n emptyStyle,\n surfaceStyle,\n} from '#/internal/styles.tsx';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { type SortBy, type SortDir, sortTokens } from '#/internal/sort-tokens.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 * Sort order.\n * - `'value'` (default) — ascending numeric by weight (100 → 900).\n * - `'path'` — lexicographic on the dot-path.\n * - `'none'` — preserve project iteration order.\n */\n sortBy?: SortBy;\n /** `'asc'` (default) or `'desc'`. */\n sortDir?: SortDir;\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: TEXT_MUTED,\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: TEXT_MUTED,\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,\n sample = 'Aa',\n caption,\n sortBy = 'value',\n sortDir = 'asc',\n}: FontWeightScaleProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n const filtered = Object.entries(resolved).filter(([path, token]) => {\n if (token.$type !== 'fontWeight') return false;\n return globMatch(path, filter);\n });\n return sortTokens(filtered, { by: sortBy, dir: sortDir }).map(([path, token]) => ({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n display: token.$value == null ? '' : String(token.$value),\n weight: toWeight(token.$value),\n }));\n }, [resolved, filter, cssVarPrefix, sortBy, sortDir]);\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 MONO_STACK,\n captionStyle,\n emptyStyle,\n surfaceStyle,\n} from '#/internal/styles.tsx';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { type SortBy, type SortDir, sortTokens } from '#/internal/sort-tokens.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 * Sort order. `'path'` (default) sorts lexicographically on the\n * dot-path; `'value'` falls through to path (gradients don't have\n * a single-axis ordering); `'none'` preserves project order.\n */\n sortBy?: SortBy;\n /** `'asc'` (default) or `'desc'`. */\n sortDir?: SortDir;\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: BORDER_DEFAULT,\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,\n caption,\n sortBy = 'path',\n sortDir = 'asc',\n}: GradientPaletteProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n const filtered = Object.entries(resolved).filter(([path, token]) => {\n if (token.$type !== 'gradient') return false;\n return globMatch(path, filter);\n });\n return sortTokens(filtered, { by: sortBy, dir: sortDir }).map(([path, token]) => ({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n stops: asStops(token.$value),\n }));\n }, [resolved, filter, cssVarPrefix, sortBy, sortDir]);\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 { SURFACE_MUTED, TEXT_MUTED } from '#/internal/styles.tsx';\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: SURFACE_MUTED,\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: TEXT_MUTED,\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 {\n BORDER_DEFAULT,\n BORDER_STRONG,\n MONO_STACK,\n TEXT_MUTED,\n surfaceStyle,\n} from '#/internal/styles.tsx';\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: TEXT_MUTED,\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: TEXT_MUTED,\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: BORDER_STRONG,\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: BORDER_STRONG,\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: TEXT_MUTED,\n } satisfies CSSProperties,\n cssVar: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n color: TEXT_MUTED,\n whiteSpace: 'nowrap',\n } satisfies CSSProperties,\n empty: {\n padding: '24px 12px',\n textAlign: 'center',\n color: TEXT_MUTED,\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 { BORDER_FAINT, SURFACE_RAISED } from '#/internal/styles.tsx';\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: SURFACE_RAISED,\n border: BORDER_FAINT,\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 MONO_STACK,\n TEXT_MUTED,\n captionStyle,\n emptyStyle,\n surfaceStyle,\n} from '#/internal/styles.tsx';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { type SortBy, type SortDir, sortTokens } from '#/internal/sort-tokens.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 * Sort order. `'path'` (default) sorts lexicographically on the\n * dot-path; `'value'` falls through to path (shadows don't have a\n * single-axis ordering); `'none'` preserves project order.\n */\n sortBy?: SortBy;\n /** `'asc'` (default) or `'desc'`. */\n sortDir?: SortDir;\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: TEXT_MUTED,\n } satisfies CSSProperties,\n layerHeader: {\n fontSize: 10,\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n color: TEXT_MUTED,\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({\n filter,\n caption,\n sortBy = 'path',\n sortDir = 'asc',\n}: ShadowPreviewProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n const filtered = Object.entries(resolved).filter(([path, token]) => {\n if (token.$type !== 'shadow') return false;\n return globMatch(path, filter);\n });\n return sortTokens(filtered, { by: sortBy, dir: sortDir }).map(([path, token]) => ({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n layers: asLayers(token.$value),\n }));\n }, [resolved, filter, cssVarPrefix, sortBy, sortDir]);\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 MONO_STACK,\n TEXT_DEFAULT,\n TEXT_MUTED,\n captionStyle,\n emptyStyle,\n surfaceStyle,\n} from '#/internal/styles.tsx';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { formatTokenValue } from '#/internal/format-token-value.ts';\nimport { globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\nimport { type SortBy, type SortDir, sortTokens } from '#/internal/sort-tokens.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 * Sort order. `'path'` (default) sorts lexicographically on the\n * dot-path; `'value'` ordering falls through to path for this block's\n * type (composite / non-numeric); `'none'` preserves project order.\n */\n sortBy?: SortBy;\n /** `'asc'` (default) or `'desc'`. */\n sortDir?: SortDir;\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: TEXT_MUTED,\n } satisfies CSSProperties,\n line: {\n height: 0,\n borderTopWidth: 4,\n borderTopColor: TEXT_DEFAULT,\n width: '100%',\n } satisfies CSSProperties,\n objectFallback: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n color: TEXT_MUTED,\n } satisfies CSSProperties,\n cssVar: {\n fontFamily: MONO_STACK,\n fontSize: 11,\n color: TEXT_MUTED,\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,\n caption,\n sortBy = 'path',\n sortDir = 'asc',\n}: StrokeStyleSampleProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n const filtered = Object.entries(resolved).filter(([path, token]) => {\n if (token.$type !== 'strokeStyle') return false;\n return globMatch(path, filter);\n });\n return sortTokens(filtered, { by: sortBy, dir: sortDir }).map(([path, token]) => ({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n displayValue: formatTokenValue(token.$value, token.$type, 'raw'),\n cssStyle: extractCssStyle(token.$value),\n }));\n }, [resolved, filter, cssVarPrefix, sortBy, sortDir]);\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 {\n BORDER_DEFAULT,\n BORDER_FAINT,\n BORDER_STRONG,\n MONO_STACK,\n SURFACE_MUTED,\n SURFACE_RAISED,\n TEXT_DEFAULT,\n TEXT_MUTED,\n surfaceStyle,\n} from '#/internal/styles.tsx';\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: SURFACE_MUTED,\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: BORDER_DEFAULT,\n } satisfies CSSProperties,\n snippet: {\n display: 'block',\n padding: '8px 10px',\n borderRadius: 4,\n background: SURFACE_MUTED,\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: SURFACE_RAISED,\n border: BORDER_FAINT,\n borderRadius: 6,\n } satisfies CSSProperties,\n borderSample: {\n width: 140,\n height: 56,\n background: SURFACE_RAISED,\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: TEXT_DEFAULT,\n width: 220,\n } satisfies CSSProperties,\n strokeStyleSvg: {\n width: 220,\n height: 24,\n color: TEXT_DEFAULT,\n } satisfies CSSProperties,\n strokeStyleFallback: {\n fontFamily: MONO_STACK,\n fontSize: 12,\n color: TEXT_MUTED,\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: TEXT_MUTED,\n } satisfies CSSProperties,\n breakdownLayerHeader: {\n gridColumn: '1 / -1',\n fontSize: 10,\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n color: TEXT_MUTED,\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: SURFACE_MUTED,\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: TEXT_MUTED,\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: SURFACE_MUTED,\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: SURFACE_RAISED,\n color: TEXT_DEFAULT,\n border: BORDER_STRONG,\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 } from '#/format-color.ts';\nimport { dataAttr } from '#/internal/data-attr.ts';\nimport { formatTokenValue } from '#/internal/format-token-value.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 tokenType = token?.$type;\n const isColor = tokenType === 'color';\n const formatFn = (t: DetailToken | undefined): string => valueFor(t, tokenType, 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(\n token: DetailToken | undefined,\n $type: string | undefined,\n format: ColorFormat,\n): string {\n if (!token) return '—';\n return formatTokenValue(token.$value, $type, format);\n}\n\n/**\n * Stable key for variance detection — compares structural equality across\n * themes, not a display string. We pin `raw` so color representation\n * changes (the toolbar's format dropdown) don't artificially make axes\n * look like they vary.\n */\nfunction varianceKey(\n themesResolved: Record<string, Record<string, DetailToken>>,\n themeName: string,\n path: string,\n): string {\n const t = themesResolved[themeName]?.[path];\n if (!t) return '';\n return JSON.stringify(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, varianceKey(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 { useColorFormat } from '#/contexts.ts';\nimport { type ColorFormat, formatColor } from '#/format-color.ts';\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 const colorFormat = useColorFormat();\n if (!token) return null;\n return (\n <CompositeBreakdownContent\n type={token.$type}\n rawValue={token.$value}\n colorFormat={colorFormat}\n />\n );\n}\n\nexport function CompositeBreakdownContent({\n type,\n rawValue,\n colorFormat,\n}: {\n type: string | undefined;\n rawValue: unknown;\n colorFormat: ColorFormat;\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', formatColorSubValue(v['color'], colorFormat)],\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={formatColorSubValue(v['color'], colorFormat)} />\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={formatColorSubValue(v['color'], colorFormat)}\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\n/**\n * Route sub-value colors through `formatColor` so they honor the active\n * color-format dropdown, just like the standalone `<ColorPalette />` and\n * `<TokenDetail />` top-line do. Returns `null` for a missing field so\n * the key/value row drops out entirely.\n */\nfunction formatColorSubValue(v: unknown, format: ColorFormat): string | null {\n if (v == null) return null;\n return formatColor(v, format).value;\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 { formatTokenValue } from '#/internal/format-token-value.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 gamut = isColor ? formatColor(token.$value, colorFormat) : null;\n const value = formatTokenValue(token.$value, token.$type, colorFormat);\n const outOfGamut = gamut?.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, ReactElement } from 'react';\nimport { useEffect } from 'react';\nimport { BORDER_STRONG, SURFACE_DEFAULT, TEXT_DEFAULT } from '#/internal/styles.tsx';\nimport { TokenDetail } from '#/TokenDetail.tsx';\n\n/**\n * Slide-over that wraps `<TokenDetail>`. Shared between `<TokenNavigator />`\n * and `<TokenTable />` so both land on the same opener and the same styling.\n *\n * Dismisses on backdrop click, Escape, and the close button. `role=\"dialog\"`\n * + `aria-modal=\"true\"` hints to AT that focus is trapped here; actual focus\n * management is tracked in the open-issue #253.\n */\n\nconst styles = {\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: SURFACE_DEFAULT,\n color: TEXT_DEFAULT,\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: BORDER_STRONG,\n background: 'transparent',\n color: 'inherit',\n cursor: 'pointer',\n fontSize: 16,\n lineHeight: 1,\n } satisfies CSSProperties,\n} as const;\n\nexport interface DetailOverlayProps {\n path: string;\n onClose(): void;\n testId?: string;\n}\n\nexport function DetailOverlay({\n path,\n onClose,\n testId = 'swatchbook-overlay',\n}: 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 style={styles.backdrop} onClick={onClose} role='presentation' data-testid={testId}>\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={`${testId}-close`}\n >\n ×\n </button>\n <TokenDetail path={path} />\n </div>\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 { DetailOverlay } from '#/internal/DetailOverlay.tsx';\nimport {\n BORDER_DEFAULT,\n EmptyState,\n MONO_STACK,\n SIZE_LABEL,\n SIZE_META,\n SIZE_PILL,\n surfaceStyle,\n TEXT_DEFAULT,\n TEXT_MUTED,\n typePillStyle,\n} from '#/internal/styles.tsx';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { formatTokenValue } from '#/internal/format-token-value.ts';\nimport { makeCssVar, useProject } from '#/internal/use-project.ts';\nimport { MotionSample } from '#/motion-preview/MotionSample.tsx';\nimport { ShadowSample } from '#/shadow-preview/ShadowSample.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: TEXT_MUTED,\n fontSize: SIZE_META,\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: SIZE_META,\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: SIZE_META,\n } satisfies CSSProperties,\n caret: {\n display: 'inline-block',\n width: 12,\n textAlign: 'center',\n color: TEXT_MUTED,\n } satisfies CSSProperties,\n tail: {\n fontFamily: MONO_STACK,\n fontSize: SIZE_META,\n } satisfies CSSProperties,\n typePill: {\n ...typePillStyle,\n // Tree leaves use a smaller pill (1px vs 2px padding) so the row\n // height stays compact against inline swatch/preview visuals.\n padding: '1px 6px',\n fontSize: SIZE_PILL,\n } satisfies CSSProperties,\n value: {\n fontSize: SIZE_LABEL,\n color: TEXT_MUTED,\n marginLeft: 'auto',\n minWidth: 0,\n textAlign: 'right',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } satisfies CSSProperties,\n count: {\n marginLeft: 'auto',\n fontSize: SIZE_LABEL,\n color: TEXT_DEFAULT,\n } satisfies CSSProperties,\n colorSwatch: {\n display: 'inline-block',\n width: 14,\n height: 14,\n borderRadius: 3,\n border: BORDER_DEFAULT,\n } satisfies CSSProperties,\n previewBox: {\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'flex-end',\n marginLeft: 'auto',\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 <EmptyState>\n {root ? `No tokens under \"${root}\".` : 'No tokens in the active theme.'}\n </EmptyState>\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\n path={selectedPath}\n onClose={() => setSelectedPath(null)}\n testId='token-navigator-overlay'\n />\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 return (\n <span style={styles.previewBox}>\n <span style={styles.value}>{formatTokenValue(token.$value, type, colorFormat)}</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}>{formatTokenValue(token.$value, type, colorFormat)}</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}>{formatTokenValue(token.$value, type, colorFormat)}</span>\n </span>\n );\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useCallback, useMemo, useState } from 'react';\nimport { useColorFormat } from '#/contexts.ts';\nimport { formatColor } from '#/format-color.ts';\nimport {\n BORDER_FAINT,\n BORDER_STRONG,\n MONO_STACK,\n SIZE_LABEL,\n SIZE_META,\n SIZE_PILL,\n SURFACE_MUTED,\n TEXT_MUTED,\n emptyStyle,\n surfaceStyle,\n} from '#/internal/styles.tsx';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { DetailOverlay } from '#/internal/DetailOverlay.tsx';\nimport { formatTokenValue } from '#/internal/format-token-value.ts';\nimport { type SortBy, type SortDir, sortTokens } from '#/internal/sort-tokens.ts';\nimport { 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 /** Override the table caption. */\n caption?: string;\n /**\n * Sort order.\n * - `'path'` (default) — lexicographic on the dot-path.\n * - `'value'` — per-`$type`: numeric for `dimension` / `duration` /\n * `fontWeight`; perceptual (oklch L → C → H) for `color`; lexicographic\n * for `fontFamily` / `strokeStyle`. Composite types fall through to\n * path order.\n * - `'none'` — preserve project iteration order.\n */\n sortBy?: SortBy;\n /** `'asc'` (default) or `'desc'`. */\n sortDir?: SortDir;\n /**\n * Called with the clicked row's dot-path. When set, the built-in\n * `<TokenDetail>` slide-over is suppressed — the consumer owns the\n * follow-up UI (inline panel, drill-down route, …).\n */\n onSelect?(path: string): void;\n}\n\nconst styles = {\n wrapper: surfaceStyle,\n empty: emptyStyle,\n caption: {\n captionSide: 'top',\n textAlign: 'left',\n padding: '8px 0',\n color: TEXT_MUTED,\n fontSize: SIZE_META,\n } satisfies CSSProperties,\n table: {\n // `tableLayout: auto` lets column widths follow content; the per-cell\n // `minWidth` values below keep the important columns from collapsing\n // on narrow containers.\n width: '100%',\n borderCollapse: 'collapse',\n } satisfies CSSProperties,\n th: {\n textAlign: 'left',\n padding: '8px 12px',\n fontSize: SIZE_LABEL,\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n color: TEXT_MUTED,\n borderBottom: BORDER_STRONG,\n } satisfies CSSProperties,\n thPath: {\n minWidth: 180,\n } satisfies CSSProperties,\n thValue: {\n minWidth: 160,\n } satisfies CSSProperties,\n row: {\n cursor: 'pointer',\n } satisfies CSSProperties,\n td: {\n padding: '8px 12px',\n borderBottom: BORDER_FAINT,\n verticalAlign: 'top',\n } satisfies CSSProperties,\n path: {\n fontFamily: MONO_STACK,\n fontSize: SIZE_META,\n } satisfies CSSProperties,\n valueCell: {\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n minWidth: 0,\n fontFamily: MONO_STACK,\n fontSize: SIZE_META,\n } satisfies CSSProperties,\n typePill: {\n display: 'inline-block',\n padding: '1px 6px',\n borderRadius: 4,\n fontSize: SIZE_PILL,\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n background: SURFACE_MUTED,\n color: TEXT_MUTED,\n fontFamily: MONO_STACK,\n flexShrink: 0,\n } satisfies CSSProperties,\n swatch: {\n display: 'inline-block',\n width: 16,\n height: 16,\n borderRadius: 3,\n border: BORDER_STRONG,\n flexShrink: 0,\n } satisfies CSSProperties,\n valueText: {\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n } satisfies CSSProperties,\n};\n\nexport function TokenTable({\n filter,\n type,\n caption,\n sortBy = 'path',\n sortDir = 'asc',\n onSelect,\n}: TokenTableProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n const colorFormat = useColorFormat();\n const [selectedPath, setSelectedPath] = useState<string | null>(null);\n\n const rows = useMemo(() => {\n const filtered = Object.entries(resolved).filter(([path, token]) => {\n if (!globMatch(path, filter)) return false;\n if (type && token.$type !== type) return false;\n return true;\n });\n const entries = sortTokens(filtered, { by: sortBy, dir: sortDir });\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: formatTokenValue(token.$value, token.$type, colorFormat),\n outOfGamut: color?.outOfGamut ?? false,\n cssVar: makeCssVar(path, cssVarPrefix),\n isColor,\n };\n });\n }, [resolved, filter, type, cssVarPrefix, colorFormat, sortBy, sortDir]);\n\n const handleRowClick = useCallback(\n (path: string) => {\n if (onSelect) onSelect(path);\n else setSelectedPath(path);\n },\n [onSelect],\n );\n\n const captionText =\n caption ??\n `${rows.length} token${rows.length === 1 ? '' : 's'}${\n filter ? ` matching \\`${filter}\\`` : ''\n }${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 <thead>\n <tr>\n <th style={{ ...styles.th, ...styles.thPath }}>Path</th>\n <th style={{ ...styles.th, ...styles.thValue }}>Value</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr\n key={row.path}\n style={styles.row}\n onClick={() => handleRowClick(row.path)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleRowClick(row.path);\n }\n }}\n tabIndex={0}\n aria-label={`Inspect ${row.path}`}\n data-testid='token-table-row'\n data-path={row.path}\n >\n <td style={{ ...styles.td, ...styles.path }}>{row.path}</td>\n <td style={styles.td}>\n <span style={styles.valueCell}>\n {row.type && <span style={styles.typePill}>{row.type}</span>}\n {row.isColor && (\n <span style={{ ...styles.swatch, background: row.cssVar }} aria-hidden />\n )}\n <span style={styles.valueText} title={row.value} data-testid='token-table-value'>\n {row.value}\n </span>\n {row.outOfGamut && (\n <span\n title='Out of sRGB gamut for this format'\n aria-label='out of gamut'\n style={{ flexShrink: 0 }}\n >\n ⚠\n </span>\n )}\n </span>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n\n {selectedPath !== null && (\n <DetailOverlay\n path={selectedPath}\n onClose={() => setSelectedPath(null)}\n testId='token-table-overlay'\n />\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.tsx';\nimport { chromeAliases, themeAttrs } from '#/internal/data-attr.ts';\nimport { globMatch, useProject } from '#/internal/use-project.ts';\nimport { type SortBy, type SortDir, sortTokens } from '#/internal/sort-tokens.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 * Sort order. `'path'` (default) sorts lexicographically on the\n * dot-path; `'value'` ordering falls through to path for this block's\n * type (composite / non-numeric); `'none'` preserves project order.\n */\n sortBy?: SortBy;\n /** `'asc'` (default) or `'desc'`. */\n sortDir?: SortDir;\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,\n sample = 'The quick brown fox jumps over the lazy dog.',\n caption,\n sortBy = 'path',\n sortDir = 'asc',\n}: TypographyScaleProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n const filtered = Object.entries(resolved).filter(([path, token]) => {\n if (token.$type !== 'typography') return false;\n return globMatch(path, filter);\n });\n return sortTokens(filtered, { by: sortBy, dir: sortDir }).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, sortBy, sortDir]);\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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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["generatedCss","virtualAxes","virtualDiagnostics","sampleStyle","formatDimension","formatColor","MAX_RENDER_PX","styles","toPixels","formatDimension","formatFontFamily","formatPrimitive","formatColor"],"sources":["../src/format-color.ts","../src/internal/styles.tsx","../src/internal/channel-globals.ts","../src/contexts.ts","../src/internal/use-project.ts","../src/border-preview/BorderSample.tsx","../src/internal/data-attr.ts","../src/internal/sort-tokens.ts","../src/BorderPreview.tsx","../src/ColorPalette.tsx","../src/Diagnostics.tsx","../src/dimension-scale/DimensionBar.tsx","../src/internal/format-token-value.ts","../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/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/internal/DetailOverlay.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, ReactElement, ReactNode } from 'react';\n\n/**\n * Chrome-style primitives shared across every block. Kept as JS exports\n * for the inline-style sites that still compose them into per-block style\n * objects (e.g. TokenNavigator's `typePill` that builds on the shared\n * pill base). The pure direct-reference chrome — surface wrapper, caption,\n * empty-state — lives in `styles.css` and is applied via class names.\n */\n\nexport const MONO_STACK = 'ui-monospace, SFMono-Regular, Menlo, monospace';\n\nexport const TEXT_DEFAULT = 'var(--swatchbook-text-default, CanvasText)';\nexport const TEXT_MUTED = 'var(--swatchbook-text-muted, CanvasText)';\n\nexport const SURFACE_DEFAULT = 'var(--swatchbook-surface-default, Canvas)';\nexport const SURFACE_RAISED = 'var(--swatchbook-surface-raised, Canvas)';\nexport const SURFACE_MUTED = 'var(--swatchbook-surface-muted, rgba(128,128,128,0.15))';\n\nexport const BORDER_DEFAULT = `1px solid var(--swatchbook-border-default, rgba(128,128,128,0.2))`;\nexport const BORDER_FAINT = `1px solid var(--swatchbook-border-default, rgba(128,128,128,0.15))`;\nexport const BORDER_STRONG = `1px solid var(--swatchbook-border-default, rgba(128,128,128,0.3))`;\n\nexport const SIZE_LABEL = 11;\nexport const SIZE_META = 12;\nexport const SIZE_PILL = 10;\n\nexport const typePillStyle = {\n display: 'inline-block',\n padding: '2px 6px',\n borderRadius: 4,\n fontSize: SIZE_PILL,\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n background: SURFACE_MUTED,\n} satisfies CSSProperties;\n\n/**\n * Inner content for a block's \"nothing to render\" state. Call sites wrap\n * it in their own block wrapper (which already carries `themeAttrs`), so\n * the message itself just needs the muted type.\n */\nexport function EmptyState({ children }: { children: ReactNode }): ReactElement {\n return <div className=\"sb-block__empty\">{children}</div>;\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 diagnostics as virtualDiagnostics,\n themes,\n themesResolved,\n} from 'virtual:swatchbook/tokens';\nimport type {\n ProjectSnapshot,\n VirtualAxis,\n VirtualDiagnostic,\n VirtualTheme,\n VirtualToken,\n} 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 diagnostics: readonly VirtualDiagnostic[];\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 diagnostics: snapshot.diagnostics,\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 diagnostics: virtualDiagnostics,\n cssVarPrefix,\n };\n}\n\nexport function makeCssVar(path: string, prefix: string): string {\n // Match Terrazzo's emitter: split on `.`, kebab-case each segment (so\n // camelCase segments like `cubicBezier` become `cubic-bezier`), then join\n // with `-`. Without this the block-side reference drifts from the\n // emitted CSS var name whenever a segment carries capitals.\n const tail = path\n .split('.')\n .map((segment) => segment.replaceAll(/([a-z\\d])([A-Z])/g, '$1-$2').toLowerCase())\n .join('-');\n return prefix ? `var(--${prefix}-${tail})` : `var(--${tail})`;\n}\n\n/**\n * Match a dot-separated DTCG token path against a block `filter` prop.\n *\n * **Supported shapes** (the narrow subset we need — DTCG paths don't have\n * directories, brace expansion, or regex, so we skip a full glob engine):\n *\n * | Pattern | Matches |\n * | ------------------ | --------------------------------------------------- |\n * | `undefined` / `''` | everything |\n * | `*` or `**` | everything |\n * | `color` | exact path `color`, or any descendant `color.*` |\n * | `color.*` | any path whose fixed prefix is `color.` |\n * | `color**` | any path starting with `color` |\n *\n * Not supported (all pass through as literal segment matchers): brace\n * expansion (`{a,b}`), mid-path globs (`color.*.bg`), negation (`!foo`),\n * character classes (`[sys]`). If you hit those, pre-filter by hand.\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","import type { CSSProperties, ReactElement } from 'react';\nimport { SURFACE_RAISED } from '#/internal/styles.tsx';\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: SURFACE_RAISED,\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","/**\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 * Marker attribute set on every block wrapper. Retained as a stable hook\n * for consumer-side selectors (e.g. when a host app wants to target or\n * override block chrome without relying on hashed class names).\n */\nexport const BLOCK_ATTR = 'data-swatchbook-block';\n\n/**\n * Opt-out class that Storybook's `.sbdocs` stylesheet uses to self-exclude\n * on MDX docs pages — every `.sbdocs` house rule is wrapped in\n * `:not(.sb-unstyled, .sb-unstyled *)`, so any descendant of a `.sb-unstyled`\n * container is left alone. Stamped onto every block wrapper so blocks\n * render identically in MDX docs and regular stories without fighting\n * cascade specificity.\n */\nconst WRAPPER_CLASSES = 'sb-unstyled sb-block';\n\n/**\n * Spread helper for the common block wrapper. Returns:\n * - `data-<prefix>-theme=\"<composed theme name>\"` — so theme-keyed CSS\n * emitted by `@unpunnyfuns/swatchbook-core` resolves against this\n * subtree.\n * - `data-swatchbook-block` — stable consumer hook for targeting block\n * chrome from outside.\n * - `className=\"sb-unstyled sb-block\"` — Storybook's opt-out class so\n * MDX docs house styles self-exclude the subtree, plus `sb-block`\n * which carries the shared chrome from `internal/styles.css`.\n */\nexport function themeAttrs(prefix: string, themeName: string): Record<string, string> {\n return {\n [dataAttr(prefix, 'theme')]: themeName,\n [BLOCK_ATTR]: '',\n className: WRAPPER_CLASSES,\n };\n}\n","import Color from 'colorjs.io';\nimport type { VirtualToken } from '#/types.ts';\n\nexport type SortBy = 'path' | 'value' | 'none';\nexport type SortDir = 'asc' | 'desc';\n\nexport interface SortOptions {\n by?: SortBy;\n dir?: SortDir;\n}\n\ntype Entry = readonly [string, VirtualToken];\n\n/**\n * Stable sort for a filtered `[path, token][]` list.\n *\n * `sortBy: 'path'` — lexicographic on the dot-path (locale-aware, numeric).\n * `sortBy: 'value'` — per-`$type` ordering:\n * - `dimension` / `duration` → numeric pixels / ms (via `toMagnitude`).\n * - `fontWeight` / `opacity` / `number` / `lineHeight` → numeric.\n * - `color` → perceptual by oklch L → C → H.\n * - `fontFamily` / `strokeStyle` (string form) → lexicographic.\n * - Composites (`typography`, `shadow`, `border`, `gradient`, `transition`) →\n * fall back to path-alpha. No useful single-axis order.\n * `sortBy: 'none'` — preserve input order (still respects `sortDir: 'desc'`\n * as a reverse).\n */\nexport function sortTokens(entries: readonly Entry[], options: SortOptions = {}): Entry[] {\n const by = options.by ?? 'path';\n const dir = options.dir ?? 'asc';\n const sign = dir === 'desc' ? -1 : 1;\n\n if (by === 'none') {\n return dir === 'desc' ? [...entries].toReversed() : [...entries];\n }\n\n if (by === 'path') {\n return [...entries].toSorted(\n ([a], [b]) => sign * a.localeCompare(b, undefined, { numeric: true }),\n );\n }\n\n // by === 'value'\n return [...entries].toSorted(([aPath, aTok], [bPath, bTok]) => {\n const cmp = compareValue(aTok, bTok);\n if (cmp !== 0) return sign * cmp;\n // Stable tiebreak on path so the order is deterministic when values equal.\n return sign * aPath.localeCompare(bPath, undefined, { numeric: true });\n });\n}\n\nfunction compareValue(a: VirtualToken, b: VirtualToken): number {\n const type = a.$type;\n // When the two tokens differ in $type, fall back to type-alpha so at\n // least the mixed list clusters by type.\n if (type !== b.$type) return String(type ?? '').localeCompare(String(b.$type ?? ''));\n if (!type) return 0;\n\n if (\n type === 'dimension' ||\n type === 'duration' ||\n type === 'fontWeight' ||\n type === 'opacity' ||\n type === 'number' ||\n type === 'lineHeight'\n ) {\n const av = toMagnitude(a.$value);\n const bv = toMagnitude(b.$value);\n if (Number.isFinite(av) && Number.isFinite(bv)) return av - bv;\n if (Number.isFinite(av)) return -1;\n if (Number.isFinite(bv)) return 1;\n return 0;\n }\n\n if (type === 'color') {\n const ak = colorKey(a.$value);\n const bk = colorKey(b.$value);\n if (!ak && !bk) return 0;\n if (!ak) return 1;\n if (!bk) return -1;\n // L → C → H.\n if (ak.l !== bk.l) return ak.l - bk.l;\n if (ak.c !== bk.c) return ak.c - bk.c;\n return ak.h - bk.h;\n }\n\n if (type === 'fontFamily' || type === 'strokeStyle') {\n const as = toDisplayable(a.$value);\n const bs = toDisplayable(b.$value);\n return as.localeCompare(bs, undefined, { numeric: true });\n }\n\n // Composite types — no one-dimensional ordering. Callers should have\n // fallen through to 'path' for these; if they didn't, leave untouched.\n return 0;\n}\n\nfunction toMagnitude(v: unknown): number {\n if (typeof v === 'number') return v;\n if (v && typeof v === 'object') {\n const d = v as { value?: unknown; unit?: unknown };\n if (typeof d.value !== 'number') return Number.NaN;\n if (typeof d.unit !== 'string') return d.value;\n switch (d.unit) {\n case 'px':\n case 'ms':\n return d.value;\n case 's':\n return d.value * 1000;\n case 'rem':\n case 'em':\n return d.value * 16;\n default:\n return d.value;\n }\n }\n return Number.NaN;\n}\n\nfunction colorKey(v: unknown): { l: number; c: number; h: number } | null {\n if (!v || typeof v !== 'object') return null;\n try {\n const c = v as {\n colorSpace?: unknown;\n components?: unknown;\n channels?: unknown;\n hex?: unknown;\n };\n let source: unknown;\n if (typeof c.hex === 'string') source = c.hex;\n else if (typeof c.colorSpace === 'string') {\n const channels = Array.isArray(c.components)\n ? c.components\n : Array.isArray(c.channels)\n ? c.channels\n : undefined;\n if (!channels) return null;\n source = { space: c.colorSpace, coords: channels };\n } else return null;\n // Color.js's constructor signature is a string or PlainColorObject —\n // we've already narrowed `source` to one of those shapes above, but\n // the union ends up broader than Color.js's typed surface.\n const color = new Color(source as string);\n const [l, chroma, h] = color.to('oklch').coords;\n // Guard against NaN hue on achromatic colors so the sort stays stable.\n return {\n l: Number.isFinite(l) ? (l as number) : 0,\n c: Number.isFinite(chroma) ? (chroma as number) : 0,\n h: Number.isFinite(h) ? (h as number) : 0,\n };\n } catch {\n return null;\n }\n}\n\nfunction toDisplayable(v: unknown): string {\n if (typeof v === 'string') return v;\n if (Array.isArray(v)) return v.map(String).join(', ');\n if (v && typeof v === 'object') return JSON.stringify(v);\n return String(v ?? '');\n}\n","import type { ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport './BorderPreview.css';\nimport { BorderSample } from '#/border-preview/BorderSample.tsx';\nimport { themeAttrs } from '#/internal/data-attr.ts';\nimport { type SortBy, type SortDir, sortTokens } from '#/internal/sort-tokens.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.*\"` to scope to the semantic layer.\n */\n filter?: string;\n /** Override the caption. */\n caption?: string;\n /**\n * Sort order. `'path'` (default) sorts lexicographically on the\n * dot-path; `'value'` falls through to path (borders don't have a\n * single-axis ordering); `'none'` preserves project order.\n */\n sortBy?: SortBy;\n /** `'asc'` (default) or `'desc'`. */\n sortDir?: SortDir;\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({\n filter,\n caption,\n sortBy = 'path',\n sortDir = 'asc',\n}: BorderPreviewProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n const filtered = Object.entries(resolved).filter(([path, token]) => {\n if (token.$type !== 'border') return false;\n return globMatch(path, filter);\n });\n return sortTokens(filtered, { by: sortBy, dir: sortDir }).map(([path, token]) => ({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n value: (token.$value ?? {}) as BorderValue,\n }));\n }, [resolved, filter, cssVarPrefix, sortBy, sortDir]);\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 {...themeAttrs(cssVarPrefix, activeTheme)}>\n <div className=\"sb-block__empty\">No border tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div {...themeAttrs(cssVarPrefix, activeTheme)}>\n <div className=\"sb-block__caption\">{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} className=\"sb-border-preview__row\">\n <div className=\"sb-border-preview__meta\">\n <span className=\"sb-border-preview__path\">{row.path}</span>\n <span className=\"sb-border-preview__css-var\">{row.cssVar}</span>\n </div>\n <div className=\"sb-border-preview__sample-cell\">\n <BorderSample path={row.path} />\n </div>\n <div className=\"sb-border-preview__breakdown\">\n <span className=\"sb-border-preview__breakdown-key\">width</span>\n <span>{formatDimension(row.value.width)}</span>\n <span className=\"sb-border-preview__breakdown-key\">style</span>\n <span>{row.value.style != null ? String(row.value.style) : '—'}</span>\n <span className=\"sb-border-preview__breakdown-key\">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 './ColorPalette.css';\nimport { useColorFormat } from '#/contexts.ts';\nimport { formatColor } from '#/format-color.ts';\nimport { themeAttrs } from '#/internal/data-attr.ts';\nimport { type SortBy, type SortDir, sortTokens } from '#/internal/sort-tokens.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.*\"` to scope to the semantic layer, or `\"color.palette.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. `1` yields a single `color` group; `2` yields\n * `color.surface`, `color.text`, `color.blue`, 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.*\"` → groups at\n * `color.<family>`; `\"color.palette.blue.*\"` collapses all shades into\n * one `color.blue` group because the tokens have no deeper level.\n */\n groupBy?: number;\n /** Override the section caption. */\n caption?: string;\n /**\n * Sort order within each group.\n * - `'path'` (default) — lexicographic on the dot-path.\n * - `'value'` — perceptual ordering: oklch L → C → H (ramps read\n * light→dark, then warm→cool within each lightness band).\n * - `'none'` — preserve project iteration order.\n */\n sortBy?: SortBy;\n /** `'asc'` (default) or `'desc'`. */\n sortDir?: SortDir;\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.*` → 2; `color.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,\n groupBy,\n caption,\n sortBy = 'path',\n sortDir = 'asc',\n}: ColorPaletteProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n const colorFormat = useColorFormat();\n\n const groups = useMemo(() => {\n const filtered = Object.entries(resolved).filter(([path, token]) => {\n if (token.$type !== 'color') return false;\n return globMatch(path, filter);\n });\n const entries = sortTokens(filtered, { by: sortBy, dir: sortDir });\n\n const maxDepth = entries.reduce((m, [p]) => Math.max(m, p.split('.').length), 0);\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, sortBy, sortDir]);\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 {...themeAttrs(cssVarPrefix, activeTheme)}>\n <div className=\"sb-block__empty\">No color tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div {...themeAttrs(cssVarPrefix, activeTheme)}>\n <div className=\"sb-block__caption\">{captionText}</div>\n {groups.map(([group, swatches]) => (\n <section key={group} className=\"sb-color-palette__group\">\n <div className=\"sb-color-palette__group-header\">{group}</div>\n <div className=\"sb-color-palette__grid\">\n {swatches.map((swatch) => (\n <div key={swatch.path} className=\"sb-color-palette__card\">\n <div\n className=\"sb-color-palette__swatch\"\n style={{ background: swatch.cssVar }}\n aria-hidden\n />\n <div className=\"sb-color-palette__meta\">\n <span className=\"sb-color-palette__leaf\">{swatch.leaf}</span>\n <span className=\"sb-color-palette__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 className=\"sb-color-palette__gamut-warn\"\n >\n {' '}\n ⚠\n </span>\n )}\n </span>\n </div>\n </div>\n ))}\n </div>\n </section>\n ))}\n </div>\n );\n}\n","import cx from 'clsx';\nimport type { ReactElement } from 'react';\nimport './Diagnostics.css';\nimport { themeAttrs } from '#/internal/data-attr.ts';\nimport { useProject } from '#/internal/use-project.ts';\nimport type { VirtualDiagnostic } from '#/types.ts';\n\nexport interface DiagnosticsProps {\n /** Override the section caption. Defaults to a severity summary. */\n caption?: string;\n}\n\ntype DiagnosticSeverity = VirtualDiagnostic['severity'];\n\nconst severityLabel: Record<DiagnosticSeverity, string> = {\n error: 'ERROR',\n warn: 'WARN',\n info: 'INFO',\n};\n\nfunction summaryText(diagnostics: readonly VirtualDiagnostic[]): string {\n if (diagnostics.length === 0) return '✔ OK · no diagnostics';\n const counts = { error: 0, warn: 0, info: 0 };\n for (const d of diagnostics) counts[d.severity] += 1;\n const parts: string[] = [];\n if (counts.error > 0) parts.push(`✖ ${counts.error} error${counts.error === 1 ? '' : 's'}`);\n if (counts.warn > 0) parts.push(`⚠ ${counts.warn} warning${counts.warn === 1 ? '' : 's'}`);\n if (counts.info > 0) parts.push(`${counts.info} info`);\n return parts.join(' · ');\n}\n\nfunction diagnosticKey(d: VirtualDiagnostic, i: number): string {\n return `${d.severity}:${d.group}:${d.filename ?? ''}:${d.line ?? ''}:${d.message}:${i}`;\n}\n\nfunction summaryVariant(diagnostics: readonly VirtualDiagnostic[]): 'ok' | 'error' | 'warn' | null {\n if (diagnostics.length === 0) return 'ok';\n if (diagnostics.some((d) => d.severity === 'error')) return 'error';\n if (diagnostics.some((d) => d.severity === 'warn')) return 'warn';\n return null;\n}\n\n/**\n * Render the project's load diagnostics — parser errors, resolver warnings,\n * disabled-axes validation issues, etc. — as a collapsible list. Auto-opens\n * when the project carries errors or warnings; stays collapsed for clean\n * loads and info-only loads.\n *\n * Replaces the diagnostics section from the addon's (now-retired) Design\n * Tokens panel. Consumers compose it alongside TokenNavigator / TokenTable\n * on their own MDX pages.\n */\nexport function Diagnostics({ caption }: DiagnosticsProps = {}): ReactElement {\n const { activeTheme, cssVarPrefix, diagnostics } = useProject();\n\n const hasErrorsOrWarnings = diagnostics.some(\n (d) => d.severity === 'error' || d.severity === 'warn',\n );\n const headingText = caption ?? `Diagnostics · ${summaryText(diagnostics)}`;\n const variant = summaryVariant(diagnostics);\n\n return (\n <div {...themeAttrs(cssVarPrefix, activeTheme)} data-testid=\"diagnostics\">\n <details open={hasErrorsOrWarnings}>\n <summary\n className={cx(\n 'sb-diagnostics__summary',\n variant && `sb-diagnostics__summary--${variant}`,\n )}\n >\n {headingText}\n </summary>\n {diagnostics.length > 0 && (\n <ul className=\"sb-diagnostics__list\">\n {diagnostics.map((d, i) => (\n <li key={diagnosticKey(d, i)} className=\"sb-diagnostics__row\">\n <span\n className={cx('sb-diagnostics__label', {\n [`sb-diagnostics__label--${d.severity}`]: d.severity !== 'info',\n })}\n >\n {severityLabel[d.severity]}\n </span>\n <div>\n <div>{d.message}</div>\n {(d.group || d.filename) && (\n <div className=\"sb-diagnostics__meta\">\n {[d.group, d.filename, d.line ? `:${d.line}` : '']\n .filter(Boolean)\n .join(' · ')}\n </div>\n )}\n </div>\n </li>\n ))}\n </ul>\n )}\n </details>\n </div>\n );\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { BORDER_STRONG } from '#/internal/styles.tsx';\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(--swatchbook-accent-bg, #3b82f6)',\n borderRadius: 2,\n minWidth: 1,\n } satisfies CSSProperties,\n radiusSample: {\n width: 56,\n height: 56,\n background: 'var(--swatchbook-accent-bg, #3b82f6)',\n border: BORDER_STRONG,\n } satisfies CSSProperties,\n sizeSample: {\n background: 'var(--swatchbook-accent-bg, #3b82f6)',\n border: BORDER_STRONG,\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 ColorFormat, formatColor } from '#/format-color.ts';\n\n/**\n * Produce a single-line display string for any DTCG token `$value`,\n * respecting the active color format for color-typed tokens and the\n * color sub-values of composite types (border, shadow, gradient).\n *\n * Replaces the old `formatValue` one-shot that hex-short-circuited\n * colors and fell through to raw JSON for known composites.\n *\n * Shape by type:\n * - `color` → `formatColor(value, colorFormat)` — e.g. `#3b82f6`, `oklch(...)`, `raw` JSON.\n * - `dimension|duration` → `value + unit` — e.g. `16px`, `200ms`.\n * - `fontFamily` → string or array joined with `, `.\n * - `fontWeight` → primitive.\n * - `cubicBezier` → `cubic-bezier(a, b, c, d)`.\n * - `strokeStyle` → primitive string, or `dashed · dashArray · lineCap` when it's the object shape.\n * - `shadow` → one or more `offsetX offsetY blur spread color` layers joined with `, `.\n * - `border` → `width style color`.\n * - `transition` → `duration easing [delay]`.\n * - `typography` → `family / size / line-height / weight`.\n * - `gradient` → `stops joined with →` — compact representation, not a CSS gradient string (those live in GradientPalette's preview).\n *\n * Unknown object shapes fall through to truncated JSON.\n */\nexport function formatTokenValue(\n value: unknown,\n $type: string | undefined,\n colorFormat: ColorFormat,\n): string {\n if (value == null) return '';\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n\n switch ($type) {\n case 'color':\n return formatColor(value, colorFormat).value;\n case 'dimension':\n case 'duration':\n return formatDimension(value);\n case 'fontFamily':\n return formatFontFamily(value);\n case 'fontWeight':\n case 'lineHeight':\n case 'letterSpacing':\n case 'opacity':\n case 'number':\n return formatPrimitive(value);\n case 'cubicBezier':\n return formatCubicBezier(value);\n case 'strokeStyle':\n return formatStrokeStyle(value);\n case 'shadow':\n return formatShadow(value, colorFormat);\n case 'border':\n return formatBorder(value, colorFormat);\n case 'transition':\n return formatTransition(value);\n case 'typography':\n return formatTypography(value);\n case 'gradient':\n return formatGradient(value, colorFormat);\n default:\n return formatUnknown(value);\n }\n}\n\nfunction formatDimension(v: unknown): string {\n if (typeof v === 'string' || typeof v === 'number') return String(v);\n if (v && 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 formatUnknown(v);\n}\n\nfunction formatFontFamily(v: unknown): string {\n if (typeof v === 'string') return v;\n if (Array.isArray(v)) return v.map(String).join(', ');\n return formatUnknown(v);\n}\n\nfunction formatPrimitive(v: unknown): string {\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') return String(v);\n return formatUnknown(v);\n}\n\nfunction formatCubicBezier(v: unknown): string {\n if (Array.isArray(v) && v.length === 4) {\n return `cubic-bezier(${v.map((n) => (typeof n === 'number' ? n : 0)).join(', ')})`;\n }\n return formatUnknown(v);\n}\n\nfunction formatStrokeStyle(v: unknown): string {\n if (typeof v === 'string') return v;\n if (v && typeof v === 'object') {\n const s = v as { dashArray?: unknown; lineCap?: unknown };\n const parts: string[] = ['dashed'];\n if (Array.isArray(s.dashArray)) {\n parts.push(s.dashArray.map((n) => formatDimension(n)).join(' '));\n }\n if (typeof s.lineCap === 'string') parts.push(s.lineCap);\n return parts.join(' · ');\n }\n return formatUnknown(v);\n}\n\nfunction formatShadow(v: unknown, colorFormat: ColorFormat): string {\n const layers = Array.isArray(v) ? v : [v];\n const parts = layers.map((layer) => {\n if (!layer || typeof layer !== 'object') return formatUnknown(layer);\n const s = layer as Record<string, unknown>;\n const pieces = [\n formatDimension(s['offsetX']),\n formatDimension(s['offsetY']),\n formatDimension(s['blur']),\n formatDimension(s['spread']),\n formatColor(s['color'], colorFormat).value,\n ].filter((p) => p !== '');\n if (s['inset']) pieces.push('inset');\n return pieces.join(' ');\n });\n return parts.join(', ');\n}\n\nfunction formatBorder(v: unknown, colorFormat: ColorFormat): string {\n if (!v || typeof v !== 'object') return formatUnknown(v);\n const b = v as Record<string, unknown>;\n const width = formatDimension(b['width']);\n const style = formatPrimitive(b['style']);\n const color = formatColor(b['color'], colorFormat).value;\n return [width, style, color].filter((p) => p !== '').join(' ');\n}\n\nfunction formatTransition(v: unknown): string {\n if (!v || typeof v !== 'object') return formatUnknown(v);\n const t = v as Record<string, unknown>;\n const duration = formatDimension(t['duration']);\n const easing = formatPrimitive(t['timingFunction']);\n const delay = formatDimension(t['delay']);\n const parts = [duration, easing];\n // Only emit delay when non-zero. `0ms` / `0s` clutters the one-liner.\n if (!/^0\\D/.test(delay) && delay !== '') parts.push(delay);\n return parts.filter((p) => p !== '').join(' ');\n}\n\nfunction formatTypography(v: unknown): string {\n if (!v || typeof v !== 'object') return formatUnknown(v);\n const t = v as Record<string, unknown>;\n const family = formatFontFamily(t['fontFamily']);\n const size = formatDimension(t['fontSize']);\n const lineHeight = formatPrimitive(t['lineHeight']);\n const weight = formatPrimitive(t['fontWeight']);\n return [family, size, lineHeight, weight].filter((p) => p !== '').join(' / ');\n}\n\nfunction formatGradient(v: unknown, colorFormat: ColorFormat): string {\n if (!Array.isArray(v) || v.length === 0) return formatUnknown(v);\n const parts = v.map((stop) => {\n if (!stop || typeof stop !== 'object') return formatUnknown(stop);\n const s = stop as Record<string, unknown>;\n const position =\n typeof s['position'] === 'number' ? `${Math.round(s['position'] * 100)}%` : '?';\n const color = formatColor(s['color'], colorFormat).value;\n return `${color} ${position}`;\n });\n return parts.join(' → ');\n}\n\nfunction formatUnknown(v: unknown): string {\n if (v == null) return '';\n if (typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean') return String(v);\n try {\n return JSON.stringify(v).slice(0, 120);\n } catch {\n return String(v);\n }\n}\n","import type { ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport './DimensionScale.css';\nimport { DimensionBar, type DimensionKind } from '#/dimension-scale/DimensionBar.tsx';\nimport { themeAttrs } from '#/internal/data-attr.ts';\nimport { formatTokenValue } from '#/internal/format-token-value.ts';\nimport { type SortBy, type SortDir, sortTokens } from '#/internal/sort-tokens.ts';\nimport { 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.*\"` 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 * Sort order.\n * - `'value'` (default) — numeric by rendered pixel size (`px` / `rem` / `em`).\n * Non-convertible units (ex/ch/%) land after the convertible ones.\n * - `'path'` — lexicographic on the dot-path.\n * - `'none'` — preserve project iteration order.\n */\n sortBy?: SortBy;\n /** `'asc'` (default) or `'desc'`. */\n sortDir?: SortDir;\n}\n\nconst MAX_RENDER_PX = 480;\n\ninterface Row {\n path: string;\n cssVar: string;\n displayValue: string;\n pxValue: number;\n capped: boolean;\n}\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,\n kind = 'length',\n caption,\n sortBy = 'value',\n sortDir = 'asc',\n}: DimensionScaleProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n const filtered = Object.entries(resolved).filter(([path, token]) => {\n if (token.$type !== 'dimension') return false;\n return globMatch(path, filter);\n });\n return sortTokens(filtered, { by: sortBy, dir: sortDir }).map(([path, token]) => {\n const pxValue = toPixels(token.$value);\n return {\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n displayValue: formatTokenValue(token.$value, token.$type, 'raw'),\n pxValue,\n capped: Number.isFinite(pxValue) && pxValue > MAX_RENDER_PX,\n };\n });\n }, [resolved, filter, cssVarPrefix, sortBy, sortDir]);\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 {...themeAttrs(cssVarPrefix, activeTheme)}>\n <div className=\"sb-block__empty\">No dimension tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div {...themeAttrs(cssVarPrefix, activeTheme)}>\n <div className=\"sb-block__caption\">{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} className=\"sb-dimension-scale__row\">\n <div className=\"sb-dimension-scale__meta\">\n <span className=\"sb-dimension-scale__path\">{row.path}</span>\n <span className=\"sb-dimension-scale__specs\">{row.displayValue}</span>\n </div>\n <div className=\"sb-dimension-scale__visual-cell\">\n <DimensionBar path={row.path} kind={kind} />\n {row.capped && (\n <span className=\"sb-dimension-scale__cap\">capped at {MAX_RENDER_PX}px</span>\n )}\n </div>\n <span className=\"sb-dimension-scale__css-var\">{row.cssVar}</span>\n </div>\n ))}\n </div>\n );\n}\n","import type { ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport './FontFamilySample.css';\nimport { themeAttrs } from '#/internal/data-attr.ts';\nimport { globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\nimport { type SortBy, type SortDir, sortTokens } from '#/internal/sort-tokens.ts';\n\nexport interface FontFamilySampleProps {\n /**\n * Token-path filter. Defaults to every `fontFamily` token. Use e.g.\n * `\"font.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 * Sort order. `'path'` (default) sorts lexicographically on the\n * dot-path; `'value'` ordering falls through to path for this block's\n * type (composite / non-numeric); `'none'` preserves project order.\n */\n sortBy?: SortBy;\n /** `'asc'` (default) or `'desc'`. */\n sortDir?: SortDir;\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,\n sample = 'The quick brown fox jumps over the lazy dog.',\n caption,\n sortBy = 'path',\n sortDir = 'asc',\n}: FontFamilySampleProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n const filtered = Object.entries(resolved).filter(([path, token]) => {\n if (token.$type !== 'fontFamily') return false;\n return globMatch(path, filter);\n });\n return sortTokens(filtered, { by: sortBy, dir: sortDir }).map(([path, token]) => ({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n stack: stackString(token.$value),\n }));\n }, [resolved, filter, cssVarPrefix, sortBy, sortDir]);\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 {...themeAttrs(cssVarPrefix, activeTheme)}>\n <div className=\"sb-block__empty\">No fontFamily tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div {...themeAttrs(cssVarPrefix, activeTheme)}>\n <div className=\"sb-block__caption\">{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} className=\"sb-font-family-sample__row\">\n <div className=\"sb-font-family-sample__meta\">\n <span className=\"sb-font-family-sample__path\">{row.path}</span>\n <span className=\"sb-font-family-sample__stack\">{row.stack}</span>\n </div>\n <div className=\"sb-font-family-sample__sample\" style={{ fontFamily: row.cssVar }}>\n {sample}\n </div>\n <span className=\"sb-font-family-sample__css-var\">{row.cssVar}</span>\n </div>\n ))}\n </div>\n );\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport './FontWeightScale.css';\nimport { themeAttrs } from '#/internal/data-attr.ts';\nimport { type SortBy, type SortDir, sortTokens } from '#/internal/sort-tokens.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.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 * Sort order.\n * - `'value'` (default) — ascending numeric by weight (100 → 900).\n * - `'path'` — lexicographic on the dot-path.\n * - `'none'` — preserve project iteration order.\n */\n sortBy?: SortBy;\n /** `'asc'` (default) or `'desc'`. */\n sortDir?: SortDir;\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,\n sample = 'Aa',\n caption,\n sortBy = 'value',\n sortDir = 'asc',\n}: FontWeightScaleProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n const filtered = Object.entries(resolved).filter(([path, token]) => {\n if (token.$type !== 'fontWeight') return false;\n return globMatch(path, filter);\n });\n return sortTokens(filtered, { by: sortBy, dir: sortDir }).map(([path, token]) => ({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n display: token.$value == null ? '' : String(token.$value),\n weight: toWeight(token.$value),\n }));\n }, [resolved, filter, cssVarPrefix, sortBy, sortDir]);\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 {...themeAttrs(cssVarPrefix, activeTheme)}>\n <div className=\"sb-block__empty\">No fontWeight tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div {...themeAttrs(cssVarPrefix, activeTheme)}>\n <div className=\"sb-block__caption\">{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} className=\"sb-font-weight-scale__row\">\n <div className=\"sb-font-weight-scale__meta\">\n <span className=\"sb-font-weight-scale__path\">{row.path}</span>\n <span className=\"sb-font-weight-scale__value\">{row.display}</span>\n </div>\n <div\n className=\"sb-font-weight-scale__sample\"\n style={{ fontWeight: row.cssVar as unknown as CSSProperties['fontWeight'] }}\n >\n {sample}\n </div>\n <span className=\"sb-font-weight-scale__css-var\">{row.cssVar}</span>\n </div>\n ))}\n </div>\n );\n}\n","import type { ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport './GradientPalette.css';\nimport { themeAttrs } from '#/internal/data-attr.ts';\nimport { type SortBy, type SortDir, sortTokens } from '#/internal/sort-tokens.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.*\"` or `\"gradient.accent\"` to scope.\n */\n filter?: string;\n /** Override the caption. */\n caption?: string;\n /**\n * Sort order. `'path'` (default) sorts lexicographically on the\n * dot-path; `'value'` falls through to path (gradients don't have\n * a single-axis ordering); `'none'` preserves project order.\n */\n sortBy?: SortBy;\n /** `'asc'` (default) or `'desc'`. */\n sortDir?: SortDir;\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,\n caption,\n sortBy = 'path',\n sortDir = 'asc',\n}: GradientPaletteProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n const filtered = Object.entries(resolved).filter(([path, token]) => {\n if (token.$type !== 'gradient') return false;\n return globMatch(path, filter);\n });\n return sortTokens(filtered, { by: sortBy, dir: sortDir }).map(([path, token]) => ({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n stops: asStops(token.$value),\n }));\n }, [resolved, filter, cssVarPrefix, sortBy, sortDir]);\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 {...themeAttrs(cssVarPrefix, activeTheme)}>\n <div className=\"sb-block__empty\">No gradient tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div {...themeAttrs(cssVarPrefix, activeTheme)}>\n <div className=\"sb-block__caption\">{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} className=\"sb-gradient-palette__row\">\n <div className=\"sb-gradient-palette__meta\">\n <span className=\"sb-gradient-palette__path\">{row.path}</span>\n <span className=\"sb-gradient-palette__css-var\">{row.cssVar}</span>\n </div>\n <div\n className=\"sb-gradient-palette__sample\"\n style={{ background: `linear-gradient(to right, ${row.cssVar})` }}\n aria-hidden\n />\n <div className=\"sb-gradient-palette__stops\">\n {row.stops.map((stop, i) => (\n <div key={stopKey(row.path, stop, i)} className=\"sb-gradient-palette__stop-row\">\n <span\n className=\"sb-gradient-palette__stop-swatch\"\n style={{ background: stopCssColor(stop) }}\n aria-hidden\n />\n <span>{stopCssColor(stop)}</span>\n <span className=\"sb-gradient-palette__stop-position\">\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 { SURFACE_MUTED, TEXT_MUTED } from '#/internal/styles.tsx';\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: SURFACE_MUTED,\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(--swatchbook-accent-bg, #3b82f6)',\n } satisfies CSSProperties,\n reducedMotion: {\n fontSize: 11,\n color: TEXT_MUTED,\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 cx from 'clsx';\nimport type { ReactElement } from 'react';\nimport { useMemo, useState } from 'react';\nimport './MotionPreview.css';\nimport { themeAttrs } from '#/internal/data-attr.ts';\nimport { usePrefersReducedMotion } from '#/internal/prefers-reduced-motion.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. `\"transition.*\"` 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\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 {...themeAttrs(cssVarPrefix, activeTheme)}>\n <div className=\"sb-block__empty\">No motion tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div {...themeAttrs(cssVarPrefix, activeTheme)}>\n <div className=\"sb-block__caption\">{captionText}</div>\n <div className=\"sb-motion-preview__controls\">\n <span className=\"sb-motion-preview__control-label\">Speed</span>\n {SPEEDS.map((s) => (\n <button\n key={s}\n type=\"button\"\n className={cx('sb-motion-preview__speed-btn', {\n 'sb-motion-preview__speed-btn--active': s === speed,\n })}\n onClick={() => setSpeed(s)}\n >\n {s}×\n </button>\n ))}\n <button\n type=\"button\"\n className=\"sb-motion-preview__replay-btn\"\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} className=\"sb-motion-preview__row\">\n <div className=\"sb-motion-preview__meta\">\n <span className=\"sb-motion-preview__path\">{row.path}</span>\n <span className=\"sb-motion-preview__specs\">{formatSpec(row)}</span>\n </div>\n <MotionSample path={row.path} speed={speed} runKey={run} />\n <span className=\"sb-motion-preview__css-var\">{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 { BORDER_FAINT, SURFACE_RAISED } from '#/internal/styles.tsx';\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: SURFACE_RAISED,\n border: BORDER_FAINT,\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 cx from 'clsx';\nimport type { ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport './ShadowPreview.css';\nimport { themeAttrs } from '#/internal/data-attr.ts';\nimport { type SortBy, type SortDir, sortTokens } from '#/internal/sort-tokens.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.*\"` to scope to the semantic layer.\n */\n filter?: string;\n /** Override the caption. */\n caption?: string;\n /**\n * Sort order. `'path'` (default) sorts lexicographically on the\n * dot-path; `'value'` falls through to path (shadows don't have a\n * single-axis ordering); `'none'` preserves project order.\n */\n sortBy?: SortBy;\n /** `'asc'` (default) or `'desc'`. */\n sortDir?: SortDir;\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({\n filter,\n caption,\n sortBy = 'path',\n sortDir = 'asc',\n}: ShadowPreviewProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n const filtered = Object.entries(resolved).filter(([path, token]) => {\n if (token.$type !== 'shadow') return false;\n return globMatch(path, filter);\n });\n return sortTokens(filtered, { by: sortBy, dir: sortDir }).map(([path, token]) => ({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n layers: asLayers(token.$value),\n }));\n }, [resolved, filter, cssVarPrefix, sortBy, sortDir]);\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 {...themeAttrs(cssVarPrefix, activeTheme)}>\n <div className=\"sb-block__empty\">No shadow tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div {...themeAttrs(cssVarPrefix, activeTheme)}>\n <div className=\"sb-block__caption\">{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} className=\"sb-shadow-preview__row\">\n <div className=\"sb-shadow-preview__meta\">\n <span className=\"sb-shadow-preview__path\">{row.path}</span>\n <span className=\"sb-shadow-preview__css-var\">{row.cssVar}</span>\n </div>\n <div className=\"sb-shadow-preview__sample-cell\">\n <ShadowSample path={row.path} />\n </div>\n <div className=\"sb-shadow-preview__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}`} className=\"sb-shadow-preview__breakdown-key\">\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 className=\"sb-shadow-preview__layer\">\n <div className=\"sb-shadow-preview__layer-header\">\n layer {index + 1} of {total}\n </div>\n <div className={cx('sb-shadow-preview__breakdown', 'sb-shadow-preview__layer-breakdown')}>\n {renderLayer(layer)}\n </div>\n </div>\n );\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport './StrokeStyleSample.css';\nimport { themeAttrs } from '#/internal/data-attr.ts';\nimport { formatTokenValue } from '#/internal/format-token-value.ts';\nimport { globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\nimport { type SortBy, type SortDir, sortTokens } from '#/internal/sort-tokens.ts';\n\nexport interface StrokeStyleSampleProps {\n /**\n * Token-path filter. Defaults to every `strokeStyle` token. Use e.g.\n * `\"stroke.style.*\"` to scope to the ref layer.\n */\n filter?: string;\n /** Override the caption. */\n caption?: string;\n /**\n * Sort order. `'path'` (default) sorts lexicographically on the\n * dot-path; `'value'` ordering falls through to path for this block's\n * type (composite / non-numeric); `'none'` preserves project order.\n */\n sortBy?: SortBy;\n /** `'asc'` (default) or `'desc'`. */\n sortDir?: SortDir;\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\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,\n caption,\n sortBy = 'path',\n sortDir = 'asc',\n}: StrokeStyleSampleProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n const filtered = Object.entries(resolved).filter(([path, token]) => {\n if (token.$type !== 'strokeStyle') return false;\n return globMatch(path, filter);\n });\n return sortTokens(filtered, { by: sortBy, dir: sortDir }).map(([path, token]) => ({\n path,\n cssVar: makeCssVar(path, cssVarPrefix),\n displayValue: formatTokenValue(token.$value, token.$type, 'raw'),\n cssStyle: extractCssStyle(token.$value),\n }));\n }, [resolved, filter, cssVarPrefix, sortBy, sortDir]);\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 {...themeAttrs(cssVarPrefix, activeTheme)}>\n <div className=\"sb-block__empty\">No strokeStyle tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div {...themeAttrs(cssVarPrefix, activeTheme)}>\n <div className=\"sb-block__caption\">{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} className=\"sb-stroke-style-sample__row\">\n <div className=\"sb-stroke-style-sample__meta\">\n <span className=\"sb-stroke-style-sample__path\">{row.path}</span>\n <span className=\"sb-stroke-style-sample__value\">{row.displayValue}</span>\n </div>\n {row.cssStyle ? (\n <div\n className=\"sb-stroke-style-sample__line\"\n style={{\n borderTopStyle: row.cssStyle as CSSProperties['borderTopStyle'],\n }}\n aria-hidden\n />\n ) : (\n <span className=\"sb-stroke-style-sample__object-fallback\">\n Object-form (dashArray + lineCap) — no pure CSS `border-style` equivalent.\n </span>\n )}\n <span className=\"sb-stroke-style-sample__css-var\">{row.cssVar}</span>\n </div>\n ))}\n </div>\n );\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 { 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 className=\"sb-token-detail__section-header\">Alias chain</div>\n <div className=\"sb-token-detail__chain\">\n {chain.map((step, i) => (\n <span key={step} className=\"sb-token-detail__chain\">\n <span className=\"sb-token-detail__chain-node\">{step}</span>\n {i < chain.length - 1 && <span className=\"sb-token-detail__arrow\">→</span>}\n </span>\n ))}\n </div>\n </>\n );\n}\n","import type { ReactElement } from 'react';\nimport { useMemo } from 'react';\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 className=\"sb-token-detail__section-header\">Aliased by</div>\n <ul className=\"sb-token-detail__aliased-by-list\">\n {tree.map((node) => (\n <AliasedByRow key={node.path} node={node} depth={0} />\n ))}\n </ul>\n {truncated && (\n <div className=\"sb-token-detail__aliased-by-truncated\">\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 className=\"sb-token-detail__aliased-by-row\" style={{ paddingLeft: depth * 16 }}>\n <span className=\"sb-token-detail__chain-node\">{node.path}</span>\n </div>\n {node.children.length > 0 && (\n <ul className=\"sb-token-detail__aliased-by-list\">\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 } from '#/format-color.ts';\nimport { dataAttr } from '#/internal/data-attr.ts';\nimport { formatTokenValue } from '#/internal/format-token-value.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 tokenType = token?.$type;\n const isColor = tokenType === 'color';\n const formatFn = (t: DetailToken | undefined): string => valueFor(t, tokenType, 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 className=\"sb-token-detail__section-header\">Values across axes</div>\n <table className=\"sb-token-detail__theme-table\" data-testid=\"token-detail-values\">\n <tbody>\n <tr className=\"sb-token-detail__theme-row\">\n <td className=\"sb-token-detail__theme-cell\" data-testid=\"token-detail-constant\">\n {isColor && (\n <span\n className=\"sb-token-detail__swatch\"\n style={{ background: cssVar }}\n aria-hidden\n />\n )}\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 className=\"sb-token-detail__section-header\">Varies with {axisName}</div>\n <table className=\"sb-token-detail__theme-table\" data-testid=\"token-detail-values\">\n <tbody>\n {contextValues.map((row) => (\n <tr\n key={row.ctx}\n className=\"sb-token-detail__theme-row\"\n data-axis={axisName}\n data-context={row.ctx}\n >\n <td className=\"sb-token-detail__theme-cell\" style={{ width: '30%' }}>\n {row.ctx}\n </td>\n <td className=\"sb-token-detail__theme-cell\">\n {isColor && row.themeName && (\n <span\n className=\"sb-token-detail__swatch\"\n style={{ 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 className=\"sb-token-detail__section-header\">\n Varies with {variance.varyingAxes.join(' × ')}\n </div>\n <table className=\"sb-token-detail__theme-table\" data-testid=\"token-detail-values\">\n <thead>\n <tr className=\"sb-token-detail__theme-row\">\n <th className=\"sb-token-detail__theme-cell\" style={{ textAlign: 'left', opacity: 0.7 }}>\n {rowAxis.name} \\ {colAxis.name}\n </th>\n {colAxis.contexts.map((col) => (\n <th\n key={col}\n className=\"sb-token-detail__theme-cell\"\n style={{ textAlign: 'left', opacity: 0.7 }}\n >\n {col}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rowAxis.contexts.map((row) => (\n <tr key={row} className=\"sb-token-detail__theme-row\">\n <td className=\"sb-token-detail__theme-cell\">{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\n key={col}\n className=\"sb-token-detail__theme-cell\"\n data-row={row}\n data-col={col}\n >\n {isColor && name && (\n <span\n className=\"sb-token-detail__swatch\"\n style={{ 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 className=\"sb-token-detail__aliased-by-truncated\" style={{ 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(\n token: DetailToken | undefined,\n $type: string | undefined,\n format: ColorFormat,\n): string {\n if (!token) return '—';\n return formatTokenValue(token.$value, $type, format);\n}\n\n/**\n * Stable key for variance detection — compares structural equality across\n * themes, not a display string. We pin `raw` so color representation\n * changes (the toolbar's format dropdown) don't artificially make axes\n * look like they vary.\n */\nfunction varianceKey(\n themesResolved: Record<string, Record<string, DetailToken>>,\n themeName: string,\n path: string,\n): string {\n const t = themesResolved[themeName]?.[path];\n if (!t) return '';\n return JSON.stringify(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, varianceKey(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 { useColorFormat } from '#/contexts.ts';\nimport { type ColorFormat, formatColor } from '#/format-color.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 const colorFormat = useColorFormat();\n if (!token) return null;\n return (\n <CompositeBreakdownContent\n type={token.$type}\n rawValue={token.$value}\n colorFormat={colorFormat}\n />\n );\n}\n\nexport function CompositeBreakdownContent({\n type,\n rawValue,\n colorFormat,\n}: {\n type: string | undefined;\n rawValue: unknown;\n colorFormat: ColorFormat;\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', formatColorSubValue(v['color'], colorFormat)],\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 className=\"sb-token-detail__breakdown-section\">\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 && (\n <div className=\"sb-token-detail__breakdown-layer-header\">Layer {i + 1}</div>\n )}\n <KeyValueRow label=\"color\" value={formatColorSubValue(v['color'], colorFormat)} />\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 className=\"sb-token-detail__breakdown-section\">\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={formatColorSubValue(v['color'], colorFormat)}\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 className=\"sb-token-detail__breakdown-section\">\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 className=\"sb-token-detail__breakdown-key\">{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\n/**\n * Route sub-value colors through `formatColor` so they honor the active\n * color-format dropdown, just like the standalone `<ColorPalette />` and\n * `<TokenDetail />` top-line do. Returns `null` for a missing field so\n * the key/value row drops out entirely.\n */\nfunction formatColorSubValue(v: unknown, format: ColorFormat): string | null {\n if (v == null) return null;\n return formatColor(v, format).value;\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 { 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 className=\"sb-token-detail__typography-sample\"\n style={{\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 (\n <div className=\"sb-token-detail__shadow-sample\" style={{ boxShadow: cssVar }} aria-hidden />\n );\n }\n if (type === 'border') {\n return (\n <div className=\"sb-token-detail__border-sample\" style={{ border: cssVar }} aria-hidden />\n );\n }\n if (type === 'transition') {\n return <TransitionSample transition={cssVar} />;\n }\n if (type === 'dimension') {\n return (\n <div className=\"sb-token-detail__dimension-track\">\n <div className=\"sb-token-detail__dimension-bar\" style={{ 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 (\n <div className=\"sb-token-detail__font-family-sample\" style={{ fontFamily: cssVar }}>\n {PANGRAM}\n </div>\n );\n }\n if (type === 'fontWeight') {\n return (\n <div\n className=\"sb-token-detail__font-weight-sample\"\n style={{ fontWeight: cssVar as unknown as number }}\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 className=\"sb-token-detail__gradient-sample\"\n style={{ 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 className=\"sb-token-detail__color-swatch-row\" aria-hidden>\n <div className=\"sb-token-detail__color-swatch-light\" style={{ background: cssVar }} />\n <div className=\"sb-token-detail__color-swatch-dark\" style={{ 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 className=\"sb-token-detail__stroke-style-line\"\n style={{ borderTopStyle: value as CSSProperties['borderTopStyle'] }}\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 className=\"sb-token-detail__stroke-style-fallback\">\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 className=\"sb-token-detail__stroke-style-svg\"\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 (\n <div className=\"sb-token-detail__stroke-style-fallback\">\n strokeStyle value could not be previewed.\n </div>\n );\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 className=\"sb-token-detail__reduced-motion\">\n Animation suppressed by `prefers-reduced-motion: reduce`.\n </div>\n );\n }\n\n return (\n <div className=\"sb-token-detail__motion-track\">\n <div\n className=\"sb-token-detail__motion-ball\"\n style={{\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 { 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 className=\"sb-token-detail__section-header\">Consumer output</div>\n {tupleLabel && (\n <div className=\"sb-token-detail__tuple-indicator\">\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 className=\"sb-token-detail__consumer-row\">\n <span className=\"sb-token-detail__consumer-row-label\">{label}</span>\n <code className=\"sb-token-detail__consumer-row-value\" 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 className=\"sb-token-detail__consumer-row-copy\"\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 { 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 className=\"sb-token-detail__missing\">\n Token <code>{path}</code> not found in theme <strong>{activeTheme}</strong>.\n </div>\n );\n }\n\n return (\n <>\n <h3 className=\"sb-token-detail__heading\">{heading ?? path}</h3>\n <div className=\"sb-token-detail__subline\">\n {token.$type && <span className=\"sb-token-detail__type-pill\">{token.$type}</span>}\n <span>{cssVar}</span>\n </div>\n {token.$description && <p className=\"sb-token-detail__description\">{token.$description}</p>}\n </>\n );\n}\n","import type { ReactElement } from 'react';\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 className=\"sb-token-detail__section-header\">Usage</div>\n <code className=\"sb-token-detail__snippet\">{`color: ${cssVar};`}</code>\n </>\n );\n}\n","import cx from 'clsx';\nimport type { ReactElement } from 'react';\nimport { useColorFormat } from '#/contexts.ts';\nimport { formatColor } from '#/format-color.ts';\nimport { themeAttrs } from '#/internal/data-attr.ts';\nimport { formatTokenValue } from '#/internal/format-token-value.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 { TokenHeader } from '#/token-detail/TokenHeader.tsx';\nimport { TokenUsageSnippet } from '#/token-detail/TokenUsageSnippet.tsx';\nimport { useTokenDetailData } from '#/token-detail/internal.ts';\nimport '#/token-detail/styles.css';\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 const theme = themeAttrs(cssVarPrefix, activeTheme);\n\n if (!token) {\n return (\n <div {...theme} className={cx(theme['className'], 'sb-token-detail')}>\n <div className=\"sb-token-detail__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 gamut = isColor ? formatColor(token.$value, colorFormat) : null;\n const value = formatTokenValue(token.$value, token.$type, colorFormat);\n const outOfGamut = gamut?.outOfGamut ?? false;\n\n return (\n <div {...theme} className={cx(theme['className'], 'sb-token-detail')}>\n <TokenHeader path={path} {...(heading !== undefined && { heading })} />\n\n <div className=\"sb-token-detail__section-header\">Resolved value · {activeTheme}</div>\n <CompositePreview path={path} />\n <CompositeBreakdown path={path} />\n <div className=\"sb-token-detail__chain\">\n {isColor && (\n <span className=\"sb-token-detail__swatch\" style={{ background: cssVar }} aria-hidden />\n )}\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 { ReactElement } from 'react';\nimport { useEffect } from 'react';\nimport './DetailOverlay.css';\nimport { TokenDetail } from '#/TokenDetail.tsx';\n\n/**\n * Slide-over that wraps `<TokenDetail>`. Shared between `<TokenNavigator />`\n * and `<TokenTable />` so both land on the same opener and the same styling.\n *\n * Dismisses on backdrop click, Escape, and the close button. `role=\"dialog\"`\n * + `aria-modal=\"true\"` hints to AT that focus is trapped here; actual focus\n * management is tracked in the open-issue #253.\n */\n\nexport interface DetailOverlayProps {\n path: string;\n onClose(): void;\n testId?: string;\n}\n\nexport function DetailOverlay({\n path,\n onClose,\n testId = 'swatchbook-overlay',\n}: 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 className=\"sb-detail-overlay__backdrop\"\n onClick={onClose}\n role=\"presentation\"\n data-testid={testId}\n >\n <div\n className=\"sb-detail-overlay__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 className=\"sb-detail-overlay__close\"\n onClick={onClose}\n aria-label=\"Close\"\n data-testid={`${testId}-close`}\n >\n ×\n </button>\n <TokenDetail path={path} />\n </div>\n </div>\n );\n}\n","import type { KeyboardEvent, ReactElement } from 'react';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\nimport './TokenNavigator.css';\nimport { BorderSample } from '#/border-preview/BorderSample.tsx';\nimport { useColorFormat } from '#/contexts.ts';\nimport { DimensionBar } from '#/dimension-scale/DimensionBar.tsx';\nimport { themeAttrs } from '#/internal/data-attr.ts';\nimport { DetailOverlay } from '#/internal/DetailOverlay.tsx';\nimport { formatTokenValue } from '#/internal/format-token-value.ts';\nimport { EmptyState } from '#/internal/styles.tsx';\nimport { makeCssVar, useProject } from '#/internal/use-project.ts';\nimport { MotionSample } from '#/motion-preview/MotionSample.tsx';\nimport { ShadowSample } from '#/shadow-preview/ShadowSample.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\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 {...themeAttrs(cssVarPrefix, activeTheme)}>\n <EmptyState>\n {root ? `No tokens under \"${root}\".` : 'No tokens in the active theme.'}\n </EmptyState>\n </div>\n );\n }\n\n return (\n <div {...themeAttrs(cssVarPrefix, activeTheme)}>\n <div className=\"sb-token-navigator__caption\">\n {root ? `Tokens under ${root}` : 'Token graph'} · {activeTheme}\n </div>\n <ul className=\"sb-token-navigator__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\n path={selectedPath}\n onClose={() => setSelectedPath(null)}\n testId=\"token-navigator-overlay\"\n />\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 className=\"sb-token-navigator__group-row\"\n onClick={() => onToggle(node.path)}\n onKeyDown={onKey}\n data-path={node.path}\n data-testid=\"token-navigator-group\"\n >\n <span className=\"sb-token-navigator__caret\" aria-hidden>\n {isOpen ? '▾' : '▸'}\n </span>\n <span>{node.segment}</span>\n <span className=\"sb-token-navigator__count\">{countLeaves(node)}</span>\n </div>\n {isOpen && (\n <ul className=\"sb-token-navigator__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 className=\"sb-token-navigator__leaf-row\"\n onClick={() => onLeafClick(node.path)}\n onKeyDown={onKey}\n data-path={node.path}\n data-testid=\"token-navigator-leaf\"\n >\n <span className=\"sb-token-navigator__caret\" aria-hidden>\n •\n </span>\n <span className=\"sb-token-navigator__tail\">{node.segment}</span>\n {type && <span className=\"sb-token-navigator__type-pill\">{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 return (\n <span className=\"sb-token-navigator__preview-box\">\n <span className=\"sb-token-navigator__value\">\n {formatTokenValue(token.$value, type, colorFormat)}\n </span>\n <span\n className=\"sb-token-navigator__color-swatch\"\n style={{ background: cssVar }}\n aria-hidden\n />\n </span>\n );\n }\n if (type === 'dimension') {\n return (\n <span className=\"sb-token-navigator__preview-box\">\n <span className=\"sb-token-navigator__value\">\n {formatTokenValue(token.$value, type, colorFormat)}\n </span>\n <span className=\"sb-token-navigator__preview-dimension\">\n <DimensionBar path={path} kind=\"length\" />\n </span>\n </span>\n );\n }\n if (type === 'shadow') {\n return (\n <span className=\"sb-token-navigator__preview-box\">\n <span className=\"sb-token-navigator__preview-scaled\">\n <ShadowSample path={path} />\n </span>\n </span>\n );\n }\n if (type === 'border') {\n return (\n <span className=\"sb-token-navigator__preview-box\">\n <span className=\"sb-token-navigator__preview-scaled\">\n <BorderSample path={path} />\n </span>\n </span>\n );\n }\n if (type === 'transition' || type === 'duration' || type === 'cubicBezier') {\n return (\n <span className=\"sb-token-navigator__preview-box\">\n <span className=\"sb-token-navigator__preview-motion\">\n <MotionSample path={path} />\n </span>\n </span>\n );\n }\n\n return (\n <span className=\"sb-token-navigator__preview-box\">\n <span className=\"sb-token-navigator__value\">\n {formatTokenValue(token.$value, type, colorFormat)}\n </span>\n </span>\n );\n}\n","import cx from 'clsx';\nimport type { ReactElement } from 'react';\nimport { useCallback, useMemo, useState } from 'react';\nimport './TokenTable.css';\nimport { useColorFormat } from '#/contexts.ts';\nimport { formatColor } from '#/format-color.ts';\nimport { themeAttrs } from '#/internal/data-attr.ts';\nimport { DetailOverlay } from '#/internal/DetailOverlay.tsx';\nimport { formatTokenValue } from '#/internal/format-token-value.ts';\nimport { type SortBy, type SortDir, sortTokens } from '#/internal/sort-tokens.ts';\nimport { globMatch, makeCssVar, useProject } from '#/internal/use-project.ts';\n\nexport interface TokenTableProps {\n /**\n * Token-path filter. `\"color.*\"` matches every `color.…` 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 /** Override the table caption. */\n caption?: string;\n /**\n * Sort order.\n * - `'path'` (default) — lexicographic on the dot-path.\n * - `'value'` — per-`$type`: numeric for `dimension` / `duration` /\n * `fontWeight`; perceptual (oklch L → C → H) for `color`; lexicographic\n * for `fontFamily` / `strokeStyle`. Composite types fall through to\n * path order.\n * - `'none'` — preserve project iteration order.\n */\n sortBy?: SortBy;\n /** `'asc'` (default) or `'desc'`. */\n sortDir?: SortDir;\n /**\n * Called with the clicked row's dot-path. When set, the built-in\n * `<TokenDetail>` slide-over is suppressed — the consumer owns the\n * follow-up UI (inline panel, drill-down route, …).\n */\n onSelect?(path: string): void;\n}\n\nexport function TokenTable({\n filter,\n type,\n caption,\n sortBy = 'path',\n sortDir = 'asc',\n onSelect,\n}: TokenTableProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n const colorFormat = useColorFormat();\n const [selectedPath, setSelectedPath] = useState<string | null>(null);\n\n const rows = useMemo(() => {\n const filtered = Object.entries(resolved).filter(([path, token]) => {\n if (!globMatch(path, filter)) return false;\n if (type && token.$type !== type) return false;\n return true;\n });\n const entries = sortTokens(filtered, { by: sortBy, dir: sortDir });\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: formatTokenValue(token.$value, token.$type, colorFormat),\n outOfGamut: color?.outOfGamut ?? false,\n cssVar: makeCssVar(path, cssVarPrefix),\n isColor,\n };\n });\n }, [resolved, filter, type, cssVarPrefix, colorFormat, sortBy, sortDir]);\n\n const handleRowClick = useCallback(\n (path: string) => {\n if (onSelect) onSelect(path);\n else setSelectedPath(path);\n },\n [onSelect],\n );\n\n const captionText =\n caption ??\n `${rows.length} token${rows.length === 1 ? '' : 's'}${\n filter ? ` matching \\`${filter}\\`` : ''\n }${type ? ` · $type=${type}` : ''} · ${activeTheme}`;\n\n if (rows.length === 0) {\n return (\n <div {...themeAttrs(cssVarPrefix, activeTheme)}>\n <div className=\"sb-block__empty\">No tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div {...themeAttrs(cssVarPrefix, activeTheme)}>\n <table className=\"sb-token-table__table\">\n <caption className=\"sb-token-table__caption\">{captionText}</caption>\n <thead>\n <tr>\n <th className={cx('sb-token-table__th', 'sb-token-table__th--path')}>Path</th>\n <th className={cx('sb-token-table__th', 'sb-token-table__th--value')}>Value</th>\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr\n key={row.path}\n className=\"sb-token-table__row\"\n onClick={() => handleRowClick(row.path)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleRowClick(row.path);\n }\n }}\n tabIndex={0}\n aria-label={`Inspect ${row.path}`}\n data-testid=\"token-table-row\"\n data-path={row.path}\n >\n <td className={cx('sb-token-table__td', 'sb-token-table__path')}>{row.path}</td>\n <td className=\"sb-token-table__td\">\n <span className=\"sb-token-table__value-cell\">\n {row.type && <span className=\"sb-token-table__type-pill\">{row.type}</span>}\n {row.isColor && (\n <span\n className=\"sb-token-table__swatch\"\n style={{ background: row.cssVar }}\n aria-hidden\n />\n )}\n <span\n className=\"sb-token-table__value-text\"\n title={row.value}\n data-testid=\"token-table-value\"\n >\n {row.value}\n </span>\n {row.outOfGamut && (\n <span\n title=\"Out of sRGB gamut for this format\"\n aria-label=\"out of gamut\"\n className=\"sb-token-table__gamut-warn\"\n >\n ⚠\n </span>\n )}\n </span>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n\n {selectedPath !== null && (\n <DetailOverlay\n path={selectedPath}\n onClose={() => setSelectedPath(null)}\n testId=\"token-table-overlay\"\n />\n )}\n </div>\n );\n}\n","import type { CSSProperties, ReactElement } from 'react';\nimport { useMemo } from 'react';\nimport './TypographyScale.css';\nimport { themeAttrs } from '#/internal/data-attr.ts';\nimport { globMatch, useProject } from '#/internal/use-project.ts';\nimport { type SortBy, type SortDir, sortTokens } from '#/internal/sort-tokens.ts';\n\nexport interface TypographyScaleProps {\n /**\n * Token-path filter. Defaults to every `typography` token. Use e.g.\n * `\"typography.*\"` 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 * Sort order. `'path'` (default) sorts lexicographically on the\n * dot-path; `'value'` ordering falls through to path for this block's\n * type (composite / non-numeric); `'none'` preserves project order.\n */\n sortBy?: SortBy;\n /** `'asc'` (default) or `'desc'`. */\n sortDir?: SortDir;\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,\n sample = 'The quick brown fox jumps over the lazy dog.',\n caption,\n sortBy = 'path',\n sortDir = 'asc',\n}: TypographyScaleProps): ReactElement {\n const { resolved, activeTheme, cssVarPrefix } = useProject();\n\n const rows = useMemo<Row[]>(() => {\n const filtered = Object.entries(resolved).filter(([path, token]) => {\n if (token.$type !== 'typography') return false;\n return globMatch(path, filter);\n });\n return sortTokens(filtered, { by: sortBy, dir: sortDir }).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, sortBy, sortDir]);\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 {...themeAttrs(cssVarPrefix, activeTheme)}>\n <div className=\"sb-block__empty\">No typography tokens match this filter.</div>\n </div>\n );\n }\n\n return (\n <div {...themeAttrs(cssVarPrefix, activeTheme)}>\n <div className=\"sb-block__caption\">{captionText}</div>\n {rows.map((row) => (\n <div key={row.path} className=\"sb-typography-scale__row\">\n <div className=\"sb-typography-scale__meta\">\n <span className=\"sb-typography-scale__path\">{row.path}</span>\n {row.specs && <span className=\"sb-typography-scale__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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"}
|