carboncanvas 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CommentsRuntime-CRhC_WJU.js +6781 -0
- package/CommentsRuntime-CRhC_WJU.js.map +1 -0
- package/Inspector-D9W1Ie5_.js +7541 -0
- package/Inspector-D9W1Ie5_.js.map +1 -0
- package/LICENSE +21 -0
- package/README.md +160 -0
- package/brand-B9y8WrVi.js +134 -0
- package/brand-B9y8WrVi.js.map +1 -0
- package/index.d.ts +271 -0
- package/index.js +14 -0
- package/index.js.map +1 -0
- package/lib-CSrTsI4Y.js +2231 -0
- package/lib-CSrTsI4Y.js.map +1 -0
- package/package.json +65 -0
- package/tools/babel-plugin-data-anchor.d.ts +6 -0
- package/tools/babel-plugin-data-anchor.js +64 -0
- package/vite.d.ts +33 -0
- package/vite.js +42 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Inspector-D9W1Ie5_.js","sources":["../src/DesignCanvas/muteClonedMedia.ts","../src/DesignCanvas/tokens.ts","../src/DesignCanvas/ExplodedView.tsx","../src/DesignCanvas/XRayView.tsx","../src/DesignCanvas/domInspect.ts","../src/DesignCanvas/sections.tsx","../src/DesignCanvas/fiber.ts","../src/DesignCanvas/scan.ts","../src/DesignCanvas/BoxModel.tsx","../src/DesignCanvas/AssetSection.tsx","../src/DesignCanvas/HierarchyTree.tsx","../src/DesignCanvas/ScanPane.tsx","../src/DesignCanvas/Inspector.tsx"],"sourcesContent":["/**\n * Force-mute every <video>/<audio> inside a cloned subtree.\n *\n * Why this exists: React applies the `muted` prop as a DOM *property* only —\n * it never writes a `muted` content attribute (long-standing React quirk,\n * facebook/react#10389). `cloneNode(true)` copies attributes, not properties,\n * so a clone of a muted autoplaying video keeps its `autoplay` attribute but\n * loses the mute → inspector preview/explode clones blast audio from every\n * tile at once.\n *\n * We keep autoplay (a silently-playing thumbnail is a feature) and just pin\n * the audio off: `muted` for the live property, `defaultMuted` so the\n * attribute is present too if the clone is ever re-cloned.\n */\nexport function muteClonedMedia(cloneRoot: Element): void {\n const media: HTMLMediaElement[] = [];\n if (cloneRoot instanceof HTMLMediaElement) media.push(cloneRoot);\n media.push(...Array.from(cloneRoot.querySelectorAll<HTMLMediaElement>('video, audio')));\n for (const el of media) {\n el.muted = true;\n el.defaultMuted = true;\n el.volume = 0;\n }\n}\n","// Token / style reverse-lookup, sniffers, and the per-session token-map caches\n// (P2.6's resetTokenCaches lives here). Extracted from Inspector.tsx (P3.2).\n// Design-system-agnostic: every DS touch-point routes through the injected\n// adapter; with the generic adapter the maps are empty and raw values surface.\nimport { getDesignSystemAdapter, onDesignSystemAdapterChange } from '../adapters';\nimport type { CssVarTokenSpec } from '../adapters';\n\n// Register the cache-invalidation listener exactly once, the first time a probe\n// is created (P2.6). Deliberately NOT a top-level side-effect call: the\n// published package sets `sideEffects: false`, which would let the bundler\n// tree-shake a bare module-scope registration away. `getSniffer` is the\n// chokepoint every reverse-lookup cache build funnels through, so registering\n// there is tree-shake-robust AND perfectly timed: a cache only exists once a\n// probe has been made, which is precisely when the listener is now in place to\n// invalidate it on the next adapter change.\nlet _adapterListenerRegistered = false;\nfunction ensureAdapterListener(): void {\n if (_adapterListenerRegistered) return;\n _adapterListenerRegistered = true;\n onDesignSystemAdapterChange(resetTokenCaches);\n}\n\nexport const NON_COLOR_TEXT_SUFFIXES = new Set([\n 'left', 'center', 'right', 'justify', 'start', 'end',\n 'xs', 'sm', 'base', 'lg', 'xl', '2xl', '3xl', '4xl', '5xl', '6xl', '7xl', '8xl', '9xl',\n 'wrap', 'nowrap', 'balance', 'pretty',\n 'ellipsis', 'clip',\n 'opacity', 'shadow',\n]);\nexport const NON_COLOR_BORDER_FIRSTSEG = new Set([\n '0', '1', '2', '4', '8',\n 't', 'r', 'b', 'l', 'x', 'y',\n 'solid', 'dashed', 'dotted', 'double', 'hidden', 'none',\n 'separate', 'collapse',\n]);\n\nexport type StyleTokens = {\n typography: string[];\n textColor: string[];\n bgColor: string[];\n borderColor: string[];\n};\n\n// A design-system theme scope the element sits inside (Spring: a\n// <ThemeProvider scope=\"…\"> subtree). `scope` is the scope id (null = global /\n// no DS scope); `mode` is the inferred light/dark, or null when the adapter\n// declares no `themeForegroundToken` to infer from.\nexport type ThemeInfo = {\n scope: string | null;\n mode: 'light' | 'dark' | null;\n};\n\nexport type ResolvedStyles = {\n fontFamily: string;\n fontSize: string;\n fontWeight: string;\n lineHeight: string;\n letterSpacing: string;\n color: string;\n backgroundColor: string;\n borderColor: string;\n // True if any side has a non-zero border-width. Used to suppress the Border\n // row when Tailwind `border-*` color classes are set without an actual\n // `border` (or `border-N`) width class — the color exists in computed style\n // but no border is rendered.\n hasBorderWidth: boolean;\n // True if the element has direct text nodes with non-whitespace content.\n // Used to suppress the Color row on wrapper divs whose `color` is just\n // inherited from the theme and paints nothing visible on this element.\n hasDirectText: boolean;\n // Reverse-lookup of computed font signature → Spring `typography-*` token.\n // Set only for text-leaf elements (matches the Color/Scan gates). Lets the\n // Typography row surface a token name for elements that paint text via\n // component-internal CSS rules (not a `typography-*` utility class) — the\n // class-collected path in `collectStyleTokens` only catches the class form.\n typographyAutoToken: string | null;\n // Color tokens resolved in the element's OWN theme scope (so a dark-scoped\n // value matches the dark palette instead of being false-flagged off-token).\n colorToken: string | null;\n backgroundToken: string | null;\n borderToken: string | null;\n // The theme scope this element renders in (for the Theme row).\n theme: ThemeInfo;\n};\n\nexport function isLikelyTextColor(cls: string): boolean {\n const prefix = getDesignSystemAdapter().tokens.utilityClassPrefixes.text || 'text-';\n const rest = cls.slice(prefix.length);\n const first = rest.split('-')[0];\n return !NON_COLOR_TEXT_SUFFIXES.has(first);\n}\n\nexport function isLikelyBorderColor(cls: string): boolean {\n const prefix = getDesignSystemAdapter().tokens.utilityClassPrefixes.border || 'border-';\n const rest = cls.slice(prefix.length);\n if (rest.length === 0) return false; // bare `border`\n const first = rest.split('-')[0];\n return !NON_COLOR_BORDER_FIRSTSEG.has(first);\n}\n\n// Walk the DOM up from the clicked element (up to MAX_DEPTH levels) and\n// collect tokens that look like Spring typography/color utilities. We\n// scan ancestors too because typography/colors often live on inner spans\n// while the clicked element might be a wrapper (or vice versa).\nexport const SCAN_DEPTH = 6;\nexport function collectStyleTokens(node: HTMLElement): StyleTokens {\n const out: StyleTokens = {\n typography: [],\n textColor: [],\n bgColor: [],\n borderColor: [],\n };\n const seen = {\n typography: new Set<string>(),\n textColor: new Set<string>(),\n bgColor: new Set<string>(),\n borderColor: new Set<string>(),\n };\n // Utility-class prefixes come from the adapter (Spring uses `typography-` /\n // `text-` / `bg-` / `border-`). Empty prefixes never match, so the generic\n // adapter harvests no utility-class tokens.\n const pfx = getDesignSystemAdapter().tokens.utilityClassPrefixes;\n let cur: HTMLElement | null = node;\n for (let i = 0; cur && i < SCAN_DEPTH; i++, cur = cur.parentElement) {\n const cls = typeof cur.className === 'string' ? cur.className : '';\n if (!cls) continue;\n for (const c of cls.split(/\\s+/).filter(Boolean)) {\n const clean = c.replace(/^!/, ''); // strip Tailwind's `!` important prefix\n if (pfx.typography && clean.startsWith(pfx.typography)) {\n if (!seen.typography.has(clean)) {\n seen.typography.add(clean);\n out.typography.push(clean);\n }\n } else if (pfx.text && clean.startsWith(pfx.text) && isLikelyTextColor(clean)) {\n if (!seen.textColor.has(clean)) {\n seen.textColor.add(clean);\n out.textColor.push(clean);\n }\n } else if (pfx.bg && clean.startsWith(pfx.bg)) {\n if (!seen.bgColor.has(clean)) {\n seen.bgColor.add(clean);\n out.bgColor.push(clean);\n }\n } else if (pfx.border && clean.startsWith(pfx.border) && isLikelyBorderColor(clean)) {\n if (!seen.borderColor.has(clean)) {\n seen.borderColor.add(clean);\n out.borderColor.push(clean);\n }\n }\n }\n }\n return out;\n}\n\n// Perceptual luminance (0..1) of a computed `rgb()/rgba()` string, or null if\n// unparseable — used only to threshold a scope's foreground into light/dark.\nexport function luminanceOf(rgb: string): number | null {\n const m = rgb.match(/(\\d+(?:\\.\\d+)?)/g);\n if (!m || m.length < 3) return null;\n const [r, g, b] = m.slice(0, 3).map(Number);\n return (0.2126 * r! + 0.7152 * g! + 0.0722 * b!) / 255;\n}\n\n// The theme scope an element renders in: its scope id (per the adapter's\n// themeScopeAttr) + an inferred light/dark mode. Mode is inferred from the\n// adapter's `themeForegroundToken` resolved IN this scope (a light foreground\n// ⇒ dark theme); without that adapter hint, mode stays null (unknown).\nexport function readThemeInfo(node: Element): ThemeInfo {\n const adapter = getDesignSystemAdapter();\n const attr = adapter.themeScopeAttr;\n const host = themeScopeHostOf(node);\n const scope = host && attr ? host.getAttribute(attr) : null;\n let mode: 'light' | 'dark' | null = null;\n const fgToken = adapter.themeForegroundToken;\n if (fgToken) {\n const fg = resolveTokenColor(fgToken, host);\n const lum = fg ? luminanceOf(fg) : null;\n if (lum != null) mode = lum > 0.5 ? 'dark' : 'light';\n }\n return { scope, mode };\n}\n\nexport function readResolvedStyles(node: HTMLElement): ResolvedStyles {\n const s = getComputedStyle(node);\n // Resolve color tokens against this element's own theme scope (null host =\n // global theme = the old behavior).\n const themeHost = themeScopeHostOf(node);\n const bw = (k: string) => parseFloat(s.getPropertyValue(k)) || 0;\n const hasBorderWidth =\n bw('border-top-width') > 0 ||\n bw('border-right-width') > 0 ||\n bw('border-bottom-width') > 0 ||\n bw('border-left-width') > 0;\n let hasDirectText = false;\n for (const c of Array.from(node.childNodes)) {\n if (c.nodeType === Node.TEXT_NODE && (c.textContent ?? '').trim().length > 0) {\n hasDirectText = true;\n break;\n }\n }\n return {\n fontFamily: s.fontFamily,\n fontSize: s.fontSize,\n fontWeight: s.fontWeight,\n lineHeight: s.lineHeight,\n letterSpacing: s.letterSpacing,\n color: s.color,\n backgroundColor: s.backgroundColor,\n borderColor: s.borderTopColor,\n hasBorderWidth,\n hasDirectText,\n typographyAutoToken: hasDirectText ? lookupTypographyToken(s) : null,\n colorToken: lookupColorToken(s.color, themeHost),\n backgroundToken: lookupColorToken(s.backgroundColor, themeHost),\n borderToken: lookupColorToken(s.borderTopColor, themeHost),\n theme: readThemeInfo(node),\n };\n}\n\n// ───────── element-scope helpers ─────────\n\n// Direct text content of a node (excludes text inside descendant elements).\n// Falls back to innerText if there's no direct text but the rendered text is\n// reasonably short.\n// Strict: only direct text-node children count. A wrapper <div> whose only\n// content is nested <p>s does NOT have direct text, even though innerText\n// would happily return the descendants' content. This is the same rule the\n// X-ray uses (XRayView.getDirectText) and matches `hasDirectText` in\n// readResolvedStyles, so the Text band, the X-ray text-leaf detection, and\n// the Styles \"Color\" row gate all agree on what counts as \"this element\n// authors text\".\nexport function isTransparent(color: string): boolean {\n return (\n !color ||\n color === 'transparent' ||\n color === 'rgba(0, 0, 0, 0)' ||\n color === 'rgb(0, 0, 0, 0)'\n );\n}\n\n// Reverse-lookup of resolved CSS values → design-system token names. Built\n// lazily on first lookup by walking the document's stylesheets (plus the\n// documentElement inline style) for a family of CSS custom properties, then\n// resolving each variable through a hidden sniffer div and keying the resulting\n// Map by the browser-normalised computed value. The CSS-var prefix and the\n// chip-label / collision rules for each family come from the injected adapter's\n// `tokens.*` spec — the core knows no design system, so with the generic\n// adapter (empty prefix) these maps are empty and the inspector reports raw\n// computed values instead of token names.\n//\n// Cached for the session. The four shared builders below collapse the\n// previously-duplicated color/shadow/spacing/radius map builders — they were\n// ~95% identical, differing only in which CSS property to apply, how to read\n// the resolved value, and the label/collision rules (now in the spec).\n// Nearest ancestor (incl. self) establishing a NON-global design-system theme\n// scope, per the adapter's `themeScopeAttr`. Inside such a subtree the same\n// color CSS vars resolve to a different palette (e.g. a dark scope), so token\n// resolution must happen against a sniffer mounted IN this host — not the global\n// body. Returns null when the adapter declares no scope attribute (generic) or\n// the element only sees the global (:root) theme — keeping the generic path\n// byte-for-byte the old body-only behavior. Exported for ExplodedView.\nexport function themeScopeHostOf(node: Element | null): HTMLElement | null {\n const attr = getDesignSystemAdapter().themeScopeAttr;\n if (!attr) return null;\n let cur: Element | null = node;\n while (cur) {\n if (cur instanceof HTMLElement && cur.hasAttribute(attr)) {\n const v = cur.getAttribute(attr);\n if (v && v !== 'global') return cur;\n }\n cur = cur.parentElement;\n }\n return null;\n}\n\nexport function makeSnifferEl(): HTMLDivElement {\n const el = document.createElement('div');\n el.style.cssText =\n 'position:absolute;visibility:hidden;pointer-events:none;left:-9999px;top:-9999px;';\n return el;\n}\n\n// One hidden probe div per theme-scope host (mounted INSIDE it so it inherits\n// the scoped vars) plus a shared body probe for the global theme. `host`\n// omitted / null → the body sniffer (the old single-sniffer behavior).\n// `let` (not `const`) so resetTokenCaches() can swap in a fresh WeakMap when\n// the adapter changes. `_allSniffers` tracks every created probe so the reset\n// can detach them from the DOM (a WeakMap can't be iterated).\nexport let _hostSniffers = new WeakMap<HTMLElement, HTMLDivElement>();\nexport let _bodySniffer: HTMLDivElement | null = null;\nconst _allSniffers = new Set<HTMLDivElement>();\nexport function getSniffer(host?: HTMLElement | null): HTMLDivElement {\n ensureAdapterListener();\n if (host) {\n const existing = _hostSniffers.get(host);\n if (existing && existing.isConnected) return existing;\n const s = makeSnifferEl();\n host.appendChild(s);\n _hostSniffers.set(host, s);\n _allSniffers.add(s);\n return s;\n }\n if (_bodySniffer && _bodySniffer.isConnected) return _bodySniffer;\n _bodySniffer = makeSnifferEl();\n document.body.appendChild(_bodySniffer);\n _allSniffers.add(_bodySniffer);\n return _bodySniffer;\n}\n\n// Invalidate every reverse-lookup cache and probe (P2.6). The five token-map\n// caches + the token→color caches are built lazily against the FIRST adapter\n// and its stylesheets; when `setDesignSystemAdapter()` swaps in a different\n// design system, those maps and the sniffer probes are stale and would produce\n// wrong token names + false \"off-token\" flags. `setDesignSystemAdapter` calls\n// this on every genuine adapter change (it no-ops when the same adapter is\n// re-installed, so the common idempotent set doesn't thrash). Detaches the\n// hidden probe divs from the DOM and drops all cached maps so the next lookup\n// rebuilds against the new adapter.\nexport function resetTokenCaches(): void {\n typographyMapCache = null;\n shadowMapCache = null;\n spacingMapCache = null;\n radiusMapCache = null;\n _colorMapBody = null;\n _colorMaps = new WeakMap<HTMLElement, Map<string, string>>();\n _tokenColorBody.clear();\n _tokenColorMaps = new WeakMap<HTMLElement, Map<string, string | null>>();\n for (const s of _allSniffers) s.remove();\n _allSniffers.clear();\n _bodySniffer = null;\n _hostSniffers = new WeakMap<HTMLElement, HTMLDivElement>();\n}\n\n// Harvest every `:root` CSS custom property whose name starts with `prefix`,\n// from both the stylesheets and the documentElement inline style (design\n// systems often inject theme vars directly onto `<html>` via a provider). An\n// empty prefix harvests nothing — the \"no design system connected\" path.\nexport function harvestCssVarNames(prefix: string): Set<string> {\n const names = new Set<string>();\n if (!prefix) return names;\n for (let i = 0; i < document.styleSheets.length; i++) {\n let rules: CSSRuleList | null = null;\n try {\n rules = document.styleSheets[i].cssRules;\n } catch {\n // cross-origin sheet — skip\n continue;\n }\n if (!rules) continue;\n for (let j = 0; j < rules.length; j++) {\n const rule = rules[j];\n if (!(rule instanceof CSSStyleRule)) continue;\n if (!rule.selectorText || !rule.selectorText.includes(':root')) continue;\n for (let k = 0; k < rule.style.length; k++) {\n const prop = rule.style[k];\n if (prop.startsWith(prefix)) names.add(prop);\n }\n }\n }\n const inlineStyle = document.documentElement.style;\n for (let i = 0; i < inlineStyle.length; i++) {\n const prop = inlineStyle[i];\n if (prop.startsWith(prefix)) names.add(prop);\n }\n return names;\n}\n\n// Apply a CSS var to the sniffer and read back a resolved value. `resolve`\n// returns the map key (string or number) or null to skip this var. Generic over\n// the key type so color/shadow (string keys) and spacing/radius (px-int keys)\n// share one builder.\nexport function buildCssVarTokenMap<K>(\n spec: CssVarTokenSpec,\n resolve: (sniffer: HTMLDivElement, varName: string) => K | null,\n onBuild?: (sniffer: HTMLDivElement) => void,\n onDone?: (sniffer: HTMLDivElement) => void,\n explicitSniffer?: HTMLDivElement,\n): Map<K, string> {\n const map = new Map<K, string>();\n const names = harvestCssVarNames(spec.cssVarPrefix);\n if (names.size === 0) return map;\n // Resolution happens against the given sniffer (a theme-scope host's probe)\n // or the shared body probe. Var-name DISCOVERY stays global (:root) — only\n // resolution is per scope.\n const sniffer = explicitSniffer ?? getSniffer();\n onBuild?.(sniffer);\n for (const name of names) {\n const key = resolve(sniffer, name);\n if (key === null || key === undefined) continue;\n const suffix = name.slice(spec.cssVarPrefix.length);\n const label = spec.display ? spec.display(suffix) : suffix;\n const existing = map.get(key);\n if (existing === undefined) {\n map.set(key, label);\n } else if (spec.preferOnCollision?.(existing, label, suffix)) {\n map.set(key, label);\n }\n }\n onDone?.(sniffer);\n return map;\n}\n\n// ───────── color ─────────\n// The rgb→token map is cached PER theme-scope host: the same var name resolves\n// to different rgb values under a dark scope vs the global theme, so each scope\n// needs its own map (var-name discovery is shared/global; only the resolved\n// values differ). `host` omitted → the global (body) map = the old behavior.\nexport let _colorMaps = new WeakMap<HTMLElement, Map<string, string>>();\nexport let _colorMapBody: Map<string, string> | null = null;\nexport function buildColorMap(host?: HTMLElement | null): Map<string, string> {\n return buildCssVarTokenMap<string>(\n getDesignSystemAdapter().tokens.color,\n (sniffer, name) => {\n sniffer.style.backgroundColor = '';\n sniffer.style.backgroundColor = `var(${name})`;\n const resolved = getComputedStyle(sniffer).backgroundColor;\n return resolved && resolved !== 'rgba(0, 0, 0, 0)' ? resolved : null;\n },\n undefined,\n undefined,\n getSniffer(host),\n );\n}\nexport function ensureColorMap(host?: HTMLElement | null): Map<string, string> {\n if (host) {\n const c = _colorMaps.get(host);\n if (c) return c;\n const m = buildColorMap(host);\n _colorMaps.set(host, m);\n return m;\n }\n if (_colorMapBody) return _colorMapBody;\n _colorMapBody = buildColorMap(null);\n return _colorMapBody;\n}\n\nexport function lookupColorToken(resolved: string, host?: HTMLElement | null): string | null {\n if (!resolved || isTransparent(resolved)) return null;\n return ensureColorMap(host).get(resolved) ?? null;\n}\n\n// Forward lookup: resolve a color utility (`text-neutral-b0`, `bg-primary-b`,\n// `border-warning`) to its computed rgb() value, so we can render a swatch\n// beside the chip. The utility-class prefixes and the color CSS-var prefix come\n// from the adapter. Returns null for non-color tokens / values that don't\n// resolve through the color var family.\nexport let _tokenColorMaps = new WeakMap<HTMLElement, Map<string, string | null>>();\nexport const _tokenColorBody = new Map<string, string | null>();\nexport function tokenColorCacheFor(host?: HTMLElement | null): Map<string, string | null> {\n if (!host) return _tokenColorBody;\n let m = _tokenColorMaps.get(host);\n if (!m) {\n m = new Map<string, string | null>();\n _tokenColorMaps.set(host, m);\n }\n return m;\n}\nexport function resolveTokenColor(token: string, host?: HTMLElement | null): string | null {\n const cache = tokenColorCacheFor(host);\n if (cache.has(token)) return cache.get(token) ?? null;\n const adapter = getDesignSystemAdapter();\n const { text, bg, border } = adapter.tokens.utilityClassPrefixes;\n const colorPrefix = adapter.tokens.color.cssVarPrefix;\n let base: string | null = null;\n if (text && token.startsWith(text)) base = token.slice(text.length);\n else if (bg && token.startsWith(bg)) base = token.slice(bg.length);\n else if (border && token.startsWith(border)) base = token.slice(border.length);\n if (!base || !colorPrefix) {\n cache.set(token, null);\n return null;\n }\n const sniffer = getSniffer(host);\n sniffer.style.backgroundColor = '';\n sniffer.style.backgroundColor = `var(${colorPrefix}${base})`;\n const resolved = getComputedStyle(sniffer).backgroundColor;\n const value =\n resolved && resolved !== 'rgba(0, 0, 0, 0)' ? resolved : null;\n cache.set(token, value);\n return value;\n}\n\n// ───────── shadow reverse-lookup ─────────\n//\n// A DS exposes box-shadow CSS vars (Spring: `--sui-box-shadow-*` → shadow-md,\n// shadow-sm-primary). We discover them the same way we did colors, resolve each\n// through the sniffer, and key the map by the browser-normalised box-shadow\n// string so a plain `getComputedStyle(node).boxShadow` lookup matches a token\n// exactly. The `display` in the adapter's shadow spec turns the var suffix into\n// the chip label.\n\nexport let shadowMapCache: Map<string, string> | null = null;\nexport function ensureShadowMap(): Map<string, string> {\n if (shadowMapCache) return shadowMapCache;\n shadowMapCache = buildCssVarTokenMap<string>(\n getDesignSystemAdapter().tokens.shadow,\n (sniffer, name) => {\n sniffer.style.boxShadow = '';\n sniffer.style.boxShadow = `var(${name})`;\n const resolved = getComputedStyle(sniffer).boxShadow;\n return resolved && resolved !== 'none' ? resolved : null;\n },\n );\n return shadowMapCache;\n}\n\nexport function lookupShadowToken(resolvedShadow: string): string | null {\n if (!resolvedShadow || resolvedShadow === 'none') return null;\n return ensureShadowMap().get(resolvedShadow) ?? null;\n}\n\n// Split a multi-shadow string at top-level commas. Commas inside `rgb(…)` /\n// `rgba(…)` are inside parens and skipped.\nexport function splitShadows(value: string): string[] {\n if (!value || value === 'none') return [];\n const out: string[] = [];\n let depth = 0;\n let buf = '';\n for (const ch of value) {\n if (ch === '(') depth++;\n else if (ch === ')') depth--;\n if (ch === ',' && depth === 0) {\n if (buf.trim()) out.push(buf.trim());\n buf = '';\n } else {\n buf += ch;\n }\n }\n if (buf.trim()) out.push(buf.trim());\n return out;\n}\n\nexport type ParsedShadow = {\n inset: boolean;\n color: string;\n offsetX: number;\n offsetY: number;\n blur: number;\n spread: number;\n};\n\n// Computed box-shadow format from getComputedStyle is stable:\n// \"<color> <x>px <y>px <blur>px <spread>px [inset]\"\nexport function parseShadow(raw: string): ParsedShadow | null {\n const inset = /\\binset\\b/.test(raw);\n const noInset = raw.replace(/\\binset\\b/, ' ').trim();\n const colorMatch = noInset.match(\n /rgba?\\([^)]+\\)|#[0-9a-fA-F]{3,8}|[a-zA-Z]+/,\n );\n if (!colorMatch) return null;\n const color = colorMatch[0];\n const lengths = noInset.replace(color, '').trim();\n const nums = lengths\n .split(/\\s+/)\n .filter(Boolean)\n .map((x) => parseFloat(x) || 0);\n return {\n inset,\n color,\n offsetX: nums[0] ?? 0,\n offsetY: nums[1] ?? 0,\n blur: nums[2] ?? 0,\n spread: nums[3] ?? 0,\n };\n}\n\n// ───────── spacing + radius reverse-lookup ─────────\n//\n// Same shared builder as color/shadow, but keyed by the integer pixel value the\n// browser computes (getComputedStyle hands back resolved px, and DS scales are\n// dense enough that integer pixels are unambiguous in practice). A computed\n// `padding-top: 16px` reverse-resolves to e.g. \"space-4\"; a\n// `border-top-left-radius: 10px` to e.g. \"radius-sm\". The chip label comes from\n// the adapter spec's `display`.\n//\n// Why px keys: floats round to the nearest int. The 0px slot is skipped (≤0 for\n// spacing, <0 for radius) so every zero-side doesn't read as a token — the\n// BoxModel already shows \"–\" for zero.\n//\n// Radius has a wrinkle the Spring spec handles via `preferOnCollision`: its\n// `circle` and `full` vars both resolve to 9999px; the spec prefers `full`.\n\nexport let spacingMapCache: Map<number, string> | null = null;\nexport function ensureSpacingMap(): Map<number, string> {\n if (spacingMapCache) return spacingMapCache;\n spacingMapCache = buildCssVarTokenMap<number>(\n getDesignSystemAdapter().tokens.spacing,\n (sniffer, name) => {\n sniffer.style.width = '';\n sniffer.style.width = `var(${name})`;\n const resolved = parseFloat(getComputedStyle(sniffer).width);\n if (!Number.isFinite(resolved) || resolved <= 0) return null;\n return Math.round(resolved);\n },\n undefined,\n (sniffer) => {\n sniffer.style.width = '';\n },\n );\n return spacingMapCache;\n}\n\nexport function lookupSpacingToken(px: number): string | null {\n if (!Number.isFinite(px) || px <= 0) return null;\n return ensureSpacingMap().get(Math.round(px)) ?? null;\n}\n\nexport let radiusMapCache: Map<number, string> | null = null;\nexport function ensureRadiusMap(): Map<number, string> {\n if (radiusMapCache) return radiusMapCache;\n let prevW = '';\n let prevH = '';\n radiusMapCache = buildCssVarTokenMap<number>(\n getDesignSystemAdapter().tokens.radius,\n (sniffer, name) => {\n sniffer.style.borderTopLeftRadius = '';\n sniffer.style.borderTopLeftRadius = `var(${name})`;\n const resolved = parseFloat(getComputedStyle(sniffer).borderTopLeftRadius);\n if (!Number.isFinite(resolved) || resolved < 0) return null;\n return Math.round(resolved);\n },\n (sniffer) => {\n // Need a fixed-size host so a percentage value (e.g. a `none` = 0% radius)\n // resolves to a deterministic px. Sniffer is 0×0 by default; force 100px.\n prevW = sniffer.style.width;\n prevH = sniffer.style.height;\n sniffer.style.width = '100px';\n sniffer.style.height = '100px';\n },\n (sniffer) => {\n sniffer.style.borderTopLeftRadius = '';\n sniffer.style.width = prevW;\n sniffer.style.height = prevH;\n },\n );\n return radiusMapCache;\n}\n\nexport function lookupRadiusToken(px: number): string | null {\n if (!Number.isFinite(px) || px < 0) return null;\n // Skip 0 → radius-none unless explicitly asked; the diagram shows \"–\" for zero.\n if (px === 0) return null;\n return ensureRadiusMap().get(Math.round(px)) ?? null;\n}\n\n// ───────── typography reverse-lookup ─────────\n//\n// Sniff every `.typography-*` utility off the stylesheets, apply it to the\n// hidden sniffer div, and key by the resulting computed font signature\n// (family|size|weight|line-height|letter-spacing). An element's computed\n// font props can then be tested against the map — if any token's resolved\n// signature matches, the element is \"on-token\", regardless of whether the\n// class lives on it directly or on an ancestor. This is what the canvas\n// scan uses to flag text-leaf elements whose font properties don't\n// correspond to any Spring typography token.\n\n// Typography is keyed by a computed font *signature* rather than a single CSS\n// value, so it uses its own builder. The adapter's `tokens.typography.classMatcher`\n// pulls token class names out of each selector; an optional `signature` builds\n// the key (default: family|size|weight|line-height|letter-spacing). With the\n// generic adapter (matcher returns []) the map is empty — text never matches a\n// typography token, and the scan treats every text leaf as raw.\n\nexport const DEFAULT_TYPOGRAPHY_SIGNATURE = (s: CSSStyleDeclaration): string =>\n [s.fontFamily, s.fontSize, s.fontWeight, s.lineHeight, s.letterSpacing].join('|');\n\nexport function typographyKey(s: CSSStyleDeclaration): string {\n const sig = getDesignSystemAdapter().tokens.typography.signature;\n return (sig ?? DEFAULT_TYPOGRAPHY_SIGNATURE)(s);\n}\n\nexport let typographyMapCache: Map<string, string> | null = null;\nexport function ensureTypographyMap(): Map<string, string> {\n if (typographyMapCache) return typographyMapCache;\n const map = new Map<string, string>();\n const spec = getDesignSystemAdapter().tokens.typography;\n const names = new Set<string>();\n\n for (let i = 0; i < document.styleSheets.length; i++) {\n let rules: CSSRuleList | null = null;\n try {\n rules = document.styleSheets[i].cssRules;\n } catch {\n continue;\n }\n if (!rules) continue;\n for (let j = 0; j < rules.length; j++) {\n const rule = rules[j];\n if (!(rule instanceof CSSStyleRule)) continue;\n const sel = rule.selectorText || '';\n for (const cls of spec.classMatcher(sel)) names.add(cls);\n }\n }\n\n if (names.size === 0) {\n typographyMapCache = map;\n return map;\n }\n\n const sniffer = getSniffer();\n const prevClass = sniffer.className;\n for (const name of names) {\n sniffer.className = name;\n const s = getComputedStyle(sniffer);\n const key = typographyKey(s);\n if (!map.has(key)) map.set(key, name);\n }\n sniffer.className = prevClass;\n\n typographyMapCache = map;\n return map;\n}\n\nexport function lookupTypographyToken(s: CSSStyleDeclaration): string | null {\n return ensureTypographyMap().get(typographyKey(s)) ?? null;\n}\n\n// ───────── canvas scan (off-token violation finder) ─────────\n//\n// Walks every host element inside every `[data-dc-slot]` artboard on the\n// page and flags computed values that don't reverse-lookup to a Spring\n// token. The trigger is the manual \"Scan canvas\" button in the Inspector's\n// Scan section — we never run this automatically because it iterates a few\n// hundred to a few thousand elements per pass and reads computed styles\n// for each.\n//\n// Categories checked:\n// • color (direct-text elements only)\n// • backgroundColor (when non-transparent)\n// • border-{side}-color (per side, only when that side has width > 0)\n// • boxShadow (when not \"none\")\n// • typography (text-leaf elements whose computed font signature\n// doesn't match any `typography-*` token)\n//\n// Skipped:\n// • Inspector's own UI (data-inspector-ui)\n// • display:none / visibility:hidden elements\n// • SVG descendants of an <svg> root (the root SVG can be flagged for\n// stroke/fill colors only via direct computed reads we don't do yet;\n// for now SVGs are skipped entirely — Spring icons get their color\n// from the parent's `color` which is already flagged separately).\n// • Plain text inside Spring icons (svgs)\n\nexport function colorVarFromToken(token: string): string {\n return `var(${getDesignSystemAdapter().tokens.color.cssVarPrefix}${token})`;\n}\n\n// Color display mode for the Styles section. \"token\" shows the Spring name\n// (`~ neutral-b0`); \"value\" shows the raw rgba; \"var\" shows the CSS var().\n// Lifted out so the StylesSection toggle can pass it down to each row.\nexport type ColorDisplayMode = 'token' | 'value' | 'var';\n\n","// ExplodedView.tsx — 3D explode pane for the Inspector.\n//\n// Renders a left-anchored drawer next to the Inspector. Takes the currently\n// selected DOM node, deep-clones the subtree, and pushes each descendant\n// outward on Z (translateZ(depth × gap)) inside a preserve-3d scene. The user\n// orbits with mouse drag, zooms with scroll, adjusts the depth gap, and can\n// isolate a single layer. Clicking a layer in 3D drives the main Inspector\n// selection — the pane is a picker + visualization, not a separate info\n// surface (single mental model with the Hierarchy tree).\n\nimport type { CSSProperties } from 'react';\nimport { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { getAncestorScale } from './getAncestorScale';\nimport { muteClonedMedia } from './muteClonedMedia';\nimport { themeScopeHostOf } from './tokens';\nimport { getDesignSystemAdapter } from '../adapters';\n\ntype Props = {\n node: HTMLElement;\n onPickHost: (host: Element) => void;\n onClose: () => void;\n // Live width of the Inspector panel to the right of this pane. The pane's\n // right edge anchors to `INSPECTOR_GAP + inspectorWidth + INSPECTOR_GAP`\n // so dragging the inspector wider/narrower keeps this pane flush.\n inspectorWidth: number;\n};\n\nconst INSPECTOR_GAP = 16;\n\ntype StyledElement = HTMLElement | SVGElement;\n\ntype CloneEntry = {\n clone: StyledElement;\n origin: StyledElement;\n depth: number;\n // True if the origin has any visible visual property (bg / border / radius\n // / box-shadow / outline / filter / content leaf / direct text). Only\n // significant layers respond to hover + pick — clicking a layout wrapper\n // walks up to the nearest visually-meaningful ancestor.\n significant: boolean;\n};\n\nconst CONTENT_LEAF_TAGS = new Set([\n 'IMG', 'SVG', 'INPUT', 'TEXTAREA', 'CANVAS', 'VIDEO', 'AUDIO', 'PICTURE', 'IFRAME',\n]);\n\nfunction isVisuallySignificant(el: StyledElement, cs: CSSStyleDeclaration): boolean {\n const bg = cs.backgroundColor;\n if (bg && bg !== 'transparent' && bg !== 'rgba(0, 0, 0, 0)') return true;\n if (cs.backgroundImage && cs.backgroundImage !== 'none') return true;\n const bw = (k: string) => parseFloat(cs.getPropertyValue(k)) || 0;\n if (bw('border-top-width') || bw('border-right-width') || bw('border-bottom-width') || bw('border-left-width')) return true;\n if (bw('border-top-left-radius') || bw('border-top-right-radius') || bw('border-bottom-left-radius') || bw('border-bottom-right-radius')) return true;\n if (cs.boxShadow && cs.boxShadow !== 'none') return true;\n if (cs.outlineStyle && cs.outlineStyle !== 'none' && (parseFloat(cs.outlineWidth) || 0) > 0) return true;\n if (cs.filter && cs.filter !== 'none') return true;\n if (cs.backdropFilter && cs.backdropFilter !== 'none') return true;\n if (CONTENT_LEAF_TAGS.has(el.tagName.toUpperCase())) return true;\n for (const c of Array.from(el.childNodes)) {\n if (c.nodeType === Node.TEXT_NODE && (c.textContent ?? '').trim().length > 0) return true;\n }\n return false;\n}\n\nconst PANE_BG = '#18191b'; // matches the canvas / Inspector bg\nconst PANE_BORDER = 'rgba(255,255,255,0.08)';\n\nexport function ExplodedView({ node, onPickHost, onClose, inspectorWidth }: Props) {\n const stageRef = useRef<HTMLDivElement>(null);\n const sceneRef = useRef<HTMLDivElement>(null);\n // scaleWrap separates scale (transitioned, for isolate zoom) from rotate\n // (not transitioned, so drag stays 1:1). rootClone lives inside scaleWrap.\n const scaleWrapRef = useRef<HTMLDivElement>(null);\n const clonesRef = useRef<CloneEntry[]>([]);\n const rootCloneRef = useRef<HTMLElement | null>(null);\n\n // The explode is rooted at whichever element was selected when the pane\n // opened. Picking a sublayer inside the pane updates the right-hand\n // Inspector but does NOT re-root the pane — we only re-root when the\n // selection moves outside the current exploded subtree (e.g. the user\n // clicks somewhere else on the canvas).\n const [explodeRoot, setExplodeRoot] = useState<HTMLElement>(node);\n useEffect(() => {\n if (!explodeRoot.contains(node)) setExplodeRoot(node);\n }, [node, explodeRoot]);\n\n const [rotX, setRotX] = useState(-18);\n const [rotY, setRotY] = useState(28);\n const [zoom, setZoom] = useState(1);\n const [gap, setGap] = useState(10);\n const [isolate, setIsolate] = useState(false);\n const [bgMode, setBgMode] = useState<'dark' | 'light'>('dark');\n // Lets the user temporarily hide the picked-glow without deselecting.\n // Resets every time isolate toggles or a new layer is picked.\n const [dimGlow, setDimGlow] = useState(false);\n useEffect(() => {\n setDimGlow(false);\n }, [isolate]);\n const [stageSize, setStageSize] = useState<{ w: number; h: number }>({\n w: 0,\n h: 0,\n });\n const [layerCount, setLayerCount] = useState(0);\n\n // ESC closes the pane (stop propagation so the main Inspector's ESC handler\n // — which exits inspect mode entirely — doesn't also fire).\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n onClose();\n }\n };\n window.addEventListener('keydown', onKey, true);\n return () => window.removeEventListener('keydown', onKey, true);\n }, [onClose]);\n\n // Inject the slab/hover/picked stylesheet once per mount. CSS-driven outlines\n // + box-shadow give each clone a slight \"thickness\" feel without requiring\n // pseudo-elements (which would need position:relative and risk breaking\n // layouts that depend on existing positioning ancestors).\n useEffect(() => {\n const style = document.createElement('style');\n style.setAttribute('data-explode-style', '');\n style.textContent = `\n [data-explode-clone].explode-hover {\n outline: 2px solid #9aa6bb !important;\n outline-offset: 0 !important;\n box-shadow: 0 0 22px rgba(154,166,187,0.45) !important;\n }\n [data-explode-clone].explode-picked {\n outline: 2px solid #9aa6bb !important;\n outline-offset: 0 !important;\n box-shadow: 0 0 24px rgba(154,166,187,0.6) !important;\n }\n /* Spring icons set pointer-events:none on .sui-icon-svg so the outer\n button receives clicks. In the exploded scene we want the icon to be\n a pick target, so restore hit-testing on every cloned SVG. */\n [data-explode-clone] svg,\n [data-explode-clone] svg * {\n pointer-events: auto !important;\n }\n `;\n document.head.appendChild(style);\n return () => {\n style.remove();\n };\n }, []);\n\n // Measure stage so we can compute a base scale that fits the selection.\n useLayoutEffect(() => {\n const stage = stageRef.current;\n if (!stage) return;\n const measure = () => {\n const r = stage.getBoundingClientRect();\n setStageSize({ w: r.width, h: r.height });\n };\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(stage);\n return () => ro.disconnect();\n }, []);\n\n // Build / rebuild the cloned subtree whenever the explode root changes.\n // Note: this is `explodeRoot`, not `node` — picking a sublayer updates the\n // main inspector but does not rebuild this scene.\n useLayoutEffect(() => {\n const scene = sceneRef.current;\n const scaleWrap = scaleWrapRef.current;\n if (!scene || !scaleWrap) return;\n scaleWrap.innerHTML = '';\n clonesRef.current = [];\n rootCloneRef.current = null;\n\n const rawRect = explodeRoot.getBoundingClientRect();\n if (!rawRect.width || !rawRect.height) {\n setLayerCount(0);\n return;\n }\n // Compensate for DesignCanvas viewport transform so the clone is sized at\n // its natural CSS dimensions, not the post-canvas-zoom visual size.\n const canvasScale = getAncestorScale(explodeRoot);\n const rect = { width: rawRect.width / canvasScale, height: rawRect.height / canvasScale };\n\n const rootClone = explodeRoot.cloneNode(true) as HTMLElement;\n // cloneNode drops React's property-only `muted` — re-mute or every cloned\n // video tile autoplays with sound.\n muteClonedMedia(rootClone);\n\n // Walk original + clone in lockstep so we can build a depth-indexed map.\n // SVG nodes count: they're DOM elements with their own picker semantics\n // (icons are typically the leaf the designer cares about). We don't\n // descend INTO an svg's path/g children — the svg root is the picker\n // unit, same convention X-ray uses.\n const entries: CloneEntry[] = [];\n const walk = (orig: Element, clo: Element, depth: number) => {\n if (\n (orig instanceof HTMLElement || orig instanceof SVGElement) &&\n (clo instanceof HTMLElement || clo instanceof SVGElement)\n ) {\n const significant = isVisuallySignificant(orig, window.getComputedStyle(orig));\n entries.push({ clone: clo, origin: orig, depth, significant });\n }\n if (orig instanceof SVGSVGElement) return;\n const oc = Array.from(orig.children);\n const cc = Array.from(clo.children);\n const n = Math.min(oc.length, cc.length);\n for (let i = 0; i < n; i++) walk(oc[i], cc[i], depth + 1);\n };\n walk(explodeRoot, rootClone, 0);\n\n // Neutralize properties that would break the 3D context.\n //\n // SVGs are special: they stay in `entries` (so an icon click still picks\n // its host SVG) but they do NOT get their own 3D context or translateZ.\n // Applying `transform-style: preserve-3d` and translateZ to an <svg> forces\n // the browser to promote it to its own compositing layer rasterized at the\n // pre-scale resolution, then scale it up — which turns crisp Spring\n // Squircle shapes into a soft blob in the scene. Letting the SVG stay\n // flat-with-its-HTML-parent keeps the vector crisp at any zoom.\n for (const { clone, depth } of entries) {\n const cs = window.getComputedStyle(clone);\n const isSvg = clone instanceof SVGElement;\n if (!isSvg) {\n clone.style.transformStyle = 'preserve-3d';\n }\n clone.style.transition = 'none';\n clone.style.animation = 'none';\n if (\n cs.overflow !== 'visible' ||\n cs.overflowX !== 'visible' ||\n cs.overflowY !== 'visible'\n ) {\n clone.style.overflow = 'visible';\n }\n if (cs.position === 'fixed') {\n clone.style.position = 'absolute';\n }\n // Strip any baked-in transforms — we'll set our own translateZ below.\n // Keep the root's transform stripped too so it sits flush in the scene.\n clone.style.removeProperty('transform');\n clone.setAttribute('data-explode-clone', '');\n clone.setAttribute('data-explode-depth', String(depth));\n }\n\n // Root sits at the scene origin with its natural size.\n rootClone.style.position = 'relative';\n rootClone.style.margin = '0';\n rootClone.style.width = `${rect.width}px`;\n rootClone.style.height = `${rect.height}px`;\n rootClone.style.flexShrink = '0';\n rootClone.style.boxSizing = 'border-box';\n\n // The exploded clones live in the inspector pane, outside the source's theme\n // scope, so they'd render in the global (light) theme. A scoped DS theme\n // (Spring's <ThemeProvider scope=\"…\">) injects that scope's token rule\n // globally ([data-sui-theme-scope=\"…\"] { … }), so re-stamping the source's\n // scope id (per the adapter) on the clone root re-applies the scoped (e.g.\n // dark) theme to the whole exploded subtree. No-op for a generic adapter.\n const scopeAttr = getDesignSystemAdapter().themeScopeAttr;\n if (scopeAttr) {\n const scopeHost = themeScopeHostOf(explodeRoot);\n const scopeId = scopeHost?.getAttribute(scopeAttr);\n if (scopeId) rootClone.setAttribute(scopeAttr, scopeId);\n }\n\n scaleWrap.appendChild(rootClone);\n rootCloneRef.current = rootClone;\n clonesRef.current = entries;\n setLayerCount(entries.length);\n\n // Capture-phase click handler on the scene: walk up from the target to\n // find the first *significant* clone (skip layout-only wrappers), then\n // dispatch onPickHost with its origin. O(1) clone→entry lookup via a map\n // built once, instead of an O(n) find per ancestor per click.\n const cloneMap = new Map<Element, CloneEntry>(entries.map((e) => [e.clone, e]));\n const onSceneClick = (e: MouseEvent) => {\n const target = e.target as Element | null;\n if (!target) return;\n let picked: CloneEntry | null = null;\n let cur: Element | null = target;\n while (cur) {\n const match = cloneMap.get(cur);\n if (match && match.significant) {\n picked = match;\n break;\n }\n cur = cur.parentElement;\n }\n if (!picked) return;\n e.stopPropagation();\n e.preventDefault();\n setDimGlow(false);\n onPickHost(picked.origin);\n };\n scene.addEventListener('click', onSceneClick, true);\n\n return () => {\n scene.removeEventListener('click', onSceneClick, true);\n };\n }, [explodeRoot, onPickHost]);\n\n // Empty-stage click: dim the picked glow without deselecting. The scene's\n // capture-phase click handler stops propagation when a clone is hit, so this\n // bubble-phase stage handler only fires for clicks on empty backdrop.\n useEffect(() => {\n const stage = stageRef.current;\n if (!stage) return;\n const onStageClick = () => setDimGlow(true);\n stage.addEventListener('click', onStageClick);\n return () => stage.removeEventListener('click', onStageClick);\n }, []);\n\n // Apply translateZ to each clone whenever `gap` changes. Cheap — no re-clone.\n // SVGs intentionally stay flat with their HTML parent — see the cloning\n // loop's comment about Squircle rasterization.\n useEffect(() => {\n for (const { clone, depth } of clonesRef.current) {\n if (clone instanceof SVGElement) continue;\n clone.style.transform = depth === 0 ? '' : `translateZ(${depth * gap}px)`;\n }\n }, [gap, layerCount]);\n\n // Derive picked clone from the live `node` prop (the right-hand Inspector\n // selection). Highlight the clone whose origin matches; if the selection\n // lives outside this exploded subtree, nothing is picked.\n //\n // When `isolate` is on and a layer is picked, hide everything except the\n // picked layer and its descendants. Uses `visibility` (not `opacity`)\n // because opacity multiplies down the tree — hiding an ancestor with\n // opacity:0 would also hide the picked descendant. Visibility lets a\n // descendant override an ancestor's hidden state. The picked layer stays\n // in its natural 3D position because preserve-3d composition still works\n // on hidden ancestors.\n useEffect(() => {\n const picked = explodeRoot.contains(node) ? node : null;\n const root = rootCloneRef.current;\n\n // Always reset first so toggling isolate off doesn't leave stale styles.\n for (const { clone } of clonesRef.current) {\n clone.style.visibility = '';\n }\n\n for (const { clone, origin } of clonesRef.current) {\n clone.classList.toggle(\n 'explode-picked',\n origin === picked && !dimGlow,\n );\n }\n\n if (isolate && picked && root) {\n root.style.visibility = 'hidden';\n const pickedEntry = clonesRef.current.find((e) => e.origin === picked);\n if (pickedEntry) {\n pickedEntry.clone.style.visibility = 'visible';\n // Hide picked's element children so we see just its own box (padding,\n // border, background, and any inline text). Text nodes inherit\n // visibility:visible from picked and still render.\n for (const child of Array.from(pickedEntry.clone.children)) {\n if (child instanceof HTMLElement || child instanceof SVGElement) {\n child.style.visibility = 'hidden';\n }\n }\n }\n }\n }, [node, explodeRoot, isolate, layerCount, dimGlow]);\n\n // Pointer-driven hover highlight. Tracks the topmost clone under the cursor\n // (e.target respects the 3D stacking) and toggles the `explode-hover` class.\n useEffect(() => {\n const scene = sceneRef.current;\n if (!scene) return;\n let hovered: Element | null = null;\n // Significant clones only — layout wrappers don't receive hover glow.\n const significantClones = new Map<Element, CloneEntry>();\n for (const entry of clonesRef.current) {\n if (entry.significant) significantClones.set(entry.clone, entry);\n }\n\n const setHover = (next: Element | null) => {\n if (hovered === next) return;\n if (hovered) hovered.classList.remove('explode-hover');\n if (next) next.classList.add('explode-hover');\n hovered = next;\n };\n\n const onMove = (e: PointerEvent) => {\n const target = e.target as Element | null;\n let cur: Element | null = target;\n while (cur && !significantClones.has(cur)) cur = cur.parentElement;\n setHover(cur);\n };\n const onLeave = () => setHover(null);\n\n scene.addEventListener('pointermove', onMove);\n scene.addEventListener('pointerleave', onLeave);\n return () => {\n scene.removeEventListener('pointermove', onMove);\n scene.removeEventListener('pointerleave', onLeave);\n setHover(null);\n };\n }, [layerCount]);\n\n // Live mirrors of rotX/rotY so drag handlers can read the latest value\n // without subscribing them as effect dependencies (which would re-run the\n // effect on every rotation update and reset the drag state mid-drag).\n const rotXRef = useRef(rotX);\n const rotYRef = useRef(rotY);\n rotXRef.current = rotX;\n rotYRef.current = rotY;\n\n // Drag-to-orbit. Pointerdown on stage starts a drag session; move/up are\n // attached to window for the duration so the drag survives the cursor\n // leaving the stage. We deliberately do NOT call setPointerCapture — that\n // interferes with the trailing click event reaching clone elements, which\n // is how layer picking works.\n useEffect(() => {\n const stage = stageRef.current;\n if (!stage) return;\n let didDrag = false;\n let startX = 0;\n let startY = 0;\n let startRotX = 0;\n let startRotY = 0;\n\n const onMove = (e: PointerEvent) => {\n const dx = e.clientX - startX;\n const dy = e.clientY - startY;\n if (!didDrag && Math.abs(dx) + Math.abs(dy) < 5) return;\n didDrag = true;\n setRotY(startRotY + dx * 0.5);\n setRotX(clamp(startRotX - dy * 0.5, -89, 89));\n };\n\n const onUp = () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n if (didDrag) {\n // Block the trailing click so releasing an orbit drag doesn't also\n // pick a layer.\n const swallow = (ev: Event) => {\n ev.stopPropagation();\n ev.preventDefault();\n window.removeEventListener('click', swallow, true);\n };\n window.addEventListener('click', swallow, true);\n }\n };\n\n const onDown = (e: PointerEvent) => {\n if (e.button !== 0) return;\n didDrag = false;\n startX = e.clientX;\n startY = e.clientY;\n startRotX = rotXRef.current;\n startRotY = rotYRef.current;\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n window.addEventListener('pointercancel', onUp);\n };\n\n stage.addEventListener('pointerdown', onDown);\n return () => {\n stage.removeEventListener('pointerdown', onDown);\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n window.removeEventListener('pointercancel', onUp);\n };\n }, []);\n\n // Scroll-to-zoom.\n useEffect(() => {\n const stage = stageRef.current;\n if (!stage) return;\n const onWheel = (e: WheelEvent) => {\n e.preventDefault();\n const factor = e.deltaY < 0 ? 1.08 : 1 / 1.08;\n setZoom((z) => clamp(z * factor, 0.2, 4));\n };\n stage.addEventListener('wheel', onWheel, { passive: false });\n return () => stage.removeEventListener('wheel', onWheel);\n }, []);\n\n // When isolate is on with a pick, we want the picked layer to become the\n // scene's center of gravity: shift `rootClone` so the picked layer's center\n // sits at the scene's geometric center (which is also the rotation pivot),\n // and swap `baseScale` to fit the picked layer's size instead of the whole\n // exploded subtree.\n const isolateFocus = useMemo(() => {\n if (!isolate) return null;\n const picked = explodeRoot.contains(node) ? node : null;\n if (!picked) return null;\n const rootRect = explodeRoot.getBoundingClientRect();\n const pickedRect = picked.getBoundingClientRect();\n if (!rootRect.width || !pickedRect.width) return null;\n // Divide by canvas scale to keep rects in the same natural CSS px space\n // as the rootClone's width/height (set above).\n const canvasScale = getAncestorScale(explodeRoot);\n const pickedCenterX =\n (pickedRect.left + pickedRect.width / 2 - rootRect.left) / canvasScale;\n const pickedCenterY =\n (pickedRect.top + pickedRect.height / 2 - rootRect.top) / canvasScale;\n return {\n offsetX: rootRect.width / 2 / canvasScale - pickedCenterX,\n offsetY: rootRect.height / 2 / canvasScale - pickedCenterY,\n pickedW: pickedRect.width / canvasScale,\n pickedH: pickedRect.height / canvasScale,\n };\n }, [isolate, node, explodeRoot, layerCount]);\n\n // Apply / clear the root-clone offset that centers the picked layer.\n // Transitioned so toggling isolate slides the layer to center smoothly.\n useEffect(() => {\n const root = rootCloneRef.current;\n if (!root) return;\n root.style.transition =\n 'transform 0.45s cubic-bezier(0.2, 0.8, 0.2, 1)';\n root.style.transform = isolateFocus\n ? `translate(${isolateFocus.offsetX}px, ${isolateFocus.offsetY}px)`\n : '';\n }, [isolateFocus]);\n\n // Toggling isolate snaps zoom back to 1 so the new baseScale fits the\n // picked layer cleanly (rather than being multiplied by whatever zoom the\n // user dialed for the wider view).\n useEffect(() => {\n setZoom(1);\n }, [isolate]);\n\n // Base scale fits the original subtree into the stage with a comfortable\n // margin. When isolate is on, we fit the picked layer instead (capped at\n // 4× to avoid extreme zoom-ins on tiny picks).\n const baseScale = useMemo(() => {\n if (!stageSize.w || !stageSize.h) return 1;\n if (isolateFocus) {\n return Math.min(\n (stageSize.w * 0.7) / isolateFocus.pickedW,\n (stageSize.h * 0.7) / isolateFocus.pickedH,\n 4,\n );\n }\n const root = rootCloneRef.current;\n if (!root) return 1;\n const w = parseFloat(root.style.width) || 1;\n const h = parseFloat(root.style.height) || 1;\n return Math.min((stageSize.w * 0.7) / w, (stageSize.h * 0.7) / h, 1);\n }, [stageSize, layerCount, isolateFocus]);\n\n const reset = () => {\n setRotX(-18);\n setRotY(28);\n setZoom(1);\n setGap(10);\n setIsolate(false);\n };\n\n return (\n <div\n data-inspector-ui\n style={{\n position: 'fixed',\n top: 16,\n right: INSPECTOR_GAP + inspectorWidth + INSPECTOR_GAP,\n bottom: 16,\n width: `min(720px, calc(100vw - ${INSPECTOR_GAP + inspectorWidth + INSPECTOR_GAP + INSPECTOR_GAP}px))`,\n zIndex: 2000,\n background: PANE_BG,\n color: '#f5f1e8',\n borderRadius: 10,\n border: '1px solid rgba(255,255,255,0.12)',\n boxShadow: '0 16px 48px rgba(0,0,0,0.4)',\n display: 'flex',\n flexDirection: 'column',\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif',\n fontSize: 13,\n overflow: 'hidden',\n }}\n >\n {/* Header */}\n <div\n style={{\n padding: '10px 14px',\n borderBottom: `1px solid ${PANE_BORDER}`,\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n minWidth: 0,\n }}\n >\n <CubeGlyph />\n <span style={{ fontSize: 14, fontWeight: 600, color: '#fff' }}>\n 3D Explode\n </span>\n <span\n style={{\n fontSize: 11,\n color: 'rgba(255,255,255,0.45)',\n marginLeft: 4,\n }}\n >\n {layerCount} layer{layerCount === 1 ? '' : 's'} · drag to orbit · scroll to zoom\n </span>\n <button\n onClick={onClose}\n title=\"Close (Esc)\"\n style={{\n marginLeft: 'auto',\n background: 'transparent',\n color: 'rgba(255,255,255,0.6)',\n border: 'none',\n cursor: 'pointer',\n fontSize: 22,\n lineHeight: 1,\n padding: 0,\n flexShrink: 0,\n }}\n >\n ×\n </button>\n </div>\n\n {/* Stage */}\n <div\n ref={stageRef}\n data-explode-stage={bgMode}\n style={{\n flex: 1,\n position: 'relative',\n overflow: 'hidden',\n cursor: 'grab',\n background:\n bgMode === 'dark'\n ? 'radial-gradient(ellipse at center, rgba(255,255,255,0.06) 0%, rgba(0,0,0,0.4) 80%)'\n : 'radial-gradient(ellipse at center, #fafafa 0%, #d8d8d8 90%)',\n perspective: 1800,\n }}\n >\n <div\n ref={sceneRef}\n style={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transformStyle: 'preserve-3d',\n transform: `translate(-50%, -50%) rotateX(${rotX}deg) rotateY(${rotY}deg)`,\n pointerEvents: 'auto',\n willChange: 'transform',\n }}\n >\n <div\n ref={scaleWrapRef}\n style={{\n transformStyle: 'preserve-3d',\n transform: `scale(${baseScale * zoom})`,\n transition: 'transform 0.45s cubic-bezier(0.2, 0.8, 0.2, 1)',\n willChange: 'transform',\n }}\n />\n </div>\n\n {/* Bottom-left tip about what the colored outline means. */}\n {explodeRoot.contains(node) && (\n <div\n style={{\n position: 'absolute',\n left: 12,\n bottom: 12,\n padding: '4px 8px',\n borderRadius: 4,\n background: bgMode === 'dark' ? 'rgba(154,166,187,0.16)' : 'rgba(154,166,187,0.14)',\n color: bgMode === 'dark' ? '#9bb9ff' : '#1962d4',\n fontSize: 11,\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n pointerEvents: 'none',\n }}\n >\n depth {depthOf(node, explodeRoot)} · picked\n </div>\n )}\n </div>\n\n {/* Footer controls */}\n <div\n style={{\n padding: '10px 14px',\n borderTop: `1px solid ${PANE_BORDER}`,\n display: 'flex',\n alignItems: 'center',\n gap: 16,\n flexWrap: 'wrap',\n }}\n >\n <label style={controlLabelStyle}>\n <span style={{ width: 38 }}>depth</span>\n <input\n type=\"range\"\n min={0}\n max={140}\n step={2}\n value={gap}\n onChange={(e) => setGap(Number(e.currentTarget.value))}\n style={{ width: 140, accentColor: '#9aa6bb' }}\n />\n <span style={{ width: 36, textAlign: 'right', color: 'rgba(255,255,255,0.6)' }}>\n {gap}px\n </span>\n </label>\n\n <label style={controlLabelStyle}>\n <input\n type=\"checkbox\"\n checked={isolate}\n onChange={(e) => setIsolate(e.currentTarget.checked)}\n style={{ accentColor: '#9aa6bb' }}\n />\n isolate picked\n </label>\n\n <button\n onClick={() => setBgMode((m) => (m === 'dark' ? 'light' : 'dark'))}\n style={pillBtnStyle}\n title=\"Toggle stage background\"\n >\n {bgMode === 'dark' ? 'bg: dark' : 'bg: light'}\n </button>\n\n <button onClick={reset} style={pillBtnStyle} title=\"Reset orbit, zoom, depth\">\n reset view\n </button>\n </div>\n </div>\n );\n}\n\nfunction CubeGlyph() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M8 1.5l5.5 3v7L8 14.5l-5.5-3v-7L8 1.5zM8 1.5v6m0 0L2.5 4.5M8 7.5l5.5-3M8 7.5v7\"\n stroke=\"#fff\"\n strokeWidth=\"1.2\"\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n />\n </svg>\n );\n}\n\nconst controlLabelStyle: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 8,\n fontSize: 12,\n color: 'rgba(255,255,255,0.78)',\n cursor: 'pointer',\n};\n\nconst pillBtnStyle: CSSProperties = {\n background: 'transparent',\n color: 'rgba(255,255,255,0.78)',\n border: '1px solid rgba(255,255,255,0.18)',\n padding: '4px 10px',\n borderRadius: 999,\n fontSize: 12,\n cursor: 'pointer',\n fontFamily: 'inherit',\n};\n\nfunction clamp(v: number, lo: number, hi: number) {\n return Math.min(hi, Math.max(lo, v));\n}\n\nfunction depthOf(node: HTMLElement, root: HTMLElement): number {\n let depth = 0;\n let cur: HTMLElement | null = node;\n while (cur && cur !== root) {\n cur = cur.parentElement;\n depth++;\n }\n return cur === root ? depth : -1;\n}\n","// XRayView.tsx — Wireframe x-ray pane for the Inspector.\n//\n// Sister pane to ExplodedView (mutually exclusive — Inspector only opens one\n// at a time). Renders the selected subtree as a Figma-style wireframe: only\n// elements with visible representation (background / border / border-radius /\n// content leaves) get an outline, and text-leaf elements render their actual\n// text in place of a bounding box. Invisible wrappers stay in the tree for\n// spacing calculations but are not drawn (unless \"show wireframes\" is on).\n//\n// Hover-vs-selected: when you hover one element while another is selected,\n// red distance lines + px labels appear between them — agnostic to whether\n// the gap is margin, padding, gap, or empty space. When hover === selected\n// (or no hover), the selected element shows its own padding (green) /\n// margin (orange) tints with px labels.\n//\n// Stage supports scroll-to-zoom (centered on cursor) and drag-anywhere-to-pan.\n\nimport type { CSSProperties } from 'react';\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport { getAncestorScale } from './getAncestorScale';\nimport { lookupSpacingToken } from './tokens';\nimport { adapterHasTokens, getDesignSystemAdapter } from '../adapters';\n\n// Format a px spacing value per the user's labelMode. Token mode prefers\n// the Spring spacing-token name (e.g. \"space-4\") and falls back to px when\n// no token matches; px mode always shows the integer pixel count.\nfunction fmtSpacing(px: number, mode: 'token' | 'px'): string {\n const n = Math.round(px);\n if (mode === 'px') return `${n}`;\n return lookupSpacingToken(n) ?? `${n}`;\n}\n\ntype Props = {\n node: HTMLElement;\n onPickHost: (host: Element) => void;\n onClose: () => void;\n // Live width of the Inspector panel to the right of this pane; used to\n // keep the right edge of the X-ray pane flush against the inspector\n // when the inspector is resized.\n inspectorWidth: number;\n};\n\nconst INSPECTOR_GAP = 16;\n\ntype Box = { t: number; r: number; b: number; l: number };\ntype Corners = { tl: number; tr: number; br: number; bl: number };\ntype Rect = { x: number; y: number; w: number; h: number };\n\ntype LayerEntry = {\n el: HTMLElement | SVGElement;\n depth: number;\n // Source (unscaled) coordinates relative to xrayRoot's top-left.\n rect: Rect;\n padding: Box;\n margin: Box;\n border: Box;\n radius: Corners;\n // Visual classification.\n hasOutline: boolean; // bg / border / radius / content leaf — draw a box\n text: string | null; // direct text content if this element is a text leaf\n // Font properties captured for text rendering.\n font: {\n family: string;\n size: number;\n weight: string;\n style: string;\n // Unscaled px (or null when \"normal\"); scaled by the stage at render time.\n lineHeightPx: number | null;\n letterSpacingPx: number | null;\n textAlign: string;\n textTransform: string;\n // Replayed verbatim so the x-ray reproduces the source's own wrapping /\n // truncation (nowrap+ellipsis stays truncated; normal wraps).\n whiteSpace: string;\n textOverflow: string;\n } | null;\n // Cloneable visual content. SVGs always render (as hollow strokes). IMGs\n // are gated by the \"show images\" toggle — until then they render as a\n // placeholder rect like other content leaves. `clip` is the nearest\n // ancestor (up to 5 levels) that clips its contents via overflow / clip-path\n // — used as the wrapper shape so e.g. avatar circles render as circles.\n content:\n | { kind: 'svg'; source: SVGElement; color: string }\n | {\n kind: 'img';\n src: string;\n objectFit: string;\n objectPosition: string;\n clip: { rect: Rect; radius: Corners } | null;\n }\n | null;\n};\n\ntype Fit = { baseScale: number; offsetX: number; offsetY: number };\n\nconst PANE_BG = '#18191b'; // matches the canvas / Inspector bg\nconst PANE_BORDER = 'rgba(255,255,255,0.08)';\n// Self-spacing rendered as diagonal hatch so the spacing rings read as \"this\n// is space, not solid content\". Padding stripes go 45° turquoise, margin -45°\n// pink so they're distinguishable when both are on.\nconst COLOR_PADDING = 'rgba(64,224,208,0.42)'; // turquoise\nconst COLOR_MARGIN = 'rgba(255,130,175,0.42)'; // pink\nconst HATCH_PADDING = `repeating-linear-gradient(45deg, rgba(64,224,208,0.65) 0 1px, rgba(64,224,208,0.15) 1px 4px)`;\nconst HATCH_MARGIN = `repeating-linear-gradient(-45deg, rgba(255,130,175,0.65) 0 1px, rgba(255,130,175,0.15) 1px 4px)`;\nconst COLOR_OUTLINE = 'rgba(255,255,255,0.72)';\nconst COLOR_TEXT = 'rgba(255,255,255,0.92)';\nconst COLOR_LABEL_BG = 'rgba(0,0,0,0.7)';\nconst COLOR_LABEL_TEXT = '#fff';\nconst COLOR_SELECTED = '#9aa6bb';\nconst COLOR_HOVER = '#9BB9FF';\nconst COLOR_DISTANCE = '#FF5C7A';\n\n// Tags whose content is visually meaningful even without bg/border/radius.\nconst CONTENT_LEAF_TAGS = new Set([\n 'IMG', 'SVG', 'INPUT', 'TEXTAREA', 'CANVAS', 'VIDEO', 'AUDIO', 'PICTURE',\n 'IFRAME', 'OBJECT', 'EMBED',\n]);\n\nexport function XRayView({ node, onPickHost, onClose, inspectorWidth }: Props) {\n const stageRef = useRef<HTMLDivElement>(null);\n\n // Like ExplodedView: root is whichever element was selected when the pane\n // opened. Picking a sublayer updates the Inspector but doesn't re-root\n // unless the new selection escapes the current subtree.\n const [xrayRoot, setXrayRoot] = useState<HTMLElement>(node);\n useEffect(() => {\n if (!xrayRoot.contains(node)) setXrayRoot(node);\n }, [node, xrayRoot]);\n\n const [showWireframes, setShowWireframes] = useState(false);\n const [showImages, setShowImages] = useState(true);\n // Default to tokens because the use-case is handoff. Falls back to px per\n // label when no Spring spacing token matches the value.\n // Spacing tokens need a design system; default to raw px without one.\n const [labelMode, setLabelMode] = useState<'token' | 'px'>(() =>\n adapterHasTokens() ? 'token' : 'px',\n );\n const [hovered, setHovered] = useState<HTMLElement | SVGElement | null>(null);\n const [stageSize, setStageSize] = useState({ w: 0, h: 0 });\n const [layerVersion, setLayerVersion] = useState(0);\n // Zoom + pan (pan is in screen-pixel offset applied on top of the fit).\n const [zoom, setZoom] = useState(1);\n const [pan, setPan] = useState({ x: 0, y: 0 });\n\n // ESC closes the pane (capture-phase + stopPropagation so the main\n // Inspector's ESC doesn't also exit inspect mode).\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.stopPropagation();\n onClose();\n }\n };\n window.addEventListener('keydown', onKey, true);\n return () => window.removeEventListener('keydown', onKey, true);\n }, [onClose]);\n\n useLayoutEffect(() => {\n const stage = stageRef.current;\n if (!stage) return;\n const measure = () => {\n const r = stage.getBoundingClientRect();\n setStageSize({ w: r.width, h: r.height });\n };\n measure();\n const ro = new ResizeObserver(measure);\n ro.observe(stage);\n return () => ro.disconnect();\n }, []);\n\n // Re-walk the live subtree when root or layerVersion changes. Pure\n // measurement, no cloning — overlays are drawn from these entries.\n const layers = useMemo<LayerEntry[]>(() => {\n void layerVersion;\n const rootRect = xrayRoot.getBoundingClientRect();\n if (!rootRect.width || !rootRect.height) return [];\n // Compensate for the DesignCanvas viewport's transform: scale(N) so all\n // rects come back in natural CSS px (matching the untransformed padding /\n // margin / font-size values we read from getComputedStyle).\n const canvasScale = getAncestorScale(xrayRoot);\n const out: LayerEntry[] = [];\n const walk = (el: HTMLElement | SVGElement, depth: number) => {\n const cs = window.getComputedStyle(el);\n if (cs.display === 'none' || cs.visibility === 'hidden') return;\n const r = el.getBoundingClientRect();\n const isSvgRoot = el instanceof SVGSVGElement;\n // Full text run for this element: a simple text leaf, OR an element whose\n // direct text is interleaved with inline children (e.g.\n // `Tap <strong>Allow</strong> when…`). In the latter case we render the\n // whole string here and stop recursing so the inline fragments don't also\n // render on top.\n const textBlock = getTextBlock(el, cs);\n if (r.width > 0 || r.height > 0) {\n const padding = readBox(cs, 'padding');\n const margin = readBox(cs, 'margin');\n const border = readBorderWidth(cs);\n const radius = readCorners(cs);\n let content = getRenderableContent(el, cs);\n if (content?.kind === 'img') {\n const clipAncestor = getClipAncestor(el, 5);\n if (clipAncestor) {\n const cr = clipAncestor.el.getBoundingClientRect();\n content = {\n ...content,\n clip: {\n rect: {\n x: (cr.left - rootRect.left) / canvasScale,\n y: (cr.top - rootRect.top) / canvasScale,\n w: cr.width / canvasScale,\n h: cr.height / canvasScale,\n },\n radius: clipAncestor.radius,\n },\n };\n }\n }\n out.push({\n el,\n depth,\n rect: {\n x: (r.left - rootRect.left) / canvasScale,\n y: (r.top - rootRect.top) / canvasScale,\n w: r.width / canvasScale,\n h: r.height / canvasScale,\n },\n padding,\n margin,\n border,\n radius,\n hasOutline: shouldDrawOutline(el, cs, border, radius),\n text: textBlock,\n font: textBlock !== null ? readFont(cs) : null,\n content,\n });\n }\n // SVG children are part of the icon's internal geometry — don't surface\n // them as separate layers. IMG and other content leaves have no\n // meaningful children to walk anyway.\n if (isSvgRoot) return;\n // Inline-text container already rendered its whole string — its inline\n // children (strong/em/a/span runs) are part of that text, not layers.\n if (textBlock !== null) return;\n for (const c of Array.from(el.children)) {\n if (c instanceof HTMLElement || c instanceof SVGElement) walk(c, depth + 1);\n }\n };\n walk(xrayRoot, 0);\n return out;\n }, [xrayRoot, layerVersion]);\n\n // Effective scale (fit-to-stage × user zoom). Pan is applied separately\n // since it's in screen-pixel space.\n const fit = useMemo<Fit | null>(() => {\n if (!stageSize.w || !stageSize.h) return null;\n const rootRect = xrayRoot.getBoundingClientRect();\n if (!rootRect.width || !rootRect.height) return null;\n // Match the canvas-scale compensation done in the layer walk — fit the\n // natural CSS size, not the post-canvas-zoom visual size.\n const canvasScale = getAncestorScale(xrayRoot);\n const naturalW = rootRect.width / canvasScale;\n const naturalH = rootRect.height / canvasScale;\n const baseScale = Math.min(\n (stageSize.w * 0.86) / naturalW,\n (stageSize.h * 0.86) / naturalH,\n 1.5,\n );\n return {\n baseScale,\n offsetX: (stageSize.w - naturalW * baseScale) / 2,\n offsetY: (stageSize.h - naturalH * baseScale) / 2,\n };\n }, [stageSize, xrayRoot, layers]);\n\n const scale = (fit?.baseScale ?? 1) * zoom;\n\n // Visible layers: hasOutline OR hasText. Wireframes-mode also shows\n // outlines for invisible wrappers (and makes them hit-testable). The selected\n // element is always kept — even an invisible layout wrapper — so its\n // padding/margin self-spacing shows in Simple view without flipping to Detailed.\n const visibleLayers = useMemo(\n () => layers.filter((l) => l.hasOutline || l.text !== null || l.content !== null || showWireframes || l.el === node),\n [layers, showWireframes, node],\n );\n\n // Deeper renders on top — smaller, more specific hit targets win.\n const orderedLayers = useMemo(\n () => [...visibleLayers].sort((a, b) => a.depth - b.depth),\n [visibleLayers],\n );\n\n // Selected layer (if it's in the current subtree). Always pulled from\n // `layers` (not visibleLayers) so we can show selection stroke even on\n // an \"invisible\" element if it happens to be the selected one.\n const selectedLayer = useMemo(\n () => layers.find((l) => l.el === node) ?? null,\n [layers, node],\n );\n\n // Stage-level pointer handling: pan if drag, hit-test layer on move\n // (hover), pick layer on click (when no drag occurred).\n const dragRef = useRef<{ active: boolean; didDrag: boolean; startX: number; startY: number; startPanX: number; startPanY: number } | null>(null);\n\n const hitLayerAt = useCallback(\n (px: number, py: number): HTMLElement | SVGElement | null => {\n if (!fit) return null;\n for (let i = orderedLayers.length - 1; i >= 0; i--) {\n const l = orderedLayers[i];\n const left = fit.offsetX + pan.x + l.rect.x * scale;\n const top = fit.offsetY + pan.y + l.rect.y * scale;\n const w = l.rect.w * scale;\n const h = l.rect.h * scale;\n if (px >= left && px <= left + w && py >= top && py <= top + h) {\n return l.el;\n }\n }\n return null;\n },\n [orderedLayers, fit, scale, pan],\n );\n\n // SVG roots are valid pick targets now — Inspector's AssetSection detects\n // them and surfaces Spring icon info (token + import). For SVG sub-nodes\n // (path/g) walk up to the owner svg so the picker unit matches the visual\n // layer x-ray renders.\n const toPickTarget = (el: HTMLElement | SVGElement): Element | null => {\n if (el instanceof HTMLElement) return el;\n if (el instanceof SVGSVGElement) return el;\n return el.ownerSVGElement ?? el.parentElement;\n };\n\n const onPointerDown = (e: React.PointerEvent<HTMLDivElement>) => {\n if (e.button !== 0) return;\n dragRef.current = {\n active: true,\n didDrag: false,\n startX: e.clientX,\n startY: e.clientY,\n startPanX: pan.x,\n startPanY: pan.y,\n };\n };\n\n const onPointerMove = (e: React.PointerEvent<HTMLDivElement>) => {\n const drag = dragRef.current;\n const stage = stageRef.current;\n if (!stage) return;\n if (drag?.active) {\n const dx = e.clientX - drag.startX;\n const dy = e.clientY - drag.startY;\n if (!drag.didDrag && Math.abs(dx) + Math.abs(dy) < 4) {\n // pre-drag threshold; treat as hover until exceeded\n } else {\n drag.didDrag = true;\n setPan({ x: drag.startPanX + dx, y: drag.startPanY + dy });\n return;\n }\n }\n const sr = stage.getBoundingClientRect();\n const found = hitLayerAt(e.clientX - sr.left, e.clientY - sr.top);\n if (found !== hovered) setHovered(found);\n };\n\n const onPointerUp = (e: React.PointerEvent<HTMLDivElement>) => {\n const drag = dragRef.current;\n dragRef.current = null;\n if (!drag) return;\n if (drag.didDrag) return; // pan completed; suppress pick\n const stage = stageRef.current;\n if (!stage) return;\n const sr = stage.getBoundingClientRect();\n const found = hitLayerAt(e.clientX - sr.left, e.clientY - sr.top);\n if (!found) return;\n const target = toPickTarget(found);\n if (target) onPickHost(target);\n };\n\n const onPointerLeave = () => setHovered(null);\n\n // Wheel-to-zoom. With a selection, each zoom snaps the selected element's\n // center to the stage center — so it stays framed as you scrub the zoom.\n // No selection → cursor-anchored zoom (preserves world point under cursor).\n const onWheel = useCallback(\n (e: WheelEvent) => {\n e.preventDefault();\n const stage = stageRef.current;\n if (!stage || !fit) return;\n const sr = stage.getBoundingClientRect();\n const cursorX = e.clientX - sr.left;\n const cursorY = e.clientY - sr.top;\n const factor = e.deltaY < 0 ? 1.1 : 1 / 1.1;\n setZoom((z1) => {\n const z2 = Math.min(Math.max(z1 * factor, 0.25), 8);\n if (z2 === z1) return z1;\n setPan((p) => {\n if (selectedLayer) {\n // Auto-center: solve screen = stageCenter for the selected center\n // stageCx = fit.offsetX + newPan.x + worldCx * fit.baseScale * z2\n const worldCx = selectedLayer.rect.x + selectedLayer.rect.w / 2;\n const worldCy = selectedLayer.rect.y + selectedLayer.rect.h / 2;\n return {\n x: stageSize.w / 2 - fit.offsetX - worldCx * fit.baseScale * z2,\n y: stageSize.h / 2 - fit.offsetY - worldCy * fit.baseScale * z2,\n };\n }\n // No selection: anchor on cursor (preserve world point under it).\n // newPan = cursor - off - (z2/z1)*(cursor - off - pan)\n return {\n x: cursorX - fit.offsetX - (z2 / z1) * (cursorX - fit.offsetX - p.x),\n y: cursorY - fit.offsetY - (z2 / z1) * (cursorY - fit.offsetY - p.y),\n };\n });\n return z2;\n });\n },\n [fit, selectedLayer, stageSize],\n );\n\n // Attach wheel listener manually with passive:false so preventDefault works.\n useEffect(() => {\n const stage = stageRef.current;\n if (!stage) return;\n stage.addEventListener('wheel', onWheel, { passive: false });\n return () => stage.removeEventListener('wheel', onWheel);\n }, [onWheel]);\n\n // Reset pan + zoom when the root changes (different prototype subtree).\n useEffect(() => {\n setZoom(1);\n setPan({ x: 0, y: 0 });\n }, [xrayRoot]);\n\n const resetView = () => {\n setZoom(1);\n setPan({ x: 0, y: 0 });\n };\n\n // Decide whether to show self-spacing tints (selected, no hover-target) or\n // distance lines (selected + different element hovered).\n const hoverDifferent = hovered && hovered !== node ? hovered : null;\n const hoveredLayer = useMemo(\n () => (hoverDifferent ? layers.find((l) => l.el === hoverDifferent) ?? null : null),\n [hoverDifferent, layers],\n );\n\n const outlineColor = COLOR_OUTLINE;\n const textColor = COLOR_TEXT;\n\n return (\n <div\n data-inspector-ui\n style={{\n ...paneStyle,\n right: INSPECTOR_GAP + inspectorWidth + INSPECTOR_GAP,\n width: `min(720px, calc(100vw - ${INSPECTOR_GAP + inspectorWidth + INSPECTOR_GAP + INSPECTOR_GAP}px))`,\n }}\n >\n {/* Header */}\n <div style={headerStyle}>\n <XRayGlyph />\n <span style={{ fontSize: 14, fontWeight: 600, color: '#fff' }}>X-ray</span>\n <span style={subtitleStyle}>\n {visibleLayers.length} visible · {layers.length} total · {Math.round(zoom * 100)}%\n </span>\n <button onClick={() => setLayerVersion((v) => v + 1)} style={pillBtnStyleSm} title=\"Recompute layout\">\n refresh\n </button>\n <button onClick={onClose} title=\"Close (Esc)\" style={closeBtnStyle}>\n ×\n </button>\n </div>\n\n {/* Stage */}\n <div\n ref={stageRef}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerLeave={onPointerLeave}\n style={{\n flex: 1,\n position: 'relative',\n overflow: 'hidden',\n cursor: dragRef.current?.didDrag ? 'grabbing' : hovered ? 'pointer' : 'grab',\n background: 'radial-gradient(ellipse at center, rgba(255,255,255,0.04) 0%, rgba(0,0,0,0.4) 80%)',\n touchAction: 'none',\n }}\n >\n {fit && orderedLayers.map((l) => (\n <XRayLayer\n key={layerKey(l.el)}\n layer={l}\n fit={fit}\n zoom={zoom}\n pan={pan}\n outlineColor={outlineColor}\n textColor={textColor}\n isHover={hovered === l.el}\n isSelected={node === l.el}\n forceOutline={showWireframes}\n showImages={showImages}\n showSelfSpacing={node === l.el && !hoverDifferent}\n labelMode={labelMode}\n />\n ))}\n\n {/* Distance lines between selected and hovered (different element). */}\n {fit && selectedLayer && hoveredLayer && (\n <DistanceLines\n selected={selectedLayer.rect}\n hovered={hoveredLayer.rect}\n fit={fit}\n scale={scale}\n pan={pan}\n labelMode={labelMode}\n />\n )}\n </div>\n\n {/* Footer */}\n <div style={footerStyle}>\n <SegmentedToggle\n label=\"Detail\"\n value={showWireframes ? 'detailed' : 'simple'}\n options={[\n { value: 'simple', label: 'Simple', title: 'Only outline elements that paint pixels' },\n { value: 'detailed', label: 'Detailed', title: 'Also outline invisible wrappers + make them hit-testable' },\n ]}\n onChange={(v) => setShowWireframes(v === 'detailed')}\n />\n <SegmentedToggle\n label=\"Images\"\n value={showImages ? 'on' : 'off'}\n options={[\n { value: 'on', label: 'On', title: 'Render IMG bitmaps inside their clip ancestors' },\n { value: 'off', label: 'Off', title: 'Hide IMG bitmaps — show their boxes only' },\n ]}\n onChange={(v) => setShowImages(v === 'on')}\n />\n {adapterHasTokens() && (\n <SegmentedToggle\n label=\"Units\"\n value={labelMode}\n options={[\n {\n value: 'token',\n label: 'Tok',\n title: `${getDesignSystemAdapter().libraryLabel} spacing tokens — falls back to px when no match`,\n },\n { value: 'px', label: 'Px', title: 'Raw px values' },\n ]}\n onChange={(v) => setLabelMode(v as 'token' | 'px')}\n />\n )}\n\n <button onClick={resetView} style={pillBtnStyle} title=\"Reset zoom + pan\">\n reset view\n </button>\n\n <span style={legendStyle}>\n {hoverDifferent ? (\n <>\n <LegendSwatch color={COLOR_DISTANCE} /> distance\n </>\n ) : (\n <>\n <LegendSwatch color={COLOR_MARGIN} /> margin\n <LegendSwatch color={COLOR_PADDING} /> padding\n </>\n )}\n </span>\n </div>\n </div>\n );\n}\n\nfunction XRayLayer({\n layer,\n fit,\n zoom,\n pan,\n outlineColor,\n textColor,\n isHover,\n isSelected,\n forceOutline,\n showImages,\n showSelfSpacing,\n labelMode,\n}: {\n layer: LayerEntry;\n fit: Fit;\n zoom: number;\n pan: { x: number; y: number };\n outlineColor: string;\n textColor: string;\n isHover: boolean;\n isSelected: boolean;\n forceOutline: boolean;\n showImages: boolean;\n showSelfSpacing: boolean;\n labelMode: 'token' | 'px';\n}) {\n const { rect, padding, margin, radius, text, font, content } = layer;\n const s = fit.baseScale * zoom;\n const offX = fit.offsetX + pan.x;\n const offY = fit.offsetY + pan.y;\n const borderBox = {\n left: offX + rect.x * s,\n top: offY + rect.y * s,\n width: rect.w * s,\n height: rect.h * s,\n };\n const marginBox = {\n left: borderBox.left - margin.l * s,\n top: borderBox.top - margin.t * s,\n width: borderBox.width + (margin.l + margin.r) * s,\n height: borderBox.height + (margin.t + margin.b) * s,\n };\n\n const hasMargin = margin.l > 0 || margin.r > 0 || margin.t > 0 || margin.b > 0;\n const hasPadding = padding.l > 0 || padding.r > 0 || padding.t > 0 || padding.b > 0;\n // IMG rendering its bitmap replaces the placeholder outline (selection /\n // hover / wireframe strokes still apply on top).\n const showingImageContent = content?.kind === 'img' && showImages;\n const effectiveHasOutline = showingImageContent ? false : layer.hasOutline;\n const drawOutline = effectiveHasOutline || forceOutline || isSelected || isHover;\n // \"Wireframe-only\" = an outline that's only here because the show-wireframes\n // toggle forced it on. Render dashed + 40% so it reads as supplementary,\n // not as a real visible boundary.\n const isWireframeOnly = forceOutline && !effectiveHasOutline && !isSelected && !isHover;\n const strokeColor = isSelected ? COLOR_SELECTED : isHover ? COLOR_HOVER : outlineColor;\n const strokeWidth = isSelected ? 1.5 : isWireframeOnly ? 1.5 : 1;\n const strokeStyle = isWireframeOnly ? 'dashed' : 'solid';\n const outlineOpacity = isWireframeOnly ? 0.45 : 1;\n const radiusCss = `${radius.tl * s}px ${radius.tr * s}px ${radius.br * s}px ${radius.bl * s}px`;\n\n return (\n <>\n {showSelfSpacing && hasMargin && (\n <HatchedRing\n outerBox={marginBox}\n spacing={{ t: margin.t * s, r: margin.r * s, b: margin.b * s, l: margin.l * s }}\n pattern={HATCH_MARGIN}\n />\n )}\n {showSelfSpacing && hasPadding && (\n <HatchedRing\n outerBox={borderBox}\n spacing={{ t: padding.t * s, r: padding.r * s, b: padding.b * s, l: padding.l * s }}\n pattern={HATCH_PADDING}\n />\n )}\n\n {content && (content.kind === 'svg' || showImages) && (\n <ContentLayer\n content={content}\n borderBox={borderBox}\n radiusCss={radiusCss}\n outlineColor={outlineColor}\n clipBox={\n content.kind === 'img' && content.clip\n ? {\n left: offX + content.clip.rect.x * s,\n top: offY + content.clip.rect.y * s,\n width: content.clip.rect.w * s,\n height: content.clip.rect.h * s,\n }\n : null\n }\n clipRadiusCss={\n content.kind === 'img' && content.clip\n ? `${content.clip.radius.tl * s}px ${content.clip.radius.tr * s}px ${content.clip.radius.br * s}px ${content.clip.radius.bl * s}px`\n : ''\n }\n />\n )}\n\n {drawOutline && (\n <div\n style={{\n position: 'absolute',\n ...borderBox,\n boxSizing: 'border-box',\n border: `${strokeWidth}px ${strokeStyle} ${strokeColor}`,\n borderRadius: radiusCss,\n opacity: outlineOpacity,\n pointerEvents: 'none',\n ...(isSelected ? { boxShadow: `0 0 14px rgba(154,166,187,0.35)` } : null),\n }}\n />\n )}\n\n {text !== null && font && (\n // Lay the text out at its NATURAL size in a NATURAL-width box, then scale\n // the whole box geometrically. Scaling font-size / box-width independently\n // breaks wrapping at small zoom (glyph advances don't scale linearly with\n // font-size), so text that fit on one line at 1× would wrap when zoomed\n // out. A single transform keeps wrapping pixel-identical at every zoom.\n <div\n style={{\n position: 'absolute',\n left: borderBox.left,\n top: borderBox.top,\n width: rect.w,\n height: rect.h,\n transform: `scale(${s})`,\n transformOrigin: 'top left',\n display: 'flex',\n alignItems: 'center',\n pointerEvents: 'none',\n overflow: 'hidden',\n paddingLeft: padding.l,\n paddingRight: padding.r,\n paddingTop: padding.t,\n paddingBottom: padding.b,\n boxSizing: 'border-box',\n }}\n >\n <span\n style={{\n // Full content-box width so wrapping breaks at the same points as\n // the source element and textAlign positions each line.\n width: '100%',\n fontFamily: font.family,\n fontSize: Math.max(font.size, 1),\n fontWeight: font.weight as React.CSSProperties['fontWeight'],\n fontStyle: font.style,\n lineHeight: font.lineHeightPx != null ? `${font.lineHeightPx}px` : 'normal',\n letterSpacing: font.letterSpacingPx != null ? `${font.letterSpacingPx}px` : 'normal',\n textTransform: font.textTransform as React.CSSProperties['textTransform'],\n textAlign: font.textAlign as React.CSSProperties['textAlign'],\n color: textColor,\n // Replay the source's wrapping mode. nowrap labels keep their\n // ellipsis; everything else wraps like the original.\n whiteSpace: font.whiteSpace as React.CSSProperties['whiteSpace'],\n overflow: 'hidden',\n textOverflow: font.textOverflow as React.CSSProperties['textOverflow'],\n overflowWrap: 'break-word',\n }}\n >\n {text}\n </span>\n </div>\n )}\n\n {showSelfSpacing && (\n <SpacingLabels padding={padding} margin={margin} borderBox={borderBox} marginBox={marginBox} scale={s} labelMode={labelMode} />\n )}\n </>\n );\n}\n\n// 4 strips around an inner rectangle, each filled with the hatch pattern.\n// Background-position is anchored to the outer box's top-left so the diagonal\n// stripes align across all 4 strips (no visual seam at the corners).\nfunction HatchedRing({\n outerBox,\n spacing,\n pattern,\n}: {\n outerBox: { left: number; top: number; width: number; height: number };\n spacing: Box; // already scaled to screen px\n pattern: string;\n}) {\n const { left, top, width, height } = outerBox;\n const { t, r, b, l } = spacing;\n const midH = Math.max(0, height - t - b);\n const strip = (offX: number, offY: number, w: number, h: number): CSSProperties => ({\n position: 'absolute',\n left: left + offX,\n top: top + offY,\n width: w,\n height: h,\n background: pattern,\n backgroundPosition: `${-offX}px ${-offY}px`,\n pointerEvents: 'none',\n });\n return (\n <>\n {t > 0 && <div style={strip(0, 0, width, t)} />}\n {b > 0 && <div style={strip(0, height - b, width, b)} />}\n {l > 0 && midH > 0 && <div style={strip(0, t, l, midH)} />}\n {r > 0 && midH > 0 && <div style={strip(width - r, t, r, midH)} />}\n </>\n );\n}\n\n// Renders cloned content (SVG icons as hollow strokes, IMGs as bitmaps).\n// SVGs go through the imperative ref path so we can transform the clone's\n// shapes to stroke-only. IMGs use plain JSX, optionally wrapped in a\n// clip-ancestor-shaped div so e.g. avatar circles render as circles.\nfunction ContentLayer({\n content,\n borderBox,\n radiusCss,\n outlineColor,\n clipBox,\n clipRadiusCss,\n}: {\n content: NonNullable<LayerEntry['content']>;\n borderBox: { left: number; top: number; width: number; height: number };\n radiusCss: string;\n outlineColor: string;\n clipBox: { left: number; top: number; width: number; height: number } | null;\n clipRadiusCss: string;\n}) {\n if (content.kind === 'svg') {\n return <SvgContent content={content} borderBox={borderBox} radiusCss={radiusCss} outlineColor={outlineColor} />;\n }\n return <ImgContent content={content} borderBox={borderBox} radiusCss={radiusCss} clipBox={clipBox} clipRadiusCss={clipRadiusCss} />;\n}\n\nfunction SvgContent({\n content,\n borderBox,\n radiusCss,\n outlineColor,\n}: {\n content: Extract<NonNullable<LayerEntry['content']>, { kind: 'svg' }>;\n borderBox: { left: number; top: number; width: number; height: number };\n radiusCss: string;\n outlineColor: string;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n useLayoutEffect(() => {\n const wrap = ref.current;\n if (!wrap) return;\n wrap.innerHTML = '';\n const clone = content.source.cloneNode(true) as SVGSVGElement;\n clone.removeAttribute('width');\n clone.removeAttribute('height');\n clone.style.width = '100%';\n clone.style.height = '100%';\n clone.style.display = 'block';\n const shapes = clone.querySelectorAll('path, circle, rect, ellipse, polygon, polyline, line');\n shapes.forEach((s) => {\n s.setAttribute('fill', 'none');\n s.setAttribute('stroke', 'currentColor');\n s.setAttribute('stroke-width', '1.5');\n s.setAttribute('vector-effect', 'non-scaling-stroke');\n s.removeAttribute('fill-opacity');\n });\n wrap.appendChild(clone);\n }, [content]);\n return (\n <div\n ref={ref}\n style={{\n position: 'absolute',\n ...borderBox,\n color: outlineColor,\n borderRadius: radiusCss,\n overflow: 'hidden',\n pointerEvents: 'none',\n }}\n />\n );\n}\n\nfunction ImgContent({\n content,\n borderBox,\n radiusCss,\n clipBox,\n clipRadiusCss,\n}: {\n content: Extract<NonNullable<LayerEntry['content']>, { kind: 'img' }>;\n borderBox: { left: number; top: number; width: number; height: number };\n radiusCss: string;\n clipBox: { left: number; top: number; width: number; height: number } | null;\n clipRadiusCss: string;\n}) {\n const imgStyle: CSSProperties = {\n display: 'block',\n objectFit: content.objectFit as CSSProperties['objectFit'],\n objectPosition: content.objectPosition,\n };\n\n if (clipBox) {\n // Clip-ancestor-shaped wrapper; IMG positioned inside at its true rect\n // relative to the wrapper. Intersection of ancestor's overflow:hidden +\n // shape gives the visible portion.\n return (\n <div\n style={{\n position: 'absolute',\n ...clipBox,\n borderRadius: clipRadiusCss,\n overflow: 'hidden',\n pointerEvents: 'none',\n }}\n >\n <img\n src={content.src}\n alt=\"\"\n style={{\n ...imgStyle,\n position: 'absolute',\n left: borderBox.left - clipBox.left,\n top: borderBox.top - clipBox.top,\n width: borderBox.width,\n height: borderBox.height,\n }}\n />\n </div>\n );\n }\n\n // No clip ancestor — render at the IMG's own rect with its own radius.\n return (\n <div\n style={{\n position: 'absolute',\n ...borderBox,\n borderRadius: radiusCss,\n overflow: 'hidden',\n pointerEvents: 'none',\n }}\n >\n <img src={content.src} alt=\"\" style={{ ...imgStyle, width: '100%', height: '100%' }} />\n </div>\n );\n}\n\nfunction DistanceLines({\n selected,\n hovered,\n fit,\n scale,\n pan,\n labelMode,\n}: {\n selected: Rect;\n hovered: Rect;\n fit: Fit;\n scale: number;\n pan: { x: number; y: number };\n labelMode: 'token' | 'px';\n}) {\n const offX = fit.offsetX + pan.x;\n const offY = fit.offsetY + pan.y;\n const toScreen = (x: number, y: number) => ({\n x: offX + x * scale,\n y: offY + y * scale,\n });\n\n const sTL = toScreen(selected.x, selected.y);\n const sBR = toScreen(selected.x + selected.w, selected.y + selected.h);\n const hTL = toScreen(hovered.x, hovered.y);\n const hBR = toScreen(hovered.x + hovered.w, hovered.y + hovered.h);\n\n const vOverlap = !(hovered.y + hovered.h <= selected.y || hovered.y >= selected.y + selected.h);\n const hOverlap = !(hovered.x + hovered.w <= selected.x || hovered.x >= selected.x + selected.w);\n\n type Tape = { kind: 'v' | 'h'; x1: number; y1: number; x2: number; y2: number; px: number };\n const tapes: Tape[] = [];\n\n if (vOverlap && hOverlap) {\n // Overlapping/nested: 4 corresponding-edge distances. Anchor each on the\n // midpoint of the overlapping span on the orthogonal axis for readability.\n const midX = (Math.max(sTL.x, hTL.x) + Math.min(sBR.x, hBR.x)) / 2;\n const midY = (Math.max(sTL.y, hTL.y) + Math.min(sBR.y, hBR.y)) / 2;\n if (Math.abs(selected.y - hovered.y) > 0.5) tapes.push({ kind: 'v', x1: midX, x2: midX, y1: sTL.y, y2: hTL.y, px: Math.abs(selected.y - hovered.y) });\n if (Math.abs((selected.y + selected.h) - (hovered.y + hovered.h)) > 0.5) tapes.push({ kind: 'v', x1: midX, x2: midX, y1: sBR.y, y2: hBR.y, px: Math.abs((selected.y + selected.h) - (hovered.y + hovered.h)) });\n if (Math.abs(selected.x - hovered.x) > 0.5) tapes.push({ kind: 'h', x1: sTL.x, x2: hTL.x, y1: midY, y2: midY, px: Math.abs(selected.x - hovered.x) });\n if (Math.abs((selected.x + selected.w) - (hovered.x + hovered.w)) > 0.5) tapes.push({ kind: 'h', x1: sBR.x, x2: hBR.x, y1: midY, y2: midY, px: Math.abs((selected.x + selected.w) - (hovered.x + hovered.w)) });\n } else {\n // Disjoint on at least one axis. Show a gap tape per disjoint axis,\n // anchored at the midpoint of the overlapping span on the other axis (or\n // halfway between the boxes if disjoint on both).\n if (!vOverlap) {\n const above = hovered.y + hovered.h <= selected.y;\n const fromY = above ? hBR.y : sBR.y;\n const toY = above ? sTL.y : hTL.y;\n const overlapL = Math.max(sTL.x, hTL.x);\n const overlapR = Math.min(sBR.x, hBR.x);\n const x = hOverlap ? (overlapL + overlapR) / 2 : (Math.max(sTL.x, hTL.x) + Math.min(sBR.x, hBR.x)) / 2;\n tapes.push({ kind: 'v', x1: x, x2: x, y1: fromY, y2: toY, px: Math.abs(selected.y - hovered.y - (above ? hovered.h : -selected.h)) });\n }\n if (!hOverlap) {\n const left = hovered.x + hovered.w <= selected.x;\n const fromX = left ? hBR.x : sBR.x;\n const toX = left ? sTL.x : hTL.x;\n const overlapT = Math.max(sTL.y, hTL.y);\n const overlapB = Math.min(sBR.y, hBR.y);\n const y = vOverlap ? (overlapT + overlapB) / 2 : (Math.max(sTL.y, hTL.y) + Math.min(sBR.y, hBR.y)) / 2;\n tapes.push({ kind: 'h', x1: fromX, x2: toX, y1: y, y2: y, px: Math.abs(selected.x - hovered.x - (left ? hovered.w : -selected.w)) });\n }\n }\n\n // Hovered-element stroke so the user sees what they're measuring against.\n const hoverStroke: CSSProperties = {\n position: 'absolute',\n left: hTL.x,\n top: hTL.y,\n width: hBR.x - hTL.x,\n height: hBR.y - hTL.y,\n border: `1px dashed ${COLOR_DISTANCE}`,\n pointerEvents: 'none',\n boxSizing: 'border-box',\n };\n\n const labelBg = COLOR_LABEL_BG;\n const labelColor = COLOR_LABEL_TEXT;\n\n return (\n <>\n <div style={hoverStroke} />\n {tapes.map((t, i) => {\n const midX = (t.x1 + t.x2) / 2;\n const midY = (t.y1 + t.y2) / 2;\n const lineStyle: CSSProperties = {\n position: 'absolute',\n background: COLOR_DISTANCE,\n pointerEvents: 'none',\n };\n if (t.kind === 'v') {\n Object.assign(lineStyle, {\n left: t.x1 - 0.5,\n top: Math.min(t.y1, t.y2),\n width: 1,\n height: Math.abs(t.y2 - t.y1),\n });\n } else {\n Object.assign(lineStyle, {\n left: Math.min(t.x1, t.x2),\n top: t.y1 - 0.5,\n width: Math.abs(t.x2 - t.x1),\n height: 1,\n });\n }\n return (\n <span key={i}>\n <div style={lineStyle} />\n <span\n style={{\n position: 'absolute',\n left: midX,\n top: midY,\n transform: 'translate(-50%, -50%)',\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n fontSize: 10,\n lineHeight: 1,\n padding: '2px 5px',\n borderRadius: 3,\n background: labelBg,\n color: labelColor,\n border: `1px solid ${COLOR_DISTANCE}`,\n pointerEvents: 'none',\n whiteSpace: 'nowrap',\n }}\n >\n {fmtSpacing(t.px, labelMode)}\n </span>\n </span>\n );\n })}\n </>\n );\n}\n\nfunction SpacingLabels({\n padding,\n margin,\n borderBox,\n marginBox,\n scale,\n labelMode,\n}: {\n padding: Box;\n margin: Box;\n borderBox: { left: number; top: number; width: number; height: number };\n marginBox: { left: number; top: number; width: number; height: number };\n scale: number;\n labelMode: 'token' | 'px';\n}) {\n const labelStyle: CSSProperties = {\n position: 'absolute',\n fontFamily: 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n fontSize: 10,\n lineHeight: 1,\n padding: '2px 4px',\n borderRadius: 3,\n background: 'rgba(0,0,0,0.65)',\n color: '#fff',\n pointerEvents: 'none',\n whiteSpace: 'nowrap',\n transform: 'translate(-50%, -50%)',\n };\n\n const out: React.ReactElement[] = [];\n const push = (key: string, x: number, y: number, value: number) => {\n out.push(\n <span key={key} style={{ ...labelStyle, left: x, top: y }}>\n {fmtSpacing(value, labelMode)}\n </span>,\n );\n };\n if (padding.t > 0 && padding.t * scale > 8) push('pt', borderBox.left + borderBox.width / 2, borderBox.top + (padding.t * scale) / 2, padding.t);\n if (padding.b > 0 && padding.b * scale > 8) push('pb', borderBox.left + borderBox.width / 2, borderBox.top + borderBox.height - (padding.b * scale) / 2, padding.b);\n if (padding.l > 0 && padding.l * scale > 8) push('pl', borderBox.left + (padding.l * scale) / 2, borderBox.top + borderBox.height / 2, padding.l);\n if (padding.r > 0 && padding.r * scale > 8) push('pr', borderBox.left + borderBox.width - (padding.r * scale) / 2, borderBox.top + borderBox.height / 2, padding.r);\n if (margin.t > 0 && margin.t * scale > 8) push('mt', borderBox.left + borderBox.width / 2, marginBox.top + (margin.t * scale) / 2, margin.t);\n if (margin.b > 0 && margin.b * scale > 8) push('mb', borderBox.left + borderBox.width / 2, marginBox.top + marginBox.height - (margin.b * scale) / 2, margin.b);\n if (margin.l > 0 && margin.l * scale > 8) push('ml', marginBox.left + (margin.l * scale) / 2, borderBox.top + borderBox.height / 2, margin.l);\n if (margin.r > 0 && margin.r * scale > 8) push('mr', marginBox.left + marginBox.width - (margin.r * scale) / 2, borderBox.top + borderBox.height / 2, margin.r);\n return <>{out}</>;\n}\n\n// ─── classification helpers ──────────────────────────────────────────────\n\nfunction shouldDrawOutline(el: HTMLElement | SVGElement, cs: CSSStyleDeclaration, border: Box, radius: Corners): boolean {\n // SVG roots render via cloned, stroked content — no placeholder needed.\n // IMG falls through to the content-leaf check below (placeholder rect),\n // since we don't render the image bitmap in wireframe mode.\n if (el instanceof SVGSVGElement) return false;\n if (CONTENT_LEAF_TAGS.has(el.tagName.toUpperCase())) return true;\n if (anySide(border)) return true;\n if (radius.tl > 0 || radius.tr > 0 || radius.bl > 0 || radius.br > 0) return true;\n if (cs.backgroundColor && cs.backgroundColor !== 'rgba(0, 0, 0, 0)' && cs.backgroundColor !== 'transparent') return true;\n if (cs.backgroundImage && cs.backgroundImage !== 'none') return true;\n return false;\n}\n\nfunction getRenderableContent(el: HTMLElement | SVGElement, cs: CSSStyleDeclaration): LayerEntry['content'] {\n if (el instanceof SVGSVGElement) {\n return { kind: 'svg', source: el, color: cs.color };\n }\n if (el instanceof HTMLImageElement && el.src) {\n return {\n kind: 'img',\n src: el.src,\n objectFit: cs.objectFit,\n objectPosition: cs.objectPosition,\n clip: null, // filled in by the walk\n };\n }\n return null;\n}\n\n// Walk up to `maxDepth` ancestors; return the nearest one that clips its\n// contents (overflow != visible OR a clip-path). Used to shape the wrapper\n// around image content so it matches what the prototype actually shows.\nfunction getClipAncestor(el: HTMLElement | SVGElement, maxDepth: number): { el: HTMLElement; radius: Corners } | null {\n let cur: Element | null = el.parentElement;\n let depth = 0;\n while (cur && depth < maxDepth) {\n if (cur instanceof HTMLElement) {\n const cs = window.getComputedStyle(cur);\n const clipped =\n cs.overflow !== 'visible' ||\n cs.overflowX !== 'visible' ||\n cs.overflowY !== 'visible' ||\n cs.clipPath !== 'none';\n if (clipped) return { el: cur, radius: readCorners(cs) };\n }\n cur = cur.parentElement;\n depth++;\n }\n return null;\n}\n\nfunction anySide(b: Box) {\n return b.t > 0 || b.r > 0 || b.b > 0 || b.l > 0;\n}\n\nfunction getDirectText(el: HTMLElement | SVGElement): string | null {\n let txt = '';\n for (const c of Array.from(el.childNodes)) {\n if (c.nodeType === Node.TEXT_NODE) txt += c.textContent ?? '';\n }\n txt = txt.trim();\n return txt.length > 0 ? txt : null;\n}\n\n// Normalize a text run's whitespace the way the browser would, given the\n// element's computed `white-space`. `normal`/`nowrap` collapse every run of\n// whitespace (incl. newlines from source indentation) to a single space;\n// `pre`/`pre-wrap`/`break-spaces` preserve spaces AND newlines verbatim (only\n// trimming blank outer lines); `pre-line` collapses spaces/tabs but keeps\n// newlines. Preserving the source's line structure is what makes a\n// `whitespace-pre-wrap` block (message bodies, etc.) render in x-ray the same\n// paragraphs/bullets it shows in the live UI instead of one flattened run.\nfunction normalizeWsForMode(s: string, whiteSpace: string): string {\n if (whiteSpace === 'pre' || whiteSpace === 'pre-wrap' || whiteSpace === 'break-spaces') {\n return s.replace(/^\\n+|\\n+$/g, '');\n }\n if (whiteSpace === 'pre-line') {\n return s\n .replace(/[^\\S\\n]+/g, ' ') // collapse spaces/tabs, keep newlines\n .replace(/ *\\n */g, '\\n')\n .replace(/^\\n+|\\n+$/g, '');\n }\n return s.replace(/\\s+/g, ' ').trim();\n}\n\n// True for phrasing/inline children that flow inside a text run (strong, em, a,\n// span…). Block-level children, SVGs, and replaced content (img/input/…) are\n// NOT — their presence means the element is a structural container, not a single\n// text run, so we recurse into it instead of flattening to a string.\nfunction isInlineChild(el: Element): boolean {\n if (CONTENT_LEAF_TAGS.has(el.tagName.toUpperCase())) return false;\n if (el instanceof SVGElement) return false;\n return window.getComputedStyle(el).display === 'inline';\n}\n\n// The text to render for this element as ONE run, or null if it isn't a text\n// leaf. Two cases qualify:\n// • a leaf element with no element children but visible text, and\n// • an element whose direct text nodes are interleaved with inline children\n// only (e.g. `Tap <strong>Allow</strong> when…`) — render the full string.\n// A container with no direct text (e.g. a flex header holding two spans) or with\n// any block/replaced child returns null so the walk recurses normally.\nfunction getTextBlock(el: HTMLElement | SVGElement, cs: CSSStyleDeclaration): string | null {\n const full = normalizeWsForMode(el.textContent ?? '', cs.whiteSpace);\n if (!full) return null;\n const children = Array.from(el.children);\n if (children.length === 0) return full; // simple text leaf\n if (getDirectText(el) === null) return null; // structural container, no own text\n for (const c of children) {\n if (!isInlineChild(c)) return null; // a block/replaced child → recurse instead\n }\n return full; // inline text run\n}\n\nfunction readBox(cs: CSSStyleDeclaration, prefix: 'padding' | 'margin'): Box {\n return {\n t: parseFloat(cs.getPropertyValue(`${prefix}-top`)) || 0,\n r: parseFloat(cs.getPropertyValue(`${prefix}-right`)) || 0,\n b: parseFloat(cs.getPropertyValue(`${prefix}-bottom`)) || 0,\n l: parseFloat(cs.getPropertyValue(`${prefix}-left`)) || 0,\n };\n}\n\nfunction readBorderWidth(cs: CSSStyleDeclaration): Box {\n return {\n t: parseFloat(cs.borderTopWidth) || 0,\n r: parseFloat(cs.borderRightWidth) || 0,\n b: parseFloat(cs.borderBottomWidth) || 0,\n l: parseFloat(cs.borderLeftWidth) || 0,\n };\n}\n\nfunction readCorners(cs: CSSStyleDeclaration): Corners {\n return {\n tl: parseFloat(cs.borderTopLeftRadius) || 0,\n tr: parseFloat(cs.borderTopRightRadius) || 0,\n br: parseFloat(cs.borderBottomRightRadius) || 0,\n bl: parseFloat(cs.borderBottomLeftRadius) || 0,\n };\n}\n\nfunction readFont(cs: CSSStyleDeclaration): LayerEntry['font'] {\n const lh = parseFloat(cs.lineHeight); // NaN for \"normal\"\n const ls = parseFloat(cs.letterSpacing); // NaN for \"normal\"\n return {\n family: cs.fontFamily,\n size: parseFloat(cs.fontSize) || 14,\n weight: cs.fontWeight,\n style: cs.fontStyle,\n lineHeightPx: Number.isFinite(lh) ? lh : null,\n letterSpacingPx: Number.isFinite(ls) ? ls : null,\n textAlign: cs.textAlign,\n textTransform: cs.textTransform,\n whiteSpace: cs.whiteSpace,\n textOverflow: cs.textOverflow,\n };\n}\n\nconst layerKeyMap = new WeakMap<HTMLElement | SVGElement, number>();\nlet layerKeyCounter = 0;\nfunction layerKey(el: HTMLElement | SVGElement) {\n let id = layerKeyMap.get(el);\n if (id == null) {\n id = ++layerKeyCounter;\n layerKeyMap.set(el, id);\n }\n return String(id);\n}\n\nfunction XRayGlyph() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\">\n <rect x=\"2\" y=\"2\" width=\"12\" height=\"12\" rx=\"1.5\" stroke=\"#fff\" strokeWidth=\"1.2\" />\n <rect x=\"5\" y=\"5\" width=\"6\" height=\"6\" rx=\"0.5\" stroke=\"#fff\" strokeWidth=\"1\" strokeDasharray=\"1.5 1.5\" />\n <line x1=\"8\" y1=\"0.5\" x2=\"8\" y2=\"2\" stroke=\"#fff\" strokeWidth=\"1\" />\n <line x1=\"8\" y1=\"14\" x2=\"8\" y2=\"15.5\" stroke=\"#fff\" strokeWidth=\"1\" />\n <line x1=\"0.5\" y1=\"8\" x2=\"2\" y2=\"8\" stroke=\"#fff\" strokeWidth=\"1\" />\n <line x1=\"14\" y1=\"8\" x2=\"15.5\" y2=\"8\" stroke=\"#fff\" strokeWidth=\"1\" />\n </svg>\n );\n}\n\nfunction LegendSwatch({ color }: { color: string }) {\n return (\n <span\n style={{\n display: 'inline-block',\n width: 10,\n height: 10,\n background: color,\n borderRadius: 2,\n marginRight: 4,\n marginLeft: 8,\n verticalAlign: 'middle',\n }}\n />\n );\n}\n\n// Static parts only — `right` and `width` are set inline at render time\n// since they depend on the live `inspectorWidth` prop.\nconst paneStyle: CSSProperties = {\n position: 'fixed',\n top: 16,\n bottom: 16,\n zIndex: 2000,\n background: PANE_BG,\n color: '#f5f1e8',\n borderRadius: 10,\n border: '1px solid rgba(255,255,255,0.12)',\n boxShadow: '0 16px 48px rgba(0,0,0,0.4)',\n display: 'flex',\n flexDirection: 'column',\n fontFamily: '-apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif',\n fontSize: 13,\n overflow: 'hidden',\n};\n\nconst headerStyle: CSSProperties = {\n padding: '10px 14px',\n borderBottom: `1px solid ${PANE_BORDER}`,\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n minWidth: 0,\n};\n\nconst subtitleStyle: CSSProperties = {\n fontSize: 11,\n color: 'rgba(255,255,255,0.45)',\n marginLeft: 4,\n flex: 1,\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n};\n\nconst footerStyle: CSSProperties = {\n padding: '10px 14px',\n borderTop: `1px solid ${PANE_BORDER}`,\n display: 'flex',\n alignItems: 'center',\n gap: 16,\n flexWrap: 'wrap',\n};\n\nconst controlLabelStyle: CSSProperties = {\n display: 'inline-flex',\n alignItems: 'center',\n gap: 8,\n fontSize: 12,\n color: 'rgba(255,255,255,0.78)',\n cursor: 'pointer',\n};\n\nconst pillBtnStyle: CSSProperties = {\n background: 'transparent',\n color: 'rgba(255,255,255,0.78)',\n border: '1px solid rgba(255,255,255,0.18)',\n padding: '4px 10px',\n borderRadius: 999,\n fontSize: 12,\n cursor: 'pointer',\n fontFamily: 'inherit',\n};\n\nconst pillBtnStyleSm: CSSProperties = {\n ...pillBtnStyle,\n padding: '2px 8px',\n fontSize: 11,\n};\n\n// Labeled 2+ value segmented control — matches the Inspector's Tok / Hex /\n// Var segmented control look so the canvas-wide toolbars share one visual\n// language. Caption sits to the left of the segment group; active segment\n// gets the blue tint.\nfunction SegmentedToggle<T extends string>({\n label,\n options,\n value,\n onChange,\n}: {\n label: string;\n options: Array<{ value: T; label: string; title?: string }>;\n value: T;\n onChange: (v: T) => void;\n}) {\n return (\n <div\n style={{\n display: 'inline-flex',\n flexDirection: 'column',\n alignItems: 'flex-start',\n gap: 3,\n }}\n >\n <span\n style={{\n fontSize: 9,\n fontWeight: 600,\n color: 'rgba(255,255,255,0.45)',\n textTransform: 'uppercase',\n letterSpacing: 0.5,\n }}\n >\n {label}\n </span>\n <div\n style={{\n display: 'inline-flex',\n border: '1px solid rgba(255,255,255,0.15)',\n borderRadius: 4,\n overflow: 'hidden',\n }}\n >\n {options.map((o, i) => {\n const active = value === o.value;\n return (\n <button\n key={o.value}\n onClick={() => onChange(o.value)}\n title={o.title}\n style={{\n background: active ? 'rgba(154,166,187,0.22)' : 'transparent',\n color: active ? '#cfe0ff' : 'rgba(255,255,255,0.55)',\n border: 0,\n borderLeft: i === 0 ? 0 : '1px solid rgba(255,255,255,0.12)',\n padding: '2px 8px',\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: 0.4,\n textTransform: 'uppercase',\n cursor: 'pointer',\n fontFamily: 'inherit',\n }}\n >\n {o.label}\n </button>\n );\n })}\n </div>\n </div>\n );\n}\n\nconst closeBtnStyle: CSSProperties = {\n background: 'transparent',\n color: 'rgba(255,255,255,0.6)',\n border: 'none',\n cursor: 'pointer',\n fontSize: 22,\n lineHeight: 1,\n padding: 0,\n flexShrink: 0,\n};\n\nconst legendStyle: CSSProperties = {\n marginLeft: 'auto',\n fontSize: 11,\n color: 'rgba(255,255,255,0.6)',\n display: 'inline-flex',\n alignItems: 'center',\n};\n","// domInspect — fiber-free DOM labeling + source-anchor parsing.\n//\n// The frozen-snapshot machinery this file once owned (shadow-root descent,\n// snapshot-body plumbing, preview shell chains) was ripped 2026-07-06: the\n// capture/moments layer was removed 2026-06-14 and NOTHING stamps\n// `data-quilt-snapshot-*` anywhere anymore, so every snapshot helper had zero\n// live producers (P3.1). What remains is the small honest-DOM surface the LIVE\n// paths still use: parsing the build-time `data-anchor` source stamp, and\n// labeling a fiber-less DOM node (used by the Inspector's DOM-mode selections\n// inside same-origin live route frames — see frameInspect.ts).\n//\n// Library-core rules: no design-system imports, framework-free.\n\n/** Parsed `data-anchor` source stamp (\"src/App.tsx:120:8\"). */\nexport type AnchorSource = {\n path: string;\n /** Basename of the path, e.g. \"App.tsx\". */\n base: string;\n line: number;\n col: number | null;\n};\n\nexport function parseAnchorSource(anchor: string): AnchorSource | null {\n const m = anchor.match(/^(.*?):(\\d+)(?::(\\d+))?$/);\n if (!m) return null;\n const path = m[1];\n if (!path) return null;\n return {\n path,\n base: path.split('/').pop() || path,\n line: Number(m[2]),\n col: m[3] ? Number(m[3]) : null,\n };\n}\n\n/**\n * Hierarchy row / selection label for a fiber-less DOM element, best-identity-\n * first: authored layer name (`data-name` family) → source anchor\n * (basename:line) → tag + first class → bare tag. Used for DOM-mode selections\n * inside live route frames (in-app canvas mode), which carry no React fibers.\n */\nexport function snapshotNodeLabel(el: Element): string {\n const tag = el.tagName.toLowerCase();\n const named =\n el.getAttribute('data-name') ||\n el.getAttribute('data-layer') ||\n el.getAttribute('data-label');\n if (named) return `<${tag}> ${named}`;\n const anchor = el.getAttribute('data-anchor');\n if (anchor) {\n const src = parseAnchorSource(anchor);\n if (src) return `<${tag}> ${src.base}:${src.line}`;\n }\n const cls = el.getAttribute('class') ?? '';\n const first = cls.split(/\\s+/).filter(Boolean)[0];\n return first ? `<${tag}> .${first}` : `<${tag}>`;\n}\n","// Shared inspector presentational primitives + panel layout constants.\n// Extracted from Inspector.tsx (P3.2 split). Leaf module — imported by every\n// other inspector module to keep the split acyclic (nothing here imports back).\nimport React from 'react';\n\nexport const MONO_FF =\n 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace';\n\nexport function Swatch({ color }: { color: string }) {\n return (\n <span\n aria-hidden\n style={{\n display: 'inline-block',\n width: 10,\n height: 10,\n borderRadius: 2,\n background: color,\n border: '1px solid rgba(255,255,255,0.18)',\n flexShrink: 0,\n }}\n />\n );\n}\n\n// Theme scope row in the Styles section — shows the active DS theme scope id and\n// (when the adapter can infer it) whether it reads light or dark. Only rendered\n// when the element sits in a non-global scope (a generic adapter has none).\nexport function Section({\n title,\n action,\n children,\n}: {\n title: string;\n action?: React.ReactNode;\n children: React.ReactNode;\n}) {\n return (\n <div style={{ marginBottom: 16 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n marginBottom: 6,\n color: 'rgba(255,255,255,0.5)',\n fontSize: 11,\n fontWeight: 600,\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n }}\n >\n <span>{title}</span>\n <span style={{ marginLeft: 'auto' }}>{action}</span>\n </div>\n {children}\n </div>\n );\n}\n\n// Group of sections that share a platform context (e.g. \"Web dev\" = JSX +\n// className + Props). Collapsed by default so the inspector reads as\n// platform-agnostic; users opt in when they actually need the React /\n// Tailwind specifics. Future cross-platform SDK groups (iOS, Android) will\n// reuse this wrapper.\n// Inspector panel width — user-resizable via a drag grip on the left edge.\n// Min keeps the box-model + a11y row legible; max keeps the canvas usable.\nexport const INSPECTOR_MIN_WIDTH = 360;\nexport const INSPECTOR_MAX_WIDTH = 700;\nexport const INSPECTOR_DEFAULT_WIDTH = 440;\n// Gap between the inspector and any sibling pane to its left (scan results,\n// explode, x-ray). Used in every `right: ...` math throughout this module.\nexport const INSPECTOR_LEFT_GAP = 16;\n","// Fiber-tree walking, ancestry, JSX formatting, DOM-node helpers, and the\n// selection model. Extracted from Inspector.tsx (P3.2). Reads token/style info\n// through ./tokens; never imports a design system directly.\nimport { getComponentName } from './fiberName';\nimport { getDesignSystemAdapter } from '../adapters';\nimport { collectStyleTokens, readResolvedStyles } from './tokens';\nimport type { StyleTokens, ResolvedStyles } from './tokens';\nimport { isFrameEl, closestAcrossFrames } from './frameInspect';\nimport { snapshotNodeLabel } from './domInspect';\n\nexport type Fiber = {\n return: Fiber | null;\n child: Fiber | null;\n sibling: Fiber | null;\n type: any;\n memoizedProps: Record<string, any> | null;\n stateNode: any;\n _debugSource?: { fileName: string; lineNumber: number; columnNumber?: number };\n // Dev-only: the fiber whose JSX authored this element. Set by the\n // `_jsxDEV` runtime; null for fibers whose elements came from compiled\n // library code that uses the production `jsx()` runtime (e.g. Spring's\n // internal renders). Used by `rendersOwnDom` to find the boundary between\n // a component's own render output and the children prop it received.\n _debugOwner?: Fiber | null;\n};\n\nexport const HOST_TAGS = new Set([\n 'div', 'span', 'p', 'a', 'button', 'input', 'textarea', 'select',\n 'ul', 'ol', 'li', 'section', 'article', 'header', 'footer', 'nav',\n 'main', 'aside', 'img', 'svg', 'path', 'circle', 'rect', 'g', 'h1',\n 'h2', 'h3', 'h4', 'h5', 'h6', 'label', 'form', 'pre', 'code',\n]);\n\n// Design-system identity detection (which fibers are library components, what\n// their canonical names are, which icon a given SVG belongs to) is supplied by\n// the injected DesignSystemAdapter — the core never imports a design-system\n// package. See ../adapters: the default genericAdapter knows no library;\n// examples/springAdapter.ts is the reference Spring implementation, built from\n// the spring-ui / spring-icon module exports by object identity.\n\nexport function getFiberFromDom(el: Element): Fiber | null {\n const key = Object.keys(el).find((k) => k.startsWith('__reactFiber$'));\n return key ? ((el as unknown) as Record<string, Fiber>)[key] : null;\n}\n\n// `getComponentName` lives in ./fiberName so adapters can share it without a\n// circular import back through this module. It's imported at the top.\n\nexport function isInterestingName(name: string | null): boolean {\n if (!name) return false;\n if (!/^[A-Z]/.test(name)) return false;\n // Plumbing / passthrough wrappers — filtered by NAME (not by `_debugOwner`)\n // so production builds get the same clean Hierarchy tree as dev. In\n // production React strips `_debugOwner`, so `rendersOwnDom` defaults to\n // true for every fiber → every Spring/MUI context provider, every\n // MotionConfig, every ScopedThemeProvider becomes a row, and the tree\n // explodes for deep components (e.g. KioskShell on the rooms canvas →\n // tab hangs hard enough that Chrome kills it).\n //\n // Suffix-matching catches everything by convention (`ThemeProvider`,\n // `SuiModeProvider`, `RouterContext`, `*Consumer`); the exact-match list\n // is for built-ins and named wrappers that don't follow the suffix\n // convention.\n if (\n name.endsWith('Provider') ||\n name.endsWith('Context') ||\n name.endsWith('Consumer')\n ) {\n return false;\n }\n if (\n name === 'Fragment' ||\n name === 'ForwardRef' ||\n name === 'Memo' ||\n name === 'StrictMode' ||\n name === 'Suspense' ||\n name === 'Profiler' ||\n name === 'MotionConfig' ||\n name === 'LazyMotion' ||\n name === 'AnimatePresence' ||\n name === 'Reorder' ||\n name === 'DCViewport' ||\n name === 'DCArtboardFrame' ||\n name === 'DCEditable' ||\n name === 'DesignCanvas' ||\n name === 'DCSection' ||\n name === 'Inspector' ||\n name === 'InspectorPanel'\n ) {\n return false;\n }\n return true;\n}\n\n// Is this fiber `type` an instance of the connected design system? Delegated to\n// the injected adapter (identity check against its library exports). Renamed off\n// the origin `isSpringType` since the core is design-system-agnostic now.\nexport function isLibraryType(type: any): boolean {\n if (!type) return false;\n if (typeof type !== 'function' && typeof type !== 'object') return false;\n return getDesignSystemAdapter().isLibraryComponent(type);\n}\n\n// First host (DOM) element rendered by a component fiber. Used when the user\n// walks up to a parent component — we re-bind the \"selection root\" to that\n// component's outermost rendered DOM node so styles/tokens read from the right\n// place.\nexport function findFirstHostElement(fiber: Fiber | null): HTMLElement | null {\n if (!fiber) return null;\n if (fiber.stateNode instanceof HTMLElement) return fiber.stateNode;\n let child: Fiber | null = fiber.child;\n while (child) {\n const found = findFirstHostElement(child);\n if (found) return found;\n child = child.sibling;\n }\n return null;\n}\n\n// Does this fiber's component render any DOM of its own — or is it a pure\n// context wrapper that just passes children through?\n//\n// Why we need this: components like `<ThemeProvider>`, `<SuiModeProvider>`,\n// `<MotionConfig>`, any custom Provider that just returns `{children}`, all\n// produce zero DOM. If the inspector treats them as selectable rows, the\n// box-model / preview / styles end up reading from whichever inner element\n// `findFirstHostElement` happens to land on — totally misleading.\n//\n// How: walk the fiber subtree along children authored by the component itself\n// (or by compiled-library code one level inside it). The moment we cross into\n// a fiber authored by EXTERNAL code (i.e., the `children` prop), we've left\n// the component's own render output. Track this via `_debugOwner`:\n// • `null` → compiled jsx() call. Treat as part of our chain\n// (Spring's internal renders end up here).\n// • `=== ourFiber` → directly authored by our component. Definitely ours.\n// • `descendant of ourFiber via _debugOwner chain` → authored by something\n// OUR component rendered. Still ours.\n// • anything else → authored by the caller (children prop). Stop.\n//\n// Dev-only (production strips `_debugOwner`). The Inspector itself is dev-\n// only, so this is fine; if `_debugOwner` is missing across the board we\n// fall back to \"renders DOM = true\" so nothing gets filtered incorrectly.\nexport const RENDERS_OWN_DOM_CACHE = new WeakMap<Fiber, boolean>();\nexport function rendersOwnDom(fiber: Fiber): boolean {\n const cached = RENDERS_OWN_DOM_CACHE.get(fiber);\n if (cached !== undefined) return cached;\n\n // Host fibers always render their own DOM (they ARE DOM).\n if (fiber.stateNode instanceof Element) {\n RENDERS_OWN_DOM_CACHE.set(fiber, true);\n return true;\n }\n\n const result = walkForOwnDom(fiber);\n RENDERS_OWN_DOM_CACHE.set(fiber, result);\n return result;\n}\n\nexport function walkForOwnDom(rootFiber: Fiber): boolean {\n const stack: Fiber[] = [];\n if (rootFiber.child) stack.push(rootFiber.child);\n let crossedBoundary = false;\n let visited = 0;\n\n while (stack.length && visited < 200) {\n const f = stack.pop()!;\n visited++;\n\n const ownedByUs = isOwnedTransitively(f, rootFiber);\n\n // Sibling at the same level continues whether or not THIS branch is ours\n // — push it before deciding to descend.\n if (f.sibling) stack.push(f.sibling);\n\n if (!ownedByUs) {\n crossedBoundary = true;\n continue; // don't descend into the children prop\n }\n if (f.stateNode instanceof Element) return true;\n if (f.child) stack.push(f.child);\n }\n\n // If we never crossed into the children-prop boundary AND never saw any\n // host, we're probably in production (no _debugOwner anywhere) or the tree\n // is degenerate. Be conservative: assume it renders DOM so we don't hide\n // legitimate components.\n return crossedBoundary ? false : true;\n}\n\nexport function isOwnedTransitively(f: Fiber, root: Fiber): boolean {\n // `null` _debugOwner usually means compiled-library jsx() — treat as ours.\n // This covers Spring's internal ContextProvider/ModeProvider/MotionConfig\n // chain inside <ThemeProvider>.\n const owner = f._debugOwner;\n if (owner == null) return true;\n if (owner === root) return true;\n // Anything our root authored, anything THAT authored, etc. — walk the\n // ownership chain back to root.\n let cur: Fiber | null | undefined = owner;\n let hops = 0;\n while (cur && hops < 12) {\n if (cur === root) return true;\n cur = cur._debugOwner;\n hops++;\n }\n return false;\n}\n\n// Ancestry — used by the hierarchy diagram. Walks the fiber tree up from a\n// selected host element, collecting each user component + Spring instance\n// along the way, and stops at the DesignCanvas artboard boundary so we never\n// surface the canvas chrome itself.\n\nexport type AncestryKind = 'element' | 'library' | 'user' | 'artboard';\nexport type AncestryNode = {\n // Optional: DOM nodes React didn't author (no `__reactFiber$`) still get a\n // row, identified purely by `dom`. Present for buildAncestry chain nodes and\n // most getChildSummary rows; absent only for fiber-less DOM wrappers.\n fiber?: Fiber;\n name: string;\n kind: AncestryKind;\n // The authoritative DOM host for this row, when known. getChildSummary walks\n // the real DOM, so it can stamp the exact element here — more reliable than\n // re-deriving via findFirstHostElement, which returns null for SVG\n // (SVGElement isn't HTMLElement) and the wrong host for multi-host wrappers\n // like framer-motion. It is also the row's IDENTITY for expand/select state\n // (fiber is the wrong key: one host can back several fibers, and several\n // sibling hosts can share one component fiber). hostFor() prefers this.\n dom?: Element;\n};\n\nexport const ANCESTRY_STOP_NAMES = new Set(['DCArtboardFrame', 'DCSection']);\nexport const ANCESTRY_MAX_DEPTH = 12;\n\nexport function inferKind(fiber: Fiber): AncestryKind {\n if (typeof fiber.type === 'string') return 'element';\n const name = getComponentName(fiber.type);\n if (name && ANCESTRY_STOP_NAMES.has(name)) return 'artboard';\n // `classify` returns 'library' | 'user'; both are valid AncestryKind members.\n return getDesignSystemAdapter().classify(fiber.type).kind;\n}\n\n// The authored layer label on a host element — `data-name` (and a couple of\n// common alternates) so structural divs can self-identify in the layers list.\nexport function layerLabel(node: Element | null): string | null {\n if (!node) return null;\n return (\n node.getAttribute('data-name') ||\n node.getAttribute('data-layer') ||\n node.getAttribute('data-label')\n );\n}\n\n// Component name that survives a library's nameless memo(forwardRef) exports\n// and production minification: the adapter prefers its authoritative\n// export-name map for library types and falls back to React's name resolution\n// for everyone else. This is what lets the Hierarchy tree classify library\n// components by identity even though `getComponentName` can't read a name off\n// them. (Renamed off `springAwareName`; now design-system-agnostic.)\nexport function libraryAwareName(type: any): string | null {\n return getDesignSystemAdapter().componentName(type);\n}\n\n// Hierarchy row label for a host element. \"<div> hero\" is way more useful than\n// five unlabeled <div> rows in a row.\nexport function formatHostName(node: Element | null, tag: string): string {\n const label = layerLabel(node);\n return label ? `<${tag}> ${label}` : `<${tag}>`;\n}\n\n// Append a host's authored layer label to a component row name, so a Spring or\n// user-component row keeps the naming convention too: \"Alert · CRC alert\".\nexport function appendLayerLabel(baseName: string, host: Element | null): string {\n const label = layerLabel(host);\n return label && label !== baseName ? `${baseName} · ${label}` : baseName;\n}\n\nexport function nodeNameFor(fiber: Fiber, kind: AncestryKind): string {\n if (kind === 'element') {\n const tag = typeof fiber.type === 'string' ? fiber.type : 'node';\n const node = fiber.stateNode instanceof HTMLElement ? fiber.stateNode : null;\n return formatHostName(node, tag);\n }\n if (kind === 'artboard') return 'Artboard';\n return libraryAwareName(fiber.type) ?? 'unknown';\n}\n\nexport function buildAncestry(startFiber: Fiber): AncestryNode[] {\n const out: AncestryNode[] = [];\n const startKind = inferKind(startFiber);\n out.push({\n fiber: startFiber,\n name: nodeNameFor(startFiber, startKind),\n kind: startKind,\n });\n\n // If we started at the artboard there's nowhere to go.\n if (startKind === 'artboard') return out;\n\n let cur: Fiber | null = startFiber.return;\n let added = 0;\n while (cur && added < ANCESTRY_MAX_DEPTH) {\n // Stop-name check uses the raw React name — DCArtboardFrame / DCSection are\n // our own components, whose names are always present.\n const rawName = getComponentName(cur.type);\n if (rawName && ANCESTRY_STOP_NAMES.has(rawName)) {\n out.push({ fiber: cur, name: 'Artboard', kind: 'artboard' });\n break;\n }\n const name = libraryAwareName(cur.type);\n if (isInterestingName(name) && rendersOwnDom(cur)) {\n const kind: AncestryKind = isLibraryType(cur.type) ? 'library' : 'user';\n out.push({ fiber: cur, name: name!, kind });\n added++;\n }\n cur = cur.return;\n }\n return out;\n}\n\nexport function formatPropValue(value: any): string {\n if (value === undefined) return '{undefined}';\n if (value === null) return '{null}';\n if (typeof value === 'string') return JSON.stringify(value);\n if (typeof value === 'number') return `{${value}}`;\n if (typeof value === 'boolean') return value ? '' : '{false}';\n if (typeof value === 'function') return '{() => …}';\n if (Array.isArray(value)) return '{[…]}';\n if (typeof value === 'object') {\n if (value.$$typeof) return '{<…/>}';\n return '{…}';\n }\n return `{${String(value)}}`;\n}\n\n// Render a component's `children` prop as JSX body text. We can faithfully\n// inline primitives (a button's \"Get started\" label, a number) and arrays of\n// them; for nested element children we can't reconstruct the subtree here, so\n// we return null and the caller drops in a copy-safe `{/* … */}` placeholder.\n// (The full subtree is browsable in the Hierarchy tree.)\nexport function formatChildren(children: any): string | null {\n if (children == null || children === false || children === true) return null;\n if (typeof children === 'string') return children;\n if (typeof children === 'number') return String(children);\n if (Array.isArray(children)) {\n const parts: string[] = [];\n for (const c of children) {\n if (c == null || c === false || c === true) continue;\n if (typeof c === 'string') parts.push(c);\n else if (typeof c === 'number') parts.push(String(c));\n else return null; // a non-primitive in the mix — bail to placeholder\n }\n const joined = parts.join('');\n return joined.length > 0 ? joined : null;\n }\n return null; // a single React element / object\n}\n\nexport function formatJSX(name: string, props: Record<string, any>): string {\n const skip = new Set(['children', 'key', 'ref']);\n const entries = Object.entries(props).filter(([k]) => !skip.has(k));\n\n const formatted = entries.map(([k, v]) => {\n const val = formatPropValue(v);\n return val === '' ? k : `${k}=${val}`;\n });\n\n const hasChildren =\n props.children !== undefined &&\n props.children !== null &&\n props.children !== false;\n // Real text when we can render it; otherwise a copy-safe placeholder so the\n // snippet pastes without a syntax error (a bare `…` does not).\n const body = hasChildren ? formatChildren(props.children) ?? '{/* … */}' : '';\n const bodyInline = !body.includes('\\n') && body.length <= 40;\n\n // No attrs.\n if (formatted.length === 0) {\n if (!hasChildren) return `<${name} />`;\n return bodyInline\n ? `<${name}>${body}</${name}>`\n : `<${name}>\\n ${body}\\n</${name}>`;\n }\n\n // Attrs fit on one line.\n const inline = formatted.join(' ');\n if (inline.length <= 60) {\n if (!hasChildren) return `<${name} ${inline} />`;\n return bodyInline && inline.length + body.length <= 56\n ? `<${name} ${inline}>${body}</${name}>`\n : `<${name} ${inline}>\\n ${body}\\n</${name}>`;\n }\n\n // Attrs wrap one per line.\n return [\n `<${name}`,\n ...formatted.map((p) => ` ${p}`),\n hasChildren ? `>` : `/>`,\n ...(hasChildren ? [` ${body}`, `</${name}>`] : []),\n ].join('\\n');\n}\n\nexport function shortenPath(p: string): string {\n const i = p.indexOf('/projects/');\n return i >= 0 ? p.slice(i + 1) : p;\n}\n\n// Tailwind utilities under `text-*` and `border-*` that are NOT color tokens.\n// Used to filter token candidates so we don't show `text-center` as a color.\nexport function getDirectText(node: HTMLElement): string | null {\n let text = '';\n for (let i = 0; i < node.childNodes.length; i++) {\n const child = node.childNodes[i];\n if (child.nodeType === Node.TEXT_NODE) {\n text += child.textContent ?? '';\n }\n }\n text = text.trim();\n return text.length > 0 ? text : null;\n}\n\nexport const INTERESTING_ATTR_NAMES = new Set([\n 'id', 'role', 'title', 'alt', 'href', 'type', 'name', 'value',\n 'placeholder', 'tabindex', 'src', 'for',\n]);\n\nexport function getInterestingAttrs(node: HTMLElement): Array<[string, string]> {\n const out: Array<[string, string]> = [];\n for (let i = 0; i < node.attributes.length; i++) {\n const attr = node.attributes[i];\n const n = attr.name;\n if (n === 'class' || n === 'style') continue; // shown elsewhere\n if (\n n.startsWith('data-') ||\n n.startsWith('aria-') ||\n INTERESTING_ATTR_NAMES.has(n)\n ) {\n out.push([n, attr.value]);\n }\n }\n return out;\n}\n\n// ───────── asset detection ─────────\n//\n// \"Asset\" = something with a downloadable / serializable payload (img / video /\n// audio src, or a vector SVG), OR a Spring icon (which is code-imported, so\n// the \"asset\" is really the import token).\n//\n// Library icon detection: the adapter walks UP the fiber chain from the SVG\n// element and identity-matches against the design system's icon exports\n// (`adapter.findIconName`), so a local component named `AceMd` isn't mistaken\n// for the library's AceMd. The adapter may also report a wrapper size prop\n// (`adapter.iconWrapperSize`, e.g. Spring's <Icon size=\"…\">). The generic\n// adapter reports neither, so SVGs fall through to the plain `svg` asset kind.\n\nexport type SelectedNode = {\n // Null in DOM mode (frozen-snapshot selections have no fibers). The fiber\n // path always sets it.\n fiber: Fiber | null;\n domNode: HTMLElement;\n kind: AncestryKind;\n // True when the selection is an element inside a frozen snapshot tile's\n // shadow root (src/viewer/FrozenTile). Everything fiber-derived (JSX, props,\n // component names, X-ray/Explode) is unavailable; measurements, styles,\n // tokens and the data-anchor source pointer read from the real DOM.\n domMode: boolean;\n tokens: StyleTokens;\n resolved: ResolvedStyles;\n // Source-location anchor (`data-anchor`, stamped by the build-time Babel\n // plugin) + the host's artboard slot. Captured at selection time so the\n // selection can be re-resolved after an HMR edit detaches `domNode`/`fiber`.\n // `anchor` is null for elements the plugin didn't stamp (e.g. Spring-internal\n // hosts rendered from node_modules) — those just can't be HMR-recovered.\n anchor: string | null;\n artboardSlot: string | null;\n};\n\n// Read the durable re-anchor info off a host node: its `data-anchor` source\n// stamp and the `[data-dc-slot]` artboard it lives in (scopes the post-HMR\n// lookup so the same component in another artboard isn't matched by mistake).\nexport function anchorInfoFor(dom: Element): { anchor: string | null; artboardSlot: string | null } {\n return {\n anchor: dom.getAttribute('data-anchor'),\n artboardSlot: dom.closest('[data-dc-slot]')?.getAttribute('data-dc-slot') ?? null,\n };\n}\n\n// \"Promote at component root\" (Option 1): if the clicked host IS the outermost\n// DOM a Spring/user component renders, return that component's fiber + kind so\n// the selection surfaces JSX / props / variants. Returns null when the host\n// isn't a component root — a deeper inner host, or a plain authored element —\n// so those stay selected as bare elements (styles focus).\n//\n// Walks up from the host's fiber, taking the OUTERMOST component whose first\n// rendered host is still this exact element. Stops the moment the chain's\n// first host differs (we've climbed above the clicked element) or we reach the\n// artboard boundary. `isInterestingName(libraryAwareName(...))` keeps a DS's\n// own ThemeProvider / mode-provider out (their export names end in Provider),\n// while rendersOwnDom drops context-only passthroughs.\nexport function ownerComponentAtRoot(host: Element): { fiber: Fiber; kind: AncestryKind } | null {\n const hostFiber = getFiberFromDom(host);\n if (!hostFiber) return null;\n let cur: Fiber | null = hostFiber.return;\n let best: { fiber: Fiber; kind: AncestryKind } | null = null;\n let depth = 0;\n while (cur && depth < ANCESTRY_MAX_DEPTH) {\n const rawName = getComponentName(cur.type);\n if (rawName && ANCESTRY_STOP_NAMES.has(rawName)) break; // artboard boundary\n if (findFirstHostElement(cur) !== host) break; // climbed above the click\n const name = libraryAwareName(cur.type);\n if (isInterestingName(name) && rendersOwnDom(cur)) {\n best = { fiber: cur, kind: isLibraryType(cur.type) ? 'library' : 'user' };\n }\n cur = cur.return;\n depth++;\n }\n return best;\n}\n\nexport function buildSelectedFromHost(host: Element): SelectedNode | null {\n const fiber = getFiberFromDom(host);\n if (!fiber) return null;\n // SVG hosts are valid selection targets (icons, vectors). At runtime every\n // helper we hand `host` to only uses APIs that exist on both HTMLElement\n // and SVGElement (getComputedStyle, parentElement, getBoundingClientRect,\n // childNodes; the few `className` reads are typeof-guarded). Cast to\n // HTMLElement so the rest of the inspector's typing stays simple.\n const h = host as HTMLElement;\n // Bind the selection to the owning component when the host is its root, so a\n // canvas click on a <Button> shows JSX in one click (instead of selecting the\n // bare host and forcing a second click on the already-highlighted tree row).\n // domNode stays the host either way — styles/box-model read from the real DOM\n // node; only `fiber`/`kind` change so JSX/props resolve from the component.\n const owner = ownerComponentAtRoot(host);\n return {\n fiber: owner ? owner.fiber : fiber,\n domNode: h,\n kind: owner ? owner.kind : 'element',\n domMode: false,\n tokens: collectStyleTokens(h),\n resolved: readResolvedStyles(h),\n ...anchorInfoFor(h),\n };\n}\n\n// DOM-mode selection for an element inside a live route frame whose app isn't\n// React (no fibers — e.g. a static-HTML prototype mounted as a route). Same\n// honesty contract as snapshot DOM mode: measurements/styles/anchors read off\n// the real DOM; component names/props/X-ray legitimately unavailable.\nexport function buildSelectedFromFrameEl(el: Element): SelectedNode | null {\n if (!isFrameEl(el)) return null;\n const h = el as HTMLElement;\n return {\n fiber: null,\n domNode: h,\n kind: 'element',\n domMode: true,\n tokens: collectStyleTokens(h),\n resolved: readResolvedStyles(h),\n anchor: el.getAttribute('data-anchor'),\n // closest() can't cross the document boundary — hop through the frame.\n artboardSlot:\n closestAcrossFrames(el, '[data-dc-slot]')?.getAttribute('data-dc-slot') ?? null,\n };\n}\n\nexport function buildSelectedFromFiber(\n fiber: Fiber,\n knownKind?: AncestryKind,\n): SelectedNode | null {\n const dom =\n fiber.stateNode instanceof HTMLElement\n ? fiber.stateNode\n : findFirstHostElement(fiber);\n if (!dom) return null;\n return {\n fiber,\n domNode: dom,\n kind: knownKind ?? inferKind(fiber),\n domMode: false,\n tokens: collectStyleTokens(dom),\n resolved: readResolvedStyles(dom),\n ...anchorInfoFor(dom),\n };\n}\n\nexport function selectedLabel(selected: SelectedNode): string {\n if (!selected.fiber) return snapshotNodeLabel(selected.domNode);\n return nodeNameFor(selected.fiber, selected.kind);\n}\n\n// ───────── Inspector ─────────\n\n// Shape of the imperative viewport handle stashed on the DesignCanvas\n// `[data-dc-viewport]` DOM node by DesignCanvas.jsx. Only the bits the\n// Inspector calls are listed.\n","// Canvas off-token / a11y-contrast scans + the WCAG color math. Extracted from\n// Inspector.tsx (P3.2). Reverse-lookups route through ./tokens.\nimport {\n getSniffer,\n themeScopeHostOf,\n isTransparent,\n lookupColorToken,\n lookupShadowToken,\n lookupTypographyToken,\n typographyKey,\n} from './tokens';\n\nexport type ScanKind = 'color' | 'typography' | 'shadow' | 'contrast';\n\nexport type ScanMode = 'tokens' | 'a11y';\n\nexport type ScanOccurrence = {\n el: HTMLElement;\n prop: string; // 'color' | 'backgroundColor' | 'borderTopColor' | … | 'boxShadow' | 'font'\n artboard: string; // [data-dc-slot] value\n tag: string; // human-readable element label, e.g. 'div.foo'\n};\n\nexport type ScanBucket = {\n kind: ScanKind;\n value: string; // raw computed value (rgb/shadow/font signature)\n displayValue: string; // friendlier form (hex for colors; sample for typography; trimmed for shadow)\n swatch?: string; // the rgb string to render in a color chip (color kind only)\n occurrences: ScanOccurrence[];\n};\n\nexport function rgbToHex(rgb: string): string | null {\n const m = rgb.match(/^rgba?\\(\\s*(\\d+)[ ,]\\s*(\\d+)[ ,]\\s*(\\d+)(?:\\s*[,/]\\s*([\\d.]+))?\\s*\\)$/);\n if (!m) return null;\n const [, r, g, b, a] = m;\n const hex =\n '#' +\n [r, g, b]\n .map((n) => parseInt(n, 10).toString(16).padStart(2, '0'))\n .join('');\n if (a !== undefined && parseFloat(a) < 1) {\n const aHex = Math.round(parseFloat(a) * 255)\n .toString(16)\n .padStart(2, '0');\n return hex + aHex;\n }\n return hex;\n}\n\n// ─── Contrast / effective-background composite (WCAG 2.x) ──────────────────\n//\n// `parseColor` accepts the strings getComputedStyle hands back plus hex —\n// rgb()/rgba()/named/hex — and returns sRGB channels 0–255 + alpha 0–1.\n// `compositeOver` is Porter-Duff source-over: top OVER bottom.\n// `effectiveBackground` walks the element's ancestor chain compositing each\n// non-transparent bg downward until the accumulator is opaque, then falls\n// back to the document body bg (or white). Spring overlays stack alpha\n// layers, so the *immediate* ancestor is rarely the right answer.\n\nexport type RGBA = { r: number; g: number; b: number; a: number };\n\nexport function parseColor(input: string): RGBA | null {\n if (!input) return null;\n const s = input.trim();\n if (!s || s === 'transparent' || s === 'none') return { r: 0, g: 0, b: 0, a: 0 };\n const m = s.match(/^rgba?\\(([^)]+)\\)$/i);\n if (m) {\n const parts = m[1].split(/[ ,/]+/).filter(Boolean);\n if (parts.length < 3) return null;\n const r = parseFloat(parts[0]);\n const g = parseFloat(parts[1]);\n const b = parseFloat(parts[2]);\n const a = parts[3] !== undefined ? parseFloat(parts[3]) : 1;\n if (![r, g, b, a].every(Number.isFinite)) return null;\n return { r, g, b, a };\n }\n if (s[0] === '#') {\n const hex = s.slice(1);\n let r = 0, g = 0, b = 0, a = 1;\n if (hex.length === 3 || hex.length === 4) {\n r = parseInt(hex[0] + hex[0], 16);\n g = parseInt(hex[1] + hex[1], 16);\n b = parseInt(hex[2] + hex[2], 16);\n if (hex.length === 4) a = parseInt(hex[3] + hex[3], 16) / 255;\n } else if (hex.length === 6 || hex.length === 8) {\n r = parseInt(hex.slice(0, 2), 16);\n g = parseInt(hex.slice(2, 4), 16);\n b = parseInt(hex.slice(4, 6), 16);\n if (hex.length === 8) a = parseInt(hex.slice(6, 8), 16) / 255;\n } else return null;\n if (![r, g, b].every(Number.isFinite)) return null;\n return { r, g, b, a };\n }\n // Named-color fallback via a hidden probe. Rare path; the browser hands us\n // rgb() form 99% of the time.\n const probe = getSniffer();\n probe.style.color = '';\n probe.style.color = s;\n const computed = getComputedStyle(probe).color;\n if (computed && computed !== s) return parseColor(computed);\n return null;\n}\n\nexport function compositeOver(top: RGBA, bottom: RGBA): RGBA {\n const a = top.a + bottom.a * (1 - top.a);\n if (a <= 0) return { r: 0, g: 0, b: 0, a: 0 };\n return {\n r: (top.r * top.a + bottom.r * bottom.a * (1 - top.a)) / a,\n g: (top.g * top.a + bottom.g * bottom.a * (1 - top.a)) / a,\n b: (top.b * top.a + bottom.b * bottom.a * (1 - top.a)) / a,\n a,\n };\n}\n\n// Parse out color stops from a CSS background-image gradient. Handles\n// linear-gradient, radial-gradient, conic-gradient. Returns hex/rgb colors\n// only — color hints like `45deg` / `0%` / `at center` are ignored.\n// Non-gradient backgrounds (url(...), none) return [].\nexport function extractGradientStops(backgroundImage: string): RGBA[] {\n if (!backgroundImage || backgroundImage === 'none') return [];\n if (!/gradient\\s*\\(/i.test(backgroundImage)) return [];\n // Match rgba()/rgb() with paren-balanced contents, #hex, or bare color\n // keywords. Function form has to come first so the regex doesn't bite off\n // just `rgb` from `rgb(...)`.\n const re = /rgba?\\([^)]*\\)|#[0-9a-fA-F]{3,8}\\b|\\b(?:white|black|red|green|blue|yellow|cyan|magenta|gray|grey|orange|purple|pink|brown|transparent)\\b/gi;\n const out: RGBA[] = [];\n let m: RegExpExecArray | null;\n while ((m = re.exec(backgroundImage)) !== null) {\n const c = parseColor(m[0]);\n if (c && c.a > 0) out.push(c);\n }\n return out;\n}\n\n// Returns one or more candidate effective backgrounds for an element. Most\n// elements return a single composite (the normal walk). Elements whose\n// ancestor chain hits a gradient return multiple candidates — one per\n// extracted gradient color stop — so contrast checks can use the worst case\n// (a gradient that goes from cyan to white over a span of white text needs\n// to flag the white-on-white end). Callers iterate and pick the worst.\nexport function effectiveBackgrounds(el: Element): RGBA[] {\n // Walk UP collecting non-transparent bgs; stop at the first opaque one.\n // When we hit a gradient, we treat its color stops as alternate opaque\n // bases (one per stop), each combined with the overlying layers below.\n type Layer = { color: RGBA; gradientStops?: RGBA[] };\n const chain: Layer[] = [];\n let cur: Element | null = el;\n while (cur) {\n const cs = getComputedStyle(cur);\n const c = parseColor(cs.backgroundColor);\n const stops = extractGradientStops(cs.backgroundImage);\n if (stops.length > 0) {\n // Gradient is fully opaque in practice (gradients without `transparent`\n // stops paint every pixel). Use the bg color as the base color (in case\n // gradient has alpha stops) and treat the gradient stops as candidates.\n chain.push({ color: c && c.a > 0 ? c : { r: 0, g: 0, b: 0, a: 0 }, gradientStops: stops });\n break;\n }\n if (c && c.a > 0) {\n chain.push({ color: c });\n if (c.a >= 0.999) break;\n }\n cur = cur.parentElement;\n }\n // Fall back to document body bg, then white. We need the bottom of the\n // stack to be opaque for the composite to terminate.\n const lastLayer = chain[chain.length - 1];\n const baseIsOpaque =\n !!lastLayer &&\n (lastLayer.gradientStops\n ? lastLayer.gradientStops.length > 0\n : lastLayer.color.a >= 0.999);\n if (chain.length === 0 || !baseIsOpaque) {\n const docBg = parseColor(getComputedStyle(document.body).backgroundColor);\n chain.push({\n color: docBg && docBg.a >= 0.999 ? docBg : { r: 255, g: 255, b: 255, a: 1 },\n });\n }\n\n // Build candidate bases. If no gradient anywhere, one base (the bottom).\n // If gradient at the bottom, one base per stop.\n const bottom = chain[chain.length - 1];\n const bases: RGBA[] =\n bottom.gradientStops && bottom.gradientStops.length > 0\n ? bottom.gradientStops\n : [bottom.color];\n\n // For each candidate base, composite all overlying layers down.\n return bases.map((base) => {\n let acc = base;\n for (let i = chain.length - 2; i >= 0; i--) {\n acc = compositeOver(chain[i].color, acc);\n }\n return acc;\n });\n}\n\n// Single-bg convenience for callers that don't care about gradient variance\n// (e.g., the bg hex chip in the panel — we just show the worst-contrast\n// candidate vs. a given fg color, since that's the most actionable).\nexport function effectiveBackground(el: Element): RGBA {\n const bgs = effectiveBackgrounds(el);\n return bgs[0];\n}\n\nexport function srgbToLinear(c: number): number {\n const v = c / 255;\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n}\n\nexport function relativeLuminance(c: RGBA): number {\n return (\n 0.2126 * srgbToLinear(c.r) +\n 0.7152 * srgbToLinear(c.g) +\n 0.0722 * srgbToLinear(c.b)\n );\n}\n\nexport function contrastRatio(a: RGBA, b: RGBA): number {\n const La = relativeLuminance(a);\n const Lb = relativeLuminance(b);\n const hi = Math.max(La, Lb);\n const lo = Math.min(La, Lb);\n return (hi + 0.05) / (lo + 0.05);\n}\n\n// WCAG: large text = ≥18pt (24px) normal, OR ≥14pt (18.66px) when bold\n// (font-weight ≥ 700). Lowers the AA threshold from 4.5:1 to 3:1.\nexport function isLargeText(fontSizePx: number, fontWeight: number): boolean {\n if (!Number.isFinite(fontSizePx)) return false;\n return fontWeight >= 700 ? fontSizePx >= 18.66 : fontSizePx >= 24;\n}\n\nexport function rgbaToHex(c: RGBA): string {\n const h = [c.r, c.g, c.b]\n .map((n) => Math.max(0, Math.min(255, Math.round(n))).toString(16).padStart(2, '0'))\n .join('');\n return '#' + h;\n}\n\nexport function formatRatio(r: number): string {\n if (!Number.isFinite(r)) return '–';\n return r < 10 ? r.toFixed(2) : r.toFixed(1);\n}\n\nexport function shortTag(el: HTMLElement): string {\n const tag = el.tagName.toLowerCase();\n const cls = typeof el.className === 'string' ? el.className.trim() : '';\n if (!cls) return tag;\n const first = cls.split(/\\s+/)[0];\n return `${tag}.${first}`;\n}\n\nexport function elementHasDirectText(el: HTMLElement): boolean {\n for (let i = 0; i < el.childNodes.length; i++) {\n const c = el.childNodes[i];\n if (c.nodeType === Node.TEXT_NODE && (c.textContent ?? '').trim().length > 0) {\n return true;\n }\n }\n return false;\n}\n\n// Resolve the roots a scan walks. With a `scope` element the scan is confined\n// to that subtree (the element itself included, so a selected leaf gets tested);\n// without one it covers every artboard's `.dc-card` on the canvas. The artboard\n// label is carried through so occurrences group/report the same either way.\nexport type ScanRoot = { artboard: string; root: HTMLElement; includeRoot: boolean };\nexport function scanRoots(scope?: Element | null): ScanRoot[] {\n if (scope) {\n const artboard =\n scope.closest('[data-dc-slot]')?.getAttribute('data-dc-slot') ?? '?';\n return [{ artboard, root: scope as HTMLElement, includeRoot: true }];\n }\n const out: ScanRoot[] = [];\n for (const slot of document.querySelectorAll<HTMLElement>('[data-dc-slot]')) {\n const card = slot.querySelector('.dc-card') as HTMLElement | null;\n if (card)\n out.push({ artboard: slot.dataset.dcSlot ?? '?', root: card, includeRoot: false });\n }\n return out;\n}\n\n// `scope` (when set) confines the walk to that element's subtree; default is\n// every artboard on the canvas.\nexport function scanArtboardsForViolations(scope?: Element | null): ScanBucket[] {\n const map = new Map<string, ScanBucket>();\n const bump = (\n kind: ScanKind,\n value: string,\n displayValue: string,\n swatch: string | undefined,\n occ: ScanOccurrence,\n ) => {\n const key = `${kind}::${value}`;\n let b = map.get(key);\n if (!b) {\n b = { kind, value, displayValue, swatch, occurrences: [] };\n map.set(key, b);\n }\n b.occurrences.push(occ);\n };\n\n for (const { artboard, root, includeRoot } of scanRoots(scope)) {\n const all: HTMLElement[] = includeRoot\n ? [root, ...Array.from(root.querySelectorAll<HTMLElement>('*'))]\n : Array.from(root.querySelectorAll<HTMLElement>('*'));\n for (let i = 0; i < all.length; i++) {\n const el = all[i];\n // Skip inspector's own DOM (e.g. preview clones inside the inspector\n // that happen to land inside the page — defensive only; preview clones\n // sit in the panel itself, not inside artboards).\n if (el.closest('[data-inspector-ui]')) continue;\n // Skip SVG glyph internals — we don't yet do svg-fill/stroke lookups.\n if ((el as unknown as { ownerSVGElement?: SVGSVGElement | null }).ownerSVGElement)\n continue;\n\n const s = getComputedStyle(el);\n if (s.display === 'none' || s.visibility === 'hidden') continue;\n\n const hasText = elementHasDirectText(el);\n // Resolve tokens in this element's own theme scope so a dark-scoped value\n // isn't false-flagged off-token against the global palette (null = global).\n const host = themeScopeHostOf(el);\n\n // Color (only meaningful when element actually authors text)\n if (hasText && s.color && !isTransparent(s.color) && !lookupColorToken(s.color, host)) {\n const hex = rgbToHex(s.color) ?? s.color;\n bump('color', s.color, hex, s.color, {\n el,\n prop: 'color',\n artboard,\n tag: shortTag(el),\n });\n }\n\n // Background\n if (\n s.backgroundColor &&\n !isTransparent(s.backgroundColor) &&\n !lookupColorToken(s.backgroundColor, host)\n ) {\n const hex = rgbToHex(s.backgroundColor) ?? s.backgroundColor;\n bump('color', s.backgroundColor, hex, s.backgroundColor, {\n el,\n prop: 'backgroundColor',\n artboard,\n tag: shortTag(el),\n });\n }\n\n // Border per side, only when that side has width > 0\n const sides: Array<[string, string, number]> = [\n ['borderTopColor', s.borderTopColor, parseFloat(s.borderTopWidth) || 0],\n ['borderRightColor', s.borderRightColor, parseFloat(s.borderRightWidth) || 0],\n ['borderBottomColor', s.borderBottomColor, parseFloat(s.borderBottomWidth) || 0],\n ['borderLeftColor', s.borderLeftColor, parseFloat(s.borderLeftWidth) || 0],\n ];\n const seenBorderVals = new Set<string>();\n for (const [prop, val, w] of sides) {\n if (w <= 0) continue;\n if (!val || isTransparent(val)) continue;\n if (seenBorderVals.has(val)) continue;\n seenBorderVals.add(val);\n if (!lookupColorToken(val, host)) {\n const hex = rgbToHex(val) ?? val;\n bump('color', val, hex, val, {\n el,\n prop,\n artboard,\n tag: shortTag(el),\n });\n }\n }\n\n // Box shadow\n if (s.boxShadow && s.boxShadow !== 'none' && !lookupShadowToken(s.boxShadow)) {\n const trimmed =\n s.boxShadow.length > 60 ? s.boxShadow.slice(0, 57) + '…' : s.boxShadow;\n bump('shadow', s.boxShadow, trimmed, undefined, {\n el,\n prop: 'boxShadow',\n artboard,\n tag: shortTag(el),\n });\n }\n\n // Typography — text-leaf elements only (matches the \"Color\" gate)\n if (hasText && !lookupTypographyToken(s)) {\n const sizePx = parseFloat(s.fontSize);\n const sizeLabel = Number.isFinite(sizePx)\n ? `${sizePx % 1 === 0 ? sizePx : sizePx.toFixed(1)}px`\n : s.fontSize;\n const familyFirst = (s.fontFamily.split(',')[0] || '').replace(/['\"]/g, '').trim();\n const sample = `${sizeLabel} · ${s.fontWeight} · ${familyFirst || '—'}`;\n const key = typographyKey(s);\n bump('typography', key, sample, undefined, {\n el,\n prop: 'font',\n artboard,\n tag: shortTag(el),\n });\n }\n }\n }\n\n const kindOrder: Record<ScanKind, number> = {\n color: 0,\n typography: 1,\n shadow: 2,\n contrast: 3,\n };\n return Array.from(map.values()).sort((a, b) => {\n if (a.kind !== b.kind) return kindOrder[a.kind] - kindOrder[b.kind];\n if (b.occurrences.length !== a.occurrences.length) {\n return b.occurrences.length - a.occurrences.length;\n }\n return a.displayValue.localeCompare(b.displayValue);\n });\n}\n\n// A11y scan: walks every text-leaf element inside every artboard and flags\n// pairs whose computed contrast against the *effective* (composited) bg\n// falls below the applicable WCAG AA threshold. Threshold shifts to 3:1\n// for large text (≥24px or ≥18.66px@700) — so a heading at 3.2:1 passes\n// while body at the same ratio doesn't. Buckets key by `(fg, bg)` hex so\n// one bad token pair used across N elements collapses into one row.\n\n// `scope` (when set) confines the walk to that element's subtree; default is\n// every artboard on the canvas.\nexport function scanA11yViolations(scope?: Element | null): ScanBucket[] {\n const map = new Map<string, ScanBucket>();\n\n for (const { artboard, root, includeRoot } of scanRoots(scope)) {\n const all: HTMLElement[] = includeRoot\n ? [root, ...Array.from(root.querySelectorAll<HTMLElement>('*'))]\n : Array.from(root.querySelectorAll<HTMLElement>('*'));\n for (let i = 0; i < all.length; i++) {\n const el = all[i];\n if (el.closest('[data-inspector-ui]')) continue;\n if ((el as unknown as { ownerSVGElement?: SVGSVGElement | null }).ownerSVGElement)\n continue;\n\n const cs = getComputedStyle(el);\n if (cs.display === 'none' || cs.visibility === 'hidden') continue;\n if (!elementHasDirectText(el)) continue;\n\n const fgRaw = parseColor(cs.color);\n if (!fgRaw || fgRaw.a <= 0) continue;\n // Pick worst-contrast bg when the ancestor chain hits a gradient (so\n // text-over-gradient gets flagged at its worst stop rather than the\n // first one). For non-gradient elements there's only one candidate.\n const bgCandidates = effectiveBackgrounds(el);\n if (bgCandidates.length === 0 || bgCandidates[0].a < 0.999) continue;\n let bg = bgCandidates[0];\n let ratio = contrastRatio(\n fgRaw.a < 1 ? compositeOver(fgRaw, bg) : fgRaw,\n bg,\n );\n for (let i = 1; i < bgCandidates.length; i++) {\n const candidate = bgCandidates[i];\n const fgC = fgRaw.a < 1 ? compositeOver(fgRaw, candidate) : fgRaw;\n const r = contrastRatio(fgC, candidate);\n if (r < ratio) {\n ratio = r;\n bg = candidate;\n }\n }\n const fg = fgRaw.a < 1 ? compositeOver(fgRaw, bg) : fgRaw;\n const fontSizePx = parseFloat(cs.fontSize);\n const weight = parseInt(cs.fontWeight, 10) || 400;\n const large = isLargeText(fontSizePx, weight);\n const threshold = large ? 3 : 4.5;\n if (ratio >= threshold) continue;\n\n const fgHex = rgbaToHex(fg);\n const bgHex = rgbaToHex(bg);\n const key = `contrast::${fgHex}|${bgHex}`;\n let bucket = map.get(key);\n if (!bucket) {\n bucket = {\n kind: 'contrast',\n value: `${fgHex}|${bgHex}`,\n // Bucket-level display: fg on bg + the (single, well-defined)\n // ratio for this pair. The badge in the row UI shows the count.\n displayValue: `${fgHex} on ${bgHex} · ${formatRatio(ratio)}:1`,\n swatch: fgHex,\n occurrences: [],\n };\n map.set(key, bucket);\n }\n // Per-occurrence prop string carries the size class so the\n // expanded list reads \"large 4.5:1 / 3.0 needed\" vs\n // \"normal 4.5:1 / 4.5 needed\" — useful since the same (fg,bg)\n // can fail one and pass the other.\n const propLabel = large\n ? `large · need ${threshold}:1`\n : `normal · need ${threshold}:1`;\n bucket.occurrences.push({\n el,\n prop: propLabel,\n artboard,\n tag: shortTag(el),\n });\n }\n }\n\n return Array.from(map.values()).sort((a, b) => {\n if (b.occurrences.length !== a.occurrences.length) {\n return b.occurrences.length - a.occurrences.length;\n }\n return a.displayValue.localeCompare(b.displayValue);\n });\n}\n\n// Build the CSS var() reference for a color token suffix (\"neutral-b0\" →\n// \"var(--sui-colors-neutral-b0)\" under the Spring adapter). The var prefix comes\n// from the adapter (never hardcoded), so this stays design-system-agnostic. Used\n// by the Hex/Token/Var display-mode toggle so the chip can rotate forms.\n","// Figma-style box-model diagram + spacing/radius token labels. Extracted from\n// Inspector.tsx (P3.2).\nimport React from 'react';\nimport { getAncestorScale } from './getAncestorScale';\nimport { getDesignSystemAdapter, adapterHasTokens } from '../adapters';\nimport { lookupSpacingToken, lookupRadiusToken } from './tokens';\nimport { Section, MONO_FF } from './sections';\n\nexport type BoxLabelMode = 'token' | 'px';\n\n// Token mode shows the full Spring token name (`space-3`, `radius-sm`,\n// `radius-full`) so a label is never ambiguous with a px fallback. Px mode\n// always shows the raw integer pixel count. Zero collapses to \"–\" in both\n// modes. The `isToken` flag tells the label component whether to enable\n// click-to-copy.\nexport type LabelText = { text: string; isToken: boolean };\nexport function fmtSpacingSide(n: number, mode: BoxLabelMode): LabelText {\n if (n === 0) return { text: '–', isToken: false };\n if (mode === 'px') return { text: `${n}`, isToken: false };\n const tok = lookupSpacingToken(n);\n return tok ? { text: tok, isToken: true } : { text: `${n}`, isToken: false };\n}\nexport function fmtRadiusCorner(n: number, mode: BoxLabelMode): LabelText {\n if (n === 0) return { text: '–', isToken: false };\n if (mode === 'px') return { text: `${n}`, isToken: false };\n const tok = lookupRadiusToken(n);\n return tok ? { text: tok, isToken: true } : { text: `${n}`, isToken: false };\n}\n\nexport function BoxModel({\n node,\n mode,\n onModeChange,\n onCopy,\n copiedKey,\n}: {\n node: HTMLElement;\n mode: BoxLabelMode;\n onModeChange: (m: BoxLabelMode) => void;\n onCopy: (text: string) => void;\n copiedKey: string | null;\n}) {\n const s = getComputedStyle(node);\n // Compensate for any ancestor transform (DesignCanvas zoom) so the W × H\n // shown is the element's natural CSS size, not the post-zoom visual size.\n const canvasScale = getAncestorScale(node);\n const rawRect = node.getBoundingClientRect();\n const rect = { width: rawRect.width / canvasScale, height: rawRect.height / canvasScale };\n const px = (k: string) => Math.round(parseFloat(s.getPropertyValue(k)) || 0);\n\n const margin = {\n t: px('margin-top'),\n r: px('margin-right'),\n b: px('margin-bottom'),\n l: px('margin-left'),\n };\n const border = {\n t: px('border-top-width'),\n r: px('border-right-width'),\n b: px('border-bottom-width'),\n l: px('border-left-width'),\n };\n const padding = {\n t: px('padding-top'),\n r: px('padding-right'),\n b: px('padding-bottom'),\n l: px('padding-left'),\n };\n const radius = {\n tl: px('border-top-left-radius'),\n tr: px('border-top-right-radius'),\n br: px('border-bottom-right-radius'),\n bl: px('border-bottom-left-radius'),\n };\n\n const contentW = Math.round(\n rect.width - padding.l - padding.r - border.l - border.r,\n );\n const contentH = Math.round(\n rect.height - padding.t - padding.b - border.t - border.b,\n );\n\n // Clamp the on-screen radius so a 200px-radius pill doesn't eat the diagram.\n const visualR = (n: number) => (n === 0 ? 0 : Math.max(3, Math.min(14, n / 2)));\n\n return (\n <Section\n title=\"Box model\"\n action={<BoxModelModeToggle mode={mode} onChange={onModeChange} />}\n >\n <div\n style={{\n position: 'relative',\n background: 'rgba(0,0,0,0.35)',\n borderRadius: 6,\n height: 260,\n overflow: 'hidden',\n }}\n >\n {/* Crosshair guides */}\n <div\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: '50%',\n width: 1,\n background: 'rgba(232,88,67,0.32)',\n pointerEvents: 'none',\n }}\n />\n <div\n style={{\n position: 'absolute',\n left: 0,\n right: 0,\n top: '50%',\n height: 1,\n background: 'rgba(232,88,67,0.32)',\n pointerEvents: 'none',\n }}\n />\n\n {/* Margin pills */}\n <MarginPill side=\"t\" value={margin.t} mode={mode} onCopy={onCopy} copiedKey={copiedKey} />\n <MarginPill side=\"b\" value={margin.b} mode={mode} onCopy={onCopy} copiedKey={copiedKey} />\n <MarginPill side=\"l\" value={margin.l} mode={mode} onCopy={onCopy} copiedKey={copiedKey} />\n <MarginPill side=\"r\" value={margin.r} mode={mode} onCopy={onCopy} copiedKey={copiedKey} />\n\n {/* Border layer */}\n <div\n style={{\n position: 'absolute',\n top: 30,\n right: 38,\n bottom: 30,\n left: 38,\n border: '1.5px solid rgba(255,255,255,0.6)',\n borderTopLeftRadius: visualR(radius.tl),\n borderTopRightRadius: visualR(radius.tr),\n borderBottomRightRadius: visualR(radius.br),\n borderBottomLeftRadius: visualR(radius.bl),\n }}\n >\n <span\n style={{\n position: 'absolute',\n top: 4,\n left: 26,\n color: 'rgba(255,255,255,0.6)',\n fontSize: 11,\n }}\n >\n Border\n </span>\n\n {/* Corner-radius labels (TL TR BR BL) */}\n <CornerLabel pos=\"tl\" value={radius.tl} mode={mode} onCopy={onCopy} copiedKey={copiedKey} />\n <CornerLabel pos=\"tr\" value={radius.tr} mode={mode} onCopy={onCopy} copiedKey={copiedKey} />\n <CornerLabel pos=\"br\" value={radius.br} mode={mode} onCopy={onCopy} copiedKey={copiedKey} />\n <CornerLabel pos=\"bl\" value={radius.bl} mode={mode} onCopy={onCopy} copiedKey={copiedKey} />\n\n {/* Per-side border-width labels — border widths are off-scale (0.5,\n 1.2, 1.35 px), so they always show px regardless of mode. */}\n <SideLabel pos=\"t\" value={border.t} kind=\"border\" mode={mode} onCopy={onCopy} copiedKey={copiedKey} />\n <SideLabel pos=\"r\" value={border.r} kind=\"border\" mode={mode} onCopy={onCopy} copiedKey={copiedKey} />\n <SideLabel pos=\"b\" value={border.b} kind=\"border\" mode={mode} onCopy={onCopy} copiedKey={copiedKey} />\n <SideLabel pos=\"l\" value={border.l} kind=\"border\" mode={mode} onCopy={onCopy} copiedKey={copiedKey} />\n\n {/* Padding layer */}\n <div\n style={{\n position: 'absolute',\n top: 22,\n right: 22,\n bottom: 22,\n left: 22,\n background: 'rgba(78,93,156,0.55)',\n border: '1px solid rgba(255,255,255,0.45)',\n borderRadius: 3,\n }}\n >\n <span\n style={{\n position: 'absolute',\n top: 4,\n left: 10,\n color: 'rgba(255,255,255,0.85)',\n fontSize: 11,\n }}\n >\n Padding\n </span>\n\n {/* Per-side padding labels */}\n <SideLabel pos=\"t\" value={padding.t} kind=\"spacing\" mode={mode} onCopy={onCopy} copiedKey={copiedKey} />\n <SideLabel pos=\"r\" value={padding.r} kind=\"spacing\" mode={mode} onCopy={onCopy} copiedKey={copiedKey} />\n <SideLabel pos=\"b\" value={padding.b} kind=\"spacing\" mode={mode} onCopy={onCopy} copiedKey={copiedKey} />\n <SideLabel pos=\"l\" value={padding.l} kind=\"spacing\" mode={mode} onCopy={onCopy} copiedKey={copiedKey} />\n\n {/* Content rect */}\n <div\n style={{\n position: 'absolute',\n top: 20,\n right: 24,\n bottom: 20,\n left: 24,\n border: '1px dashed rgba(255,255,255,0.55)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontFamily: MONO_FF,\n fontSize: 12,\n color: '#fff',\n }}\n >\n {contentW} × {contentH}\n </div>\n </div>\n </div>\n\n {/* Box-sizing footer */}\n <span\n style={{\n position: 'absolute',\n bottom: 4,\n right: 8,\n fontSize: 10,\n color: 'rgba(255,255,255,0.35)',\n }}\n >\n {s.boxSizing}\n </span>\n </div>\n </Section>\n );\n}\n\n// Tok / Px segmented control in the Box-model section header. Mirrors the\n// Color display toggle in Styles. Two states only — there's no \"var\" form\n// for spacing/radius the way there is for colors.\nexport function BoxModelModeToggle({\n mode,\n onChange,\n}: {\n mode: BoxLabelMode;\n onChange: (m: BoxLabelMode) => void;\n}) {\n // No design system → no spacing/radius tokens to show; Px only.\n const lib = getDesignSystemAdapter().libraryLabel;\n const opts: Array<{ value: BoxLabelMode; label: string; title: string }> = adapterHasTokens()\n ? [\n { value: 'token', label: 'Tok', title: `${lib} spacing / radius token (falls back to px when no match)` },\n { value: 'px', label: 'Px', title: 'Raw pixel values' },\n ]\n : [{ value: 'px', label: 'Px', title: 'Raw pixel values' }];\n // One form (no DS) → no toggle.\n if (opts.length <= 1) return null;\n return (\n <div\n style={{\n display: 'inline-flex',\n border: '1px solid rgba(255,255,255,0.15)',\n borderRadius: 4,\n overflow: 'hidden',\n }}\n >\n {opts.map((o, i) => {\n const active = mode === o.value;\n return (\n <button\n key={o.value}\n onClick={() => onChange(o.value)}\n title={o.title}\n style={{\n background: active ? 'rgba(154,166,187,0.22)' : 'transparent',\n color: active ? '#cfe0ff' : 'rgba(255,255,255,0.55)',\n border: 0,\n borderLeft: i === 0 ? 0 : '1px solid rgba(255,255,255,0.12)',\n padding: '2px 7px',\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: 0.4,\n textTransform: 'uppercase',\n cursor: 'pointer',\n fontFamily: 'inherit',\n }}\n >\n {o.label}\n </button>\n );\n })}\n </div>\n );\n}\n\n// Shared props used by all three label components — onCopy + copiedKey to\n// drive click-to-copy on token chips with a brief ✓ feedback.\nexport type LabelCopyProps = {\n onCopy: (text: string) => void;\n copiedKey: string | null;\n};\n\n// Cap on visible label length so a long token like `space-150` can't burst\n// out of its strip. Values longer than this clip with an ellipsis; full text\n// is in the title tooltip.\nexport const LABEL_MAX_WIDTH = 64;\n\nexport function copyableStyle(isToken: boolean): React.CSSProperties {\n return {\n maxWidth: LABEL_MAX_WIDTH,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n cursor: isToken ? 'pointer' : 'default',\n pointerEvents: isToken ? 'auto' : 'none',\n boxSizing: 'border-box',\n };\n}\n\nexport function MarginPill({\n side,\n value,\n mode,\n onCopy,\n copiedKey,\n}: {\n side: 't' | 'r' | 'b' | 'l';\n value: number;\n mode: BoxLabelMode;\n} & LabelCopyProps) {\n const { text, isToken } = fmtSpacingSide(value, mode);\n // L/R sides get rotated when showing a token so longer names (\"space-3\")\n // run vertically along the strip. Skip rotation when the value is 0 — a\n // rotated \"–\" reads as \"1\". Px mode also stays horizontal.\n const isVertical = (side === 'l' || side === 'r') && isToken;\n // Rotated L/R pills sit centered in the margin strip (half of the 38px\n // gap between the diagram edge and the border layer) so they don't crash\n // into the border. Unrotated pills hug the diagram edge as before.\n const position: React.CSSProperties =\n side === 't'\n ? { top: 4, left: '50%' }\n : side === 'b'\n ? { bottom: 4, left: '50%' }\n : side === 'l'\n ? isVertical\n ? { left: 19, top: '50%' }\n : { left: 4, top: '50%' }\n : isVertical\n ? { right: 19, top: '50%' }\n : { right: 4, top: '50%' };\n const transform = isVertical\n ? `translate(${side === 'r' ? '50%' : '-50%'}, -50%) ${side === 'r' ? 'rotate(90deg)' : 'rotate(-90deg)'}`\n : side === 't' || side === 'b'\n ? 'translateX(-50%)'\n : 'translateY(-50%)';\n const copyKey = `tok:${text}`;\n const justCopied = isToken && copiedKey === copyKey;\n return (\n <span\n onClick={isToken ? () => onCopy(text) : undefined}\n title={isToken ? `Copy \"${text}\"` : undefined}\n style={{\n position: 'absolute',\n background: '#e85843',\n color: '#fff',\n fontSize: 10,\n fontWeight: 600,\n padding: '1px 6px',\n borderRadius: 3,\n fontFamily: MONO_FF,\n lineHeight: 1.3,\n zIndex: 2,\n minWidth: 18,\n textAlign: 'center',\n ...position,\n transform,\n ...copyableStyle(isToken),\n }}\n >\n {justCopied ? '✓' : text}\n </span>\n );\n}\n\nexport function CornerLabel({\n pos,\n value,\n mode,\n onCopy,\n copiedKey,\n}: {\n pos: 'tl' | 'tr' | 'br' | 'bl';\n value: number;\n mode: BoxLabelMode;\n} & LabelCopyProps) {\n const offsets: Record<typeof pos, React.CSSProperties> = {\n tl: { top: 3, left: 5 },\n tr: { top: 3, right: 5 },\n br: { bottom: 3, right: 5 },\n bl: { bottom: 3, left: 5 },\n };\n const { text, isToken } = fmtRadiusCorner(value, mode);\n const copyKey = `tok:${text}`;\n const justCopied = isToken && copiedKey === copyKey;\n return (\n <span\n onClick={isToken ? () => onCopy(text) : undefined}\n title={isToken ? `Copy \"${text}\"` : undefined}\n style={{\n position: 'absolute',\n fontSize: 10,\n color: 'rgba(255,255,255,0.85)',\n fontFamily: MONO_FF,\n ...offsets[pos],\n ...copyableStyle(isToken),\n }}\n >\n {justCopied ? '✓' : text}\n </span>\n );\n}\n\nexport function SideLabel({\n pos,\n value,\n kind,\n mode,\n onCopy,\n copiedKey,\n}: {\n pos: 't' | 'r' | 'b' | 'l';\n value: number;\n // 'spacing' = padding label, 'border' = border-width label (off-scale).\n kind: 'spacing' | 'border';\n mode: BoxLabelMode;\n} & LabelCopyProps) {\n // Border widths never resolve to a Spring spacing token (they're 0.5 / 1\n // / 1.2 / 1.35 / 2 px, not on the spacing scale) so always render px\n // without click-to-copy.\n const result: LabelText =\n kind === 'border'\n ? { text: value === 0 ? '–' : `${value}`, isToken: false }\n : fmtSpacingSide(value, mode);\n const { text, isToken } = result;\n const isVertical = (pos === 'l' || pos === 'r') && isToken;\n const baseTransform =\n pos === 't' || pos === 'b' ? 'translateX(-50%)' : 'translateY(-50%)';\n // Rotated L/R padding labels sit in the *center* of the padding strip\n // (12px from the padding-layer edge, which is half of the 24px strip\n // width). The translate-by-50% on top of that keeps the visual center\n // aligned at that point after rotation. Unrotated labels hug the edge.\n const position: React.CSSProperties =\n pos === 't'\n ? { top: 3, left: '50%' }\n : pos === 'b'\n ? { bottom: 3, left: '50%' }\n : pos === 'l'\n ? isVertical\n ? { top: '50%', left: 12 }\n : { top: '50%', left: 4 }\n : isVertical\n ? { top: '50%', right: 12 }\n : { top: '50%', right: 4 };\n const transform = isVertical\n ? `translate(${pos === 'r' ? '50%' : '-50%'}, -50%) ${pos === 'r' ? 'rotate(90deg)' : 'rotate(-90deg)'}`\n : baseTransform;\n // Padding labels need a small dark bg so they stay readable against the\n // tinted padding layer + dashed content-rect border. Border-width labels\n // don't (the border layer behind them is clean).\n const needsBg = kind === 'spacing' && value > 0;\n const copyKey = `tok:${text}`;\n const justCopied = isToken && copiedKey === copyKey;\n return (\n <span\n onClick={isToken ? () => onCopy(text) : undefined}\n title={isToken ? `Copy \"${text}\"` : undefined}\n style={{\n position: 'absolute',\n fontSize: 10,\n color: 'rgba(255,255,255,0.95)',\n fontFamily: MONO_FF,\n ...(needsBg\n ? {\n background: 'rgba(0,0,0,0.55)',\n padding: '1px 4px',\n borderRadius: 3,\n }\n : null),\n ...position,\n transform,\n ...copyableStyle(isToken),\n }}\n >\n {justCopied ? '✓' : text}\n </span>\n );\n}\n\n","// Asset detection + the Asset/Image/Video/Audio/Vector/Icon section. Extracted\n// from Inspector.tsx (P3.2).\nimport React from 'react';\nimport { getAncestorScale } from './getAncestorScale';\nimport { getFiberFromDom } from './fiber';\nimport { getDesignSystemAdapter } from '../adapters';\nimport { Section, MONO_FF } from './sections';\n\nexport type AssetInfo =\n | {\n kind: 'image';\n src: string;\n alt: string | null;\n naturalWidth: number;\n naturalHeight: number;\n displayedWidth: number;\n displayedHeight: number;\n format: string | null;\n }\n | {\n kind: 'video';\n src: string | null;\n poster: string | null;\n naturalWidth: number;\n naturalHeight: number;\n displayedWidth: number;\n displayedHeight: number;\n duration: number | null;\n format: string | null;\n }\n | {\n kind: 'audio';\n src: string | null;\n duration: number | null;\n format: string | null;\n }\n | {\n kind: 'svg';\n svgEl: SVGSVGElement;\n viewBox: string | null;\n displayedWidth: number;\n displayedHeight: number;\n }\n | {\n kind: 'library-icon';\n iconName: string;\n iconSize: string | null; // wrapper size prop (e.g. <Icon size=\"…\">), if any\n svgEl: SVGSVGElement;\n viewBox: string | null;\n displayedWidth: number;\n displayedHeight: number;\n };\n\nexport function ownerSvg(node: Element): SVGSVGElement | null {\n if (node instanceof SVGSVGElement) return node;\n const owner = (node as SVGElement).ownerSVGElement;\n return owner instanceof SVGSVGElement ? owner : null;\n}\n\n// Icon detection now lives in the adapter: `findIconName(startFiber)` walks up\n// from the SVG host's fiber and identity-matches the library's icon exports;\n// `iconWrapperSize(startFiber)` reports an optional wrapper size prop. Both take\n// the SVG host's start fiber so the adapter owns the walk; the generic adapter\n// returns null for both.\n\nexport function extOf(url: string): string | null {\n try {\n const u = new URL(url, 'http://x/');\n const m = u.pathname.match(/\\.([a-z0-9]+)(?:$|\\?)/i);\n return m ? m[1].toLowerCase() : null;\n } catch {\n const m = url.match(/\\.([a-z0-9]+)(?:$|\\?|#)/i);\n return m ? m[1].toLowerCase() : null;\n }\n}\n\nexport function getAssetInfo(node: HTMLElement | SVGElement): AssetInfo | null {\n const tag = (node.tagName || '').toLowerCase();\n\n // Click landed inside an SVG (path/g/etc.) — treat the owner SVG as the\n // asset target so users never have to re-click the root svg manually.\n let svgRoot: SVGSVGElement | null = null;\n if (node instanceof SVGElement) svgRoot = ownerSvg(node);\n\n if (tag === 'img') {\n const img = node as HTMLImageElement;\n const r = img.getBoundingClientRect();\n const scale = getAncestorScale(img);\n return {\n kind: 'image',\n src: img.currentSrc || img.src || '',\n alt: img.alt || null,\n naturalWidth: img.naturalWidth || 0,\n naturalHeight: img.naturalHeight || 0,\n displayedWidth: Math.round(r.width / scale),\n displayedHeight: Math.round(r.height / scale),\n format: extOf(img.currentSrc || img.src || ''),\n };\n }\n\n if (tag === 'video') {\n const v = node as HTMLVideoElement;\n const r = v.getBoundingClientRect();\n const scale = getAncestorScale(v);\n return {\n kind: 'video',\n src: v.currentSrc || v.src || null,\n poster: v.poster || null,\n naturalWidth: v.videoWidth || 0,\n naturalHeight: v.videoHeight || 0,\n displayedWidth: Math.round(r.width / scale),\n displayedHeight: Math.round(r.height / scale),\n duration: Number.isFinite(v.duration) ? v.duration : null,\n format: extOf(v.currentSrc || v.src || ''),\n };\n }\n\n if (tag === 'audio') {\n const a = node as HTMLAudioElement;\n return {\n kind: 'audio',\n src: a.currentSrc || a.src || null,\n duration: Number.isFinite(a.duration) ? a.duration : null,\n format: extOf(a.currentSrc || a.src || ''),\n };\n }\n\n if (svgRoot) {\n const r = svgRoot.getBoundingClientRect();\n const scale = getAncestorScale(svgRoot);\n const vb = svgRoot.getAttribute('viewBox');\n const startFiber = getFiberFromDom(svgRoot);\n const adapter = getDesignSystemAdapter();\n const iconName = adapter.findIconName(startFiber);\n if (iconName) {\n const size = adapter.iconWrapperSize?.(startFiber) ?? null;\n return {\n kind: 'library-icon',\n iconName,\n iconSize: size,\n svgEl: svgRoot,\n viewBox: vb,\n displayedWidth: Math.round(r.width / scale),\n displayedHeight: Math.round(r.height / scale),\n };\n }\n return {\n kind: 'svg',\n svgEl: svgRoot,\n viewBox: vb,\n displayedWidth: Math.round(r.width / scale),\n displayedHeight: Math.round(r.height / scale),\n };\n }\n\n return null;\n}\n\n// ───────── selection model ─────────\n//\n// A selection is just a node in the hierarchy: one fiber, the host DOM node\n// associated with it, and the kind (drives which body sections render).\n// Clicking on the canvas selects the exact host you clicked (kind=element).\n// Clicking a row in the Hierarchy tree re-selects that fiber. There is no\n// separate \"scope\" — the tree IS the navigation.\n\nexport function downloadHref(url: string, suggestedName?: string) {\n const a = document.createElement('a');\n a.href = url;\n if (suggestedName) a.download = suggestedName;\n a.target = '_blank';\n a.rel = 'noopener';\n document.body.appendChild(a);\n a.click();\n a.remove();\n}\n\nexport function downloadSvg(svgEl: SVGSVGElement, suggestedName: string) {\n // Clone + ensure xmlns is present (some inline svgs omit it; without xmlns\n // the saved file won't open in Figma / browsers).\n const clone = svgEl.cloneNode(true) as SVGSVGElement;\n if (!clone.getAttribute('xmlns')) {\n clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n }\n const xml = new XMLSerializer().serializeToString(clone);\n const blob = new Blob([xml], { type: 'image/svg+xml;charset=utf-8' });\n const url = URL.createObjectURL(blob);\n try {\n downloadHref(url, suggestedName);\n } finally {\n // Defer revoke so the click has a chance to start the download.\n setTimeout(() => URL.revokeObjectURL(url), 4000);\n }\n}\n\nexport function basenameFromUrl(url: string, fallback: string): string {\n try {\n const u = new URL(url, 'http://x/');\n const last = u.pathname.split('/').filter(Boolean).pop();\n if (last) return decodeURIComponent(last);\n } catch {\n // ignore\n }\n return fallback;\n}\n\nexport function formatDuration(seconds: number): string {\n if (!Number.isFinite(seconds) || seconds < 0) return '—';\n const s = Math.round(seconds);\n const m = Math.floor(s / 60);\n const r = s % 60;\n return `${m}:${r.toString().padStart(2, '0')}`;\n}\n\nexport function AssetTypePill({ label }: { label: string }) {\n return (\n <span\n style={{\n display: 'inline-block',\n padding: '2px 8px',\n borderRadius: 4,\n background: 'rgba(155,185,255,0.16)',\n color: '#c5d3f4',\n fontSize: 10.5,\n fontWeight: 600,\n letterSpacing: 0.4,\n textTransform: 'uppercase',\n whiteSpace: 'nowrap',\n }}\n >\n {label}\n </span>\n );\n}\n\nexport function AssetKV({\n label,\n children,\n}: {\n label: string;\n children: React.ReactNode;\n}) {\n return (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: '92px 1fr',\n gap: 8,\n alignItems: 'baseline',\n fontSize: 12,\n padding: '4px 0',\n borderBottom: '1px solid rgba(255,255,255,0.06)',\n }}\n >\n <span style={{ color: 'rgba(255,255,255,0.55)' }}>{label}</span>\n <span\n style={{\n fontFamily: MONO_FF,\n color: '#f5f1e8',\n wordBreak: 'break-word',\n minWidth: 0,\n }}\n >\n {children}\n </span>\n </div>\n );\n}\n\nexport const ASSET_ACTION_BTN: React.CSSProperties = {\n background: 'rgba(255,255,255,0.05)',\n border: '1px solid rgba(255,255,255,0.12)',\n color: '#f5f1e8',\n padding: '6px 10px',\n borderRadius: 6,\n fontSize: 11.5,\n cursor: 'pointer',\n fontFamily: 'inherit',\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n whiteSpace: 'nowrap',\n};\n\nexport const ASSET_ACTION_PRIMARY: React.CSSProperties = {\n ...ASSET_ACTION_BTN,\n background: 'rgba(155,185,255,0.18)',\n borderColor: 'rgba(155,185,255,0.35)',\n color: '#c5d3f4',\n};\n\nexport function AssetSection({\n info,\n copy,\n copiedKey,\n}: {\n info: AssetInfo;\n copy: (text: string, key: string) => void;\n copiedKey: string | null;\n}) {\n if (info.kind === 'library-icon') {\n const adapter = getDesignSystemAdapter();\n const importLine = adapter.iconImportSnippet(info.iconName);\n return (\n <Section title={adapter.iconLabel} action={<AssetTypePill label=\"icon\" />}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n padding: '10px 12px',\n background: 'rgba(0,0,0,0.35)',\n borderRadius: 6,\n }}\n >\n <span\n style={{\n fontFamily: MONO_FF,\n fontSize: 14,\n fontWeight: 600,\n color: '#f5f1e8',\n wordBreak: 'break-all',\n }}\n >\n {info.iconName}\n </span>\n <button\n onClick={() => copy(info.iconName, 'icon-name')}\n style={{ ...ASSET_ACTION_BTN, marginLeft: 'auto' }}\n title=\"Copy icon name\"\n >\n {copiedKey === 'icon-name' ? '✓ copied' : 'copy name'}\n </button>\n </div>\n\n <div>\n <div\n style={{\n fontSize: 10.5,\n color: 'rgba(255,255,255,0.45)',\n marginBottom: 4,\n textTransform: 'uppercase',\n letterSpacing: 0.4,\n fontWeight: 600,\n }}\n >\n Import\n </div>\n <pre\n style={{\n margin: 0,\n padding: '8px 10px',\n background: 'rgba(0,0,0,0.35)',\n borderRadius: 6,\n fontFamily: MONO_FF,\n fontSize: 11.5,\n lineHeight: 1.5,\n color: '#f5f1e8',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n }}\n >\n {importLine}\n </pre>\n <div style={{ display: 'flex', gap: 6, marginTop: 6 }}>\n <button\n onClick={() => copy(importLine, 'icon-import')}\n style={ASSET_ACTION_PRIMARY}\n title=\"Copy import statement\"\n >\n {copiedKey === 'icon-import' ? '✓ copied' : 'copy import'}\n </button>\n <button\n onClick={() =>\n downloadSvg(info.svgEl, `${info.iconName}.svg`)\n }\n style={ASSET_ACTION_BTN}\n title=\"Download the rendered SVG\"\n >\n ↓ svg\n </button>\n </div>\n </div>\n\n <div>\n {info.iconSize && (\n <AssetKV label=\"Icon size\">{info.iconSize}</AssetKV>\n )}\n {info.viewBox && (\n <AssetKV label=\"viewBox\">{info.viewBox}</AssetKV>\n )}\n <AssetKV label=\"Rendered\">\n {info.displayedWidth} × {info.displayedHeight} px\n </AssetKV>\n </div>\n </div>\n </Section>\n );\n }\n\n if (info.kind === 'image') {\n const fileName = basenameFromUrl(info.src, 'image');\n return (\n <Section\n title=\"Image\"\n action={\n <AssetTypePill label={info.format ? info.format : 'image'} />\n }\n >\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n <UrlBlock\n url={info.src}\n copyKey=\"img-url\"\n copiedKey={copiedKey}\n copy={copy}\n />\n <div>\n {info.alt && <AssetKV label=\"alt\">{info.alt}</AssetKV>}\n <AssetKV label=\"Natural\">\n {info.naturalWidth} × {info.naturalHeight} px\n </AssetKV>\n <AssetKV label=\"Rendered\">\n {info.displayedWidth} × {info.displayedHeight} px\n </AssetKV>\n {info.format && <AssetKV label=\"Format\">{info.format}</AssetKV>}\n </div>\n <div style={{ display: 'flex', gap: 6 }}>\n <button\n onClick={() => downloadHref(info.src, fileName)}\n style={ASSET_ACTION_PRIMARY}\n title=\"Download image\"\n >\n ↓ download\n </button>\n <button\n onClick={() => window.open(info.src, '_blank', 'noopener')}\n style={ASSET_ACTION_BTN}\n title=\"Open in new tab\"\n >\n open ↗\n </button>\n </div>\n </div>\n </Section>\n );\n }\n\n if (info.kind === 'video') {\n const url = info.src || info.poster || '';\n const fileName = basenameFromUrl(url, 'video');\n return (\n <Section\n title=\"Video\"\n action={<AssetTypePill label={info.format ? info.format : 'video'} />}\n >\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n {info.src && (\n <UrlBlock\n url={info.src}\n copyKey=\"vid-url\"\n copiedKey={copiedKey}\n copy={copy}\n label=\"src\"\n />\n )}\n {info.poster && (\n <UrlBlock\n url={info.poster}\n copyKey=\"vid-poster\"\n copiedKey={copiedKey}\n copy={copy}\n label=\"poster\"\n />\n )}\n <div>\n <AssetKV label=\"Natural\">\n {info.naturalWidth} × {info.naturalHeight} px\n </AssetKV>\n <AssetKV label=\"Rendered\">\n {info.displayedWidth} × {info.displayedHeight} px\n </AssetKV>\n {info.duration != null && (\n <AssetKV label=\"Duration\">{formatDuration(info.duration)}</AssetKV>\n )}\n {info.format && <AssetKV label=\"Format\">{info.format}</AssetKV>}\n </div>\n {info.src && (\n <div style={{ display: 'flex', gap: 6 }}>\n <button\n onClick={() => downloadHref(info.src!, fileName)}\n style={ASSET_ACTION_PRIMARY}\n title=\"Download video\"\n >\n ↓ download\n </button>\n <button\n onClick={() => window.open(info.src!, '_blank', 'noopener')}\n style={ASSET_ACTION_BTN}\n title=\"Open in new tab\"\n >\n open ↗\n </button>\n </div>\n )}\n </div>\n </Section>\n );\n }\n\n if (info.kind === 'audio') {\n const url = info.src || '';\n const fileName = basenameFromUrl(url, 'audio');\n return (\n <Section\n title=\"Audio\"\n action={<AssetTypePill label={info.format ? info.format : 'audio'} />}\n >\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n {info.src && (\n <UrlBlock\n url={info.src}\n copyKey=\"aud-url\"\n copiedKey={copiedKey}\n copy={copy}\n />\n )}\n <div>\n {info.duration != null && (\n <AssetKV label=\"Duration\">{formatDuration(info.duration)}</AssetKV>\n )}\n {info.format && <AssetKV label=\"Format\">{info.format}</AssetKV>}\n </div>\n {info.src && (\n <div style={{ display: 'flex', gap: 6 }}>\n <button\n onClick={() => downloadHref(info.src!, fileName)}\n style={ASSET_ACTION_PRIMARY}\n title=\"Download audio\"\n >\n ↓ download\n </button>\n <button\n onClick={() => window.open(info.src!, '_blank', 'noopener')}\n style={ASSET_ACTION_BTN}\n title=\"Open in new tab\"\n >\n open ↗\n </button>\n </div>\n )}\n </div>\n </Section>\n );\n }\n\n // Plain (non-Spring) SVG\n return (\n <Section title=\"Vector\" action={<AssetTypePill label=\"svg\" />}>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>\n <div>\n {info.viewBox && (\n <AssetKV label=\"viewBox\">{info.viewBox}</AssetKV>\n )}\n <AssetKV label=\"Rendered\">\n {info.displayedWidth} × {info.displayedHeight} px\n </AssetKV>\n </div>\n <div style={{ display: 'flex', gap: 6 }}>\n <button\n onClick={() => downloadSvg(info.svgEl, 'asset.svg')}\n style={ASSET_ACTION_PRIMARY}\n title=\"Download SVG\"\n >\n ↓ svg\n </button>\n <button\n onClick={() => {\n const clone = info.svgEl.cloneNode(true) as SVGSVGElement;\n if (!clone.getAttribute('xmlns')) {\n clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');\n }\n const xml = new XMLSerializer().serializeToString(clone);\n copy(xml, 'svg-markup');\n }}\n style={ASSET_ACTION_BTN}\n title=\"Copy SVG markup\"\n >\n {copiedKey === 'svg-markup' ? '✓ copied' : 'copy markup'}\n </button>\n </div>\n </div>\n </Section>\n );\n}\n\nexport function UrlBlock({\n url,\n copyKey,\n copiedKey,\n copy,\n label,\n}: {\n url: string;\n copyKey: string;\n copiedKey: string | null;\n copy: (text: string, key: string) => void;\n label?: string;\n}) {\n return (\n <div>\n {label && (\n <div\n style={{\n fontSize: 10.5,\n color: 'rgba(255,255,255,0.45)',\n marginBottom: 4,\n textTransform: 'uppercase',\n letterSpacing: 0.4,\n fontWeight: 600,\n }}\n >\n {label}\n </div>\n )}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n padding: '6px 8px',\n background: 'rgba(0,0,0,0.35)',\n borderRadius: 6,\n minWidth: 0,\n }}\n >\n <span\n style={{\n fontFamily: MONO_FF,\n fontSize: 11.5,\n color: '#f5f1e8',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n flex: 1,\n minWidth: 0,\n }}\n title={url}\n >\n {url}\n </span>\n <button\n onClick={() => copy(url, copyKey)}\n style={{ ...ASSET_ACTION_BTN, padding: '4px 8px', fontSize: 11 }}\n title=\"Copy URL\"\n >\n {copiedKey === copyKey ? '✓' : 'copy'}\n </button>\n </div>\n </div>\n );\n}\n\n// ───────── box model ─────────\n//\n// Figma-style diagram: dark surface, red margin pills on the four sides with\n// crosshair guides, a rounded Border layer that displays its actual corner\n// radii (clamped visually) and per-side border-width values, a tinted Padding\n// layer with per-side padding values, and a dashed content rect with W × H.\n// `border-box` / `content-box` is shown in the bottom-right corner.\n\n","// The Hierarchy (layers) tree + child enumeration. Extracted from Inspector.tsx\n// (P3.2).\nimport React, { useEffect, useRef, useState } from 'react';\nimport { frameBodyOf } from './frameInspect';\nimport { Section, MONO_FF } from './sections';\nimport {\n appendLayerLabel,\n buildAncestry,\n buildSelectedFromFiber,\n buildSelectedFromFrameEl,\n buildSelectedFromHost,\n findFirstHostElement,\n formatHostName,\n getDirectText,\n getFiberFromDom,\n isInterestingName,\n isLibraryType,\n layerLabel,\n libraryAwareName,\n rendersOwnDom,\n} from './fiber';\nimport type { AncestryKind, AncestryNode, Fiber, SelectedNode } from './fiber';\n\nexport function getChildSummary(\n parent: Element,\n parentFiber: Fiber | null,\n): AncestryNode[] {\n const out: AncestryNode[] = [];\n\n for (let i = 0; i < parent.children.length; i++) {\n const child = parent.children[i];\n if (!(child instanceof Element)) continue;\n const childFiber = getFiberFromDom(child);\n\n let candidate: AncestryNode | null = null;\n // Promote to the outermost \"interesting\" component between this host and\n // the parent boundary — only possible when both fibers are known.\n if (childFiber && parentFiber) {\n let cur: Fiber | null = childFiber;\n let reachedParent = false;\n while (cur) {\n if (cur === parentFiber) {\n reachedParent = true;\n break;\n }\n const cname = libraryAwareName(cur.type);\n if (isInterestingName(cname) && rendersOwnDom(cur)) {\n const kind: AncestryKind = isLibraryType(cur.type) ? 'library' : 'user';\n // `child` is the direct DOM child of `parent`, so it IS this\n // component's host as rendered at the parent level — exact, even\n // when the component promotes up several fibers. Keep overwriting so\n // the final value is the outermost interesting fiber.\n candidate = { fiber: cur, name: appendLayerLabel(cname!, child), kind, dom: child };\n }\n cur = cur.return;\n }\n // React-parent and DOM-parent disagree (portal): we never met\n // parentFiber walking up. Don't trust the promoted component label here;\n // fall back to a plain element row. hostFor() returns `child` either way,\n // so recursion stays inside this DOM subtree.\n if (!reachedParent) candidate = null;\n }\n\n const summary: AncestryNode =\n candidate ?? {\n fiber: childFiber ?? undefined,\n name: formatHostName(child, child.tagName.toLowerCase()),\n kind: 'element',\n dom: child,\n };\n\n out.push(summary);\n }\n return out;\n}\n\nexport const LAYER_PALETTE: Record<\n AncestryKind,\n { label: string }\n> = {\n artboard: { label: 'rgba(255,255,255,0.55)' },\n user: { label: '#ff9ecb' },\n library: { label: '#9bb9ff' },\n element: { label: 'rgba(255,255,255,0.82)' },\n};\n\n// Resolve the host element for an ancestry node so we can read its children.\n// Prefer the DOM element captured at walk time (getChildSummary) — it's exact\n// for SVG and multi-host wrappers, where fiber-based resolution fails. Fall\n// back to fiber resolution for nodes built without it (buildAncestry chain,\n// artboard sentinel).\nexport function hostFor(node: AncestryNode): Element | null {\n if (node.dom) return node.dom;\n if (!node.fiber) return null;\n if (node.kind === 'element' || node.kind === 'artboard') {\n return node.fiber.stateNode instanceof HTMLElement\n ? node.fiber.stateNode\n : findFirstHostElement(node.fiber);\n }\n return findFirstHostElement(node.fiber);\n}\n\nexport const TREE_MIN_HEIGHT = 120;\nexport const TREE_MAX_HEIGHT = 800;\n// Safety net for pathological trees (a participant list of 500, an icon-grid\n// with 200 entries, anything where a single parent has way more children than\n// is useful to scroll through). Cap any single level at this many rows; any\n// child whose subtree contains the current selection is force-included so the\n// path-to-selected always renders even when truncated. Click \"show N more\"\n// on the parent to reveal the rest.\nexport const TREE_BREADTH_CAP = 80;\n\nexport function ComponentTree({\n selected,\n onJumpTo,\n height,\n onHeightChange,\n}: {\n selected: SelectedNode;\n onJumpTo: (next: SelectedNode) => void;\n height: number;\n onHeightChange: (h: number) => void;\n}) {\n // Persist which rows the user has opened, keyed by DOM host (the row's stable\n // identity — fiber is wrong: one host can back several fibers, and fiber-less\n // rows have none). Survives selection changes so that jumping into an\n // expanded child doesn't collapse its siblings.\n const [expanded, setExpanded] = useState<Set<Element>>(new Set());\n // Per-parent override: when present, render ALL children at that level\n // instead of truncating at TREE_BREADTH_CAP. Driven by the \"show N more\"\n // button on a truncated parent. Keyed by the parent host element.\n const [breadthExpanded, setBreadthExpanded] = useState<Set<Element>>(new Set());\n const [dragging, setDragging] = useState(false);\n const toggle = (host: Element) => {\n setExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(host)) next.delete(host);\n else next.add(host);\n return next;\n });\n };\n const toggleBreadth = (host: Element) => {\n setBreadthExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(host)) next.delete(host);\n else next.add(host);\n return next;\n });\n };\n\n // Ancestry comes deepest-first (selected → up); we want top → bottom in the\n // tree, so reverse. Strip the Artboard sentinel — it's a canvas construct\n // (DCArtboardFrame), not part of the design being inspected, so we don't\n // want it showing up as a clickable row.\n // Full layers-panel tree: render starting from the artboard's child list,\n // recursing down. Every ancestor of the selected element renders with its\n // siblings visible; chainFibers force-expands the path-to-selected. The\n // artboard itself stays out of the displayed tree (it's a canvas\n // construct, not part of the design) — we just use it as the root parent\n // whose children seed the recursion.\n // DOM mode (frozen snapshot): no fibers exist, so the tree IS the snapshot's\n // real DOM, seeded at the snapshot body inside the tile's shadow root. The\n // recursive ChildrenList below is already DOM-complete (fibers only ever\n // label/promote rows) — with a null parentFiber it renders pure element rows.\n const domMode = selected.domMode;\n // DOM-mode tree seed: the snapshot body (frozen tiles), or the frame body\n // for a live non-React route frame (in-app canvas mode) — same role, the\n // root the selection's selector scope and hierarchy both hang off.\n const snapshotRoot = domMode ? frameBodyOf(selected.domNode) : null;\n const rawAncestry =\n !domMode && selected.fiber ? buildAncestry(selected.fiber) : []; // deepest-first\n if (domMode ? !snapshotRoot : rawAncestry.length === 0) return null;\n const rawChain = [...rawAncestry].reverse(); // top-down, may include artboard at [0]\n const displayChain = rawChain.filter((n) => n.kind !== 'artboard');\n const selectedAncestryNode = displayChain[displayChain.length - 1];\n // Find the artboard sentinel so we can render its children as the top of\n // the tree. If the selection isn't under an artboard (unusual), fall back\n // to today's \"selected + its own children\" rendering.\n const artboardNode = rawChain.find((n) => n.kind === 'artboard') ?? null;\n const artboardOuter = artboardNode ? hostFor(artboardNode) : null;\n // The DCArtboardFrame host renders a `[data-dc-slot]` outer with three\n // children: `.dc-labelrow` (drag handle + name), `.dc-expand` (focus\n // button), and `.dc-card` (the actual design surface). Only `.dc-card`\n // should seed the tree — everything else is canvas chrome, not part of\n // the design being inspected.\n const artboardHost =\n (artboardOuter?.querySelector('.dc-card') as HTMLElement | null) ??\n artboardOuter;\n // What actually seeds the recursive tree: snapshot body in DOM mode, the\n // artboard's design surface otherwise.\n const treeHost = domMode ? snapshotRoot : artboardHost;\n const treeSeedFiber = domMode ? null : artboardNode?.fiber ?? null;\n const useFullTree = domMode || !!(artboardNode && artboardHost);\n // Force-open key: any row whose host DOM element contains the selected\n // DOM node is on the path to selection — by-DOM-containment is more\n // robust than by-fiber-set because buildAncestry only collects\n // \"interesting\" React fibers and skips intermediate host wrappers that\n // can show up as rows in our recursive render.\n const selectedHost = selected.domNode;\n\n const handleJump = (n: AncestryNode) => {\n // Prefer fiber (resolves component JSX/props); fall back to the DOM host\n // for fiber-less rows so they're still selectable. Frame rows without\n // fibers (non-React route frame) select in DOM mode.\n const next = n.fiber\n ? buildSelectedFromFiber(n.fiber, n.kind)\n : n.dom\n ? buildSelectedFromHost(n.dom) ?? buildSelectedFromFrameEl(n.dom)\n : null;\n if (next) onJumpTo(next);\n };\n\n // Drag-resize. Capture pointer on the grip so movement outside the strip\n // still flows to us. Use clientY deltas (panel is position:fixed, so no\n // canvas-scale compensation needed). Disable text selection while\n // dragging to keep the cursor read as a resize affordance.\n const onGripPointerDown = (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault();\n const startY = e.clientY;\n const startH = height;\n const target = e.currentTarget;\n try {\n target.setPointerCapture(e.pointerId);\n } catch {\n // some browsers throw if pointer is already released — ignore\n }\n setDragging(true);\n const prevUserSelect = document.body.style.userSelect;\n document.body.style.userSelect = 'none';\n\n const onMove = (ev: PointerEvent) => {\n const next = Math.max(\n TREE_MIN_HEIGHT,\n Math.min(TREE_MAX_HEIGHT, startH + (ev.clientY - startY)),\n );\n onHeightChange(next);\n };\n const onUp = () => {\n setDragging(false);\n document.body.style.userSelect = prevUserSelect;\n target.removeEventListener('pointermove', onMove);\n target.removeEventListener('pointerup', onUp);\n target.removeEventListener('pointercancel', onUp);\n };\n target.addEventListener('pointermove', onMove);\n target.addEventListener('pointerup', onUp);\n target.addEventListener('pointercancel', onUp);\n };\n\n // Auto-scroll the selected row into view whenever the selection changes\n // (canvas click, walkUp, scan jump). `block: 'nearest'` no-ops when the\n // row is already visible — feels stable instead of constantly recentering.\n const scrollRef = useRef<HTMLDivElement | null>(null);\n useEffect(() => {\n const el = scrollRef.current?.querySelector<HTMLElement>(\n '[data-tree-selected=\"true\"]',\n );\n if (el) el.scrollIntoView({ block: 'nearest' });\n }, [selected.fiber, selected.domNode]);\n\n return (\n <Section title=\"Hierarchy\">\n <div\n style={{\n fontSize: 11.5,\n lineHeight: 1.4,\n color: 'rgba(255,255,255,0.45)',\n marginBottom: 6,\n }}\n >\n Tip: add a{' '}\n <code\n style={{\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n fontSize: 11,\n padding: '0 4px',\n borderRadius: 3,\n background: 'rgba(255,255,255,0.08)',\n color: 'rgba(255,255,255,0.7)',\n }}\n >\n data-name\n </code>{' '}\n attribute to any element to label it in this tree.\n </div>\n <div\n ref={scrollRef}\n role=\"tree\"\n aria-label=\"Component hierarchy\"\n style={{\n background: 'rgba(0,0,0,0.3)',\n borderRadius: 6,\n padding: '4px 0',\n height,\n overflowY: 'auto',\n }}\n >\n {useFullTree && treeHost ? (\n // Full tree: recurse from the artboard's children (or the snapshot\n // body's children in DOM mode). Every ancestor of the selected\n // element renders with its siblings; the path toward selected is\n // force-expanded via DOM containment. Selected itself is\n // highlighted and also force-expanded so its own children appear\n // collapsed below it.\n <ChildrenList\n host={treeHost}\n parentFiber={treeSeedFiber}\n depth={0}\n expanded={expanded}\n breadthExpanded={breadthExpanded}\n activeFiber={selected.fiber}\n selectedHost={selectedHost}\n onToggle={toggle}\n onBreadthToggle={toggleBreadth}\n onJumpTo={handleJump}\n />\n ) : (\n // Fallback: selection isn't under an artboard. Render the\n // displayChain as flat rows + selected's children below — this is\n // the legacy behavior; should rarely fire in practice since the\n // inspector is only enabled inside DesignCanvas.\n <>\n {displayChain.slice(0, -1).map((n, i) => (\n <TreeRow\n key={`anc:${i}`}\n node={n}\n depth={i}\n isSelected={false}\n expandable={false}\n isOpen={false}\n onToggle={() => {}}\n onJumpTo={() => handleJump(n)}\n />\n ))}\n <TreeRow\n node={selectedAncestryNode}\n depth={displayChain.length - 1}\n isSelected\n expandable={false}\n isOpen\n onToggle={() => {}}\n onJumpTo={() => handleJump(selectedAncestryNode)}\n />\n <ChildrenList\n host={selected.domNode}\n parentFiber={selected.fiber}\n depth={displayChain.length}\n expanded={expanded}\n breadthExpanded={breadthExpanded}\n activeFiber={selected.fiber}\n selectedHost={selectedHost}\n onToggle={toggle}\n onBreadthToggle={toggleBreadth}\n onJumpTo={handleJump}\n />\n </>\n )}\n </div>\n {/* Drag-to-resize grip. Sits flush under the scroll container; small\n hit zone, larger visual gutter on hover. */}\n <div\n onPointerDown={onGripPointerDown}\n title=\"Drag to resize\"\n style={{\n height: 10,\n marginTop: 2,\n cursor: 'ns-resize',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n touchAction: 'none',\n userSelect: 'none',\n borderRadius: 4,\n background: dragging ? 'rgba(155,185,255,0.18)' : 'transparent',\n transition: 'background 120ms ease',\n }}\n onMouseEnter={(e) => {\n if (!dragging)\n (e.currentTarget as HTMLDivElement).style.background =\n 'rgba(255,255,255,0.06)';\n }}\n onMouseLeave={(e) => {\n if (!dragging)\n (e.currentTarget as HTMLDivElement).style.background = 'transparent';\n }}\n >\n <div\n style={{\n width: 36,\n height: 3,\n borderRadius: 2,\n background: dragging\n ? 'rgba(155,185,255,0.7)'\n : 'rgba(255,255,255,0.25)',\n }}\n />\n </div>\n </Section>\n );\n}\n\nexport function ChildrenList({\n host,\n parentFiber,\n depth,\n expanded,\n breadthExpanded,\n activeFiber,\n selectedHost,\n onToggle,\n onBreadthToggle,\n onJumpTo,\n}: {\n host: Element;\n // Fiber boundary that bounds promotion in getChildSummary. Null when we're\n // under a fiber-less host (no boundary to walk up to).\n parentFiber: Fiber | null;\n depth: number;\n expanded: Set<Element>;\n breadthExpanded: Set<Element>;\n // The fiber that's actually selected — gets the highlight + force-expanded.\n activeFiber?: Fiber | null;\n // The selected element's DOM node. Used for force-open via DOM containment:\n // any row whose host DOM element contains this node is on the path to the\n // selection and should render expanded by default, regardless of whether\n // its fiber appears in buildAncestry's chain. Fixes the case where an\n // intermediate host wrapper (e.g. a span between Button and its inner\n // content) hides the selected element behind a collapsed row.\n selectedHost?: Element | null;\n onToggle: (host: Element) => void;\n onBreadthToggle: (host: Element) => void;\n onJumpTo: (n: AncestryNode) => void;\n}) {\n const allChildren = getChildSummary(host, parentFiber);\n if (allChildren.length === 0) {\n if (depth === 0) return null;\n return (\n <div\n style={{\n paddingLeft: 8 + depth * 14,\n paddingRight: 8,\n paddingTop: 2,\n paddingBottom: 2,\n fontSize: 10,\n color: 'rgba(255,255,255,0.35)',\n fontStyle: 'italic',\n }}\n >\n empty\n </div>\n );\n }\n\n // Breadth cap. If the parent has more than TREE_BREADTH_CAP children and\n // the user hasn't opted into \"show all\" for this parent, render only the\n // first cap-worth — PLUS any child whose subtree contains the selected\n // element, so the path-to-selection never gets hidden behind truncation.\n const showAll = breadthExpanded.has(host);\n let visibleChildren = allChildren;\n let hiddenCount = 0;\n if (!showAll && allChildren.length > TREE_BREADTH_CAP) {\n const head = allChildren.slice(0, TREE_BREADTH_CAP);\n const tailMustInclude = selectedHost\n ? allChildren.slice(TREE_BREADTH_CAP).filter((c) => {\n const ch = hostFor(c);\n return ch ? ch.contains(selectedHost) : false;\n })\n : [];\n visibleChildren = [...head, ...tailMustInclude];\n hiddenCount = allChildren.length - visibleChildren.length;\n }\n\n return (\n <>\n {visibleChildren.map((child, i) => (\n <ChildSubtree\n key={`${i}:${child.name}`}\n node={child}\n depth={depth}\n parentFiber={parentFiber}\n expanded={expanded}\n breadthExpanded={breadthExpanded}\n activeFiber={activeFiber}\n selectedHost={selectedHost}\n onToggle={onToggle}\n onBreadthToggle={onBreadthToggle}\n onJumpTo={onJumpTo}\n />\n ))}\n {hiddenCount > 0 && (\n <div\n onClick={() => onBreadthToggle(host)}\n title=\"Show all hidden children at this level\"\n style={{\n paddingLeft: 8 + (depth + 1) * 14,\n paddingRight: 8,\n paddingTop: 3,\n paddingBottom: 3,\n fontSize: 11,\n color: 'rgba(155,185,255,0.8)',\n cursor: 'pointer',\n fontStyle: 'italic',\n userSelect: 'none',\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLDivElement).style.color = '#cfe0ff';\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLDivElement).style.color =\n 'rgba(155,185,255,0.8)';\n }}\n >\n + show {hiddenCount} more\n </div>\n )}\n </>\n );\n}\n\nexport function ChildSubtree({\n node,\n depth,\n parentFiber,\n expanded,\n breadthExpanded,\n activeFiber,\n selectedHost,\n onToggle,\n onBreadthToggle,\n onJumpTo,\n}: {\n node: AncestryNode;\n depth: number;\n // The boundary fiber inherited from the enclosing ChildrenList. A fiber-less\n // row introduces no new boundary, so its children keep using this one.\n parentFiber: Fiber | null;\n expanded: Set<Element>;\n breadthExpanded: Set<Element>;\n activeFiber?: Fiber | null;\n selectedHost?: Element | null;\n onToggle: (host: Element) => void;\n onBreadthToggle: (host: Element) => void;\n onJumpTo: (n: AncestryNode) => void;\n}) {\n const childHost = hostFor(node);\n const hasChildren = !!(childHost && childHost.children.length > 0);\n // Identity is the DOM host. Match the selection by exact host equality\n // (handles memo(forwardRef) multi-fiber hosts and fiber-less rows); the fiber\n // check is a secondary signal for the rare host-less node.\n const isSelected =\n (!!selectedHost && childHost === selectedHost) ||\n (!!node.fiber && activeFiber === node.fiber);\n // Force-open when this row's DOM subtree contains the selected element.\n // Catches every ancestor on the path to selection — including intermediate\n // host wrappers (`<span>`s, layout divs) that buildAncestry doesn't track\n // because they aren't \"interesting\" React components on their own.\n const containsSelection = !!(\n selectedHost && childHost && childHost.contains(selectedHost)\n );\n const isOpen =\n containsSelection || (!!childHost && expanded.has(childHost));\n\n return (\n <>\n <TreeRow\n node={node}\n depth={depth}\n isSelected={isSelected}\n expandable={hasChildren}\n isOpen={isOpen}\n onToggle={() => childHost && onToggle(childHost)}\n onJumpTo={() => onJumpTo(node)}\n />\n {isOpen && childHost && (\n <ChildrenList\n host={childHost}\n parentFiber={node.fiber ?? parentFiber}\n depth={depth + 1}\n expanded={expanded}\n breadthExpanded={breadthExpanded}\n activeFiber={activeFiber}\n selectedHost={selectedHost}\n onToggle={onToggle}\n onBreadthToggle={onBreadthToggle}\n onJumpTo={onJumpTo}\n />\n )}\n </>\n );\n}\n\n// Keyboard nav for a hierarchy row (WAI-ARIA tree pattern, pragmatic). All rows\n// are DOM siblings under role=\"tree\" in visual order, so we navigate by walking\n// the flat `[data-dc-treeitem]` list rather than tracking indices in React.\n// Roving tabindex is moved imperatively as focus moves; React re-derives it from\n// `isSelected` on the next render (only expand/select cause one), which is fine.\nfunction onTreeRowKeyDown(\n e: React.KeyboardEvent<HTMLDivElement>,\n row: { expandable: boolean; isOpen: boolean; onToggle: () => void; onJumpTo: () => void },\n) {\n const el = e.currentTarget;\n const tree = el.closest('[role=\"tree\"]');\n if (!tree) return;\n const items = Array.from(\n tree.querySelectorAll<HTMLElement>('[data-dc-treeitem]'),\n );\n const idx = items.indexOf(el);\n const focus = (next: HTMLElement | undefined) => {\n if (!next) return;\n el.tabIndex = -1;\n next.tabIndex = 0;\n next.focus();\n };\n\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n focus(items[idx + 1]);\n break;\n case 'ArrowUp':\n e.preventDefault();\n focus(items[idx - 1]);\n break;\n case 'ArrowRight':\n e.preventDefault();\n // Collapsed → expand in place; already-open → step into the first child\n // (the next row). Leaf → no-op.\n if (row.expandable && !row.isOpen) row.onToggle();\n else if (row.expandable && row.isOpen) focus(items[idx + 1]);\n break;\n case 'ArrowLeft': {\n e.preventDefault();\n // Open → collapse in place; otherwise move to the parent row (the nearest\n // earlier row at a shallower level).\n if (row.expandable && row.isOpen) {\n row.onToggle();\n break;\n }\n const level = Number(el.getAttribute('aria-level'));\n for (let i = idx - 1; i >= 0; i--) {\n if (Number(items[i].getAttribute('aria-level')) < level) {\n focus(items[i]);\n break;\n }\n }\n break;\n }\n case 'Enter':\n case ' ':\n e.preventDefault();\n row.onJumpTo();\n break;\n case 'Home':\n e.preventDefault();\n focus(items[0]);\n break;\n case 'End':\n e.preventDefault();\n focus(items[items.length - 1]);\n break;\n }\n}\n\nexport function TreeRow({\n node,\n depth,\n isSelected,\n expandable,\n isOpen,\n onToggle,\n onJumpTo,\n}: {\n node: AncestryNode;\n depth: number;\n isSelected: boolean;\n expandable: boolean;\n isOpen: boolean;\n onToggle: () => void;\n onJumpTo: () => void;\n}) {\n const p = LAYER_PALETTE[node.kind];\n return (\n <div\n onClick={onJumpTo}\n onKeyDown={(e) => onTreeRowKeyDown(e, { expandable, isOpen, onToggle, onJumpTo })}\n title={`Jump to ${node.kind} · ${node.name}`}\n data-tree-selected={isSelected ? 'true' : undefined}\n // WAI-ARIA tree pattern (pragmatic). Rows are DOM siblings in visual order\n // inside role=\"tree\"; roving tabindex keeps a single tab stop, arrows move\n // between them (see onTreeRowKeyDown). :focus-visible ring in dc-styles.\n data-dc-treeitem\n role=\"treeitem\"\n aria-selected={isSelected}\n aria-expanded={expandable ? isOpen : undefined}\n aria-level={depth + 1}\n tabIndex={isSelected ? 0 : -1}\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n paddingTop: 3,\n paddingBottom: 3,\n paddingRight: 8,\n paddingLeft: 8 + depth * 14,\n background: isSelected ? 'rgba(154,166,187,0.16)' : 'transparent',\n borderLeft: isSelected\n ? '2px solid #9aa6bb'\n : '2px solid transparent',\n cursor: 'pointer',\n fontSize: 11.5,\n color: p.label,\n fontFamily: node.kind === 'element' ? MONO_FF : 'inherit',\n fontWeight: isSelected ? 700 : 500,\n lineHeight: 1.4,\n }}\n >\n {expandable ? (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onToggle();\n }}\n aria-label={isOpen ? 'Collapse' : 'Expand'}\n style={{\n background: 'transparent',\n border: 'none',\n color: 'rgba(255,255,255,0.55)',\n fontSize: 9,\n cursor: 'pointer',\n width: 14,\n padding: 0,\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n }}\n >\n {isOpen ? '▼' : '▶'}\n </button>\n ) : (\n <span style={{ width: 14, flexShrink: 0 }} />\n )}\n <TypeChip node={node} />\n <span\n style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n flex: 1,\n minWidth: 0,\n }}\n >\n {rowLabel(node)}\n </span>\n </div>\n );\n}\n\n// Row glyph kind. Components (library + user) get a diamond, artboards a frame,\n// text-authoring elements a \"T\", and everything else (layout wrappers, svg/img)\n// a box.\nexport type RowGlyph = 'component' | 'artboard' | 'text' | 'box';\n\nexport function rowGlyph(node: AncestryNode): RowGlyph {\n if (node.kind === 'artboard') return 'artboard';\n if (node.kind === 'library' || node.kind === 'user') return 'component';\n const dom = node.dom ?? null;\n if (dom instanceof HTMLElement && getDirectText(dom) !== null) return 'text';\n return 'box';\n}\n\n// Display text for a row. Components/artboards keep their resolved name (already\n// data-name-aware). For elements: a text-authoring element is named by its own\n// text content (Figma-style) — that wins even over `data-name`, since the\n// visible text is the most recognizable label. Otherwise fall back to\n// `data-name`, then the capitalized tag (\"Div\"). The angle-bracket `<tag>` form\n// is replaced by the chip glyph, so the text stays clean.\nexport function rowLabel(node: AncestryNode): string {\n if (node.kind !== 'element') return node.name;\n const dom = node.dom ?? null;\n if (dom instanceof HTMLElement) {\n const text = getDirectText(dom);\n if (text) return text.replace(/\\s+/g, ' ').trim(); // CSS ellipsizes long runs\n }\n const dataName = layerLabel(dom);\n if (dataName) return dataName;\n const tag =\n dom?.tagName.toLowerCase() ??\n /^<([a-z0-9-]+)>/i.exec(node.name)?.[1] ??\n 'node';\n return tag.charAt(0).toUpperCase() + tag.slice(1);\n}\n\n// Keycap-style type chip that leads every hierarchy row. The icon is tinted by\n// the row's kind color (via currentColor); library components get a filled\n// diamond to distinguish design-system components from local (user) ones.\nexport function TypeChip({ node }: { node: AncestryNode }) {\n const p = LAYER_PALETTE[node.kind];\n return (\n <kbd\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: 17,\n height: 17,\n flexShrink: 0,\n borderRadius: 4,\n padding: 0,\n background: 'rgba(255,255,255,0.05)',\n border: '1px solid rgba(255,255,255,0.13)',\n boxShadow: 'inset 0 1px 0 rgba(255,255,255,0.07), 0 1px 1px rgba(0,0,0,0.35)',\n color: p.label,\n }}\n >\n <TypeIcon glyph={rowGlyph(node)} filled={node.kind === 'library'} />\n </kbd>\n );\n}\n\nexport function TypeIcon({ glyph, filled }: { glyph: RowGlyph; filled?: boolean }) {\n const common = {\n width: 11,\n height: 11,\n viewBox: '0 0 12 12',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 1.3,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n };\n switch (glyph) {\n case 'component':\n return (\n <svg {...common}>\n <path d=\"M6 1.4 L10.6 6 L6 10.6 L1.4 6 Z\" fill={filled ? 'currentColor' : 'none'} />\n </svg>\n );\n case 'artboard':\n return (\n <svg {...common} strokeWidth={1.1}>\n <path d=\"M4 1.5V10.5M8 1.5V10.5M1.5 4H10.5M1.5 8H10.5\" />\n </svg>\n );\n case 'text':\n return (\n <svg {...common}>\n <path d=\"M3 3.4H9M6 3.4V9\" />\n </svg>\n );\n case 'box':\n default:\n return (\n <svg {...common}>\n <rect x=\"2.2\" y=\"2.2\" width=\"7.6\" height=\"7.6\" rx=\"1.4\" />\n </svg>\n );\n }\n}\n\n// Element-only sections (Text + Attributes). Styles / Effects / className\n// live at the panel level since they apply to any selected DOM node.\n","// Left-of-inspector scan-results pane. Extracted from Inspector.tsx (P3.2).\nimport React, { useRef, useState } from 'react';\nimport { Swatch, MONO_FF, INSPECTOR_LEFT_GAP } from './sections';\nimport type { ScanBucket, ScanKind } from './scan';\n\nexport const SCAN_PANE_MIN_WIDTH = 240;\nexport const SCAN_PANE_MAX_WIDTH = 700;\nexport const SCAN_PANE_DEFAULT_WIDTH = 280;\nexport function ScanResultsPane({\n title,\n results,\n expanded,\n onToggleBucket,\n onPickEl,\n onClose,\n width,\n onWidthChange,\n inspectorWidth,\n}: {\n title: string;\n results: ScanBucket[];\n expanded: Set<string>;\n onToggleBucket: (key: string) => void;\n onPickEl: (el: Element) => void;\n onClose: () => void;\n width: number;\n onWidthChange: (w: number) => void;\n inspectorWidth: number;\n}) {\n const totalIssues = results.reduce((n, b) => n + b.occurrences.length, 0);\n const grouped: Record<ScanKind, ScanBucket[]> = {\n color: results.filter((b) => b.kind === 'color'),\n typography: results.filter((b) => b.kind === 'typography'),\n shadow: results.filter((b) => b.kind === 'shadow'),\n contrast: results.filter((b) => b.kind === 'contrast'),\n };\n\n const dragRef = useRef<{ startX: number; startW: number } | null>(null);\n const [gripHover, setGripHover] = useState(false);\n const onGripDown = (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n (e.target as Element).setPointerCapture?.(e.pointerId);\n dragRef.current = { startX: e.clientX, startW: width };\n document.body.style.userSelect = 'none';\n document.body.style.cursor = 'ew-resize';\n };\n const onGripMove = (e: React.PointerEvent<HTMLDivElement>) => {\n if (!dragRef.current) return;\n // Dragging the grip LEFT (decreasing clientX) widens the pane.\n const dx = dragRef.current.startX - e.clientX;\n const next = Math.min(\n SCAN_PANE_MAX_WIDTH,\n Math.max(SCAN_PANE_MIN_WIDTH, dragRef.current.startW + dx),\n );\n onWidthChange(next);\n };\n const endDrag = (e: React.PointerEvent<HTMLDivElement>) => {\n if (!dragRef.current) return;\n dragRef.current = null;\n document.body.style.userSelect = '';\n document.body.style.cursor = '';\n (e.target as Element).releasePointerCapture?.(e.pointerId);\n };\n const dragging = !!dragRef.current;\n const gripActive = gripHover || dragging;\n\n return (\n <div\n data-inspector-ui\n style={{\n position: 'fixed',\n top: 16,\n right: INSPECTOR_LEFT_GAP + inspectorWidth + INSPECTOR_LEFT_GAP,\n bottom: 16,\n width,\n zIndex: 2000,\n background: '#18191b',\n color: '#f5f1e8',\n borderRadius: 10,\n border: '1px solid rgba(255,255,255,0.12)',\n boxShadow: '0 16px 48px rgba(0,0,0,0.4)',\n display: 'flex',\n flexDirection: 'column',\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif',\n fontSize: 13,\n lineHeight: 1.5,\n overflow: 'hidden',\n }}\n >\n {/* Left-edge drag grip — 6px hot zone with a faint blue line that\n appears on hover/drag so the affordance is discoverable but doesn't\n compete with the panel content at rest. */}\n <div\n onPointerDown={onGripDown}\n onPointerMove={onGripMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n onMouseEnter={() => setGripHover(true)}\n onMouseLeave={() => setGripHover(false)}\n style={{\n position: 'absolute',\n top: 0,\n left: -3,\n bottom: 0,\n width: 6,\n cursor: 'ew-resize',\n zIndex: 1,\n }}\n title=\"Drag to resize\"\n >\n <div\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 2,\n width: 2,\n background: gripActive ? '#9aa6bb' : 'transparent',\n transition: gripActive\n ? 'none'\n : 'background 120ms ease 120ms',\n pointerEvents: 'none',\n }}\n />\n </div>\n\n {/* Header */}\n <div\n style={{\n padding: '12px 14px',\n borderBottom: '1px solid rgba(255,255,255,0.08)',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n }}\n >\n <span\n style={{\n fontSize: 11,\n fontWeight: 600,\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n color: 'rgba(255,255,255,0.7)',\n }}\n >\n {title}\n </span>\n <span style={{ color: 'rgba(255,255,255,0.3)' }}>·</span>\n <span style={{ fontSize: 11.5, color: 'rgba(255,255,255,0.55)' }}>\n {totalIssues} · {results.length} unique\n </span>\n <button\n onClick={onClose}\n style={{\n marginLeft: 'auto',\n background: 'transparent',\n color: 'rgba(255,255,255,0.6)',\n border: 'none',\n cursor: 'pointer',\n fontSize: 18,\n lineHeight: 1,\n padding: 0,\n flexShrink: 0,\n }}\n title=\"Hide the scan results pane\"\n >\n ×\n </button>\n </div>\n\n {/* Body */}\n <div style={{ flex: 1, overflowY: 'auto', padding: '10px 12px' }}>\n {(['color', 'typography', 'shadow', 'contrast'] as ScanKind[]).map((kind) => {\n const list = grouped[kind];\n if (list.length === 0) return null;\n return (\n <ScanKindGroup\n key={kind}\n kind={kind}\n buckets={list}\n expanded={expanded}\n onToggleBucket={onToggleBucket}\n onPickEl={onPickEl}\n />\n );\n })}\n </div>\n </div>\n );\n}\n\nexport const KIND_LABELS: Record<ScanKind, string> = {\n color: 'Color',\n typography: 'Typography',\n shadow: 'Shadow',\n contrast: 'Contrast',\n};\n\nexport function ScanKindGroup({\n kind,\n buckets,\n expanded,\n onToggleBucket,\n onPickEl,\n}: {\n kind: ScanKind;\n buckets: ScanBucket[];\n expanded: Set<string>;\n onToggleBucket: (key: string) => void;\n onPickEl: (el: Element) => void;\n}) {\n const count = buckets.reduce((n, b) => n + b.occurrences.length, 0);\n return (\n <div style={{ marginBottom: 12 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n fontSize: 10.5,\n fontWeight: 600,\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n color: 'rgba(255,255,255,0.45)',\n marginBottom: 4,\n }}\n >\n <span>{KIND_LABELS[kind]}</span>\n <span style={{ color: 'rgba(255,255,255,0.3)' }}>·</span>\n <span style={{ color: 'rgba(255,255,255,0.55)' }}>{count}</span>\n </div>\n <div\n style={{\n border: '1px solid rgba(255,255,255,0.08)',\n borderRadius: 6,\n overflow: 'hidden',\n }}\n >\n {buckets.map((b, i) => {\n const key = `${b.kind}::${b.value}`;\n const isOpen = expanded.has(key);\n return (\n <div\n key={key}\n style={{\n borderTop: i === 0 ? 0 : '1px solid rgba(255,255,255,0.06)',\n }}\n >\n <button\n type=\"button\"\n onClick={() => onToggleBucket(key)}\n style={{\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '6px 10px',\n background: 'transparent',\n border: 0,\n color: '#f5f1e8',\n cursor: 'pointer',\n fontFamily: 'inherit',\n fontSize: 12,\n textAlign: 'left',\n }}\n title={isOpen ? 'Collapse' : 'Expand'}\n >\n <span\n aria-hidden\n style={{\n display: 'inline-block',\n width: 8,\n transform: isOpen ? 'rotate(90deg)' : 'rotate(0deg)',\n transition: 'transform 120ms ease',\n fontSize: 8,\n color: 'rgba(255,255,255,0.5)',\n }}\n >\n ▶\n </span>\n {b.swatch && <Swatch color={b.swatch} />}\n <span\n style={{\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n fontSize: 11.5,\n color: '#f5f1e8',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n flex: 1,\n minWidth: 0,\n }}\n title={b.displayValue}\n >\n {b.displayValue}\n </span>\n <span\n style={{\n fontSize: 11,\n color: 'rgba(255,255,255,0.5)',\n flexShrink: 0,\n }}\n >\n ×{b.occurrences.length}\n </span>\n </button>\n {isOpen && (\n <div\n style={{\n padding: '2px 8px 6px 24px',\n display: 'flex',\n flexDirection: 'column',\n gap: 2,\n }}\n >\n {b.occurrences.map((occ, j) => (\n <button\n key={j}\n type=\"button\"\n onClick={() => onPickEl(occ.el)}\n style={{\n display: 'grid',\n gridTemplateColumns: 'auto auto 1fr',\n gap: 8,\n alignItems: 'baseline',\n padding: '4px 6px',\n background: 'transparent',\n border: 0,\n color: 'rgba(255,255,255,0.78)',\n fontFamily: 'inherit',\n fontSize: 11.5,\n cursor: 'pointer',\n textAlign: 'left',\n borderRadius: 3,\n }}\n onMouseEnter={(e) => {\n (e.currentTarget as HTMLElement).style.background =\n 'rgba(255,255,255,0.05)';\n }}\n onMouseLeave={(e) => {\n (e.currentTarget as HTMLElement).style.background =\n 'transparent';\n }}\n title={`Select ${occ.tag} (${occ.prop}) in ${occ.artboard}`}\n >\n <span\n style={{\n color: 'rgba(255,255,255,0.45)',\n fontSize: 10.5,\n minWidth: 0,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: 90,\n }}\n >\n {occ.artboard}\n </span>\n <span\n style={{\n color: 'rgba(255,255,255,0.55)',\n fontSize: 10.5,\n }}\n >\n {occ.prop}\n </span>\n <span\n style={{\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n color: '#cfe0ff',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n minWidth: 0,\n }}\n >\n {occ.tag}\n </span>\n </button>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n","// Inspector.tsx — click-to-inspect overlay for DesignCanvas artboards.\n//\n// While the Inspect toggle is on:\n// • hover an element inside an artboard → blue outline\n// • click → captures the host DOM node you clicked and opens the side panel\n// • the panel shows ONE selected node at a time. The Hierarchy tree is the\n// primary navigation — click any row to re-select that fiber. The kind of\n// thing you've selected (Element / Library / Component / Artboard) drives\n// which body sections render (Element shows tag + text + attrs; Component\n// and Library show JSX + props + source).\n// • \"↑ parent\" walks one row up the Hierarchy tree.\n//\n// Implementation note: we walk React's internal Fiber tree via the\n// `__reactFiber$…` property React attaches to DOM nodes in dev. This is\n// unofficial API (React DevTools uses the same trick) and only works in\n// development builds — production strips component names.\n//\n// This file imports NO design system. Every design-system touch-point (which\n// fibers are library components, their names, icon detection, token\n// reverse-lookup) is routed through the injected DesignSystemAdapter (see\n// ../adapters). Library instances are detected by *object identity* against the\n// adapter's library exports, not by component name, so a local <Button> won't\n// be misclassified as a library Button.\n\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { ExplodedView } from './ExplodedView';\nimport { XRayView } from './XRayView';\nimport { getAncestorScale } from './getAncestorScale';\nimport { muteClonedMedia } from './muteClonedMedia';\nimport { parseAnchorSource } from './domInspect';\nimport { descendIntoFrame, rectInHost } from './frameInspect';\nimport { getPortalRoot } from './portalRoot';\nimport type { CanvasMode } from './ModeBar';\nimport { BRAND } from '../brand';\nimport { getDesignSystemAdapter, adapterHasTokens } from '../adapters';\n// ── Inspector modules (P3.2 split) ──────────────────────────────────────────\nimport {\n Section,\n Swatch,\n MONO_FF,\n INSPECTOR_MIN_WIDTH,\n INSPECTOR_MAX_WIDTH,\n INSPECTOR_DEFAULT_WIDTH,\n INSPECTOR_LEFT_GAP,\n} from './sections';\nimport {\n buildSelectedFromHost,\n buildSelectedFromFrameEl,\n selectedLabel,\n libraryAwareName,\n formatJSX,\n formatPropValue,\n getDirectText,\n getInterestingAttrs,\n shortenPath,\n} from './fiber';\nimport type { SelectedNode } from './fiber';\nimport {\n isTransparent,\n splitShadows,\n parseShadow,\n lookupShadowToken,\n lookupColorToken,\n resolveTokenColor,\n colorVarFromToken,\n themeScopeHostOf,\n} from './tokens';\nimport type {\n StyleTokens,\n ResolvedStyles,\n ThemeInfo,\n ColorDisplayMode,\n} from './tokens';\nimport {\n parseColor,\n effectiveBackgrounds,\n contrastRatio,\n compositeOver,\n isLargeText,\n rgbaToHex,\n formatRatio,\n extractGradientStops,\n scanArtboardsForViolations,\n scanA11yViolations,\n} from './scan';\nimport type { ScanBucket, ScanMode } from './scan';\nimport { BoxModel } from './BoxModel';\nimport { AssetSection, getAssetInfo } from './AssetSection';\nimport type { AssetInfo } from './AssetSection';\nimport { ComponentTree } from './HierarchyTree';\nimport { ScanResultsPane, SCAN_PANE_DEFAULT_WIDTH } from './ScanPane';\n\nimport type { DCTransform, DCViewportApi } from './viewportApi';\n\n\n// Persistent selection-highlight overlay on the canvas. Owns its own rect\n// state + viewport-transform subscription + scroll/resize listeners — so the\n// per-frame setState during pan/zoom only re-renders this small subtree, NOT\n// the whole Inspector panel + recursive HierarchyTree. Also skips entirely\n// while a canvas viewport is mid-interaction (drag/wheel/gesture); a\n// MutationObserver re-measures the moment the interaction ends so the\n// outline catches up to the post-pan transform.\nfunction SelectedOverlay({\n enabled,\n selected,\n}: {\n enabled: boolean;\n selected: SelectedNode | null;\n}) {\n const [rect, setRect] = useState<DOMRect | null>(null);\n\n useEffect(() => {\n if (!enabled || !selected?.domNode) {\n setRect(null);\n return;\n }\n const el = selected.domNode;\n const vpEl = document.querySelector('[data-dc-viewport]') as\n | (HTMLElement & { __dcViewport?: DCViewportApi })\n | null;\n\n const update = () => {\n // Only the viewport carries data-dc-interacting; check the cached vpEl\n // instead of a document-wide querySelector every subscribe tick (P2.5).\n if (vpEl?.hasAttribute('data-dc-interacting')) return;\n if (!el.isConnected) {\n setRect(null);\n return;\n }\n // Host-space rect: identity for host elements; live-frame selections\n // (in-app canvas mode) map out through the frame element + canvas scale.\n setRect(rectInHost(el));\n };\n update();\n const api = vpEl?.__dcViewport;\n const unsub = api?.subscribe(update);\n window.addEventListener('resize', update);\n window.addEventListener('scroll', update, true);\n\n let mo: MutationObserver | null = null;\n if (vpEl) {\n mo = new MutationObserver(() => {\n if (!vpEl.hasAttribute('data-dc-interacting')) update();\n });\n mo.observe(vpEl, {\n attributes: true,\n attributeFilter: ['data-dc-interacting'],\n });\n }\n\n return () => {\n unsub?.();\n window.removeEventListener('resize', update);\n window.removeEventListener('scroll', update, true);\n mo?.disconnect();\n };\n }, [enabled, selected]);\n\n if (!enabled || !rect) return null;\n return (\n <div\n data-inspector-ui\n style={{\n position: 'fixed',\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n outline: '2px solid #9aa6bb',\n outlineOffset: 0,\n pointerEvents: 'none',\n zIndex: 1998,\n borderRadius: 2,\n }}\n />\n );\n}\n\n// Inspect-mode hover highlight. Isolated in its own subtree (mousemoves fire\n// ~60×/sec, so the rect state doesn't re-render the panel), plus the live-frame\n// descent: a hover over in-app route-frame content arrives retargeted to the\n// tile overlay — resolve the real element under the cursor so the outline draws\n// over IT, not the whole tile.\nfunction InspectHoverOverlay({ enabled }: { enabled: boolean }) {\n const [hoverRect, setHoverRect] = useState<DOMRect | null>(null);\n\n useEffect(() => {\n if (!enabled) {\n setHoverRect(null);\n return;\n }\n // Cache the viewport element once — only it carries data-dc-interacting, so\n // check hasAttribute instead of a document querySelector per mousemove (P2.5).\n const vpEl = document.querySelector('[data-dc-viewport]');\n const onMove = (e: MouseEvent) => {\n if (vpEl?.hasAttribute('data-dc-interacting')) {\n setHoverRect((prev) => (prev ? null : prev));\n return;\n }\n const t = e.target as HTMLElement | null;\n if (\n !t ||\n t.closest('[data-inspector-ui]') ||\n t.closest('[data-cl-ui]') ||\n !t.closest('[data-dc-slot]')\n ) {\n setHoverRect((prev) => (prev ? null : prev));\n return;\n }\n const deep = descendIntoFrame(t, e.clientX, e.clientY)?.el ?? t;\n setHoverRect(rectInHost(deep));\n };\n document.addEventListener('mousemove', onMove, true);\n return () => document.removeEventListener('mousemove', onMove, true);\n }, [enabled]);\n\n if (!enabled || !hoverRect) return null;\n return (\n <div\n data-inspector-ui\n style={{\n position: 'fixed',\n top: hoverRect.top,\n left: hoverRect.left,\n width: hoverRect.width,\n height: hoverRect.height,\n border: '2px solid #9aa6bb',\n background: '#9aa6bb14', // ~8% alpha\n pointerEvents: 'none',\n zIndex: 1999,\n borderRadius: 2,\n }}\n />\n );\n}\n\nexport function Inspector({\n mode,\n setMode,\n}: {\n mode: CanvasMode;\n setMode: (m: CanvasMode) => void;\n}) {\n // Dev mode owns the inspector; the bottom-left ModeBar drives it now (no\n // local toggle). Leaving the mode clears any held selection.\n const enabled = mode === 'dev';\n const [selected, setSelected] = useState<SelectedNode | null>(null);\n useEffect(() => {\n if (mode !== 'dev') setSelected(null);\n }, [mode]);\n // User-resizable inspector width. Lifted to the top so panToElement,\n // ExplodedView, XRayView, and ScanResultsPane all see the same value.\n const [inspectorWidth, setInspectorWidth] = useState<number>(\n INSPECTOR_DEFAULT_WIDTH,\n );\n const inspectorWidthRef = useRef(inspectorWidth);\n inspectorWidthRef.current = inspectorWidth;\n const enabledRef = useRef(enabled);\n enabledRef.current = enabled;\n const selectedRef = useRef(selected);\n selectedRef.current = selected;\n\n // While enabled, attach capture-phase listeners so we win over the\n // artboard contents' own click handlers.\n useEffect(() => {\n if (!enabled) return;\n\n // Track where the press started so a pan (drag) on empty canvas isn't\n // treated as a click that clears the selection. A genuine click moves\n // less than the threshold between pointerdown and the click event.\n let downX = 0;\n let downY = 0;\n const DRAG_SLOP = 5;\n const onDown = (e: PointerEvent) => {\n downX = e.clientX;\n downY = e.clientY;\n };\n\n const onClick = (e: MouseEvent) => {\n const t = e.target as HTMLElement | null;\n if (!t) return;\n // Allow clicks on the inspector UI itself, and let quilt's own comment-\n // layer chrome (tile chips, exit buttons — [data-cl-ui]) keep working\n // instead of being selected as if it were part of the design.\n if (t.closest('[data-inspector-ui]') || t.closest('[data-cl-ui]')) return;\n const inArtboard = t.closest('[data-dc-slot]');\n if (!inArtboard) {\n // Click on empty canvas (not a drag/pan) clears the current selection.\n const moved =\n Math.abs(e.clientX - downX) > DRAG_SLOP ||\n Math.abs(e.clientY - downY) > DRAG_SLOP;\n if (!moved) setSelected(null);\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n // Live-frame descent (in-app canvas mode): the click landed on a route\n // tile's transparent overlay — resolve the element inside the same-\n // origin frame. The frame runs the customer's REAL app, so the element\n // carries real fibers → the full fiber inspector. A non-React frame\n // (static prototype) falls back to DOM mode, same honesty as snapshots.\n const framed = descendIntoFrame(t, e.clientX, e.clientY);\n if (framed) {\n const nextFramed =\n buildSelectedFromHost(framed.el) ?? buildSelectedFromFrameEl(framed.el);\n if (nextFramed) setSelected(nextFramed);\n return;\n }\n const next = buildSelectedFromHost(t);\n if (next) setSelected(next);\n };\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setMode('cursor');\n setSelected(null);\n }\n };\n\n document.addEventListener('pointerdown', onDown, true);\n document.addEventListener('click', onClick, true);\n document.addEventListener('keydown', onKey);\n document.body.style.cursor = 'crosshair';\n return () => {\n document.removeEventListener('pointerdown', onDown, true);\n document.removeEventListener('click', onClick, true);\n document.removeEventListener('keydown', onKey);\n document.body.style.cursor = '';\n };\n }, [enabled]);\n\n // HMR-survivable selection. On a JSX edit, Vite/React Fast Refresh rebuilds\n // the artboard subtree — the held `selected.domNode` detaches (overlay reads\n // a zero rect → highlight vanishes) and `selected.fiber` goes stale. After\n // each HMR apply, re-resolve the selection by its source-location `data-anchor`\n // (scoped to its original artboard) and rebuild it against the fresh DOM/fiber.\n // Dev-only: `import.meta.hot` is undefined in production builds.\n useEffect(() => {\n // Minimal structural type for Vite's HMR context — avoids depending on\n // `vite/client` types being wired into the shared tsconfig.\n type HotCtx = {\n on(event: string, cb: () => void): void;\n off?(event: string, cb: () => void): void;\n };\n const hot = (import.meta as unknown as { hot?: HotCtx }).hot;\n if (!hot) return;\n\n let raf = 0;\n let tries = 0;\n const MAX_TRIES = 12; // ~12 frames ≈ 200ms — covers Fast Refresh's async re-render\n\n const reResolve = () => {\n const prev = selectedRef.current;\n // Nothing selected, or a target the plugin never stamped → can't recover.\n if (!prev || !prev.anchor) return;\n\n const scope: ParentNode = prev.artboardSlot\n ? document.querySelector(`[data-dc-slot=\"${CSS.escape(prev.artboardSlot)}\"]`) ?? document\n : document;\n\n const next = scope.querySelector(`[data-anchor=\"${CSS.escape(prev.anchor)}\"]`);\n\n if (next instanceof HTMLElement) {\n // Re-resolving from the host reproduces the original selection logic\n // (component-root promotion included). Caveat: a tree-row selection of\n // a component whose host isn't its render-root may re-promote to a\n // different fiber — acceptable; the anchor lives on the host.\n const rebuilt = buildSelectedFromHost(next);\n if (rebuilt) setSelected(rebuilt);\n return;\n }\n // New DOM not painted yet (or element removed by the edit) — retry a few\n // frames, then give up and leave the stale selection in place.\n if (tries++ < MAX_TRIES) raf = requestAnimationFrame(reResolve);\n };\n\n const onUpdate = () => {\n tries = 0;\n cancelAnimationFrame(raf);\n raf = requestAnimationFrame(reResolve);\n };\n\n hot.on('vite:afterUpdate', onUpdate);\n return () => {\n hot.off?.('vite:afterUpdate', onUpdate);\n cancelAnimationFrame(raf);\n };\n }, []);\n\n // Pan/zoom the canvas so the given element is brought into a comfortable\n // viewing area (centered in the region left of the Inspector panel). Used\n // by the Scan-results click flow — canvas/explode/x-ray picks don't need\n // this because the user already had their cursor on the element.\n const panToElement = useCallback((el: Element) => {\n const vpEl = document.querySelector('[data-dc-viewport]') as\n | (HTMLElement & { __dcViewport?: DCViewportApi })\n | null;\n const api = vpEl?.__dcViewport;\n if (!vpEl || !api) return;\n const vpRect = vpEl.getBoundingClientRect();\n const tf = api.getTransform();\n const r = rectInHost(el); // host-space; identity outside live frames\n if (r.width === 0 && r.height === 0) return;\n\n // Decide target scale: only adjust if the element is uncomfortably small\n // or large at the current zoom. The 60→400px band covers most useful\n // sizes; outside that we ease toward a comfortable rendered ~150px.\n const screenMax = Math.max(r.width, r.height);\n let newScale = tf.scale;\n if (screenMax < 60) {\n newScale = tf.scale * (150 / screenMax);\n } else if (screenMax > 600) {\n newScale = tf.scale * (400 / screenMax);\n }\n // viewport clamp happens inside animateTransform; soft-clamp here too so\n // the centering math uses the actual scale that'll be applied.\n newScale = Math.min(4, Math.max(0.15, newScale));\n\n // Target on-screen position: center of the region left of the inspector\n // panel. Inspector is fixed at right:INSPECTOR_LEFT_GAP with live width\n // `inspectorWidthRef.current` → its left edge sits at\n // `vpRect.right - INSPECTOR_LEFT_GAP - inspectorWidth`. Read via ref so\n // back-to-back pans pick up width changes without re-creating the\n // callback (it's only set once at mount via useCallback).\n const PANEL_W = inspectorWidthRef.current;\n const PANEL_GAP = INSPECTOR_LEFT_GAP;\n const leftRegionRight = vpRect.right - PANEL_GAP - PANEL_W - 16;\n const targetScreenX = (vpRect.left + leftRegionRight) / 2;\n const targetScreenY = vpRect.top + vpRect.height / 2;\n\n // World coords of the element's center under the current transform.\n const worldCx = (r.left + r.width / 2 - vpRect.left - tf.x) / tf.scale;\n const worldCy = (r.top + r.height / 2 - vpRect.top - tf.y) / tf.scale;\n\n // New transform that places that world point under the target screen pt.\n const newX = targetScreenX - vpRect.left - worldCx * newScale;\n const newY = targetScreenY - vpRect.top - worldCy * newScale;\n\n api.animateTransform({ x: newX, y: newY, scale: newScale }, 260);\n }, []);\n\n return createPortal(\n <>\n {/* Persistent selection highlight — owns its own state + subscription\n so per-frame pan/zoom rect updates don't cascade re-renders into\n the heavy InspectorPanel. Sits underneath the hover overlay so a\n mid-pan hover preview wins visually. */}\n <SelectedOverlay enabled={enabled} selected={selected} />\n\n {/* Hover highlight — owns its own mousemove + state so the panel\n doesn't re-render on every pixel of cursor movement. Local variant\n of CommentLayer's HoverOverlay that additionally descends into\n frozen-snapshot shadow roots so the highlight hugs the real element\n under the cursor instead of the whole tile. */}\n <InspectHoverOverlay enabled={enabled} />\n\n {/* Toggle lives in the bottom-left ModeBar now (Dev mode). */}\n\n {/* Side panel — visible whenever the inspector is on, even with no\n selection yet (empty-state hides per-element bands and exposes\n the global Scan section). */}\n {enabled && (\n <InspectorPanel\n selected={selected}\n onClose={() => {\n setMode('cursor');\n setSelected(null);\n }}\n onJumpTo={setSelected}\n onPanToElement={panToElement}\n width={inspectorWidth}\n onWidthChange={setInspectorWidth}\n />\n )}\n </>,\n getPortalRoot(),\n );\n}\n\nfunction InspectorPanel({\n selected,\n onClose,\n onJumpTo,\n onPanToElement,\n width,\n onWidthChange,\n}: {\n selected: SelectedNode | null;\n onClose: () => void;\n onJumpTo: (next: SelectedNode) => void;\n onPanToElement: (el: Element) => void;\n width: number;\n onWidthChange: (w: number) => void;\n}) {\n // Track copy feedback per source so each button gets its own ✓ pulse.\n const [copiedKey, setCopiedKey] = useState<string | null>(null);\n // Only one visualization pane open at a time — they'd overlap in the same\n // slot to the left of the Inspector.\n const [activePane, setActivePane] = useState<'explode' | 'xray' | null>(null);\n // Persists across selections so picking a new element keeps the chosen\n // color display form (Tok / Hex / Var).\n // Default to the token form only when a DS is connected; otherwise Hex (raw).\n const [colorMode, setColorMode] = useState<ColorDisplayMode>(() =>\n adapterHasTokens() ? 'token' : 'value',\n );\n // Same idea for box-model diagram labels (Tok / Px). Default token so the\n // handoff-shaped values come first; falls back to px per-label when no\n // Spring token matches.\n // Spacing/radius: token labels need a DS; without one, default to raw px.\n const [boxModelMode, setBoxModelMode] = useState<'token' | 'px'>(() =>\n adapterHasTokens() ? 'token' : 'px',\n );\n // Hierarchy section is user-resizable via a drag-handle at its bottom.\n // Persists across selections so it doesn't reset when jumping rows.\n const [treeHeight, setTreeHeight] = useState<number>(280);\n\n // Scan state — two independent sets (Spring adherence vs Accessibility).\n // Each section owns its own results + scanning + expanded set; both share\n // the side pane via `paneMode`, which says which set the pane is currently\n // showing (null = pane closed). Pane width persists across modes.\n const [tokenResults, setTokenResults] = useState<ScanBucket[] | null>(null);\n const [tokenScanning, setTokenScanning] = useState(false);\n const [tokenExpanded, setTokenExpanded] = useState<Set<string>>(new Set());\n // Scope label the last results were produced with (null = whole canvas).\n // Stored per set so the header/pane can report what was scanned.\n const [tokenScopeLabel, setTokenScopeLabel] = useState<string | null>(null);\n const [a11yResults, setA11yResults] = useState<ScanBucket[] | null>(null);\n const [a11yScanning, setA11yScanning] = useState(false);\n const [a11yExpanded, setA11yExpanded] = useState<Set<string>>(new Set());\n const [a11yScopeLabel, setA11yScopeLabel] = useState<string | null>(null);\n const [paneMode, setPaneMode] = useState<'tokens' | 'a11y' | null>(null);\n const [scanPaneWidth, setScanPaneWidth] = useState<number>(\n SCAN_PANE_DEFAULT_WIDTH,\n );\n\n // Two-RAF gate so the \"Scanning…\" label paints before we block the main\n // thread with the synchronous walk. Typical scans complete in <100ms;\n // worst-case (hundreds of layers across many artboards) ~300ms.\n const runTokenScan = useCallback(\n (scope?: Element | null, scopeLabel?: string | null) => {\n setTokenScanning(true);\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n try {\n const buckets = scanArtboardsForViolations(scope ?? null);\n setTokenResults(buckets);\n setTokenScopeLabel(scope ? scopeLabel ?? 'selection' : null);\n setTokenExpanded(\n buckets.length === 1\n ? new Set([`${buckets[0].kind}::${buckets[0].value}`])\n : new Set(),\n );\n if (buckets.length > 0) setPaneMode('tokens');\n } finally {\n setTokenScanning(false);\n }\n });\n });\n },\n [],\n );\n\n const runA11yScan = useCallback(\n (scope?: Element | null, scopeLabel?: string | null) => {\n setA11yScanning(true);\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n try {\n const buckets = scanA11yViolations(scope ?? null);\n setA11yResults(buckets);\n setA11yScopeLabel(scope ? scopeLabel ?? 'selection' : null);\n setA11yExpanded(\n buckets.length === 1\n ? new Set([`${buckets[0].kind}::${buckets[0].value}`])\n : new Set(),\n );\n if (buckets.length > 0) setPaneMode('a11y');\n } finally {\n setA11yScanning(false);\n }\n });\n });\n },\n [],\n );\n\n // Current selection, exposed to the scan sections as the scope to confine to.\n // The DOM host is the walk root; the label names it in the scope chip/results.\n const scanScopeEl = selected?.domNode ?? null;\n const scanScopeLabel = selected ? selectedLabel(selected) : null;\n\n const toggleTokenBucket = useCallback((key: string) => {\n setTokenExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n }, []);\n const toggleA11yBucket = useCallback((key: string) => {\n setA11yExpanded((prev) => {\n const next = new Set(prev);\n if (next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n }, []);\n\n // Stable callback for ExplodedView/X-ray so their build effects don't re-run\n // on every parent render. Walks up the DOM if the immediate clicked element\n // has no fiber (Spring portals can render escape hatches that don't carry a\n // React fiber on every leaf node).\n const pickHost = useCallback(\n (host: Element) => {\n let cur: Element | null = host;\n while (cur) {\n const next = buildSelectedFromHost(cur);\n if (next) {\n onJumpTo(next);\n return;\n }\n cur = cur.parentElement;\n }\n },\n [onJumpTo],\n );\n\n // Scan-results click: pan/zoom the canvas so the element is brought into\n // view, then select it. Canvas/explode/x-ray clicks keep using bare\n // pickHost since the user's cursor already says \"here\".\n const pickAndPan = useCallback(\n (host: Element) => {\n onPanToElement(host);\n pickHost(host);\n },\n [pickHost, onPanToElement],\n );\n\n const copy = useCallback((text: string, key: string) => {\n navigator.clipboard?.writeText(text).then(() => {\n setCopiedKey(key);\n setTimeout(() => setCopiedKey(null), 1200);\n });\n }, []);\n\n const domNode = selected?.domNode ?? null;\n\n // Left-edge resize grip — mirrors the ScanResultsPane grip pattern. Drag\n // LEFT (decreasing clientX) widens the inspector; right edge is anchored\n // at INSPECTOR_LEFT_GAP so the panel grows toward the canvas.\n const gripDragRef = useRef<{ startX: number; startW: number } | null>(null);\n const [gripHover, setGripHover] = useState(false);\n const onGripDown = (e: React.PointerEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n (e.target as Element).setPointerCapture?.(e.pointerId);\n gripDragRef.current = { startX: e.clientX, startW: width };\n document.body.style.userSelect = 'none';\n document.body.style.cursor = 'ew-resize';\n };\n const onGripMove = (e: React.PointerEvent<HTMLDivElement>) => {\n if (!gripDragRef.current) return;\n const dx = gripDragRef.current.startX - e.clientX;\n const next = Math.min(\n INSPECTOR_MAX_WIDTH,\n Math.max(INSPECTOR_MIN_WIDTH, gripDragRef.current.startW + dx),\n );\n onWidthChange(next);\n };\n const endGripDrag = (e: React.PointerEvent<HTMLDivElement>) => {\n if (!gripDragRef.current) return;\n gripDragRef.current = null;\n document.body.style.userSelect = '';\n document.body.style.cursor = '';\n (e.target as Element).releasePointerCapture?.(e.pointerId);\n };\n const gripDragging = !!gripDragRef.current;\n const gripActive = gripHover || gripDragging;\n\n // X-ray / Explode are fiber-and-clone based (cloned snapshot DOM would lose\n // its shadow-scoped CSS and pick-back resolves through fibers) — hard-gate\n // them off for DOM-mode selections rather than letting them half-work. The\n // preview buttons are disabled with an explanation (see ElementPreview).\n // Live-frame selections (in-app canvas mode) are gated too even when fibers\n // exist: both panes clone whole artboard subtrees into HOST-document panes,\n // and a cross-document clone of a running app is exactly the half-working\n // state this gate exists to prevent. Honest backlog, not a silent maybe.\n const panesAvailable =\n !selected?.domMode && !(selected && selected.domNode.ownerDocument !== document);\n\n // The token-adherence scan compares computed values against the connected\n // design system's token vocabulary — meaningless with no DS, so it's hidden\n // until an adapter brings tokens. The Accessibility (contrast) scan is pure\n // WCAG math and always shows. See docs/design-system-scans-plan.md.\n const hasTokens = adapterHasTokens();\n const dsLabel = getDesignSystemAdapter().libraryLabel;\n\n return (\n <>\n {activePane === 'explode' && domNode && panesAvailable && (\n <ExplodedView\n node={domNode}\n onPickHost={pickHost}\n onClose={() => setActivePane(null)}\n inspectorWidth={width}\n />\n )}\n {activePane === 'xray' && domNode && panesAvailable && (\n <XRayView\n node={domNode}\n onPickHost={pickHost}\n onClose={() => setActivePane(null)}\n inspectorWidth={width}\n />\n )}\n {hasTokens && paneMode === 'tokens' && tokenResults !== null && tokenResults.length > 0 && (\n <ScanResultsPane\n title={tokenScopeLabel ? `${dsLabel} adherence · ${tokenScopeLabel}` : `${dsLabel} adherence`}\n results={tokenResults}\n expanded={tokenExpanded}\n onToggleBucket={toggleTokenBucket}\n onPickEl={pickAndPan}\n onClose={() => setPaneMode(null)}\n width={scanPaneWidth}\n onWidthChange={setScanPaneWidth}\n inspectorWidth={width}\n />\n )}\n {paneMode === 'a11y' && a11yResults !== null && a11yResults.length > 0 && (\n <ScanResultsPane\n title={a11yScopeLabel ? `Accessibility · ${a11yScopeLabel}` : 'Accessibility'}\n results={a11yResults}\n expanded={a11yExpanded}\n onToggleBucket={toggleA11yBucket}\n onPickEl={pickAndPan}\n onClose={() => setPaneMode(null)}\n width={scanPaneWidth}\n onWidthChange={setScanPaneWidth}\n inspectorWidth={width}\n />\n )}\n <div\n data-inspector-ui\n style={{\n position: 'fixed',\n top: 16,\n right: INSPECTOR_LEFT_GAP,\n bottom: 16,\n width,\n zIndex: 2000,\n background: '#18191b',\n color: '#f5f1e8',\n borderRadius: 10,\n border: '1px solid rgba(255,255,255,0.12)',\n boxShadow: '0 16px 48px rgba(0,0,0,0.4)',\n display: 'flex',\n flexDirection: 'column',\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif',\n fontSize: 13,\n lineHeight: 1.5,\n overflow: 'hidden',\n }}\n >\n {/* Left-edge drag grip — 6px hot zone with a faint blue line that\n fades in on hover/drag. Matches the ScanResultsPane grip so the\n two stack visually consistent. */}\n <div\n onPointerDown={onGripDown}\n onPointerMove={onGripMove}\n onPointerUp={endGripDrag}\n onPointerCancel={endGripDrag}\n onMouseEnter={() => setGripHover(true)}\n onMouseLeave={() => setGripHover(false)}\n style={{\n position: 'absolute',\n top: 0,\n left: -3,\n bottom: 0,\n width: 6,\n cursor: 'ew-resize',\n zIndex: 1,\n }}\n title=\"Drag to resize\"\n >\n <div\n style={{\n position: 'absolute',\n top: 0,\n bottom: 0,\n left: 2,\n width: 2,\n background: gripActive ? '#9aa6bb' : 'transparent',\n transition: gripActive\n ? 'none'\n : 'background 120ms ease 120ms',\n pointerEvents: 'none',\n }}\n />\n </div>\n {/* Header */}\n <div\n style={{\n padding: '12px 16px',\n borderBottom: '1px solid rgba(255,255,255,0.08)',\n display: 'flex',\n alignItems: 'center',\n gap: 10,\n minWidth: 0,\n }}\n >\n <span\n style={{\n fontSize: 16,\n fontWeight: 600,\n color: '#fff',\n letterSpacing: -0.2,\n flexShrink: 0,\n }}\n >\n {BRAND.name}\n </span>\n <span\n title={BRAND.tagTitle}\n style={{\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: 0.4,\n textTransform: 'uppercase',\n color: '#cfe0ff',\n background: 'rgba(154,166,187,0.18)',\n border: '1px solid rgba(154,166,187,0.45)',\n padding: '1px 6px',\n borderRadius: 999,\n lineHeight: 1.4,\n flexShrink: 0,\n }}\n >\n {BRAND.tag}\n </span>\n <span\n style={{\n marginLeft: 'auto',\n fontSize: 11,\n color: 'rgba(255,255,255,0.45)',\n fontStyle: 'italic',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n minWidth: 0,\n }}\n >\n {BRAND.credit}\n </span>\n <button\n onClick={onClose}\n style={{\n background: 'transparent',\n color: 'rgba(255,255,255,0.6)',\n border: 'none',\n cursor: 'pointer',\n fontSize: 22,\n lineHeight: 1,\n padding: 0,\n flexShrink: 0,\n }}\n title=\"Close (Esc to exit inspector)\"\n >\n ×\n </button>\n </div>\n\n {/* Body */}\n <div style={{ flex: 1, overflowY: 'auto', padding: '12px 16px' }}>\n {selected ? (\n <SelectedElementBody\n selected={selected}\n onJumpTo={onJumpTo}\n activePane={activePane}\n setActivePane={setActivePane}\n copy={copy}\n copiedKey={copiedKey}\n treeHeight={treeHeight}\n setTreeHeight={setTreeHeight}\n boxModelMode={boxModelMode}\n setBoxModelMode={setBoxModelMode}\n colorMode={colorMode}\n setColorMode={setColorMode}\n />\n ) : (\n <EmptySelectionMessage />\n )}\n\n {hasTokens && (\n <ScanSection\n mode=\"tokens\"\n title={`${dsLabel} adherence`}\n emptyHint={`Press Scan to find computed colors, typography, and shadows that don't reverse-lookup to any ${dsLabel} token. Select an element first to scope the scan to it.`}\n okHint=\"No off-token values found.\"\n results={tokenResults}\n scanning={tokenScanning}\n paneOpen={paneMode === 'tokens'}\n scopeEl={scanScopeEl}\n scopeLabel={scanScopeLabel}\n resultScopeLabel={tokenScopeLabel}\n onRunScan={runTokenScan}\n onTogglePane={() =>\n setPaneMode((p) => (p === 'tokens' ? null : 'tokens'))\n }\n />\n )}\n\n <ScanSection\n mode=\"a11y\"\n title=\"Accessibility\"\n emptyHint=\"Press Scan to find text whose contrast against its painted background falls below WCAG AA. Select an element first to scope the scan to it.\"\n okHint=\"No contrast failures found.\"\n results={a11yResults}\n scanning={a11yScanning}\n paneOpen={paneMode === 'a11y'}\n scopeEl={scanScopeEl}\n scopeLabel={scanScopeLabel}\n resultScopeLabel={a11yScopeLabel}\n onRunScan={runA11yScan}\n onTogglePane={() =>\n setPaneMode((p) => (p === 'a11y' ? null : 'a11y'))\n }\n />\n </div>\n </div>\n </>\n );\n}\n\nfunction EmptySelectionMessage() {\n return (\n <div\n style={{\n padding: '32px 16px',\n marginBottom: 16,\n textAlign: 'center',\n color: 'rgba(255,255,255,0.55)',\n fontSize: 13,\n lineHeight: 1.55,\n border: '1px dashed rgba(255,255,255,0.12)',\n borderRadius: 8,\n background: 'rgba(255,255,255,0.02)',\n }}\n >\n <div\n aria-hidden\n style={{\n fontSize: 24,\n marginBottom: 8,\n color: 'rgba(255,255,255,0.35)',\n }}\n >\n ⌖\n </div>\n Click an element in an artboard to see its details.\n <div style={{ marginTop: 8, fontSize: 11.5, color: 'rgba(255,255,255,0.4)' }}>\n Or run a canvas-wide scan below.\n </div>\n </div>\n );\n}\n\nfunction SelectedElementBody({\n selected,\n onJumpTo,\n activePane,\n setActivePane,\n copy,\n copiedKey,\n treeHeight,\n setTreeHeight,\n boxModelMode,\n setBoxModelMode,\n colorMode,\n setColorMode,\n}: {\n selected: SelectedNode;\n onJumpTo: (next: SelectedNode) => void;\n activePane: 'explode' | 'xray' | null;\n setActivePane: React.Dispatch<React.SetStateAction<'explode' | 'xray' | null>>;\n copy: (text: string, key: string) => void;\n copiedKey: string | null;\n treeHeight: number;\n setTreeHeight: (n: number) => void;\n boxModelMode: 'token' | 'px';\n setBoxModelMode: (m: 'token' | 'px') => void;\n colorMode: ColorDisplayMode;\n setColorMode: (m: ColorDisplayMode) => void;\n}) {\n const { fiber, kind, domNode, anchor, domMode } = selected;\n const isHost = kind === 'element' || kind === 'artboard';\n const componentName =\n isHost || !fiber ? null : libraryAwareName(fiber.type) ?? 'unknown';\n const props = fiber?.memoizedProps ?? {};\n const className =\n typeof props.className === 'string'\n ? props.className\n : typeof domNode.className === 'string'\n ? domNode.className\n : null;\n const source = fiber?._debugSource\n ? {\n fileName: fiber._debugSource.fileName,\n lineNumber: fiber._debugSource.lineNumber,\n }\n : null;\n const jsx = !isHost && componentName ? formatJSX(componentName, props) : null;\n const propEntries = !isHost\n ? Object.entries(props).filter(\n ([k]) => k !== 'children' && k !== 'key' && k !== 'ref',\n )\n : [];\n\n // Asset detection. Try the selected node directly; if it's a Spring Icon\n // wrapper span (or any element whose only meaningful descendant is a single\n // svg/img/video/audio) the asset is \"really\" the inner element. The descend\n // path is intentionally narrow — we don't want every container with an\n // <img> deep inside it to surface an Image section.\n let assetInfo = getAssetInfo(domNode);\n if (!assetInfo && (kind === 'library' || kind === 'user')) {\n const inner =\n domNode.querySelector(':scope > svg, :scope > img, :scope > video, :scope > audio') ||\n domNode.querySelector('svg, img, video, audio');\n if (inner) assetInfo = getAssetInfo(inner as HTMLElement | SVGElement);\n }\n\n const inLiveFrame = domNode.ownerDocument !== document;\n\n return (\n <>\n {domMode && <DomModeBadge liveFrame={inLiveFrame} />}\n\n <ElementPreview\n node={domNode}\n activePane={activePane}\n onTogglePane={(p) => setActivePane((cur) => (cur === p ? null : p))}\n panesDisabled={domMode || inLiveFrame}\n />\n\n <ComponentTree\n selected={selected}\n onJumpTo={onJumpTo}\n height={treeHeight}\n onHeightChange={setTreeHeight}\n />\n\n {/* DOM-mode source pointer — the build-time `data-anchor` stamp survives\n capture + sanitization, so even a frozen snapshot points devs at the\n exact source line that rendered the element. */}\n {domMode && anchor && (\n <DomSourceSection anchor={anchor} copy={copy} copiedKey={copiedKey} />\n )}\n\n <BoxModel\n node={domNode}\n mode={boxModelMode}\n onModeChange={setBoxModelMode}\n onCopy={(t) => copy(t, `tok:${t}`)}\n copiedKey={copiedKey}\n />\n\n {assetInfo && (\n <AssetSection info={assetInfo} copy={copy} copiedKey={copiedKey} />\n )}\n\n {isHost && (\n <ElementBodySections\n domNode={domNode}\n copy={copy}\n copiedKey={copiedKey}\n />\n )}\n\n <StylesSection\n tokens={selected.tokens}\n resolved={selected.resolved}\n onCopy={(t) => copy(t, `tok:${t}`)}\n copiedKey={copiedKey}\n colorMode={colorMode}\n onColorModeChange={setColorMode}\n />\n\n {getDirectText(domNode) !== null && (\n <AccessibilitySection\n node={domNode}\n onCopy={(t) => copy(t, `tok:${t}`)}\n copiedKey={copiedKey}\n />\n )}\n\n <EffectsSection\n node={domNode}\n onCopy={(t) => copy(t, `tok:${t}`)}\n copiedKey={copiedKey}\n />\n\n {/* Web-React-specific bands. Grouped + collapsed by default so the\n inspector reads as platform-agnostic for native / cross-stack\n handoff. JSX is the React component call, className is Tailwind\n utilities, Props is the React-typed prop bag — all directly\n useful to web Spring teams, mostly noise to anyone else. */}\n {(source || jsx || className || (!isHost && propEntries.length > 0)) && (\n <CollapsibleGroup\n title=\"Web dev\"\n subtitle={\n domMode\n ? 'from the captured DOM'\n : `React · Tailwind${adapterHasTokens() ? ` · ${getDesignSystemAdapter().libraryLabel}` : ''}`\n }\n >\n {source && (\n <Section title=\"Source\">\n <a\n href={`vscode://file/${source.fileName}:${source.lineNumber}`}\n style={{\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n fontSize: 12,\n color: '#9bb9ff',\n wordBreak: 'break-all',\n textDecoration: 'none',\n borderBottom: '1px dashed rgba(155,185,255,0.35)',\n }}\n title=\"Open in VS Code\"\n >\n {shortenPath(source.fileName)}:{source.lineNumber}\n </a>\n </Section>\n )}\n\n {!isHost && jsx && componentName && (\n <Section\n title=\"JSX\"\n action={\n <button\n onClick={() => copy(jsx, 'jsx')}\n style={btnStyle}\n title=\"Copy JSX\"\n >\n {copiedKey === 'jsx' ? '✓ copied' : 'copy'}\n </button>\n }\n >\n <pre\n style={{\n margin: 0,\n padding: '10px 12px',\n background: 'rgba(0,0,0,0.35)',\n borderRadius: 6,\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n fontSize: 12,\n lineHeight: 1.5,\n color: '#f5f1e8',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n }}\n >\n {jsx}\n </pre>\n </Section>\n )}\n\n {className && (\n <Section\n title=\"className\"\n action={\n <button\n onClick={() => copy(className, 'cls')}\n style={btnStyle}\n title=\"Copy className\"\n >\n {copiedKey === 'cls' ? '✓ copied' : 'copy'}\n </button>\n }\n >\n <div\n style={{\n padding: '8px 12px',\n background: 'rgba(0,0,0,0.35)',\n borderRadius: 6,\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n fontSize: 11.5,\n lineHeight: 1.6,\n color: '#f5f1e8',\n wordBreak: 'break-word',\n whiteSpace: 'pre-wrap',\n }}\n >\n {className.split(/\\s+/).filter(Boolean).join(' ')}\n </div>\n </Section>\n )}\n\n {!isHost && propEntries.length > 0 && (\n <Section title=\"Props\">\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\n {propEntries.map(([k, v]) => (\n <div\n key={k}\n style={{\n display: 'grid',\n gridTemplateColumns: '110px 1fr',\n gap: 8,\n alignItems: 'baseline',\n fontSize: 12,\n padding: '4px 0',\n borderBottom: '1px solid rgba(255,255,255,0.06)',\n }}\n >\n <span style={{ color: 'rgba(255,255,255,0.55)' }}>{k}</span>\n <span\n style={{\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n color: '#f5f1e8',\n wordBreak: 'break-word',\n }}\n >\n {formatPropValue(v).replace(/^\\{|\\}$/g, '') || 'true'}\n </span>\n </div>\n ))}\n </div>\n </Section>\n )}\n </CollapsibleGroup>\n )}\n\n {/* Misc — low-priority metadata. Currently the data-anchor source stamp\n (build-time plugin): the durable join key for CommentLayer pins +\n Inspector re-selection, surfaced here mainly for verification. */}\n <CollapsibleGroup title=\"Misc\">\n <Section\n title=\"Anchor (data-anchor)\"\n action={\n anchor ? (\n <button\n onClick={() => copy(anchor, 'anchor')}\n style={btnStyle}\n title=\"Copy data-anchor\"\n >\n {copiedKey === 'anchor' ? '✓ copied' : 'copy'}\n </button>\n ) : undefined\n }\n >\n {anchor ? (\n <div\n style={{\n padding: '8px 12px',\n background: 'rgba(0,0,0,0.35)',\n borderRadius: 6,\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n fontSize: 12,\n color: '#8ee6c0',\n wordBreak: 'break-all',\n }}\n >\n {anchor}\n </div>\n ) : (\n <div\n style={{\n padding: '8px 12px',\n fontSize: 11.5,\n lineHeight: 1.5,\n color: 'rgba(255,255,255,0.45)',\n }}\n >\n Not anchored — this host is rendered by a library (e.g. a Spring\n component's internal element), so the build-time plugin didn't\n stamp it. Select a project-authored element to see its anchor.\n </div>\n )}\n </Section>\n </CollapsibleGroup>\n </>\n );\n}\n\n// Honest-labeling badge for DOM mode (frozen snapshots, or a live route frame\n// whose app isn't React). Keeps anyone from mistaking the panel for the live\n// React view — component names, JSX and props are legitimately unavailable.\nfunction DomModeBadge({ liveFrame = false }: { liveFrame?: boolean }) {\n return (\n <div\n style={{\n display: 'flex',\n alignItems: 'baseline',\n gap: 8,\n padding: '7px 10px',\n marginBottom: 14,\n borderRadius: 6,\n background: 'rgba(142,230,192,0.08)',\n border: '1px solid rgba(142,230,192,0.3)',\n fontSize: 11,\n lineHeight: 1.45,\n }}\n >\n <span\n style={{\n flexShrink: 0,\n fontSize: 9.5,\n fontWeight: 700,\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n color: '#8ee6c0',\n whiteSpace: 'nowrap',\n }}\n >\n DOM view\n </span>\n <span style={{ color: 'rgba(255,255,255,0.55)' }}>\n {liveFrame\n ? 'Live page without React fibers — measurements & styles read from the real DOM. Component names, props and JSX aren’t available here.'\n : 'Frozen snapshot — measurements & styles read from the captured DOM. React components, props and JSX aren’t available here.'}\n </span>\n </div>\n );\n}\n\n// DOM-mode source pointer: the `data-anchor` stamp (\"path:line:col\") rendered\n// as a Source band. Shown as copyable text rather than a vscode:// link — the\n// stamped path is project-relative, so we can't build an absolute editor URL\n// the way the fiber path's `_debugSource` can.\nfunction DomSourceSection({\n anchor,\n copy,\n copiedKey,\n}: {\n anchor: string;\n copy: (text: string, key: string) => void;\n copiedKey: string | null;\n}) {\n const src = parseAnchorSource(anchor);\n const display = src ? `${src.path}:${src.line}${src.col != null ? `:${src.col}` : ''}` : anchor;\n return (\n <Section\n title=\"Source\"\n action={\n <button\n onClick={() => copy(display, 'dom-src')}\n style={btnStyle}\n title=\"Copy source location\"\n >\n {copiedKey === 'dom-src' ? '✓ copied' : 'copy'}\n </button>\n }\n >\n <div\n style={{\n padding: '8px 12px',\n background: 'rgba(0,0,0,0.35)',\n borderRadius: 6,\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n fontSize: 12,\n color: '#9bb9ff',\n wordBreak: 'break-all',\n }}\n title=\"Stamped at build time by the data-anchor plugin; survives capture\"\n >\n {display}\n </div>\n </Section>\n );\n}\n\nfunction ElementPreview({\n node,\n activePane,\n onTogglePane,\n panesDisabled = false,\n}: {\n node: HTMLElement;\n activePane: 'explode' | 'xray' | null;\n onTogglePane: (pane: 'explode' | 'xray') => void;\n // DOM mode: X-ray / Explode are fiber-and-clone based and would half-work on\n // snapshot DOM — render the buttons disabled with an explanation instead.\n panesDisabled?: boolean;\n}) {\n const exploded = activePane === 'explode';\n const xrayed = activePane === 'xray';\n const wrapRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n const wrap = wrapRef.current;\n if (!wrap) return;\n wrap.innerHTML = '';\n\n const rect = node.getBoundingClientRect();\n if (!rect.width || !rect.height) {\n const empty = document.createElement('div');\n empty.textContent = 'zero-size element';\n empty.style.cssText =\n 'color:rgba(255,255,255,0.4);font-size:11px;font-style:italic;height:100%;display:flex;align-items:center;justify-content:center;';\n wrap.appendChild(empty);\n return;\n }\n\n // Compensate for any ancestor transform (DesignCanvas viewport zoom).\n // Without this, a zoomed-out canvas hands us a shrunken rect while the\n // clone's internal CSS sizing is still at natural CSS px — clone ends up\n // looking like it was drag-resized.\n const canvasScale = getAncestorScale(node);\n const naturalW = rect.width / canvasScale;\n const naturalH = rect.height / canvasScale;\n\n const containerW = wrap.clientWidth;\n const containerH = wrap.clientHeight;\n const scale = Math.min(\n containerW / naturalW,\n containerH / naturalH,\n 1,\n );\n\n // cloneNode(true) carries class names and inline styles — since our\n // stylesheets are global, the clone renders with the real visual\n // appearance. Event handlers and refs don't clone, which is what we want\n // for a read-only thumbnail.\n const clone = node.cloneNode(true) as HTMLElement;\n // cloneNode drops React's property-only `muted` — re-mute or every cloned\n // video tile autoplays with sound.\n muteClonedMedia(clone);\n clone.style.margin = '0';\n clone.style.transformOrigin = 'top left';\n clone.style.transform = `scale(${scale})`;\n clone.style.width = `${naturalW}px`;\n clone.style.height = `${naturalH}px`;\n clone.style.boxSizing = 'border-box';\n clone.style.flexShrink = '0';\n clone.style.position = 'absolute';\n clone.style.top = '0';\n clone.style.left = '0';\n\n const scaledW = naturalW * scale;\n const scaledH = naturalH * scale;\n const positioner = document.createElement('div');\n positioner.style.cssText = `position:absolute;left:${Math.round((containerW - scaledW) / 2)}px;top:${Math.round((containerH - scaledH) / 2)}px;width:${scaledW}px;height:${scaledH}px;pointer-events:none;`;\n\n // The clone lives in the inspector panel — OUTSIDE the source's theme scope —\n // so a dark-scoped element would otherwise render in the global (light)\n // theme. Re-stamp the source's scope id (per the adapter) so the globally\n // injected scope rule re-applies. No-op for a generic adapter / global theme.\n const scopeAttr = getDesignSystemAdapter().themeScopeAttr;\n if (scopeAttr) {\n const scopeHost = themeScopeHostOf(node);\n const scopeId = scopeHost?.getAttribute(scopeAttr);\n if (scopeId) positioner.setAttribute(scopeAttr, scopeId);\n }\n\n positioner.appendChild(clone);\n wrap.appendChild(positioner);\n }, [node]);\n\n return (\n <Section\n title=\"Preview\"\n action={\n <span style={{ display: 'inline-flex', gap: 6 }}>\n <button\n onClick={panesDisabled ? undefined : () => onTogglePane('xray')}\n disabled={panesDisabled}\n title={\n panesDisabled\n ? 'Unavailable on frozen snapshots — x-ray needs the live React artboard'\n : xrayed\n ? 'Close x-ray pane'\n : 'Open x-ray pane'\n }\n style={{\n ...previewActionBtnStyle(xrayed),\n ...(panesDisabled ? { opacity: 0.35, cursor: 'default' } : null),\n }}\n >\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 16 16\" fill=\"none\">\n <rect x=\"2\" y=\"2\" width=\"12\" height=\"12\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <rect x=\"5\" y=\"5\" width=\"6\" height=\"6\" rx=\"0.5\" stroke=\"currentColor\" strokeWidth=\"1\" strokeDasharray=\"1.5 1.5\" />\n </svg>\n {xrayed ? 'x-ray' : 'x-ray'}\n </button>\n <button\n onClick={panesDisabled ? undefined : () => onTogglePane('explode')}\n disabled={panesDisabled}\n title={\n panesDisabled\n ? 'Unavailable on frozen snapshots — explode needs the live React artboard'\n : exploded\n ? 'Close 3D explode pane'\n : 'Open 3D explode pane'\n }\n style={{\n ...previewActionBtnStyle(exploded),\n ...(panesDisabled ? { opacity: 0.35, cursor: 'default' } : null),\n }}\n >\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 16 16\" fill=\"none\">\n <path\n d=\"M8 1.5l5.5 3v7L8 14.5l-5.5-3v-7L8 1.5zM8 1.5v6m0 0L2.5 4.5M8 7.5l5.5-3M8 7.5v7\"\n stroke=\"currentColor\"\n strokeWidth=\"1.3\"\n strokeLinejoin=\"round\"\n strokeLinecap=\"round\"\n />\n </svg>\n {exploded ? 'exploded' : 'explode'}\n </button>\n </span>\n }\n >\n <div\n ref={wrapRef}\n style={{\n position: 'relative',\n height: 140,\n background:\n 'repeating-conic-gradient(rgba(255,255,255,0.03) 0% 25%, rgba(255,255,255,0.06) 0% 50%) 50% / 14px 14px',\n backgroundColor: 'rgba(255,255,255,0.04)',\n borderRadius: 6,\n overflow: 'hidden',\n }}\n />\n </Section>\n );\n}\n\n// Walk the selected element's direct DOM children and classify each one in\n// React terms — find the outermost interesting fiber between the child's\n// fiber and the selected fiber, that's the \"child component\" we attribute to.\n// Pure-host children fall through and we just show their tag name.\n// DOM-complete child enumeration: one row per direct DOM child of `parent`,\n// always. Fibers are used only to LABEL/PROMOTE a row (e.g. collapse a host\n// chain into a single \"Button\" row) — never to prune the walk. This is what\n// lets the tree reach the same nodes the preview reads: SVG internals, nodes\n// behind fiber-less wrappers, sibling hosts that share one component fiber, and\n// content rendered through a portal (Spring Modal/Popover) that lands in the\n// DOM under this subtree. `parentFiber` (when known) bounds the upward\n// promotion walk; null means \"don't promote\" (we're under a fiber-less node).\nfunction ElementBodySections({\n domNode,\n copy,\n copiedKey,\n}: {\n domNode: HTMLElement;\n copy: (text: string, key: string) => void;\n copiedKey: string | null;\n}) {\n const text = getDirectText(domNode);\n const attrs = getInterestingAttrs(domNode);\n\n return (\n <>\n {text && (\n <Section\n title=\"Text\"\n action={\n <button\n onClick={() => copy(text, 'text')}\n style={btnStyle}\n title=\"Copy text\"\n >\n {copiedKey === 'text' ? '✓ copied' : 'copy'}\n </button>\n }\n >\n <div\n style={{\n padding: '8px 12px',\n background: 'rgba(0,0,0,0.35)',\n borderRadius: 6,\n fontSize: 12.5,\n lineHeight: 1.5,\n color: '#f5f1e8',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n }}\n >\n {text}\n </div>\n </Section>\n )}\n\n {attrs.length > 0 && (\n <Section title=\"Attributes\">\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4 }}>\n {attrs.map(([k, v]) => (\n <div\n key={k}\n style={{\n display: 'grid',\n gridTemplateColumns: '110px 1fr',\n gap: 8,\n alignItems: 'baseline',\n fontSize: 12,\n padding: '4px 0',\n borderBottom: '1px solid rgba(255,255,255,0.06)',\n }}\n >\n <span style={{ color: 'rgba(255,255,255,0.55)' }}>{k}</span>\n <span\n style={{\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n color: '#f5f1e8',\n wordBreak: 'break-word',\n }}\n >\n {v}\n </span>\n </div>\n ))}\n </div>\n </Section>\n )}\n </>\n );\n}\n\n// ───────── asset section ─────────\n//\n// Renders when the selected DOM element is a downloadable / serializable asset\n// (img / video / audio / svg) or a Spring icon. Surfaces the URL or icon\n// token, copyable + downloadable in one click. Sits right after BoxModel —\n// asset-shaped info is more relevant than generic Text + Attributes when the\n// selected thing IS the asset.\n\nconst btnStyle: React.CSSProperties = {\n background: 'transparent',\n color: 'rgba(255,255,255,0.7)',\n border: '1px solid rgba(255,255,255,0.15)',\n padding: '2px 8px',\n borderRadius: 4,\n fontSize: 11,\n cursor: 'pointer',\n fontFamily: 'inherit',\n};\n\nfunction previewActionBtnStyle(active: boolean): React.CSSProperties {\n return {\n background: active ? 'rgba(154,166,187,0.18)' : 'transparent',\n color: active ? '#9bb9ff' : 'rgba(255,255,255,0.7)',\n border: `1px solid ${active ? 'rgba(154,166,187,0.45)' : 'rgba(255,255,255,0.15)'}`,\n padding: '3px 8px 3px 6px',\n borderRadius: 6,\n fontSize: 11,\n cursor: 'pointer',\n fontFamily: 'inherit',\n display: 'inline-flex',\n alignItems: 'center',\n gap: 5,\n };\n}\n\nfunction EffectsSection({\n node,\n onCopy,\n copiedKey,\n}: {\n node: HTMLElement;\n onCopy: (text: string) => void;\n copiedKey: string | null;\n}) {\n const s = getComputedStyle(node);\n // Filter out no-op shadows before rendering. Spring components frequently\n // emit multi-shadow stacks where some components resolve to \"0 0 0 0\n // rgba(0,0,0,0)\" — fully transparent OR zero-geometry, painting nothing.\n // Showing these as rows is pure noise; only surface shadows that actually\n // contribute pixels. The raw computed value (preserved for token lookup)\n // is still passed through unchanged.\n const allShadows = splitShadows(s.boxShadow);\n const shadows = allShadows.filter((raw) => {\n const p = parseShadow(raw);\n if (!p) return false;\n if (isTransparent(p.color)) return false;\n if (\n p.offsetX === 0 &&\n p.offsetY === 0 &&\n p.blur === 0 &&\n p.spread === 0\n ) {\n return false;\n }\n return true;\n });\n const outlineStyle = s.outlineStyle;\n const outlineWidth = parseFloat(s.outlineWidth) || 0;\n const outlineColor = s.outlineColor;\n const outlineOffset = s.outlineOffset;\n const opacity = parseFloat(s.opacity);\n const filter = s.filter;\n const backdropFilter = (s as unknown as { backdropFilter?: string })\n .backdropFilter;\n\n const hasShadows = shadows.length > 0;\n const hasOutline =\n outlineStyle && outlineStyle !== 'none' && outlineWidth > 0;\n const hasOpacity = !Number.isNaN(opacity) && opacity < 1;\n const hasFilter = filter && filter !== 'none';\n const hasBackdrop = !!backdropFilter && backdropFilter !== 'none';\n\n if (\n !hasShadows &&\n !hasOutline &&\n !hasOpacity &&\n !hasFilter &&\n !hasBackdrop\n ) {\n return null;\n }\n\n return (\n <Section title=\"Effects\">\n {shadows.map((raw, i) => (\n <ShadowRow\n key={`${i}:${raw}`}\n raw={raw}\n onCopy={onCopy}\n copiedKey={copiedKey}\n />\n ))}\n {hasOutline && (\n <EffectRow\n label=\"Outline\"\n swatch={outlineColor}\n mainText={`${Math.round(outlineWidth)}px ${outlineStyle}${\n parseFloat(outlineOffset)\n ? ` · offset ${Math.round(parseFloat(outlineOffset))}px`\n : ''\n }`}\n sub={outlineColor}\n />\n )}\n {hasOpacity && (\n <EffectRow\n label=\"Opacity\"\n mainText={`${Math.round(opacity * 100)}%`}\n sub={`${opacity}`}\n />\n )}\n {hasFilter && (\n <EffectRow label=\"Filter\" mainText={filter} sub=\"\" wrap />\n )}\n {hasBackdrop && (\n <EffectRow\n label=\"Backdrop\"\n mainText={backdropFilter as string}\n sub=\"\"\n wrap\n />\n )}\n </Section>\n );\n}\n\nfunction ShadowRow({\n raw,\n onCopy,\n copiedKey,\n}: {\n raw: string;\n onCopy: (text: string) => void;\n copiedKey: string | null;\n}) {\n const parsed = parseShadow(raw);\n if (!parsed) return null;\n const shadowToken = lookupShadowToken(raw);\n const colorToken = lookupColorToken(parsed.color);\n const valuesStr = `${Math.round(parsed.offsetX)} ${Math.round(\n parsed.offsetY,\n )} ${Math.round(parsed.blur)} ${Math.round(parsed.spread)}`;\n\n return (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: '58px 1fr',\n gap: 8,\n alignItems: 'center',\n padding: '8px 0',\n borderBottom: '1px solid rgba(255,255,255,0.06)',\n }}\n >\n {/* Preview rect */}\n <div\n style={{\n width: 50,\n height: 32,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'rgba(255,255,255,0.04)',\n borderRadius: 4,\n }}\n >\n <div\n style={{\n width: 32,\n height: 18,\n background: 'rgba(245,241,232,0.95)',\n borderRadius: 3,\n boxShadow: raw,\n }}\n />\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, minWidth: 0 }}>\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4, alignItems: 'center' }}>\n {parsed.inset && (\n <span\n style={{\n fontSize: 9.5,\n textTransform: 'uppercase',\n letterSpacing: 0.4,\n fontWeight: 600,\n color: '#cfe0ff',\n border: '1px solid rgba(155,185,255,0.4)',\n padding: '1px 4px',\n borderRadius: 3,\n }}\n >\n inset\n </span>\n )}\n {shadowToken ? (\n (() => {\n const justCopied = copiedKey === `tok:${shadowToken}`;\n return (\n <button\n onClick={() => onCopy(shadowToken)}\n title={`Copy \"${shadowToken}\"`}\n style={{\n border: '1px solid rgba(255,255,255,0.15)',\n background: justCopied\n ? 'rgba(154,166,187,0.25)'\n : 'rgba(255,255,255,0.04)',\n color: '#f5f1e8',\n padding: '2px 6px',\n borderRadius: 4,\n fontFamily: MONO_FF,\n fontSize: 11,\n cursor: 'pointer',\n }}\n >\n {justCopied ? `✓ ${shadowToken}` : shadowToken}\n </button>\n );\n })()\n ) : adapterHasTokens() ? (\n <span\n style={{\n color: 'rgba(255,180,90,0.85)',\n fontSize: 11,\n fontStyle: 'italic',\n }}\n title={`No matching ${getDesignSystemAdapter().libraryLabel} shadow token`}\n >\n ⚠ off-token\n </span>\n ) : null}\n </div>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n fontFamily: MONO_FF,\n fontSize: 11,\n color: 'rgba(255,255,255,0.65)',\n flexWrap: 'wrap',\n }}\n >\n <span title=\"offset-x · offset-y · blur · spread\">{valuesStr}</span>\n <span style={{ color: 'rgba(255,255,255,0.3)' }}>·</span>\n <Swatch color={parsed.color} />\n <span style={{ wordBreak: 'break-all' }}>\n {colorToken ?? parsed.color}\n </span>\n </div>\n </div>\n </div>\n );\n}\n\nfunction EffectRow({\n label,\n swatch,\n mainText,\n sub,\n wrap = false,\n}: {\n label: string;\n swatch?: string;\n mainText: string;\n sub: string;\n wrap?: boolean;\n}) {\n return (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: '90px 1fr',\n gap: 8,\n alignItems: 'center',\n padding: '6px 0',\n borderBottom: '1px solid rgba(255,255,255,0.06)',\n }}\n >\n <span style={{ color: 'rgba(255,255,255,0.55)', fontSize: 12 }}>\n {label}\n </span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 2, minWidth: 0 }}>\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n fontFamily: MONO_FF,\n fontSize: 11.5,\n color: '#f5f1e8',\n wordBreak: wrap ? 'break-word' : 'normal',\n whiteSpace: wrap ? 'normal' : 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n }}\n >\n {swatch && !isTransparent(swatch) && <Swatch color={swatch} />}\n <span>{mainText}</span>\n </div>\n {sub && (\n <span\n style={{\n fontSize: 10,\n fontFamily: MONO_FF,\n color: 'rgba(255,255,255,0.45)',\n }}\n >\n {sub}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nfunction StylesSection({\n tokens,\n resolved,\n onCopy,\n copiedKey,\n colorMode,\n onColorModeChange,\n}: {\n tokens: StyleTokens;\n resolved: ResolvedStyles;\n onCopy: (text: string) => void;\n copiedKey: string | null;\n colorMode: ColorDisplayMode;\n onColorModeChange: (mode: ColorDisplayMode) => void;\n}) {\n // Color / Background / Border are driven purely by the computed value of\n // the selected element. We deliberately ignore the class-collected\n // textColor / bgColor / borderColor tokens (which scan ancestors too) —\n // those produce noise like \"bg-neutral-static-b0\" listed for an element\n // whose computed background is transparent because the class lives on a\n // parent or is overridden. Computed value + reverse-lookup is the single\n // source of truth that always matches what's on screen.\n // Typography: prefer the class-collected token when present (walks\n // ancestors for `typography-*` utilities); otherwise, for text-leaf\n // elements, fall back to the reverse-lookup against the computed font\n // signature (`resolved.typographyAutoToken`). This catches Spring\n // components that style text via component-internal CSS rules rather\n // than a utility class — clicking the painted span shows the matching\n // token instead of an empty row.\n const hasTypography = tokens.typography.length > 0 || resolved.hasDirectText;\n // Only show Color where the element actually paints text — otherwise the\n // computed color is just inherited and renders nothing on this node.\n const hasText = resolved.hasDirectText && !isTransparent(resolved.color);\n const hasBg = !isTransparent(resolved.backgroundColor);\n const hasBorder = resolved.hasBorderWidth && !isTransparent(resolved.borderColor);\n if (!hasTypography && !hasText && !hasBg && !hasBorder) return null;\n\n // Show the full computed font-family stack (quotes stripped, normalized) so\n // the value is unambiguous — e.g. \"system-ui, sans-serif\" rather than just\n // the first family. This is the real computed value; the browser doesn't\n // expose the OS-substituted rendered face, so the stack is the honest answer.\n const fontFamilyStack = resolved.fontFamily\n .split(',')\n .map((f) => f.replace(/['\"]/g, '').trim())\n .filter(Boolean)\n .join(', ');\n const fontSummary = `${fontFamilyStack ? `${fontFamilyStack} · ` : ''}${resolved.fontSize} · ${resolved.fontWeight} · ${\n resolved.lineHeight === 'normal'\n ? 'lh normal'\n : `lh ${resolved.lineHeight}`\n }`;\n\n // Toggle is only meaningful when at least one color row will render.\n const showToggle = hasText || hasBg || hasBorder;\n\n return (\n <Section\n title=\"Styles\"\n action={\n showToggle && (\n <ColorDisplayToggle mode={colorMode} onChange={onColorModeChange} />\n )\n }\n >\n {resolved.theme.scope && <ThemeRow theme={resolved.theme} />}\n {hasTypography && (\n <StyleRow\n label=\"Typography\"\n tokens={tokens.typography}\n autoToken={resolved.typographyAutoToken}\n sub={fontSummary}\n onCopy={onCopy}\n copiedKey={copiedKey}\n />\n )}\n {hasText && (\n <StyleRow\n label=\"Color\"\n tokens={[]}\n autoToken={resolved.colorToken}\n swatch={resolved.color}\n sub={resolved.color}\n onCopy={onCopy}\n copiedKey={copiedKey}\n colorMode={colorMode}\n />\n )}\n {hasBg && (\n <StyleRow\n label=\"Background\"\n tokens={[]}\n autoToken={resolved.backgroundToken}\n swatch={resolved.backgroundColor}\n sub={resolved.backgroundColor}\n onCopy={onCopy}\n copiedKey={copiedKey}\n colorMode={colorMode}\n />\n )}\n {hasBorder && (\n <StyleRow\n label=\"Border\"\n tokens={[]}\n autoToken={resolved.borderToken}\n swatch={resolved.borderColor}\n sub={resolved.borderColor}\n onCopy={onCopy}\n copiedKey={copiedKey}\n colorMode={colorMode}\n />\n )}\n </Section>\n );\n}\n\n// Three-way segmented control in the Styles section header. Decides whether\n// Color/Background/Border rows show the Spring token name, the raw rgba\n// value, or the CSS var() form as their primary chip.\nfunction ColorDisplayToggle({\n mode,\n onChange,\n}: {\n mode: ColorDisplayMode;\n onChange: (mode: ColorDisplayMode) => void;\n}) {\n // Token & var forms only make sense with a design system connected; without\n // one, Hex is the only meaningful color form (see adapterHasTokens).\n const lib = getDesignSystemAdapter().libraryLabel;\n const opts: Array<{ value: ColorDisplayMode; label: string; title: string }> = adapterHasTokens()\n ? [\n { value: 'token', label: 'Tok', title: `${lib} color token` },\n { value: 'value', label: 'Hex', title: 'Computed rgba value' },\n { value: 'var', label: 'Var', title: `CSS var() form` },\n ]\n : [{ value: 'value', label: 'Hex', title: 'Computed rgba value' }];\n // Nothing to toggle between with one form → don't render a dead control.\n if (opts.length <= 1) return null;\n return (\n <div\n style={{\n display: 'inline-flex',\n border: '1px solid rgba(255,255,255,0.15)',\n borderRadius: 4,\n overflow: 'hidden',\n }}\n >\n {opts.map((o, i) => {\n const active = mode === o.value;\n return (\n <button\n key={o.value}\n onClick={() => onChange(o.value)}\n title={o.title}\n style={{\n background: active ? 'rgba(154,166,187,0.22)' : 'transparent',\n color: active ? '#cfe0ff' : 'rgba(255,255,255,0.55)',\n border: 0,\n borderLeft: i === 0 ? 0 : '1px solid rgba(255,255,255,0.12)',\n padding: '2px 7px',\n fontSize: 10,\n fontWeight: 600,\n letterSpacing: 0.4,\n textTransform: 'uppercase',\n cursor: 'pointer',\n fontFamily: 'inherit',\n }}\n >\n {o.label}\n </button>\n );\n })}\n </div>\n );\n}\n\nfunction ThemeRow({ theme }: { theme: ThemeInfo }) {\n return (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: '90px 1fr',\n gap: 8,\n alignItems: 'baseline',\n padding: '6px 0',\n borderBottom: '1px solid rgba(255,255,255,0.06)',\n }}\n >\n <span style={{ color: 'rgba(255,255,255,0.55)', fontSize: 12 }}>Theme</span>\n <div style={{ display: 'flex', alignItems: 'center', gap: 6, minWidth: 0 }}>\n <span style={{ color: '#f5f1e8', fontSize: 12, fontWeight: 600 }}>{theme.scope}</span>\n {theme.mode && (\n <span\n style={{\n fontSize: 10.5,\n fontWeight: 700,\n letterSpacing: 0.3,\n textTransform: 'uppercase',\n color: 'rgba(245,241,232,0.6)',\n border: '1px solid rgba(255,255,255,0.15)',\n borderRadius: 4,\n padding: '1px 5px',\n }}\n >\n {theme.mode}\n </span>\n )}\n </div>\n </div>\n );\n}\n\nfunction StyleRow({\n label,\n tokens,\n autoToken,\n swatch,\n sub,\n onCopy,\n copiedKey,\n colorMode,\n}: {\n label: string;\n tokens: string[];\n autoToken?: string | null;\n swatch?: string;\n sub: string;\n onCopy: (text: string) => void;\n copiedKey: string | null;\n colorMode?: ColorDisplayMode;\n}) {\n // Token-collected rows (Typography) keep the original chip behavior — the\n // colorMode toggle doesn't apply there. Computed-color rows (Color /\n // Background / Border) rotate between three display forms.\n const mode: ColorDisplayMode = colorMode ?? 'token';\n let primary: string | null = null;\n let primaryKind: 'token' | 'value' | 'var' = 'token';\n let subLine: string = sub;\n if (tokens.length === 0) {\n if (mode === 'value') {\n primary = swatch ?? sub;\n primaryKind = 'value';\n subLine = autoToken ? autoToken : '';\n } else if (mode === 'var') {\n if (autoToken) {\n primary = colorVarFromToken(autoToken);\n primaryKind = 'var';\n subLine = swatch ?? sub;\n } else {\n // No token resolved → can't build var(); fall back to the value form.\n primary = swatch ?? sub;\n primaryKind = 'value';\n subLine = '';\n }\n } else {\n primary = autoToken ?? null;\n primaryKind = 'token';\n subLine = sub;\n }\n }\n\n return (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: '90px 1fr',\n gap: 8,\n alignItems: 'baseline',\n padding: '6px 0',\n borderBottom: '1px solid rgba(255,255,255,0.06)',\n }}\n >\n <span style={{ color: 'rgba(255,255,255,0.55)', fontSize: 12 }}>\n {label}\n </span>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 4, minWidth: 0 }}>\n {tokens.length > 0 ? (\n <div style={{ display: 'flex', flexWrap: 'wrap', gap: 4 }}>\n {tokens.map((t) => {\n const justCopied = copiedKey === `tok:${t}`;\n const chipColor = resolveTokenColor(t);\n return (\n <button\n key={t}\n onClick={() => onCopy(t)}\n title={`Copy \"${t}\"`}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 5,\n border: '1px solid rgba(255,255,255,0.15)',\n background: justCopied\n ? 'rgba(154,166,187,0.25)'\n : 'rgba(255,255,255,0.04)',\n color: '#f5f1e8',\n padding: '2px 6px',\n borderRadius: 4,\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n fontSize: 11,\n cursor: 'pointer',\n }}\n >\n {chipColor && <Swatch color={chipColor} />}\n <span>{justCopied ? `✓ ${t}` : t}</span>\n </button>\n );\n })}\n </div>\n ) : primary ? (\n (() => {\n const justCopied = copiedKey === `tok:${primary}`;\n const tokenChip = primaryKind === 'token';\n const display = tokenChip ? `~ ${primary}` : primary;\n const title =\n primaryKind === 'token'\n ? `Resolved from CSS variable. Copy \"${primary}\"`\n : primaryKind === 'var'\n ? `CSS var() form. Copy \"${primary}\"`\n : `Computed value. Copy \"${primary}\"`;\n return (\n <button\n onClick={() => onCopy(primary!)}\n title={title}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 5,\n border: tokenChip\n ? '1px dashed rgba(154,166,187,0.55)'\n : '1px solid rgba(255,255,255,0.18)',\n background: justCopied\n ? 'rgba(154,166,187,0.25)'\n : tokenChip\n ? 'rgba(154,166,187,0.08)'\n : 'rgba(255,255,255,0.04)',\n color: tokenChip ? '#cfe0ff' : '#f5f1e8',\n padding: '2px 6px',\n borderRadius: 4,\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n fontSize: 11,\n cursor: 'pointer',\n alignSelf: 'flex-start',\n maxWidth: '100%',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {swatch && !isTransparent(swatch) && <Swatch color={swatch} />}\n <span\n style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n {justCopied ? `✓ ${display}` : display}\n </span>\n </button>\n );\n })()\n ) : adapterHasTokens() ? (\n <span\n style={{\n color: 'rgba(255,180,90,0.85)',\n fontSize: 11.5,\n fontStyle: 'italic',\n }}\n title={`No matching ${getDesignSystemAdapter().libraryLabel} token — likely an off-token value`}\n >\n ⚠ off-token\n </span>\n ) : (\n // No design system → nothing to be \"off-token\" against; the raw\n // computed value renders on the sub-line below.\n null\n )}\n {subLine && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n color: 'rgba(255,255,255,0.6)',\n fontSize: 11,\n fontFamily:\n 'ui-monospace, SFMono-Regular, Menlo, Consolas, monospace',\n }}\n >\n {tokens.length > 0 && swatch && !isTransparent(swatch) && (\n <span\n aria-hidden\n style={{\n width: 12,\n height: 12,\n borderRadius: 3,\n background: swatch,\n border: '1px solid rgba(255,255,255,0.15)',\n flexShrink: 0,\n }}\n />\n )}\n <span style={{ wordBreak: 'break-all' }}>{subLine}</span>\n </div>\n )}\n </div>\n </div>\n );\n}\n\n// ─── Accessibility section ────────────────────────────────────────────────\n//\n// Renders for text-leaf elements only — the foreground/background pair is\n// only meaningful when the element actually paints text. Background is the\n// composited stack walked from the element up to the first opaque ancestor\n// (see effectiveBackground above), so Spring's translucent overlays produce\n// the right answer instead of \"transparent on transparent\". Foreground is\n// composited onto that bg too when the text color has alpha < 1.\n//\n// Thresholds shift between AA 4.5:1 / AAA 7:1 (normal text) and AA 3:1 /\n// AAA 4.5:1 (large text), where \"large\" = ≥24px OR ≥18.66px when\n// font-weight ≥ 700. The threshold applied is shown so devs don't have to\n// guess which row they're reading.\n\nfunction AccessibilitySection({\n node,\n onCopy,\n copiedKey,\n}: {\n node: HTMLElement;\n onCopy: (text: string) => void;\n copiedKey: string | null;\n}) {\n const cs = getComputedStyle(node);\n const fgRaw = parseColor(cs.color);\n const bgCandidates = effectiveBackgrounds(node);\n if (!fgRaw || bgCandidates.length === 0 || bgCandidates[0].a < 0.999)\n return null;\n\n // Pick the worst-contrast bg vs. raw fg — when the ancestor chain hits a\n // gradient, there's more than one candidate and we want to flag the worst.\n // Tie-break via the first one so behaviour is stable for non-gradient\n // elements.\n let bg = bgCandidates[0];\n let ratio = contrastRatio(\n fgRaw.a < 1 ? compositeOver(fgRaw, bg) : fgRaw,\n bg,\n );\n for (let i = 1; i < bgCandidates.length; i++) {\n const candidate = bgCandidates[i];\n const fg = fgRaw.a < 1 ? compositeOver(fgRaw, candidate) : fgRaw;\n const r = contrastRatio(fg, candidate);\n if (r < ratio) {\n ratio = r;\n bg = candidate;\n }\n }\n const fg = fgRaw.a < 1 ? compositeOver(fgRaw, bg) : fgRaw;\n const fontSizePx = parseFloat(cs.fontSize);\n const weight = parseInt(cs.fontWeight, 10) || 400;\n const large = isLargeText(fontSizePx, weight);\n const aaThreshold = large ? 3 : 4.5;\n const aaaThreshold = large ? 4.5 : 7;\n const passesAA = ratio >= aaThreshold;\n const passesAAA = ratio >= aaaThreshold;\n\n const fgHex = rgbaToHex(fg);\n const bgHex = rgbaToHex(bg);\n const ratioStr = formatRatio(ratio);\n\n const sizeLabel = Number.isFinite(fontSizePx)\n ? `${fontSizePx % 1 === 0 ? fontSizePx : fontSizePx.toFixed(1)}px`\n : cs.fontSize;\n\n return (\n <Section title=\"Accessibility\">\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: 'auto 1fr',\n gap: 12,\n alignItems: 'center',\n padding: '10px 12px',\n borderRadius: 8,\n background: 'rgba(255,255,255,0.03)',\n border: '1px solid rgba(255,255,255,0.08)',\n }}\n >\n {/* Live sample painted with the actual fg/bg pair */}\n <div\n aria-hidden\n title={`Sample: ${fgHex} on ${bgHex}`}\n style={{\n width: 56,\n height: 48,\n borderRadius: 6,\n background: bgHex,\n color: fgHex,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", system-ui, sans-serif',\n fontSize: 22,\n fontWeight: 600,\n letterSpacing: -0.3,\n border: '1px solid rgba(255,255,255,0.10)',\n flexShrink: 0,\n }}\n >\n Aa\n </div>\n <div style={{ display: 'flex', flexDirection: 'column', gap: 6, minWidth: 0 }}>\n <div style={{ display: 'flex', alignItems: 'baseline', gap: 10, flexWrap: 'wrap' }}>\n <span\n style={{\n fontFamily: MONO_FF,\n fontSize: 18,\n fontWeight: 600,\n color: '#f5f1e8',\n letterSpacing: -0.2,\n }}\n >\n {ratioStr}\n <span style={{ color: 'rgba(255,255,255,0.45)', fontWeight: 400 }}>:1</span>\n </span>\n <div style={{ display: 'flex', gap: 5 }}>\n <ContrastBadge label=\"AA\" passes={passesAA} threshold={aaThreshold} />\n <ContrastBadge label=\"AAA\" passes={passesAAA} threshold={aaaThreshold} />\n </div>\n </div>\n <div\n style={{\n fontSize: 11,\n color: 'rgba(255,255,255,0.55)',\n letterSpacing: 0.2,\n }}\n >\n {large ? 'Large text' : 'Normal text'} · {sizeLabel} · {weight}\n </div>\n </div>\n </div>\n\n {/* fg / bg hex chips — click to copy */}\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n flexWrap: 'wrap',\n marginTop: 8,\n }}\n >\n <ContrastHexChip\n label=\"Text\"\n hex={fgHex}\n onCopy={onCopy}\n copiedKey={copiedKey}\n />\n <span style={{ color: 'rgba(255,255,255,0.4)', fontSize: 11 }}>on</span>\n <ContrastHexChip\n label=\"Background\"\n hex={bgHex}\n onCopy={onCopy}\n copiedKey={copiedKey}\n composited={chainCompositedNote(node)}\n />\n </div>\n </Section>\n );\n}\n\n// Returns a short note when the effective background isn't a simple solid\n// color: either composited from multiple alpha layers, or sampled from a\n// gradient. Useful for explaining \"why does the hex not match the class on\n// this element's parent\" (composite) and \"this hex is just one stop along\n// a gradient\" (gradient — text may sit on a different color along it).\nfunction chainCompositedNote(el: Element): string | null {\n let cur: Element | null = el;\n let layers = 0;\n while (cur) {\n const cs = getComputedStyle(cur);\n if (extractGradientStops(cs.backgroundImage).length > 0) {\n return 'gradient (worst-case)';\n }\n const c = parseColor(cs.backgroundColor);\n if (c && c.a > 0) {\n layers += 1;\n if (c.a >= 0.999) break;\n }\n cur = cur.parentElement;\n }\n return layers > 1 ? `composited (${layers} layers)` : null;\n}\n\nfunction ContrastBadge({\n label,\n passes,\n threshold,\n}: {\n label: string;\n passes: boolean;\n threshold: number;\n}) {\n return (\n <span\n title={`${label} threshold: ${threshold}:1 — ${passes ? 'pass' : 'fail'}`}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 4,\n padding: '2px 7px',\n borderRadius: 4,\n fontSize: 10.5,\n fontWeight: 600,\n letterSpacing: 0.4,\n background: passes ? 'rgba(80,180,120,0.16)' : 'rgba(230,90,90,0.16)',\n border: `1px solid ${passes ? 'rgba(80,180,120,0.45)' : 'rgba(230,90,90,0.45)'}`,\n color: passes ? '#bfe5cd' : '#f3b5b5',\n fontFamily: 'inherit',\n }}\n >\n <span aria-hidden style={{ fontSize: 10 }}>{passes ? '✓' : '✗'}</span>\n <span>{label}</span>\n </span>\n );\n}\n\nfunction ContrastHexChip({\n label,\n hex,\n onCopy,\n copiedKey,\n composited,\n}: {\n label: string;\n hex: string;\n onCopy: (text: string) => void;\n copiedKey: string | null;\n composited?: string | null;\n}) {\n const justCopied = copiedKey === `tok:${hex}`;\n return (\n <button\n onClick={() => onCopy(hex)}\n title={composited ? `${label} — ${composited}. Copy ${hex}` : `${label} — copy ${hex}`}\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 6,\n background: justCopied ? 'rgba(154,166,187,0.25)' : 'rgba(255,255,255,0.04)',\n border: '1px solid rgba(255,255,255,0.15)',\n color: '#f5f1e8',\n padding: '2px 8px 2px 6px',\n borderRadius: 4,\n fontFamily: MONO_FF,\n fontSize: 11,\n cursor: 'pointer',\n }}\n >\n <Swatch color={hex} />\n <span>{justCopied ? `✓ ${hex}` : hex}</span>\n {composited && (\n <span\n style={{\n color: 'rgba(255,255,255,0.45)',\n fontSize: 10,\n fontStyle: 'italic',\n fontFamily: 'inherit',\n letterSpacing: 0,\n }}\n >\n {composited}\n </span>\n )}\n </button>\n );\n}\n\nfunction CollapsibleGroup({\n title,\n subtitle,\n defaultOpen = false,\n children,\n}: {\n title: string;\n subtitle?: string;\n defaultOpen?: boolean;\n children: React.ReactNode;\n}) {\n const [open, setOpen] = useState(defaultOpen);\n return (\n <div\n style={{\n marginBottom: 16,\n border: '1px solid rgba(255,255,255,0.08)',\n borderRadius: 8,\n background: 'rgba(255,255,255,0.02)',\n }}\n >\n <button\n type=\"button\"\n onClick={() => setOpen((o) => !o)}\n style={{\n width: '100%',\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '8px 10px',\n background: 'transparent',\n border: 0,\n color: 'rgba(255,255,255,0.6)',\n cursor: 'pointer',\n fontFamily: 'inherit',\n textAlign: 'left',\n }}\n title={open ? 'Collapse' : 'Expand'}\n >\n <span\n aria-hidden\n style={{\n display: 'inline-block',\n width: 8,\n transform: open ? 'rotate(90deg)' : 'rotate(0deg)',\n transition: 'transform 120ms ease',\n fontSize: 9,\n color: 'rgba(255,255,255,0.5)',\n }}\n >\n ▶\n </span>\n <span\n style={{\n fontSize: 11,\n fontWeight: 600,\n letterSpacing: 0.5,\n textTransform: 'uppercase',\n color: 'rgba(255,255,255,0.7)',\n }}\n >\n {title}\n </span>\n {subtitle && (\n <span\n style={{\n fontSize: 10.5,\n color: 'rgba(255,255,255,0.4)',\n fontStyle: 'italic',\n marginLeft: 2,\n }}\n >\n {subtitle}\n </span>\n )}\n </button>\n {open && (\n <div style={{ padding: '4px 10px 2px' }}>\n {children}\n </div>\n )}\n </div>\n );\n}\n\n// ───────── Scan section (off-token violations across all artboards) ─────────\n//\n// On press, scans every host element inside every `[data-dc-slot]` artboard\n// for computed values that don't reverse-lookup to a Spring token (off-token\n// colors, typography signatures, box shadows). Results are bucketed by\n// (kind, value) so a single bad hex used across N elements collapses into\n// one row.\n//\n// As of 2026-05-24 the inspector RHS Scan section is just a control surface:\n// it shows the Scan/Rescan button + a one-line summary + a Show/Hide-results\n// toggle. The actual bucket list lives in a separate `ScanResultsPane` to\n// the left of the inspector — see ScanResultsPane below. State (results,\n// scanning, expanded buckets, pane open/width) is lifted to InspectorPanel\n// so the pane and the section share it.\n\n\nfunction ScanSection({\n mode,\n title,\n emptyHint,\n okHint,\n results,\n scanning,\n paneOpen,\n scopeEl,\n scopeLabel,\n resultScopeLabel,\n onRunScan,\n onTogglePane,\n}: {\n mode: ScanMode;\n title: string;\n emptyHint: string;\n okHint: string;\n results: ScanBucket[] | null;\n scanning: boolean;\n paneOpen: boolean;\n // Current selection available to scope to (null = nothing selected).\n scopeEl: Element | null;\n scopeLabel: string | null;\n // Scope the displayed results were produced with (null = whole canvas).\n resultScopeLabel: string | null;\n onRunScan: (scope: Element | null, label: string | null) => void;\n onTogglePane: () => void;\n}) {\n const totalIssues = results?.reduce((n, b) => n + b.occurrences.length, 0) ?? 0;\n const hasResults = results !== null && results.length > 0;\n const what =\n mode === 'a11y'\n ? 'text/background pairs that fail WCAG AA'\n : 'off-token colors, typography, and shadows';\n const buttonLabel = scanning\n ? 'Scanning…'\n : scopeEl\n ? 'Scan selection'\n : results\n ? 'Rescan'\n : 'Scan canvas';\n return (\n <Section\n title={title}\n action={\n <button\n onClick={() => onRunScan(scopeEl, scopeLabel)}\n disabled={scanning}\n style={{\n background: scanning\n ? 'rgba(255,255,255,0.04)'\n : 'rgba(154,166,187,0.18)',\n color: scanning ? 'rgba(255,255,255,0.55)' : '#cfe0ff',\n border: '1px solid rgba(154,166,187,0.35)',\n padding: '3px 10px',\n borderRadius: 5,\n fontSize: 11,\n cursor: scanning ? 'default' : 'pointer',\n fontFamily: 'inherit',\n letterSpacing: 0.3,\n }}\n title={\n scopeEl\n ? `Walk only the selected ${scopeLabel ?? 'element'} and list ${what}`\n : `Walk every artboard and list ${what}`\n }\n >\n {buttonLabel}\n </button>\n }\n >\n {/* Scope row — only when something is selected. The button above scans\n that subtree; this offers the whole-canvas sweep as the alternative. */}\n {scopeEl && !scanning && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 6,\n flexWrap: 'wrap',\n marginBottom: 8,\n fontSize: 11.5,\n color: 'rgba(255,255,255,0.6)',\n }}\n >\n <span\n style={{\n display: 'inline-flex',\n alignItems: 'center',\n gap: 5,\n padding: '2px 8px',\n borderRadius: 999,\n background: 'rgba(154,166,187,0.16)',\n border: '1px solid rgba(154,166,187,0.32)',\n color: '#cfe0ff',\n maxWidth: '100%',\n }}\n >\n <span aria-hidden style={{ opacity: 0.8 }}>◳</span>\n <span\n style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n }}\n >\n Scope: {scopeLabel ?? 'selection'}\n </span>\n </span>\n <button\n type=\"button\"\n onClick={() => onRunScan(null, null)}\n style={{\n background: 'transparent',\n border: 0,\n padding: 0,\n color: '#9bb9ff',\n cursor: 'pointer',\n fontSize: 11.5,\n fontFamily: 'inherit',\n textDecoration: 'underline',\n textDecorationStyle: 'dashed',\n textUnderlineOffset: 2,\n }}\n title=\"Scan every artboard on the canvas instead\"\n >\n scan whole canvas\n </button>\n </div>\n )}\n\n {results === null && !scanning && (\n <div\n style={{\n fontSize: 12,\n color: 'rgba(255,255,255,0.5)',\n lineHeight: 1.5,\n padding: '4px 0 2px',\n }}\n >\n {emptyHint}\n </div>\n )}\n\n {results !== null && results.length === 0 && (\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n padding: '8px 10px',\n borderRadius: 6,\n background: 'rgba(80,180,120,0.10)',\n border: '1px solid rgba(80,180,120,0.25)',\n color: '#bfe5cd',\n fontSize: 12,\n }}\n >\n <span aria-hidden style={{ fontSize: 13 }}>✓</span>\n <span>\n {okHint}\n {resultScopeLabel ? ` (scanned ${resultScopeLabel})` : ''}\n </span>\n </div>\n )}\n\n {hasResults && (\n <div\n style={{\n display: 'flex',\n alignItems: 'baseline',\n justifyContent: 'space-between',\n gap: 8,\n fontSize: 11.5,\n color: 'rgba(255,255,255,0.55)',\n padding: '2px 0',\n }}\n >\n <span>\n {totalIssues} occurrence{totalIssues === 1 ? '' : 's'} ·{' '}\n {results!.length} unique value{results!.length === 1 ? '' : 's'}\n {resultScopeLabel ? (\n <span style={{ color: '#9bb9ff' }}> · in {resultScopeLabel}</span>\n ) : null}\n </span>\n <button\n type=\"button\"\n onClick={onTogglePane}\n style={{\n background: 'transparent',\n border: 0,\n padding: 0,\n color: '#9bb9ff',\n cursor: 'pointer',\n fontSize: 11.5,\n fontFamily: 'inherit',\n textDecoration: 'underline',\n textDecorationStyle: 'dashed',\n textUnderlineOffset: 2,\n }}\n title={paneOpen ? 'Hide the results pane' : 'Show the results pane'}\n >\n {paneOpen ? 'Hide results' : 'Show results'}\n </button>\n </div>\n )}\n </Section>\n );\n}\n\n// Default export so DesignCanvas can code-split the Inspector behind\n// `lazy(() => import('./Inspector'))` (P2.2) — the whole overlay (this module +\n// ExplodedView + XRayView + the split submodules) lands in its own chunk that a\n// free-tier `inspector={false}` install never downloads.\nexport default Inspector;\n\n"],"names":["INSPECTOR_GAP","CONTENT_LEAF_TAGS","PANE_BG","PANE_BORDER","pillBtnStyle","_a","getDirectText","i","_b","jsx","fg"],"mappings":"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"}
|