@fragments-sdk/cli 0.2.2 ā 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +1 -1
- package/dist/{viewer-YRF4SQE4.js ā viewer-UYSS7DVA.js} +15 -24
- package/dist/viewer-UYSS7DVA.js.map +1 -0
- package/package.json +1 -1
- package/src/viewer/__tests__/viewer-integration.test.ts +166 -0
- package/src/viewer/server.ts +6 -5
- package/src/viewer/tailwind.config.js +1 -1
- package/src/viewer/vite-plugin.ts +9 -7
- package/dist/viewer-YRF4SQE4.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/viewer/server.ts","../src/viewer/vite-plugin.ts","../src/viewer/render-utils.ts","../src/viewer/style-utils.ts","../src/viewer/components/App.tsx","../src/viewer/components/Layout.tsx","../src/viewer/components/LeftSidebar.tsx","../src/viewer/components/ThemeProvider.tsx","../src/viewer/components/Icons.tsx","../src/viewer/components/VariantTabs.tsx","../src/viewer/components/CommandPalette.tsx","../src/viewer/components/KeyboardShortcutsHelp.tsx","../src/viewer/hooks/useKeyboardShortcuts.ts","../src/viewer/components/Toast.tsx","../src/viewer/components/PreviewToolbar.tsx","../src/viewer/constants/ui.ts","../src/viewer/components/ViewportSelector.tsx","../src/viewer/components/PreviewArea.tsx","../src/viewer/components/ErrorBoundary.tsx","../src/viewer/components/FigmaEmbed.tsx","../src/viewer/components/VariantMatrix.tsx","../src/viewer/components/StoryRenderer.tsx","../src/viewer/components/IsolatedPreviewFrame.tsx","../src/viewer/hooks/usePreviewBridge.ts","../src/viewer/components/MultiViewportPreview.tsx","../src/viewer/components/BottomPanel.tsx","../src/viewer/components/ResizablePanel.tsx","../src/viewer/components/CodePanel.tsx","../src/viewer/components/TokenStylePanel.tsx","../src/viewer/components/AccessibilityPanel.tsx","../src/viewer/hooks/useA11yCache.ts","../src/viewer/hooks/useA11yService.ts","../src/viewer/utils/a11y-fixes.ts","../src/viewer/components/InteractionsPanel.tsx","../src/viewer/components/ActionsPanel.tsx","../src/viewer/hooks/useActions.ts","../src/viewer/utils/actionExport.ts","../src/viewer/components/ComponentGraph.tsx","../src/viewer/utils/detectRelationships.ts","../src/viewer/components/ContractPanel.tsx","../src/viewer/components/IsolatedRender.tsx","../src/viewer/components/VariantRenderer.tsx","../src/viewer/components/HealthDashboard.tsx","../src/viewer/components/ActionCapture.tsx","../src/viewer/hooks/useAppState.ts","../src/viewer/hooks/useViewSettings.ts","../src/viewer/hooks/useFigmaIntegration.ts","../src/viewer/hooks/useUrlState.ts","../src/viewer/components/ScreenshotButton.tsx","../src/viewer/hooks/useScrollSpy.ts","../src/viewer/components/RightSidebar.tsx"],"sourcesContent":["/**\n * Segments Dev Server\n *\n * Runs a Vite dev server that:\n * 1. Uses the project's existing Vite/build configuration\n * 2. Has access to all project dependencies\n * 3. Can render actual components with proper styling\n * 4. Supports HMR for segment file changes\n *\n * This is the \"Storybook-like\" experience for Segments.\n */\n\nimport {\n createServer,\n mergeConfig,\n loadConfigFromFile,\n type ViteDevServer,\n type InlineConfig,\n} from \"vite\";\nimport react from \"@vitejs/plugin-react\";\nimport tailwindcss from \"tailwindcss\";\nimport autoprefixer from \"autoprefixer\";\nimport { resolve, dirname, join } from \"node:path\";\nimport { existsSync, realpathSync } from \"node:fs\";\nimport { fileURLToPath } from \"node:url\";\nimport { loadConfig, discoverSegmentFiles } from \"../core/node.js\";\nimport { segmentsPlugin } from \"./vite-plugin.js\";\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst viewerRoot = resolve(__dirname, \"..\");\nconst viewerTailwindConfig = resolve(viewerRoot, \"tailwind.config.js\");\n// The monorepo packages directory (sibling packages)\nconst packagesRoot = resolve(viewerRoot, \"..\");\n\nexport interface DevServerOptions {\n /** Port to run the server on */\n port?: number;\n /** Path to segments config file */\n configPath?: string;\n /** Open browser on start */\n open?: boolean;\n /** Project root (defaults to cwd) */\n projectRoot?: string;\n}\n\n/**\n * Create and start the Segments dev server.\n *\n * The server runs WITHIN the project's context, meaning:\n * - All project dependencies are available\n * - SCSS, CSS modules, etc. work automatically\n * - Path aliases from tsconfig.json work\n * - Components render exactly as they would in the app\n */\nexport async function createDevServer(\n options: DevServerOptions = {}\n): Promise<ViteDevServer> {\n const startTime = performance.now();\n const {\n port = 6006,\n configPath,\n open = true,\n projectRoot = process.cwd(),\n } = options;\n\n console.log(\"\\nš§ Loading configuration...\");\n\n // Load segments config\n const { config, configDir } = await loadConfig(configPath);\n\n // Discover segment files\n const segmentFiles = await discoverSegmentFiles(config, configDir);\n console.log(`š¦ Found ${segmentFiles.length} fragment file(s)`);\n\n // Try to load project's Vite config\n let projectViteConfig: InlineConfig = {};\n const viteConfigPath = findViteConfig(projectRoot);\n\n if (viteConfigPath) {\n console.log(`š Using project Vite config: ${viteConfigPath}`);\n try {\n const loaded = await loadConfigFromFile(\n { command: \"serve\", mode: \"development\" },\n viteConfigPath,\n projectRoot\n );\n if (loaded) {\n projectViteConfig = loaded.config;\n }\n } catch (error) {\n console.warn(\"ā ļø Could not load project Vite config:\", error);\n }\n } else {\n console.log(\"ā¹ļø No project Vite config found, using defaults\");\n }\n\n // Find node_modules (handles monorepo setups)\n const nodeModulesPath = findNodeModules(projectRoot);\n console.log(`š Using node_modules: ${nodeModulesPath}`);\n\n // Our Segments-specific configuration\n const segmentsConfig: InlineConfig = {\n configFile: false, // Don't load config again\n root: projectRoot, // Run from PROJECT root\n base: \"/\",\n\n server: {\n port,\n open: open ? \"/fragments/\" : false,\n fs: {\n // Allow serving files from viewer package, project, and node_modules root\n allow: [viewerRoot, projectRoot, configDir, dirname(nodeModulesPath)],\n },\n },\n\n plugins: [\n // React support (if not already in project config)\n ...(hasReactPlugin(projectViteConfig) ? [] : [react()]),\n\n // Segments plugins (array including SVGR)\n ...segmentsPlugin({\n segmentFiles,\n config,\n projectRoot,\n }),\n ],\n\n // CSS configuration for viewer's Tailwind\n css: {\n postcss: {\n plugins: [\n tailwindcss({\n config: viewerTailwindConfig,\n }),\n autoprefixer(),\n ],\n },\n },\n\n optimizeDeps: {\n // Include common dependencies for faster startup\n include: [\"react\", \"react-dom\", \"react/jsx-runtime\", \"react/jsx-dev-runtime\"],\n },\n\n // Ensure we can resolve viewer's dependencies\n resolve: {\n // Dedupe ensures all imports of these packages resolve to the same copy\n dedupe: [\"react\", \"react-dom\"],\n alias: {\n // Allow importing from viewer package\n \"@fragments/viewer\": viewerRoot,\n // Ensure ALL react imports resolve to project's node_modules\n // This is critical for viewer files loaded from outside project root\n \"react\": safeRealpath(join(nodeModulesPath, \"react\")),\n \"react-dom\": safeRealpath(join(nodeModulesPath, \"react-dom\")),\n \"react/jsx-runtime\": safeRealpath(join(nodeModulesPath, \"react/jsx-runtime\")),\n \"react/jsx-dev-runtime\": safeRealpath(join(nodeModulesPath, \"react/jsx-dev-runtime\")),\n // Resolve @fragments packages - try project's node_modules first, fall back to monorepo\n \"@fragments/core\": resolveFragmentsPackage(\"core\", nodeModulesPath),\n },\n },\n };\n\n // Merge project config with our config\n // Project config takes precedence for most things\n const mergedConfig = mergeConfig(projectViteConfig, segmentsConfig);\n\n console.log(\"š Starting dev server...\\n\");\n\n // Create and start the server\n const server = await createServer(mergedConfig);\n await server.listen();\n\n // Log startup time\n const startupTime = ((performance.now() - startTime) / 1000).toFixed(2);\n console.log(`ā” Server ready in ${startupTime}s`);\n\n return server;\n}\n\n/**\n * Resolve symlinks to real paths, with fallback.\n */\nfunction safeRealpath(p: string): string {\n try {\n return realpathSync(p);\n } catch {\n return p;\n }\n}\n\n/**\n * Resolve @fragments packages with fallback to monorepo packages.\n * This handles the case where the viewer is served from the fragments monorepo\n * but the user's project doesn't have @fragments packages installed.\n */\nfunction resolveFragmentsPackage(packageName: string, nodeModulesPath: string): string {\n // Try project's node_modules first\n const projectPath = join(nodeModulesPath, `@fragments/${packageName}/dist/index.js`);\n if (existsSync(projectPath)) {\n return safeRealpath(projectPath);\n }\n\n // Fall back to monorepo packages (sibling to viewer)\n const monorepoPath = resolve(packagesRoot, packageName, \"dist/index.js\");\n if (existsSync(monorepoPath)) {\n return safeRealpath(monorepoPath);\n }\n\n // Return project path anyway (will error with helpful message)\n return projectPath;\n}\n\n/**\n * Find node_modules directory by walking up from projectRoot.\n * This handles monorepo setups where node_modules is at the root.\n */\nfunction findNodeModules(startDir: string): string {\n let current = startDir;\n while (current !== dirname(current)) {\n const nodeModulesPath = join(current, \"node_modules\");\n if (existsSync(join(nodeModulesPath, \"react\"))) {\n return nodeModulesPath;\n }\n current = dirname(current);\n }\n // Fallback to projectRoot/node_modules\n return join(startDir, \"node_modules\");\n}\n\n/**\n * Find Vite config file in project.\n */\nfunction findViteConfig(projectRoot: string): string | null {\n const configFiles = [\n \"vite.config.ts\",\n \"vite.config.js\",\n \"vite.config.mts\",\n \"vite.config.mjs\",\n ];\n\n for (const file of configFiles) {\n const path = join(projectRoot, file);\n if (existsSync(path)) {\n return path;\n }\n }\n\n return null;\n}\n\n/**\n * Check if project config already has React plugin.\n */\nfunction hasReactPlugin(config: InlineConfig): boolean {\n if (!config.plugins) return false;\n\n const plugins = Array.isArray(config.plugins)\n ? config.plugins\n : [config.plugins];\n\n return plugins.some((plugin) => {\n if (!plugin) return false;\n if (Array.isArray(plugin)) {\n return plugin.some(\n (p) =>\n p && typeof p === \"object\" && \"name\" in p && p.name?.includes(\"react\")\n );\n }\n return (\n typeof plugin === \"object\" &&\n \"name\" in plugin &&\n plugin.name?.includes(\"react\")\n );\n });\n}\n","/**\n * Segments Vite Plugin\n *\n * This plugin runs WITHIN the project's Vite context, giving it access to:\n * - All project dependencies (React, UI libraries, etc.)\n * - Project's loaders (SCSS, CSS modules, etc.)\n * - Project's path aliases (@/components, etc.)\n * - Project's tsconfig paths\n *\n * It provides:\n * - Virtual module for segment imports\n * - Viewer UI served at /fragments/\n * - HMR support for segment file changes\n */\n\nimport type { Plugin, ViteDevServer, ResolvedConfig } from \"vite\";\nimport { resolve, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { readFile } from \"node:fs/promises\";\nimport { transform } from \"esbuild\";\nimport type { SegmentsConfig, CompiledSegment } from \"../core/index.js\";\nimport { generateContext, BRAND } from \"../core/index.js\";\nimport {\n findStorybookDir,\n findPreviewConfigPath,\n generatePreviewModule,\n} from \"../core/node.js\";\nimport svgr from \"vite-plugin-svgr\";\nimport {\n generateRenderScript,\n findSegmentByName,\n getAvailableComponents,\n type RenderRequest,\n} from \"./render-utils.js\";\nimport {\n compareStyles,\n type StyleDiffItem,\n} from \"./style-utils.js\";\n\n/**\n * Request body for /fragments/compare endpoint\n */\ninterface CompareRequest {\n /** Component name */\n component: string;\n /** Variant name (optional, uses first variant if not specified) */\n variant?: string;\n /** Props to render with */\n props?: Record<string, unknown>;\n /** Figma URL (optional if segment has figma link) */\n figmaUrl?: string;\n /** Viewport dimensions */\n viewport?: { width: number; height: number };\n /** Figma access token (can be passed from CLI) */\n figmaToken?: string;\n /** Diff threshold percentage (default: 1.0) */\n threshold?: number;\n /** Include style comparison from Figma design properties */\n includeStyleDiff?: boolean;\n}\n\n/**\n * Response from /fragments/compare endpoint\n */\ninterface CompareResponse {\n /** Whether diff is within threshold */\n match: boolean;\n /** Diff percentage (0-100) */\n diffPercentage: number;\n /** Threshold that was used */\n threshold: number;\n /** Rendered component screenshot (base64 PNG) */\n rendered: string;\n /** Figma design image (base64 PNG) */\n figma: string;\n /** Diff image highlighting differences (base64 PNG) */\n diff: string;\n /** The Figma URL that was used */\n figmaUrl: string;\n /** Regions that changed */\n changedRegions: Array<{\n x: number;\n y: number;\n width: number;\n height: number;\n }>;\n /** Style comparison results (when includeStyleDiff is true) */\n styleDiff?: {\n /** Whether all styles match */\n match: boolean;\n /** Individual property comparisons */\n properties: StyleDiffItem[];\n /** CSS properties from Figma design */\n figmaStyles: Record<string, string>;\n /** Computed CSS properties from rendered component */\n renderedStyles: Record<string, string>;\n };\n}\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\n// Store pending render requests (for internal render page to pick up)\nconst pendingRenders = new Map<\n string,\n { script: string; viewport?: { width: number; height: number } }\n>();\n\n// Shared browser pool for render captures (lazy initialized)\nlet sharedRenderPool: any = null;\nlet browserPoolModule: any = null;\n\n/**\n * Get or create the shared browser pool for render captures.\n * The pool is lazily initialized on first use and reused across requests.\n */\nasync function getSharedRenderPool() {\n if (!browserPoolModule) {\n browserPoolModule = await import(\"../service/index.js\");\n }\n\n if (!sharedRenderPool) {\n sharedRenderPool = new browserPoolModule.BrowserPool({\n viewport: { width: 800, height: 600 }, // Default viewport, will be overridden per page\n poolSize: 2, // Keep 2 contexts warm for parallel requests\n idleTimeoutMs: 60000, // Keep warm for 60 seconds\n });\n }\n\n return { pool: sharedRenderPool, bufferToBase64Url: browserPoolModule.bufferToBase64Url };\n}\n\nexport interface SegmentsPluginOptions {\n /** Discovered segment files */\n segmentFiles: Array<{\n absolutePath: string;\n relativePath: string;\n }>;\n\n /** Segments configuration */\n config: SegmentsConfig;\n\n /** Project root directory */\n projectRoot: string;\n}\n\n/**\n * Create the Segments Vite plugin.\n * Returns an array of plugins to support SVGR and other transforms.\n */\nexport function segmentsPlugin(options: SegmentsPluginOptions): Plugin[] {\n const { segmentFiles, config, projectRoot } = options;\n\n // Virtual module IDs\n const VIRTUAL_SEGMENTS = `virtual:${BRAND.nameLower}`;\n const VIRTUAL_SEGMENTS_RESOLVED = `\\0virtual:${BRAND.nameLower}`;\n\n const VIRTUAL_VIEWER_ENTRY = `virtual:${BRAND.nameLower}-viewer-entry`;\n const VIRTUAL_VIEWER_ENTRY_RESOLVED = `\\0virtual:${BRAND.nameLower}-viewer-entry`;\n\n const VIRTUAL_PREVIEW = `virtual:${BRAND.nameLower}-preview`;\n const VIRTUAL_PREVIEW_RESOLVED = `\\0virtual:${BRAND.nameLower}-preview`;\n\n let server: ViteDevServer | null = null;\n let resolvedConfig: ResolvedConfig | null = null;\n\n // Detect Storybook preview config path\n const storybookDir = findStorybookDir(projectRoot);\n const previewConfigPath = storybookDir\n ? findPreviewConfigPath(storybookDir)\n : null;\n\n // Track segment files for HMR\n const segmentFileSet = new Set(segmentFiles.map((f) => f.absolutePath));\n\n const mainPlugin: Plugin = {\n name: \"segments\",\n\n // Add process.env shim and esbuild config for Storybook compatibility\n config() {\n return {\n define: {\n // Shim process.env for story files that use it (e.g., process.env.STORYBOOK_*)\n \"process.env\": \"{}\",\n },\n esbuild: {\n // Handle JSX in .js files (common in Storybook preview.js files)\n loader: \"tsx\",\n include: /\\.(tsx?|jsx?)$/,\n },\n optimizeDeps: {\n // Force esbuild to handle .js files with JSX\n esbuildOptions: {\n loader: {\n \".js\": \"jsx\",\n },\n },\n },\n };\n },\n\n // Store resolved config\n configResolved(config) {\n resolvedConfig = config;\n },\n\n // Store server reference for HMR\n configureServer(_server) {\n server = _server;\n\n // Serve the viewer UI at /fragments/\n _server.middlewares.use(async (req, res, next) => {\n // Handle /fragments/render endpoint for AI preview\n if (req.url === \"/fragments/render\" && req.method === \"POST\") {\n try {\n // Parse JSON body\n const body = await parseJsonBody(req);\n const { component, props = {}, viewport } = body as RenderRequest;\n\n if (!component) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({ error: \"Missing required field: component\" })\n );\n return;\n }\n\n // Load segments to find the component\n const loadedSegments = await loadSegmentsForRender(\n segmentFiles,\n projectRoot\n );\n const segmentInfo = findSegmentByName(component, loadedSegments);\n\n if (!segmentInfo) {\n const available = getAvailableComponents(loadedSegments);\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: `Component '${component}' not found. Available: ${available.join(\n \", \"\n )}`,\n })\n );\n return;\n }\n\n // Find the absolute path for the segment\n const segmentFile = segmentFiles.find(\n (f) => f.relativePath === segmentInfo.path\n );\n if (!segmentFile) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({ error: \"Could not resolve segment file path\" })\n );\n return;\n }\n\n // Generate render script\n const renderScript = generateRenderScript(\n segmentFile.absolutePath,\n segmentInfo.name,\n props\n );\n\n // Store the render request for the render page to pick up\n const requestId =\n Date.now().toString(36) + Math.random().toString(36).slice(2);\n pendingRenders.set(requestId, { script: renderScript, viewport });\n\n // Get server address\n const address = _server.httpServer?.address();\n const port =\n typeof address === \"object\" && address ? address.port : 6006;\n\n // Use Playwright to render and capture\n const screenshot = await captureRender(\n `http://localhost:${port}/fragments/__render__/${requestId}`,\n viewport || { width: 800, height: 600 }\n );\n\n // Clean up\n pendingRenders.delete(requestId);\n\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify({ screenshot }));\n } catch (error) {\n console.error(\"[Fragments] Error rendering:\", error);\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: error instanceof Error ? error.message : \"Render failed\",\n })\n );\n }\n return;\n }\n\n // Serve render page for AI preview (internal use)\n if (req.url?.startsWith(\"/fragments/__render__/\")) {\n const requestId = req.url\n .split(\"/fragments/__render__/\")[1]\n ?.split(\"?\")[0];\n const renderData = pendingRenders.get(requestId || \"\");\n\n if (!renderData) {\n res.writeHead(404, { \"Content-Type\": \"text/plain\" });\n res.end(\"Render request not found or expired\");\n return;\n }\n\n await serveRenderHTML(res, _server, renderData.script);\n return;\n }\n\n // Handle /fragments/compare endpoint for Figma design verification\n if (req.url === \"/fragments/compare\" && req.method === \"POST\") {\n try {\n const body = (await parseJsonBody(req)) as CompareRequest;\n const {\n component,\n variant,\n props = {},\n figmaUrl,\n viewport,\n threshold = 1.0,\n includeStyleDiff = false,\n } = body;\n\n if (!component) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({ error: \"Missing required field: component\" })\n );\n return;\n }\n\n // Check for Figma access token (request body > env var > config)\n const figmaToken =\n body.figmaToken ||\n process.env.FIGMA_ACCESS_TOKEN ||\n config.figmaToken;\n if (!figmaToken && !figmaUrl) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: `No Figma access token configured. Figma token: ${figmaToken}`,\n suggestion:\n \"Set FIGMA_ACCESS_TOKEN env var, add figmaToken to fragments.config.ts, or provide in request\",\n })\n );\n return;\n }\n\n // Debug: Log segment files\n console.log(\"[Fragments] Compare request for:\", component);\n console.log(\"[Fragments] segmentFiles count:\", segmentFiles.length);\n console.log(\"[Fragments] First 3 segment files:\", segmentFiles.slice(0, 3).map(f => f.relativePath));\n console.log(\"[Fragments] projectRoot:\", projectRoot);\n\n // Load segments to find the component and its figma URL\n const loadedSegments = await loadSegmentsForRender(\n segmentFiles,\n projectRoot\n );\n console.log(\"[Fragments] loadedSegments count:\", loadedSegments.length);\n console.log(\"[Fragments] First 3 loaded:\", loadedSegments.slice(0, 3).map(s => s.segment.meta.name));\n const segmentInfo = findSegmentByName(component, loadedSegments);\n\n if (!segmentInfo) {\n const available = getAvailableComponents(loadedSegments);\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: `Component '${component}' not found. Available: ${available.join(\n \", \"\n )}`,\n })\n );\n return;\n }\n\n // Find full segment data to get figma URL\n const fullSegmentData = await loadFullSegmentForCompare(\n _server,\n segmentFiles,\n component,\n variant,\n projectRoot\n );\n\n // Determine which Figma URL to use (request > variant > meta)\n const effectiveFigmaUrl = figmaUrl || fullSegmentData?.figmaUrl;\n\n if (!effectiveFigmaUrl) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: `No Figma URL for component '${component}'`,\n suggestion:\n \"Add 'figma' field to segment definition or provide figmaUrl in request\",\n })\n );\n return;\n }\n\n if (!figmaToken) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: \"Figma access token required for comparison\",\n suggestion:\n \"Set FIGMA_ACCESS_TOKEN env var or add figmaToken to fragments.config.ts\",\n })\n );\n return;\n }\n\n // Find segment file for rendering\n const segmentFile = segmentFiles.find(\n (f) => f.relativePath === segmentInfo.path\n );\n if (!segmentFile) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({ error: \"Could not resolve segment file path\" })\n );\n return;\n }\n\n // Get server port\n const address = _server.httpServer?.address();\n const port =\n typeof address === \"object\" && address ? address.port : 6006;\n const renderViewport = viewport || { width: 800, height: 600 };\n\n // Import Figma service\n const { FigmaClient, bufferToBase64Url } = await import(\n \"../service/index.js\"\n );\n const figmaClient = new FigmaClient({\n accessToken: figmaToken,\n });\n\n // Parse Figma URL to get file key and node ID for style diff\n const { fileKey, nodeId } = figmaClient.parseUrl(effectiveFigmaUrl);\n\n // Generate render script and request ID for component capture\n const renderScript = generateRenderScript(\n segmentFile.absolutePath,\n segmentInfo.name,\n props\n );\n const requestId =\n Date.now().toString(36) + Math.random().toString(36).slice(2);\n pendingRenders.set(requestId, {\n script: renderScript,\n viewport: renderViewport,\n });\n\n try {\n // Execute render, Figma fetch, and optionally style fetch in parallel\n const [captureResult, figmaImageResult, figmaDesignProps] = await Promise.all([\n // Render and capture the component (with optional computed styles)\n captureRenderWithStyles(\n `http://localhost:${port}/fragments/__render__/${requestId}`,\n renderViewport,\n includeStyleDiff\n ),\n // Fetch Figma image\n figmaClient.getImageFromUrl(effectiveFigmaUrl),\n // Fetch Figma design properties (only if includeStyleDiff is true)\n includeStyleDiff\n ? figmaClient.getNodeProperties(fileKey, nodeId)\n : Promise.resolve(null),\n ]);\n\n const renderedImage = captureResult.screenshot;\n const renderedStyles = captureResult.computedStyles;\n const figmaImage = bufferToBase64Url(figmaImageResult.data);\n\n // Compare the images\n const compareResult = await compareImages(\n renderedImage,\n figmaImage,\n threshold\n );\n\n // Build response\n const response: CompareResponse = {\n match: compareResult.matches,\n diffPercentage: compareResult.diffPercentage,\n threshold,\n rendered: renderedImage,\n figma: figmaImage,\n diff: compareResult.diffImage || renderedImage,\n figmaUrl: effectiveFigmaUrl,\n changedRegions: compareResult.changedRegions,\n };\n\n // Add style diff if requested\n if (includeStyleDiff && figmaDesignProps && renderedStyles) {\n const figmaStyles = figmaClient.convertToCSS(figmaDesignProps);\n // Convert CSSDesignProperties to Record<string, string | undefined>\n const figmaStylesRecord: Record<string, string | undefined> = { ...figmaStyles };\n const styleDiffResult = compareStyles(figmaStylesRecord, renderedStyles);\n response.styleDiff = styleDiffResult;\n\n // Update overall match to include style match\n if (!styleDiffResult.match) {\n response.match = false;\n }\n }\n\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify(response));\n } finally {\n pendingRenders.delete(requestId);\n }\n } catch (error) {\n console.error(\"[Fragments] Error comparing:\", error);\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error:\n error instanceof Error ? error.message : \"Compare failed\",\n })\n );\n }\n return;\n }\n\n // Handle /fragments/figma-styles endpoint for lightweight style fetching\n // This avoids the heavy Playwright rendering just to get styles\n if (req.url === \"/fragments/figma-styles\" && req.method === \"POST\") {\n try {\n const body = (await parseJsonBody(req)) as {\n figmaUrl: string;\n };\n\n const { figmaUrl } = body;\n\n if (!figmaUrl) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Missing figmaUrl\" }));\n return;\n }\n\n // Check for Figma access token\n const figmaToken =\n process.env.FIGMA_ACCESS_TOKEN || config.figmaToken;\n if (!figmaToken) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: \"No Figma access token configured\",\n suggestion:\n \"Set FIGMA_ACCESS_TOKEN env var or add figmaToken to fragments.config.ts\",\n })\n );\n return;\n }\n\n // Import Figma service\n const { FigmaClient } = await import(\"../service/index.js\");\n const figmaClient = new FigmaClient({ accessToken: figmaToken });\n\n // Parse Figma URL\n const { fileKey, nodeId } = figmaClient.parseUrl(figmaUrl);\n\n // Fetch design properties\n const figmaDesignProps = await figmaClient.getNodeProperties(\n fileKey,\n nodeId\n );\n const figmaStyles = figmaClient.convertToCSS(figmaDesignProps);\n\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify({ styles: figmaStyles }));\n } catch (error) {\n console.error(\"[Fragments] Error fetching Figma styles:\", error);\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error:\n error instanceof Error\n ? error.message\n : \"Failed to fetch Figma styles\",\n })\n );\n }\n return;\n }\n\n // Handle /fragments/tokens endpoint for token registry\n if (req.url?.startsWith(\"/fragments/tokens\")) {\n try {\n const url = new URL(req.url, \"http://localhost\");\n const format = url.searchParams.get(\"format\") || \"json\";\n const category = url.searchParams.get(\"category\");\n const theme = url.searchParams.get(\"theme\");\n\n // Check if tokens are configured\n if (!config.tokens || !config.tokens.include || config.tokens.include.length === 0) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({\n error: \"No token configuration found\",\n suggestion: \"Add 'tokens' config to fragments.config.ts with 'include' patterns for CSS/SCSS files\",\n example: {\n tokens: {\n include: [\"src/styles/theme.scss\", \"src/styles/variables.css\"],\n themeSelectors: { \":root\": \"default\", \"[data-theme='dark']\": \"dark\" },\n },\n },\n }));\n return;\n }\n\n // Import token registry\n const { getSharedTokenRegistry } = await import(\"../service/index.js\");\n const registry = getSharedTokenRegistry();\n\n // Initialize if not already\n if (!registry.isInitialized()) {\n await registry.initialize(config.tokens, projectRoot);\n }\n\n let tokens = registry.getAllTokens();\n\n // Filter by category if specified\n if (category) {\n tokens = tokens.filter(t => t.category === category);\n }\n\n // Filter by theme if specified\n if (theme) {\n tokens = tokens.filter(t => t.theme === theme || t.theme === \"default\");\n }\n\n const meta = registry.getMeta();\n\n if (format === \"summary\") {\n // Return summary only\n const summary = {\n totalTokens: meta?.totalTokens || 0,\n byCategory: {} as Record<string, number>,\n byTheme: {} as Record<string, number>,\n parseTimeMs: meta?.parseTimeMs || 0,\n sourceFiles: meta?.sourceFiles || [],\n };\n\n for (const token of registry.getAllTokens()) {\n summary.byCategory[token.category] = (summary.byCategory[token.category] || 0) + 1;\n summary.byTheme[token.theme] = (summary.byTheme[token.theme] || 0) + 1;\n }\n\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify(summary, null, 2));\n } else {\n // Return full token list\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify({\n tokens,\n meta,\n }, null, 2));\n }\n } catch (error) {\n console.error(\"[Fragments] Error fetching tokens:\", error);\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({\n error: error instanceof Error ? error.message : \"Failed to fetch tokens\",\n }));\n }\n return;\n }\n\n // Handle /fragments/token-match endpoint for reverse token lookup\n if (req.url === \"/fragments/token-match\" && req.method === \"POST\") {\n try {\n const body = (await parseJsonBody(req)) as {\n value: string;\n propertyType?: \"color\" | \"spacing\" | \"typography\" | \"other\";\n theme?: string;\n };\n\n const { value, propertyType, theme } = body;\n\n if (!value) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Missing required field: value\" }));\n return;\n }\n\n // Check if tokens are configured\n if (!config.tokens || !config.tokens.include || config.tokens.include.length === 0) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({\n error: \"No token configuration found\",\n suggestion: \"Add 'tokens' config to fragments.config.ts\",\n }));\n return;\n }\n\n // Import token registry\n const { getSharedTokenRegistry } = await import(\"../service/index.js\");\n const registry = getSharedTokenRegistry();\n\n // Initialize if not already\n if (!registry.isInitialized()) {\n await registry.initialize(config.tokens, projectRoot);\n }\n\n // Match the value\n const result = registry.matchValue({\n value,\n propertyType,\n theme,\n });\n\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify(result));\n } catch (error) {\n console.error(\"[Fragments] Error matching token:\", error);\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({\n error: error instanceof Error ? error.message : \"Failed to match token\",\n }));\n }\n return;\n }\n\n // Handle /fragments/compliance endpoint for token compliance checking\n if (req.url === \"/fragments/compliance\" && req.method === \"POST\") {\n try {\n const body = (await parseJsonBody(req)) as {\n component: string;\n variant?: string;\n theme?: string;\n };\n\n const { component, variant, theme = \"default\" } = body;\n\n if (!component) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Missing required field: component\" }));\n return;\n }\n\n // Check if tokens are configured\n if (!config.tokens || !config.tokens.include || config.tokens.include.length === 0) {\n // Return 100% compliance if no tokens configured (can't check)\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify({\n component,\n variant,\n compliance: 100,\n totalProperties: 0,\n hardcoded: 0,\n usingTokens: 0,\n violations: [],\n note: \"No token configuration found - token compliance checking disabled\",\n }));\n return;\n }\n\n // Load segment data\n const loadedSegments = await loadSegmentsForRender(segmentFiles, projectRoot);\n const segmentInfo = findSegmentByName(component, loadedSegments);\n\n if (!segmentInfo) {\n const available = getAvailableComponents(loadedSegments);\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({\n error: `Component '${component}' not found. Available: ${available.join(\", \")}`,\n }));\n return;\n }\n\n // Find segment file for rendering\n const segmentFile = segmentFiles.find(\n (f) => f.relativePath === segmentInfo.path\n );\n if (!segmentFile) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Could not resolve segment file path\" }));\n return;\n }\n\n // Import token registry\n const { getSharedTokenRegistry } = await import(\"../service/index.js\");\n const registry = getSharedTokenRegistry();\n\n // Initialize if not already\n if (!registry.isInitialized()) {\n await registry.initialize(config.tokens, projectRoot);\n }\n\n // Get server port\n const address = _server.httpServer?.address();\n const port = typeof address === \"object\" && address ? address.port : 6006;\n const renderViewport = { width: 800, height: 600 };\n\n // Generate render script and capture with styles\n const renderScript = generateRenderScript(\n segmentFile.absolutePath,\n segmentInfo.name,\n {}\n );\n const requestId = Date.now().toString(36) + Math.random().toString(36).slice(2);\n pendingRenders.set(requestId, { script: renderScript, viewport: renderViewport });\n\n try {\n // Render the component and extract computed styles\n const captureResult = await captureRenderWithStyles(\n `http://localhost:${port}/fragments/__render__/${requestId}`,\n renderViewport,\n true // extractStyles = true\n );\n\n const computedStyles = captureResult.computedStyles || {};\n\n // Convert computed styles to style diff format for calculateUsageSummary\n const styleDiffs: Array<{\n property: string;\n figma: string;\n rendered: string;\n match: boolean;\n }> = [];\n\n // Check each computed style property\n for (const [property, value] of Object.entries(computedStyles)) {\n if (!value) continue;\n\n // Try to find a matching token\n const matchResult = registry.matchValue({\n value,\n propertyType: property.toLowerCase().includes(\"color\") ? \"color\" :\n property.toLowerCase().includes(\"font\") ? \"typography\" :\n property.toLowerCase().includes(\"spacing\") || property.toLowerCase().includes(\"padding\") || property.toLowerCase().includes(\"margin\") ? \"spacing\" : undefined,\n theme,\n });\n\n // If we found an exact match, the value is using a token\n const isUsingToken = matchResult.exactMatches.length > 0;\n\n styleDiffs.push({\n property,\n figma: value, // Use the value as both figma and rendered for self-comparison\n rendered: value,\n match: isUsingToken,\n });\n }\n\n // Calculate compliance using token registry\n const usageSummary = registry.calculateUsageSummary(styleDiffs, theme);\n\n // Build violations list from hardcoded properties\n interface ViolationItem {\n property: string;\n issue: string;\n severity: \"error\" | \"warning\";\n suggestion?: string;\n expected?: string;\n actual?: string;\n }\n\n const violations: ViolationItem[] = usageSummary.hardcodedProperties.map(hp => {\n const suggestion = hp.suggestedFix\n ? `Use ${hp.suggestedFix.tokenName} (${hp.suggestedFix.tokenValue})`\n : undefined;\n\n return {\n property: hp.property,\n issue: `Hardcoded value \"${hp.rendered}\" should use a design token`,\n severity: \"warning\" as const,\n suggestion,\n expected: hp.figmaToken,\n actual: hp.rendered,\n };\n });\n\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify({\n component,\n variant,\n compliance: usageSummary.compliancePercent,\n totalProperties: usageSummary.totalProperties,\n hardcoded: usageSummary.hardcoded,\n usingTokens: usageSummary.usingTokens,\n violations,\n }));\n } finally {\n pendingRenders.delete(requestId);\n }\n } catch (error) {\n console.error(\"[Fragments] Error checking compliance:\", error);\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({\n error: error instanceof Error ? error.message : \"Compliance check failed\",\n }));\n }\n return;\n }\n\n // Handle /fragments/context endpoint for AI context generation\n if (req.url?.startsWith(\"/fragments/context\")) {\n try {\n const url = new URL(req.url, \"http://localhost\");\n const format = (url.searchParams.get(\"format\") || \"markdown\") as\n | \"markdown\"\n | \"json\";\n const compact = url.searchParams.get(\"compact\") === \"true\";\n\n // Load all segments from BRAND.outFile\n const compiledSegments = await loadSegmentsForContext(\n _server,\n segmentFiles,\n config,\n projectRoot\n );\n\n const { content, tokenEstimate } = generateContext(\n compiledSegments,\n {\n format,\n compact,\n include: {\n code: url.searchParams.get(\"code\") === \"true\",\n relations: url.searchParams.get(\"relations\") === \"true\",\n },\n }\n );\n\n res.setHeader(\"X-Token-Estimate\", String(tokenEstimate));\n res.setHeader(\n \"Content-Type\",\n format === \"json\"\n ? \"application/json\"\n : \"text/markdown; charset=utf-8\"\n );\n res.end(content);\n } catch (error) {\n console.error(\"[Fragments] Error generating context:\", error);\n res.writeHead(500, { \"Content-Type\": \"text/plain\" });\n res.end(\n \"Error generating context: \" +\n (error instanceof Error ? error.message : error)\n );\n }\n return;\n }\n\n // Handle /fragments/save endpoint for saving fragment metadata\n if (req.url === \"/fragments/save\" && req.method === \"POST\") {\n try {\n const body = await parseJsonBody(req);\n const { componentName, fragment } = body as {\n componentName: string;\n fragment: Record<string, unknown>;\n };\n\n if (!componentName || !fragment) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: \"Missing required fields: componentName, fragment\",\n })\n );\n return;\n }\n\n // Import writeFile for saving\n const { writeFile, mkdir } = await import(\"node:fs/promises\");\n const { join } = await import(\"node:path\");\n const { BRAND } = await import(\"../core/index.js\");\n\n // Ensure .fragments/components directory exists\n const fragmentsDir = join(projectRoot, BRAND.dataDir, BRAND.componentsDir);\n await mkdir(fragmentsDir, { recursive: true });\n\n // Write fragment file\n const fragmentPath = join(\n fragmentsDir,\n `${componentName}${BRAND.fileExtension}`\n );\n await writeFile(\n fragmentPath,\n JSON.stringify(fragment, null, 2),\n \"utf-8\"\n );\n\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify({ success: true, path: fragmentPath }));\n } catch (error) {\n console.error(\"[Fragments] Error saving fragment:\", error);\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(\n JSON.stringify({\n error: error instanceof Error ? error.message : \"Save failed\",\n })\n );\n }\n return;\n }\n\n // Handle /fragments/fix endpoint for generating token fix patches\n if (req.url === \"/fragments/fix\" && req.method === \"POST\") {\n try {\n const body = (await parseJsonBody(req)) as {\n component: string;\n variant?: string;\n fixType?: \"token\" | \"all\";\n };\n\n const { component, variant, fixType = \"all\" } = body;\n\n if (!component) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Missing required field: component\" }));\n return;\n }\n\n // Check if tokens are configured\n if (!config.tokens || !config.tokens.include || config.tokens.include.length === 0) {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({\n error: \"No token configuration found\",\n suggestion: \"Add 'tokens' config to fragments.config.ts to enable fix generation\",\n }));\n return;\n }\n\n // Load segment data\n const loadedSegments = await loadSegmentsForRender(segmentFiles, projectRoot);\n const segmentInfo = findSegmentByName(component, loadedSegments);\n\n if (!segmentInfo) {\n const available = getAvailableComponents(loadedSegments);\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({\n error: `Component '${component}' not found. Available: ${available.join(\", \")}`,\n }));\n return;\n }\n\n // Import services\n const {\n getSharedTokenRegistry,\n generateTokenPatches,\n } = await import(\"../service/index.js\");\n const registry = getSharedTokenRegistry();\n\n // Initialize token registry if not already\n if (!registry.isInitialized()) {\n await registry.initialize(config.tokens, projectRoot);\n }\n\n // For now, we generate patches based on style diff data\n // In a full implementation, we would:\n // 1. Render the component and get computed styles\n // 2. Compare with Figma styles to find hardcoded values\n // 3. Generate patches for each hardcoded value\n\n // Get source file path from segment\n const segmentFile = segmentFiles.find(\n (f) => f.relativePath === segmentInfo.path\n );\n const sourceFile = segmentFile?.relativePath || `${component}.tsx`;\n\n // For demonstration, we'll create a placeholder response\n // In production, this would use style comparison + AST patching\n const result = generateTokenPatches(\n component,\n [], // Would be populated by actual style diffs\n registry,\n { sourceFile }\n );\n\n res.setHeader(\"Content-Type\", \"application/json\");\n res.end(JSON.stringify({\n patches: result.patches,\n summary: result.summary,\n fixableCount: result.fixableCount,\n unfixableCount: result.unfixableCount,\n }));\n } catch (error) {\n console.error(\"[Fragments] Error generating fixes:\", error);\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({\n error: error instanceof Error ? error.message : \"Fix generation failed\",\n }));\n }\n return;\n }\n\n // Handle /fragments/preview/ - isolated iframe for component previews\n if (req.url?.startsWith(\"/fragments/preview\")) {\n // Redirect to trailing slash\n if (req.url === \"/fragments/preview\") {\n res.writeHead(302, { Location: \"/fragments/preview/\" });\n res.end();\n return;\n }\n\n // Serve the preview frame HTML\n await servePreviewFrameHTML(res, _server);\n return;\n }\n\n if (req.url === \"/segments\" || req.url === \"/fragments/\") {\n // Redirect to /fragments/\n if (!req.url.endsWith(\"/\")) {\n res.writeHead(302, { Location: \"/fragments/\" });\n res.end();\n return;\n }\n\n // Serve the viewer HTML\n serveViewerHTML(res, _server);\n return;\n }\n\n next();\n });\n\n // Log startup message\n _server.httpServer?.once(\"listening\", () => {\n const address = _server.httpServer?.address();\n const port =\n typeof address === \"object\" && address ? address.port : 6006;\n console.log(\n `\\n š¦ Fragments Viewer: http://localhost:${port}/fragments/\\n`\n );\n });\n },\n\n // Resolve virtual modules\n resolveId(id) {\n if (id === VIRTUAL_SEGMENTS) {\n return VIRTUAL_SEGMENTS_RESOLVED;\n }\n if (id === VIRTUAL_VIEWER_ENTRY) {\n return VIRTUAL_VIEWER_ENTRY_RESOLVED;\n }\n if (id === VIRTUAL_PREVIEW) {\n return VIRTUAL_PREVIEW_RESOLVED;\n }\n return null;\n },\n\n // Load virtual modules\n load(id) {\n if (id === VIRTUAL_SEGMENTS_RESOLVED) {\n return generateSegmentsModule(segmentFiles, config, previewConfigPath);\n }\n if (id === VIRTUAL_VIEWER_ENTRY_RESOLVED) {\n return generateViewerEntry();\n }\n if (id === VIRTUAL_PREVIEW_RESOLVED) {\n return generatePreviewModule(previewConfigPath);\n }\n return null;\n },\n\n // Handle HMR for segment files\n handleHotUpdate({ file, server }) {\n if (segmentFileSet.has(file)) {\n // Invalidate the virtual segments module\n const mod = server.moduleGraph.getModuleById(VIRTUAL_SEGMENTS_RESOLVED);\n if (mod) {\n server.moduleGraph.invalidateModule(mod);\n }\n\n // Send HMR update\n server.ws.send({\n type: \"custom\",\n event: \"segments:update\",\n data: { file },\n });\n\n // Return empty array to prevent full reload\n // The component HMR will handle the actual update\n return [];\n }\n },\n };\n\n // Plugin to transform JSX in .js files (common in Storybook preview.js)\n // Uses the `load` hook instead of `transform` because we need to intercept\n // the file BEFORE Vite's import-analysis tries to parse it\n const jsxTransformPlugin: Plugin = {\n name: \"segments-jsx-transform\",\n enforce: \"pre\",\n async load(id) {\n // Only handle .js files that might contain JSX (like preview.js)\n if (!id.endsWith(\".js\")) return null;\n\n // Only handle .storybook directory files (most common case for JSX in .js)\n if (!id.includes(\".storybook\")) return null;\n\n // Read the file content\n const fs = await import(\"node:fs/promises\");\n let code: string;\n try {\n code = await fs.readFile(id, \"utf-8\");\n } catch {\n return null;\n }\n\n // Check if the file contains JSX syntax\n const hasOpeningTag = code.includes(\"<\");\n const hasSelfClosingTag = code.includes(\"/>\");\n const hasClosingTag = code.includes(\"</\");\n\n // Skip if no JSX detected\n if (!hasOpeningTag || (!hasSelfClosingTag && !hasClosingTag)) return null;\n\n try {\n const result = await transform(code, {\n loader: \"jsx\",\n jsx: \"automatic\",\n sourcefile: id,\n sourcemap: true,\n });\n return {\n code: result.code,\n map: result.map,\n };\n } catch (error) {\n // Log error for debugging but don't block\n console.warn(`[Fragments] JSX transform failed for ${id}:`, error instanceof Error ? error.message : error);\n return null;\n }\n },\n };\n\n // Return array of plugins including SVGR for SVG imports\n return [\n // JSX transform for .js files (must run first)\n jsxTransformPlugin,\n // SVGR plugin to handle `import { ReactComponent } from \"*.svg\"` pattern\n svgr({\n svgrOptions: {\n exportType: \"named\", // Export as { ReactComponent }\n },\n include: \"**/*.svg\",\n }),\n // Main segments plugin\n mainPlugin,\n ];\n}\n\n/**\n * Check if a file path is a Storybook story file\n */\nfunction isStoryFile(filePath: string): boolean {\n return /\\.stories\\.(tsx?|jsx?)$/.test(filePath);\n}\n\n/**\n * Get the base component path from a segment or story file path.\n * e.g., \"src/components/Button/Button.segment.tsx\" -> \"src/components/Button/Button\"\n * e.g., \"src/components/Button/Button.stories.tsx\" -> \"src/components/Button/Button\"\n */\nfunction getBaseComponentPath(filePath: string): string {\n return filePath.replace(/\\.(segment|stories)\\.(tsx?|jsx?)$/, \"\");\n}\n\n/**\n * Generate the virtual segments module.\n * Uses dynamic imports for lazy loading - segments are loaded on demand.\n * Supports both native .segment.tsx files and Storybook .stories.tsx files.\n * Integrates Storybook preview config for global decorators, parameters, etc.\n *\n * MERGE STRATEGY: When both .segment.tsx and .stories.tsx exist for the same component:\n * - Use .stories.tsx for RENDERING (variants, props, etc.) - it's the source of truth\n * - Merge METADATA from .segment.tsx (Figma URLs, AI descriptions, usage guidelines)\n * - This gives us the best of both worlds: working renders + rich metadata\n */\nfunction generateSegmentsModule(\n segmentFiles: Array<{ absolutePath: string; relativePath: string }>,\n config: SegmentsConfig,\n previewConfigPath: string | null\n): string {\n // Group files by base component path to identify pairs\n const filesByBasePath = new Map<string, {\n storyFile?: { absolutePath: string; relativePath: string };\n segmentFile?: { absolutePath: string; relativePath: string };\n }>();\n\n for (const file of segmentFiles) {\n const basePath = getBaseComponentPath(file.relativePath);\n const isStory = isStoryFile(file.relativePath);\n\n const existing = filesByBasePath.get(basePath) || {};\n\n if (isStory) {\n existing.storyFile = file;\n } else {\n existing.segmentFile = file;\n }\n\n filesByBasePath.set(basePath, existing);\n }\n\n // Generate loaders with metadata merge support\n // Priority: stories for rendering, segment for metadata (Figma URLs, etc.)\n const loaders = Array.from(filesByBasePath.values())\n .map((files) => {\n // Determine which file to use for rendering\n const primaryFile = files.storyFile || files.segmentFile;\n if (!primaryFile) return null;\n\n const isStory = !!files.storyFile;\n\n // If we have both, include the segment file path for metadata merge\n const metadataPath = (files.storyFile && files.segmentFile)\n ? files.segmentFile.absolutePath\n : null;\n\n return ` {\n path: \"${primaryFile.relativePath}\",\n isStory: ${isStory},\n loader: () => import(\"${primaryFile.absolutePath}\"),\n metadataLoader: ${metadataPath ? `() => import(\"${metadataPath}\")` : 'null'}\n }`;\n })\n .filter(Boolean)\n .join(\",\\n\");\n\n // Generate preview config import if available\n const previewImport = previewConfigPath\n ? `import * as previewConfig from \"virtual:segments-preview\";`\n : \"\";\n const previewSetup = previewConfigPath\n ? `\n// Set global preview config before loading segments\nsetPreviewConfig({\n decorators: previewConfig.decorators,\n parameters: previewConfig.parameters,\n globalTypes: previewConfig.globalTypes,\n args: previewConfig.args,\n argTypes: previewConfig.argTypes,\n loaders: previewConfig.loaders,\n});\n`\n : \"\";\n\n return `\nimport { storyModuleToSegment, setPreviewConfig } from \"@fragments/core\";\n${previewImport}\n${previewSetup}\n// Lazy segment loaders (supports both .segment.tsx and .stories.tsx)\nconst segmentLoaders = [\n${loaders}\n];\n\n// Cache for loaded segments\nconst loadedSegments = new Map();\n\n/**\n * Merge metadata from a segment file into a story-based segment.\n * This preserves Figma URLs and other AI-agent focused data.\n */\nfunction mergeMetadata(segment, metadataModule) {\n if (!metadataModule?.default) return segment;\n\n const metadata = metadataModule.default;\n\n // Merge meta-level Figma URL\n if (metadata.meta?.figma && !segment.meta.figma) {\n segment.meta.figma = metadata.meta.figma;\n }\n\n // Merge description if not present\n if (metadata.meta?.description && !segment.meta.description) {\n segment.meta.description = metadata.meta.description;\n }\n\n // Merge variant-level Figma URLs\n if (metadata.variants && segment.variants) {\n for (const metaVariant of metadata.variants) {\n const segmentVariant = segment.variants.find(v => v.name === metaVariant.name);\n if (segmentVariant && metaVariant.figma && !segmentVariant.figma) {\n segmentVariant.figma = metaVariant.figma;\n }\n }\n }\n\n return segment;\n}\n\n// Load all segments (for initial render)\n// Gracefully handles individual failures - one bad story won't break all segments\nexport async function loadAllSegments() {\n const results = await Promise.all(\n segmentLoaders.map(async (loader) => {\n try {\n if (loadedSegments.has(loader.path)) {\n const cached = loadedSegments.get(loader.path);\n return cached ? { path: loader.path, segment: cached } : null;\n }\n\n const module = await loader.loader();\n\n // Convert story modules to segments at runtime\n let segment;\n if (loader.isStory) {\n segment = storyModuleToSegment(module, loader.path);\n // storyModuleToSegment returns null for stories without a component\n if (!segment) {\n loadedSegments.set(loader.path, null);\n return null;\n }\n } else {\n segment = module.default;\n }\n\n // Merge metadata from corresponding segment file if available\n if (loader.metadataLoader) {\n try {\n const metadataModule = await loader.metadataLoader();\n segment = mergeMetadata(segment, metadataModule);\n } catch (metaError) {\n // Metadata loading is optional - don't fail if it errors\n console.warn(\"[Fragments] Could not load metadata for \" + loader.path + \":\", metaError.message);\n }\n }\n\n loadedSegments.set(loader.path, segment);\n return { path: loader.path, segment };\n } catch (error) {\n console.warn(\"[Fragments] Failed to load \" + loader.path + \":\", error.message);\n return null;\n }\n })\n );\n // Filter out failed loads\n return results.filter(r => r !== null);\n}\n\n// Load a single segment by path\nexport async function loadSegment(path) {\n const loader = segmentLoaders.find(l => l.path === path);\n if (!loader) return null;\n\n if (loadedSegments.has(path)) {\n return loadedSegments.get(path);\n }\n\n const module = await loader.loader();\n\n // Convert story modules to segments at runtime\n let segment;\n if (loader.isStory) {\n segment = storyModuleToSegment(module, path);\n } else {\n segment = module.default;\n }\n\n // Merge metadata from corresponding segment file if available\n if (loader.metadataLoader && segment) {\n try {\n const metadataModule = await loader.metadataLoader();\n segment = mergeMetadata(segment, metadataModule);\n } catch (metaError) {\n console.warn(\"[Fragments] Could not load metadata for \" + path + \":\", metaError.message);\n }\n }\n\n loadedSegments.set(path, segment);\n return segment;\n}\n\n// For backwards compatibility, load all segments synchronously on import\n// This is still lazy per-file but awaited at module load\nlet segments = [];\nconst segmentsPromise = loadAllSegments().then(s => { segments = s; return s; });\n\nexport { segments, segmentsPromise };\nexport const config = ${JSON.stringify(config)};\n\n// HMR support\nif (import.meta.hot) {\n import.meta.hot.accept();\n\n import.meta.hot.on(\"segments:update\", (data) => {\n console.log(\"[Fragments] File updated:\", data.file);\n // Clear cache for the updated file (handles both .segment and .stories)\n for (const [path, _] of loadedSegments) {\n const basePath = path.replace(/\\\\.(segment|stories)\\\\.tsx?$/, '');\n if (data.file.includes(basePath)) {\n loadedSegments.delete(path);\n }\n }\n // Trigger re-render in viewer\n window.dispatchEvent(new CustomEvent(\"segments:update\"));\n });\n}\n`;\n}\n\n/**\n * Generate the viewer entry point.\n */\nfunction generateViewerEntry(): string {\n return `\nimport { segments, config } from \"virtual:segments\";\n\n// Re-export for viewer\nexport { segments, config };\n\n// Initialize viewer\nconsole.log(\"[Fragments] Loaded\", segments.length, \"segment(s)\");\n`;\n}\n\n/**\n * Load segments for context generation.\n * Uses BRAND.outFile to avoid SSR module loading issues with React CJS modules.\n */\nasync function loadSegmentsForContext(\n _server: ViteDevServer,\n _segmentFiles: Array<{ absolutePath: string; relativePath: string }>,\n _config: SegmentsConfig,\n configDir?: string\n): Promise<CompiledSegment[]> {\n const { join } = await import(\"node:path\");\n\n // Read from outFile (avoids SSR issues with React CJS)\n const segmentsJsonPath = join(configDir || process.cwd(), BRAND.outFile);\n\n try {\n const content = await readFile(segmentsJsonPath, \"utf-8\");\n const data = JSON.parse(content) as {\n segments: Record<string, CompiledSegment>;\n };\n\n return Object.values(data.segments || {});\n } catch (error) {\n console.warn(\n `[${BRAND.name}] Failed to load ${BRAND.outFile} for context:`,\n error\n );\n console.warn(`[${BRAND.name}] Run '${BRAND.cliCommand} build' to generate ${BRAND.outFile}`);\n return [];\n }\n}\n\n/**\n * Serve the viewer HTML page.\n */\nasync function serveViewerHTML(res: any, server: ViteDevServer): Promise<void> {\n const viewerRoot = resolve(__dirname, \"..\");\n const entryPath = resolve(viewerRoot, \"src/entry.tsx\");\n\n try {\n // Read the viewer HTML template\n let html = await readFile(resolve(viewerRoot, \"index.html\"), \"utf-8\");\n\n // Rewrite the entry.tsx path to use absolute path to viewer package\n html = html.replace(\"/src/entry.tsx\", entryPath);\n\n // Transform HTML through Vite's pipeline\n html = await server.transformIndexHtml(\"/fragments/\", html);\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(html);\n } catch (error) {\n console.error(\"[Fragments] Error serving viewer:\", error);\n res.writeHead(500, { \"Content-Type\": \"text/plain\" });\n res.end(\"Error loading Segments viewer\");\n }\n}\n\n/**\n * Serve the isolated preview frame HTML page.\n * This is used for iframe-based component preview with CSS isolation.\n */\nasync function servePreviewFrameHTML(res: any, server: ViteDevServer): Promise<void> {\n const viewerRoot = resolve(__dirname, \"..\");\n const entryPath = resolve(viewerRoot, \"src/preview-frame-entry.tsx\");\n\n try {\n // Read the preview frame HTML template\n let html = await readFile(resolve(viewerRoot, \"src/preview-frame.html\"), \"utf-8\");\n\n // Rewrite the entry path to use absolute path to viewer package\n html = html.replace(\"/src/preview-frame-entry.tsx\", entryPath);\n\n // Transform HTML through Vite's pipeline\n html = await server.transformIndexHtml(\"/fragments/preview/\", html);\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(html);\n } catch (error) {\n console.error(\"[Fragments] Error serving preview frame:\", error);\n res.writeHead(500, { \"Content-Type\": \"text/plain\" });\n res.end(\"Error loading preview frame\");\n }\n}\n\n/**\n * Parse JSON body from an HTTP request.\n */\nasync function parseJsonBody(req: any): Promise<unknown> {\n return new Promise((resolve, reject) => {\n let body = \"\";\n req.on(\"data\", (chunk: Buffer) => {\n body += chunk.toString();\n });\n req.on(\"end\", () => {\n try {\n resolve(JSON.parse(body));\n } catch (error) {\n reject(new Error(\"Invalid JSON body\"));\n }\n });\n req.on(\"error\", reject);\n });\n}\n\n/**\n * Load segments for render from BRAND.outFile or by building on-the-fly.\n * This avoids SSR issues with React components.\n */\nasync function loadSegmentsForRender(\n segmentFiles: Array<{ absolutePath: string; relativePath: string }>,\n configDir: string\n): Promise<Array<{ path: string; segment: { meta: { name: string } } }>> {\n const { join } = await import(\"node:path\");\n\n // Try to read from the project directory\n const segmentsJsonPath = join(configDir, BRAND.outFile);\n\n try {\n const content = await readFile(segmentsJsonPath, \"utf-8\");\n const data = JSON.parse(content) as {\n segments: Record<string, { filePath: string; meta: { name: string } }>;\n };\n\n // Convert to the expected format if we have entries\n const segmentEntries = Object.values(data.segments || {});\n if (segmentEntries.length > 0) {\n return segmentEntries.map((segment) => ({\n path: segment.filePath,\n segment: { meta: { name: segment.meta.name } },\n }));\n }\n // Fall through to file-based extraction if outFile is empty\n } catch {\n // outFile doesn't exist or is invalid - fall through to file-based extraction\n }\n\n // Extract component names from file paths (fallback)\n return segmentFiles.map((f) => {\n let name: string;\n if (isStoryFile(f.relativePath)) {\n // Extract name from path like \"src/components/Button/Button.stories.tsx\"\n const match = f.relativePath.match(/\\/([^/]+)\\.stories\\./);\n name = match ? match[1] : f.relativePath;\n } else {\n // Extract name from path like \"src/components/Button/Button.segment.tsx\"\n const match = f.relativePath.match(/\\/([^/]+)\\.segment\\./);\n name = match ? match[1] : f.relativePath;\n }\n return {\n path: f.relativePath,\n segment: { meta: { name } },\n };\n });\n}\n\n/**\n * Serve the render HTML page for AI preview.\n */\nasync function serveRenderHTML(\n res: any,\n server: ViteDevServer,\n renderScript: string\n): Promise<void> {\n const viewerRoot = resolve(__dirname, \"..\");\n\n try {\n // Read the render template\n let html = await readFile(\n resolve(viewerRoot, \"src/render-template.html\"),\n \"utf-8\"\n );\n\n // Inject the render script\n html = html.replace(\n \"<!-- RENDER_SCRIPT_PLACEHOLDER -->\",\n `<script type=\"module\">${renderScript}</script>`\n );\n\n // Transform HTML through Vite's pipeline to process imports\n // Use a unique URL to prevent Vite from caching the transformed HTML\n const uniqueUrl = `/fragments/__render__/${Date.now()}`;\n html = await server.transformIndexHtml(uniqueUrl, html);\n\n res.writeHead(200, { \"Content-Type\": \"text/html\" });\n res.end(html);\n } catch (error) {\n console.error(\"[Fragments] Error serving render page:\", error);\n res.writeHead(500, { \"Content-Type\": \"text/plain\" });\n res.end(\"Error loading render page\");\n }\n}\n\n/**\n * Capture a render using the shared browser pool from @fragments/service.\n * Uses a shared pool for efficiency - browser stays warm across requests.\n */\nasync function captureRender(\n url: string,\n viewport: { width: number; height: number }\n): Promise<string> {\n const { pool, bufferToBase64Url } = await getSharedRenderPool();\n\n const ctx = await pool.acquire();\n const page = await ctx.newPage();\n\n try {\n // Set viewport for this specific render\n await page.setViewportSize(viewport);\n\n // Navigate to the render page\n await page.goto(url, { waitUntil: \"networkidle\" });\n\n // Wait for render to complete (indicated by ready class or timeout)\n await page.waitForFunction(\n () => (window as any).__RENDER_READY__ === true,\n { timeout: 10000 }\n );\n\n // Check for render error\n const error = await page.evaluate(() => (window as any).__RENDER_ERROR__);\n if (error) {\n throw new Error(`Render error: ${error}`);\n }\n\n // Screenshot the render root element\n const element = await page.$(\"#render-root\");\n if (!element) {\n throw new Error(\"Render root element not found\");\n }\n\n const screenshot = await element.screenshot({ type: \"png\" });\n\n return bufferToBase64Url(screenshot);\n } finally {\n await page.close();\n pool.release(ctx);\n }\n}\n\n/**\n * Capture a render with optional computed styles extraction.\n * Uses the shared browser pool for efficiency.\n */\nasync function captureRenderWithStyles(\n url: string,\n viewport: { width: number; height: number },\n extractStyles: boolean\n): Promise<{ screenshot: string; computedStyles: Record<string, string> | null }> {\n const { pool, bufferToBase64Url } = await getSharedRenderPool();\n\n const ctx = await pool.acquire();\n const page = await ctx.newPage();\n\n try {\n // Set viewport for this specific render\n await page.setViewportSize(viewport);\n\n await page.goto(url, { waitUntil: \"networkidle\" });\n\n await page.waitForFunction(\n () => (window as any).__RENDER_READY__ === true,\n { timeout: 10000 }\n );\n\n const error = await page.evaluate(() => (window as any).__RENDER_ERROR__);\n if (error) {\n throw new Error(`Render error: ${error}`);\n }\n\n const element = await page.$(\"#render-root\");\n if (!element) {\n throw new Error(\"Render root element not found\");\n }\n\n // Extract computed styles if requested\n let computedStyles: Record<string, string> | null = null;\n if (extractStyles) {\n computedStyles = await page.evaluate(() => {\n const root = document.getElementById(\"render-root\");\n if (!root) return null;\n\n // Helper function to check if a color is visible (not transparent)\n const isVisibleColor = (color: string | undefined): boolean => {\n if (!color) return false;\n if (color === \"transparent\") return false;\n if (color === \"rgba(0, 0, 0, 0)\") return false;\n if (color.includes(\"rgba\") && color.includes(\", 0)\")) return false;\n return true;\n };\n\n // Helper to extract styles from an element\n const extractStylesFromElement = (el: HTMLElement): Record<string, string> => {\n const styles = window.getComputedStyle(el);\n const relevantProps = [\n \"backgroundColor\",\n \"borderColor\",\n \"borderWidth\",\n \"borderRadius\",\n \"fontFamily\",\n \"fontSize\",\n \"fontWeight\",\n \"lineHeight\",\n \"letterSpacing\",\n \"textAlign\",\n \"boxShadow\",\n \"padding\",\n \"paddingTop\",\n \"paddingRight\",\n \"paddingBottom\",\n \"paddingLeft\",\n \"gap\",\n \"opacity\",\n \"width\",\n \"height\",\n ];\n\n const result: Record<string, string> = {};\n for (const prop of relevantProps) {\n const value = styles.getPropertyValue(\n prop.replace(/([A-Z])/g, \"-$1\").toLowerCase()\n );\n if (value) {\n result[prop] = value;\n }\n }\n return result;\n };\n\n // Strategy: Find the element with the most visible styles\n // Start by looking at all elements and score them based on visual presence\n const candidates = root.querySelectorAll(\"*\");\n let bestElement: HTMLElement | null = null;\n let bestScore = -1;\n\n for (const el of candidates) {\n const htmlEl = el as HTMLElement;\n const styles = window.getComputedStyle(htmlEl);\n let score = 0;\n\n // Score based on visual properties\n const bg = styles.backgroundColor;\n if (isVisibleColor(bg)) {\n score += 10; // Visible background is a strong signal\n }\n\n const border = styles.borderWidth;\n if (border && border !== \"0px\") {\n score += 3;\n }\n\n const boxShadow = styles.boxShadow;\n if (boxShadow && boxShadow !== \"none\") {\n score += 3;\n }\n\n // Bonus for being an interactive element\n const tagName = htmlEl.tagName.toLowerCase();\n if ([\"button\", \"a\", \"input\", \"select\", \"textarea\"].includes(tagName)) {\n score += 5;\n }\n\n // Bonus for having role=\"button\"\n if (htmlEl.getAttribute(\"role\") === \"button\") {\n score += 5;\n }\n\n // Penalty for being too small (likely not the main component)\n const rect = htmlEl.getBoundingClientRect();\n if (rect.width < 10 || rect.height < 10) {\n score -= 10;\n }\n\n // Penalty for very large elements (likely containers)\n if (rect.width > 500 || rect.height > 500) {\n score -= 3;\n }\n\n if (score > bestScore) {\n bestScore = score;\n bestElement = htmlEl;\n }\n }\n\n // If we still have no good element, fall back to first child\n if (!bestElement) {\n bestElement = root.firstElementChild as HTMLElement | null;\n }\n\n if (!bestElement) return null;\n\n const result = extractStylesFromElement(bestElement);\n\n // Normalize padding into shorthand if individual values exist\n if (result.paddingTop && result.paddingRight && result.paddingBottom && result.paddingLeft) {\n const t = result.paddingTop;\n const r = result.paddingRight;\n const b = result.paddingBottom;\n const l = result.paddingLeft;\n if (t === r && r === b && b === l) {\n result.padding = t;\n } else if (t === b && r === l) {\n result.padding = `${t} ${r}`;\n } else {\n result.padding = `${t} ${r} ${b} ${l}`;\n }\n }\n\n return result;\n });\n }\n\n const screenshot = await element.screenshot({ type: \"png\" });\n\n return {\n screenshot: bufferToBase64Url(screenshot),\n computedStyles,\n };\n } finally {\n await page.close();\n pool.release(ctx);\n }\n}\n\n/**\n * Load full segment data to get figma URL from segment or variant.\n * Uses BRAND.outFile to avoid SSR module loading issues with React CJS modules.\n */\nasync function loadFullSegmentForCompare(\n _server: ViteDevServer,\n _segmentFiles: Array<{ absolutePath: string; relativePath: string }>,\n componentName: string,\n variantName?: string,\n configDir?: string\n): Promise<{ figmaUrl?: string } | null> {\n const { join } = await import(\"node:path\");\n\n // Try to read from outFile (avoids SSR issues with React CJS)\n const segmentsJsonPath = join(configDir || process.cwd(), BRAND.outFile);\n\n try {\n const content = await readFile(segmentsJsonPath, \"utf-8\");\n const data = JSON.parse(content) as {\n segments: Record<\n string,\n {\n meta: { name: string; figma?: string };\n variants?: Array<{ name: string; figma?: string }>;\n }\n >;\n };\n\n const segment = data.segments[componentName];\n if (!segment) {\n return null;\n }\n\n // Priority: variant.figma > meta.figma\n if (variantName && segment.variants) {\n const variant = segment.variants.find((v) => v.name === variantName);\n if (variant?.figma) {\n return { figmaUrl: variant.figma };\n }\n }\n\n // Fall back to meta.figma\n if (segment.meta.figma) {\n return { figmaUrl: segment.meta.figma };\n }\n\n return null;\n } catch {\n // outFile not found or invalid\n console.warn(\n `[${BRAND.name}] ${BRAND.outFile} not found, run '${BRAND.cliCommand} build' first`\n );\n return null;\n }\n}\n\n/**\n * Compare two base64 images and return diff result.\n */\nasync function compareImages(\n image1Base64: string,\n image2Base64: string,\n threshold: number\n): Promise<{\n matches: boolean;\n diffPercentage: number;\n diffImage?: string;\n changedRegions: Array<{\n x: number;\n y: number;\n width: number;\n height: number;\n }>;\n}> {\n const { DiffEngine, base64UrlToBuffer, bufferToBase64Url } = await import(\n \"../service/index.js\"\n );\n const { PNG } = await import(\"pngjs\");\n\n // Convert base64 to buffers\n const buffer1 = base64UrlToBuffer(image1Base64);\n const buffer2 = base64UrlToBuffer(image2Base64);\n\n // Parse PNGs to get dimensions\n const png1 = PNG.sync.read(buffer1);\n const png2 = PNG.sync.read(buffer2);\n\n // If dimensions don't match, resize the smaller one to match the larger\n let finalBuffer1 = buffer1;\n let finalBuffer2 = buffer2;\n\n if (png1.width !== png2.width || png1.height !== png2.height) {\n // Resize to the larger dimensions by padding the smaller image\n const targetWidth = Math.max(png1.width, png2.width);\n const targetHeight = Math.max(png1.height, png2.height);\n\n if (png1.width !== targetWidth || png1.height !== targetHeight) {\n finalBuffer1 = await resizePng(\n buffer1,\n png1.width,\n png1.height,\n targetWidth,\n targetHeight\n );\n }\n if (png2.width !== targetWidth || png2.height !== targetHeight) {\n finalBuffer2 = await resizePng(\n buffer2,\n png2.width,\n png2.height,\n targetWidth,\n targetHeight\n );\n }\n }\n\n // Create Screenshot-like objects for DiffEngine\n const screenshot1 = {\n data: finalBuffer1,\n hash: \"\",\n viewport: { width: png1.width, height: png1.height },\n capturedAt: new Date(),\n metadata: {\n component: \"\",\n variant: \"\",\n theme: \"light\" as const,\n renderTimeMs: 0,\n captureTimeMs: 0,\n },\n };\n\n const screenshot2 = {\n data: finalBuffer2,\n hash: \"\",\n viewport: { width: png2.width, height: png2.height },\n capturedAt: new Date(),\n metadata: {\n component: \"\",\n variant: \"\",\n theme: \"light\" as const,\n renderTimeMs: 0,\n captureTimeMs: 0,\n },\n };\n\n const diffEngine = new DiffEngine(threshold);\n const result = diffEngine.compare(screenshot1, screenshot2, { threshold });\n\n return {\n matches: result.matches,\n diffPercentage: result.diffPercentage,\n diffImage: result.diffImage\n ? bufferToBase64Url(result.diffImage)\n : undefined,\n changedRegions: result.changedRegions,\n };\n}\n\n/**\n * Resize a PNG by padding with transparent pixels to match target dimensions.\n */\nasync function resizePng(\n buffer: Buffer,\n srcWidth: number,\n srcHeight: number,\n targetWidth: number,\n targetHeight: number\n): Promise<Buffer> {\n const { PNG } = await import(\"pngjs\");\n\n const srcPng = PNG.sync.read(buffer);\n const dstPng = new PNG({\n width: targetWidth,\n height: targetHeight,\n fill: true,\n });\n\n // Fill with transparent white\n for (let y = 0; y < targetHeight; y++) {\n for (let x = 0; x < targetWidth; x++) {\n const idx = (y * targetWidth + x) * 4;\n dstPng.data[idx] = 255; // R\n dstPng.data[idx + 1] = 255; // G\n dstPng.data[idx + 2] = 255; // B\n dstPng.data[idx + 3] = 255; // A (opaque white background)\n }\n }\n\n // Copy source image data\n for (let y = 0; y < srcHeight; y++) {\n for (let x = 0; x < srcWidth; x++) {\n const srcIdx = (y * srcWidth + x) * 4;\n const dstIdx = (y * targetWidth + x) * 4;\n dstPng.data[dstIdx] = srcPng.data[srcIdx];\n dstPng.data[dstIdx + 1] = srcPng.data[srcIdx + 1];\n dstPng.data[dstIdx + 2] = srcPng.data[srcIdx + 2];\n dstPng.data[dstIdx + 3] = srcPng.data[srcIdx + 3];\n }\n }\n\n return PNG.sync.write(dstPng);\n}\n","/**\n * Render utilities for AI preview endpoint.\n * Generates code to render design system components in isolation.\n */\n\nexport interface RenderRequest {\n /** Component name (e.g., \"Button\", \"Card\") */\n component: string;\n /** Props to pass to the component */\n props?: Record<string, unknown>;\n /** Viewport dimensions */\n viewport?: {\n width: number;\n height: number;\n };\n}\n\nexport interface SegmentInfo {\n name: string;\n path: string;\n}\n\n/**\n * Serialize a value to JavaScript code string.\n * Handles strings, numbers, booleans, null, undefined, arrays, and objects.\n */\nexport function serializeValue(value: unknown): string {\n if (value === null) return \"null\";\n if (value === undefined) return \"undefined\";\n if (typeof value === \"string\") return JSON.stringify(value);\n if (typeof value === \"number\") return String(value);\n if (typeof value === \"boolean\") return String(value);\n if (Array.isArray(value)) {\n return `[${value.map(serializeValue).join(\", \")}]`;\n }\n if (typeof value === \"object\") {\n const entries = Object.entries(value)\n .map(([k, v]) => `${JSON.stringify(k)}: ${serializeValue(v)}`)\n .join(\", \");\n return `{${entries}}`;\n }\n // Functions and other types - skip\n return \"undefined\";\n}\n\n/**\n * Serialize props object to JSX attribute string.\n * Example: { variant: \"primary\", disabled: true } -> variant=\"primary\" disabled={true}\n */\nexport function serializePropsToJsx(props: Record<string, unknown>): string {\n return Object.entries(props)\n .filter(([_, v]) => v !== undefined)\n .map(([key, value]) => {\n if (typeof value === \"string\") {\n return `${key}=${JSON.stringify(value)}`;\n }\n return `${key}={${serializeValue(value)}}`;\n })\n .join(\" \");\n}\n\n/**\n * Find a segment by component name.\n * Returns the segment info if found, null otherwise.\n */\nexport function findSegmentByName(\n componentName: string,\n segments: Array<{ path: string; segment: { meta: { name: string } } }>\n): SegmentInfo | null {\n const match = segments.find(\n (s) => s.segment.meta.name.toLowerCase() === componentName.toLowerCase()\n );\n\n if (!match) return null;\n\n return {\n name: match.segment.meta.name,\n path: match.path,\n };\n}\n\n/**\n * Get list of available component names from loaded segments.\n */\nexport function getAvailableComponents(\n segments: Array<{ segment: { meta: { name: string } } }>\n): string[] {\n return segments.map((s) => s.segment.meta.name).sort();\n}\n\n/**\n * Generate the render script that will be injected into the template.\n * This script imports the component and renders it with the given props.\n */\nexport function generateRenderScript(\n segmentPath: string,\n componentName: string,\n props: Record<string, unknown> = {}\n): string {\n const propsJsx = serializePropsToJsx(props);\n const propsString = propsJsx ? ` ${propsJsx}` : \"\";\n\n // Handle children prop specially - render as content between tags\n const hasChildren = \"children\" in props && props.children !== undefined;\n const childrenContent = hasChildren ? String(props.children) : \"\";\n const propsWithoutChildren = { ...props };\n delete propsWithoutChildren.children;\n const propsJsxNoChildren = serializePropsToJsx(propsWithoutChildren);\n const propsStringNoChildren = propsJsxNoChildren ? ` ${propsJsxNoChildren}` : \"\";\n\n return `\nimport React from \"react\";\nimport { createRoot } from \"react-dom/client\";\n\n// Import the segment to get the component\nasync function render() {\n const root = document.getElementById(\"render-root\");\n\n try {\n // Dynamic import of the segment file\n const segmentModule = await import(\"${segmentPath}\");\n const segment = segmentModule.default;\n\n if (!segment || !segment.component) {\n throw new Error(\"Segment does not export a component\");\n }\n\n const Component = segment.component;\n\n // Create React root and render\n const reactRoot = createRoot(root);\n ${\n hasChildren\n ? `reactRoot.render(React.createElement(Component, ${JSON.stringify(propsWithoutChildren)}, ${JSON.stringify(childrenContent)}));`\n : `reactRoot.render(React.createElement(Component, ${JSON.stringify(props)}));`\n }\n\n // Signal that rendering is complete\n // Wait a frame for React to flush\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n root.classList.add(\"ready\");\n window.__RENDER_READY__ = true;\n });\n });\n } catch (error) {\n console.error(\"Render error:\", error);\n root.innerHTML = \\`\n <div class=\"render-error\">\n <strong>Render Error</strong>\n <pre>\\${error.message}</pre>\n </div>\n \\`;\n root.classList.add(\"ready\");\n window.__RENDER_READY__ = true;\n window.__RENDER_ERROR__ = error.message;\n }\n}\n\nrender();\n`;\n}\n\n/**\n * Generate a virtual module ID for a render request.\n * This creates a unique ID that Vite can resolve.\n */\nexport function generateRenderModuleId(componentName: string, requestId: string): string {\n return `virtual:segments-render-${componentName}-${requestId}`;\n}\n","/**\n * Style comparison utilities for comparing Figma design properties\n * with rendered component computed styles.\n */\n\n/**\n * Style diff result for a single CSS property\n */\nexport interface StyleDiffItem {\n /** CSS property name */\n property: string;\n /** Expected value from Figma */\n figma: string;\n /** Actual value from rendered component */\n rendered: string;\n /** Whether values match (within tolerance) */\n match: boolean;\n}\n\n/**\n * Result of comparing styles\n */\nexport interface StyleComparisonResult {\n /** Whether all styles match */\n match: boolean;\n /** Individual property comparisons */\n properties: StyleDiffItem[];\n /** CSS properties from Figma design */\n figmaStyles: Record<string, string>;\n /** Computed CSS properties from rendered component */\n renderedStyles: Record<string, string>;\n}\n\n/**\n * Compare Figma CSS properties with rendered computed styles.\n */\nexport function compareStyles(\n figmaStyles: Record<string, string | undefined>,\n renderedStyles: Record<string, string>\n): StyleComparisonResult {\n const properties: StyleDiffItem[] = [];\n const cleanFigmaStyles: Record<string, string> = {};\n\n // Properties to compare\n const propsToCompare = [\n \"backgroundColor\",\n \"borderColor\",\n \"borderWidth\",\n \"borderRadius\",\n \"fontFamily\",\n \"fontSize\",\n \"fontWeight\",\n \"lineHeight\",\n \"letterSpacing\",\n \"textAlign\",\n \"boxShadow\",\n \"padding\",\n \"gap\",\n \"opacity\",\n ];\n\n for (const prop of propsToCompare) {\n const figmaValue = figmaStyles[prop];\n const renderedValue = renderedStyles[prop];\n\n if (figmaValue !== undefined) {\n cleanFigmaStyles[prop] = figmaValue;\n\n const match = compareStyleValue(prop, figmaValue, renderedValue || \"\");\n properties.push({\n property: prop,\n figma: figmaValue,\n rendered: renderedValue || \"(not set)\",\n match,\n });\n }\n }\n\n const allMatch = properties.every((p) => p.match);\n\n return {\n match: allMatch,\n properties,\n figmaStyles: cleanFigmaStyles,\n renderedStyles,\n };\n}\n\n/**\n * Compare a single style value with tolerance for color and numeric differences.\n */\nexport function compareStyleValue(\n prop: string,\n figma: string,\n rendered: string\n): boolean {\n // Normalize values for comparison\n const normalizedFigma = normalizeStyleValue(prop, figma);\n const normalizedRendered = normalizeStyleValue(prop, rendered);\n\n // Direct match\n if (normalizedFigma === normalizedRendered) {\n return true;\n }\n\n // Color comparison with tolerance\n if (prop === \"backgroundColor\" || prop === \"borderColor\") {\n return compareColors(normalizedFigma, normalizedRendered, 5);\n }\n\n // Numeric comparison with tolerance (for pixels)\n if (\n [\"borderWidth\", \"borderRadius\", \"fontSize\", \"padding\", \"gap\"].includes(prop)\n ) {\n return compareNumericValues(normalizedFigma, normalizedRendered, 1);\n }\n\n return false;\n}\n\n/**\n * Normalize a style value for comparison.\n */\nexport function normalizeStyleValue(prop: string, value: string): string {\n // Remove extra whitespace\n let normalized = value.trim().replace(/\\s+/g, \" \");\n\n // Normalize \"none\" shadow to empty\n if (prop === \"boxShadow\" && normalized === \"none\") {\n normalized = \"\";\n }\n\n // Normalize rgba(0, 0, 0, 0) to \"transparent\"\n if (normalized.match(/rgba\\(\\s*0\\s*,\\s*0\\s*,\\s*0\\s*,\\s*0\\s*\\)/)) {\n normalized = \"transparent\";\n }\n\n return normalized;\n}\n\n/**\n * Compare two color values with tolerance.\n */\nexport function compareColors(\n color1: string,\n color2: string,\n tolerance: number\n): boolean {\n const rgb1 = parseColor(color1);\n const rgb2 = parseColor(color2);\n\n if (!rgb1 || !rgb2) {\n return color1 === color2;\n }\n\n return (\n Math.abs(rgb1.r - rgb2.r) <= tolerance &&\n Math.abs(rgb1.g - rgb2.g) <= tolerance &&\n Math.abs(rgb1.b - rgb2.b) <= tolerance &&\n Math.abs((rgb1.a ?? 1) - (rgb2.a ?? 1)) <= 0.05\n );\n}\n\n/**\n * Parse a color string to RGB values.\n */\nexport function parseColor(\n color: string\n): { r: number; g: number; b: number; a?: number } | null {\n // Handle hex colors\n const hexMatch = color.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);\n if (hexMatch) {\n return {\n r: parseInt(hexMatch[1], 16),\n g: parseInt(hexMatch[2], 16),\n b: parseInt(hexMatch[3], 16),\n };\n }\n\n // Handle rgb/rgba\n const rgbaMatch = color.match(\n /rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+))?\\s*\\)/\n );\n if (rgbaMatch) {\n return {\n r: parseInt(rgbaMatch[1], 10),\n g: parseInt(rgbaMatch[2], 10),\n b: parseInt(rgbaMatch[3], 10),\n a: rgbaMatch[4] ? parseFloat(rgbaMatch[4]) : 1,\n };\n }\n\n return null;\n}\n\n/**\n * Compare numeric values (e.g., \"10px\" vs \"11px\") with tolerance.\n */\nexport function compareNumericValues(\n value1: string,\n value2: string,\n tolerance: number\n): boolean {\n const num1 = parseFloat(value1);\n const num2 = parseFloat(value2);\n\n if (isNaN(num1) || isNaN(num2)) {\n return value1 === value2;\n }\n\n return Math.abs(num1 - num2) <= tolerance;\n}\n\n// ----- Enhanced Token-Aware Style Comparison -----\n\nimport type {\n EnhancedStyleDiffItem,\n TokenFix,\n TokenUsageSummary,\n DesignToken,\n} from \"../core/index.js\";\n\n/**\n * Enhanced style diff result with token information\n */\nexport interface EnhancedStyleComparisonResult extends StyleComparisonResult {\n /** Individual property comparisons with token info */\n properties: EnhancedStyleDiffItem[];\n /** Token usage summary */\n tokenSummary?: TokenUsageSummary;\n}\n\n/**\n * Token registry interface for style comparison\n * (subset of TokenRegistryManager methods needed here)\n */\nexport interface TokenLookup {\n findByValue(value: string, theme?: string): string[];\n getToken(name: string): DesignToken | undefined;\n calculateUsageSummary(\n styleDiffs: Array<{\n property: string;\n figma: string;\n rendered: string;\n match: boolean;\n }>,\n theme?: string\n ): TokenUsageSummary;\n}\n\n/**\n * Compare styles with token awareness.\n *\n * This enhanced version:\n * 1. Performs normal style comparison\n * 2. Identifies which values match design tokens\n * 3. Flags hardcoded values that should use tokens\n * 4. Generates fix suggestions\n */\nexport function compareStylesWithTokens(\n figmaStyles: Record<string, string | undefined>,\n renderedStyles: Record<string, string>,\n tokenLookup?: TokenLookup,\n theme = \"default\"\n): EnhancedStyleComparisonResult {\n const properties: EnhancedStyleDiffItem[] = [];\n const cleanFigmaStyles: Record<string, string> = {};\n\n // Properties to compare\n const propsToCompare = [\n \"backgroundColor\",\n \"borderColor\",\n \"borderWidth\",\n \"borderRadius\",\n \"fontFamily\",\n \"fontSize\",\n \"fontWeight\",\n \"lineHeight\",\n \"letterSpacing\",\n \"textAlign\",\n \"boxShadow\",\n \"padding\",\n \"gap\",\n \"opacity\",\n \"color\",\n ];\n\n for (const prop of propsToCompare) {\n const figmaValue = figmaStyles[prop];\n const renderedValue = renderedStyles[prop];\n\n if (figmaValue !== undefined) {\n cleanFigmaStyles[prop] = figmaValue;\n\n const match = compareStyleValue(prop, figmaValue, renderedValue || \"\");\n\n // Build enhanced diff item\n const item: EnhancedStyleDiffItem = {\n property: prop,\n figma: figmaValue,\n rendered: renderedValue || \"(not set)\",\n match,\n isHardcoded: false,\n };\n\n // Add token information if registry is available\n if (tokenLookup) {\n const figmaTokens = tokenLookup.findByValue(figmaValue, theme);\n const renderedTokens = renderedValue\n ? tokenLookup.findByValue(renderedValue, theme)\n : [];\n\n if (figmaTokens.length > 0) {\n item.figmaToken = figmaTokens[0];\n }\n\n if (renderedTokens.length > 0) {\n item.renderedToken = renderedTokens[0];\n }\n\n // Determine if this is a hardcoded value\n // Hardcoded = Figma matches a token, but rendered doesn't use a token\n item.isHardcoded = !!item.figmaToken && !item.renderedToken;\n\n // Generate fix suggestion if hardcoded\n if (item.isHardcoded && item.figmaToken) {\n const token = tokenLookup.getToken(item.figmaToken);\n if (token) {\n const cssProperty = toCssProperty(prop);\n item.suggestedFix = {\n tokenName: item.figmaToken,\n tokenValue: token.resolvedValue,\n codeFix: `${cssProperty}: var(${item.figmaToken});`,\n confidence: 0.9,\n reason: `Figma uses token ${item.figmaToken} (${token.resolvedValue}). Replace hardcoded value with token for consistency.`,\n };\n }\n }\n }\n\n properties.push(item);\n }\n }\n\n const allMatch = properties.every((p) => p.match);\n\n // Calculate token summary if registry available\n let tokenSummary: TokenUsageSummary | undefined;\n if (tokenLookup) {\n tokenSummary = tokenLookup.calculateUsageSummary(\n properties.map((p) => ({\n property: p.property,\n figma: p.figma,\n rendered: p.rendered,\n match: p.match,\n })),\n theme\n );\n }\n\n return {\n match: allMatch,\n properties,\n figmaStyles: cleanFigmaStyles,\n renderedStyles,\n tokenSummary,\n };\n}\n\n/**\n * Convert camelCase to kebab-case CSS property\n */\nfunction toCssProperty(prop: string): string {\n return prop.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n}\n\n/**\n * Format token summary for display\n */\nexport function formatTokenSummary(summary: TokenUsageSummary): string {\n const lines: string[] = [];\n\n lines.push(`Token Compliance: ${summary.compliancePercent}%`);\n lines.push(\n `${summary.usingTokens}/${summary.totalProperties} properties using tokens`\n );\n\n if (summary.hardcoded > 0) {\n lines.push(`${summary.hardcoded} hardcoded value(s) detected`);\n }\n\n if (summary.implicitMatches > 0) {\n lines.push(`${summary.implicitMatches} implicit match(es)`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Get status badge for token compliance\n */\nexport function getComplianceBadge(\n compliancePercent: number\n): { label: string; color: string } {\n if (compliancePercent >= 100) {\n return { label: \"Excellent\", color: \"green\" };\n } else if (compliancePercent >= 80) {\n return { label: \"Good\", color: \"blue\" };\n } else if (compliancePercent >= 50) {\n return { label: \"Fair\", color: \"yellow\" };\n } else {\n return { label: \"Poor\", color: \"red\" };\n }\n}\n","/**\n * Main App component for the Fragments viewer.\n * Refactored for better performance and maintainability.\n */\n\nimport { useState, useMemo, useEffect, useCallback, useRef } from \"react\";\nimport type { SegmentDefinition } from \"../../core/index.js\";\nimport clsx from \"clsx\";\n\n// Layout & Navigation\nimport { Layout } from \"./Layout.js\";\nimport { LeftSidebar } from \"./LeftSidebar.js\";\nimport { VariantTabs } from \"./VariantTabs.js\";\nimport { CommandPalette } from \"./CommandPalette.js\";\nimport { KeyboardShortcutsHelp } from \"./KeyboardShortcutsHelp.js\";\nimport { Toast, type ToastMessage } from \"./Toast.js\";\n\n// Toolbar\nimport { PreviewToolbar, getBackgroundStyle } from \"./PreviewToolbar.js\";\nimport { ViewportSelector } from \"./ViewportSelector.js\";\n\n// Preview & Rendering\nimport { PreviewArea } from \"./PreviewArea.js\";\nimport { BottomPanel } from \"./BottomPanel.js\";\nimport { IsolatedRender } from \"./IsolatedRender.js\";\nimport { StoryRenderer, LoaderIndicator } from \"./StoryRenderer.js\";\nimport { HealthDashboard } from \"./HealthDashboard.js\";\nimport { useAllFigmaUrls } from \"./FigmaEmbed.js\";\nimport { ActionCapture } from \"./ActionCapture.js\";\n\n// Icons\nimport { EmptyIcon, ExternalLinkIcon, CameraIcon, FigmaIcon, CompareIcon, CheckIcon, LinkIcon, GridIcon, DevicesIcon } from \"./Icons.js\";\n\n// Hooks\nimport { useAppState } from \"../hooks/useAppState.js\";\nimport { useViewSettings } from \"../hooks/useViewSettings.js\";\nimport { useFigmaIntegration } from \"../hooks/useFigmaIntegration.js\";\nimport { useKeyboardShortcuts } from \"../hooks/useKeyboardShortcuts.js\";\nimport { useActions } from \"../hooks/useActions.js\";\nimport { useUrlState, findSegmentByName, findVariantIndex } from \"../hooks/useUrlState.js\";\nimport { usePanelDock } from \"./ResizablePanel.js\";\nimport { useTheme } from \"./ThemeProvider.js\";\n\n// Utilities\nimport { ScreenshotButton } from \"./ScreenshotButton.js\";\n\ninterface AppProps {\n segments: Array<{ path: string; segment: SegmentDefinition }>;\n}\n\nexport function App({ segments }: AppProps) {\n // URL state management\n const { state: urlState, setComponent: setUrlComponent, setVariant: setUrlVariant, setViewSettings: setUrlViewSettings, copyUrl } = useUrlState();\n\n // UI state (modals, panels, view modes)\n const { state: uiState, actions: uiActions } = useAppState();\n\n // View settings (zoom, background, viewport, theme)\n const viewSettings = useViewSettings({\n initialState: {\n zoom: urlState.zoom as any,\n background: urlState.background as any,\n viewport: urlState.viewport as any,\n customSize: { width: urlState.customWidth, height: urlState.customHeight },\n },\n onZoomChange: (zoom) => setUrlViewSettings({ zoom }),\n onBackgroundChange: (bg) => setUrlViewSettings({ background: bg }),\n onViewportChange: (vp, size) => setUrlViewSettings({\n viewport: vp,\n customWidth: size?.width,\n customHeight: size?.height,\n }),\n });\n\n // Panel dock position\n const panelDock = usePanelDock();\n\n // Get resolved theme from ThemeProvider for iframe preview\n const { resolvedTheme } = useTheme();\n\n // Toast notifications\n const [toasts, setToasts] = useState<ToastMessage[]>([]);\n const addToast = useCallback((type: ToastMessage['type'], message: string, duration?: number) => {\n const id = `${Date.now()}-${Math.random().toString(36).slice(2)}`;\n setToasts(prev => [...prev, { id, type, message, duration }]);\n }, []);\n const dismissToast = useCallback((id: string) => {\n setToasts(prev => prev.filter(t => t.id !== id));\n }, []);\n\n // Navigation state\n const [activeSegmentPath, setActiveSegmentPath] = useState<string | null>(() => {\n if (urlState.component) {\n const found = findSegmentByName(segments, urlState.component);\n return found?.path ?? segments[0]?.path ?? null;\n }\n return segments[0]?.path ?? null;\n });\n\n const [activeVariantIndex, setActiveVariantIndex] = useState<number>(() => {\n const segment = segments.find(s => s.path === activeSegmentPath);\n if (urlState.variant && segment?.segment.variants) {\n return findVariantIndex(segment.segment.variants, urlState.variant);\n }\n return 0;\n });\n\n // Derived values\n const activeSegment = useMemo(\n () => segments.find((s) => s.path === activeSegmentPath),\n [segments, activeSegmentPath]\n );\n const activeVariant = activeSegment?.segment.variants?.[activeVariantIndex];\n const figmaUrl = activeVariant?.figma || activeSegment?.segment.meta.figma;\n\n // Figma integration\n const figmaIntegration = useFigmaIntegration({\n figmaUrl,\n showComparison: uiState.showComparison,\n dependencies: [activeSegmentPath, activeVariantIndex],\n });\n\n // Actions logging\n const { logs: actionLogs, logAction, clearLogs: clearActionLogs } = useActions();\n const useActionsRef = useRef({ logAction });\n useActionsRef.current = { logAction };\n\n // Figma URLs for preloading\n const allFigmaUrls = useAllFigmaUrls(activeSegment?.segment);\n\n // Reset action logs on variant change\n useEffect(() => {\n clearActionLogs();\n }, [activeSegmentPath, activeVariantIndex, clearActionLogs]);\n\n // Extract rendered styles after component renders\n useEffect(() => {\n if (uiState.showComparison && activeVariant) {\n const timer = setTimeout(figmaIntegration.extractRenderedStyles, 100);\n return () => clearTimeout(timer);\n }\n }, [uiState.showComparison, activeVariant, figmaIntegration.extractRenderedStyles, uiState.previewKey]);\n\n // Sync URL state on browser navigation\n useEffect(() => {\n if (urlState.component) {\n const found = findSegmentByName(segments, urlState.component);\n if (found && found.path !== activeSegmentPath) {\n setActiveSegmentPath(found.path);\n const variantIndex = findVariantIndex(found.segment.variants, urlState.variant);\n setActiveVariantIndex(variantIndex);\n }\n }\n }, [urlState.component, urlState.variant, segments, activeSegmentPath]);\n\n // HMR toast notifications\n useEffect(() => {\n const hot = (import.meta as any).hot;\n if (!hot) return;\n\n const handleUpdate = (data: any) => {\n if (data?.updates?.length > 0) {\n const paths = data.updates.map((u: any) => u.path.split('/').pop()).join(', ');\n addToast('info', `Updated: ${paths}`, 2000);\n }\n };\n\n hot.on('vite:beforeUpdate', handleUpdate);\n return () => hot.off?.('vite:beforeUpdate', handleUpdate);\n }, [addToast]);\n\n // Navigation handlers\n const handleSelectSegment = useCallback((path: string) => {\n const segment = segments.find((s) => s.path === path);\n const componentName = segment?.segment.meta.name || path;\n const firstVariant = segment?.segment.variants?.[0]?.name;\n\n setActiveSegmentPath(path);\n setActiveVariantIndex(0);\n uiActions.setHealthDashboard(false);\n setUrlComponent(componentName, firstVariant);\n }, [segments, setUrlComponent, uiActions]);\n\n const handleSelectVariant = useCallback((index: number) => {\n const variantName = activeSegment?.segment.variants?.[index]?.name;\n setActiveVariantIndex(index);\n setUrlVariant(variantName || null);\n }, [activeSegment, setUrlVariant]);\n\n // Copy link handler\n const handleCopyLink = useCallback(async () => {\n const success = await copyUrl();\n if (success) {\n uiActions.setLinkCopied(true);\n addToast('success', 'Link copied to clipboard', 2000);\n setTimeout(() => uiActions.setLinkCopied(false), 2000);\n }\n }, [copyUrl, addToast, uiActions]);\n\n // Sorted segment paths for keyboard navigation\n const sortedSegmentPaths = useMemo(() => {\n return [...segments]\n .filter(s => s.segment?.meta?.name)\n .sort((a, b) => a.segment.meta.name.localeCompare(b.segment.meta.name))\n .map(s => s.path);\n }, [segments]);\n\n const currentSegmentIndex = sortedSegmentPaths.indexOf(activeSegmentPath || '');\n const variantCount = activeSegment?.segment.variants?.length || 0;\n\n // Keyboard shortcuts\n useKeyboardShortcuts(\n {\n nextComponent: () => {\n const nextIndex = currentSegmentIndex < sortedSegmentPaths.length - 1 ? currentSegmentIndex + 1 : 0;\n handleSelectSegment(sortedSegmentPaths[nextIndex]);\n },\n prevComponent: () => {\n const prevIndex = currentSegmentIndex > 0 ? currentSegmentIndex - 1 : sortedSegmentPaths.length - 1;\n handleSelectSegment(sortedSegmentPaths[prevIndex]);\n },\n nextVariant: () => handleSelectVariant(activeVariantIndex < variantCount - 1 ? activeVariantIndex + 1 : 0),\n prevVariant: () => handleSelectVariant(activeVariantIndex > 0 ? activeVariantIndex - 1 : variantCount - 1),\n goToVariant: (index) => index < variantCount && handleSelectVariant(index),\n toggleTheme: viewSettings.toggleTheme,\n togglePanel: uiActions.togglePanel,\n copyLink: handleCopyLink,\n showHelp: uiActions.toggleShortcutsHelp,\n openSearch: () => uiActions.setCommandPalette(true),\n escape: uiActions.closeAllModals,\n },\n { enabled: !uiState.showShortcutsHelp, variantCount }\n );\n\n // Render variant with action logging via DOM event capture\n const renderVariantWithProps = useCallback(() => {\n if (!activeVariant) return null;\n\n return (\n <ActionCapture onAction={useActionsRef.current.logAction}>\n <StoryRenderer variant={activeVariant}>\n {(content, isLoading, error) => {\n if (isLoading) return <div className=\"flex items-center justify-center p-8\"><LoaderIndicator /></div>;\n if (error) return <EmptyVariantMessage reason={`Error: ${error.message}`} variantName={activeVariant.name} hint=\"Check the console for the full error stack trace.\" />;\n if (content === null || content === undefined) return <EmptyVariantMessage reason=\"render() returned null or undefined\" variantName={activeVariant.name} hint=\"The variant's render function didn't return any JSX.\" />;\n return content;\n }}\n </StoryRenderer>\n </ActionCapture>\n );\n }, [activeVariant]);\n\n // Check if isolated mode\n const isIsolated = useMemo(() => {\n const params = new URLSearchParams(window.location.search);\n return params.get(\"isolated\") === \"true\";\n }, []);\n\n if (isIsolated) {\n return <IsolatedRender segments={segments} />;\n }\n\n return (\n <>\n <Toast messages={toasts} onDismiss={dismissToast} />\n <KeyboardShortcutsHelp isOpen={uiState.showShortcutsHelp} onClose={() => uiActions.setShortcutsHelp(false)} />\n <CommandPalette\n isOpen={uiState.showCommandPalette}\n onClose={() => uiActions.setCommandPalette(false)}\n segments={segments}\n onSelectComponent={handleSelectSegment}\n onSelectVariant={(path, variantIndex) => {\n handleSelectSegment(path);\n setTimeout(() => handleSelectVariant(variantIndex), 0);\n }}\n />\n\n <Layout\n leftSidebar={\n <LeftSidebar\n segments={segments}\n activeSegment={uiState.showHealthDashboard ? null : activeSegmentPath}\n onSelect={handleSelectSegment}\n showHealth={uiState.showHealthDashboard}\n onHealthClick={() => {\n uiActions.setHealthDashboard(true);\n setActiveSegmentPath(null);\n }}\n />\n }\n >\n {uiState.showHealthDashboard ? (\n <div className=\"h-full overflow-auto bg-[--bg-primary]\">\n <div className=\"max-w-4xl mx-auto py-8 px-6\">\n <HealthDashboard\n segments={segments}\n onNavigate={(componentName) => {\n const target = segments.find(s => s.segment.meta.name === componentName);\n if (target) {\n uiActions.setHealthDashboard(false);\n handleSelectSegment(target.path);\n }\n }}\n />\n </div>\n </div>\n ) : activeSegment ? (\n <div className={clsx(\"flex h-full\", panelDock === \"bottom\" ? \"flex-col\" : \"flex-row\")}>\n {/* Main Content Area */}\n <div className=\"flex-1 flex flex-col min-w-0 min-h-0\">\n {/* Top Toolbar */}\n <TopToolbar\n segment={activeSegment}\n variant={activeVariant}\n viewSettings={viewSettings}\n uiState={uiState}\n uiActions={uiActions}\n figmaUrl={figmaUrl}\n linkCopied={uiState.linkCopied}\n onCopyLink={handleCopyLink}\n />\n\n {/* Variant Tabs */}\n {activeSegment.segment.variants && activeSegment.segment.variants.length > 0 && (\n <VariantTabsBar\n variants={activeSegment.segment.variants}\n activeIndex={activeVariantIndex}\n onSelect={handleSelectVariant}\n showMatrixView={uiState.showMatrixView}\n showMultiViewport={uiState.showMultiViewport}\n onToggleMatrix={() => uiActions.setMatrixView(!uiState.showMatrixView)}\n onToggleMultiViewport={() => uiActions.setMultiViewport(!uiState.showMultiViewport)}\n />\n )}\n\n {/* Preview Area */}\n <div\n className=\"flex-1 overflow-auto relative\"\n style={uiState.showMatrixView ? undefined : getBackgroundStyle(viewSettings.background)}\n >\n {activeVariant ? (\n <PreviewArea\n componentName={activeSegment.segment.meta.name}\n segmentPath={activeSegment.path}\n variant={activeVariant}\n variants={activeSegment.segment.variants}\n zoom={viewSettings.zoom}\n background={viewSettings.background}\n viewport={viewSettings.viewport}\n customSize={viewSettings.customSize}\n previewTheme={resolvedTheme}\n showMatrixView={uiState.showMatrixView}\n showMultiViewport={uiState.showMultiViewport}\n showComparison={uiState.showComparison}\n figmaUrl={figmaUrl}\n allFigmaUrls={allFigmaUrls}\n onSelectVariant={(index) => {\n uiActions.setMatrixView(false);\n handleSelectVariant(index);\n }}\n onRetry={uiActions.incrementPreviewKey}\n renderContent={renderVariantWithProps}\n previewKey={`${activeSegmentPath}-${activeVariantIndex}-${uiState.previewKey}`}\n />\n ) : (\n <NoVariantsMessage segment={activeSegment?.segment} />\n )}\n </div>\n </div>\n\n {/* Bottom Panel */}\n {activeVariant && (\n <BottomPanel\n segment={activeSegment.segment}\n variant={activeVariant}\n segments={segments}\n activePanel={uiState.activePanel}\n onPanelChange={uiActions.setActivePanel}\n figmaUrl={figmaUrl}\n figmaStyles={figmaIntegration.figmaStyles.status === 'success' ? figmaIntegration.figmaStyles.styles || null : null}\n renderedStyles={figmaIntegration.renderedStyles}\n figmaLoading={figmaIntegration.isLoading}\n figmaError={figmaIntegration.errorMessage}\n onFetchFigma={figmaIntegration.fetchFigmaStyles}\n onRefreshRendered={figmaIntegration.extractRenderedStyles}\n actionLogs={actionLogs}\n onClearActionLogs={clearActionLogs}\n onNavigateToComponent={(name) => {\n const target = segments.find(s => s.segment.meta.name === name);\n if (target) handleSelectSegment(target.path);\n }}\n previewKey={uiState.previewKey}\n segmentKey={`${activeSegmentPath}-${activeVariantIndex}`}\n />\n )}\n </div>\n ) : (\n <div className=\"flex flex-col items-center justify-center h-full text-secondary\">\n <EmptyIcon className=\"w-12 h-12 mb-4 text-[--text-muted]\" />\n <p className=\"text-base font-medium text-primary\">No component selected</p>\n <p className=\"text-sm mt-1 text-tertiary\">Select a component from the sidebar</p>\n </div>\n )}\n </Layout>\n </>\n );\n}\n\n// Top Toolbar Component\ninterface TopToolbarProps {\n segment: { path: string; segment: SegmentDefinition };\n variant: any;\n viewSettings: ReturnType<typeof useViewSettings>;\n uiState: ReturnType<typeof useAppState>['state'];\n uiActions: ReturnType<typeof useAppState>['actions'];\n figmaUrl?: string;\n linkCopied: boolean;\n onCopyLink: () => void;\n}\n\nfunction TopToolbar({ segment, variant, viewSettings, uiState, uiActions, figmaUrl, linkCopied, onCopyLink }: TopToolbarProps) {\n return (\n <div className=\"flex items-center justify-between px-4 py-2 border-b border-[--border] bg-[--bg-secondary] flex-shrink-0\">\n <div className=\"flex items-center gap-3\">\n <h1 className=\"text-sm font-medium text-primary\">{segment.segment.meta.name}</h1>\n <span className=\"text-xs text-tertiary\">{segment.segment.meta.category}</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <PreviewToolbar\n zoom={viewSettings.zoom}\n background={viewSettings.background}\n onZoomChange={viewSettings.setZoom}\n onBackgroundChange={viewSettings.setBackground}\n />\n <div className=\"w-px h-4 bg-[--border]\" />\n <ViewportSelector\n viewport={viewSettings.viewport}\n customSize={viewSettings.customSize}\n onViewportChange={viewSettings.setViewport}\n onCustomSizeChange={viewSettings.setCustomSize}\n />\n <div className=\"w-px h-4 bg-[--border]\" />\n\n {figmaUrl && (\n <>\n <button\n onClick={uiActions.toggleComparison}\n className={clsx(\n \"p-1.5 rounded transition-colors\",\n uiState.showComparison\n ? \"text-[--color-accent] bg-[--bg-hover]\"\n : \"text-tertiary hover:text-primary hover:bg-[--bg-hover]\"\n )}\n title={uiState.showComparison ? \"Hide Figma comparison\" : \"Compare with Figma design\"}\n >\n <CompareIcon className=\"w-4 h-4\" />\n </button>\n <button\n onClick={() => window.open(figmaUrl, '_blank', 'noopener,noreferrer')}\n className=\"p-1.5 text-tertiary hover:text-primary hover:bg-[--bg-hover] rounded transition-colors\"\n title=\"View in Figma\"\n >\n <FigmaIcon className=\"w-4 h-4\" />\n </button>\n <div className=\"w-px h-4 bg-[--border]\" />\n </>\n )}\n\n {variant && (\n <>\n <button\n onClick={() => {\n const url = new URL(window.location.href);\n // Clear the hash to avoid malformed URLs\n url.hash = '';\n url.searchParams.set('isolated', 'true');\n url.searchParams.set('component', segment.segment.meta.name);\n url.searchParams.set('variant', variant.name);\n if (viewSettings.zoom !== 100) url.searchParams.set('zoom', String(viewSettings.zoom));\n if (viewSettings.background !== 'transparent') url.searchParams.set('bg', viewSettings.background);\n window.open(url.toString(), '_blank', 'noopener,noreferrer');\n }}\n className=\"p-1.5 text-tertiary hover:text-primary hover:bg-[--bg-hover] rounded transition-colors\"\n title=\"Open in new window\"\n >\n <ExternalLinkIcon className=\"w-4 h-4\" />\n </button>\n <ScreenshotButton componentName={segment.segment.meta.name} variantName={variant.name} />\n <button\n onClick={onCopyLink}\n className={clsx(\n \"p-1.5 rounded transition-colors\",\n linkCopied\n ? \"text-green-600 bg-green-100 dark:bg-green-900/30\"\n : \"text-tertiary hover:text-primary hover:bg-[--bg-hover]\"\n )}\n title=\"Copy link to share\"\n >\n {linkCopied ? <CheckIcon className=\"w-4 h-4\" /> : <LinkIcon className=\"w-4 h-4\" />}\n </button>\n </>\n )}\n </div>\n </div>\n );\n}\n\n// Variant Tabs Bar Component\ninterface VariantTabsBarProps {\n variants: any[];\n activeIndex: number;\n onSelect: (index: number) => void;\n showMatrixView: boolean;\n showMultiViewport: boolean;\n onToggleMatrix: () => void;\n onToggleMultiViewport: () => void;\n}\n\nfunction VariantTabsBar({ variants, activeIndex, onSelect, showMatrixView, showMultiViewport, onToggleMatrix, onToggleMultiViewport }: VariantTabsBarProps) {\n return (\n <div className=\"px-4 py-2 border-b border-[--border] bg-[--bg-primary] flex-shrink-0 flex items-center justify-between\">\n {!showMatrixView ? (\n <VariantTabs variants={variants} activeIndex={activeIndex} onSelect={onSelect} />\n ) : (\n <div className=\"text-sm text-secondary\">Showing all {variants.length} variants</div>\n )}\n <div className=\"flex items-center gap-2 ml-4\">\n {variants.length > 1 && (\n <button\n onClick={onToggleMatrix}\n className={clsx(\n \"flex items-center gap-1.5 px-2 py-1 rounded text-xs font-medium transition-colors\",\n showMatrixView\n ? \"bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300\"\n : \"text-tertiary hover:text-secondary hover:bg-[--bg-hover]\"\n )}\n title={showMatrixView ? \"Show single variant\" : \"Show all variants in grid\"}\n >\n <GridIcon className=\"w-4 h-4\" />\n {showMatrixView ? \"Exit Matrix\" : \"Matrix\"}\n </button>\n )}\n <button\n onClick={onToggleMultiViewport}\n className={clsx(\n \"flex items-center gap-1.5 px-2 py-1 rounded text-xs font-medium transition-colors\",\n showMultiViewport\n ? \"bg-green-100 dark:bg-green-900/30 text-green-700 dark:text-green-300\"\n : \"text-tertiary hover:text-secondary hover:bg-[--bg-hover]\"\n )}\n title={showMultiViewport ? \"Exit multi-viewport\" : \"Show at multiple screen sizes\"}\n >\n <DevicesIcon className=\"w-4 h-4\" />\n {showMultiViewport ? \"Exit Responsive\" : \"Responsive\"}\n </button>\n </div>\n </div>\n );\n}\n\n// No variants message\ninterface NoVariantsMessageProps {\n segment?: SegmentDefinition;\n}\n\nfunction NoVariantsMessage({ segment }: NoVariantsMessageProps) {\n const skippedVariants = (segment?._generated as any)?.skippedVariants;\n\n if (!skippedVariants || skippedVariants.length === 0) {\n return <div className=\"flex items-center justify-center h-full text-secondary text-sm\">No variants defined</div>;\n }\n\n return (\n <div className=\"flex items-center justify-center h-full p-6\">\n <div className=\"p-6 bg-sky-50 dark:bg-sky-950 border border-sky-300 dark:border-sky-700 rounded-lg max-w-lg\">\n <div className=\"flex items-start gap-3\">\n <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-sky-200 dark:bg-sky-800 flex items-center justify-center\">\n <span className=\"text-sky-700 dark:text-sky-200 text-lg\">ā¹</span>\n </div>\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-sm font-semibold text-sky-900 dark:text-sky-100\">\n {skippedVariants.length} variant{skippedVariants.length === 1 ? '' : 's'} skipped\n </h3>\n <p className=\"mt-1 text-xs text-sky-800 dark:text-sky-200\">\n These variants couldn't be rendered because they use syntax the parser doesn't support yet:\n </p>\n <ul className=\"mt-2 space-y-1\">\n {skippedVariants.map((sv: any, i: number) => (\n <li key={i} className=\"text-xs text-sky-800 dark:text-sky-200\">\n <span className=\"font-semibold\">{sv.name}:</span>{' '}\n <span className=\"text-sky-700 dark:text-sky-300\">{sv.reason}</span>\n </li>\n ))}\n </ul>\n </div>\n </div>\n </div>\n </div>\n );\n}\n\n// Empty variant message\ninterface EmptyVariantMessageProps {\n reason: string;\n variantName: string;\n hint?: string;\n}\n\nfunction EmptyVariantMessage({ reason, variantName, hint }: EmptyVariantMessageProps) {\n return (\n <div className=\"p-6 bg-amber-50 dark:bg-amber-950 border border-amber-300 dark:border-amber-700 rounded-lg max-w-md\">\n <div className=\"flex items-start gap-3\">\n <div className=\"flex-shrink-0 w-8 h-8 rounded-full bg-amber-200 dark:bg-amber-800 flex items-center justify-center\">\n <span className=\"text-amber-700 dark:text-amber-200 text-lg\">ā </span>\n </div>\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-sm font-semibold text-amber-900 dark:text-amber-100\">\n Variant \"{variantName}\" rendered empty\n </h3>\n <p className=\"mt-1 text-xs text-amber-800 dark:text-amber-200\">{reason}</p>\n {hint && (\n <p className=\"mt-2 text-xs text-amber-700 dark:text-amber-300\">\n <strong>Tip:</strong> {hint}\n </p>\n )}\n <div className=\"mt-3 text-xs text-amber-700 dark:text-amber-300\">\n <strong>Common causes:</strong>\n <ul className=\"mt-1 ml-4 list-disc space-y-0.5\">\n <li>Component requires props that weren't provided</li>\n <li>Component renders conditionally and conditions aren't met</li>\n <li>Story args reference variables that don't exist in this context</li>\n </ul>\n </div>\n </div>\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\n\ninterface LayoutProps {\n leftSidebar: ReactNode;\n children: ReactNode;\n}\n\nexport function Layout({ leftSidebar, children }: LayoutProps) {\n return (\n <div className=\"flex h-screen overflow-hidden bg-[--bg-primary]\">\n {/* Left Sidebar */}\n <aside className=\"hidden md:flex md:w-56 lg:w-64 flex-col border-r border-[--border] bg-[--bg-secondary] flex-shrink-0\">\n {leftSidebar}\n </aside>\n\n {/* Main Content - Full width */}\n <main className=\"flex-1 flex flex-col overflow-hidden min-w-0\">\n {children}\n </main>\n </div>\n );\n}\n","import { useState, useMemo, useRef, useEffect, useCallback } from 'react';\nimport type { SegmentDefinition } from '../../core/index.js';\nimport { BRAND } from '../../core/index.js';\nimport { useTheme } from './ThemeProvider.js';\nimport clsx from 'clsx';\nimport { SearchIcon, SunIcon, MoonIcon, DashboardIcon } from './Icons.js';\n\n// Fuzzy matching utility\ninterface FuzzyMatch {\n score: number;\n indices: number[];\n}\n\nfunction fuzzyMatch(text: string, pattern: string): FuzzyMatch | null {\n if (!pattern) return { score: 0, indices: [] };\n\n const textLower = text.toLowerCase();\n const patternLower = pattern.toLowerCase();\n\n const indices: number[] = [];\n let patternIdx = 0;\n let score = 0;\n let consecutiveBonus = 0;\n\n for (let i = 0; i < textLower.length && patternIdx < patternLower.length; i++) {\n if (textLower[i] === patternLower[patternIdx]) {\n indices.push(i);\n if (indices.length > 1 && indices[indices.length - 2] === i - 1) {\n consecutiveBonus += 5;\n }\n if (i === 0 || text[i - 1] === ' ' || text[i - 1] === '-' || text[i - 1] === '_') {\n score += 10;\n }\n patternIdx++;\n }\n }\n\n if (patternIdx !== patternLower.length) {\n return null;\n }\n\n score += consecutiveBonus;\n score += (patternLower.length / textLower.length) * 20;\n\n return { score, indices };\n}\n\ninterface SearchResult {\n item: { path: string; segment: SegmentDefinition };\n score: number;\n nameIndices: number[];\n}\n\nfunction searchSegment(\n item: { path: string; segment: SegmentDefinition },\n query: string\n): SearchResult | null {\n const { segment } = item;\n // Skip invalid segments\n if (!segment?.meta) return null;\n const { name, category, tags } = segment.meta;\n\n const nameMatch = fuzzyMatch(name, query);\n if (nameMatch) {\n return { item, score: nameMatch.score + 100, nameIndices: nameMatch.indices };\n }\n\n const categoryMatch = fuzzyMatch(category, query);\n if (categoryMatch) {\n return { item, score: categoryMatch.score + 50, nameIndices: [] };\n }\n\n if (tags) {\n for (const tag of tags) {\n const tagMatch = fuzzyMatch(tag, query);\n if (tagMatch) {\n return { item, score: tagMatch.score + 25, nameIndices: [] };\n }\n }\n }\n\n return null;\n}\n\nfunction useDebounce<T>(value: T, delay: number): T {\n const [debouncedValue, setDebouncedValue] = useState(value);\n\n useEffect(() => {\n const timer = setTimeout(() => setDebouncedValue(value), delay);\n return () => clearTimeout(timer);\n }, [value, delay]);\n\n return debouncedValue;\n}\n\nfunction HighlightedText({ text, indices }: { text: string; indices: number[] }) {\n if (indices.length === 0) return <>{text}</>;\n\n const result: React.ReactNode[] = [];\n let lastIndex = 0;\n\n for (let i = 0; i < indices.length; i++) {\n const matchIndex = indices[i];\n if (matchIndex > lastIndex) {\n result.push(text.slice(lastIndex, matchIndex));\n }\n result.push(\n <span key={matchIndex} className=\"text-primary font-medium\">\n {text[matchIndex]}\n </span>\n );\n lastIndex = matchIndex + 1;\n }\n\n if (lastIndex < text.length) {\n result.push(text.slice(lastIndex));\n }\n\n return <>{result}</>;\n}\n\ninterface LeftSidebarProps {\n segments: Array<{ path: string; segment: SegmentDefinition }>;\n activeSegment: string | null;\n onSelect: (path: string) => void;\n showHealth?: boolean;\n onHealthClick?: () => void;\n}\n\nexport function LeftSidebar({ segments, activeSegment, onSelect, showHealth, onHealthClick }: LeftSidebarProps) {\n const [search, setSearch] = useState('');\n const [focusedIndex, setFocusedIndex] = useState(-1);\n const { theme, setTheme, resolvedTheme } = useTheme();\n const searchInputRef = useRef<HTMLInputElement>(null);\n const itemRefs = useRef<Map<number, HTMLButtonElement>>(new Map());\n\n const debouncedSearch = useDebounce(search, 150);\n\n const searchResults = useMemo(() => {\n if (!debouncedSearch) return null;\n\n const results: SearchResult[] = [];\n for (const item of segments) {\n const result = searchSegment(item, debouncedSearch);\n if (result) results.push(result);\n }\n\n results.sort((a, b) => b.score - a.score);\n return results;\n }, [segments, debouncedSearch]);\n\n const highlightMap = useMemo(() => {\n const map = new Map<string, number[]>();\n if (searchResults) {\n for (const result of searchResults) {\n map.set(result.item.path, result.nameIndices);\n }\n }\n return map;\n }, [searchResults]);\n\n const grouped = useMemo(() => {\n const source = searchResults\n ? searchResults.map(r => r.item)\n : segments;\n\n const groups: Record<string, typeof segments> = {};\n for (const item of source) {\n // Skip invalid segments\n if (!item.segment?.meta) continue;\n const category = item.segment.meta.category || 'uncategorized';\n if (!groups[category]) groups[category] = [];\n groups[category].push(item);\n }\n return groups;\n }, [segments, searchResults]);\n\n const toggleTheme = () => {\n // Simple toggle between light and dark\n setTheme(resolvedTheme === 'light' ? 'dark' : 'light');\n };\n\n const flatItems = useMemo(() => {\n const items: Array<{ path: string; segment: SegmentDefinition }> = [];\n const sortedEntries = Object.entries(grouped).sort(([a], [b]) =>\n a.toLowerCase().localeCompare(b.toLowerCase())\n );\n for (const [, categoryItems] of sortedEntries) {\n const sorted = [...categoryItems]\n .filter(item => item.segment?.meta?.name)\n .sort((a, b) =>\n a.segment.meta.name.toLowerCase().localeCompare(b.segment.meta.name.toLowerCase())\n );\n items.push(...sorted);\n }\n return items;\n }, [grouped]);\n\n useEffect(() => {\n if (focusedIndex >= 0 && focusedIndex < flatItems.length) {\n itemRefs.current.get(focusedIndex)?.focus();\n }\n }, [focusedIndex, flatItems.length]);\n\n useEffect(() => {\n setFocusedIndex(-1);\n }, [search]);\n\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n const target = e.target as HTMLElement;\n if ((target.tagName === 'INPUT' && target !== searchInputRef.current) ||\n target.tagName === 'TEXTAREA' || target.isContentEditable) {\n return;\n }\n\n if ((e.key === '/' && !e.metaKey && !e.ctrlKey) ||\n (e.key === 'k' && (e.metaKey || e.ctrlKey))) {\n e.preventDefault();\n searchInputRef.current?.focus();\n searchInputRef.current?.select();\n return;\n }\n\n if (e.key === 'Escape') {\n if (document.activeElement === searchInputRef.current) {\n setSearch('');\n searchInputRef.current?.blur();\n if (flatItems.length > 0) setFocusedIndex(0);\n } else {\n setSearch('');\n setFocusedIndex(-1);\n }\n return;\n }\n\n if (document.activeElement === searchInputRef.current) return;\n\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setFocusedIndex(prev => (prev + 1) >= flatItems.length ? 0 : prev + 1);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setFocusedIndex(prev => (prev - 1) < 0 ? flatItems.length - 1 : prev - 1);\n } else if (e.key === 'Enter' && focusedIndex >= 0 && focusedIndex < flatItems.length) {\n e.preventDefault();\n onSelect(flatItems[focusedIndex].path);\n }\n }, [flatItems, focusedIndex, onSelect]);\n\n useEffect(() => {\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown]);\n\n const setItemRef = useCallback((index: number, el: HTMLButtonElement | null) => {\n if (el) itemRefs.current.set(index, el);\n else itemRefs.current.delete(index);\n }, []);\n\n let globalIndex = 0;\n const sortedEntries = Object.entries(grouped).sort(([a], [b]) =>\n a.toLowerCase().localeCompare(b.toLowerCase())\n );\n\n return (\n <div className=\"flex flex-col h-full bg-[--bg-secondary]\">\n {/* Header - matches toolbar height (py-2 + border) */}\n <div className=\"flex items-center justify-between px-4 py-2 border-b border-[--border]\">\n <span className=\"text-sm font-medium text-primary\">{BRAND.name}</span>\n <button\n onClick={toggleTheme}\n className={clsx(\n 'p-1.5 rounded-md',\n 'text-tertiary hover:text-secondary hover:bg-[--bg-hover]',\n 'focus:outline-none'\n )}\n title={`Theme: ${resolvedTheme}`}\n >\n {resolvedTheme === 'dark' ? (\n <MoonIcon className=\"w-4 h-4\" />\n ) : (\n <SunIcon className=\"w-4 h-4\" />\n )}\n </button>\n </div>\n\n {/* Search */}\n <div className=\"px-3 py-3\">\n <div className=\"relative\">\n <SearchIcon className=\"absolute left-2.5 top-1/2 -translate-y-1/2 w-3.5 h-3.5 text-tertiary pointer-events-none\" />\n <input\n ref={searchInputRef}\n type=\"text\"\n placeholder=\"Search\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className={clsx(\n 'w-full pl-8 pr-3 py-1.5 text-sm rounded-md',\n 'bg-[--bg-primary] text-primary placeholder:text-tertiary',\n 'border border-[--border-subtle]',\n 'focus:outline-none focus:border-[--border-strong]'\n )}\n />\n </div>\n </div>\n\n {/* Dashboard Link */}\n {onHealthClick && (\n <div className=\"px-2 pb-3\">\n <button\n onClick={onHealthClick}\n className={clsx(\n 'w-full flex items-center gap-2 px-2 py-2 rounded-md text-sm',\n 'focus:outline-none',\n showHealth\n ? 'bg-[--bg-hover] text-primary'\n : 'text-secondary hover:bg-[--bg-hover] hover:text-primary'\n )}\n >\n <DashboardIcon className=\"w-4 h-4\" />\n <span>Dashboard</span>\n </button>\n </div>\n )}\n\n {/* Component list */}\n <nav className=\"flex-1 overflow-y-auto px-2 pb-4\">\n {sortedEntries.map(([category, items]) => {\n const sortedItems = [...items].sort((a, b) =>\n a.segment.meta.name.toLowerCase().localeCompare(b.segment.meta.name.toLowerCase())\n );\n\n return (\n <div key={category} className=\"mb-1\">\n {/* Category divider */}\n <div className=\"px-2 py-1.5 text-xs font-medium text-tertiary mt-2 first:mt-0\">\n {category}\n </div>\n\n {/* Items */}\n <div className=\"space-y-0.5\">\n {sortedItems.map((item) => {\n const isActive = activeSegment === item.path;\n const currentIndex = globalIndex++;\n const isFocused = focusedIndex === currentIndex;\n const nameIndices = highlightMap.get(item.path) || [];\n\n return (\n <button\n key={item.path}\n ref={(el) => setItemRef(currentIndex, el)}\n onClick={() => onSelect(item.path)}\n onFocus={() => setFocusedIndex(currentIndex)}\n className={clsx(\n 'w-full text-left px-2 py-1.5 rounded-md text-sm',\n 'focus:outline-none',\n isActive\n ? 'bg-[--bg-hover] text-primary'\n : isFocused\n ? 'bg-[--bg-hover] text-primary'\n : 'text-secondary hover:bg-[--bg-hover] hover:text-primary'\n )}\n >\n <HighlightedText\n text={item.segment.meta.name}\n indices={nameIndices}\n />\n </button>\n );\n })}\n </div>\n </div>\n );\n })}\n\n {Object.keys(grouped).length === 0 && (\n <div className=\"px-2 py-8 text-center text-tertiary text-sm\">\n No results\n </div>\n )}\n </nav>\n\n {/* Footer */}\n <div className=\"px-4 py-3 border-t border-[--border-subtle]\">\n <div className=\"text-xs text-tertiary\">\n {segments.length} components\n </div>\n </div>\n </div>\n );\n}\n","import { createContext, useContext, useEffect, useState, useCallback, type ReactNode } from 'react';\nimport { BRAND } from '../../core/index.js';\n\ntype Theme = 'light' | 'dark' | 'system';\n\ninterface ThemeContextValue {\n theme: Theme;\n resolvedTheme: 'light' | 'dark';\n setTheme: (theme: Theme) => void;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\nconst STORAGE_KEY = `${BRAND.storagePrefix}theme`;\n\nfunction getSystemTheme(): 'light' | 'dark' {\n if (typeof window === 'undefined') return 'light';\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n}\n\nfunction getStoredTheme(): Theme {\n if (typeof window === 'undefined') return 'system';\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored === 'light' || stored === 'dark' || stored === 'system') {\n return stored;\n }\n return 'system';\n}\n\nexport function ThemeProvider({ children }: { children: ReactNode }) {\n const [theme, setThemeState] = useState<Theme>(getStoredTheme);\n const [resolvedTheme, setResolvedTheme] = useState<'light' | 'dark'>(() => {\n const stored = getStoredTheme();\n return stored === 'system' ? getSystemTheme() : stored;\n });\n\n const setTheme = useCallback((newTheme: Theme) => {\n setThemeState(newTheme);\n localStorage.setItem(STORAGE_KEY, newTheme);\n\n // Immediately update resolved theme to avoid timing issues\n const resolved = newTheme === 'system' ? getSystemTheme() : newTheme;\n setResolvedTheme(resolved);\n\n // Immediately apply to document\n if (resolved === 'dark') {\n document.documentElement.classList.add('dark');\n } else {\n document.documentElement.classList.remove('dark');\n }\n }, []);\n\n // Update resolved theme and apply to document\n useEffect(() => {\n const resolved = theme === 'system' ? getSystemTheme() : theme;\n setResolvedTheme(resolved);\n\n if (resolved === 'dark') {\n document.documentElement.classList.add('dark');\n } else {\n document.documentElement.classList.remove('dark');\n }\n }, [theme]);\n\n // Listen for system theme changes\n useEffect(() => {\n if (theme !== 'system') return;\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const handler = (e: MediaQueryListEvent) => {\n setResolvedTheme(e.matches ? 'dark' : 'light');\n if (e.matches) {\n document.documentElement.classList.add('dark');\n } else {\n document.documentElement.classList.remove('dark');\n }\n };\n\n mediaQuery.addEventListener('change', handler);\n return () => mediaQuery.removeEventListener('change', handler);\n }, [theme]);\n\n return (\n <ThemeContext.Provider value={{ theme, resolvedTheme, setTheme }}>\n {children}\n </ThemeContext.Provider>\n );\n}\n\nexport function useTheme() {\n const context = useContext(ThemeContext);\n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider');\n }\n return context;\n}\n","/**\n * Shared icon components for the viewer.\n * Single source of truth for all icons used across components.\n */\n\ninterface IconProps {\n className?: string;\n}\n\n// Navigation & UI\nexport function ChevronDownIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n );\n}\n\nexport function ChevronRightIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 5l7 7-7 7\" />\n </svg>\n );\n}\n\nexport function SearchIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z\" />\n </svg>\n );\n}\n\nexport function ExternalLinkIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13.5 6H5.25A2.25 2.25 0 003 8.25v10.5A2.25 2.25 0 005.25 21h10.5A2.25 2.25 0 0018 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25\" />\n </svg>\n );\n}\n\nexport function LinkIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M13.19 8.688a4.5 4.5 0 011.242 7.244l-4.5 4.5a4.5 4.5 0 01-6.364-6.364l1.757-1.757m13.35-.622l1.757-1.757a4.5 4.5 0 00-6.364-6.364l-4.5 4.5a4.5 4.5 0 001.242 7.244\" />\n </svg>\n );\n}\n\nexport function CloseIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n );\n}\n\nexport function PlusIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 4.5v15m7.5-7.5h-15\" />\n </svg>\n );\n}\n\nexport function PlayIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n );\n}\n\n// Theme\nexport function SunIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 3v2.25m6.364.386l-1.591 1.591M21 12h-2.25m-.386 6.364l-1.591-1.591M12 18.75V21m-4.773-4.227l-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 11-7.5 0 3.75 3.75 0 017.5 0z\" />\n </svg>\n );\n}\n\nexport function MoonIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21.752 15.002A9.718 9.718 0 0118 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 003 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 009.002-5.998z\" />\n </svg>\n );\n}\n\n// Status & Feedback\nexport function CheckIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n );\n}\n\nexport function XIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n );\n}\n\nexport function WarningIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\n </svg>\n );\n}\n\nexport function ErrorIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\n </svg>\n );\n}\n\nexport function InfoIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M11.25 11.25l.041-.02a.75.75 0 011.063.852l-.708 2.836a.75.75 0 001.063.853l.041-.021M21 12a9 9 0 11-18 0 9 9 0 0118 0zm-9-3.75h.008v.008H12V8.25z\" />\n </svg>\n );\n}\n\n// Actions\nexport function CopyIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15.666 3.888A2.25 2.25 0 0013.5 2.25h-3c-1.03 0-1.9.693-2.166 1.638m7.332 0c.055.194.084.4.084.612v0a.75.75 0 01-.75.75H9a.75.75 0 01-.75-.75v0c0-.212.03-.418.084-.612m7.332 0c.646.049 1.288.11 1.927.184 1.1.128 1.907 1.077 1.907 2.185V19.5a2.25 2.25 0 01-2.25 2.25H6.75A2.25 2.25 0 014.5 19.5V6.257c0-1.108.806-2.057 1.907-2.185a48.208 48.208 0 011.927-.184\" />\n </svg>\n );\n}\n\nexport function EditIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L10.582 16.07a4.5 4.5 0 01-1.897 1.13L6 18l.8-2.685a4.5 4.5 0 011.13-1.897l8.932-8.931zm0 0L19.5 7.125M18 14v4.75A2.25 2.25 0 0115.75 21H5.25A2.25 2.25 0 013 18.75V8.25A2.25 2.25 0 015.25 6H10\" />\n </svg>\n );\n}\n\nexport function RefreshIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15\" />\n </svg>\n );\n}\n\nexport function CameraIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6.827 6.175A2.31 2.31 0 015.186 7.23c-.38.054-.757.112-1.134.175C2.999 7.58 2.25 8.507 2.25 9.574V18a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9.574c0-1.067-.75-1.994-1.802-2.169a47.865 47.865 0 00-1.134-.175 2.31 2.31 0 01-1.64-1.055l-.822-1.316a2.192 2.192 0 00-1.736-1.039 48.774 48.774 0 00-5.232 0 2.192 2.192 0 00-1.736 1.039l-.821 1.316z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.5 12.75a4.5 4.5 0 11-9 0 4.5 4.5 0 019 0zM18.75 10.5h.008v.008h-.008V10.5z\" />\n </svg>\n );\n}\n\n// Files & Documents\nexport function FileIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z\" />\n </svg>\n );\n}\n\nexport function CodeIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M17.25 6.75L22.5 12l-5.25 5.25m-10.5 0L1.5 12l5.25-5.25m7.5-3l-4.5 16.5\" />\n </svg>\n );\n}\n\n// Preview Controls\nexport function ZoomIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607zM10.5 7.5v6m3-3h-6\" />\n </svg>\n );\n}\n\nexport function ViewportIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9 17.25v1.007a3 3 0 01-.879 2.122L7.5 21h9l-.621-.621A3 3 0 0115 18.257V17.25m6-12V15a2.25 2.25 0 01-2.25 2.25H5.25A2.25 2.25 0 013 15V5.25m18 0A2.25 2.25 0 0018.75 3H5.25A2.25 2.25 0 003 5.25m18 0V12a2.25 2.25 0 01-2.25 2.25H5.25A2.25 2.25 0 013 12V5.25\" />\n </svg>\n );\n}\n\n// Misc\nexport function ControlsIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10.5 6h9.75M10.5 6a1.5 1.5 0 11-3 0m3 0a1.5 1.5 0 10-3 0M3.75 6H7.5m3 12h9.75m-9.75 0a1.5 1.5 0 01-3 0m3 0a1.5 1.5 0 00-3 0m-3.75 0H7.5m9-6h3.75m-3.75 0a1.5 1.5 0 01-3 0m3 0a1.5 1.5 0 00-3 0m-9.75 0h9.75\" />\n </svg>\n );\n}\n\nexport function BeakerIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.75 3.104v5.714a2.25 2.25 0 01-.659 1.591L5 14.5M9.75 3.104c-.251.023-.501.05-.75.082m.75-.082a24.301 24.301 0 014.5 0m0 0v5.714c0 .597.237 1.17.659 1.591L19.8 15.3M14.25 3.104c.251.023.501.05.75.082M19.8 15.3l-1.57.393A9.065 9.065 0 0112 15a9.065 9.065 0 00-6.23.693L5 14.5m14.8.8l1.402 1.402c1.232 1.232.65 3.318-1.067 3.611l-.258.04A9.045 9.045 0 0112 21a9.045 9.045 0 01-7.877-.647l-.258-.04c-1.718-.293-2.299-2.379-1.067-3.61L5 14.5\" />\n </svg>\n );\n}\n\nexport function AccessibilityIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M18 18.72a9.094 9.094 0 003.741-.479 3 3 0 00-4.682-2.72m.94 3.198l.001.031c0 .225-.012.447-.037.666A11.944 11.944 0 0112 21c-2.17 0-4.207-.576-5.963-1.584A6.062 6.062 0 016 18.719m12 0a5.971 5.971 0 00-.941-3.197m0 0A5.995 5.995 0 0012 12.75a5.995 5.995 0 00-5.058 2.772m0 0a3 3 0 00-4.681 2.72 8.986 8.986 0 003.74.477m.94-3.197a5.971 5.971 0 00-.94 3.197M15 6.75a3 3 0 11-6 0 3 3 0 016 0zm6 3a2.25 2.25 0 11-4.5 0 2.25 2.25 0 014.5 0zm-13.5 0a2.25 2.25 0 11-4.5 0 2.25 2.25 0 014.5 0z\" />\n </svg>\n );\n}\n\nexport function HeartPulseIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M21 8.25c0-2.485-2.099-4.5-4.688-4.5-1.935 0-3.597 1.126-4.312 2.733-.715-1.607-2.377-2.733-4.313-2.733C5.1 3.75 3 5.765 3 8.25c0 7.22 9 12 9 12s9-4.78 9-12z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 12h4l2-3 3 6 2-3h7\" />\n </svg>\n );\n}\n\nexport function DashboardIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 6A2.25 2.25 0 016 3.75h2.25A2.25 2.25 0 0110.5 6v2.25a2.25 2.25 0 01-2.25 2.25H6a2.25 2.25 0 01-2.25-2.25V6zM3.75 15.75A2.25 2.25 0 016 13.5h2.25a2.25 2.25 0 012.25 2.25V18a2.25 2.25 0 01-2.25 2.25H6A2.25 2.25 0 013.75 18v-2.25zM13.5 6a2.25 2.25 0 012.25-2.25H18A2.25 2.25 0 0120.25 6v2.25A2.25 2.25 0 0118 10.5h-2.25a2.25 2.25 0 01-2.25-2.25V6zM13.5 15.75a2.25 2.25 0 012.25-2.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-2.25A2.25 2.25 0 0113.5 18v-2.25z\" />\n </svg>\n );\n}\n\nexport function EmptyIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4\" />\n </svg>\n );\n}\n\n// Figma\nexport function FigmaIcon({ className }: IconProps) {\n return (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M5 5.5A3.5 3.5 0 018.5 2H12v7H8.5A3.5 3.5 0 015 5.5zM12 2h3.5a3.5 3.5 0 110 7H12V2z\" />\n <path d=\"M12 12.5a3.5 3.5 0 117 0 3.5 3.5 0 11-7 0z\" />\n <path d=\"M5 19.5A3.5 3.5 0 018.5 16H12v3.5a3.5 3.5 0 11-7 0zM5 12.5A3.5 3.5 0 018.5 9H12v7H8.5A3.5 3.5 0 015 12.5z\" />\n </svg>\n );\n}\n\nexport function CompareIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M7.5 21L3 16.5m0 0L7.5 12M3 16.5h13.5m0-13.5L21 7.5m0 0L16.5 12M21 7.5H7.5\" />\n </svg>\n );\n}\n\nexport function SyncIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182m0-4.991v4.99\" />\n </svg>\n );\n}\n\nexport function LoadingIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\">\n <circle className=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" strokeWidth=\"4\" />\n <path className=\"opacity-75\" fill=\"currentColor\" d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\" />\n </svg>\n );\n}\n\n// HMR Status\nexport function WifiIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M8.288 15.038a5.25 5.25 0 017.424 0M5.106 11.856c3.807-3.808 9.98-3.808 13.788 0M1.924 8.674c5.565-5.565 14.587-5.565 20.152 0M12.53 18.22l-.53.53-.53-.53a.75.75 0 011.06 0z\" />\n </svg>\n );\n}\n\nexport function WifiOffIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 3l18 18M12.53 18.22l-.53.53-.53-.53a.75.75 0 011.06 0zM8.288 15.038a5.25 5.25 0 016.478.447M5.106 11.856a9.743 9.743 0 0110.266.994M1.924 8.674a14.228 14.228 0 0114.614 2.304\" />\n </svg>\n );\n}\n\nexport function WandIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z\" />\n </svg>\n );\n}\n\nexport function TrashIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0\" />\n </svg>\n );\n}\n\nexport function GridIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 6A2.25 2.25 0 016 3.75h2.25A2.25 2.25 0 0110.5 6v2.25a2.25 2.25 0 01-2.25 2.25H6a2.25 2.25 0 01-2.25-2.25V6zM3.75 15.75A2.25 2.25 0 016 13.5h2.25a2.25 2.25 0 012.25 2.25V18a2.25 2.25 0 01-2.25 2.25H6A2.25 2.25 0 013.75 18v-2.25zM13.5 6a2.25 2.25 0 012.25-2.25H18A2.25 2.25 0 0120.25 6v2.25A2.25 2.25 0 0118 10.5h-2.25a2.25 2.25 0 01-2.25-2.25V6zM13.5 15.75a2.25 2.25 0 012.25-2.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-2.25A2.25 2.25 0 0113.5 18v-2.25z\" />\n </svg>\n );\n}\n\nexport function ListIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3.75 12h16.5m-16.5 3.75h16.5M3.75 19.5h16.5M5.625 4.5h12.75a1.875 1.875 0 010 3.75H5.625a1.875 1.875 0 010-3.75z\" />\n </svg>\n );\n}\n\n// Export & Download\nexport function DownloadIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5M16.5 12L12 16.5m0 0L7.5 12m4.5 4.5V3\" />\n </svg>\n );\n}\n\nexport function ExportIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 16.5v2.25A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75V16.5m-13.5-9L12 3m0 0l4.5 4.5M12 3v13.5\" />\n </svg>\n );\n}\n\n// Debugging Icons\nexport function BugIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 12.75c1.148 0 2.278.08 3.383.237 1.037.146 1.866.966 1.866 2.013 0 3.728-2.35 6.75-5.25 6.75S6.75 18.728 6.75 15c0-1.046.83-1.867 1.866-2.013A24.204 24.204 0 0112 12.75zm0 0c2.883 0 5.647.508 8.207 1.44a23.91 23.91 0 01-1.152 6.06M12 12.75c-2.883 0-5.647.508-8.208 1.44a23.91 23.91 0 001.153 6.06M12 12.75V8.25m0-4.5v4.5m0-4.5a2.25 2.25 0 00-2.25 2.25v.386c0 .507.168.977.45 1.357l.393.524a2.25 2.25 0 003.814 0l.393-.524c.282-.38.45-.85.45-1.357V6a2.25 2.25 0 00-2.25-2.25z\" />\n </svg>\n );\n}\n\nexport function PauseIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M6 4h4v16H6V4zm8 0h4v16h-4V4z\" />\n </svg>\n );\n}\n\nexport function StepOverIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M3 12h12m0 0l-4-4m4 4l-4 4m6-10v4m0 0v4m0-4h4\" />\n </svg>\n );\n}\n\nexport function StepIntoIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 3v12m0 0l-4-4m4 4l4-4m-4 6v3\" />\n </svg>\n );\n}\n\nexport function ContinueIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5.25 5.653c0-.856.917-1.398 1.667-.986l11.54 6.348a1.125 1.125 0 010 1.971l-11.54 6.347a1.125 1.125 0 01-1.667-.985V5.653z\" />\n </svg>\n );\n}\n\nexport function BreakpointIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <circle cx=\"12\" cy=\"12\" r=\"6\" />\n </svg>\n );\n}\n\nexport function BreakpointEmptyIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <circle cx=\"12\" cy=\"12\" r=\"5\" />\n </svg>\n );\n}\n\nexport function DevicesIcon({ className }: IconProps) {\n return (\n <svg className={className} fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={1.5}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M10.5 19.5h3m-6.75 2.25h10.5a2.25 2.25 0 002.25-2.25v-15a2.25 2.25 0 00-2.25-2.25H6.75A2.25 2.25 0 004.5 4.5v15a2.25 2.25 0 002.25 2.25z\" />\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" />\n </svg>\n );\n}\n","import { useRef, useEffect, useCallback } from 'react';\nimport type { SegmentVariant } from '../../core/index.js';\nimport clsx from 'clsx';\nimport { PlayIcon } from './Icons.js';\n\ninterface VariantTabsProps {\n variants: SegmentVariant[];\n activeIndex: number;\n onSelect: (index: number) => void;\n}\n\nexport function VariantTabs({ variants, activeIndex, onSelect }: VariantTabsProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n const buttonRefs = useRef<Map<number, HTMLButtonElement>>(new Map());\n\n // Scroll active tab into view when it changes\n useEffect(() => {\n const button = buttonRefs.current.get(activeIndex);\n if (button && containerRef.current) {\n button.scrollIntoView({\n behavior: 'smooth',\n block: 'nearest',\n inline: 'center',\n });\n }\n }, [activeIndex]);\n\n // Keyboard navigation for variant tabs\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n if (e.key === 'ArrowLeft') {\n e.preventDefault();\n const newIndex = activeIndex > 0 ? activeIndex - 1 : variants.length - 1;\n onSelect(newIndex);\n } else if (e.key === 'ArrowRight') {\n e.preventDefault();\n const newIndex = activeIndex < variants.length - 1 ? activeIndex + 1 : 0;\n onSelect(newIndex);\n }\n }, [activeIndex, variants.length, onSelect]);\n\n if (variants.length === 0) return null;\n\n return (\n <div\n ref={containerRef}\n className=\"flex items-center gap-1 overflow-x-auto max-w-full scrollbar-thin\"\n onKeyDown={handleKeyDown}\n role=\"tablist\"\n aria-label=\"Component variants\"\n >\n {variants.map((variant, index) => {\n const isActive = activeIndex === index;\n return (\n <button\n key={index}\n ref={(el) => {\n if (el) buttonRefs.current.set(index, el);\n else buttonRefs.current.delete(index);\n }}\n onClick={() => onSelect(index)}\n onKeyDown={handleKeyDown}\n role=\"tab\"\n aria-selected={isActive}\n tabIndex={isActive ? 0 : -1}\n className={clsx(\n 'px-3 py-1 text-xs font-medium rounded whitespace-nowrap flex-shrink-0',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-[--color-accent]',\n 'flex items-center gap-1.5',\n isActive\n ? 'text-primary bg-[--bg-hover]'\n : 'text-tertiary hover:text-secondary'\n )}\n title={variant.hasPlayFunction ? `${variant.name} (has interaction test)` : variant.name}\n >\n {variant.name}\n {variant.hasPlayFunction && (\n <PlayIcon className=\"w-3 h-3 text-[--color-accent]\" />\n )}\n </button>\n );\n })}\n </div>\n );\n}\n","/**\n * Command Palette - Cmd+K Quick Switcher\n *\n * A keyboard-driven command palette for:\n * - Quick navigation to components\n * - Fuzzy search across all components and variants\n * - Keyboard navigation (arrows, enter, escape)\n */\n\nimport { useState, useEffect, useRef, useMemo, useCallback } from \"react\";\nimport clsx from \"clsx\";\nimport type { SegmentDefinition } from \"../../core/index.js\";\nimport { SearchIcon, ChevronRightIcon } from \"./Icons.js\";\n\ninterface CommandPaletteProps {\n /** Whether the palette is open */\n isOpen: boolean;\n /** Callback to close the palette */\n onClose: () => void;\n /** All available segments */\n segments: Array<{ path: string; segment: SegmentDefinition }>;\n /** Callback when a component is selected */\n onSelectComponent: (path: string) => void;\n /** Callback when a variant is selected */\n onSelectVariant: (path: string, variantIndex: number) => void;\n}\n\ninterface SearchResult {\n type: \"component\" | \"variant\";\n path: string;\n componentName: string;\n variantName?: string;\n variantIndex?: number;\n category: string;\n score: number;\n}\n\nexport function CommandPalette({\n isOpen,\n onClose,\n segments,\n onSelectComponent,\n onSelectVariant,\n}: CommandPaletteProps) {\n const [query, setQuery] = useState(\"\");\n const [selectedIndex, setSelectedIndex] = useState(0);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n\n // Build search results with fuzzy matching\n const results = useMemo(() => {\n const allResults: SearchResult[] = [];\n\n for (const { path, segment } of segments) {\n const componentName = segment.meta.name;\n const category = segment.meta.category;\n\n // Add component result\n allResults.push({\n type: \"component\",\n path,\n componentName,\n category,\n score: 0,\n });\n\n // Add variant results\n if (segment.variants) {\n for (let i = 0; i < segment.variants.length; i++) {\n const variant = segment.variants[i];\n allResults.push({\n type: \"variant\",\n path,\n componentName,\n variantName: variant.name,\n variantIndex: i,\n category,\n score: 0,\n });\n }\n }\n }\n\n if (!query.trim()) {\n // No query - show all components sorted alphabetically\n return allResults\n .filter((r) => r.type === \"component\")\n .sort((a, b) => a.componentName.localeCompare(b.componentName))\n .slice(0, 20);\n }\n\n // Fuzzy match and score results\n const lowerQuery = query.toLowerCase();\n const scored = allResults\n .map((result) => {\n const searchText = result.variantName\n ? `${result.componentName} ${result.variantName}`\n : result.componentName;\n const score = fuzzyScore(searchText.toLowerCase(), lowerQuery);\n return { ...result, score };\n })\n .filter((r) => r.score > 0)\n .sort((a, b) => b.score - a.score)\n .slice(0, 20);\n\n return scored;\n }, [segments, query]);\n\n // Reset selection when results change\n useEffect(() => {\n setSelectedIndex(0);\n }, [results]);\n\n // Focus input when opened\n useEffect(() => {\n if (isOpen) {\n setQuery(\"\");\n setSelectedIndex(0);\n setTimeout(() => inputRef.current?.focus(), 0);\n }\n }, [isOpen]);\n\n // Scroll selected item into view\n useEffect(() => {\n if (listRef.current && results.length > 0) {\n const selectedEl = listRef.current.children[selectedIndex] as HTMLElement;\n if (selectedEl) {\n selectedEl.scrollIntoView({ block: \"nearest\" });\n }\n }\n }, [selectedIndex, results.length]);\n\n const handleKeyDown = useCallback(\n (e: React.KeyboardEvent) => {\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setSelectedIndex((i) => Math.min(i + 1, results.length - 1));\n break;\n case \"ArrowUp\":\n e.preventDefault();\n setSelectedIndex((i) => Math.max(i - 1, 0));\n break;\n case \"Enter\":\n e.preventDefault();\n if (results[selectedIndex]) {\n handleSelect(results[selectedIndex]);\n }\n break;\n case \"Escape\":\n e.preventDefault();\n onClose();\n break;\n }\n },\n [results, selectedIndex, onClose]\n );\n\n const handleSelect = (result: SearchResult) => {\n if (result.type === \"variant\" && result.variantIndex !== undefined) {\n onSelectVariant(result.path, result.variantIndex);\n } else {\n onSelectComponent(result.path);\n }\n onClose();\n };\n\n if (!isOpen) return null;\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-start justify-center pt-[15vh]\">\n {/* Backdrop */}\n <div\n className=\"absolute inset-0 bg-black/50 backdrop-blur-sm\"\n onClick={onClose}\n />\n\n {/* Palette */}\n <div\n className=\"relative w-full max-w-xl bg-[--bg-primary] rounded-xl shadow-2xl border border-[--border] overflow-hidden\"\n onKeyDown={handleKeyDown}\n >\n {/* Search input */}\n <div className=\"flex items-center px-4 py-3 border-b-2 border-blue-500\">\n <SearchIcon className=\"w-5 h-5 text-blue-500 mr-3\" />\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search components and variants...\"\n className=\"flex-1 bg-transparent text-primary placeholder-tertiary text-base focus:outline-none\"\n />\n <kbd className=\"hidden sm:inline-flex items-center gap-1 px-2 py-0.5 text-xs text-tertiary bg-[--bg-secondary] rounded border border-[--border]\">\n esc\n </kbd>\n </div>\n\n {/* Results */}\n <div\n ref={listRef}\n className=\"max-h-80 overflow-y-auto py-2\"\n >\n {results.length === 0 ? (\n <div className=\"px-4 py-8 text-center text-tertiary\">\n {query ? (\n <>No results for \"{query}\"</>\n ) : (\n <>Start typing to search...</>\n )}\n </div>\n ) : (\n results.map((result, index) => (\n <button\n key={`${result.path}-${result.variantName || \"component\"}`}\n onClick={() => handleSelect(result)}\n className={clsx(\n \"w-full px-4 py-2 flex items-center gap-3 text-left transition-colors\",\n index === selectedIndex\n ? \"bg-blue-500/10 text-primary\"\n : \"text-secondary hover:bg-[--bg-hover]\"\n )}\n >\n {/* Icon/Badge */}\n <div\n className={clsx(\n \"flex-shrink-0 w-8 h-8 rounded-lg flex items-center justify-center text-xs font-medium\",\n result.type === \"component\"\n ? \"bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300\"\n : \"bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300\"\n )}\n >\n {result.type === \"component\" ? \"C\" : \"V\"}\n </div>\n\n {/* Content */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-medium truncate\">\n {result.componentName}\n </span>\n {result.variantName && (\n <>\n <ChevronRightIcon className=\"w-3 h-3 text-tertiary flex-shrink-0\" />\n <span className=\"text-secondary truncate\">\n {result.variantName}\n </span>\n </>\n )}\n </div>\n <div className=\"text-xs text-tertiary truncate\">\n {result.category}\n </div>\n </div>\n\n {/* Keyboard hint for selected */}\n {index === selectedIndex && (\n <kbd className=\"hidden sm:inline-flex items-center px-1.5 py-0.5 text-[10px] text-tertiary bg-[--bg-secondary] rounded border border-[--border]\">\n enter\n </kbd>\n )}\n </button>\n ))\n )}\n </div>\n\n {/* Footer */}\n <div className=\"px-4 py-2 border-t border-[--border] flex items-center justify-between text-xs text-tertiary\">\n <div className=\"flex items-center gap-3\">\n <span className=\"flex items-center gap-1\">\n <kbd className=\"px-1.5 py-0.5 bg-[--bg-secondary] rounded border border-[--border]\">ā</kbd>\n <kbd className=\"px-1.5 py-0.5 bg-[--bg-secondary] rounded border border-[--border]\">ā</kbd>\n to navigate\n </span>\n <span className=\"flex items-center gap-1\">\n <kbd className=\"px-1.5 py-0.5 bg-[--bg-secondary] rounded border border-[--border]\">āµ</kbd>\n to select\n </span>\n </div>\n <span>\n {results.length} result{results.length !== 1 ? \"s\" : \"\"}\n </span>\n </div>\n </div>\n </div>\n );\n}\n\n/**\n * Simple fuzzy matching score\n * Returns 0 for no match, higher values for better matches\n */\nfunction fuzzyScore(text: string, query: string): number {\n if (!query) return 1;\n\n let score = 0;\n let queryIndex = 0;\n let consecutiveBonus = 0;\n let lastMatchIndex = -2;\n\n for (let i = 0; i < text.length && queryIndex < query.length; i++) {\n if (text[i] === query[queryIndex]) {\n score += 1;\n\n // Bonus for consecutive matches\n if (i === lastMatchIndex + 1) {\n consecutiveBonus += 2;\n score += consecutiveBonus;\n } else {\n consecutiveBonus = 0;\n }\n\n // Bonus for matching at word start\n if (i === 0 || text[i - 1] === \" \" || text[i - 1] === \"-\" || text[i - 1] === \"_\") {\n score += 3;\n }\n\n lastMatchIndex = i;\n queryIndex++;\n }\n }\n\n // Only return score if all query characters were found\n if (queryIndex < query.length) return 0;\n\n // Bonus for shorter results (more relevant)\n score += Math.max(0, 20 - text.length);\n\n // Bonus for exact match\n if (text === query) score += 50;\n\n // Bonus for starts with\n if (text.startsWith(query)) score += 30;\n\n return score;\n}\n","/**\n * Keyboard Shortcuts Help Modal\n *\n * Displays all available keyboard shortcuts in a modal overlay.\n */\n\nimport { useEffect } from \"react\";\nimport { SHORTCUTS } from \"../hooks/useKeyboardShortcuts.js\";\nimport { CloseIcon } from \"./Icons.js\";\n\ninterface KeyboardShortcutsHelpProps {\n isOpen: boolean;\n onClose: () => void;\n}\n\nexport function KeyboardShortcutsHelp({ isOpen, onClose }: KeyboardShortcutsHelpProps) {\n // Close on escape\n useEffect(() => {\n if (!isOpen) return;\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n onClose();\n }\n };\n\n document.addEventListener(\"keydown\", handleEscape);\n return () => document.removeEventListener(\"keydown\", handleEscape);\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4\"\n onClick={onClose}\n >\n {/* Backdrop */}\n <div className=\"absolute inset-0 bg-black/50 backdrop-blur-sm\" />\n\n {/* Modal */}\n <div\n className=\"relative bg-[--bg-primary] border border-[--border] rounded-xl shadow-2xl max-w-md w-full\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-5 py-4 border-b border-[--border]\">\n <h2 className=\"text-base font-semibold text-primary\">Keyboard Shortcuts</h2>\n <button\n onClick={onClose}\n className=\"p-1.5 text-tertiary hover:text-primary hover:bg-[--bg-hover] rounded-lg transition-colors\"\n >\n <CloseIcon className=\"w-4 h-4\" />\n </button>\n </div>\n\n {/* Shortcuts List */}\n <div className=\"p-5 space-y-3\">\n {SHORTCUTS.map((shortcut, index) => (\n <div key={index} className=\"flex items-center justify-between\">\n <span className=\"text-sm text-secondary\">{shortcut.description}</span>\n <div className=\"flex items-center gap-1.5\">\n {shortcut.keys.map((key, keyIndex) => (\n <span key={keyIndex} className=\"flex items-center\">\n {keyIndex > 0 && (\n <span className=\"text-xs text-tertiary mx-1\">or</span>\n )}\n <kbd className=\"px-2 py-1 text-xs font-mono bg-[--bg-secondary] border border-[--border] rounded text-primary\">\n {key}\n </kbd>\n </span>\n ))}\n </div>\n </div>\n ))}\n </div>\n\n {/* Footer */}\n <div className=\"px-5 py-3 border-t border-[--border] bg-[--bg-secondary] rounded-b-xl\">\n <p className=\"text-xs text-tertiary text-center\">\n Press <kbd className=\"px-1.5 py-0.5 text-xs font-mono bg-[--bg-primary] border border-[--border] rounded\">?</kbd> to toggle this help\n </p>\n </div>\n </div>\n </div>\n );\n}\n\nexport default KeyboardShortcutsHelp;\n","/**\n * Keyboard Shortcuts Hook\n *\n * Provides global keyboard navigation for the viewer:\n * - j/k or ā/ā: Navigate components\n * - [/] or ā/ā: Navigate variants\n * - 1-9: Jump to variant by number\n * - t: Toggle preview theme\n * - p: Toggle panel\n * - cmd+shift+c: Copy link\n * - ?: Show shortcuts help\n * - Escape: Close modals/clear search\n */\n\nimport { useEffect, useCallback } from \"react\";\n\nexport interface ShortcutActions {\n /** Navigate to next component */\n nextComponent: () => void;\n /** Navigate to previous component */\n prevComponent: () => void;\n /** Navigate to next variant */\n nextVariant: () => void;\n /** Navigate to previous variant */\n prevVariant: () => void;\n /** Jump to variant by index (0-based) */\n goToVariant: (index: number) => void;\n /** Toggle preview theme */\n toggleTheme: () => void;\n /** Toggle panel open/closed */\n togglePanel: () => void;\n /** Copy shareable link */\n copyLink: () => void;\n /** Show shortcuts help */\n showHelp: () => void;\n /** Open search/command palette */\n openSearch: () => void;\n /** Close any open modal/dialog */\n escape: () => void;\n}\n\nexport interface ShortcutConfig {\n /** Whether shortcuts are enabled */\n enabled?: boolean;\n /** Number of variants available */\n variantCount?: number;\n}\n\n/**\n * Check if an element is an input that should capture keyboard events\n */\nfunction isInputElement(element: EventTarget | null): boolean {\n if (!element || !(element instanceof HTMLElement)) return false;\n\n const tagName = element.tagName.toLowerCase();\n if (tagName === \"input\" || tagName === \"textarea\" || tagName === \"select\") {\n return true;\n }\n\n if (element.isContentEditable) {\n return true;\n }\n\n // Check if inside Monaco Editor\n if (element.closest('.monaco-editor')) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Hook to register keyboard shortcuts\n */\nexport function useKeyboardShortcuts(\n actions: Partial<ShortcutActions>,\n config: ShortcutConfig = {}\n) {\n const { enabled = true, variantCount = 0 } = config;\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent) => {\n if (!enabled) return;\n\n // Don't capture events from input elements (except for specific shortcuts)\n const isInput = isInputElement(event.target);\n\n // Global shortcuts that work even in inputs\n if (event.key === \"Escape\") {\n actions.escape?.();\n return;\n }\n\n // cmd+shift+c: Copy link (works everywhere)\n if ((event.metaKey || event.ctrlKey) && event.shiftKey && event.key === \"c\") {\n event.preventDefault();\n actions.copyLink?.();\n return;\n }\n\n // cmd+k: Open search/command palette (works everywhere)\n if ((event.metaKey || event.ctrlKey) && event.key === \"k\") {\n event.preventDefault();\n actions.openSearch?.();\n return;\n }\n\n // Skip other shortcuts if in input\n if (isInput) return;\n\n // \"/\" also opens search (when not in input)\n if (event.key === \"/\") {\n event.preventDefault();\n actions.openSearch?.();\n return;\n }\n\n // Navigation shortcuts\n switch (event.key) {\n // Component navigation\n case \"j\":\n case \"ArrowDown\":\n if (!event.metaKey && !event.ctrlKey && !event.altKey) {\n event.preventDefault();\n actions.nextComponent?.();\n }\n break;\n\n case \"k\":\n case \"ArrowUp\":\n if (!event.metaKey && !event.ctrlKey && !event.altKey) {\n event.preventDefault();\n actions.prevComponent?.();\n }\n break;\n\n // Variant navigation\n case \"[\":\n case \"ArrowLeft\":\n if (!event.metaKey && !event.ctrlKey && !event.altKey) {\n event.preventDefault();\n actions.prevVariant?.();\n }\n break;\n\n case \"]\":\n case \"ArrowRight\":\n if (!event.metaKey && !event.ctrlKey && !event.altKey) {\n event.preventDefault();\n actions.nextVariant?.();\n }\n break;\n\n // Number keys 1-9 for variant selection\n case \"1\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n case \"8\":\n case \"9\":\n if (!event.metaKey && !event.ctrlKey && !event.altKey) {\n const index = parseInt(event.key, 10) - 1;\n if (index < variantCount) {\n event.preventDefault();\n actions.goToVariant?.(index);\n }\n }\n break;\n\n // Theme toggle\n case \"t\":\n if (!event.metaKey && !event.ctrlKey && !event.altKey) {\n event.preventDefault();\n actions.toggleTheme?.();\n }\n break;\n\n // Panel toggle\n case \"p\":\n if (!event.metaKey && !event.ctrlKey && !event.altKey) {\n event.preventDefault();\n actions.togglePanel?.();\n }\n break;\n\n // Help\n case \"?\":\n event.preventDefault();\n actions.showHelp?.();\n break;\n }\n },\n [enabled, actions, variantCount]\n );\n\n useEffect(() => {\n document.addEventListener(\"keydown\", handleKeyDown);\n return () => document.removeEventListener(\"keydown\", handleKeyDown);\n }, [handleKeyDown]);\n}\n\n/**\n * Keyboard shortcuts data for help display\n */\nexport const SHORTCUTS = [\n { keys: [\"j\", \"ā\"], description: \"Next component\" },\n { keys: [\"k\", \"ā\"], description: \"Previous component\" },\n { keys: [\"[\", \"ā\"], description: \"Previous variant\" },\n { keys: [\"]\", \"ā\"], description: \"Next variant\" },\n { keys: [\"1-9\"], description: \"Go to variant\" },\n { keys: [\"t\"], description: \"Toggle preview theme\" },\n { keys: [\"p\"], description: \"Toggle panel\" },\n { keys: [\"āā§C\"], description: \"Copy link\" },\n { keys: [\"/\", \"āK\"], description: \"Search\" },\n { keys: [\"?\"], description: \"Show shortcuts\" },\n { keys: [\"Esc\"], description: \"Close / Clear\" },\n];\n\nexport default useKeyboardShortcuts;\n","import { useEffect, useState } from 'react';\nimport { CheckIcon, WarningIcon, RefreshIcon } from './Icons.js';\n\nexport interface ToastMessage {\n id: string;\n type: 'success' | 'error' | 'info';\n message: string;\n duration?: number;\n}\n\ninterface ToastProps {\n messages: ToastMessage[];\n onDismiss: (id: string) => void;\n}\n\nexport function Toast({ messages, onDismiss }: ToastProps) {\n return (\n <div className=\"fixed bottom-4 right-4 z-50 flex flex-col gap-2\">\n {messages.map((toast) => (\n <ToastItem key={toast.id} toast={toast} onDismiss={onDismiss} />\n ))}\n </div>\n );\n}\n\nfunction ToastItem({ toast, onDismiss }: { toast: ToastMessage; onDismiss: (id: string) => void }) {\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n // Animate in\n requestAnimationFrame(() => setIsVisible(true));\n\n // Auto-dismiss\n const timer = setTimeout(() => {\n setIsVisible(false);\n setTimeout(() => onDismiss(toast.id), 200);\n }, toast.duration || 3000);\n\n return () => clearTimeout(timer);\n }, [toast.id, toast.duration, onDismiss]);\n\n const iconMap = {\n success: <CheckIcon className=\"w-4 h-4 text-emerald-500\" />,\n error: <WarningIcon className=\"w-4 h-4 text-red-500\" />,\n info: <RefreshIcon className=\"w-4 h-4 text-blue-500\" />,\n };\n\n const bgMap = {\n success: 'bg-emerald-500/10 border-emerald-500/20',\n error: 'bg-red-500/10 border-red-500/20',\n info: 'bg-blue-500/10 border-blue-500/20',\n };\n\n return (\n <div\n className={`\n flex items-center gap-2 px-3 py-2 rounded-lg border backdrop-blur-sm\n shadow-lg transition-all duration-200 ease-out\n ${bgMap[toast.type]}\n ${isVisible ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-2'}\n `}\n >\n {iconMap[toast.type]}\n <span className=\"text-sm text-primary font-medium\">{toast.message}</span>\n </div>\n );\n}\n","import { useState, useEffect, useCallback } from 'react';\nimport clsx from 'clsx';\nimport {\n ZOOM_LEVELS,\n type ZoomLevel,\n type BackgroundOption,\n} from '../constants/ui.js';\nimport { ZoomIcon, ChevronDownIcon } from './Icons.js';\n\n// Re-export types for consumers\nexport type { ZoomLevel, BackgroundOption };\nexport { getBackgroundStyle } from '../constants/ui.js';\n\n// Background options with display metadata\nconst BACKGROUND_OPTIONS_UI: { value: BackgroundOption; label: string; icon: string }[] = [\n { value: 'white', label: 'White', icon: 'ā»' },\n { value: 'black', label: 'Black', icon: 'ā¼' },\n { value: 'checkerboard', label: 'Checkerboard', icon: 'ā¦' },\n { value: 'transparent', label: 'Transparent', icon: 'ā' },\n];\n\ninterface PreviewToolbarProps {\n zoom: ZoomLevel;\n background: BackgroundOption;\n onZoomChange: (zoom: ZoomLevel) => void;\n onBackgroundChange: (bg: BackgroundOption) => void;\n}\n\nexport function PreviewToolbar({\n zoom,\n background,\n onZoomChange,\n onBackgroundChange,\n}: PreviewToolbarProps) {\n const [zoomOpen, setZoomOpen] = useState(false);\n const [bgOpen, setBgOpen] = useState(false);\n\n // Keyboard shortcuts for zoom\n const handleKeyDown = useCallback((e: KeyboardEvent) => {\n // Don't handle if in input/textarea\n const target = e.target as HTMLElement;\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\n return;\n }\n\n if (e.key === '=' || e.key === '+') {\n e.preventDefault();\n const currentIndex = ZOOM_LEVELS.indexOf(zoom);\n if (currentIndex < ZOOM_LEVELS.length - 1) {\n onZoomChange(ZOOM_LEVELS[currentIndex + 1]);\n }\n } else if (e.key === '-') {\n e.preventDefault();\n const currentIndex = ZOOM_LEVELS.indexOf(zoom);\n if (currentIndex > 0) {\n onZoomChange(ZOOM_LEVELS[currentIndex - 1]);\n }\n } else if (e.key === '0') {\n e.preventDefault();\n onZoomChange(100);\n }\n }, [zoom, onZoomChange]);\n\n useEffect(() => {\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [handleKeyDown]);\n\n // Close dropdowns when clicking outside\n useEffect(() => {\n const handleClick = () => {\n setZoomOpen(false);\n setBgOpen(false);\n };\n if (zoomOpen || bgOpen) {\n document.addEventListener('click', handleClick);\n return () => document.removeEventListener('click', handleClick);\n }\n }, [zoomOpen, bgOpen]);\n\n return (\n <div className=\"flex items-center gap-2\">\n {/* Zoom dropdown */}\n <div className=\"relative\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n setZoomOpen(!zoomOpen);\n setBgOpen(false);\n }}\n className={clsx(\n 'flex items-center gap-1.5 px-2 py-1 text-xs font-medium rounded',\n 'text-secondary hover:text-primary',\n 'hover:bg-[--bg-hover] transition-colors',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-[--color-accent]'\n )}\n title=\"Zoom level (+/-/0)\"\n >\n <ZoomIcon className=\"w-3.5 h-3.5\" />\n <span>{zoom}%</span>\n <ChevronDownIcon className=\"w-3 h-3\" />\n </button>\n {zoomOpen && (\n <div className=\"absolute top-full left-0 mt-1 py-1 min-w-[80px] bg-[--bg-elevated] border border-[--border] rounded-lg shadow-lg z-50\">\n {ZOOM_LEVELS.map((level) => (\n <button\n key={level}\n onClick={(e) => {\n e.stopPropagation();\n onZoomChange(level);\n setZoomOpen(false);\n }}\n className={clsx(\n 'w-full px-3 py-1.5 text-xs text-left',\n 'hover:bg-[--bg-hover] transition-colors',\n level === zoom ? 'text-[--color-accent] font-medium' : 'text-secondary'\n )}\n >\n {level}%\n </button>\n ))}\n </div>\n )}\n </div>\n\n {/* Divider */}\n <div className=\"w-px h-4 bg-[--border]\" />\n\n {/* Background selector */}\n <div className=\"relative\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n setBgOpen(!bgOpen);\n setZoomOpen(false);\n }}\n className={clsx(\n 'flex items-center gap-1.5 px-2 py-1 text-xs font-medium rounded',\n 'text-secondary hover:text-primary',\n 'hover:bg-[--bg-hover] transition-colors',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-[--color-accent]'\n )}\n title=\"Background color\"\n >\n <span className=\"text-sm\">\n {BACKGROUND_OPTIONS_UI.find(o => o.value === background)?.icon}\n </span>\n <span className=\"capitalize\">{background}</span>\n <ChevronDownIcon className=\"w-3 h-3\" />\n </button>\n {bgOpen && (\n <div className=\"absolute top-full left-0 mt-1 py-1 min-w-[120px] bg-[--bg-elevated] border border-[--border] rounded-lg shadow-lg z-50\">\n {BACKGROUND_OPTIONS_UI.map((option) => (\n <button\n key={option.value}\n onClick={(e) => {\n e.stopPropagation();\n onBackgroundChange(option.value);\n setBgOpen(false);\n }}\n className={clsx(\n 'w-full px-3 py-1.5 text-xs text-left flex items-center gap-2',\n 'hover:bg-[--bg-hover] transition-colors',\n option.value === background ? 'text-[--color-accent] font-medium' : 'text-secondary'\n )}\n >\n <span className=\"text-sm\">{option.icon}</span>\n {option.label}\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n","/**\n * Shared UI constants for consistent styling across the viewer.\n * Single source of truth for colors, status styles, and other UI config.\n */\n\nimport { BRAND } from '../../core/index.js';\n\n/**\n * Component status definitions with consistent styling.\n * Used in sidebar badges, component header, and filters.\n */\nexport const STATUS_CONFIG = {\n stable: {\n label: 'Stable',\n badge: 'badge-success',\n bg: 'bg-emerald-500/15',\n text: 'text-emerald-600 dark:text-emerald-400',\n border: 'border-emerald-500/30',\n },\n experimental: {\n label: 'Experimental',\n badge: 'badge-warning',\n bg: 'bg-purple-500/15',\n text: 'text-purple-600 dark:text-purple-400',\n border: 'border-purple-500/30',\n },\n deprecated: {\n label: 'Deprecated',\n badge: 'badge-danger',\n bg: 'bg-red-500/15',\n text: 'text-red-600 dark:text-red-400',\n border: 'border-red-500/30',\n },\n beta: {\n label: 'Beta',\n badge: 'badge-warning',\n bg: 'bg-amber-500/15',\n text: 'text-amber-600 dark:text-amber-400',\n border: 'border-amber-500/30',\n },\n} as const;\n\nexport type ComponentStatus = keyof typeof STATUS_CONFIG;\n\n/**\n * Get status config with fallback for unknown statuses.\n */\nexport function getStatusConfig(status: string | undefined) {\n if (!status) return null;\n return STATUS_CONFIG[status as ComponentStatus] || {\n label: status,\n badge: 'badge-default',\n bg: 'bg-gray-500/15',\n text: 'text-gray-600 dark:text-gray-400',\n border: 'border-gray-500/30',\n };\n}\n\n/**\n * Relationship type styling for related components.\n */\nexport const RELATIONSHIP_CONFIG = {\n alternative: {\n label: 'Alternative',\n bg: 'bg-blue-500/10',\n text: 'text-blue-500',\n },\n parent: {\n label: 'Parent',\n bg: 'bg-purple-500/10',\n text: 'text-purple-500',\n },\n child: {\n label: 'Child',\n bg: 'bg-emerald-500/10',\n text: 'text-emerald-500',\n },\n sibling: {\n label: 'Sibling',\n bg: 'bg-amber-500/10',\n text: 'text-amber-500',\n },\n related: {\n label: 'Related',\n bg: 'bg-[--bg-tertiary]',\n text: 'text-secondary',\n },\n composition: {\n label: 'Uses',\n bg: 'bg-cyan-500/10',\n text: 'text-cyan-500',\n },\n} as const;\n\nexport type RelationshipType = keyof typeof RELATIONSHIP_CONFIG;\n\n/**\n * Get relationship config with fallback.\n */\nexport function getRelationshipConfig(relationship: string) {\n return RELATIONSHIP_CONFIG[relationship as RelationshipType] || RELATIONSHIP_CONFIG.related;\n}\n\n/**\n * Preview background options.\n */\nexport const BACKGROUND_OPTIONS = ['white', 'black', 'checkerboard', 'transparent'] as const;\nexport type BackgroundOption = (typeof BACKGROUND_OPTIONS)[number];\n\n/**\n * Zoom level options.\n */\nexport const ZOOM_LEVELS = [50, 75, 100, 150, 200] as const;\nexport type ZoomLevel = (typeof ZOOM_LEVELS)[number];\n\n/**\n * Viewport presets.\n */\nexport const VIEWPORT_PRESETS = {\n responsive: { label: 'Responsive', width: null, icon: 'ā' },\n desktop: { label: 'Desktop', width: 1280, icon: 'š„' },\n tablet: { label: 'Tablet', width: 768, icon: 'š±' },\n mobile: { label: 'Mobile', width: 375, icon: 'š±' },\n} as const;\n\nexport type ViewportPreset = keyof typeof VIEWPORT_PRESETS | 'custom';\n\n/**\n * Get CSS background style for preview pane.\n */\nexport function getBackgroundStyle(bg: BackgroundOption): React.CSSProperties {\n switch (bg) {\n case 'white':\n return { backgroundColor: '#ffffff' };\n case 'black':\n return { backgroundColor: '#000000' };\n case 'transparent':\n return { backgroundColor: 'transparent' };\n case 'checkerboard':\n return {\n backgroundColor: '#ffffff',\n backgroundImage: `\n linear-gradient(45deg, #e5e5e5 25%, transparent 25%),\n linear-gradient(-45deg, #e5e5e5 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #e5e5e5 75%),\n linear-gradient(-45deg, transparent 75%, #e5e5e5 75%)\n `,\n backgroundSize: '16px 16px',\n backgroundPosition: '0 0, 0 8px, 8px -8px, -8px 0px',\n };\n default:\n return { backgroundColor: '#ffffff' };\n }\n}\n\n/**\n * Storage keys for localStorage persistence.\n */\nexport const STORAGE_KEYS = {\n theme: `${BRAND.storagePrefix}theme`,\n collapsedCategories: `${BRAND.storagePrefix}collapsed-categories`,\n} as const;\n\n/**\n * HMR connection status.\n */\nexport const HMR_STATUS = {\n connected: {\n label: 'Connected',\n color: 'text-emerald-500',\n bg: 'bg-emerald-500',\n },\n reconnecting: {\n label: 'Reconnecting...',\n color: 'text-amber-500',\n bg: 'bg-amber-500',\n },\n disconnected: {\n label: 'Disconnected',\n color: 'text-red-500',\n bg: 'bg-red-500',\n },\n} as const;\n\nexport type HmrStatus = keyof typeof HMR_STATUS;\n","import { useState, useEffect } from 'react';\nimport clsx from 'clsx';\nimport { VIEWPORT_PRESETS, type ViewportPreset } from '../constants/ui.js';\nimport { ViewportIcon, ChevronDownIcon } from './Icons.js';\n\n// Re-export for consumers\nexport type { ViewportPreset };\n\nexport interface ViewportSize {\n width: number | null;\n height: number | null;\n}\n\n// Viewport presets with display metadata\nconst VIEWPORT_PRESETS_UI = Object.entries(VIEWPORT_PRESETS).map(([value, config]) => ({\n value: value as ViewportPreset,\n label: config.label,\n width: config.width,\n icon: config.icon,\n}));\n\ninterface ViewportSelectorProps {\n viewport: ViewportPreset;\n customSize: ViewportSize;\n onViewportChange: (viewport: ViewportPreset) => void;\n onCustomSizeChange: (size: ViewportSize) => void;\n}\n\nexport function ViewportSelector({\n viewport,\n customSize,\n onViewportChange,\n onCustomSizeChange,\n}: ViewportSelectorProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [showCustom, setShowCustom] = useState(false);\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClick = () => {\n setIsOpen(false);\n };\n if (isOpen) {\n document.addEventListener('click', handleClick);\n return () => document.removeEventListener('click', handleClick);\n }\n }, [isOpen]);\n\n const currentPreset = VIEWPORT_PRESETS_UI.find(p => p.value === viewport);\n const displayLabel = viewport === 'custom'\n ? `${customSize.width || '?'}Ć${customSize.height || 'auto'}`\n : currentPreset?.label || 'Responsive';\n\n return (\n <div className=\"relative\">\n <button\n onClick={(e) => {\n e.stopPropagation();\n setIsOpen(!isOpen);\n }}\n className={clsx(\n 'flex items-center gap-1.5 px-2 py-1 text-xs font-medium rounded',\n 'text-secondary hover:text-primary',\n 'hover:bg-[--bg-hover] transition-colors',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-[--color-accent]'\n )}\n title=\"Viewport size\"\n >\n <ViewportIcon className=\"w-3.5 h-3.5\" />\n <span>{displayLabel}</span>\n <ChevronDownIcon className=\"w-3 h-3\" />\n </button>\n\n {isOpen && (\n <div\n className=\"absolute top-full right-0 mt-1 py-1 min-w-[160px] bg-[--bg-elevated] border border-[--border] rounded-lg shadow-lg z-50\"\n onClick={(e) => e.stopPropagation()}\n >\n {VIEWPORT_PRESETS_UI.map((preset) => (\n <button\n key={preset.value}\n onClick={() => {\n onViewportChange(preset.value);\n setShowCustom(false);\n setIsOpen(false);\n }}\n className={clsx(\n 'w-full px-3 py-1.5 text-xs text-left flex items-center justify-between',\n 'hover:bg-[--bg-hover] transition-colors',\n preset.value === viewport ? 'text-[--color-accent] font-medium' : 'text-secondary'\n )}\n >\n <span className=\"flex items-center gap-2\">\n <span>{preset.icon}</span>\n {preset.label}\n </span>\n {preset.width && (\n <span className=\"text-[10px] text-tertiary\">{preset.width}px</span>\n )}\n </button>\n ))}\n\n <div className=\"border-t border-[--border-subtle] my-1\" />\n\n <button\n onClick={() => {\n setShowCustom(!showCustom);\n }}\n className={clsx(\n 'w-full px-3 py-1.5 text-xs text-left flex items-center gap-2',\n 'hover:bg-[--bg-hover] transition-colors',\n viewport === 'custom' ? 'text-[--color-accent] font-medium' : 'text-secondary'\n )}\n >\n <span>ā</span>\n Custom size\n <ChevronDownIcon className={clsx('w-3 h-3 ml-auto transition-transform', showCustom && 'rotate-180')} />\n </button>\n\n {showCustom && (\n <div className=\"px-3 py-2 space-y-2\">\n <div className=\"flex items-center gap-2\">\n <label className=\"text-[10px] text-tertiary w-8\">W:</label>\n <input\n type=\"number\"\n value={customSize.width || ''}\n onChange={(e) => {\n const width = e.target.value ? parseInt(e.target.value, 10) : null;\n onCustomSizeChange({ ...customSize, width });\n onViewportChange('custom');\n }}\n placeholder=\"auto\"\n className=\"w-16 px-2 py-1 text-[11px] font-mono bg-[--bg-primary] border border-[--border] rounded text-primary\"\n />\n <span className=\"text-[10px] text-tertiary\">px</span>\n </div>\n <div className=\"flex items-center gap-2\">\n <label className=\"text-[10px] text-tertiary w-8\">H:</label>\n <input\n type=\"number\"\n value={customSize.height || ''}\n onChange={(e) => {\n const height = e.target.value ? parseInt(e.target.value, 10) : null;\n onCustomSizeChange({ ...customSize, height });\n onViewportChange('custom');\n }}\n placeholder=\"auto\"\n className=\"w-16 px-2 py-1 text-[11px] font-mono bg-[--bg-primary] border border-[--border] rounded text-primary\"\n />\n <span className=\"text-[10px] text-tertiary\">px</span>\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\n// Get viewport width from preset\nexport function getViewportWidth(viewport: ViewportPreset, customSize: ViewportSize): number | null {\n if (viewport === 'custom') return customSize.width;\n if (viewport === 'responsive') return null;\n return VIEWPORT_PRESETS[viewport]?.width ?? null;\n}\n","/**\n * PreviewArea component - handles rendering the component preview.\n * Extracted from App.tsx for better organization and performance.\n *\n * Now supports iframe-based isolation for CSS isolation between\n * the viewer shell and user's component library.\n */\n\nimport { memo, type ReactNode } from 'react';\nimport type { SegmentVariant } from '../../core/index.js';\nimport { ErrorBoundary } from './ErrorBoundary.js';\nimport { FigmaEmbed } from './FigmaEmbed.js';\nimport { VariantMatrix } from './VariantMatrix.js';\nimport { MultiViewportPreview } from './MultiViewportPreview.js';\nimport { IsolatedPreviewFrame } from './IsolatedPreviewFrame.js';\nimport { getBackgroundStyle, type ZoomLevel, type BackgroundOption } from './PreviewToolbar.js';\nimport type { PreviewTheme } from '../hooks/useViewSettings.js';\nimport { getViewportWidth, type ViewportPreset, type ViewportSize } from './ViewportSelector.js';\n\ninterface PreviewAreaProps {\n // Component data\n componentName: string;\n segmentPath: string;\n variant: SegmentVariant | undefined;\n variants: SegmentVariant[] | undefined;\n\n // View settings\n zoom: ZoomLevel;\n background: BackgroundOption;\n viewport: ViewportPreset;\n customSize: ViewportSize;\n previewTheme: PreviewTheme;\n\n // Display modes\n showMatrixView: boolean;\n showMultiViewport: boolean;\n showComparison: boolean;\n\n // Figma\n figmaUrl?: string;\n allFigmaUrls: string[];\n\n // Callbacks\n onSelectVariant: (index: number) => void;\n onRetry: () => void;\n\n // Render function for variant content (used as fallback and for matrix/multi-viewport)\n renderContent: () => ReactNode;\n\n // Keys for forcing re-renders\n previewKey: string;\n\n // Whether to use iframe isolation (default: true)\n useIframeIsolation?: boolean;\n}\n\n// Device mockup component for tablet/mobile preview\ninterface DeviceMockupProps {\n type: 'tablet' | 'mobile';\n width: number;\n children: React.ReactNode;\n}\n\nconst DeviceMockup = memo(function DeviceMockup({ type, width, children }: DeviceMockupProps) {\n const isMobile = type === 'mobile';\n const frameWidth = width + 24;\n const frameHeight = isMobile ? 720 : 1024;\n const screenHeight = frameHeight - (isMobile ? 80 : 48);\n\n return (\n <div className=\"relative flex-shrink-0\" style={{ width: `${frameWidth}px` }}>\n <div\n className=\"relative rounded-[40px] bg-[#1a1a1a] p-3 shadow-2xl\"\n style={{\n boxShadow: '0 25px 50px -12px rgba(0, 0, 0, 0.5), inset 0 1px 0 rgba(255,255,255,0.1)',\n }}\n >\n {isMobile && (\n <>\n <div className=\"absolute -left-[3px] top-24 w-[3px] h-8 bg-[#2a2a2a] rounded-l\" />\n <div className=\"absolute -left-[3px] top-36 w-[3px] h-12 bg-[#2a2a2a] rounded-l\" />\n <div className=\"absolute -left-[3px] top-52 w-[3px] h-12 bg-[#2a2a2a] rounded-l\" />\n <div className=\"absolute -right-[3px] top-32 w-[3px] h-16 bg-[#2a2a2a] rounded-r\" />\n </>\n )}\n\n <div\n className=\"relative rounded-[32px] overflow-hidden bg-white\"\n style={{ height: `${screenHeight}px` }}\n >\n {isMobile ? (\n <div className=\"absolute top-0 left-1/2 -translate-x-1/2 w-[120px] h-[30px] bg-[#1a1a1a] rounded-b-2xl z-10 flex items-center justify-center gap-2\">\n <div className=\"w-2 h-2 rounded-full bg-[#2a2a2a]\" />\n <div className=\"w-12 h-1.5 rounded-full bg-[#2a2a2a]\" />\n </div>\n ) : (\n <div className=\"absolute top-2 left-1/2 -translate-x-1/2 w-3 h-3 rounded-full bg-[#2a2a2a] z-10\" />\n )}\n\n <div className=\"w-full h-full overflow-auto\">{children}</div>\n\n <div className=\"absolute bottom-2 left-1/2 -translate-x-1/2 w-[100px] h-1 bg-black/20 rounded-full z-10\" />\n </div>\n </div>\n </div>\n );\n});\n\n// Inner preview content with zoom transform\ninterface PreviewContentProps {\n zoom: ZoomLevel;\n previewTheme: PreviewTheme;\n background: BackgroundOption;\n children: ReactNode;\n}\n\nconst PreviewContent = memo(function PreviewContent({ zoom, previewTheme, background, children }: PreviewContentProps) {\n return (\n <div\n data-preview-container=\"true\"\n data-theme={previewTheme}\n className=\"w-full h-full overflow-auto\"\n style={{\n backgroundColor: background === 'transparent' ? 'transparent' : undefined,\n }}\n >\n <div\n className=\"p-6\"\n style={{\n transform: `scale(${zoom / 100})`,\n transformOrigin: 'top left',\n width: zoom !== 100 ? `${100 / (zoom / 100)}%` : '100%',\n color: '#1f2937',\n }}\n >\n {children}\n </div>\n </div>\n );\n});\n\nexport function PreviewArea({\n componentName,\n segmentPath,\n variant,\n variants,\n zoom,\n background,\n viewport,\n customSize,\n previewTheme,\n showMatrixView,\n showMultiViewport,\n showComparison,\n figmaUrl,\n allFigmaUrls,\n onSelectVariant,\n onRetry,\n renderContent,\n previewKey,\n useIframeIsolation = true,\n}: PreviewAreaProps) {\n // Matrix view\n if (showMatrixView && variants) {\n return (\n <VariantMatrix\n variants={variants}\n componentName={componentName}\n segmentPath={segmentPath}\n zoom={zoom}\n previewTheme={previewTheme}\n background={background}\n useIframeIsolation={useIframeIsolation}\n onSelectVariant={(index) => {\n onSelectVariant(index);\n }}\n />\n );\n }\n\n // Multi-viewport view\n if (showMultiViewport && variant) {\n return (\n <MultiViewportPreview\n componentName={componentName}\n segmentPath={segmentPath}\n variantName={variant.name}\n renderContent={renderContent}\n previewTheme={previewTheme}\n background={background}\n zoom={zoom}\n useIframeIsolation={useIframeIsolation}\n />\n );\n }\n\n const viewportWidth = getViewportWidth(viewport, customSize);\n const viewportHeight = viewport === 'custom' ? customSize.height : null;\n const isDevice = viewport === 'tablet' || viewport === 'mobile';\n const backgroundStyle = getBackgroundStyle(background);\n\n // Device mockup view (tablet/mobile)\n if (isDevice && viewportWidth && variant) {\n const deviceScreenHeight = viewport === 'mobile' ? 640 : 976;\n\n if (showComparison && figmaUrl) {\n return (\n <div className=\"min-h-full flex flex-col p-6\">\n <div className=\"flex gap-4 flex-1\">\n <div className=\"flex-1 flex flex-col\">\n <div className=\"text-xs font-medium text-tertiary mb-2 text-center\">Rendered</div>\n <div className=\"flex-1 flex items-center justify-center\" style={backgroundStyle}>\n <DeviceMockup type={viewport as 'tablet' | 'mobile'} width={viewportWidth}>\n {useIframeIsolation ? (\n <IsolatedPreviewFrame\n segmentPath={segmentPath}\n variantName={variant.name}\n theme={previewTheme}\n width={viewportWidth}\n height={deviceScreenHeight}\n previewKey={previewKey}\n />\n ) : (\n <PreviewContent zoom={zoom} previewTheme={previewTheme} background={background}>\n <ErrorBoundary key={previewKey} componentName={componentName} onRetry={onRetry}>\n {renderContent()}\n </ErrorBoundary>\n </PreviewContent>\n )}\n </DeviceMockup>\n </div>\n </div>\n\n <div className=\"flex-1 flex flex-col\">\n <div className=\"text-xs font-medium text-tertiary mb-2 text-center\">Figma Design</div>\n <FigmaEmbed\n figmaUrl={figmaUrl}\n allFigmaUrls={allFigmaUrls}\n zoom={zoom}\n className=\"flex-1 rounded-lg border border-[--border] overflow-hidden\"\n style={backgroundStyle}\n />\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"min-h-full flex items-center justify-center p-8\">\n <DeviceMockup type={viewport as 'tablet' | 'mobile'} width={viewportWidth}>\n {useIframeIsolation ? (\n <IsolatedPreviewFrame\n segmentPath={segmentPath}\n variantName={variant.name}\n theme={previewTheme}\n width={viewportWidth}\n height={deviceScreenHeight}\n previewKey={previewKey}\n />\n ) : (\n <PreviewContent zoom={zoom} previewTheme={previewTheme} background={background}>\n <ErrorBoundary key={previewKey} componentName={componentName} onRetry={onRetry}>\n {renderContent()}\n </ErrorBoundary>\n </PreviewContent>\n )}\n </DeviceMockup>\n </div>\n );\n }\n\n // Side-by-side comparison view\n if (showComparison && figmaUrl && variant) {\n return (\n <div className=\"min-h-full flex flex-col p-6\">\n <div className=\"flex gap-4 flex-1\">\n <div className=\"flex-1 flex flex-col\">\n <div className=\"text-xs font-medium text-tertiary mb-2 text-center\">Rendered</div>\n <div\n className=\"flex-1 rounded-lg border border-[--border] overflow-auto\"\n style={backgroundStyle}\n >\n {useIframeIsolation ? (\n <IsolatedPreviewFrame\n segmentPath={segmentPath}\n variantName={variant.name}\n theme={previewTheme}\n width=\"100%\"\n height=\"100%\"\n minHeight={300}\n previewKey={previewKey}\n />\n ) : (\n <div\n className=\"flex items-center justify-center p-8\"\n data-preview-container=\"true\"\n data-theme={previewTheme}\n >\n <div\n style={{\n transform: `scale(${zoom / 100})`,\n transformOrigin: 'top left',\n width: zoom !== 100 ? `${100 / (zoom / 100)}%` : '100%',\n color: '#1f2937',\n }}\n >\n <ErrorBoundary key={previewKey} componentName={componentName} onRetry={onRetry}>\n {renderContent()}\n </ErrorBoundary>\n </div>\n </div>\n )}\n </div>\n </div>\n\n <div className=\"flex-1 flex flex-col\">\n <div className=\"text-xs font-medium text-tertiary mb-2 text-center\">Figma Design</div>\n <FigmaEmbed\n figmaUrl={figmaUrl}\n allFigmaUrls={allFigmaUrls}\n zoom={zoom}\n className=\"flex-1 rounded-lg border border-[--border] overflow-hidden\"\n style={backgroundStyle}\n />\n </div>\n </div>\n </div>\n );\n }\n\n // Regular preview (responsive or desktop)\n // Use iframe isolation when enabled for complete CSS isolation\n if (useIframeIsolation && variant) {\n // When no specific viewport width, fill the container\n const isFullWidth = !viewportWidth;\n\n return (\n <div className={isFullWidth ? \"h-full flex flex-col\" : \"min-h-full flex items-center justify-center p-6\"}>\n <div\n className=\"relative transition-all duration-200\"\n style={{\n width: viewportWidth ? `${viewportWidth}px` : '100%',\n maxWidth: viewportWidth ? undefined : '100%',\n height: isFullWidth ? '100%' : undefined,\n minHeight: viewportHeight ? `${viewportHeight}px` : (isFullWidth ? undefined : '200px'),\n ...(viewportWidth && {\n backgroundColor: 'var(--bg-primary)',\n borderRadius: '8px',\n boxShadow: '0 0 0 1px var(--border), 0 4px 12px rgba(0,0,0,0.15)',\n }),\n }}\n >\n <IsolatedPreviewFrame\n segmentPath={segmentPath}\n variantName={variant.name}\n theme={previewTheme}\n width=\"100%\"\n height=\"100%\"\n minHeight={viewportHeight || 200}\n previewKey={previewKey}\n />\n </div>\n </div>\n );\n }\n\n // Fallback: Direct rendering without iframe isolation\n return (\n <div className=\"min-h-full flex items-center justify-center p-6\">\n <div\n className=\"relative transition-all duration-200\"\n data-preview-container=\"true\"\n data-theme={previewTheme}\n style={{\n width: viewportWidth ? `${viewportWidth}px` : '100%',\n maxWidth: viewportWidth ? undefined : '100%',\n minHeight: viewportHeight ? `${viewportHeight}px` : '100%',\n ...(viewportWidth && {\n backgroundColor: 'var(--bg-primary)',\n borderRadius: '8px',\n boxShadow: '0 0 0 1px var(--border), 0 4px 12px rgba(0,0,0,0.15)',\n }),\n }}\n >\n <div\n className=\"p-8\"\n style={{\n transform: `scale(${zoom / 100})`,\n transformOrigin: 'top left',\n width: zoom !== 100 ? `${100 / (zoom / 100)}%` : '100%',\n color: '#1f2937',\n }}\n >\n <ErrorBoundary key={previewKey} componentName={componentName} onRetry={onRetry}>\n {renderContent()}\n </ErrorBoundary>\n </div>\n </div>\n </div>\n );\n}\n\nexport { DeviceMockup };\n","import { Component, type ReactNode, type ErrorInfo } from 'react';\nimport { ErrorIcon, RefreshIcon } from './Icons.js';\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n componentName?: string;\n onRetry?: () => void;\n}\n\ninterface ErrorBoundaryState {\n hasError: boolean;\n error: Error | null;\n errorInfo: ErrorInfo | null;\n}\n\nexport class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { hasError: false, error: null, errorInfo: null };\n }\n\n static getDerivedStateFromError(error: Error): Partial<ErrorBoundaryState> {\n return { hasError: true, error };\n }\n\n componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n // Log error to console with full stack trace\n console.error('Component Error:', error);\n console.error('Component Stack:', errorInfo.componentStack);\n\n this.setState({ errorInfo });\n }\n\n handleRetry = () => {\n this.setState({ hasError: false, error: null, errorInfo: null });\n this.props.onRetry?.();\n };\n\n render() {\n if (this.state.hasError) {\n const { componentName } = this.props;\n const { error, errorInfo } = this.state;\n\n return (\n <div className=\"p-6 rounded-xl border-2 border-red-300 dark:border-red-700 bg-red-50 dark:bg-red-950\">\n <div className=\"flex items-start gap-3\">\n <ErrorIcon className=\"w-6 h-6 text-red-600 dark:text-red-400 flex-shrink-0 mt-0.5\" />\n <div className=\"flex-1 min-w-0\">\n <h3 className=\"text-sm font-semibold text-red-900 dark:text-red-100 mb-1\">\n {componentName ? `Error rendering ${componentName}` : 'Component Error'}\n </h3>\n\n {error && (\n <p className=\"text-sm text-red-800 dark:text-red-200 mb-3 font-mono\">\n {error.message}\n </p>\n )}\n\n {errorInfo?.componentStack && (\n <details className=\"mb-4\">\n <summary className=\"text-xs text-red-700 dark:text-red-300 cursor-pointer hover:text-red-900 dark:hover:text-red-100 transition-colors\">\n Show stack trace\n </summary>\n <pre className=\"mt-2 p-3 text-[10px] font-mono bg-red-100 dark:bg-red-900 rounded-lg overflow-x-auto text-red-800 dark:text-red-200 whitespace-pre-wrap\">\n {error?.stack || errorInfo.componentStack}\n </pre>\n </details>\n )}\n\n <button\n onClick={this.handleRetry}\n className=\"inline-flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded-md bg-red-600 text-white hover:bg-red-700 transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-red-500 focus-visible:ring-offset-2\"\n >\n <RefreshIcon className=\"w-3.5 h-3.5\" />\n Retry\n </button>\n </div>\n </div>\n </div>\n );\n }\n\n return this.props.children;\n }\n}\n","import { useRef, useEffect, useState, useMemo, useCallback } from \"react\";\nimport { FigmaIcon } from \"./Icons.js\";\n\ninterface FigmaEmbedProps {\n /** Current Figma URL to display */\n figmaUrl: string;\n /** All Figma URLs for the current component (for preloading) */\n allFigmaUrls?: string[];\n zoom?: number;\n className?: string;\n style?: React.CSSProperties;\n}\n\ninterface ParsedFigmaUrl {\n fileKey: string;\n nodeId?: string;\n fullUrl: string;\n}\n\n/**\n * Parse a Figma URL to extract file key and node ID.\n */\nfunction parseFigmaUrl(figmaUrl: string): ParsedFigmaUrl | null {\n try {\n const urlPattern = /figma\\.com\\/(?:file|design)\\/([^\\/]+)\\/[^?]*(?:\\?.*node-id=([^&]+))?/i;\n const match = figmaUrl.match(urlPattern);\n\n if (!match) return null;\n\n const fileKey = match[1];\n const nodeId = match[2] ? decodeURIComponent(match[2]) : undefined;\n\n return { fileKey, nodeId, fullUrl: figmaUrl };\n } catch {\n return null;\n }\n}\n\n/**\n * Build a Figma embed URL.\n */\nfunction buildEmbedUrl(fileKey: string, nodeId?: string): string {\n let embedUrl = `https://embed.figma.com/design/${fileKey}?embed-host=segments`;\n\n if (nodeId) {\n const embedNodeId = nodeId.replace(/:/g, \"-\");\n embedUrl += `&node-id=${embedNodeId}`;\n }\n\n embedUrl += \"&hide-ui=1\";\n return embedUrl;\n}\n\n/**\n * Get a unique key for a Figma URL (used for iframe identification)\n */\nfunction getUrlKey(figmaUrl: string): string {\n const parsed = parseFigmaUrl(figmaUrl);\n if (!parsed) return figmaUrl;\n return `${parsed.fileKey}:${parsed.nodeId || \"default\"}`;\n}\n\n/**\n * FigmaEmbed component with iframe pooling for instant variant switching.\n *\n * Strategy: Pre-load iframes for ALL variants of the current component.\n * When switching variants, we just show/hide the appropriate iframe.\n * This makes switching instantaneous since iframes are already loaded.\n *\n * The design embed doesn't support postMessage navigation (only prototype\n * embeds do), so this pooling approach is the only way to achieve instant\n * switching.\n */\nexport function FigmaEmbed({ figmaUrl, allFigmaUrls, zoom = 100, className, style }: FigmaEmbedProps) {\n // Track loaded iframes\n const [loadedUrls, setLoadedUrls] = useState<Set<string>>(new Set());\n const [error, setError] = useState<string | null>(null);\n\n // Parse the current URL\n const currentParsed = useMemo(() => parseFigmaUrl(figmaUrl), [figmaUrl]);\n const currentKey = useMemo(() => getUrlKey(figmaUrl), [figmaUrl]);\n\n // Get all URLs to preload (deduplicated)\n const urlsToPreload = useMemo(() => {\n const urls = allFigmaUrls && allFigmaUrls.length > 0 ? allFigmaUrls : [figmaUrl];\n const uniqueUrls = new Map<string, string>();\n\n for (const url of urls) {\n const key = getUrlKey(url);\n if (!uniqueUrls.has(key)) {\n uniqueUrls.set(key, url);\n }\n }\n\n return Array.from(uniqueUrls.entries()).map(([key, url]) => ({\n key,\n url,\n parsed: parseFigmaUrl(url),\n }));\n }, [allFigmaUrls, figmaUrl]);\n\n // Handle iframe load\n const handleIframeLoad = useCallback((urlKey: string) => {\n setLoadedUrls(prev => {\n const next = new Set(prev);\n next.add(urlKey);\n return next;\n });\n }, []);\n\n // Calculate zoom transform\n const zoomStyle: React.CSSProperties = zoom !== 100\n ? {\n transform: `scale(${zoom / 100})`,\n transformOrigin: \"center\",\n width: `${100 / (zoom / 100)}%`,\n height: `${100 / (zoom / 100)}%`,\n }\n : {};\n\n // Check if current URL is loaded\n const isCurrentLoaded = loadedUrls.has(currentKey);\n\n // If we can't parse the URL, show error\n if (!currentParsed) {\n return (\n <div className={className} style={{ ...style, display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }}>\n <div className=\"flex flex-col items-center gap-2 text-tertiary p-4 text-center\">\n <FigmaIcon className=\"w-6 h-6\" />\n <span className=\"text-xs\">Unable to embed Figma design</span>\n <button\n onClick={() => window.open(figmaUrl, \"_blank\", \"noopener,noreferrer\")}\n className=\"text-xs text-[--color-accent] hover:underline\"\n >\n Open in Figma\n </button>\n </div>\n </div>\n );\n }\n\n return (\n <div className={className} style={{ ...style, position: \"relative\", overflow: \"hidden\" }}>\n {/* Loading overlay - shows while current iframe is loading */}\n {!isCurrentLoaded && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-[--bg-secondary] z-20\">\n <div className=\"flex flex-col items-center gap-2\">\n <FigmaIcon className=\"w-5 h-5 text-tertiary animate-pulse\" />\n <span className=\"text-xs text-tertiary\">Loading Figma...</span>\n </div>\n </div>\n )}\n\n {/* Error overlay */}\n {error && (\n <div className=\"absolute inset-0 flex items-center justify-center bg-[--bg-secondary] z-20\">\n <div className=\"flex flex-col items-center gap-2 text-tertiary\">\n <FigmaIcon className=\"w-6 h-6\" />\n <span className=\"text-xs\">{error}</span>\n </div>\n </div>\n )}\n\n {/*\n Iframe pool: Pre-load all variant URLs as hidden iframes.\n Only the current variant's iframe is visible (opacity: 1, z-index: 10).\n Others are hidden (opacity: 0, z-index: 1) but stay loaded.\n\n This approach works because:\n 1. Figma iframes stay active even when hidden\n 2. Switching just changes CSS visibility\n 3. No network requests when switching variants\n */}\n {urlsToPreload.map(({ key, parsed }) => {\n if (!parsed) return null;\n\n const embedUrl = buildEmbedUrl(parsed.fileKey, parsed.nodeId);\n const isActive = key === currentKey;\n const isLoaded = loadedUrls.has(key);\n\n return (\n <iframe\n key={key}\n src={embedUrl}\n className=\"absolute inset-0 w-full h-full border-0 transition-opacity duration-150\"\n style={{\n ...zoomStyle,\n opacity: isActive && isLoaded ? 1 : 0,\n zIndex: isActive ? 10 : 1,\n pointerEvents: isActive ? \"auto\" : \"none\",\n }}\n onLoad={() => handleIframeLoad(key)}\n onError={() => setError(\"Failed to load Figma embed\")}\n allowFullScreen\n />\n );\n })}\n </div>\n );\n}\n\n/**\n * Hook to collect all Figma URLs from a segment's variants.\n * This enables the FigmaEmbed to preload all variant iframes.\n */\nexport function useAllFigmaUrls(\n segment: { meta: { figma?: string }; variants?: Array<{ figma?: string }> } | undefined\n): string[] {\n return useMemo(() => {\n if (!segment) return [];\n\n const urls: string[] = [];\n\n // Add meta-level Figma URL\n if (segment.meta.figma) {\n urls.push(segment.meta.figma);\n }\n\n // Add variant-level Figma URLs\n if (segment.variants) {\n for (const variant of segment.variants) {\n if (variant.figma) {\n urls.push(variant.figma);\n }\n }\n }\n\n // Deduplicate\n return [...new Set(urls)];\n }, [segment]);\n}\n","// @ts-nocheck\n/**\n * Variant Matrix View - Display all variants in a grid\n *\n * Shows all variants of a component simultaneously, making it easy to:\n * - Compare states/variants at a glance\n * - Spot visual inconsistencies\n * - Review all component states quickly\n *\n * Uses virtualization to only render visible variants for better performance.\n */\n\nimport { useState, useMemo, useRef, useCallback } from \"react\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport clsx from \"clsx\";\nimport type { SegmentVariant } from \"../../core/index.js\";\nimport { ErrorBoundary } from \"./ErrorBoundary.js\";\nimport { StoryRenderer, LoaderIndicator } from \"./StoryRenderer.js\";\nimport { IsolatedPreviewFrame } from \"./IsolatedPreviewFrame.js\";\nimport { ChevronDownIcon } from \"./Icons.js\";\nimport { getBackgroundStyle, type BackgroundOption } from \"./PreviewToolbar.js\";\n\ninterface VariantMatrixProps {\n /** All variants to display */\n variants: SegmentVariant[];\n /** Component name for error display */\n componentName: string;\n /** Segment path for iframe rendering */\n segmentPath: string;\n /** Current zoom level */\n zoom: number;\n /** Preview theme */\n previewTheme: \"light\" | \"dark\";\n /** Background option */\n background: BackgroundOption;\n /** Whether to use iframe isolation */\n useIframeIsolation?: boolean;\n /** Callback when a variant is clicked to focus on it */\n onSelectVariant?: (index: number) => void;\n}\n\ntype GridSize = \"small\" | \"medium\" | \"large\";\n\ninterface GridConfig {\n cols: string;\n minHeight: string;\n heightPx: number; // For virtualization\n scale: number;\n colCount: number; // Default column count for virtualization\n}\n\nconst GRID_SIZES: Record<GridSize, GridConfig> = {\n small: { cols: \"grid-cols-4 lg:grid-cols-5 xl:grid-cols-6\", minHeight: \"150px\", heightPx: 150, scale: 0.5, colCount: 4 },\n medium: { cols: \"grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\", minHeight: \"200px\", heightPx: 200, scale: 0.75, colCount: 3 },\n large: { cols: \"grid-cols-1 lg:grid-cols-2 xl:grid-cols-3\", minHeight: \"300px\", heightPx: 300, scale: 1, colCount: 2 },\n};\n\n/** Threshold for enabling virtualization */\nconst VIRTUALIZATION_THRESHOLD = 12;\n\nexport function VariantMatrix({\n variants,\n componentName,\n segmentPath,\n zoom,\n previewTheme,\n background,\n useIframeIsolation = true,\n onSelectVariant,\n}: VariantMatrixProps) {\n const [gridSize, setGridSize] = useState<GridSize>(\"medium\");\n const [hoveredIndex, setHoveredIndex] = useState<number | null>(null);\n const scrollRef = useRef<HTMLDivElement>(null);\n\n const gridConfig = GRID_SIZES[gridSize];\n const effectiveScale = (zoom / 100) * gridConfig.scale;\n\n // Determine if we should use virtualization\n const useVirtualization = variants.length > VIRTUALIZATION_THRESHOLD;\n\n // Calculate number of rows for virtualization\n const columns = gridConfig.colCount;\n const rowCount = Math.ceil(variants.length / columns);\n\n // Row height includes card height + gap\n const rowHeight = gridConfig.heightPx + 16; // 16px gap\n\n const rowVirtualizer = useVirtualizer({\n count: rowCount,\n getScrollElement: () => scrollRef.current,\n estimateSize: () => rowHeight,\n overscan: 2, // Render 2 extra rows above/below for smooth scrolling\n });\n\n if (variants.length === 0) {\n return (\n <div className=\"flex items-center justify-center h-full text-gray-500 dark:text-gray-400\">\n No variants to display\n </div>\n );\n }\n\n return (\n <div className=\"h-full flex flex-col\">\n {/* Toolbar */}\n <div className=\"flex-shrink-0 px-4 py-2 border-b border-[--border] bg-[--bg-secondary] flex items-center justify-between\">\n <div className=\"text-sm text-secondary\">\n {variants.length} variant{variants.length !== 1 ? \"s\" : \"\"}\n {useVirtualization && (\n <span className=\"ml-2 text-xs text-tertiary\">(virtualized)</span>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs text-tertiary\">Grid size:</span>\n <div className=\"flex rounded-md border border-[--border] overflow-hidden\">\n {([\"small\", \"medium\", \"large\"] as GridSize[]).map((size) => (\n <button\n key={size}\n onClick={() => setGridSize(size)}\n className={clsx(\n \"px-2 py-1 text-xs capitalize transition-colors\",\n gridSize === size\n ? \"bg-[--bg-hover] text-primary\"\n : \"text-tertiary hover:text-secondary hover:bg-[--bg-hover]\"\n )}\n >\n {size}\n </button>\n ))}\n </div>\n </div>\n </div>\n\n {/* Grid - Virtualized or Regular */}\n {useVirtualization ? (\n <div ref={scrollRef} className=\"flex-1 overflow-auto p-4\">\n <div\n style={{\n height: `${rowVirtualizer.getTotalSize()}px`,\n width: \"100%\",\n position: \"relative\",\n }}\n >\n {rowVirtualizer.getVirtualItems().map((virtualRow) => {\n const startIndex = virtualRow.index * columns;\n const rowVariants = variants.slice(startIndex, startIndex + columns);\n\n return (\n <div\n key={virtualRow.key}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: `${virtualRow.size}px`,\n transform: `translateY(${virtualRow.start}px)`,\n }}\n >\n <div className={clsx(\"grid gap-4\", gridConfig.cols)} style={{ height: gridConfig.minHeight }}>\n {rowVariants.map((variant, colIndex) => {\n const index = startIndex + colIndex;\n return (\n <VariantCard\n key={variant.name}\n variant={variant}\n index={index}\n componentName={componentName}\n segmentPath={segmentPath}\n scale={effectiveScale}\n minHeight={gridConfig.minHeight}\n previewTheme={previewTheme}\n background={background}\n useIframeIsolation={useIframeIsolation}\n isHovered={hoveredIndex === index}\n onHover={() => setHoveredIndex(index)}\n onLeave={() => setHoveredIndex(null)}\n onClick={() => onSelectVariant?.(index)}\n />\n );\n })}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n ) : (\n <div className=\"flex-1 overflow-auto p-4\">\n <div className={clsx(\"grid gap-4\", gridConfig.cols)}>\n {variants.map((variant, index) => (\n <VariantCard\n key={variant.name}\n variant={variant}\n index={index}\n componentName={componentName}\n segmentPath={segmentPath}\n scale={effectiveScale}\n minHeight={gridConfig.minHeight}\n previewTheme={previewTheme}\n background={background}\n useIframeIsolation={useIframeIsolation}\n isHovered={hoveredIndex === index}\n onHover={() => setHoveredIndex(index)}\n onLeave={() => setHoveredIndex(null)}\n onClick={() => onSelectVariant?.(index)}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n\ninterface VariantCardProps {\n variant: SegmentVariant;\n index: number;\n componentName: string;\n segmentPath: string;\n scale: number;\n minHeight: string;\n previewTheme: \"light\" | \"dark\";\n background: BackgroundOption;\n useIframeIsolation: boolean;\n isHovered: boolean;\n onHover: () => void;\n onLeave: () => void;\n onClick: () => void;\n}\n\nfunction VariantCard({\n variant,\n index,\n componentName,\n segmentPath,\n scale,\n minHeight,\n previewTheme,\n background,\n useIframeIsolation,\n isHovered,\n onHover,\n onLeave,\n onClick,\n}: VariantCardProps) {\n const backgroundStyle = getBackgroundStyle(background);\n\n return (\n <div\n className={clsx(\n \"group relative rounded-lg border overflow-hidden transition-all cursor-pointer\",\n isHovered\n ? \"border-blue-500 shadow-lg ring-2 ring-blue-500/20\"\n : \"border-[--border] hover:border-blue-300 dark:hover:border-blue-700\"\n )}\n style={{ minHeight }}\n onMouseEnter={onHover}\n onMouseLeave={onLeave}\n onClick={onClick}\n >\n {/* Header */}\n <div className=\"absolute top-0 left-0 right-0 z-10 px-2 py-1 bg-gradient-to-b from-black/60 to-transparent\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-medium text-white truncate\">\n {variant.name}\n </span>\n <span className=\"text-[10px] text-white/70\">\n #{index + 1}\n </span>\n </div>\n </div>\n\n {/* Click to view overlay */}\n <div\n className={clsx(\n \"absolute inset-0 z-10 flex items-center justify-center bg-black/40 transition-opacity\",\n isHovered ? \"opacity-100\" : \"opacity-0\"\n )}\n >\n <span className=\"px-3 py-1.5 bg-blue-600 text-white text-xs font-medium rounded-full shadow-lg\">\n Click to focus\n </span>\n </div>\n\n {/* Preview content */}\n <div\n className=\"h-full w-full overflow-hidden flex items-center justify-center\"\n data-theme={previewTheme}\n style={backgroundStyle}\n >\n {useIframeIsolation ? (\n <IsolatedPreviewFrame\n segmentPath={segmentPath}\n variantName={variant.name}\n theme={previewTheme}\n width=\"100%\"\n height=\"100%\"\n minHeight={minHeight}\n />\n ) : (\n <div\n className=\"p-4\"\n style={{\n transform: `scale(${scale})`,\n }}\n >\n <ErrorBoundary\n componentName={componentName}\n fallback={\n <div className=\"text-xs text-red-500 p-2\">\n Error rendering variant\n </div>\n }\n >\n <StoryRenderer variant={variant}>\n {(content, isLoading, error) => {\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center p-4\">\n <LoaderIndicator />\n </div>\n );\n }\n if (error) {\n return (\n <div className=\"text-xs text-red-500 p-2\">\n {error.message}\n </div>\n );\n }\n return content;\n }}\n </StoryRenderer>\n </ErrorBoundary>\n </div>\n )}\n </div>\n\n {/* Tags/badges */}\n {variant.hasPlayFunction && (\n <div className=\"absolute bottom-2 right-2 z-10\">\n <span className=\"px-1.5 py-0.5 text-[10px] bg-purple-600 text-white rounded\">\n play\n </span>\n </div>\n )}\n </div>\n );\n}\n","import { useState, useEffect, useMemo, type ReactNode } from \"react\";\nimport type { SegmentVariant } from \"../../core/index.js\";\n\ninterface StoryRendererProps {\n /** The variant to render */\n variant: SegmentVariant;\n /** Children render function - receives rendered content */\n children: (content: ReactNode | null, isLoading: boolean, error: Error | null) => ReactNode;\n}\n\n/**\n * Component that handles async loader execution before rendering a story variant.\n *\n * If the variant has loaders:\n * 1. Shows loading state while loaders execute\n * 2. Merges all loaded data\n * 3. Passes loaded data to render function\n *\n * If no loaders, renders immediately.\n */\nexport function StoryRenderer({ variant, children }: StoryRendererProps) {\n const [loadedData, setLoadedData] = useState<Record<string, unknown> | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const hasLoaders = variant.loaders && variant.loaders.length > 0;\n\n useEffect(() => {\n // Reset state when variant changes\n setLoadedData(null);\n setError(null);\n\n if (!hasLoaders) {\n return;\n }\n\n let cancelled = false;\n setIsLoading(true);\n\n async function executeLoaders() {\n try {\n // Execute all loaders in parallel\n const results = await Promise.all(\n variant.loaders!.map((loader) => loader())\n );\n\n if (cancelled) return;\n\n // Merge all loaded data (later loaders override earlier ones)\n const merged = results.reduce(\n (acc, result) => ({ ...acc, ...result }),\n {}\n );\n\n setLoadedData(merged);\n setError(null);\n } catch (err) {\n if (cancelled) return;\n setError(err instanceof Error ? err : new Error(String(err)));\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n }\n\n executeLoaders();\n\n return () => {\n cancelled = true;\n };\n }, [variant, hasLoaders]);\n\n // If loading, pass null content with loading flag\n if (hasLoaders && isLoading) {\n return <>{children(null, true, null)}</>;\n }\n\n // If error during loading, pass error\n if (error) {\n return <>{children(null, false, error)}</>;\n }\n\n // Build render options with loaded data only\n const renderOptions = useMemo(() => ({\n loadedData: hasLoaders ? loadedData ?? undefined : undefined,\n }), [hasLoaders, loadedData]);\n\n // Render the variant with options\n try {\n const content = variant.render(renderOptions);\n return <>{children(content, false, null)}</>;\n } catch (err) {\n const renderError = err instanceof Error ? err : new Error(String(err));\n return <>{children(null, false, renderError)}</>;\n }\n}\n\n/**\n * Loading indicator for stories with loaders\n */\nexport function LoaderIndicator() {\n return (\n <div className=\"flex items-center gap-2 text-secondary text-sm\">\n <svg\n className=\"animate-spin h-4 w-4\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n <span>Running loaders...</span>\n </div>\n );\n}\n","/**\n * IsolatedPreviewFrame - Parent-side iframe wrapper for CSS isolation\n *\n * Renders component previews inside an iframe for complete CSS isolation.\n * This prevents CSS conflicts between:\n * - The viewer shell and the user's component library\n * - Global styles from user components\n * - Theme variables with same names\n */\n\nimport { memo, useRef, useEffect, useState, useCallback } from 'react';\nimport clsx from 'clsx';\nimport { usePreviewBridge, type ParentMessage } from '../hooks/usePreviewBridge.js';\n\n/** Maximum number of retry attempts */\nconst MAX_RETRIES = 3;\n\nexport interface IsolatedPreviewFrameProps {\n /** Segment path (file path) to render */\n segmentPath: string;\n /** Variant name to render */\n variantName: string;\n /** Props to pass to the variant render function */\n props?: Record<string, unknown>;\n /** Theme for the preview */\n theme: 'light' | 'dark';\n /** Width of the preview (CSS value) */\n width?: number | string;\n /** Height of the preview (CSS value) */\n height?: number | string;\n /** Minimum height of the preview */\n minHeight?: number | string;\n /** Background style for the preview container */\n background?: React.CSSProperties;\n /** Additional class name for the container */\n className?: string;\n /** Additional styles for the container */\n style?: React.CSSProperties;\n /** Called when content size is reported */\n onContentSize?: (size: { width: number; height: number }) => void;\n /** Called when an error occurs */\n onError?: (error: string) => void;\n /** Unique key to force re-render on variant changes */\n previewKey?: string;\n /** Show size indicator on hover */\n showSizeIndicator?: boolean;\n}\n\n/**\n * IsolatedPreviewFrame renders a component preview inside an iframe\n * for complete CSS isolation from the viewer shell.\n */\nexport const IsolatedPreviewFrame = memo(function IsolatedPreviewFrame({\n segmentPath,\n variantName,\n props,\n theme,\n width = '100%',\n height = 'auto',\n minHeight = 120,\n background,\n className = '',\n style,\n onContentSize,\n onError,\n previewKey,\n showSizeIndicator = false,\n}: IsolatedPreviewFrameProps) {\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const [isLoading, setIsLoading] = useState(true);\n const [frameError, setFrameError] = useState<string | null>(null);\n const [retryCount, setRetryCount] = useState(0);\n const [iframeKey, setIframeKey] = useState(0);\n const { isReady, isRendering, lastError, contentSize, render, setTheme, clearError } = usePreviewBridge(iframeRef);\n const lastRenderRef = useRef<string>('');\n const isFirstLoad = useRef(true);\n\n // Build the preview URL\n const previewUrl = '/fragments/preview/';\n\n // Handle iframe load\n const handleLoad = useCallback(() => {\n setIsLoading(false);\n setFrameError(null);\n isFirstLoad.current = false;\n }, []);\n\n // Handle iframe error\n const handleError = useCallback(() => {\n setIsLoading(false);\n setFrameError('Failed to load preview frame');\n onError?.('Failed to load preview frame');\n }, [onError]);\n\n // Handle retry\n const handleRetry = useCallback(() => {\n if (retryCount >= MAX_RETRIES) return;\n\n setFrameError(null);\n clearError();\n setRetryCount(c => c + 1);\n setIsLoading(true);\n lastRenderRef.current = ''; // Force re-render\n setIframeKey(k => k + 1); // Force iframe reload\n }, [retryCount, clearError]);\n\n // Send render request when ready or when render params change\n useEffect(() => {\n if (!isReady) return;\n\n // Create a render key to detect changes\n const renderKey = `${segmentPath}:${variantName}:${JSON.stringify(props)}:${previewKey || ''}`;\n if (renderKey === lastRenderRef.current) return;\n lastRenderRef.current = renderKey;\n\n render(segmentPath, variantName, props);\n }, [isReady, segmentPath, variantName, props, previewKey, render]);\n\n // Sync theme when it changes\n useEffect(() => {\n if (!isReady) return;\n setTheme(theme);\n }, [isReady, theme, setTheme]);\n\n // Report content size changes\n useEffect(() => {\n if (contentSize) {\n onContentSize?.(contentSize);\n }\n }, [contentSize, onContentSize]);\n\n // Report errors\n useEffect(() => {\n if (lastError) {\n setFrameError(lastError);\n onError?.(lastError);\n }\n }, [lastError, onError]);\n\n // Calculate iframe dimensions\n const frameWidth = typeof width === 'number' ? `${width}px` : width;\n const frameHeight = typeof height === 'number' ? `${height}px` : height;\n const frameMinHeight = typeof minHeight === 'number' ? `${minHeight}px` : minHeight;\n\n // Determine if we should show skeleton vs spinner\n // Skeleton for initial load, spinner for subsequent renders\n const showSkeleton = isLoading && isFirstLoad.current;\n const showSpinner = !showSkeleton && (isLoading || isRendering);\n const showContent = isReady && !isRendering && !frameError;\n\n return (\n <div\n className={clsx('isolated-preview-frame group', className)}\n style={{\n position: 'relative',\n width: frameWidth,\n height: frameHeight,\n minHeight: frameMinHeight,\n ...background,\n ...style,\n }}\n >\n {/* Skeleton loading overlay (initial load) */}\n <div\n className={clsx(\n 'absolute inset-0 z-10 transition-opacity duration-150',\n showSkeleton ? 'opacity-100' : 'opacity-0 pointer-events-none'\n )}\n style={{ background: 'rgba(255, 255, 255, 0.95)' }}\n >\n <PreviewSkeleton />\n </div>\n\n {/* Spinner overlay (subsequent renders) */}\n <div\n className={clsx(\n 'absolute inset-0 z-10 flex items-center justify-center transition-opacity duration-150',\n showSpinner ? 'opacity-100' : 'opacity-0 pointer-events-none'\n )}\n style={{ background: 'rgba(255, 255, 255, 0.8)' }}\n >\n <div style={{ display: 'flex', alignItems: 'center', gap: 8, color: '#6b7280', fontSize: 14 }}>\n <LoadingSpinner />\n <span>Rendering...</span>\n </div>\n </div>\n\n {/* Error overlay */}\n <div\n className={clsx(\n 'absolute inset-0 z-10 flex items-center justify-center p-4 transition-opacity duration-150',\n frameError && !isLoading ? 'opacity-100' : 'opacity-0 pointer-events-none'\n )}\n style={{ background: 'rgba(254, 242, 242, 0.95)' }}\n >\n <div\n style={{\n background: 'white',\n border: '1px solid #fecaca',\n borderRadius: 8,\n padding: 16,\n maxWidth: 400,\n }}\n >\n <div style={{ color: '#dc2626', fontWeight: 500, marginBottom: 8 }}>\n Preview Error\n </div>\n <div style={{ color: '#991b1b', fontSize: 13, marginBottom: retryCount < MAX_RETRIES ? 12 : 0 }}>\n {frameError}\n </div>\n {retryCount < MAX_RETRIES && (\n <button\n onClick={handleRetry}\n style={{\n padding: '6px 12px',\n fontSize: 13,\n fontWeight: 500,\n color: 'white',\n background: '#dc2626',\n border: 'none',\n borderRadius: 6,\n cursor: 'pointer',\n }}\n >\n Retry ({MAX_RETRIES - retryCount} remaining)\n </button>\n )}\n </div>\n </div>\n\n {/* The iframe */}\n <iframe\n key={iframeKey}\n ref={iframeRef}\n src={previewUrl}\n title={`Preview: ${variantName}`}\n onLoad={handleLoad}\n onError={handleError}\n className={clsx(\n 'transition-opacity duration-150',\n showContent ? 'opacity-100' : 'opacity-0'\n )}\n style={{\n width: '100%',\n height: '100%',\n border: 'none',\n display: 'block',\n background: 'transparent',\n }}\n // Security attributes\n sandbox=\"allow-scripts allow-same-origin\"\n />\n\n {/* Size indicator */}\n {showSizeIndicator && contentSize && (\n <div\n className=\"absolute bottom-1 right-1 px-1.5 py-0.5 rounded font-mono\n opacity-0 group-hover:opacity-100 transition-opacity duration-150\"\n style={{\n background: 'rgba(0, 0, 0, 0.5)',\n color: 'white',\n fontSize: 10,\n }}\n >\n {contentSize.width} Ć {contentSize.height}px\n </div>\n )}\n </div>\n );\n});\n\n/**\n * Skeleton loading placeholder\n */\nfunction PreviewSkeleton() {\n return (\n <div className=\"animate-pulse p-4\">\n <div className=\"h-4 bg-gray-200 dark:bg-gray-700 rounded w-1/3 mb-3\" />\n <div className=\"h-8 bg-gray-200 dark:bg-gray-700 rounded mb-2\" />\n <div className=\"h-4 bg-gray-200 dark:bg-gray-700 rounded w-2/3\" />\n </div>\n );\n}\n\n/**\n * Simple loading spinner component\n */\nfunction LoadingSpinner() {\n return (\n <svg\n style={{\n width: 20,\n height: 20,\n animation: 'spin 0.8s linear infinite',\n }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <style>\n {`@keyframes spin { to { transform: rotate(360deg); } }`}\n </style>\n <circle\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"#e5e7eb\"\n strokeWidth=\"2\"\n fill=\"none\"\n />\n <path\n d=\"M12 2a10 10 0 0 1 10 10\"\n stroke=\"#3b82f6\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n fill=\"none\"\n />\n </svg>\n );\n}\n\nexport default IsolatedPreviewFrame;\n","/**\n * usePreviewBridge - Communication hook for parent-iframe messaging\n *\n * This hook provides utilities for bidirectional communication between\n * the parent viewer shell and the isolated iframe preview.\n */\n\nimport { useRef, useEffect, useCallback, useState, type RefObject } from 'react';\n\n/**\n * Message types sent from parent to iframe\n */\nexport type ParentMessage =\n | { type: 'init'; frameId: string }\n | { type: 'render'; segmentPath: string; variantName: string; props?: Record<string, unknown> }\n | { type: 'theme'; theme: 'light' | 'dark' }\n | { type: 'resize'; width: number; height: number };\n\n/**\n * Message types sent from iframe to parent\n */\nexport type FrameMessage =\n | { type: 'ready'; frameId?: string }\n | { type: 'rendered'; height: number; width: number; frameId?: string }\n | { type: 'error'; message: string; stack?: string; frameId?: string };\n\n/**\n * Origin used for postMessage (same origin for Vite dev server)\n */\nconst PREVIEW_ORIGIN = '*'; // In dev, we use * since it's same origin\n\n/**\n * Message channel ID to ensure we only respond to our own messages\n */\nexport const PREVIEW_CHANNEL = 'fragments-preview';\n\n/**\n * Generate a unique frame ID\n */\nlet frameIdCounter = 0;\nfunction generateFrameId(): string {\n return `frame-${++frameIdCounter}-${Date.now()}`;\n}\n\n/**\n * Hook for the parent window to communicate with the iframe\n */\nexport function usePreviewBridge(iframeRef: RefObject<HTMLIFrameElement | null>) {\n const [isReady, setIsReady] = useState(false);\n const [lastError, setLastError] = useState<string | null>(null);\n const [contentSize, setContentSize] = useState<{ width: number; height: number } | null>(null);\n const [isRendering, setIsRendering] = useState(false);\n const pendingCallbacks = useRef<Map<string, (response: FrameMessage) => void>>(new Map());\n const pendingTimeouts = useRef<Map<string, NodeJS.Timeout>>(new Map());\n const messageId = useRef(0);\n const frameIdRef = useRef<string>(generateFrameId());\n const initSentRef = useRef(false);\n const currentRenderIdRef = useRef<string | null>(null);\n\n // Render timeout duration (5 seconds)\n const RENDER_TIMEOUT = 5000;\n\n // Listen for messages from iframe\n useEffect(() => {\n function handleMessage(event: MessageEvent) {\n // Validate message structure\n if (!event.data || event.data.channel !== PREVIEW_CHANNEL) {\n return;\n }\n\n const message = event.data as FrameMessage & { channel: string; id?: string; frameId?: string };\n\n // For \"ready\" messages (no frameId yet), check if it's from our iframe\n if (message.type === 'ready' && !message.frameId) {\n // Only process ready from our iframe by checking event.source\n if (event.source !== iframeRef.current?.contentWindow) {\n return;\n }\n // Send init message with our frameId\n if (!initSentRef.current && iframeRef.current?.contentWindow) {\n initSentRef.current = true;\n iframeRef.current.contentWindow.postMessage(\n { type: 'init', frameId: frameIdRef.current, channel: PREVIEW_CHANNEL },\n PREVIEW_ORIGIN\n );\n }\n setIsReady(true);\n setLastError(null);\n return;\n }\n\n // For all other messages, filter by frameId\n if (message.frameId && message.frameId !== frameIdRef.current) {\n return;\n }\n\n switch (message.type) {\n case 'ready':\n // Ready with frameId - just update state\n setIsReady(true);\n setLastError(null);\n break;\n\n case 'rendered':\n setContentSize({ width: message.width, height: message.height });\n setLastError(null);\n setIsRendering(false);\n // Clear any pending timeout for this render\n if (currentRenderIdRef.current) {\n const timeout = pendingTimeouts.current.get(currentRenderIdRef.current);\n if (timeout) {\n clearTimeout(timeout);\n pendingTimeouts.current.delete(currentRenderIdRef.current);\n }\n currentRenderIdRef.current = null;\n }\n break;\n\n case 'error':\n setLastError(message.message);\n break;\n }\n\n // Call any pending callbacks\n if (message.id && pendingCallbacks.current.has(message.id)) {\n const callback = pendingCallbacks.current.get(message.id);\n pendingCallbacks.current.delete(message.id);\n callback?.(message);\n }\n }\n\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, [iframeRef]);\n\n // Reset ready state when iframe changes\n useEffect(() => {\n setIsReady(false);\n setLastError(null);\n setContentSize(null);\n initSentRef.current = false;\n }, [iframeRef.current]);\n\n /**\n * Send a message to the iframe\n */\n const sendMessage = useCallback((message: ParentMessage) => {\n if (!iframeRef.current?.contentWindow) {\n console.warn('[PreviewBridge] Cannot send message - iframe not ready');\n return;\n }\n\n const id = `msg-${++messageId.current}`;\n iframeRef.current.contentWindow.postMessage(\n { ...message, channel: PREVIEW_CHANNEL, id, frameId: frameIdRef.current },\n PREVIEW_ORIGIN\n );\n }, [iframeRef]);\n\n /**\n * Send a render request to the iframe\n */\n const render = useCallback((\n segmentPath: string,\n variantName: string,\n props?: Record<string, unknown>\n ) => {\n // Clear any existing timeout\n if (currentRenderIdRef.current) {\n const existingTimeout = pendingTimeouts.current.get(currentRenderIdRef.current);\n if (existingTimeout) {\n clearTimeout(existingTimeout);\n pendingTimeouts.current.delete(currentRenderIdRef.current);\n }\n }\n\n // Generate new render ID\n const renderId = `render-${++messageId.current}`;\n currentRenderIdRef.current = renderId;\n setIsRendering(true);\n setLastError(null);\n\n sendMessage({ type: 'render', segmentPath, variantName, props });\n\n // Set timeout\n const timeoutId = setTimeout(() => {\n if (currentRenderIdRef.current === renderId) {\n setLastError('Render timeout - component took too long to load');\n setIsRendering(false);\n currentRenderIdRef.current = null;\n }\n }, RENDER_TIMEOUT);\n\n pendingTimeouts.current.set(renderId, timeoutId);\n }, [sendMessage]);\n\n /**\n * Set the theme in the iframe\n */\n const setTheme = useCallback((theme: 'light' | 'dark') => {\n sendMessage({ type: 'theme', theme });\n }, [sendMessage]);\n\n /**\n * Resize the iframe viewport\n */\n const resize = useCallback((width: number, height: number) => {\n sendMessage({ type: 'resize', width, height });\n }, [sendMessage]);\n\n /**\n * Clear the last error\n */\n const clearError = useCallback(() => {\n setLastError(null);\n }, []);\n\n // Cleanup timeouts on unmount\n useEffect(() => {\n return () => {\n pendingTimeouts.current.forEach(timeout => clearTimeout(timeout));\n pendingTimeouts.current.clear();\n };\n }, []);\n\n return {\n isReady,\n isRendering,\n lastError,\n contentSize,\n sendMessage,\n render,\n setTheme,\n resize,\n clearError,\n };\n}\n\n/**\n * Hook for the iframe to communicate with the parent\n * Used by PreviewFrameHost\n */\nexport function useFrameBridge() {\n const [renderRequest, setRenderRequest] = useState<{\n segmentPath: string;\n variantName: string;\n props?: Record<string, unknown>;\n } | null>(null);\n const [theme, setThemeState] = useState<'light' | 'dark'>('light');\n const [viewportSize, setViewportSize] = useState<{ width: number; height: number } | null>(null);\n const frameIdRef = useRef<string | null>(null);\n\n // Listen for messages from parent\n useEffect(() => {\n function handleMessage(event: MessageEvent) {\n // Validate message structure\n if (!event.data || event.data.channel !== PREVIEW_CHANNEL) {\n return;\n }\n\n const message = event.data as ParentMessage & { channel: string; id?: string; frameId?: string };\n\n // Store frameId from init message or any message with frameId\n if (message.frameId && !frameIdRef.current) {\n frameIdRef.current = message.frameId;\n }\n\n // Skip init messages - they're just for setting frameId\n if (message.type === 'init') {\n return;\n }\n\n switch (message.type) {\n case 'render':\n setRenderRequest({\n segmentPath: message.segmentPath,\n variantName: message.variantName,\n props: message.props,\n });\n break;\n\n case 'theme':\n setThemeState(message.theme);\n // Apply theme class to document\n if (message.theme === 'dark') {\n document.documentElement.classList.add('dark');\n } else {\n document.documentElement.classList.remove('dark');\n }\n break;\n\n case 'resize':\n setViewportSize({ width: message.width, height: message.height });\n break;\n }\n }\n\n window.addEventListener('message', handleMessage);\n return () => window.removeEventListener('message', handleMessage);\n }, []);\n\n /**\n * Send a message to the parent window\n */\n const sendToParent = useCallback((message: FrameMessage) => {\n if (!window.parent || window.parent === window) {\n console.warn('[FrameBridge] Not running in iframe');\n return;\n }\n\n window.parent.postMessage(\n { ...message, channel: PREVIEW_CHANNEL, frameId: frameIdRef.current },\n PREVIEW_ORIGIN\n );\n }, []);\n\n /**\n * Notify parent that the frame is ready\n */\n const notifyReady = useCallback(() => {\n sendToParent({ type: 'ready' });\n }, [sendToParent]);\n\n /**\n * Notify parent that rendering is complete\n */\n const notifyRendered = useCallback((width: number, height: number) => {\n sendToParent({ type: 'rendered', width, height });\n }, [sendToParent]);\n\n /**\n * Notify parent of a render error\n */\n const notifyError = useCallback((message: string, stack?: string) => {\n sendToParent({ type: 'error', message, stack });\n }, [sendToParent]);\n\n return {\n renderRequest,\n theme,\n viewportSize,\n notifyReady,\n notifyRendered,\n notifyError,\n setTheme: setThemeState,\n };\n}\n","// @ts-nocheck\n/**\n * Multi-Viewport Preview - Show component at multiple sizes simultaneously\n *\n * Displays the component at mobile, tablet, and desktop widths\n * with proper device mockups and horizontal scrolling.\n */\n\nimport { useState, type ReactNode } from \"react\";\nimport { ErrorBoundary } from \"./ErrorBoundary.js\";\nimport { IsolatedPreviewFrame } from \"./IsolatedPreviewFrame.js\";\nimport { ChevronDownIcon } from \"./Icons.js\";\nimport { getBackgroundStyle, type BackgroundOption } from \"./PreviewToolbar.js\";\n\ninterface ViewportConfig {\n name: string;\n width: number;\n height: number;\n type: \"mobile\" | \"tablet\" | \"desktop\";\n}\n\ninterface MobilePreset {\n name: string;\n width: number;\n height: number;\n}\n\nconst MOBILE_PRESETS: MobilePreset[] = [\n { name: \"iPhone SE\", width: 375, height: 667 },\n { name: \"iPhone 14\", width: 390, height: 844 },\n { name: \"iPhone 14 Pro Max\", width: 430, height: 932 },\n { name: \"Pixel 7\", width: 412, height: 915 },\n { name: \"Galaxy S21\", width: 360, height: 800 },\n];\n\nconst DEFAULT_VIEWPORTS: ViewportConfig[] = [\n { name: \"Mobile\", width: 375, height: 667, type: \"mobile\" },\n { name: \"Tablet\", width: 768, height: 1024, type: \"tablet\" },\n { name: \"Desktop\", width: 1280, height: 800, type: \"desktop\" },\n];\n\ninterface MultiViewportPreviewProps {\n /** Component name for error boundary */\n componentName: string;\n /** Segment path for iframe rendering */\n segmentPath: string;\n /** Variant name for iframe rendering */\n variantName: string;\n /** Render function that returns the component (fallback) */\n renderContent: () => ReactNode;\n /** Preview theme */\n previewTheme: \"light\" | \"dark\";\n /** Background option for preview */\n background: BackgroundOption;\n /** Base zoom level (used for scaling if needed) */\n zoom: number;\n /** Whether to use iframe isolation */\n useIframeIsolation?: boolean;\n}\n\nexport function MultiViewportPreview({\n componentName,\n segmentPath,\n variantName,\n renderContent,\n previewTheme,\n background,\n zoom,\n useIframeIsolation = true,\n}: MultiViewportPreviewProps) {\n const [selectedMobile, setSelectedMobile] = useState<MobilePreset>(MOBILE_PRESETS[0]);\n const [showMobileDropdown, setShowMobileDropdown] = useState(false);\n\n // Build viewports with selected mobile preset\n const viewports: ViewportConfig[] = [\n { name: \"Mobile\", width: selectedMobile.width, height: selectedMobile.height, type: \"mobile\" },\n { name: \"Tablet\", width: 768, height: 1024, type: \"tablet\" },\n { name: \"Desktop\", width: 1280, height: 800, type: \"desktop\" },\n ];\n\n return (\n <div className=\"h-full flex flex-col bg-gray-100 dark:bg-gray-900\">\n {/* Header */}\n <div className=\"flex-shrink-0 px-4 py-3 border-b border-[--border] bg-[--bg-secondary] flex items-center justify-center gap-8\">\n {/* Mobile with dropdown */}\n <div className=\"relative\">\n <button\n onClick={() => setShowMobileDropdown(!showMobileDropdown)}\n className=\"flex items-center gap-2 text-sm hover:bg-[--bg-hover] px-2 py-1 rounded transition-colors\"\n >\n <span className=\"text-lg\">š±</span>\n <span className=\"font-medium text-secondary\">Mobile</span>\n <span className=\"text-xs text-tertiary\">({selectedMobile.width}px)</span>\n <ChevronDownIcon className=\"w-3 h-3 text-tertiary\" />\n </button>\n\n {showMobileDropdown && (\n <>\n <div\n className=\"fixed inset-0 z-10\"\n onClick={() => setShowMobileDropdown(false)}\n />\n <div className=\"absolute top-full left-0 mt-1 z-20 bg-[--bg-elevated] border border-[--border] rounded-lg shadow-lg py-1 min-w-[180px]\">\n {MOBILE_PRESETS.map((preset) => (\n <button\n key={preset.name}\n onClick={() => {\n setSelectedMobile(preset);\n setShowMobileDropdown(false);\n }}\n className={`w-full px-3 py-1.5 text-left text-xs hover:bg-[--bg-hover] transition-colors flex items-center justify-between ${\n selectedMobile.name === preset.name ? 'text-blue-500' : 'text-secondary'\n }`}\n >\n <span>{preset.name}</span>\n <span className=\"text-tertiary\">{preset.width}Ć{preset.height}</span>\n </button>\n ))}\n </div>\n </>\n )}\n </div>\n\n {/* Tablet */}\n <div className=\"flex items-center gap-2 text-sm\">\n <span className=\"text-lg\">š±</span>\n <span className=\"font-medium text-secondary\">Tablet</span>\n <span className=\"text-xs text-tertiary\">(768px)</span>\n </div>\n\n {/* Desktop */}\n <div className=\"flex items-center gap-2 text-sm\">\n <span className=\"text-lg\">š„ļø</span>\n <span className=\"font-medium text-secondary\">Desktop</span>\n <span className=\"text-xs text-tertiary\">(1280px)</span>\n </div>\n </div>\n\n {/* Viewport panels with horizontal scroll */}\n <div className=\"flex-1 overflow-x-auto overflow-y-auto\">\n <div className=\"flex gap-8 p-8 min-w-max\">\n {viewports.map((vp) => (\n <ViewportPanel\n key={`${vp.name}-${vp.width}`}\n viewport={vp}\n componentName={componentName}\n segmentPath={segmentPath}\n variantName={variantName}\n renderContent={renderContent}\n previewTheme={previewTheme}\n background={background}\n useIframeIsolation={useIframeIsolation}\n />\n ))}\n </div>\n </div>\n </div>\n );\n}\n\ninterface ViewportPanelProps {\n viewport: ViewportConfig;\n componentName: string;\n segmentPath: string;\n variantName: string;\n renderContent: () => ReactNode;\n previewTheme: \"light\" | \"dark\";\n background: BackgroundOption;\n useIframeIsolation: boolean;\n}\n\nfunction ViewportPanel({\n viewport,\n componentName,\n segmentPath,\n variantName,\n renderContent,\n previewTheme,\n background,\n useIframeIsolation,\n}: ViewportPanelProps) {\n if (viewport.type === \"desktop\") {\n return (\n <DesktopMockup\n width={viewport.width}\n height={viewport.height}\n label={viewport.name}\n previewTheme={previewTheme}\n background={background}\n componentName={componentName}\n segmentPath={segmentPath}\n variantName={variantName}\n renderContent={renderContent}\n useIframeIsolation={useIframeIsolation}\n />\n );\n }\n\n return (\n <DeviceMockup\n type={viewport.type}\n width={viewport.width}\n height={viewport.height}\n label={viewport.name}\n previewTheme={previewTheme}\n background={background}\n componentName={componentName}\n segmentPath={segmentPath}\n variantName={variantName}\n renderContent={renderContent}\n useIframeIsolation={useIframeIsolation}\n />\n );\n}\n\ninterface DeviceMockupProps {\n type: \"mobile\" | \"tablet\";\n width: number;\n height: number;\n label: string;\n previewTheme: \"light\" | \"dark\";\n background: BackgroundOption;\n componentName: string;\n segmentPath: string;\n variantName: string;\n renderContent: () => ReactNode;\n useIframeIsolation: boolean;\n}\n\nfunction DeviceMockup({\n type,\n width,\n height,\n label,\n previewTheme,\n background,\n componentName,\n segmentPath,\n variantName,\n renderContent,\n useIframeIsolation,\n}: DeviceMockupProps) {\n const isMobile = type === \"mobile\";\n const frameWidth = width + 24; // Add bezel width\n const screenHeight = height;\n const backgroundStyle = getBackgroundStyle(background);\n\n return (\n <div className=\"flex flex-col items-center\">\n {/* Label */}\n <div className=\"mb-3 text-sm font-medium text-tertiary\">\n {label}\n </div>\n\n {/* Device frame */}\n <div\n className=\"relative flex-shrink-0\"\n style={{ width: `${frameWidth}px` }}\n >\n <div\n className=\"relative rounded-[40px] bg-[#1a1a1a] p-3 shadow-2xl\"\n style={{\n boxShadow: \"0 25px 50px -12px rgba(0, 0, 0, 0.5), inset 0 1px 0 rgba(255,255,255,0.1)\",\n }}\n >\n {/* Side buttons (mobile only) */}\n {isMobile && (\n <>\n <div className=\"absolute -left-[3px] top-24 w-[3px] h-8 bg-[#2a2a2a] rounded-l\" />\n <div className=\"absolute -left-[3px] top-36 w-[3px] h-12 bg-[#2a2a2a] rounded-l\" />\n <div className=\"absolute -left-[3px] top-52 w-[3px] h-12 bg-[#2a2a2a] rounded-l\" />\n <div className=\"absolute -right-[3px] top-32 w-[3px] h-16 bg-[#2a2a2a] rounded-r\" />\n </>\n )}\n\n {/* Screen container */}\n <div\n className=\"relative rounded-[32px] overflow-hidden bg-white\"\n style={{ height: `${screenHeight}px`, width: `${width}px` }}\n >\n {/* Notch (mobile) or Camera (tablet) */}\n {isMobile ? (\n <div className=\"absolute top-0 left-1/2 -translate-x-1/2 w-[120px] h-[30px] bg-[#1a1a1a] rounded-b-2xl z-10 flex items-center justify-center gap-2\">\n <div className=\"w-2 h-2 rounded-full bg-[#2a2a2a]\" />\n <div className=\"w-12 h-1.5 rounded-full bg-[#2a2a2a]\" />\n </div>\n ) : (\n <div className=\"absolute top-2 left-1/2 -translate-x-1/2 w-3 h-3 rounded-full bg-[#2a2a2a] z-10\" />\n )}\n\n {/* Screen content */}\n <div\n className=\"w-full h-full overflow-hidden\"\n data-theme={previewTheme}\n >\n {useIframeIsolation ? (\n <IsolatedPreviewFrame\n segmentPath={segmentPath}\n variantName={variantName}\n theme={previewTheme}\n width=\"100%\"\n height=\"100%\"\n minHeight={screenHeight}\n />\n ) : (\n <div className={isMobile ? \"pt-10 px-4 pb-4\" : \"pt-6 px-4 pb-4\"}>\n <ErrorBoundary\n componentName={componentName}\n fallback={\n <div className=\"text-xs text-red-500 p-2\">\n Error rendering at {width}px\n </div>\n }\n >\n {renderContent()}\n </ErrorBoundary>\n </div>\n )}\n </div>\n\n {/* Home indicator */}\n <div className=\"absolute bottom-2 left-1/2 -translate-x-1/2 w-[100px] h-1 bg-black/20 rounded-full z-10\" />\n </div>\n </div>\n </div>\n </div>\n );\n}\n\ninterface DesktopMockupProps {\n width: number;\n height: number;\n label: string;\n previewTheme: \"light\" | \"dark\";\n background: BackgroundOption;\n componentName: string;\n segmentPath: string;\n variantName: string;\n renderContent: () => ReactNode;\n useIframeIsolation: boolean;\n}\n\nfunction DesktopMockup({\n width,\n height,\n label,\n previewTheme,\n background,\n componentName,\n segmentPath,\n variantName,\n renderContent,\n useIframeIsolation,\n}: DesktopMockupProps) {\n const backgroundStyle = getBackgroundStyle(background);\n\n return (\n <div className=\"flex flex-col items-center\">\n {/* Label */}\n <div className=\"mb-3 text-sm font-medium text-tertiary\">\n {label}\n </div>\n\n {/* Monitor frame */}\n <div className=\"flex flex-col items-center\">\n {/* Screen */}\n <div\n className=\"relative bg-[#1a1a1a] rounded-lg p-2 shadow-2xl\"\n style={{\n boxShadow: \"0 25px 50px -12px rgba(0, 0, 0, 0.5), inset 0 1px 0 rgba(255,255,255,0.1)\",\n }}\n >\n {/* Browser chrome */}\n <div className=\"flex items-center gap-2 px-3 py-2 bg-[#2a2a2a] rounded-t-md\">\n <div className=\"flex items-center gap-1.5\">\n <div className=\"w-3 h-3 rounded-full bg-[#ff5f57]\" />\n <div className=\"w-3 h-3 rounded-full bg-[#ffbd2e]\" />\n <div className=\"w-3 h-3 rounded-full bg-[#28ca41]\" />\n </div>\n <div className=\"flex-1 mx-4\">\n <div className=\"h-6 bg-[#3a3a3a] rounded-md flex items-center justify-center px-3\">\n <span className=\"text-xs text-gray-400 truncate\">\n localhost:6006 ā {width}px\n </span>\n </div>\n </div>\n </div>\n\n {/* Screen content */}\n <div\n className=\"overflow-hidden\"\n style={{ width: `${width}px`, height: `${height}px`, ...backgroundStyle }}\n data-theme={previewTheme}\n >\n {useIframeIsolation ? (\n <IsolatedPreviewFrame\n segmentPath={segmentPath}\n variantName={variantName}\n theme={previewTheme}\n width=\"100%\"\n height=\"100%\"\n minHeight={height}\n />\n ) : (\n <div className=\"p-6\">\n <ErrorBoundary\n componentName={componentName}\n fallback={\n <div className=\"text-xs text-red-500 p-2\">\n Error rendering at {width}px\n </div>\n }\n >\n {renderContent()}\n </ErrorBoundary>\n </div>\n )}\n </div>\n </div>\n\n {/* Monitor stand */}\n <div className=\"w-20 h-4 bg-gradient-to-b from-[#2a2a2a] to-[#1a1a1a] rounded-b-sm\" />\n <div className=\"w-32 h-2 bg-[#1a1a1a] rounded-full shadow-lg\" />\n </div>\n </div>\n );\n}\n\nexport { DEFAULT_VIEWPORTS as VIEWPORTS, MOBILE_PRESETS };\n","/**\n * BottomPanel component - the tabbed panel at the bottom of the viewer.\n * Contains Code, Styles, Accessibility, Actions, and Graph tabs.\n */\n\nimport { memo, useCallback } from 'react';\nimport type { SegmentDefinition, SegmentVariant } from '../../core/index.js';\nimport clsx from 'clsx';\nimport { ResizablePanel } from './ResizablePanel.js';\nimport { CodePanel } from './CodePanel.js';\nimport { TokenStylePanel } from './TokenStylePanel.js';\nimport { AccessibilityPanel } from './AccessibilityPanel.js';\nimport { InteractionsPanel } from './InteractionsPanel.js';\nimport { ActionsPanel } from './ActionsPanel.js';\nimport { ComponentGraph } from './ComponentGraph.js';\nimport { ContractPanel } from './ContractPanel.js';\nimport type { ActivePanel } from '../hooks/useAppState.js';\nimport type { ActionLog } from '../hooks/useActions.js';\n\ninterface BottomPanelProps {\n // Component data\n segment: SegmentDefinition;\n variant: SegmentVariant;\n segments: Array<{ path: string; segment: SegmentDefinition }>;\n\n // Panel state\n activePanel: ActivePanel;\n onPanelChange: (panel: ActivePanel) => void;\n\n // Figma\n figmaUrl?: string;\n figmaStyles: Record<string, string> | null;\n renderedStyles: Record<string, string> | null;\n figmaLoading: boolean;\n figmaError?: string;\n onFetchFigma: () => void;\n onRefreshRendered: () => void;\n\n // Actions\n actionLogs: ActionLog[];\n onClearActionLogs: () => void;\n\n // Navigation\n onNavigateToComponent: (name: string) => void;\n\n // Keys\n previewKey: number;\n segmentKey: string;\n}\n\n// Tab button component\ninterface TabButtonProps {\n active: boolean;\n onClick: () => void;\n children: React.ReactNode;\n badge?: number;\n}\n\nconst TabButton = memo(function TabButton({ active, onClick, children, badge }: TabButtonProps) {\n return (\n <button\n onClick={onClick}\n className={clsx(\n \"px-3 py-1 text-xs font-medium rounded relative\",\n active\n ? \"text-primary bg-[--bg-hover]\"\n : \"text-tertiary hover:text-secondary\"\n )}\n >\n {children}\n {badge !== undefined && badge > 0 && (\n <span className=\"absolute -top-1 -right-1 w-4 h-4 text-[10px] bg-blue-500 text-white rounded-full flex items-center justify-center\">\n {badge > 99 ? '99+' : badge}\n </span>\n )}\n </button>\n );\n});\n\nexport const BottomPanel = memo(function BottomPanel({\n segment,\n variant,\n segments,\n activePanel,\n onPanelChange,\n figmaUrl,\n figmaStyles,\n renderedStyles,\n figmaLoading,\n figmaError,\n onFetchFigma,\n onRefreshRendered,\n actionLogs,\n onClearActionLogs,\n onNavigateToComponent,\n previewKey,\n segmentKey,\n}: BottomPanelProps) {\n const handleStylesClick = useCallback(() => {\n onPanelChange('styles');\n onFetchFigma();\n setTimeout(onRefreshRendered, 100);\n }, [onPanelChange, onFetchFigma, onRefreshRendered]);\n\n return (\n <ResizablePanel\n visible={true}\n header={\n <div className=\"flex items-center gap-1\">\n <TabButton\n active={activePanel === 'code'}\n onClick={() => onPanelChange('code')}\n >\n Code\n </TabButton>\n {figmaUrl && (\n <TabButton\n active={activePanel === 'styles'}\n onClick={handleStylesClick}\n >\n Styles\n </TabButton>\n )}\n <TabButton\n active={activePanel === 'accessibility'}\n onClick={() => onPanelChange('accessibility')}\n >\n Accessibility\n </TabButton>\n {variant?.hasPlayFunction && (\n <TabButton\n active={activePanel === 'interactions'}\n onClick={() => onPanelChange('interactions')}\n >\n Interactions\n </TabButton>\n )}\n <TabButton\n active={activePanel === 'actions'}\n onClick={() => onPanelChange('actions')}\n badge={actionLogs.length}\n >\n Actions\n </TabButton>\n <TabButton\n active={activePanel === 'graph'}\n onClick={() => onPanelChange('graph')}\n >\n Graph\n </TabButton>\n <TabButton\n active={activePanel === 'contract'}\n onClick={() => onPanelChange('contract')}\n >\n Contract\n </TabButton>\n </div>\n }\n >\n {activePanel === 'code' && (\n <div className=\"p-4\">\n <CodePanel\n variant={variant}\n componentName={segment.meta.name}\n propDefs={segment.props}\n compact\n />\n </div>\n )}\n\n {activePanel === 'styles' && figmaUrl && (\n <TokenStylePanel\n figmaUrl={figmaUrl}\n figmaStyles={figmaStyles}\n renderedStyles={renderedStyles}\n figmaLoading={figmaLoading}\n figmaError={figmaError}\n onFetchFigma={onFetchFigma}\n onRefreshRendered={onRefreshRendered}\n />\n )}\n\n {activePanel === 'accessibility' && (\n <AccessibilityPanel\n cacheKey={segmentKey}\n previewKey={previewKey}\n autoScan={true}\n componentName={segment.meta.name}\n variantName={variant.name}\n />\n )}\n\n {activePanel === 'interactions' && (\n <InteractionsPanel\n key={segmentKey}\n variant={variant}\n previewKey={previewKey}\n />\n )}\n\n {activePanel === 'actions' && (\n <ActionsPanel\n logs={actionLogs}\n onClear={onClearActionLogs}\n />\n )}\n\n {activePanel === 'graph' && (\n <ComponentGraph\n segment={segment}\n allSegments={segments}\n onNavigate={onNavigateToComponent}\n />\n )}\n\n {activePanel === 'contract' && (\n <ContractPanel\n contract={segment.contract}\n componentName={segment.meta.name}\n />\n )}\n </ResizablePanel>\n );\n});\n","/**\n * ResizablePanel - A panel that can be resized by dragging and docked to bottom or right\n *\n * Features:\n * - Drag-to-resize from the edge\n * - Dock to bottom or right side\n * - Collapsible\n * - Persists size and dock position to localStorage\n */\n\nimport { useState, useEffect, useCallback, useRef, type ReactNode } from \"react\";\nimport clsx from \"clsx\";\nimport { BRAND } from \"../../core/index.js\";\nimport { ChevronDownIcon } from \"./Icons.js\";\n\n// Storage key for persisting panel state\nconst STORAGE_KEY = `${BRAND.storagePrefix}panel-state`;\n\ninterface PanelState {\n height: number;\n width: number;\n dock: \"bottom\" | \"right\";\n isOpen: boolean;\n}\n\nconst DEFAULT_STATE: PanelState = {\n height: 180, // Reduced from 256 to give preview area more space\n width: 400,\n dock: \"bottom\",\n isOpen: true,\n};\n\nconst MIN_HEIGHT = 120;\nconst MAX_HEIGHT = 600;\nconst MIN_WIDTH = 280;\nconst MAX_WIDTH = 800;\n\nfunction loadPanelState(): PanelState {\n try {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n const parsed = JSON.parse(stored);\n return { ...DEFAULT_STATE, ...parsed };\n }\n } catch {\n // Ignore parse errors\n }\n return DEFAULT_STATE;\n}\n\nfunction savePanelState(state: PanelState): void {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(state));\n } catch {\n // Ignore storage errors\n }\n}\n\ninterface ResizablePanelProps {\n /** Panel header content (tabs, title, etc.) */\n header: ReactNode;\n /** Panel body content */\n children: ReactNode;\n /** Whether to show the panel at all */\n visible?: boolean;\n /** Additional class name for the panel container */\n className?: string;\n}\n\nexport function ResizablePanel({\n header,\n children,\n visible = true,\n className,\n}: ResizablePanelProps) {\n const [state, setState] = useState<PanelState>(loadPanelState);\n const [isResizing, setIsResizing] = useState(false);\n const panelRef = useRef<HTMLDivElement>(null);\n const startPosRef = useRef({ x: 0, y: 0 });\n const startSizeRef = useRef({ width: 0, height: 0 });\n\n // Save state changes to localStorage\n useEffect(() => {\n savePanelState(state);\n }, [state]);\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n e.preventDefault();\n setIsResizing(true);\n startPosRef.current = { x: e.clientX, y: e.clientY };\n startSizeRef.current = { width: state.width, height: state.height };\n },\n [state.width, state.height]\n );\n\n const handleMouseMove = useCallback(\n (e: MouseEvent) => {\n if (!isResizing) return;\n\n if (state.dock === \"bottom\") {\n // Resize height (drag up = increase, drag down = decrease)\n const deltaY = startPosRef.current.y - e.clientY;\n const newHeight = Math.max(\n MIN_HEIGHT,\n Math.min(MAX_HEIGHT, startSizeRef.current.height + deltaY)\n );\n setState((s) => ({ ...s, height: newHeight }));\n } else {\n // Resize width (drag left = increase, drag right = decrease)\n const deltaX = startPosRef.current.x - e.clientX;\n const newWidth = Math.max(\n MIN_WIDTH,\n Math.min(MAX_WIDTH, startSizeRef.current.width + deltaX)\n );\n setState((s) => ({ ...s, width: newWidth }));\n }\n },\n [isResizing, state.dock]\n );\n\n const handleMouseUp = useCallback(() => {\n setIsResizing(false);\n }, []);\n\n // Add global mouse event listeners during resize\n useEffect(() => {\n if (isResizing) {\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n document.body.style.cursor = state.dock === \"bottom\" ? \"ns-resize\" : \"ew-resize\";\n document.body.style.userSelect = \"none\";\n\n return () => {\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n document.body.style.cursor = \"\";\n document.body.style.userSelect = \"\";\n };\n }\n }, [isResizing, handleMouseMove, handleMouseUp, state.dock]);\n\n const toggleOpen = useCallback(() => {\n setState((s) => ({ ...s, isOpen: !s.isOpen }));\n }, []);\n\n const toggleDock = useCallback(() => {\n setState((s) => ({\n ...s,\n dock: s.dock === \"bottom\" ? \"right\" : \"bottom\",\n }));\n }, []);\n\n if (!visible) return null;\n\n const isBottom = state.dock === \"bottom\";\n const isOpen = state.isOpen;\n\n // Header height for collapsed state\n const headerHeight = 40; // h-10 = 2.5rem = 40px\n\n return (\n <div\n ref={panelRef}\n className={clsx(\n \"flex-shrink-0 bg-[--bg-secondary] relative\",\n isBottom\n ? \"border-t border-[--border]\"\n : \"border-l border-[--border]\",\n className\n )}\n style={{\n // Only transition when NOT resizing (for smooth open/close animations)\n // Disable during drag to prevent sluggish feel\n transition: isResizing ? 'none' : 'height 150ms ease, width 150ms ease',\n ...(isBottom\n ? { height: isOpen ? state.height : headerHeight }\n : { width: isOpen ? state.width : headerHeight }),\n // Prevent content from being selected during resize\n ...(isResizing && { pointerEvents: \"none\" }),\n }}\n >\n {/* Full-viewport overlay during resize - prevents iframes from capturing events */}\n {isResizing && (\n <div\n className=\"fixed inset-0 z-50\"\n style={{\n cursor: isBottom ? \"ns-resize\" : \"ew-resize\",\n // Must explicitly enable pointer events since parent has pointerEvents: none\n pointerEvents: \"auto\",\n }}\n />\n )}\n\n {/* Resize Handle - extends above/left of panel for easier grabbing */}\n {isOpen && (\n <div\n className={clsx(\n \"absolute z-20 group\",\n isBottom\n ? \"-top-2 left-0 right-0 h-4 cursor-ns-resize\"\n : \"top-0 -left-2 bottom-0 w-4 cursor-ew-resize\",\n isResizing && \"bg-[--color-accent]/20\"\n )}\n onMouseDown={handleMouseDown}\n >\n {/* Visual indicator - shows on hover */}\n <div\n className={clsx(\n \"absolute bg-[--color-accent] opacity-0 group-hover:opacity-50 transition-opacity\",\n isBottom\n ? \"left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-12 h-1 rounded-full\"\n : \"top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-1 h-12 rounded-full\"\n )}\n />\n </div>\n )}\n\n {/* Panel Header */}\n <div\n className={clsx(\n \"flex items-center justify-between px-4 border-[--border-subtle]\",\n isBottom ? \"h-10 border-b\" : \"h-10 border-b\"\n )}\n >\n <div className=\"flex items-center gap-1 flex-1 overflow-hidden\">\n {header}\n </div>\n <div className=\"flex items-center gap-1\">\n {/* Dock toggle button */}\n <button\n onClick={toggleDock}\n className=\"p-1 text-tertiary hover:text-primary hover:bg-[--bg-hover] rounded transition-colors\"\n title={isBottom ? \"Dock to right\" : \"Dock to bottom\"}\n >\n <DockIcon dock={state.dock} className=\"w-4 h-4\" />\n </button>\n {/* Collapse toggle button */}\n <button\n onClick={toggleOpen}\n className=\"p-1 text-tertiary hover:text-primary hover:bg-[--bg-hover] rounded transition-colors\"\n title={isOpen ? \"Collapse panel\" : \"Expand panel\"}\n >\n <ChevronDownIcon\n className={clsx(\n \"w-4 h-4 transition-transform\",\n !isOpen && (isBottom ? \"rotate-180\" : \"-rotate-90\"),\n isOpen && !isBottom && \"rotate-90\"\n )}\n />\n </button>\n </div>\n </div>\n\n {/* Panel Content */}\n {isOpen && (\n <div\n className=\"overflow-auto\"\n style={{\n height: isBottom ? `calc(100% - ${headerHeight}px)` : \"100%\",\n width: isBottom ? \"100%\" : `calc(100% - ${headerHeight}px)`,\n }}\n >\n {children}\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Hook to get panel dock position for layout purposes\n */\nexport function usePanelDock(): \"bottom\" | \"right\" {\n const [dock, setDock] = useState<\"bottom\" | \"right\">(() => {\n const state = loadPanelState();\n return state.dock;\n });\n\n useEffect(() => {\n const handleStorage = () => {\n const state = loadPanelState();\n setDock(state.dock);\n };\n\n // Listen for storage changes (from other tabs)\n window.addEventListener(\"storage\", handleStorage);\n\n // Also poll for changes since localStorage events don't fire in same tab\n const interval = setInterval(handleStorage, 500);\n\n return () => {\n window.removeEventListener(\"storage\", handleStorage);\n clearInterval(interval);\n };\n }, []);\n\n return dock;\n}\n\n// Icon for dock position toggle\nfunction DockIcon({ dock, className }: { dock: \"bottom\" | \"right\"; className?: string }) {\n if (dock === \"bottom\") {\n // Show icon indicating \"dock to right\" action\n return (\n <svg className={className} viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n {/* Outer frame */}\n <rect x=\"1\" y=\"2\" width=\"14\" height=\"12\" rx=\"1\" />\n {/* Right panel indicator */}\n <line x1=\"10\" y1=\"2\" x2=\"10\" y2=\"14\" />\n <line x1=\"10\" y1=\"8\" x2=\"15\" y2=\"8\" strokeDasharray=\"2 1\" />\n </svg>\n );\n }\n\n // Show icon indicating \"dock to bottom\" action\n return (\n <svg className={className} viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\">\n {/* Outer frame */}\n <rect x=\"1\" y=\"2\" width=\"14\" height=\"12\" rx=\"1\" />\n {/* Bottom panel indicator */}\n <line x1=\"1\" y1=\"10\" x2=\"15\" y2=\"10\" />\n <line x1=\"8\" y1=\"10\" x2=\"8\" y2=\"14\" strokeDasharray=\"2 1\" />\n </svg>\n );\n}\n\nexport default ResizablePanel;\n","import { useState, useCallback, useMemo, useEffect, isValidElement, type ReactNode } from 'react';\nimport type { SegmentVariant, PropDefinition } from '../../core/index.js';\nimport { codeToHtml } from 'shiki';\nimport clsx from 'clsx';\nimport { CopyIcon, CheckIcon } from './Icons.js';\n\ninterface CodePanelProps {\n variant: SegmentVariant;\n componentName: string;\n compact?: boolean;\n propDefs?: Record<string, PropDefinition>;\n}\n\n// Extract props from rendered element by calling render() and introspecting\nfunction extractPropsFromRender(variant: SegmentVariant, componentName: string): Record<string, unknown> | null {\n try {\n const rendered = variant.render();\n if (!isValidElement(rendered)) return null;\n\n // Check if this is the expected component (by displayName or name)\n const elementType = rendered.type;\n const typeName = typeof elementType === 'function'\n ? (elementType as { displayName?: string; name?: string }).displayName || (elementType as { name?: string }).name\n : typeof elementType === 'string' ? elementType : null;\n\n // Only extract if it's a single element of the expected component type\n if (typeName && typeName.toLowerCase() === componentName.toLowerCase()) {\n return rendered.props as Record<string, unknown>;\n }\n\n // If it's a wrapper element, try to find the component in children\n const props = rendered.props as { children?: ReactNode };\n if (props.children && isValidElement(props.children)) {\n const childType = props.children.type;\n const childTypeName = typeof childType === 'function'\n ? (childType as { displayName?: string; name?: string }).displayName || (childType as { name?: string }).name\n : null;\n if (childTypeName && childTypeName.toLowerCase() === componentName.toLowerCase()) {\n return props.children.props as Record<string, unknown>;\n }\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\n// Check if the component likely needs state management\nfunction needsStatefulExample(componentName: string, propDefs?: Record<string, PropDefinition>): boolean {\n const statefulComponents = ['toggle', 'checkbox', 'input', 'select', 'switch', 'radio'];\n const lowerName = componentName.toLowerCase();\n\n if (statefulComponents.some(c => lowerName.includes(c))) {\n return true;\n }\n\n // Check if component has onChange/onChecked props\n if (propDefs) {\n const hasChangeHandler = Object.keys(propDefs).some(\n key => key === 'onChange' || key === 'onChecked' || key === 'onValueChange'\n );\n const hasValueProp = Object.keys(propDefs).some(\n key => key === 'value' || key === 'checked'\n );\n return hasChangeHandler && hasValueProp;\n }\n\n return false;\n}\n\n/**\n * Convert compiled jsxDEV/jsx calls back to clean JSX syntax.\n * Handles: jsxDEV(Component, { props, children }, ...) -> <Component props>children</Component>\n */\nfunction decompileJsxDev(code: string, indent = 0): string {\n const indentStr = ' '.repeat(indent);\n\n // Match jsxDEV or jsx call: jsxDEV(Component, {props}, ...)\n // Also handle _jsxDEV, /* @__PURE__ */ prefix\n const jsxMatch = code.match(/(?:\\/\\*\\s*@__PURE__\\s*\\*\\/\\s*)?_?jsxs?(?:DEV)?\\s*\\(\\s*([^,]+)\\s*,\\s*(\\{[\\s\\S]*\\})\\s*(?:,[\\s\\S]*)?\\)$/);\n\n if (!jsxMatch) {\n // Not a jsxDEV call - might be a plain string or primitive\n const trimmed = code.trim();\n // If it's a quoted string, return the content\n if ((trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n }\n\n let componentName = jsxMatch[1].trim();\n const propsStr = jsxMatch[2];\n\n // Clean up component name (remove quotes for HTML elements)\n if (componentName.startsWith('\"') || componentName.startsWith(\"'\")) {\n componentName = componentName.slice(1, -1);\n }\n\n // Parse props object - extract key-value pairs\n const props: Record<string, string> = {};\n let children: string | null = null;\n\n // Debug props that should be excluded (added by jsxDEV in development)\n const debugProps = new Set(['fileName', 'lineNumber', 'columnNumber', '__source', '__self']);\n\n // Simple prop extraction (handles most common cases)\n // Match: key: value, key: \"string\", key: number, key: boolean\n const propMatches = propsStr.matchAll(/(\\w+)\\s*:\\s*(\"(?:[^\"\\\\]|\\\\.)*\"|'(?:[^'\\\\]|\\\\.)*'|[\\w.]+|\\{[^}]*\\}|(?:\\/\\*[\\s\\S]*?\\*\\/\\s*)?_?jsxs?(?:DEV)?\\s*\\([^)]*(?:\\([^)]*\\)[^)]*)*\\))/g);\n\n for (const match of propMatches) {\n const key = match[1];\n let value = match[2];\n\n // Skip debug props\n if (debugProps.has(key)) continue;\n\n if (key === 'children') {\n // Handle children specially\n if (value.includes('jsxDEV') || value.includes('jsx(') || value.includes('_jsx')) {\n // Nested JSX - recursively decompile\n children = decompileJsxDev(value, indent + 1);\n } else if (value.startsWith('\"') || value.startsWith(\"'\")) {\n // String children\n children = value.slice(1, -1);\n } else {\n children = `{${value}}`;\n }\n } else {\n // Regular props\n if (value.startsWith('\"') || value.startsWith(\"'\")) {\n props[key] = value; // Keep as quoted string\n } else if (value === 'true' || value === 'false') {\n props[key] = value === 'true' ? `{true}` : `{false}`;\n } else if (!isNaN(Number(value))) {\n props[key] = `{${value}}`;\n } else {\n props[key] = `{${value}}`;\n }\n }\n }\n\n // Build JSX string\n const propParts = Object.entries(props)\n .filter(([k]) => k !== 'children')\n .map(([k, v]) => {\n // Convert camelCase event handlers back\n if (v.startsWith('\"') || v.startsWith(\"'\")) {\n return `${k}=${v}`;\n }\n return `${k}=${v}`;\n });\n\n const propsJsx = propParts.length > 0 ? ' ' + propParts.join(' ') : '';\n\n if (children) {\n if (children.includes('\\n')) {\n return `${indentStr}<${componentName}${propsJsx}>\\n${children}\\n${indentStr}</${componentName}>`;\n }\n return `${indentStr}<${componentName}${propsJsx}>${children}</${componentName}>`;\n }\n\n return `${indentStr}<${componentName}${propsJsx} />`;\n}\n\n/**\n * Extract the JSX body from a render function's source code.\n * Works with arrow functions like: () => <Component /> or () => (<div>...</div>)\n * Also handles compiled jsxDEV calls and converts them back to JSX.\n */\nfunction extractRenderBody(renderFn: () => ReactNode): string | null {\n try {\n const source = renderFn.toString();\n\n // Match arrow function body: () => <...> or () => (...)\n // Handle both: () => <X /> and () => (\\n <X />\\n)\n const arrowMatch = source.match(/^\\s*\\(\\s*\\)\\s*=>\\s*(.+)$/s);\n if (arrowMatch) {\n let body = arrowMatch[1].trim();\n\n // Remove outer parentheses if present\n if (body.startsWith('(') && body.endsWith(')')) {\n body = body.slice(1, -1).trim();\n }\n\n // Check if this is compiled JSX (jsxDEV calls)\n if (body.includes('jsxDEV') || body.includes('jsx(') || body.includes('_jsx')) {\n return decompileJsxDev(body);\n }\n\n return body;\n }\n\n // Match function body with return statement\n const returnMatch = source.match(/return\\s*\\(\\s*([\\s\\S]*?)\\s*\\)\\s*;?\\s*\\}?\\s*$/);\n if (returnMatch) {\n const body = returnMatch[1].trim();\n\n // Check if this is compiled JSX\n if (body.includes('jsxDEV') || body.includes('jsx(') || body.includes('_jsx')) {\n return decompileJsxDev(body);\n }\n\n return body;\n }\n\n return null;\n } catch {\n return null;\n }\n}\n\nexport function CodePanel({ variant, componentName, compact = false, propDefs }: CodePanelProps) {\n const [copied, setCopied] = useState(false);\n const [highlightedHtml, setHighlightedHtml] = useState<string>('');\n\n // Generate code - extract from render function source for accuracy\n const generatedCode = useMemo(() => {\n // Priority 1: Use variant.code if available (from compiled JSON/AST)\n if (variant.code) {\n return generateFullExample(componentName, variant.code);\n }\n\n // Priority 2: Extract source from render function (runtime)\n if (variant.render) {\n const renderBody = extractRenderBody(variant.render);\n if (renderBody) {\n return generateFullExample(componentName, renderBody);\n }\n }\n\n // Priority 3: Generate from args (fallback for edge cases)\n const needsState = needsStatefulExample(componentName, propDefs);\n let effectiveArgs = variant.args;\n\n // If no args on variant, try to extract from rendered element\n if (!effectiveArgs || Object.keys(effectiveArgs).length === 0) {\n effectiveArgs = extractPropsFromRender(variant, componentName) ?? undefined;\n }\n\n return generateCombinedCode(componentName, propDefs, effectiveArgs, needsState);\n }, [componentName, variant, propDefs]);\n\n // Apply syntax highlighting\n useEffect(() => {\n let cancelled = false;\n\n codeToHtml(generatedCode, {\n lang: 'tsx',\n theme: 'one-dark-pro',\n }).then(html => {\n if (!cancelled) {\n setHighlightedHtml(html);\n }\n }).catch(err => {\n console.error('Syntax highlighting failed:', err);\n if (!cancelled) {\n // Fallback to plain text\n setHighlightedHtml(`<pre><code>${escapeHtml(generatedCode)}</code></pre>`);\n }\n });\n\n return () => { cancelled = true; };\n }, [generatedCode]);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(generatedCode);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error('Failed to copy:', err);\n }\n }, [generatedCode]);\n\n return (\n <div className=\"relative\">\n {/* Syntax highlighted code */}\n <div\n className={clsx(\n 'rounded-lg overflow-auto border border-[--border] bg-[#282c34]',\n '[&_pre]:!bg-transparent [&_pre]:!m-0 [&_pre]:p-4',\n '[&_code]:!bg-transparent [&_code]:text-[13px] [&_code]:leading-relaxed',\n '[&_.shiki]:!bg-transparent',\n // Custom selection highlight for better visibility\n '[&_*::selection]:bg-blue-500/40 [&_*::selection]:text-white',\n compact && '[&_code]:text-xs'\n )}\n style={{ maxHeight: 400 }}\n dangerouslySetInnerHTML={{ __html: highlightedHtml || '<div class=\"p-4 text-gray-500 text-sm\">Loading...</div>' }}\n />\n\n {/* Copy button - fixed to top right of editor */}\n <button\n onClick={handleCopy}\n className={clsx(\n 'absolute top-2 right-2 flex items-center gap-1.5 px-2.5 py-1.5 text-xs font-medium rounded-md transition-all duration-200',\n copied\n ? 'bg-green-500/20 text-green-400 border border-green-500/30'\n : 'bg-white/10 text-gray-300 border border-white/10 hover:bg-white/15 hover:text-white'\n )}\n >\n {copied ? (\n <>\n <CheckIcon className=\"w-3.5 h-3.5\" />\n <span>Copied!</span>\n </>\n ) : (\n <>\n <CopyIcon className=\"w-3.5 h-3.5\" />\n <span>Copy</span>\n </>\n )}\n </button>\n </div>\n );\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\n/**\n * Normalize indentation by removing common leading whitespace from all lines.\n * Handles JSX where first line may be at column 0 but inner content is indented.\n */\nfunction normalizeIndentation(code: string): string {\n const lines = code.split('\\n');\n if (lines.length <= 1) return code;\n\n // Find minimum indentation (ignoring empty lines and first line)\n // First line often has 0 indent, but inner content is over-indented\n let minIndent = Infinity;\n const firstLineIndent = lines[0].match(/^(\\s*)/)?.[1].length ?? 0;\n\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i];\n if (line.trim().length === 0) continue;\n const indent = line.match(/^(\\s*)/)?.[1].length ?? 0;\n minIndent = Math.min(minIndent, indent);\n }\n\n // If first line has indent, include it in calculation\n if (firstLineIndent > 0) {\n minIndent = Math.min(minIndent, firstLineIndent);\n }\n\n if (minIndent === Infinity || minIndent === 0) return code;\n\n // Remove the common indentation from all lines\n return lines\n .map(line => line.slice(Math.min(minIndent, line.match(/^(\\s*)/)?.[1].length ?? 0)))\n .join('\\n');\n}\n\n// Generate a full example from the variant's code string\n// Shows the ACTUAL code from the fragment file - no transformations\nfunction generateFullExample(\n componentName: string,\n variantCode: string\n): string {\n // Normalize indentation first\n const normalizedCode = normalizeIndentation(variantCode);\n\n // Add component import\n const imports = [`import { ${componentName} } from '@/components/${componentName}';`];\n\n // Check if the code uses StatefulXxx wrapper - if so, include that helper\n const statefulPattern = new RegExp(`<Stateful${componentName}`, 'i');\n const usesStatefulWrapper = statefulPattern.test(normalizedCode);\n\n if (usesStatefulWrapper) {\n imports.unshift(`import { useState } from 'react';`);\n\n // Determine the state type based on component\n const lowerName = componentName.toLowerCase();\n const isToggleLike = lowerName.includes('toggle') || lowerName.includes('checkbox') || lowerName.includes('switch');\n\n const stateType = isToggleLike ? 'boolean' : 'string';\n const defaultValue = isToggleLike ? 'false' : \"''\";\n const stateName = isToggleLike ? 'checked' : 'value';\n const setterName = isToggleLike ? 'setChecked' : 'setValue';\n const valueProp = isToggleLike ? 'checked' : 'value';\n const handlerProp = 'onChange';\n\n // Generate the stateful wrapper helper that the code uses\n const helperCode = `\n// Stateful wrapper for interactive demos\nfunction Stateful${componentName}(props: React.ComponentProps<typeof ${componentName}>) {\n const [${stateName}, ${setterName}] = useState(props.${valueProp} ?? ${defaultValue});\n return <${componentName} {...props} ${valueProp}={${stateName}} ${handlerProp}={${setterName}} />;\n}`;\n\n return `${imports.join('\\n')}\n${helperCode}\n\n// Example usage:\n${normalizedCode}`;\n }\n\n // For non-stateful code, just show the raw code with import\n return `${imports.join('\\n')}\n\n${normalizedCode}`;\n}\n\n// Generate combined import statement + JSX usage\nfunction generateCombinedCode(\n componentName: string,\n propDefs?: Record<string, PropDefinition>,\n variantArgs?: Record<string, unknown>,\n needsState?: boolean\n): string {\n const imports: string[] = [];\n const hooks: string[] = [];\n\n if (needsState) {\n imports.push(`import { useState } from 'react';`);\n }\n imports.push(`import { ${componentName} } from '@/components/${componentName}';`);\n\n // Determine state props that will be managed by hooks (to avoid duplicates)\n const lowerName = componentName.toLowerCase();\n const isToggleLike = lowerName.includes('toggle') || lowerName.includes('checkbox') || lowerName.includes('switch');\n const statePropsToSkip = needsState\n ? isToggleLike\n ? ['checked', 'onChange', 'onCheckedChange']\n : ['value', 'onChange', 'onValueChange']\n : [];\n\n // Build props string - prefer actual variant args over prop definitions\n const propsEntries: string[] = [];\n let childrenValue: unknown = undefined;\n\n if (variantArgs && Object.keys(variantArgs).length > 0) {\n // Use actual variant args for accurate code generation\n for (const [name, value] of Object.entries(variantArgs)) {\n if (value === undefined) continue;\n\n // Handle children specially - will be rendered as element content\n if (name === 'children') {\n childrenValue = value;\n continue;\n }\n\n // Skip function props (callbacks) - they're runtime handlers\n if (typeof value === 'function') continue;\n\n // Skip props that will be managed by state hooks\n if (statePropsToSkip.includes(name)) continue;\n\n const propType = propDefs?.[name]?.type || typeof value;\n const formattedValue = formatPropValue(value, propType);\n propsEntries.push(`${name}=${formattedValue}`);\n }\n } else if (propDefs) {\n // Fallback to prop definitions if no variant args\n for (const [name, def] of Object.entries(propDefs)) {\n if (name === 'children') {\n if (def.default !== undefined) {\n childrenValue = def.default;\n }\n continue;\n }\n\n // Skip props that will be managed by state hooks\n if (statePropsToSkip.includes(name)) continue;\n\n if (def.required && def.default !== undefined) {\n const value = formatPropValue(def.default, def.type);\n propsEntries.push(`${name}=${value}`);\n } else if (def.required) {\n const placeholder = getTypePlaceholder(name, def);\n propsEntries.push(`${name}=${placeholder}`);\n }\n }\n }\n\n // Build JSX code\n const hasChildren = childrenValue !== undefined && childrenValue !== null;\n const childrenStr = hasChildren ? formatChildrenValue(childrenValue) : null;\n\n // For stateful components, wrap in a function component\n if (needsState) {\n let stateName = 'value';\n let setterName = 'setValue';\n let handlerProp = 'onChange';\n let valueProp = 'value';\n let defaultValue = \"''\";\n let stateType = 'string';\n\n if (isToggleLike) {\n stateType = 'boolean';\n defaultValue = 'false';\n stateName = 'checked';\n setterName = 'setChecked';\n handlerProp = propDefs?.['onCheckedChange'] ? 'onCheckedChange' : 'onChange';\n valueProp = 'checked';\n }\n\n hooks.push(`const [${stateName}, ${setterName}] = useState<${stateType}>(${defaultValue});`);\n\n // Add state props\n propsEntries.push(`${valueProp}={${stateName}}`);\n propsEntries.push(`${handlerProp}={${setterName}}`);\n\n const propsStr = propsEntries.length > 0\n ? `\\n ${propsEntries.join('\\n ')}\\n `\n : ' ';\n\n const jsxCode = hasChildren\n ? `<${componentName}${propsStr}>${childrenStr}</${componentName}>`\n : `<${componentName}${propsStr}/>`;\n\n return `${imports.join('\\n')}\n\nfunction Example() {\n ${hooks.join('\\n ')}\n\n return (\n ${jsxCode}\n );\n}`;\n }\n\n // Simple non-stateful code\n let jsxCode: string;\n\n if (propsEntries.length === 0 && !hasChildren) {\n jsxCode = `<${componentName} />`;\n } else if (propsEntries.length === 0 && hasChildren) {\n jsxCode = `<${componentName}>${childrenStr}</${componentName}>`;\n } else if (propsEntries.length === 1 && !hasChildren) {\n jsxCode = `<${componentName} ${propsEntries[0]} />`;\n } else if (propsEntries.length === 1 && hasChildren) {\n jsxCode = `<${componentName} ${propsEntries[0]}>\\n ${childrenStr}\\n</${componentName}>`;\n } else if (!hasChildren) {\n jsxCode = `<${componentName}\\n ${propsEntries.join('\\n ')}\\n/>`;\n } else {\n jsxCode = `<${componentName}\\n ${propsEntries.join('\\n ')}\\n>\\n ${childrenStr}\\n</${componentName}>`;\n }\n\n return `${imports.join('\\n')}\n\n${jsxCode}`;\n}\n\nfunction formatChildrenValue(value: unknown): string {\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return `{${value}}`;\n }\n return '{/* children */}';\n}\n\nfunction formatPropValue(value: unknown, type: string): string {\n if (type === 'string' || typeof value === 'string') {\n return `\"${value}\"`;\n }\n if (type === 'boolean' || typeof value === 'boolean') {\n return `{${value}}`;\n }\n if (type === 'number' || typeof value === 'number') {\n return `{${value}}`;\n }\n return `{${JSON.stringify(value)}}`;\n}\n\nfunction getTypePlaceholder(name: string, def: PropDefinition): string {\n if (def.values && def.values.length > 0) {\n return `\"${def.values[0]}\"`;\n }\n switch (def.type) {\n case 'string': return `\"${name}\"`;\n case 'boolean': return '{true}';\n case 'number': return '{0}';\n case 'function': return '{() => {}}';\n default: return '{undefined}';\n }\n}\n","/**\n * Token-Aware Style Comparison Panel\n *\n * Enhanced style comparison that shows:\n * - Property, Figma value, Rendered value, Match status\n * - Token names when values match design tokens\n * - Hardcoded value warnings\n * - Fix suggestions that can be copied\n */\n\nimport { useState, useEffect, useCallback } from \"react\";\nimport clsx from \"clsx\";\nimport type { DesignToken, EnhancedStyleDiffItem, TokenUsageSummary } from \"../../core/index.js\";\nimport { CheckIcon, XIcon, LoadingIcon, FigmaIcon, WandIcon } from \"./Icons.js\";\n\n// Alias for semantic clarity\nconst SyncingIcon = LoadingIcon;\n\n/**\n * Maps CSS properties to expected token categories\n * This prevents false positives like \"height: 49px\" matching \"--top-bar-height\"\n */\nconst PROPERTY_CATEGORY_MAP: Record<string, string[]> = {\n // Color properties\n color: [\"color\"],\n backgroundColor: [\"color\"],\n borderColor: [\"color\", \"border\"],\n borderTopColor: [\"color\", \"border\"],\n borderRightColor: [\"color\", \"border\"],\n borderBottomColor: [\"color\", \"border\"],\n borderLeftColor: [\"color\", \"border\"],\n outlineColor: [\"color\"],\n fill: [\"color\"],\n stroke: [\"color\"],\n caretColor: [\"color\"],\n textDecorationColor: [\"color\"],\n boxShadow: [\"shadow\", \"color\"],\n\n // Spacing properties\n margin: [\"spacing\"],\n marginTop: [\"spacing\"],\n marginRight: [\"spacing\"],\n marginBottom: [\"spacing\"],\n marginLeft: [\"spacing\"],\n padding: [\"spacing\"],\n paddingTop: [\"spacing\"],\n paddingRight: [\"spacing\"],\n paddingBottom: [\"spacing\"],\n paddingLeft: [\"spacing\"],\n gap: [\"spacing\"],\n rowGap: [\"spacing\"],\n columnGap: [\"spacing\"],\n\n // Sizing properties (NOT spacing - heights shouldn't match spacing tokens)\n width: [\"sizing\"],\n height: [\"sizing\"],\n minWidth: [\"sizing\"],\n minHeight: [\"sizing\"],\n maxWidth: [\"sizing\"],\n maxHeight: [\"sizing\"],\n\n // Border radius\n borderRadius: [\"radius\"],\n borderTopLeftRadius: [\"radius\"],\n borderTopRightRadius: [\"radius\"],\n borderBottomLeftRadius: [\"radius\"],\n borderBottomRightRadius: [\"radius\"],\n\n // Typography\n fontSize: [\"typography\"],\n fontWeight: [\"typography\"],\n lineHeight: [\"typography\"],\n letterSpacing: [\"typography\"],\n fontFamily: [\"typography\"],\n\n // Border\n borderWidth: [\"border\"],\n borderTopWidth: [\"border\"],\n borderRightWidth: [\"border\"],\n borderBottomWidth: [\"border\"],\n borderLeftWidth: [\"border\"],\n\n // Z-index\n zIndex: [\"z-index\"],\n\n // Animation\n transitionDuration: [\"animation\"],\n animationDuration: [\"animation\"],\n transitionDelay: [\"animation\"],\n animationDelay: [\"animation\"],\n};\n\n/**\n * Get expected token categories for a CSS property\n */\nfunction getExpectedCategories(property: string): string[] | null {\n return PROPERTY_CATEGORY_MAP[property] || null;\n}\n\ninterface TokenStylePanelProps {\n figmaUrl: string;\n figmaStyles: Record<string, string> | null;\n renderedStyles: Record<string, string> | null;\n figmaLoading: boolean;\n figmaError?: string;\n onFetchFigma: () => void;\n onRefreshRendered: () => void;\n}\n\ninterface TokenData {\n tokens: DesignToken[];\n meta?: {\n totalTokens: number;\n parseTimeMs: number;\n };\n}\n\n// Module-level cache for tokens to avoid refetching on tab switches\nlet cachedTokenData: TokenData | null = null;\nlet cachedTokenError: string | null = null;\nlet tokenFetchPromise: Promise<void> | null = null;\n\nexport function TokenStylePanel({\n figmaUrl,\n figmaStyles,\n renderedStyles,\n figmaLoading,\n figmaError,\n onFetchFigma,\n onRefreshRendered,\n}: TokenStylePanelProps) {\n const [tokenData, setTokenData] = useState<TokenData | null>(null);\n const [tokenError, setTokenError] = useState<string | null>(null);\n const [tokenLoading, setTokenLoading] = useState(false);\n const [copiedFix, setCopiedFix] = useState<string | null>(null);\n\n // Fetch tokens on mount (with module-level caching)\n useEffect(() => {\n // Use cached data if available\n if (cachedTokenData) {\n setTokenData(cachedTokenData);\n setTokenLoading(false);\n return;\n }\n if (cachedTokenError) {\n setTokenError(cachedTokenError);\n setTokenLoading(false);\n return;\n }\n\n // If a fetch is already in progress, wait for it\n if (tokenFetchPromise) {\n setTokenLoading(true);\n tokenFetchPromise.then(() => {\n setTokenData(cachedTokenData);\n setTokenError(cachedTokenError);\n setTokenLoading(false);\n });\n return;\n }\n\n const fetchTokens = async () => {\n setTokenLoading(true);\n setTokenError(null);\n\n try {\n const response = await fetch(\"/segments/tokens\");\n\n if (!response.ok) {\n const data = await response.json();\n if (data.error) {\n cachedTokenError = data.suggestion || data.error;\n setTokenError(cachedTokenError);\n }\n return;\n }\n\n const data = await response.json();\n cachedTokenData = data;\n setTokenData(data);\n } catch (err) {\n cachedTokenError = \"Failed to fetch tokens\";\n setTokenError(cachedTokenError);\n } finally {\n setTokenLoading(false);\n tokenFetchPromise = null;\n }\n };\n\n tokenFetchPromise = fetchTokens();\n }, []);\n\n /**\n * Find a token by value, filtered by property category to avoid false positives.\n * Returns null if no appropriate token is found.\n */\n const tokenByValue = useCallback(\n (value: string, property?: string): { token: DesignToken; confidence: \"exact\" | \"value-only\" } | null => {\n if (!tokenData?.tokens) return null;\n\n const normalized = normalizeValue(value);\n const expectedCategories = property ? getExpectedCategories(property) : null;\n\n // First pass: look for exact category match\n for (const token of tokenData.tokens) {\n const tokenNormalized = normalizeValue(token.resolvedValue);\n if (tokenNormalized === normalized) {\n // Check if this token's category matches what we expect for this property\n if (expectedCategories && expectedCategories.includes(token.category)) {\n return { token, confidence: \"exact\" };\n }\n }\n }\n\n // Second pass: if we have expectedCategories but found no match, don't return anything\n // This prevents \"height: 49px\" from matching \"--top-bar-height\" (a sizing token when we want sizing)\n if (expectedCategories) {\n return null;\n }\n\n // Fallback: if we don't know the property type, return any matching token\n // but mark it as \"value-only\" confidence\n for (const token of tokenData.tokens) {\n const tokenNormalized = normalizeValue(token.resolvedValue);\n if (tokenNormalized === normalized) {\n return { token, confidence: \"value-only\" };\n }\n }\n\n return null;\n },\n [tokenData]\n );\n\n // Copy fix to clipboard\n const copyFix = useCallback((property: string, tokenName: string) => {\n const cssProperty = property.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n const code = `${cssProperty}: var(${tokenName});`;\n navigator.clipboard.writeText(code);\n setCopiedFix(property);\n setTimeout(() => setCopiedFix(null), 2000);\n }, []);\n\n // Show loading state\n if (figmaLoading) {\n return (\n <div className=\"flex items-center gap-2 text-tertiary p-4\">\n <SyncingIcon className=\"w-4 h-4 animate-spin\" />\n <span className=\"text-xs\">Loading Figma styles...</span>\n </div>\n );\n }\n\n // Show error state\n if (figmaError) {\n return (\n <div className=\"flex items-center gap-2 text-tertiary p-4\">\n <XIcon className=\"w-4 h-4 text-red-500\" />\n <span className=\"text-xs\">{figmaError}</span>\n <button\n onClick={onFetchFigma}\n className=\"text-xs text-[--color-accent] hover:underline ml-2\"\n >\n Retry\n </button>\n </div>\n );\n }\n\n // Show idle state\n if (!figmaStyles) {\n return (\n <div className=\"flex items-center gap-2 text-tertiary p-4\">\n <FigmaIcon className=\"w-4 h-4\" />\n <span className=\"text-xs\">Click to load style comparison</span>\n <button\n onClick={onFetchFigma}\n className=\"text-xs text-[--color-accent] hover:underline ml-2\"\n >\n Load\n </button>\n </div>\n );\n }\n\n // Build comparison data\n const figma = figmaStyles;\n const rendered = renderedStyles || {};\n const allProps = [...new Set([...Object.keys(figma), ...Object.keys(rendered)])];\n\n const properties = allProps.map((prop) => {\n const figmaValue = figma[prop] || \"(not set)\";\n const renderedValue = rendered[prop] || \"(not set)\";\n const match = compareValue(prop, figma[prop] || \"\", rendered[prop] || \"\");\n\n // Find matching tokens (with category-aware filtering)\n const figmaMatch = figma[prop] ? tokenByValue(figma[prop], prop) : null;\n const renderedMatch = rendered[prop] ? tokenByValue(rendered[prop], prop) : null;\n\n const figmaToken = figmaMatch?.token || null;\n const renderedToken = renderedMatch?.token || null;\n const figmaConfidence = figmaMatch?.confidence;\n const renderedConfidence = renderedMatch?.confidence;\n\n // Determine if hardcoded (Figma uses a token but rendered doesn't)\n const isHardcoded = !!figmaToken && !renderedToken && figma[prop] !== rendered[prop];\n\n return {\n property: prop,\n figma: figmaValue,\n rendered: renderedValue,\n match,\n figmaToken,\n renderedToken,\n figmaConfidence,\n renderedConfidence,\n isHardcoded,\n };\n });\n\n const differences = properties.filter((p) => !p.match).length;\n const hardcodedCount = properties.filter((p) => p.isHardcoded).length;\n const fixableCount = properties.filter((p) => p.isHardcoded && p.figmaToken).length;\n const tokenUsageCount = properties.filter((p) => p.renderedToken).length;\n\n // Calculate compliance\n const compliancePercent =\n properties.length > 0\n ? Math.round(((tokenUsageCount + properties.filter((p) => p.match && !p.figmaToken).length) / properties.length) * 100)\n : 100;\n\n return (\n <div className=\"overflow-x-auto p-4\">\n {/* Summary Header */}\n <div className=\"flex items-center justify-between mb-3\">\n <div className=\"flex items-center gap-4\">\n <span className=\"text-xs font-medium text-primary\">Style Comparison</span>\n\n {/* Token info badge */}\n {tokenData && (\n <span className=\"text-xs text-tertiary\">\n {tokenData.meta?.totalTokens || tokenData.tokens.length} tokens loaded\n </span>\n )}\n {tokenLoading && (\n <span className=\"text-xs text-tertiary flex items-center gap-1\">\n <SyncingIcon className=\"w-3 h-3 animate-spin\" />\n Loading tokens...\n </span>\n )}\n {tokenError && !tokenLoading && (\n <span className=\"text-xs text-amber-600\" title={tokenError}>\n Tokens not configured\n </span>\n )}\n </div>\n\n <div className=\"flex items-center gap-3\">\n {/* Compliance badge */}\n {tokenData && (\n <span\n className={clsx(\n \"text-xs font-medium px-2 py-0.5 rounded\",\n compliancePercent >= 80\n ? \"bg-green-100 text-green-700 dark:bg-green-900 dark:text-green-300\"\n : compliancePercent >= 50\n ? \"bg-amber-100 text-amber-700 dark:bg-amber-900 dark:text-amber-300\"\n : \"bg-red-100 text-red-700 dark:bg-red-900 dark:text-red-300\"\n )}\n >\n {compliancePercent}% token compliance\n </span>\n )}\n\n {/* Match summary */}\n <span\n className={clsx(\n \"text-xs font-medium\",\n differences === 0 ? \"text-green-600\" : \"text-amber-600\"\n )}\n >\n {differences === 0 ? \"All styles match\" : `${differences} difference${differences !== 1 ? \"s\" : \"\"}`}\n </span>\n\n {/* Hardcoded warning */}\n {hardcodedCount > 0 && (\n <span className=\"text-xs font-medium text-red-600\">\n {hardcodedCount} hardcoded\n </span>\n )}\n </div>\n </div>\n\n {/* Comparison Table */}\n <table className=\"w-full text-xs\">\n <thead>\n <tr className=\"border-b border-[--border-subtle]\">\n <th className=\"px-3 py-2 text-left text-tertiary font-medium\">Property</th>\n <th className=\"px-3 py-2 text-left text-tertiary font-medium\">Figma</th>\n {tokenData && (\n <th className=\"px-3 py-2 text-left text-tertiary font-medium\">Token</th>\n )}\n <th className=\"px-3 py-2 text-left text-tertiary font-medium\">Rendered</th>\n <th className=\"px-3 py-2 text-center text-tertiary font-medium w-12\">Match</th>\n {tokenData && fixableCount > 0 && (\n <th className=\"px-3 py-2 text-center text-tertiary font-medium w-16\">Fix</th>\n )}\n </tr>\n </thead>\n <tbody>\n {properties.map((prop) => (\n <tr\n key={prop.property}\n className={clsx(\n \"border-b border-[--border-subtle] last:border-b-0\",\n !prop.match && \"bg-amber-50 dark:bg-amber-950/20\",\n prop.isHardcoded && \"bg-red-50 dark:bg-red-950/20\"\n )}\n >\n <td className=\"px-3 py-2 font-mono text-primary\">{prop.property}</td>\n <td className=\"px-3 py-2\">\n <div className=\"flex items-center gap-2\">\n {/* Color swatch */}\n {isColorProperty(prop.property) && prop.figma !== \"(not set)\" && (\n <ColorSwatch color={prop.figma} />\n )}\n <span className=\"font-mono text-secondary truncate max-w-[120px]\" title={prop.figma}>\n {prop.figma}\n </span>\n </div>\n </td>\n {tokenData && (\n <td className=\"px-3 py-2\">\n {prop.figmaToken ? (\n <TokenBadge token={prop.figmaToken} confidence={prop.figmaConfidence} />\n ) : prop.renderedToken ? (\n <TokenBadge token={prop.renderedToken} confidence={prop.renderedConfidence} />\n ) : (\n <span className=\"text-tertiary\">-</span>\n )}\n </td>\n )}\n <td className=\"px-3 py-2\">\n <div className=\"flex items-center gap-2\">\n {/* Color swatch */}\n {isColorProperty(prop.property) && prop.rendered !== \"(not set)\" && (\n <ColorSwatch color={prop.rendered} />\n )}\n <span className=\"font-mono text-secondary truncate max-w-[120px]\" title={prop.rendered}>\n {prop.rendered}\n </span>\n {/* Hardcoded badge */}\n {prop.isHardcoded && (\n <span className=\"text-[10px] px-1 py-0.5 bg-red-100 text-red-600 dark:bg-red-900 dark:text-red-300 rounded\">\n HC\n </span>\n )}\n </div>\n </td>\n <td className=\"px-3 py-2 text-center\">\n {prop.match ? (\n <CheckIcon className=\"w-4 h-4 text-green-600 mx-auto\" />\n ) : (\n <XIcon className=\"w-4 h-4 text-amber-600 mx-auto\" />\n )}\n </td>\n {tokenData && fixableCount > 0 && (\n <td className=\"px-3 py-2 text-center\">\n {prop.isHardcoded && prop.figmaToken && (\n <button\n onClick={() => copyFix(prop.property, prop.figmaToken!.name)}\n className={clsx(\n \"p-1 rounded transition-colors\",\n copiedFix === prop.property\n ? \"bg-green-100 text-green-600\"\n : \"hover:bg-[--bg-hover] text-tertiary hover:text-primary\"\n )}\n title={`Copy: ${prop.property.replace(/([A-Z])/g, \"-$1\").toLowerCase()}: var(${prop.figmaToken.name});`}\n >\n {copiedFix === prop.property ? (\n <CheckIcon className=\"w-3 h-3\" />\n ) : (\n <WandIcon className=\"w-3 h-3\" />\n )}\n </button>\n )}\n </td>\n )}\n </tr>\n ))}\n </tbody>\n </table>\n\n {/* Hardcoded fixes summary */}\n {hardcodedCount > 0 && tokenData && (\n <div className=\"mt-4 p-3 bg-amber-50 dark:bg-amber-950/30 rounded-lg border border-amber-200 dark:border-amber-800\">\n <div className=\"flex items-start gap-2\">\n <WandIcon className=\"w-4 h-4 text-amber-600 mt-0.5\" />\n <div>\n <p className=\"text-xs font-medium text-amber-800 dark:text-amber-200\">\n {hardcodedCount} hardcoded value{hardcodedCount !== 1 ? \"s\" : \"\"} detected\n </p>\n <p className=\"text-xs text-amber-700 dark:text-amber-300 mt-1\">\n These values should use design tokens for consistency and theming support.\n Click the fix button to copy the token-based CSS.\n </p>\n </div>\n </div>\n </div>\n )}\n </div>\n );\n}\n\n// ----- Helper Components -----\n\n/**\n * Enhanced tooltip showing full token details on hover\n */\nfunction TokenBadge({\n token,\n confidence,\n}: {\n token: DesignToken;\n confidence?: \"exact\" | \"value-only\";\n}) {\n const [showTooltip, setShowTooltip] = useState(false);\n\n return (\n <div className=\"relative inline-block\">\n <span\n className={clsx(\n \"font-mono text-xs cursor-help px-1.5 py-0.5 rounded\",\n confidence === \"value-only\"\n ? \"text-amber-600 dark:text-amber-400 bg-amber-50 dark:bg-amber-950/30\"\n : \"text-purple-600 dark:text-purple-400 bg-purple-50 dark:bg-purple-950/30\"\n )}\n onMouseEnter={() => setShowTooltip(true)}\n onMouseLeave={() => setShowTooltip(false)}\n >\n {token.name}\n </span>\n\n {/* Enhanced tooltip */}\n {showTooltip && (\n <div\n className=\"absolute z-50 left-0 top-full mt-1 p-3 bg-[--bg-primary] border border-[--border] rounded-lg shadow-lg min-w-[280px]\"\n style={{ maxWidth: \"320px\" }}\n >\n <div className=\"space-y-2 text-xs\">\n {/* Token name */}\n <div>\n <span className=\"text-tertiary\">Token:</span>\n <span className=\"ml-2 font-mono text-primary font-medium\">{token.name}</span>\n </div>\n\n {/* Resolved value */}\n <div className=\"flex items-center\">\n <span className=\"text-tertiary\">Value:</span>\n <span className=\"ml-2 font-mono text-secondary\">{token.resolvedValue}</span>\n {token.category === \"color\" && (\n <ColorSwatch color={token.resolvedValue} />\n )}\n </div>\n\n {/* Raw value (if different from resolved) */}\n {token.rawValue !== token.resolvedValue && (\n <div>\n <span className=\"text-tertiary\">Raw:</span>\n <span className=\"ml-2 font-mono text-secondary\">{token.rawValue}</span>\n </div>\n )}\n\n {/* Category & Level */}\n <div className=\"flex gap-4\">\n <div>\n <span className=\"text-tertiary\">Category:</span>\n <span className=\"ml-2 text-secondary capitalize\">{token.category}</span>\n </div>\n <div>\n <span className=\"text-tertiary\">Level:</span>\n <span className=\"ml-2 text-secondary\">\n {token.level === 1 ? \"Base\" : token.level === 2 ? \"Semantic\" : \"Component\"}\n </span>\n </div>\n </div>\n\n {/* Theme */}\n <div>\n <span className=\"text-tertiary\">Theme:</span>\n <span className=\"ml-2 text-secondary\">{token.theme}</span>\n </div>\n\n {/* Reference chain (if has references) */}\n {token.referenceChain.length > 1 && (\n <div>\n <span className=\"text-tertiary\">References:</span>\n <div className=\"mt-1 font-mono text-secondary text-[10px] space-y-0.5\">\n {token.referenceChain.map((ref, i) => (\n <div key={ref} className=\"flex items-center\">\n {i > 0 && <span className=\"mr-1 text-tertiary\">ā</span>}\n <span>{ref}</span>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Source file */}\n <div className=\"pt-1 border-t border-[--border-subtle]\">\n <span className=\"text-tertiary\">Source:</span>\n <span className=\"ml-2 font-mono text-[10px] text-tertiary truncate\">\n {token.sourceFile.split(\"/\").slice(-2).join(\"/\")}\n {token.lineNumber && `:${token.lineNumber}`}\n </span>\n </div>\n\n {/* Confidence indicator */}\n {confidence === \"value-only\" && (\n <div className=\"pt-1 text-amber-600 dark:text-amber-400\">\n ā ļø Value match only - verify this is the correct token\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction ColorSwatch({ color }: { color: string }) {\n return (\n <div\n className=\"w-4 h-4 rounded border border-[--border] flex-shrink-0 ml-1\"\n style={{ backgroundColor: color }}\n title={color}\n />\n );\n}\n\n// ----- Helper Functions -----\n\nfunction isColorProperty(prop: string): boolean {\n const colorProps = [\"backgroundColor\", \"borderColor\", \"color\", \"fill\", \"stroke\"];\n return colorProps.includes(prop) || prop.toLowerCase().includes(\"color\");\n}\n\n/**\n * Normalize a CSS value for comparison.\n * Handles colors (hex, rgb, rgba) and general values.\n */\nfunction normalizeValue(value: string): string {\n if (!value) return \"\";\n\n const trimmed = value.toLowerCase().trim();\n\n // Already normalized hex\n if (trimmed.match(/^#[0-9a-f]{6}$/i)) {\n return trimmed;\n }\n\n // Short hex -> long hex\n const shortHex = trimmed.match(/^#([0-9a-f])([0-9a-f])([0-9a-f])$/i);\n if (shortHex) {\n return `#${shortHex[1]}${shortHex[1]}${shortHex[2]}${shortHex[2]}${shortHex[3]}${shortHex[3]}`;\n }\n\n // Parse hex\n const hexMatch = trimmed.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);\n if (hexMatch) {\n return trimmed;\n }\n\n // Parse rgb/rgba\n const rgbMatch = value.match(\n /rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*[\\d.]+)?\\s*\\)/\n );\n if (rgbMatch) {\n const r = parseInt(rgbMatch[1], 10).toString(16).padStart(2, \"0\");\n const g = parseInt(rgbMatch[2], 10).toString(16).padStart(2, \"0\");\n const b = parseInt(rgbMatch[3], 10).toString(16).padStart(2, \"0\");\n return `#${r}${g}${b}`;\n }\n\n return trimmed;\n}\n\nfunction compareValue(prop: string, figma: string, rendered: string): boolean {\n if (figma === rendered) return true;\n if (!figma || !rendered) return false;\n\n // Color comparison\n if (isColorProperty(prop)) {\n return normalizeValue(figma) === normalizeValue(rendered);\n }\n\n // Numeric comparison with near-zero tolerance for floating point rounding only\n // Using < 0.1 ensures 1px vs 2px shows as mismatch, while 1.0001px vs 1px matches\n const figmaNum = parseFloat(figma);\n const renderedNum = parseFloat(rendered);\n if (!isNaN(figmaNum) && !isNaN(renderedNum)) {\n return Math.abs(figmaNum - renderedNum) < 0.1;\n }\n\n return false;\n}\n\nexport default TokenStylePanel;\n","// @ts-nocheck\n/**\n * Accessibility Panel - Enhanced a11y testing\n *\n * Runs axe-core accessibility checks and displays:\n * - Violations with severity hierarchy and actionable guidance\n * - Static fix suggestions with before/after code\n * - WCAG references and \"Why it matters\" explanations\n * - Real-time re-scanning on file changes\n */\n\nimport { useState, useEffect, useCallback, useMemo, useRef } from \"react\";\nimport type { Result, NodeResult, ImpactValue, RunOptions } from \"axe-core\";\nimport clsx from \"clsx\";\nimport { BRAND } from \"../../core/index.js\";\nimport {\n updateComponentA11yResult,\n getComponentA11yResult,\n} from \"../hooks/useA11yCache.js\";\nimport { useA11yService } from \"../hooks/useA11yService.js\";\nimport {\n getStaticFix,\n generateElementFix,\n getImpactColorClass,\n extractWcagTags,\n} from \"../utils/a11y-fixes.js\";\nimport type { SerializedViolation, SerializedNode } from \"../types/a11y.js\";\n\n// Storage key for AI config\nconst AI_CONFIG_STORAGE_KEY = `${BRAND.storagePrefix}ai-config`;\nimport {\n CheckIcon,\n XIcon,\n LoadingIcon,\n ChevronDownIcon,\n ChevronRightIcon,\n WandIcon,\n AccessibilityIcon,\n} from \"./Icons.js\";\n\n// Define our own interface for axe results to avoid import issues\ninterface AxeResults {\n violations: Result[];\n passes: Result[];\n incomplete: Result[];\n inapplicable: Result[];\n timestamp: string;\n testEngine: { name: string; version: string };\n testRunner: { name: string };\n testEnvironment: { userAgent: string; windowWidth: number; windowHeight: number };\n url: string;\n toolOptions: RunOptions;\n}\n\n// AI provider configuration\ninterface AIProviderConfig {\n provider: \"anthropic\" | \"openai\";\n apiKey: string;\n}\n\ninterface AccessibilityPanelProps {\n /** Target element to scan (selector or ref data attribute) */\n targetSelector?: string;\n /** Callback when scan completes */\n onScanComplete?: (results: AxeResults) => void;\n /** Whether to auto-run scan on mount/changes */\n autoScan?: boolean;\n /** Preview key for re-scanning when component changes */\n previewKey?: number;\n /** Cache key for storing scan results (e.g., componentName-variantName) */\n cacheKey?: string;\n /** Component name for shared cache (updates global a11y cache) */\n componentName?: string;\n /** Variant name for shared cache */\n variantName?: string;\n}\n\ntype TabType = \"violations\" | \"passes\" | \"incomplete\";\n\nconst IMPACT_ORDER: Record<string, number> = {\n critical: 0,\n serious: 1,\n moderate: 2,\n minor: 3,\n};\n\n// Cache the axe-core module to avoid repeated dynamic imports\nlet axeModule: typeof import(\"axe-core\") | null = null;\n\n// Cache scan results to avoid re-scanning the same component\nconst scanResultsCache = new Map<string, { timestamp: number; results: AxeResults }>();\nconst SCAN_CACHE_TTL = 30000; // 30 seconds cache for scan results\n\nexport function AccessibilityPanel({\n targetSelector = '[data-preview-container=\"true\"]',\n onScanComplete,\n autoScan = true,\n previewKey = 0,\n cacheKey,\n componentName,\n variantName,\n}: AccessibilityPanelProps) {\n const [results, setResults] = useState<AxeResults | null>(() => {\n // Check cache on initial render\n if (cacheKey) {\n const cached = scanResultsCache.get(cacheKey);\n if (cached && (Date.now() - cached.timestamp) < SCAN_CACHE_TTL) {\n return cached.results;\n }\n }\n return null;\n });\n const [isScanning, setIsScanning] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [activeTab, setActiveTab] = useState<TabType>(\"violations\");\n const [expandedRules, setExpandedRules] = useState<Set<string>>(new Set());\n const [highlightedElement, setHighlightedElement] = useState<string | null>(null);\n const [aiConfig, setAIConfig] = useState<AIProviderConfig | null>(null);\n const [showAISetup, setShowAISetup] = useState(false);\n const [generatingFix, setGeneratingFix] = useState<string | null>(null);\n const [aiFixes, setAIFixes] = useState<Record<string, string>>({});\n const [copiedFix, setCopiedFix] = useState<string | null>(null);\n\n // Ref to track if a scan is in progress (prevents concurrent axe.run calls)\n const scanInProgressRef = useRef(false);\n\n // Use the a11y service for HMR integration\n const { isScanning: serviceScanning, scanStatus } = useA11yService({\n componentName,\n targetSelector,\n variant: variantName,\n autoScan: false, // We handle scanning manually for more control\n });\n\n // Load saved AI config from localStorage\n useEffect(() => {\n const saved = localStorage.getItem(AI_CONFIG_STORAGE_KEY);\n if (saved) {\n try {\n setAIConfig(JSON.parse(saved));\n } catch (e) {\n // Ignore invalid config\n }\n }\n }, []);\n\n // Cleanup on unmount - reset scan in progress flag\n useEffect(() => {\n return () => {\n scanInProgressRef.current = false;\n };\n }, []);\n\n // Convert axe-core Result to SerializedViolation\n const serializeViolation = useCallback((result: Result): SerializedViolation => ({\n id: result.id,\n impact: result.impact || null,\n description: result.description,\n help: result.help,\n helpUrl: result.helpUrl,\n tags: result.tags,\n nodes: result.nodes.map(node => ({\n html: node.html,\n target: node.target as string[],\n failureSummary: node.failureSummary,\n any: node.any?.map(check => ({\n id: check.id,\n data: check.data,\n relatedNodes: check.relatedNodes?.map(rn => ({\n html: rn.html,\n target: rn.target as string[],\n })),\n impact: check.impact,\n message: check.message,\n })),\n all: node.all?.map(check => ({\n id: check.id,\n data: check.data,\n relatedNodes: check.relatedNodes?.map(rn => ({\n html: rn.html,\n target: rn.target as string[],\n })),\n impact: check.impact,\n message: check.message,\n })),\n none: node.none?.map(check => ({\n id: check.id,\n data: check.data,\n relatedNodes: check.relatedNodes?.map(rn => ({\n html: rn.html,\n target: rn.target as string[],\n })),\n impact: check.impact,\n message: check.message,\n })),\n })),\n }), []);\n\n // Run accessibility scan\n const runScan = useCallback(async () => {\n // Prevent concurrent scans - axe-core throws if run() is called while already running\n if (scanInProgressRef.current) {\n return;\n }\n\n scanInProgressRef.current = true;\n setIsScanning(true);\n setError(null);\n\n try {\n // Use cached module or dynamically import axe-core\n if (!axeModule) {\n axeModule = await import(\"axe-core\");\n }\n // Handle both ESM default export and CommonJS module\n const axe = (axeModule as { default?: typeof import(\"axe-core\") }).default || axeModule;\n\n // First, try to find target in the main document\n let target: Element | null = document.querySelector(targetSelector);\n let runInIframe = false;\n let iframeDocument: Document | null = null;\n\n // If not found, look inside the preview iframe\n if (!target) {\n const iframe = document.querySelector('iframe[title^=\"Preview:\"]') as HTMLIFrameElement;\n if (iframe?.contentDocument) {\n iframeDocument = iframe.contentDocument;\n // Try to find #preview-root inside the iframe\n target = iframe.contentDocument.querySelector('#preview-root');\n\n // If still no target, try the body\n if (!target) {\n target = iframe.contentDocument.body;\n }\n\n if (target) {\n runInIframe = true;\n }\n }\n }\n\n if (!target) {\n setError(`Target element not found: ${targetSelector}`);\n setIsScanning(false);\n scanInProgressRef.current = false;\n return;\n }\n\n // If running inside iframe, we need to inject and run axe-core there\n let axeResults: AxeResults;\n\n if (runInIframe && iframeDocument) {\n // Inject axe-core into the iframe if not already present\n const iframeWindow = (iframeDocument.defaultView || iframeDocument.parentWindow) as Window & { axe?: typeof import(\"axe-core\") };\n\n if (!iframeWindow.axe) {\n // Get axe-core source and inject it\n const axeSource = axe.source;\n const script = iframeDocument.createElement('script');\n script.textContent = axeSource;\n iframeDocument.head.appendChild(script);\n }\n\n // Wait a tick for the script to execute\n await new Promise(resolve => setTimeout(resolve, 10));\n\n // Now run axe in the iframe context\n const iframeAxe = iframeWindow.axe;\n if (!iframeAxe) {\n setError('Failed to inject axe-core into iframe');\n setIsScanning(false);\n scanInProgressRef.current = false;\n return;\n }\n\n // Configure and run axe in the iframe\n iframeAxe.configure({\n rules: [\n { id: \"color-contrast\", enabled: true },\n { id: \"image-alt\", enabled: true },\n { id: \"button-name\", enabled: true },\n { id: \"link-name\", enabled: true },\n { id: \"label\", enabled: true },\n { id: \"aria-valid-attr\", enabled: true },\n { id: \"aria-valid-attr-value\", enabled: true },\n ],\n });\n\n axeResults = await iframeAxe.run(target as HTMLElement, {\n resultTypes: [\"violations\", \"passes\", \"incomplete\", \"inapplicable\"],\n });\n } else {\n // Running in main document\n // Configure axe-core\n axe.configure({\n rules: [\n { id: \"color-contrast\", enabled: true },\n { id: \"image-alt\", enabled: true },\n { id: \"button-name\", enabled: true },\n { id: \"link-name\", enabled: true },\n { id: \"label\", enabled: true },\n { id: \"aria-valid-attr\", enabled: true },\n { id: \"aria-valid-attr-value\", enabled: true },\n ],\n });\n\n // Run the scan\n axeResults = await axe.run(target as HTMLElement, {\n resultTypes: [\"violations\", \"passes\", \"incomplete\", \"inapplicable\"],\n });\n }\n\n setResults(axeResults);\n onScanComplete?.(axeResults);\n\n // Cache the results\n if (cacheKey) {\n scanResultsCache.set(cacheKey, { timestamp: Date.now(), results: axeResults });\n }\n\n // Update shared a11y cache with full violations\n if (componentName) {\n const counts = { critical: 0, serious: 0, moderate: 0, minor: 0 };\n for (const violation of axeResults.violations) {\n const impact = violation.impact || 'minor';\n if (impact in counts) {\n counts[impact as keyof typeof counts]++;\n }\n }\n\n updateComponentA11yResult(componentName, {\n violations: axeResults.violations.map(serializeViolation),\n passes: axeResults.passes.length,\n incomplete: axeResults.incomplete.length,\n counts,\n variant: variantName,\n });\n }\n\n // Switch to violations tab if there are any\n if (axeResults.violations.length > 0) {\n setActiveTab(\"violations\");\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : \"Accessibility scan failed\");\n } finally {\n scanInProgressRef.current = false;\n setIsScanning(false);\n }\n }, [targetSelector, onScanComplete, cacheKey, componentName, variantName, serializeViolation]);\n\n // Auto-scan on mount and when previewKey changes (skip if we have cached results)\n useEffect(() => {\n if (autoScan && !results) {\n const timer = setTimeout(runScan, 200);\n return () => clearTimeout(timer);\n }\n }, [autoScan, runScan, previewKey]);\n\n // Re-scan when variant changes (cacheKey includes variant)\n useEffect(() => {\n if (!cacheKey || !autoScan) return;\n\n // Check if we have cached results for this variant\n const cached = scanResultsCache.get(cacheKey);\n if (cached && (Date.now() - cached.timestamp) < SCAN_CACHE_TTL) {\n // Use cached results\n setResults(cached.results);\n return;\n }\n\n // No cache for this variant - clear results and trigger re-scan\n setResults(null);\n setError(null);\n const timer = setTimeout(runScan, 300);\n return () => clearTimeout(timer);\n }, [cacheKey, autoScan, runScan]);\n\n // Listen for HMR invalidation and re-scan\n useEffect(() => {\n if (!componentName) return;\n\n const handleInvalidation = (event: CustomEvent<{ components: string[] }>) => {\n if (event.detail.components.includes(componentName)) {\n // Debounce the re-scan\n const timer = setTimeout(runScan, 500);\n return () => clearTimeout(timer);\n }\n };\n\n window.addEventListener('a11y-cache-invalidated', handleInvalidation as EventListener);\n return () => {\n window.removeEventListener('a11y-cache-invalidated', handleInvalidation as EventListener);\n };\n }, [componentName, runScan]);\n\n // Highlight element in the preview\n const highlightElement = useCallback((selector: string | null) => {\n // Helper to clear highlights in a document\n const clearHighlights = (doc: Document) => {\n doc.querySelectorAll(\"[data-a11y-highlight]\").forEach((el) => {\n el.removeAttribute(\"data-a11y-highlight\");\n (el as HTMLElement).style.outline = \"\";\n (el as HTMLElement).style.outlineOffset = \"\";\n });\n };\n\n // Helper to apply highlights in a document\n const applyHighlights = (doc: Document, sel: string) => {\n try {\n const elements = doc.querySelectorAll(sel);\n elements.forEach((el) => {\n el.setAttribute(\"data-a11y-highlight\", \"true\");\n (el as HTMLElement).style.outline = \"3px solid #ef4444\";\n (el as HTMLElement).style.outlineOffset = \"2px\";\n });\n return elements.length > 0;\n } catch {\n return false;\n }\n };\n\n // Clear highlights in main document\n clearHighlights(document);\n\n // Also clear highlights in iframe if it exists\n const iframe = document.querySelector('iframe[title^=\"Preview:\"]') as HTMLIFrameElement;\n if (iframe?.contentDocument) {\n clearHighlights(iframe.contentDocument);\n }\n\n if (!selector) {\n setHighlightedElement(null);\n return;\n }\n\n // Try to highlight in main document first\n let found = applyHighlights(document, selector);\n\n // If not found in main document, try inside the iframe\n if (!found && iframe?.contentDocument) {\n found = applyHighlights(iframe.contentDocument, selector);\n }\n\n if (found) {\n setHighlightedElement(selector);\n }\n }, []);\n\n // Toggle rule expansion\n const toggleRule = useCallback((ruleId: string) => {\n setExpandedRules((prev) => {\n const next = new Set(prev);\n if (next.has(ruleId)) {\n next.delete(ruleId);\n } else {\n next.add(ruleId);\n }\n return next;\n });\n }, []);\n\n // Copy fix to clipboard\n const copyFix = useCallback(async (fixCode: string, fixKey: string) => {\n try {\n await navigator.clipboard.writeText(fixCode);\n setCopiedFix(fixKey);\n setTimeout(() => setCopiedFix(null), 2000);\n } catch (e) {\n console.error(\"Failed to copy:\", e);\n }\n }, []);\n\n // Generate AI fix suggestion\n const generateAIFix = useCallback(\n async (violation: Result, node: NodeResult) => {\n if (!aiConfig) {\n setShowAISetup(true);\n return;\n }\n\n const fixKey = `${violation.id}-${node.html}`;\n setGeneratingFix(fixKey);\n\n try {\n const prompt = buildFixPrompt(violation, node);\n\n if (aiConfig.provider === \"anthropic\") {\n const response = await fetch(\"https://api.anthropic.com/v1/messages\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": aiConfig.apiKey,\n \"anthropic-version\": \"2023-06-01\",\n \"anthropic-dangerous-direct-browser-access\": \"true\",\n },\n body: JSON.stringify({\n model: \"claude-sonnet-4-20250514\",\n max_tokens: 1024,\n messages: [{ role: \"user\", content: prompt }],\n }),\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to generate fix\");\n }\n\n const data = await response.json();\n const fix = data.content[0].text;\n setAIFixes((prev) => ({ ...prev, [fixKey]: fix }));\n } else if (aiConfig.provider === \"openai\") {\n const response = await fetch(\"https://api.openai.com/v1/chat/completions\", {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `Bearer ${aiConfig.apiKey}`,\n },\n body: JSON.stringify({\n model: \"gpt-4o\",\n messages: [{ role: \"user\", content: prompt }],\n max_tokens: 1024,\n }),\n });\n\n if (!response.ok) {\n throw new Error(\"Failed to generate fix\");\n }\n\n const data = await response.json();\n const fix = data.choices[0].message.content;\n setAIFixes((prev) => ({ ...prev, [fixKey]: fix }));\n }\n } catch (err) {\n setAIFixes((prev) => ({\n ...prev,\n [fixKey]: `Error: ${err instanceof Error ? err.message : \"Failed to generate fix\"}`,\n }));\n } finally {\n setGeneratingFix(null);\n }\n },\n [aiConfig]\n );\n\n // Save AI config\n const saveAIConfig = useCallback((config: AIProviderConfig) => {\n setAIConfig(config);\n localStorage.setItem(AI_CONFIG_STORAGE_KEY, JSON.stringify(config));\n setShowAISetup(false);\n }, []);\n\n // Sort violations by impact\n const sortedViolations = useMemo(() => {\n if (!results?.violations) return [];\n return [...results.violations].sort(\n (a, b) =>\n IMPACT_ORDER[a.impact || \"minor\"] - IMPACT_ORDER[b.impact || \"minor\"]\n );\n }, [results]);\n\n // Count totals\n const counts = useMemo(\n () => ({\n violations: results?.violations.length || 0,\n passes: results?.passes.length || 0,\n incomplete: results?.incomplete.length || 0,\n }),\n [results]\n );\n\n // Check if currently re-scanning due to HMR\n const isReScanning = isScanning && results !== null;\n\n // Render loading state\n if (isScanning && !results) {\n return (\n <div className=\"flex flex-col items-center justify-center p-8 text-tertiary\">\n <LoadingIcon className=\"w-6 h-6 animate-spin mb-2\" />\n <span className=\"text-xs\">Running accessibility checks...</span>\n </div>\n );\n }\n\n // Render error state\n if (error) {\n return (\n <div className=\"flex flex-col items-center justify-center p-8\">\n <XIcon className=\"w-6 h-6 text-red-500 mb-2\" />\n <span className=\"text-xs text-red-600 mb-2\">{error}</span>\n <button\n onClick={runScan}\n className=\"text-xs text-[--color-accent] hover:underline\"\n >\n Retry Scan\n </button>\n </div>\n );\n }\n\n // Render no results state\n if (!results) {\n return (\n <div className=\"flex flex-col items-center justify-center p-8 text-tertiary\">\n <AccessibilityIcon className=\"w-8 h-8 mb-2 opacity-50\" />\n <span className=\"text-xs mb-2\">No accessibility scan results</span>\n <button\n onClick={runScan}\n className=\"text-xs px-3 py-1 rounded bg-[--color-accent] text-white hover:opacity-90\"\n >\n Run Scan\n </button>\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-col h-full overflow-hidden\">\n {/* Tabs */}\n <div className=\"flex items-center gap-1 px-4 py-2 border-b border-[--border] bg-[--bg-secondary] flex-shrink-0\">\n <TabButton\n active={activeTab === \"violations\"}\n onClick={() => setActiveTab(\"violations\")}\n count={counts.violations}\n label=\"Violations\"\n variant=\"error\"\n />\n <TabButton\n active={activeTab === \"passes\"}\n onClick={() => setActiveTab(\"passes\")}\n count={counts.passes}\n label=\"Passes\"\n variant=\"success\"\n />\n <TabButton\n active={activeTab === \"incomplete\"}\n onClick={() => setActiveTab(\"incomplete\")}\n count={counts.incomplete}\n label=\"Incomplete\"\n variant=\"warning\"\n />\n\n <div className=\"flex-1\" />\n\n {/* Re-scanning indicator */}\n {isReScanning && (\n <span className=\"flex items-center gap-1 px-2 py-1 text-xs text-amber-600 dark:text-amber-400 bg-amber-50 dark:bg-amber-950/30 rounded animate-pulse\">\n <LoadingIcon className=\"w-3 h-3 animate-spin\" />\n Re-scanning...\n </span>\n )}\n\n {/* Rescan button */}\n <button\n onClick={runScan}\n disabled={isScanning}\n className=\"flex items-center gap-1 px-2 py-1 text-xs text-tertiary hover:text-primary hover:bg-[--bg-hover] rounded disabled:opacity-50\"\n title=\"Re-run accessibility scan\"\n >\n <LoadingIcon\n className={clsx(\"w-3 h-3\", isScanning && \"animate-spin\")}\n />\n {isScanning ? \"Scanning...\" : \"Rescan\"}\n </button>\n\n {/* AI Setup button */}\n <button\n onClick={() => setShowAISetup(true)}\n className={clsx(\n \"flex items-center gap-1 px-2 py-1 text-xs rounded\",\n aiConfig\n ? \"text-purple-600 dark:text-purple-400 bg-purple-50 dark:bg-purple-950/30\"\n : \"text-tertiary hover:text-primary hover:bg-[--bg-hover]\"\n )}\n title={aiConfig ? \"AI fixes enabled\" : \"Configure AI for fix suggestions\"}\n >\n <WandIcon className=\"w-3 h-3\" />\n {aiConfig ? \"AI Ready\" : \"Setup AI\"}\n </button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto p-4\">\n {activeTab === \"violations\" && (\n <>\n {counts.violations === 0 ? (\n <SuccessMessage message=\"No accessibility violations found.\" />\n ) : (\n <EnhancedRuleList\n rules={sortedViolations}\n expandedRules={expandedRules}\n onToggleRule={toggleRule}\n onHighlight={highlightElement}\n highlightedElement={highlightedElement}\n onGenerateFix={generateAIFix}\n generatingFix={generatingFix}\n aiFixes={aiFixes}\n aiEnabled={!!aiConfig}\n onCopyFix={copyFix}\n copiedFix={copiedFix}\n type=\"violation\"\n />\n )}\n </>\n )}\n\n {activeTab === \"passes\" && (\n <>\n {counts.passes === 0 ? (\n <EmptyMessage message=\"No passing checks to display.\" />\n ) : (\n <RuleList\n rules={results.passes}\n expandedRules={expandedRules}\n onToggleRule={toggleRule}\n onHighlight={highlightElement}\n highlightedElement={highlightedElement}\n type=\"pass\"\n />\n )}\n </>\n )}\n\n {activeTab === \"incomplete\" && (\n <>\n {counts.incomplete === 0 ? (\n <EmptyMessage message=\"No incomplete checks requiring manual review.\" />\n ) : (\n <RuleList\n rules={results.incomplete}\n expandedRules={expandedRules}\n onToggleRule={toggleRule}\n onHighlight={highlightElement}\n highlightedElement={highlightedElement}\n type=\"incomplete\"\n />\n )}\n </>\n )}\n </div>\n\n {/* AI Setup Modal */}\n {showAISetup && (\n <AISetupModal\n onSave={saveAIConfig}\n onClose={() => setShowAISetup(false)}\n currentConfig={aiConfig}\n />\n )}\n </div>\n );\n}\n\n// ----- Sub-components -----\n\ninterface TabButtonProps {\n active: boolean;\n onClick: () => void;\n count: number;\n label: string;\n variant: \"error\" | \"success\" | \"warning\";\n}\n\nfunction TabButton({ active, onClick, count, label, variant }: TabButtonProps) {\n const variantStyles = {\n error: \"text-red-600 dark:text-red-400\",\n success: \"text-green-600 dark:text-green-400\",\n warning: \"text-amber-600 dark:text-amber-400\",\n };\n\n return (\n <button\n onClick={onClick}\n className={clsx(\n \"flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium rounded transition-colors\",\n active\n ? \"text-primary bg-[--bg-hover]\"\n : \"text-tertiary hover:text-secondary\"\n )}\n >\n <span className={variantStyles[variant]}>{count}</span>\n <span>{label}</span>\n </button>\n );\n}\n\ninterface EnhancedRuleListProps {\n rules: Result[];\n expandedRules: Set<string>;\n onToggleRule: (id: string) => void;\n onHighlight: (selector: string | null) => void;\n highlightedElement: string | null;\n onGenerateFix?: (violation: Result, node: NodeResult) => void;\n generatingFix?: string | null;\n aiFixes?: Record<string, string>;\n aiEnabled?: boolean;\n onCopyFix: (fixCode: string, fixKey: string) => void;\n copiedFix: string | null;\n type: \"violation\" | \"pass\" | \"incomplete\";\n}\n\nfunction EnhancedRuleList({\n rules,\n expandedRules,\n onToggleRule,\n onHighlight,\n highlightedElement,\n onGenerateFix,\n generatingFix,\n aiFixes,\n aiEnabled,\n onCopyFix,\n copiedFix,\n}: EnhancedRuleListProps) {\n return (\n <div className=\"space-y-3\">\n {rules.map((rule) => {\n const isExpanded = expandedRules.has(rule.id);\n const impactColors = getImpactColorClass(rule.impact || null);\n const staticFix = getStaticFix(rule.id);\n const wcagTags = extractWcagTags(rule.tags);\n\n return (\n <div\n key={rule.id}\n className={clsx(\n \"rounded-lg border border-[--border] overflow-hidden border-l-4\",\n impactColors.borderLeft\n )}\n >\n {/* Rule Header */}\n <button\n onClick={() => onToggleRule(rule.id)}\n className=\"w-full flex items-center gap-2 px-3 py-2.5 text-left hover:bg-[--bg-hover] transition-colors\"\n >\n {isExpanded ? (\n <ChevronDownIcon className=\"w-4 h-4 text-tertiary flex-shrink-0\" />\n ) : (\n <ChevronRightIcon className=\"w-4 h-4 text-tertiary flex-shrink-0\" />\n )}\n\n {/* Impact badge */}\n {rule.impact && (\n <span\n className={clsx(\n \"text-[10px] font-semibold px-1.5 py-0.5 rounded uppercase tracking-wide\",\n impactColors.bg,\n impactColors.text\n )}\n >\n {rule.impact}\n </span>\n )}\n\n {/* Rule ID */}\n <span className=\"text-xs font-mono text-tertiary\">\n {rule.id}\n </span>\n\n {/* Rule description */}\n <span className=\"text-xs text-primary flex-1 truncate\">\n {rule.description}\n </span>\n\n {/* Element count */}\n <span className=\"text-[10px] text-tertiary flex-shrink-0 bg-[--bg-hover] px-1.5 py-0.5 rounded\">\n {rule.nodes.length} element{rule.nodes.length !== 1 ? \"s\" : \"\"}\n </span>\n </button>\n\n {/* Expanded content */}\n {isExpanded && (\n <div className=\"border-t border-[--border] bg-[--bg-secondary]\">\n {/* Why it matters + WCAG reference */}\n {staticFix && (\n <div className=\"px-3 py-3 border-b border-[--border-subtle] space-y-2\">\n <div>\n <p className=\"text-[10px] font-semibold text-tertiary uppercase tracking-wide mb-1\">\n Why it matters\n </p>\n <p className=\"text-xs text-secondary leading-relaxed\">\n {staticFix.whyItMatters}\n </p>\n </div>\n\n {/* WCAG criterion */}\n {staticFix.wcagCriterion && (\n <div className=\"flex items-center gap-2\">\n <span className={clsx(\n \"text-[10px] px-1.5 py-0.5 rounded font-medium\",\n staticFix.wcagCriterion.level === 'A' && \"bg-green-100 dark:bg-green-950/50 text-green-700 dark:text-green-300\",\n staticFix.wcagCriterion.level === 'AA' && \"bg-blue-100 dark:bg-blue-950/50 text-blue-700 dark:text-blue-300\",\n staticFix.wcagCriterion.level === 'AAA' && \"bg-purple-100 dark:bg-purple-950/50 text-purple-700 dark:text-purple-300\",\n )}>\n WCAG {staticFix.wcagCriterion.id} Level {staticFix.wcagCriterion.level}\n </span>\n <span className=\"text-xs text-secondary\">\n {staticFix.wcagCriterion.name}\n </span>\n <a\n href={staticFix.wcagCriterion.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-xs text-[--color-accent] hover:underline ml-auto\"\n >\n Learn more\n </a>\n </div>\n )}\n\n {/* Before/After examples */}\n {(staticFix.badExample || staticFix.goodExample) && (\n <div className=\"grid grid-cols-2 gap-2 mt-2\">\n {staticFix.badExample && (\n <div>\n <p className=\"text-[10px] font-medium text-red-600 dark:text-red-400 mb-1\">\n Before\n </p>\n <pre className=\"text-[10px] font-mono p-2 rounded bg-red-50 dark:bg-red-950/30 text-red-800 dark:text-red-200 overflow-x-auto whitespace-pre-wrap\">\n {staticFix.badExample}\n </pre>\n </div>\n )}\n {staticFix.goodExample && (\n <div>\n <p className=\"text-[10px] font-medium text-green-600 dark:text-green-400 mb-1\">\n After\n </p>\n <pre className=\"text-[10px] font-mono p-2 rounded bg-green-50 dark:bg-green-950/30 text-green-800 dark:text-green-200 overflow-x-auto whitespace-pre-wrap\">\n {staticFix.goodExample}\n </pre>\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Help info (fallback if no static fix) */}\n {!staticFix && (\n <div className=\"px-3 py-2 border-b border-[--border-subtle]\">\n <p className=\"text-xs text-secondary mb-1\">{rule.help}</p>\n {rule.helpUrl && (\n <a\n href={rule.helpUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-xs text-[--color-accent] hover:underline\"\n >\n Learn more about {rule.id}\n </a>\n )}\n </div>\n )}\n\n {/* Affected elements */}\n <div className=\"divide-y divide-[--border-subtle]\">\n {rule.nodes.map((node, i) => {\n const fixKey = `${rule.id}-${node.html}`;\n const isHighlighted =\n highlightedElement === node.target.join(\", \");\n const elementFix = generateElementFix(rule.id, node as unknown as SerializedNode);\n\n return (\n <div\n key={i}\n className={clsx(\n \"px-3 py-3\",\n isHighlighted && \"bg-red-50 dark:bg-red-950/30\"\n )}\n >\n {/* Element selector + actions */}\n <div className=\"flex items-center gap-2 mb-2\">\n <button\n onClick={() =>\n onHighlight(\n isHighlighted ? null : node.target.join(\", \")\n )\n }\n className={clsx(\n \"text-[10px] font-mono px-2 py-1 rounded truncate max-w-[200px] transition-colors\",\n isHighlighted\n ? \"bg-red-200 dark:bg-red-800 text-red-800 dark:text-red-200\"\n : \"bg-[--bg-hover] text-secondary hover:text-primary hover:bg-[--bg-tertiary]\"\n )}\n title={node.target.join(\" > \")}\n >\n {isHighlighted ? \"Hide\" : \"Highlight\"}: {node.target[node.target.length - 1]}\n </button>\n\n {aiEnabled && onGenerateFix && (\n <button\n onClick={() => onGenerateFix(rule, node)}\n disabled={generatingFix === fixKey}\n className={clsx(\n \"flex items-center gap-1 px-2 py-1 text-[10px] rounded transition-colors\",\n generatingFix === fixKey\n ? \"bg-purple-100 dark:bg-purple-950/50 text-purple-600 dark:text-purple-400\"\n : \"bg-[--bg-hover] text-tertiary hover:text-primary\"\n )}\n title=\"Generate AI fix suggestion\"\n >\n <WandIcon\n className={clsx(\n \"w-3 h-3\",\n generatingFix === fixKey && \"animate-pulse\"\n )}\n />\n {generatingFix === fixKey ? \"Generating...\" : \"AI Fix\"}\n </button>\n )}\n </div>\n\n {/* HTML snippet */}\n <pre className=\"text-[10px] font-mono text-tertiary bg-[--bg-primary] rounded p-2 overflow-x-auto whitespace-pre-wrap border border-[--border-subtle]\">\n {node.html}\n </pre>\n\n {/* Failure summary */}\n {node.failureSummary && (\n <p className=\"text-xs text-secondary mt-2 leading-relaxed\">\n {node.failureSummary}\n </p>\n )}\n\n {/* Static element fix */}\n {elementFix && (\n <div className=\"mt-2 p-2 rounded bg-blue-50 dark:bg-blue-950/30 border border-blue-200 dark:border-blue-800\">\n <div className=\"flex items-center justify-between mb-1\">\n <span className=\"text-[10px] font-medium text-blue-700 dark:text-blue-300\">\n Suggested Fix\n </span>\n <button\n onClick={() => onCopyFix(elementFix.fixedHtml, fixKey)}\n className=\"text-[10px] text-blue-600 dark:text-blue-400 hover:underline\"\n >\n {copiedFix === fixKey ? \"Copied!\" : \"Copy\"}\n </button>\n </div>\n <p className=\"text-[10px] text-blue-800 dark:text-blue-200 mb-2\">\n {elementFix.explanation}\n </p>\n <pre className=\"text-[10px] font-mono text-blue-800 dark:text-blue-200 bg-blue-100 dark:bg-blue-900/50 rounded p-2 overflow-x-auto whitespace-pre-wrap\">\n {elementFix.fixedHtml}\n </pre>\n </div>\n )}\n\n {/* AI fix suggestion */}\n {aiFixes?.[fixKey] && (\n <div className=\"mt-2 p-2 rounded bg-purple-50 dark:bg-purple-950/30 border border-purple-200 dark:border-purple-800\">\n <div className=\"flex items-center gap-1 mb-1\">\n <WandIcon className=\"w-3 h-3 text-purple-600 dark:text-purple-400\" />\n <span className=\"text-[10px] font-medium text-purple-700 dark:text-purple-300\">\n AI Fix Suggestion\n </span>\n </div>\n <pre className=\"text-[10px] font-mono text-purple-800 dark:text-purple-200 whitespace-pre-wrap\">\n {aiFixes[fixKey]}\n </pre>\n </div>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Tags */}\n {rule.tags && rule.tags.length > 0 && (\n <div className=\"px-3 py-2 border-t border-[--border-subtle]\">\n <div className=\"flex flex-wrap gap-1\">\n {rule.tags.slice(0, 8).map((tag) => (\n <span\n key={tag}\n className=\"text-[10px] px-1.5 py-0.5 rounded bg-[--bg-hover] text-tertiary\"\n >\n {tag}\n </span>\n ))}\n {rule.tags.length > 8 && (\n <span className=\"text-[10px] text-tertiary\">\n +{rule.tags.length - 8} more\n </span>\n )}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\ninterface RuleListProps {\n rules: Result[];\n expandedRules: Set<string>;\n onToggleRule: (id: string) => void;\n onHighlight: (selector: string | null) => void;\n highlightedElement: string | null;\n type: \"violation\" | \"pass\" | \"incomplete\";\n}\n\nfunction RuleList({\n rules,\n expandedRules,\n onToggleRule,\n onHighlight,\n highlightedElement,\n type,\n}: RuleListProps) {\n return (\n <div className=\"space-y-2\">\n {rules.map((rule) => {\n const isExpanded = expandedRules.has(rule.id);\n\n return (\n <div\n key={rule.id}\n className=\"rounded-lg border border-[--border] overflow-hidden\"\n >\n {/* Rule Header */}\n <button\n onClick={() => onToggleRule(rule.id)}\n className=\"w-full flex items-center gap-2 px-3 py-2 text-left hover:bg-[--bg-hover] transition-colors\"\n >\n {isExpanded ? (\n <ChevronDownIcon className=\"w-4 h-4 text-tertiary flex-shrink-0\" />\n ) : (\n <ChevronRightIcon className=\"w-4 h-4 text-tertiary flex-shrink-0\" />\n )}\n\n {type === \"pass\" && (\n <CheckIcon className=\"w-4 h-4 text-green-600 flex-shrink-0\" />\n )}\n\n {type === \"incomplete\" && (\n <span className=\"text-[10px] font-medium px-1.5 py-0.5 rounded uppercase bg-amber-100 dark:bg-amber-950/50 text-amber-700 dark:text-amber-300\">\n Review\n </span>\n )}\n\n <span className=\"text-xs text-primary flex-1 truncate\">\n {rule.description}\n </span>\n\n <span className=\"text-[10px] text-tertiary flex-shrink-0\">\n {rule.nodes.length} element{rule.nodes.length !== 1 ? \"s\" : \"\"}\n </span>\n </button>\n\n {/* Expanded content */}\n {isExpanded && (\n <div className=\"border-t border-[--border] bg-[--bg-secondary]\">\n <div className=\"px-3 py-2 border-b border-[--border-subtle]\">\n <p className=\"text-xs text-secondary mb-1\">{rule.help}</p>\n {rule.helpUrl && (\n <a\n href={rule.helpUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-xs text-[--color-accent] hover:underline\"\n >\n Learn more about {rule.id}\n </a>\n )}\n </div>\n\n <div className=\"divide-y divide-[--border-subtle]\">\n {rule.nodes.map((node, i) => {\n const isHighlighted =\n highlightedElement === node.target.join(\", \");\n\n return (\n <div\n key={i}\n className={clsx(\n \"px-3 py-2\",\n isHighlighted && \"bg-green-50 dark:bg-green-950/30\"\n )}\n >\n <button\n onClick={() =>\n onHighlight(\n isHighlighted ? null : node.target.join(\", \")\n )\n }\n className={clsx(\n \"text-[10px] font-mono px-1.5 py-0.5 rounded truncate max-w-[200px] mb-1\",\n isHighlighted\n ? \"bg-green-200 dark:bg-green-800 text-green-800 dark:text-green-200\"\n : \"bg-[--bg-hover] text-secondary hover:text-primary\"\n )}\n title={node.target.join(\" > \")}\n >\n {node.target[node.target.length - 1]}\n </button>\n\n <pre className=\"text-[10px] font-mono text-tertiary bg-[--bg-primary] rounded p-2 overflow-x-auto whitespace-pre-wrap\">\n {node.html}\n </pre>\n </div>\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n}\n\nfunction SuccessMessage({ message }: { message: string }) {\n return (\n <div className=\"flex flex-col items-center justify-center py-8 text-center\">\n <div className=\"w-12 h-12 rounded-full bg-green-100 dark:bg-green-950/50 flex items-center justify-center mb-3\">\n <CheckIcon className=\"w-6 h-6 text-green-600 dark:text-green-400\" />\n </div>\n <p className=\"text-sm font-medium text-green-700 dark:text-green-300\">\n {message}\n </p>\n <p className=\"text-xs text-tertiary mt-1\">\n This component passed all automated accessibility checks.\n </p>\n </div>\n );\n}\n\nfunction EmptyMessage({ message }: { message: string }) {\n return (\n <div className=\"flex flex-col items-center justify-center py-8 text-center\">\n <AccessibilityIcon className=\"w-8 h-8 text-tertiary mb-2 opacity-50\" />\n <p className=\"text-xs text-tertiary\">{message}</p>\n </div>\n );\n}\n\ninterface AISetupModalProps {\n onSave: (config: AIProviderConfig) => void;\n onClose: () => void;\n currentConfig: AIProviderConfig | null;\n}\n\nfunction AISetupModal({ onSave, onClose, currentConfig }: AISetupModalProps) {\n const [provider, setProvider] = useState<\"anthropic\" | \"openai\">(\n currentConfig?.provider || \"anthropic\"\n );\n const [apiKey, setApiKey] = useState(currentConfig?.apiKey || \"\");\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n if (apiKey.trim()) {\n onSave({ provider, apiKey: apiKey.trim() });\n }\n };\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\">\n <div className=\"bg-[--bg-primary] rounded-lg shadow-xl w-full max-w-md mx-4 overflow-hidden\">\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-[--border]\">\n <h3 className=\"text-sm font-medium text-primary\">\n Configure AI Fix Suggestions\n </h3>\n <button\n onClick={onClose}\n className=\"p-1 text-tertiary hover:text-primary hover:bg-[--bg-hover] rounded\"\n >\n <XIcon className=\"w-4 h-4\" />\n </button>\n </div>\n\n <form onSubmit={handleSubmit} className=\"p-4 space-y-4\">\n <p className=\"text-xs text-secondary\">\n Enter your API key to enable AI-powered fix suggestions for\n accessibility violations. Your key is stored locally and never sent\n to our servers.\n </p>\n\n <div>\n <label className=\"block text-xs font-medium text-primary mb-1\">\n Provider\n </label>\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={() => setProvider(\"anthropic\")}\n className={clsx(\n \"flex-1 px-3 py-2 text-xs rounded border transition-colors\",\n provider === \"anthropic\"\n ? \"bg-[--color-accent] text-white border-[--color-accent]\"\n : \"bg-[--bg-secondary] text-secondary border-[--border] hover:border-[--color-accent]\"\n )}\n >\n Anthropic (Claude)\n </button>\n <button\n type=\"button\"\n onClick={() => setProvider(\"openai\")}\n className={clsx(\n \"flex-1 px-3 py-2 text-xs rounded border transition-colors\",\n provider === \"openai\"\n ? \"bg-[--color-accent] text-white border-[--color-accent]\"\n : \"bg-[--bg-secondary] text-secondary border-[--border] hover:border-[--color-accent]\"\n )}\n >\n OpenAI (GPT-4)\n </button>\n </div>\n </div>\n\n <div>\n <label className=\"block text-xs font-medium text-primary mb-1\">\n API Key\n </label>\n <input\n type=\"password\"\n value={apiKey}\n onChange={(e) => setApiKey(e.target.value)}\n placeholder={\n provider === \"anthropic\"\n ? \"sk-ant-api03-...\"\n : \"sk-...\"\n }\n className=\"w-full px-3 py-2 text-xs rounded border border-[--border] bg-[--bg-secondary] text-primary placeholder:text-tertiary focus:outline-none focus:border-[--color-accent]\"\n />\n <p className=\"text-[10px] text-tertiary mt-1\">\n Get your API key from{\" \"}\n {provider === \"anthropic\" ? (\n <a\n href=\"https://console.anthropic.com/settings/keys\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-[--color-accent] hover:underline\"\n >\n console.anthropic.com\n </a>\n ) : (\n <a\n href=\"https://platform.openai.com/api-keys\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-[--color-accent] hover:underline\"\n >\n platform.openai.com\n </a>\n )}\n </p>\n </div>\n\n <div className=\"flex justify-end gap-2 pt-2\">\n <button\n type=\"button\"\n onClick={onClose}\n className=\"px-3 py-1.5 text-xs rounded border border-[--border] text-secondary hover:bg-[--bg-hover]\"\n >\n Cancel\n </button>\n <button\n type=\"submit\"\n disabled={!apiKey.trim()}\n className=\"px-3 py-1.5 text-xs rounded bg-[--color-accent] text-white hover:opacity-90 disabled:opacity-50\"\n >\n Save Configuration\n </button>\n </div>\n </form>\n </div>\n </div>\n );\n}\n\n// ----- Helper Functions -----\n\nfunction buildFixPrompt(violation: Result, node: NodeResult): string {\n return `You are an accessibility expert. Analyze this accessibility violation and provide a concise fix.\n\n**Violation:** ${violation.id}\n**Description:** ${violation.description}\n**Impact:** ${violation.impact}\n**Help:** ${violation.help}\n\n**Affected HTML:**\n\\`\\`\\`html\n${node.html}\n\\`\\`\\`\n\n**Element Path:** ${node.target.join(\" > \")}\n\n**Failure Summary:**\n${node.failureSummary || \"N/A\"}\n\nProvide a brief, actionable fix for this specific accessibility issue. Include:\n1. What's wrong (1 sentence)\n2. The fixed HTML code\n3. Why this fix works (1 sentence)\n\nKeep your response concise and focused on the practical fix.`;\n}\n\n// Export icons used by App.tsx\nexport { AccessibilityIcon };\n","/**\n * Shared A11y Cache\n *\n * Provides a global cache for accessibility scan results that:\n * 1. Persists in sessionStorage across page navigations\n * 2. Is shared between Dashboard and AccessibilityPanel\n * 3. Stores full violation details for rich UI display\n * 4. Supports component-level invalidation\n */\n\nimport { BRAND } from '../../core/index.js';\nimport type {\n CachedA11yResult,\n SerializedViolation,\n A11ySummary,\n} from '../types/a11y.js';\n\nconst CACHE_KEY = `${BRAND.storagePrefix}a11y-cache`;\nconst CACHE_VERSION = 2; // Bumped for new schema with full violations\n\n/**\n * Legacy interface for backward compatibility\n * @deprecated Use CachedA11yResult instead\n */\nexport interface ComponentA11yData {\n violations: number;\n passes: number;\n incomplete: number;\n critical: number;\n serious: number;\n moderate: number;\n minor: number;\n scannedAt: number;\n variant?: string;\n}\n\ninterface A11yCacheData {\n version: number;\n components: Record<string, CachedA11yResult>;\n lastFullScan?: number;\n}\n\n/**\n * Load cache from sessionStorage\n */\nfunction loadCache(): A11yCacheData {\n try {\n const stored = sessionStorage.getItem(CACHE_KEY);\n if (stored) {\n const data = JSON.parse(stored) as A11yCacheData;\n if (data.version === CACHE_VERSION) {\n return data;\n }\n // Version mismatch - clear old cache\n sessionStorage.removeItem(CACHE_KEY);\n }\n } catch (e) {\n // Ignore parse errors\n }\n return { version: CACHE_VERSION, components: {} };\n}\n\n/**\n * Save cache to sessionStorage\n */\nfunction saveCache(data: A11yCacheData): void {\n try {\n sessionStorage.setItem(CACHE_KEY, JSON.stringify(data));\n } catch (e) {\n // Storage might be full - try clearing old data\n try {\n sessionStorage.removeItem(CACHE_KEY);\n sessionStorage.setItem(CACHE_KEY, JSON.stringify(data));\n } catch {\n // Ignore storage errors\n }\n }\n}\n\n/**\n * Get cached a11y result for a component (full data)\n */\nexport function getComponentA11yResult(componentName: string): CachedA11yResult | null {\n const cache = loadCache();\n return cache.components[componentName] || null;\n}\n\n/**\n * Get cached a11y data for a component (legacy format for backward compatibility)\n */\nexport function getComponentA11y(componentName: string): ComponentA11yData | null {\n const result = getComponentA11yResult(componentName);\n if (!result) return null;\n\n return {\n violations: result.violations.length,\n passes: result.passes,\n incomplete: result.incomplete,\n critical: result.counts.critical,\n serious: result.counts.serious,\n moderate: result.counts.moderate,\n minor: result.counts.minor,\n scannedAt: result.scannedAt,\n variant: result.variant,\n };\n}\n\n/**\n * Get all cached a11y data (full results)\n */\nexport function getAllA11yResults(): Record<string, CachedA11yResult> {\n const cache = loadCache();\n return cache.components;\n}\n\n/**\n * Get all cached a11y data (legacy format)\n */\nexport function getAllA11yData(): Record<string, ComponentA11yData> {\n const cache = loadCache();\n const result: Record<string, ComponentA11yData> = {};\n\n for (const [name, data] of Object.entries(cache.components)) {\n result[name] = {\n violations: data.violations.length,\n passes: data.passes,\n incomplete: data.incomplete,\n critical: data.counts.critical,\n serious: data.counts.serious,\n moderate: data.counts.moderate,\n minor: data.counts.minor,\n scannedAt: data.scannedAt,\n variant: data.variant,\n };\n }\n\n return result;\n}\n\n/**\n * Get timestamp of last full scan\n */\nexport function getLastFullScanTime(): number | undefined {\n const cache = loadCache();\n return cache.lastFullScan;\n}\n\n/**\n * Update cache with full a11y result for a component\n */\nexport function updateComponentA11yResult(\n componentName: string,\n result: Omit<CachedA11yResult, 'componentName' | 'scannedAt'> & { scannedAt?: number }\n): void {\n const cache = loadCache();\n cache.components[componentName] = {\n componentName,\n ...result,\n scannedAt: result.scannedAt || Date.now(),\n };\n saveCache(cache);\n\n // Dispatch event for listeners\n window.dispatchEvent(new CustomEvent('a11y-cache-updated', {\n detail: {\n componentName,\n data: cache.components[componentName],\n // Include legacy format for backward compatibility\n legacyData: {\n violations: result.violations.length,\n passes: result.passes,\n incomplete: result.incomplete,\n critical: result.counts.critical,\n serious: result.counts.serious,\n moderate: result.counts.moderate,\n minor: result.counts.minor,\n scannedAt: result.scannedAt || Date.now(),\n variant: result.variant,\n },\n },\n }));\n}\n\n/**\n * Update cache for a single component (legacy format, converted to new format)\n */\nexport function updateComponentA11y(\n componentName: string,\n data: Omit<ComponentA11yData, 'scannedAt'> & { scannedAt?: number },\n violations?: SerializedViolation[]\n): void {\n const cache = loadCache();\n\n // Convert to new format\n cache.components[componentName] = {\n componentName,\n violations: violations || [], // Use provided violations or empty array\n passes: data.passes,\n incomplete: data.incomplete,\n scannedAt: data.scannedAt || Date.now(),\n variant: data.variant,\n counts: {\n critical: data.critical,\n serious: data.serious,\n moderate: data.moderate,\n minor: data.minor,\n },\n };\n saveCache(cache);\n\n // Dispatch event for listeners\n window.dispatchEvent(new CustomEvent('a11y-cache-updated', {\n detail: { componentName, data: cache.components[componentName] },\n }));\n}\n\n/**\n * Invalidate cache for specific components\n * This marks them for re-scan without removing the data\n */\nexport function invalidateComponents(componentNames: string[]): void {\n const cache = loadCache();\n let changed = false;\n\n for (const name of componentNames) {\n if (cache.components[name]) {\n // Set scannedAt to 0 to mark as stale\n cache.components[name].scannedAt = 0;\n changed = true;\n }\n }\n\n if (changed) {\n saveCache(cache);\n\n // Dispatch event for listeners\n window.dispatchEvent(new CustomEvent('a11y-cache-invalidated', {\n detail: { components: componentNames },\n }));\n }\n}\n\n/**\n * Check if a component's cache is stale (needs re-scan)\n */\nexport function isComponentStale(componentName: string, maxAgeMs: number = 30000): boolean {\n const cache = loadCache();\n const data = cache.components[componentName];\n\n if (!data) return true;\n if (data.scannedAt === 0) return true; // Explicitly invalidated\n\n return Date.now() - data.scannedAt > maxAgeMs;\n}\n\n/**\n * Mark that a full scan was completed\n */\nexport function markFullScanComplete(): void {\n const cache = loadCache();\n cache.lastFullScan = Date.now();\n saveCache(cache);\n}\n\n/**\n * Clear all cached data\n */\nexport function clearA11yCache(): void {\n try {\n sessionStorage.removeItem(CACHE_KEY);\n } catch (e) {\n // Ignore\n }\n window.dispatchEvent(new CustomEvent('a11y-cache-cleared'));\n}\n\n/**\n * Clear cache for a specific component\n */\nexport function clearComponentCache(componentName: string): void {\n const cache = loadCache();\n if (cache.components[componentName]) {\n delete cache.components[componentName];\n saveCache(cache);\n\n window.dispatchEvent(new CustomEvent('a11y-cache-updated', {\n detail: { componentName, data: null },\n }));\n }\n}\n\n/**\n * Calculate summary from cached data\n */\nexport function getA11ySummary(): A11ySummary {\n const cache = loadCache();\n const components = Object.values(cache.components);\n\n const summary: A11ySummary = {\n accessibleComponents: 0,\n totalComponents: components.length,\n violationsByImpact: {\n critical: 0,\n serious: 0,\n moderate: 0,\n minor: 0,\n },\n topViolations: [],\n };\n\n // Track violations by rule ID for top violations\n const violationsByRule = new Map<string, {\n ruleId: string;\n description: string;\n impact: 'critical' | 'serious' | 'moderate' | 'minor' | null;\n affectedComponents: Set<string>;\n }>();\n\n for (const comp of components) {\n // Count by impact\n summary.violationsByImpact.critical += comp.counts.critical;\n summary.violationsByImpact.serious += comp.counts.serious;\n summary.violationsByImpact.moderate += comp.counts.moderate;\n summary.violationsByImpact.minor += comp.counts.minor;\n\n // Check if accessible (no critical/serious)\n if (comp.counts.critical === 0 && comp.counts.serious === 0) {\n summary.accessibleComponents++;\n }\n\n // Aggregate violations by rule\n for (const violation of comp.violations) {\n const existing = violationsByRule.get(violation.id);\n if (existing) {\n existing.affectedComponents.add(comp.componentName);\n } else {\n violationsByRule.set(violation.id, {\n ruleId: violation.id,\n description: violation.description,\n impact: violation.impact,\n affectedComponents: new Set([comp.componentName]),\n });\n }\n }\n }\n\n // Sort by number of affected components and take top 5\n summary.topViolations = Array.from(violationsByRule.values())\n .sort((a, b) => b.affectedComponents.size - a.affectedComponents.size)\n .slice(0, 5)\n .map(v => ({\n ruleId: v.ruleId,\n description: v.description,\n impact: v.impact,\n affectedComponents: Array.from(v.affectedComponents),\n }));\n\n return summary;\n}\n\n/**\n * Get legacy summary format for backward compatibility\n */\nexport function getLegacyA11ySummary(): {\n totalComponents: number;\n accessibleComponents: number;\n totalViolations: number;\n totalCritical: number;\n totalSerious: number;\n} {\n const summary = getA11ySummary();\n return {\n totalComponents: summary.totalComponents,\n accessibleComponents: summary.accessibleComponents,\n totalViolations:\n summary.violationsByImpact.critical +\n summary.violationsByImpact.serious +\n summary.violationsByImpact.moderate +\n summary.violationsByImpact.minor,\n totalCritical: summary.violationsByImpact.critical,\n totalSerious: summary.violationsByImpact.serious,\n };\n}\n","/**\n * A11y Service Hook\n *\n * Central service for triggering accessibility scans with:\n * - Debouncing logic to prevent excessive scans during rapid changes\n * - Scan queue with concurrency limit\n * - Automatic re-scanning on HMR invalidation\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { Result } from 'axe-core';\nimport type {\n A11yServiceConfig,\n SerializedViolation,\n ComponentScanState,\n ScanStatus,\n} from '../types/a11y.js';\nimport {\n updateComponentA11yResult,\n getComponentA11yResult,\n invalidateComponents,\n isComponentStale,\n getA11ySummary,\n} from './useA11yCache.js';\n\n// Default configuration\nconst DEFAULT_CONFIG: A11yServiceConfig = {\n hmrDebounceMs: 500,\n navigationDebounceMs: 200,\n scanCooldownMs: 1000,\n maxConcurrentScans: 2,\n};\n\n// Global state for the service (singleton pattern)\ninterface A11yServiceState {\n activeScanCount: number;\n scanQueue: Array<{\n componentName: string;\n targetSelector: string;\n variant?: string;\n resolve: (result: ScanResult | null) => void;\n reject: (error: Error) => void;\n }>;\n debounceTimers: Map<string, NodeJS.Timeout>;\n lastScanTimes: Map<string, number>;\n componentStates: Map<string, ComponentScanState>;\n}\n\nconst serviceState: A11yServiceState = {\n activeScanCount: 0,\n scanQueue: [],\n debounceTimers: new Map(),\n lastScanTimes: new Map(),\n componentStates: new Map(),\n};\n\n// Cache the axe-core module\nlet axeModule: typeof import('axe-core') | null = null;\n\nexport interface ScanResult {\n violations: SerializedViolation[];\n passes: number;\n incomplete: number;\n counts: {\n critical: number;\n serious: number;\n moderate: number;\n minor: number;\n };\n}\n\n/**\n * Convert axe-core Result to SerializedViolation\n */\nfunction serializeViolation(result: Result): SerializedViolation {\n return {\n id: result.id,\n impact: result.impact || null,\n description: result.description,\n help: result.help,\n helpUrl: result.helpUrl,\n tags: result.tags,\n nodes: result.nodes.map(node => ({\n html: node.html,\n target: node.target as string[],\n failureSummary: node.failureSummary,\n any: node.any?.map(check => ({\n id: check.id,\n data: check.data,\n relatedNodes: check.relatedNodes?.map(rn => ({\n html: rn.html,\n target: rn.target as string[],\n })),\n impact: check.impact,\n message: check.message,\n })),\n all: node.all?.map(check => ({\n id: check.id,\n data: check.data,\n relatedNodes: check.relatedNodes?.map(rn => ({\n html: rn.html,\n target: rn.target as string[],\n })),\n impact: check.impact,\n message: check.message,\n })),\n none: node.none?.map(check => ({\n id: check.id,\n data: check.data,\n relatedNodes: check.relatedNodes?.map(rn => ({\n html: rn.html,\n target: rn.target as string[],\n })),\n impact: check.impact,\n message: check.message,\n })),\n })),\n };\n}\n\n/**\n * Run axe-core scan on a target element\n */\nasync function runAxeScan(targetSelector: string): Promise<ScanResult | null> {\n // Load axe-core if not cached\n if (!axeModule) {\n axeModule = await import('axe-core');\n }\n // Handle both ESM default export and CommonJS module\n const axe = (axeModule as { default?: typeof import('axe-core') }).default || axeModule;\n\n const target = document.querySelector(targetSelector);\n if (!target) {\n console.warn(`[A11y] Target element not found: ${targetSelector}`);\n return null;\n }\n\n // Configure axe-core\n axe.configure({\n rules: [\n { id: 'color-contrast', enabled: true },\n { id: 'image-alt', enabled: true },\n { id: 'button-name', enabled: true },\n { id: 'link-name', enabled: true },\n { id: 'label', enabled: true },\n { id: 'aria-valid-attr', enabled: true },\n { id: 'aria-valid-attr-value', enabled: true },\n ],\n });\n\n // Run the scan\n const results = await axe.run(target as HTMLElement, {\n resultTypes: ['violations', 'passes', 'incomplete', 'inapplicable'],\n });\n\n // Count violations by severity\n const counts = {\n critical: 0,\n serious: 0,\n moderate: 0,\n minor: 0,\n };\n\n for (const violation of results.violations) {\n switch (violation.impact) {\n case 'critical':\n counts.critical++;\n break;\n case 'serious':\n counts.serious++;\n break;\n case 'moderate':\n counts.moderate++;\n break;\n case 'minor':\n default:\n counts.minor++;\n break;\n }\n }\n\n return {\n violations: results.violations.map(serializeViolation),\n passes: results.passes.length,\n incomplete: results.incomplete.length,\n counts,\n };\n}\n\n/**\n * Process the scan queue\n */\nasync function processQueue(config: A11yServiceConfig): Promise<void> {\n while (\n serviceState.scanQueue.length > 0 &&\n serviceState.activeScanCount < config.maxConcurrentScans\n ) {\n const item = serviceState.scanQueue.shift();\n if (!item) break;\n\n serviceState.activeScanCount++;\n\n // Update component state\n serviceState.componentStates.set(item.componentName, {\n status: 'scanning',\n lastScanAt: Date.now(),\n });\n\n // Dispatch scanning event\n window.dispatchEvent(new CustomEvent('a11y-scan-started', {\n detail: { componentName: item.componentName },\n }));\n\n try {\n const result = await runAxeScan(item.targetSelector);\n\n if (result) {\n // Update cache with full results\n updateComponentA11yResult(item.componentName, {\n violations: result.violations,\n passes: result.passes,\n incomplete: result.incomplete,\n counts: result.counts,\n variant: item.variant,\n });\n\n serviceState.componentStates.set(item.componentName, {\n status: 'completed',\n lastScanAt: Date.now(),\n });\n } else {\n serviceState.componentStates.set(item.componentName, {\n status: 'error',\n error: 'Target element not found',\n });\n }\n\n serviceState.lastScanTimes.set(item.componentName, Date.now());\n item.resolve(result);\n } catch (error) {\n serviceState.componentStates.set(item.componentName, {\n status: 'error',\n error: error instanceof Error ? error.message : 'Scan failed',\n });\n item.reject(error instanceof Error ? error : new Error('Scan failed'));\n } finally {\n serviceState.activeScanCount--;\n\n // Dispatch scan complete event\n window.dispatchEvent(new CustomEvent('a11y-scan-completed', {\n detail: { componentName: item.componentName },\n }));\n\n // Process next item in queue\n processQueue(config);\n }\n }\n}\n\n/**\n * Options for the useA11yService hook\n */\nexport interface UseA11yServiceOptions {\n /** Override default configuration */\n config?: Partial<A11yServiceConfig>;\n /** Component name being scanned */\n componentName?: string;\n /** Target selector for scanning */\n targetSelector?: string;\n /** Current variant name */\n variant?: string;\n /** Auto-scan when component changes */\n autoScan?: boolean;\n}\n\n/**\n * A11y Service Hook\n *\n * Provides methods for triggering and managing accessibility scans.\n */\nexport function useA11yService(options: UseA11yServiceOptions = {}) {\n const {\n config: configOverrides = {},\n componentName,\n targetSelector = '[data-preview-container=\"true\"]',\n variant,\n autoScan = true,\n } = options;\n\n const config: A11yServiceConfig = { ...DEFAULT_CONFIG, ...configOverrides };\n const configRef = useRef(config);\n configRef.current = config;\n\n const [scanStatus, setScanStatus] = useState<ScanStatus>('idle');\n const [lastResult, setLastResult] = useState<ScanResult | null>(null);\n\n /**\n * Queue a scan for a component\n */\n const scanComponent = useCallback(\n (\n targetComponentName: string = componentName || '',\n targetSel: string = targetSelector,\n targetVariant?: string\n ): Promise<ScanResult | null> => {\n if (!targetComponentName) {\n return Promise.resolve(null);\n }\n\n // Check cooldown\n const lastScan = serviceState.lastScanTimes.get(targetComponentName);\n if (lastScan && Date.now() - lastScan < configRef.current.scanCooldownMs) {\n // Return cached result if available\n const cached = getComponentA11yResult(targetComponentName);\n if (cached) {\n return Promise.resolve({\n violations: cached.violations,\n passes: cached.passes,\n incomplete: cached.incomplete,\n counts: cached.counts,\n });\n }\n }\n\n return new Promise((resolve, reject) => {\n serviceState.scanQueue.push({\n componentName: targetComponentName,\n targetSelector: targetSel,\n variant: targetVariant || variant,\n resolve,\n reject,\n });\n\n serviceState.componentStates.set(targetComponentName, { status: 'pending' });\n setScanStatus('pending');\n\n // Start processing\n processQueue(configRef.current);\n });\n },\n [componentName, targetSelector, variant]\n );\n\n /**\n * Scan with debouncing (for HMR or rapid changes)\n */\n const scanDebounced = useCallback(\n (\n debounceMs: number = configRef.current.hmrDebounceMs,\n targetComponentName: string = componentName || ''\n ) => {\n if (!targetComponentName) return;\n\n // Clear existing timer\n const existingTimer = serviceState.debounceTimers.get(targetComponentName);\n if (existingTimer) {\n clearTimeout(existingTimer);\n }\n\n // Set new timer\n const timer = setTimeout(() => {\n serviceState.debounceTimers.delete(targetComponentName);\n scanComponent(targetComponentName);\n }, debounceMs);\n\n serviceState.debounceTimers.set(targetComponentName, timer);\n },\n [componentName, scanComponent]\n );\n\n /**\n * Invalidate cache for components and optionally trigger re-scan\n */\n const invalidate = useCallback(\n (componentNames: string[], rescan: boolean = true) => {\n invalidateComponents(componentNames);\n\n if (rescan) {\n // Debounce each component's re-scan\n for (const name of componentNames) {\n scanDebounced(configRef.current.hmrDebounceMs, name);\n }\n }\n },\n [scanDebounced]\n );\n\n /**\n * Get current scan state for a component\n */\n const getComponentState = useCallback(\n (name: string = componentName || ''): ComponentScanState => {\n return serviceState.componentStates.get(name) || { status: 'idle' };\n },\n [componentName]\n );\n\n /**\n * Check if a component needs re-scanning\n */\n const needsRescan = useCallback(\n (name: string = componentName || ''): boolean => {\n if (!name) return false;\n return isComponentStale(name, config.scanCooldownMs);\n },\n [componentName, config.scanCooldownMs]\n );\n\n // Listen for HMR invalidation events\n useEffect(() => {\n const handleInvalidate = (event: CustomEvent<{ components: string[] }>) => {\n const { components } = event.detail;\n\n // If our component is in the list, trigger a debounced re-scan\n if (componentName && components.includes(componentName)) {\n setScanStatus('pending');\n scanDebounced(configRef.current.hmrDebounceMs, componentName);\n }\n };\n\n const handleScanStarted = (event: CustomEvent<{ componentName: string }>) => {\n if (event.detail.componentName === componentName) {\n setScanStatus('scanning');\n }\n };\n\n const handleScanCompleted = (event: CustomEvent<{ componentName: string }>) => {\n if (event.detail.componentName === componentName) {\n setScanStatus('completed');\n // Update last result from cache\n const cached = getComponentA11yResult(componentName || '');\n if (cached) {\n setLastResult({\n violations: cached.violations,\n passes: cached.passes,\n incomplete: cached.incomplete,\n counts: cached.counts,\n });\n }\n }\n };\n\n window.addEventListener('a11y-cache-invalidated', handleInvalidate as EventListener);\n window.addEventListener('a11y-scan-started', handleScanStarted as EventListener);\n window.addEventListener('a11y-scan-completed', handleScanCompleted as EventListener);\n\n return () => {\n window.removeEventListener('a11y-cache-invalidated', handleInvalidate as EventListener);\n window.removeEventListener('a11y-scan-started', handleScanStarted as EventListener);\n window.removeEventListener('a11y-scan-completed', handleScanCompleted as EventListener);\n };\n }, [componentName, scanDebounced]);\n\n // Auto-scan when component name changes and cache is stale\n useEffect(() => {\n if (!autoScan || !componentName) return;\n\n if (needsRescan(componentName)) {\n scanDebounced(configRef.current.navigationDebounceMs, componentName);\n } else {\n // Load from cache\n const cached = getComponentA11yResult(componentName);\n if (cached) {\n setLastResult({\n violations: cached.violations,\n passes: cached.passes,\n incomplete: cached.incomplete,\n counts: cached.counts,\n });\n setScanStatus('completed');\n }\n }\n }, [autoScan, componentName, needsRescan, scanDebounced]);\n\n return {\n // Methods\n scanComponent,\n scanDebounced,\n invalidate,\n getComponentState,\n needsRescan,\n getSummary: getA11ySummary,\n\n // State\n scanStatus,\n isScanning: scanStatus === 'scanning' || scanStatus === 'pending',\n lastResult,\n };\n}\n\n/**\n * Dispatch a11y invalidation event (for use from vite-plugin HMR)\n */\nexport function dispatchA11yInvalidate(components: string[], file: string): void {\n window.dispatchEvent(new CustomEvent('a11y-invalidate-hmr', {\n detail: { components, file, timestamp: Date.now() },\n }));\n}\n","/**\n * A11y Fixes - Static Fix Generators\n *\n * Rule-specific fix suggestions without AI. Provides:\n * - \"Why it matters\" explanations\n * - Before/after code examples\n * - WCAG references\n * - Specific fixes based on violation data\n */\n\nimport type { ImpactValue } from 'axe-core';\nimport type { StaticFixSuggestion, ElementFix, SerializedNode } from '../types/a11y.js';\n\n/**\n * WCAG criteria references\n */\nconst WCAG_CRITERIA: Record<string, { id: string; name: string; level: 'A' | 'AA' | 'AAA'; url: string }> = {\n // Level A\n '1.1.1': {\n id: '1.1.1',\n name: 'Non-text Content',\n level: 'A',\n url: 'https://www.w3.org/WAI/WCAG21/Understanding/non-text-content',\n },\n '1.3.1': {\n id: '1.3.1',\n name: 'Info and Relationships',\n level: 'A',\n url: 'https://www.w3.org/WAI/WCAG21/Understanding/info-and-relationships',\n },\n '2.1.1': {\n id: '2.1.1',\n name: 'Keyboard',\n level: 'A',\n url: 'https://www.w3.org/WAI/WCAG21/Understanding/keyboard',\n },\n '2.4.4': {\n id: '2.4.4',\n name: 'Link Purpose (In Context)',\n level: 'A',\n url: 'https://www.w3.org/WAI/WCAG21/Understanding/link-purpose-in-context',\n },\n '4.1.2': {\n id: '4.1.2',\n name: 'Name, Role, Value',\n level: 'A',\n url: 'https://www.w3.org/WAI/WCAG21/Understanding/name-role-value',\n },\n // Level AA\n '1.4.3': {\n id: '1.4.3',\n name: 'Contrast (Minimum)',\n level: 'AA',\n url: 'https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum',\n },\n '1.4.4': {\n id: '1.4.4',\n name: 'Resize Text',\n level: 'AA',\n url: 'https://www.w3.org/WAI/WCAG21/Understanding/resize-text',\n },\n '2.4.6': {\n id: '2.4.6',\n name: 'Headings and Labels',\n level: 'AA',\n url: 'https://www.w3.org/WAI/WCAG21/Understanding/headings-and-labels',\n },\n // Level AAA\n '1.4.6': {\n id: '1.4.6',\n name: 'Contrast (Enhanced)',\n level: 'AAA',\n url: 'https://www.w3.org/WAI/WCAG21/Understanding/contrast-enhanced',\n },\n};\n\n/**\n * Static fix suggestions for common accessibility rules\n */\nconst STATIC_FIXES: Record<string, StaticFixSuggestion> = {\n 'color-contrast': {\n whyItMatters:\n 'Low contrast text is difficult to read for users with low vision, color blindness, or in bright environments like outdoor settings.',\n howToFix:\n 'Increase the contrast ratio between text and background colors. Normal text requires 4.5:1, large text (18pt or 14pt bold) requires 3:1.',\n badExample: '<button style=\"color: #888; background: #fff\">Submit</button>',\n goodExample: '<button style=\"color: #333; background: #fff\">Submit</button>',\n wcagCriterion: WCAG_CRITERIA['1.4.3'],\n },\n 'image-alt': {\n whyItMatters:\n 'Screen reader users cannot perceive images and rely on alternative text to understand visual content.',\n howToFix:\n 'Add descriptive alt text that conveys the purpose or content of the image. For decorative images, use alt=\"\".',\n badExample: '<img src=\"hero.jpg\">',\n goodExample: '<img src=\"hero.jpg\" alt=\"Team collaboration in modern office\">',\n wcagCriterion: WCAG_CRITERIA['1.1.1'],\n },\n 'button-name': {\n whyItMatters:\n 'Screen reader users need accessible names to understand what a button does. Without a name, they hear \"button\" with no context.',\n howToFix:\n 'Add text content, an aria-label, or aria-labelledby attribute to give the button an accessible name.',\n badExample: '<button><svg>...</svg></button>',\n goodExample: '<button aria-label=\"Close dialog\"><svg>...</svg></button>',\n wcagCriterion: WCAG_CRITERIA['4.1.2'],\n },\n 'link-name': {\n whyItMatters:\n 'Screen reader users navigate by links and need descriptive text to understand each link\\'s destination or purpose.',\n howToFix:\n 'Use descriptive link text instead of generic phrases. Avoid \"click here\" or \"read more\" without context.',\n badExample: '<a href=\"/docs\">Click here</a>',\n goodExample: '<a href=\"/docs\">View documentation</a>',\n wcagCriterion: WCAG_CRITERIA['2.4.4'],\n },\n 'label': {\n whyItMatters:\n 'Form inputs without labels are difficult for screen reader users to understand and for all users to identify.',\n howToFix:\n 'Associate a <label> element with the input using the for/id attributes, or wrap the input in a label element.',\n badExample: '<input type=\"text\" placeholder=\"Email\">',\n goodExample: '<label for=\"email\">Email</label>\\n<input type=\"text\" id=\"email\">',\n wcagCriterion: WCAG_CRITERIA['1.3.1'],\n },\n 'aria-valid-attr': {\n whyItMatters:\n 'Invalid ARIA attributes are ignored by assistive technologies and may indicate other accessibility issues.',\n howToFix:\n 'Use only valid ARIA attributes from the WAI-ARIA specification. Check spelling and ensure attributes apply to the element type.',\n badExample: '<button aria-expanded=\"true\" aria-describedby=\"\">Submit</button>',\n goodExample: '<button aria-expanded=\"true\" aria-describedby=\"help-text\">Submit</button>',\n wcagCriterion: WCAG_CRITERIA['4.1.2'],\n },\n 'aria-valid-attr-value': {\n whyItMatters:\n 'ARIA attributes with invalid values are ignored or misinterpreted by assistive technologies.',\n howToFix:\n 'Ensure ARIA attribute values match the expected format (boolean, ID reference, token, etc.).',\n badExample: '<div aria-hidden=\"yes\">Hidden content</div>',\n goodExample: '<div aria-hidden=\"true\">Hidden content</div>',\n wcagCriterion: WCAG_CRITERIA['4.1.2'],\n },\n 'aria-required-attr': {\n whyItMatters:\n 'ARIA roles require specific attributes to function correctly with assistive technologies.',\n howToFix:\n 'Add all required ARIA attributes for the role being used.',\n badExample: '<div role=\"checkbox\">Accept terms</div>',\n goodExample: '<div role=\"checkbox\" aria-checked=\"false\">Accept terms</div>',\n wcagCriterion: WCAG_CRITERIA['4.1.2'],\n },\n 'heading-order': {\n whyItMatters:\n 'Screen reader users navigate by headings. Skipped heading levels make it harder to understand document structure.',\n howToFix:\n 'Use headings in sequential order (h1 ā h2 ā h3). Don\\'t skip levels for styling purposes.',\n badExample: '<h1>Page Title</h1>\\n<h4>Section</h4>',\n goodExample: '<h1>Page Title</h1>\\n<h2>Section</h2>',\n wcagCriterion: WCAG_CRITERIA['1.3.1'],\n },\n 'tabindex': {\n whyItMatters:\n 'Positive tabindex values create unexpected keyboard navigation order, confusing keyboard-only users.',\n howToFix:\n 'Use tabindex=\"0\" to add elements to natural tab order, or tabindex=\"-1\" to remove them. Avoid positive values.',\n badExample: '<button tabindex=\"5\">First</button>\\n<button tabindex=\"1\">Second</button>',\n goodExample: '<button>First</button>\\n<button>Second</button>',\n wcagCriterion: WCAG_CRITERIA['2.1.1'],\n },\n 'duplicate-id': {\n whyItMatters:\n 'Duplicate IDs can cause aria-labelledby, aria-describedby, and label associations to reference the wrong element.',\n howToFix:\n 'Ensure each id attribute value is unique within the page.',\n badExample: '<input id=\"name\">\\n<input id=\"name\">',\n goodExample: '<input id=\"first-name\">\\n<input id=\"last-name\">',\n wcagCriterion: WCAG_CRITERIA['4.1.2'],\n },\n};\n\n/**\n * Get static fix suggestion for a rule\n */\nexport function getStaticFix(ruleId: string): StaticFixSuggestion | null {\n return STATIC_FIXES[ruleId] || null;\n}\n\n/**\n * Parse contrast ratio data from axe-core node data\n */\nfunction parseContrastData(node: SerializedNode): {\n fgColor?: string;\n bgColor?: string;\n contrastRatio?: number;\n requiredRatio?: number;\n fontSize?: string;\n fontWeight?: string;\n} | null {\n const anyData = node.any?.[0]?.data as Record<string, unknown> | undefined;\n if (!anyData) return null;\n\n return {\n fgColor: anyData.fgColor as string | undefined,\n bgColor: anyData.bgColor as string | undefined,\n contrastRatio: anyData.contrastRatio as number | undefined,\n requiredRatio: anyData.expectedContrastRatio as number | undefined,\n fontSize: anyData.fontSize as string | undefined,\n fontWeight: anyData.fontWeight as string | undefined,\n };\n}\n\n/**\n * Generate a specific fix for a color-contrast violation\n */\nfunction generateContrastFix(node: SerializedNode): ElementFix | null {\n const data = parseContrastData(node);\n if (!data?.fgColor || !data?.bgColor) return null;\n\n const { fgColor, bgColor, contrastRatio, requiredRatio } = data;\n\n // Safely convert to number and format\n const currentRatioNum = typeof contrastRatio === 'number' ? contrastRatio : parseFloat(String(contrastRatio || ''));\n const requiredRatioNum = typeof requiredRatio === 'number' ? requiredRatio : parseFloat(String(requiredRatio || ''));\n\n const currentRatio = !isNaN(currentRatioNum) ? currentRatioNum.toFixed(2) : 'unknown';\n const required = !isNaN(requiredRatioNum) ? requiredRatioNum.toFixed(1) : '4.5';\n\n // Suggest darkening text if it's light, or lightening if it's dark\n const suggestion = `Adjust colors to meet ${required}:1 contrast ratio (currently ${currentRatio}:1)`;\n\n return {\n originalHtml: node.html,\n fixedHtml: node.html, // Can't auto-generate fixed HTML without color calculation\n explanation: `Text color ${fgColor} on background ${bgColor} has insufficient contrast. ${suggestion}`,\n autoFixable: false,\n };\n}\n\n/**\n * Generate a specific fix for an image-alt violation\n */\nfunction generateAltTextFix(node: SerializedNode): ElementFix | null {\n const html = node.html;\n\n // Extract src to help generate meaningful alt text suggestion\n const srcMatch = html.match(/src=[\"']([^\"']+)[\"']/);\n const src = srcMatch?.[1] || '';\n const filename = src.split('/').pop()?.replace(/\\.[^.]+$/, '') || 'image';\n\n // Generate suggested alt text based on filename\n const suggestedAlt = filename\n .replace(/[-_]/g, ' ')\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .toLowerCase();\n\n // Create fixed HTML\n let fixedHtml = html;\n if (html.includes('alt=\"\"') || html.includes(\"alt=''\")) {\n // Decorative image marked correctly, but flagged - might need real alt\n fixedHtml = html.replace(/alt=[\"'][^\"']*[\"']/, `alt=\"${suggestedAlt}\"`);\n } else if (html.includes('alt=')) {\n // Has alt but it's not descriptive enough\n fixedHtml = html.replace(/alt=[\"'][^\"']*[\"']/, `alt=\"${suggestedAlt}\"`);\n } else {\n // Missing alt entirely\n fixedHtml = html.replace(/<img/, `<img alt=\"${suggestedAlt}\"`);\n }\n\n return {\n originalHtml: html,\n fixedHtml,\n explanation: `Add descriptive alt text that describes the image content or purpose. If decorative, use alt=\"\".`,\n autoFixable: true,\n };\n}\n\n/**\n * Generate a specific fix for a button-name violation\n */\nfunction generateButtonNameFix(node: SerializedNode): ElementFix | null {\n const html = node.html;\n\n // Check if it's an icon-only button\n const hasOnlySvg = /<button[^>]*>[\\s]*<svg[^>]*>[\\s\\S]*<\\/svg>[\\s]*<\\/button>/i.test(html);\n const hasOnlyImg = /<button[^>]*>[\\s]*<img[^>]*\\/?>\\s*<\\/button>/i.test(html);\n\n let fixedHtml = html;\n let explanation = '';\n\n if (hasOnlySvg || hasOnlyImg) {\n // Add aria-label for icon buttons\n fixedHtml = html.replace(/<button/, '<button aria-label=\"[describe action]\"');\n explanation = 'Add aria-label to describe the button\\'s action for screen reader users.';\n } else {\n // Add visible text content\n fixedHtml = html.replace(/<\\/button>/, '[Button text]</button>');\n explanation = 'Add visible text content or aria-label that describes the button\\'s purpose.';\n }\n\n return {\n originalHtml: html,\n fixedHtml,\n explanation,\n autoFixable: false, // Requires human decision on button purpose\n };\n}\n\n/**\n * Generate a specific fix for a link-name violation\n */\nfunction generateLinkNameFix(node: SerializedNode): ElementFix | null {\n const html = node.html;\n\n // Check common patterns\n const hasOnlySvg = /<a[^>]*>[\\s]*<svg[^>]*>[\\s\\S]*<\\/svg>[\\s]*<\\/a>/i.test(html);\n const hasOnlyImg = /<a[^>]*>[\\s]*<img[^>]*\\/?>\\s*<\\/a>/i.test(html);\n const isEmpty = /<a[^>]*>\\s*<\\/a>/i.test(html);\n\n let fixedHtml = html;\n let explanation = '';\n\n if (hasOnlySvg || hasOnlyImg) {\n fixedHtml = html.replace(/<a/, '<a aria-label=\"[describe destination]\"');\n explanation = 'Add aria-label to describe where the link goes.';\n } else if (isEmpty) {\n fixedHtml = html.replace(/<\\/a>/, '[Link text]</a>');\n explanation = 'Add descriptive text content that indicates the link\\'s destination.';\n } else {\n explanation = 'Ensure link text is descriptive. Avoid generic text like \"click here\" or \"read more\".';\n }\n\n return {\n originalHtml: html,\n fixedHtml,\n explanation,\n autoFixable: false,\n };\n}\n\n/**\n * Generate a specific fix for a label violation\n */\nfunction generateLabelFix(node: SerializedNode): ElementFix | null {\n const html = node.html;\n\n // Extract input type and any existing identifiers\n const typeMatch = html.match(/type=[\"']([^\"']+)[\"']/);\n const type = typeMatch?.[1] || 'text';\n const idMatch = html.match(/id=[\"']([^\"']+)[\"']/);\n const id = idMatch?.[1];\n\n let fixedHtml = html;\n let explanation = '';\n\n if (id) {\n // Has ID, suggest adding label element\n const labelText = type.charAt(0).toUpperCase() + type.slice(1);\n explanation = `Add a <label for=\"${id}\">${labelText}</label> element before this input.`;\n } else {\n // No ID, add one and suggest label\n const suggestedId = `input-${type}-${Date.now()}`;\n fixedHtml = html.replace(/<input/, `<input id=\"${suggestedId}\"`);\n explanation = `Add an id attribute and associate with a label: <label for=\"${suggestedId}\">Label text</label>`;\n }\n\n return {\n originalHtml: html,\n fixedHtml,\n explanation,\n autoFixable: false,\n };\n}\n\n/**\n * Fix generator registry\n */\ntype FixGenerator = (node: SerializedNode) => ElementFix | null;\n\nconst FIX_GENERATORS: Record<string, FixGenerator> = {\n 'color-contrast': generateContrastFix,\n 'image-alt': generateAltTextFix,\n 'button-name': generateButtonNameFix,\n 'link-name': generateLinkNameFix,\n 'label': generateLabelFix,\n};\n\n/**\n * Generate a specific fix for a violation node\n */\nexport function generateElementFix(ruleId: string, node: SerializedNode): ElementFix | null {\n const generator = FIX_GENERATORS[ruleId];\n if (!generator) return null;\n return generator(node);\n}\n\n/**\n * Get impact description for UI display\n */\nexport function getImpactDescription(impact: ImpactValue | null): string {\n switch (impact) {\n case 'critical':\n return 'Critical issues completely block access for some users';\n case 'serious':\n return 'Serious issues make content very difficult to access';\n case 'moderate':\n return 'Moderate issues cause some difficulty for users';\n case 'minor':\n return 'Minor issues may cause slight inconvenience';\n default:\n return 'Impact level not determined';\n }\n}\n\n/**\n * Get impact color class for styling\n */\nexport function getImpactColorClass(impact: ImpactValue | null): {\n bg: string;\n text: string;\n border: string;\n borderLeft: string;\n} {\n switch (impact) {\n case 'critical':\n return {\n bg: 'bg-red-100 dark:bg-red-950/50',\n text: 'text-red-700 dark:text-red-300',\n border: 'border-red-300 dark:border-red-700',\n borderLeft: 'border-l-red-500',\n };\n case 'serious':\n return {\n bg: 'bg-orange-100 dark:bg-orange-950/50',\n text: 'text-orange-700 dark:text-orange-300',\n border: 'border-orange-300 dark:border-orange-700',\n borderLeft: 'border-l-orange-500',\n };\n case 'moderate':\n return {\n bg: 'bg-amber-100 dark:bg-amber-950/50',\n text: 'text-amber-700 dark:text-amber-300',\n border: 'border-amber-300 dark:border-amber-700',\n borderLeft: 'border-l-amber-500',\n };\n case 'minor':\n default:\n return {\n bg: 'bg-yellow-100 dark:bg-yellow-950/50',\n text: 'text-yellow-700 dark:text-yellow-300',\n border: 'border-yellow-300 dark:border-yellow-700',\n borderLeft: 'border-l-yellow-500',\n };\n }\n}\n\n/**\n * Extract WCAG tags from a violation's tags array\n */\nexport function extractWcagTags(tags: string[]): string[] {\n return tags.filter(tag => tag.startsWith('wcag'));\n}\n\n/**\n * Get readable WCAG criterion from tag (e.g., 'wcag143' -> '1.4.3')\n */\nexport function parseWcagTag(tag: string): string | null {\n const match = tag.match(/wcag(\\d)(\\d)(\\d)/);\n if (!match) return null;\n return `${match[1]}.${match[2]}.${match[3]}`;\n}\n","/**\n * Interactions Panel - Storybook-style interaction testing\n *\n * Runs play functions from Storybook stories and displays:\n * - Step-by-step progress\n * - Assertion results (pass/fail)\n * - Error messages with stack traces\n * - Re-run capabilities\n * - Step-through debugging with breakpoints\n */\n\nimport { useState, useCallback, useRef, useEffect } from \"react\";\nimport clsx from \"clsx\";\nimport type { PlayFunction, PlayFunctionContext, SegmentVariant } from \"../../core/index.js\";\nimport {\n PlayIcon,\n CheckIcon,\n XIcon,\n LoadingIcon,\n ChevronDownIcon,\n ChevronRightIcon,\n RefreshIcon,\n BugIcon,\n PauseIcon,\n StepOverIcon,\n ContinueIcon,\n BreakpointIcon,\n BreakpointEmptyIcon,\n} from \"./Icons.js\";\n\n// Step execution state\ninterface StepResult {\n name: string;\n status: \"pending\" | \"running\" | \"passed\" | \"failed\" | \"paused\";\n error?: string;\n duration?: number;\n}\n\ninterface InteractionResult {\n status: \"idle\" | \"running\" | \"passed\" | \"failed\" | \"paused\";\n steps: StepResult[];\n error?: string;\n duration?: number;\n startTime?: number;\n}\n\n// Debug state\ninterface DebugState {\n mode: \"normal\" | \"debug\";\n isPaused: boolean;\n currentStepIndex: number;\n breakpoints: Set<number>;\n}\n\ninterface InteractionsPanelProps {\n /** The current variant being displayed */\n variant: SegmentVariant | null;\n /** Selector for the preview container element */\n previewSelector?: string;\n /** Key that changes when the preview updates */\n previewKey?: number;\n /** Args currently being used for the preview */\n currentArgs?: Record<string, unknown>;\n}\n\nexport function InteractionsPanel({\n variant,\n previewSelector = '[data-preview-container=\"true\"]',\n previewKey = 0,\n currentArgs = {},\n}: InteractionsPanelProps) {\n const [result, setResult] = useState<InteractionResult>({\n status: \"idle\",\n steps: [],\n });\n const [expandedSteps, setExpandedSteps] = useState<Set<number>>(new Set());\n const [debugState, setDebugState] = useState<DebugState>({\n mode: \"normal\",\n isPaused: false,\n currentStepIndex: -1,\n breakpoints: new Set(),\n });\n const abortControllerRef = useRef<AbortController | null>(null);\n const resumeResolverRef = useRef<(() => void) | null>(null);\n\n // Reset state when variant changes\n useEffect(() => {\n setResult({ status: \"idle\", steps: [] });\n setExpandedSteps(new Set());\n setDebugState((prev) => ({\n ...prev,\n isPaused: false,\n currentStepIndex: -1,\n }));\n }, [variant?.name, previewKey]);\n\n // Keyboard shortcuts\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // Only handle if this panel is focused or no specific element is focused\n if (document.activeElement && document.activeElement.tagName !== 'BODY') {\n const isInteractionsPanelFocused = (document.activeElement as HTMLElement).closest('[data-interactions-panel]');\n if (!isInteractionsPanelFocused) return;\n }\n\n switch (e.key) {\n case 'F5':\n e.preventDefault();\n if (debugState.mode === 'debug' && !result.status.includes('running')) {\n runInteractions(true);\n }\n break;\n case 'F8':\n e.preventDefault();\n if (debugState.isPaused) {\n handleResume();\n }\n break;\n case 'F9':\n e.preventDefault();\n if (debugState.currentStepIndex >= 0) {\n toggleBreakpoint(debugState.currentStepIndex);\n }\n break;\n case 'F10':\n e.preventDefault();\n if (debugState.isPaused) {\n handleStepOver();\n }\n break;\n }\n };\n\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [debugState, result.status]);\n\n const hasPlayFunction = variant?.hasPlayFunction && variant?.play;\n\n const toggleBreakpoint = (index: number) => {\n setDebugState((prev) => {\n const next = new Set(prev.breakpoints);\n if (next.has(index)) {\n next.delete(index);\n } else {\n next.add(index);\n }\n return { ...prev, breakpoints: next };\n });\n };\n\n const toggleDebugMode = () => {\n setDebugState((prev) => ({\n ...prev,\n mode: prev.mode === 'normal' ? 'debug' : 'normal',\n }));\n };\n\n const handleResume = () => {\n if (resumeResolverRef.current) {\n resumeResolverRef.current();\n resumeResolverRef.current = null;\n }\n setDebugState((prev) => ({ ...prev, isPaused: false }));\n setResult((prev) => ({ ...prev, status: 'running' }));\n };\n\n const handleStepOver = () => {\n // Mark current step to not pause, then resume\n if (resumeResolverRef.current) {\n resumeResolverRef.current();\n resumeResolverRef.current = null;\n }\n setDebugState((prev) => ({ ...prev, isPaused: false }));\n setResult((prev) => ({ ...prev, status: 'running' }));\n };\n\n // Run the play function\n const runInteractions = useCallback(async (withDebugger = false) => {\n if (!variant?.play) return;\n\n // Cancel any existing run\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n }\n abortControllerRef.current = new AbortController();\n\n const startTime = performance.now();\n const steps: StepResult[] = [];\n const isDebugMode = withDebugger || debugState.mode === 'debug';\n let stepIndex = 0;\n\n setResult({\n status: \"running\",\n steps: [],\n startTime,\n });\n\n setDebugState((prev) => ({\n ...prev,\n isPaused: false,\n currentStepIndex: -1,\n }));\n\n // Find the preview container\n const canvasElement = document.querySelector(previewSelector) as HTMLElement;\n if (!canvasElement) {\n setResult({\n status: \"failed\",\n steps: [],\n error: `Preview container not found: ${previewSelector}`,\n duration: performance.now() - startTime,\n });\n return;\n }\n\n // Create the step function that tracks execution\n const step = async (name: string, fn: () => Promise<void>): Promise<void> => {\n const currentIndex = stepIndex++;\n const stepStartTime = performance.now();\n\n // Check for breakpoint or debug mode pause\n if (isDebugMode && (debugState.breakpoints.has(currentIndex) || currentIndex === 0)) {\n // Pause at breakpoint\n steps.push({ name, status: \"paused\" });\n setResult((prev) => ({\n ...prev,\n status: \"paused\",\n steps: [...steps],\n }));\n setDebugState((prev) => ({\n ...prev,\n isPaused: true,\n currentStepIndex: currentIndex,\n }));\n\n // Wait for resume\n await new Promise<void>((resolve) => {\n resumeResolverRef.current = resolve;\n });\n\n // Update to running\n steps[currentIndex] = { name, status: \"running\" };\n setResult((prev) => ({\n ...prev,\n status: \"running\",\n steps: [...steps],\n }));\n } else {\n // Add step as running\n steps.push({ name, status: \"running\" });\n setResult((prev) => ({\n ...prev,\n steps: [...steps],\n }));\n }\n\n setDebugState((prev) => ({\n ...prev,\n currentStepIndex: currentIndex,\n }));\n\n try {\n await fn();\n steps[currentIndex] = {\n name,\n status: \"passed\",\n duration: performance.now() - stepStartTime,\n };\n setResult((prev) => ({\n ...prev,\n steps: [...steps],\n }));\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n steps[currentIndex] = {\n name,\n status: \"failed\",\n error: errorMessage,\n duration: performance.now() - stepStartTime,\n };\n setResult((prev) => ({\n ...prev,\n steps: [...steps],\n }));\n throw error; // Re-throw to stop execution\n }\n\n // In debug mode, pause after each step if stepping\n if (isDebugMode && debugState.breakpoints.has(currentIndex + 1)) {\n setResult((prev) => ({\n ...prev,\n status: \"paused\",\n }));\n setDebugState((prev) => ({\n ...prev,\n isPaused: true,\n }));\n\n await new Promise<void>((resolve) => {\n resumeResolverRef.current = resolve;\n });\n }\n };\n\n // Create the context for the play function\n const context: PlayFunctionContext = {\n canvasElement,\n args: currentArgs,\n step,\n };\n\n try {\n await variant.play(context);\n\n // If no explicit steps were defined, the whole play function is one step\n if (steps.length === 0) {\n steps.push({\n name: \"Play function\",\n status: \"passed\",\n duration: performance.now() - startTime,\n });\n }\n\n setResult({\n status: \"passed\",\n steps: [...steps],\n duration: performance.now() - startTime,\n });\n\n setDebugState((prev) => ({\n ...prev,\n isPaused: false,\n currentStepIndex: -1,\n }));\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error);\n\n // If no steps failed explicitly, mark as failed at top level\n if (steps.length === 0 || !steps.some((s) => s.status === \"failed\")) {\n steps.push({\n name: \"Play function\",\n status: \"failed\",\n error: errorMessage,\n duration: performance.now() - startTime,\n });\n }\n\n setResult({\n status: \"failed\",\n steps: [...steps],\n error: errorMessage,\n duration: performance.now() - startTime,\n });\n\n // Auto-expand failed steps\n const failedIndices = steps\n .map((s, i) => (s.status === \"failed\" ? i : -1))\n .filter((i) => i >= 0);\n setExpandedSteps(new Set(failedIndices));\n\n setDebugState((prev) => ({\n ...prev,\n isPaused: false,\n currentStepIndex: -1,\n }));\n }\n }, [variant, previewSelector, currentArgs, debugState.mode, debugState.breakpoints]);\n\n const toggleStep = (index: number) => {\n setExpandedSteps((prev) => {\n const next = new Set(prev);\n if (next.has(index)) {\n next.delete(index);\n } else {\n next.add(index);\n }\n return next;\n });\n };\n\n const formatDuration = (ms?: number) => {\n if (ms === undefined) return \"\";\n if (ms < 1000) return `${Math.round(ms)}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n };\n\n // No play function available\n if (!hasPlayFunction) {\n return (\n <div className=\"h-full flex flex-col\">\n <div className=\"p-4 border-b border-gray-200 dark:border-gray-700\">\n <h3 className=\"font-medium text-gray-900 dark:text-gray-100 flex items-center gap-2\">\n <PlayIcon className=\"w-4 h-4\" />\n Interactions\n </h3>\n </div>\n <div className=\"flex-1 flex items-center justify-center p-8 text-center\">\n <div className=\"max-w-md\">\n <div className=\"w-12 h-12 rounded-full bg-gray-100 dark:bg-gray-800 flex items-center justify-center mx-auto mb-4\">\n <PlayIcon className=\"w-6 h-6 text-gray-400\" />\n </div>\n <h4 className=\"font-medium text-gray-700 dark:text-gray-300 mb-2\">\n No interactions defined\n </h4>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n This variant doesn't have a play function. Add a <code className=\"px-1 py-0.5 bg-gray-100 dark:bg-gray-800 rounded text-xs\">play</code> function to your Storybook story to enable interaction testing.\n </p>\n <div className=\"mt-4 p-3 bg-gray-50 dark:bg-gray-800/50 rounded-lg text-left\">\n <pre className=\"text-xs text-gray-600 dark:text-gray-400 overflow-x-auto\">\n{`export const Default = {\n play: async ({ canvasElement, step }) => {\n const canvas = within(canvasElement);\n\n await step('Click the button', async () => {\n await userEvent.click(\n canvas.getByRole('button')\n );\n });\n\n await expect(\n canvas.getByText('Clicked!')\n ).toBeInTheDocument();\n }\n};`}\n </pre>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"h-full flex flex-col\" data-interactions-panel>\n {/* Header */}\n <div className=\"p-4 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between\">\n <h3 className=\"font-medium text-gray-900 dark:text-gray-100 flex items-center gap-2\">\n <PlayIcon className=\"w-4 h-4\" />\n Interactions\n </h3>\n <div className=\"flex items-center gap-2\">\n {result.duration !== undefined && (\n <span className=\"text-xs text-gray-500 dark:text-gray-400\">\n {formatDuration(result.duration)}\n </span>\n )}\n\n {/* Debug mode toggle */}\n <button\n onClick={toggleDebugMode}\n className={clsx(\n \"p-1.5 rounded-md transition-colors\",\n debugState.mode === 'debug'\n ? \"bg-orange-100 dark:bg-orange-900/30 text-orange-600 dark:text-orange-400\"\n : \"text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 hover:bg-gray-100 dark:hover:bg-gray-800\"\n )}\n title={debugState.mode === 'debug' ? \"Exit debug mode\" : \"Enable debug mode (F5 to run with debugger)\"}\n >\n <BugIcon className=\"w-4 h-4\" />\n </button>\n\n {/* Debug controls when paused */}\n {debugState.isPaused && (\n <>\n <button\n onClick={handleResume}\n className=\"p-1.5 text-green-600 dark:text-green-400 hover:bg-green-100 dark:hover:bg-green-900/30 rounded-md transition-colors\"\n title=\"Continue (F8)\"\n >\n <ContinueIcon className=\"w-4 h-4\" />\n </button>\n <button\n onClick={handleStepOver}\n className=\"p-1.5 text-blue-600 dark:text-blue-400 hover:bg-blue-100 dark:hover:bg-blue-900/30 rounded-md transition-colors\"\n title=\"Step over (F10)\"\n >\n <StepOverIcon className=\"w-4 h-4\" />\n </button>\n </>\n )}\n\n <button\n onClick={() => runInteractions(debugState.mode === 'debug')}\n disabled={result.status === \"running\"}\n className={clsx(\n \"flex items-center gap-1.5 px-3 py-1.5 rounded-md text-sm font-medium transition-colors\",\n result.status === \"running\" || result.status === \"paused\"\n ? \"bg-gray-100 dark:bg-gray-800 text-gray-400 cursor-not-allowed\"\n : \"bg-blue-600 hover:bg-blue-700 text-white\"\n )}\n >\n {result.status === \"running\" ? (\n <>\n <LoadingIcon className=\"w-4 h-4 animate-spin\" />\n Running...\n </>\n ) : result.status === \"paused\" ? (\n <>\n <PauseIcon className=\"w-4 h-4\" />\n Paused\n </>\n ) : result.status === \"idle\" ? (\n <>\n <PlayIcon className=\"w-4 h-4\" />\n {debugState.mode === 'debug' ? 'Debug' : 'Run'}\n </>\n ) : (\n <>\n <RefreshIcon className=\"w-4 h-4\" />\n Rerun\n </>\n )}\n </button>\n </div>\n </div>\n\n {/* Results */}\n <div className=\"flex-1 overflow-y-auto\">\n {result.status === \"idle\" ? (\n <div className=\"p-8 text-center\">\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n Click \"Run\" to execute the interaction tests\n </p>\n </div>\n ) : (\n <div className=\"p-4 space-y-2\">\n {/* Overall status */}\n <div\n className={clsx(\n \"p-3 rounded-lg flex items-center justify-between\",\n result.status === \"running\" && \"bg-blue-50 dark:bg-blue-950/30 border border-blue-200 dark:border-blue-800\",\n result.status === \"paused\" && \"bg-orange-50 dark:bg-orange-950/30 border border-orange-200 dark:border-orange-800\",\n result.status === \"passed\" && \"bg-green-50 dark:bg-green-950/30 border border-green-200 dark:border-green-800\",\n result.status === \"failed\" && \"bg-red-50 dark:bg-red-950/30 border border-red-200 dark:border-red-800\"\n )}\n >\n <div className=\"flex items-center gap-2\">\n {result.status === \"running\" && (\n <LoadingIcon className=\"w-5 h-5 text-blue-600 dark:text-blue-400 animate-spin\" />\n )}\n {result.status === \"paused\" && (\n <PauseIcon className=\"w-5 h-5 text-orange-600 dark:text-orange-400\" />\n )}\n {result.status === \"passed\" && (\n <CheckIcon className=\"w-5 h-5 text-green-600 dark:text-green-400\" />\n )}\n {result.status === \"failed\" && (\n <XIcon className=\"w-5 h-5 text-red-600 dark:text-red-400\" />\n )}\n <span\n className={clsx(\n \"font-medium\",\n result.status === \"running\" && \"text-blue-700 dark:text-blue-300\",\n result.status === \"paused\" && \"text-orange-700 dark:text-orange-300\",\n result.status === \"passed\" && \"text-green-700 dark:text-green-300\",\n result.status === \"failed\" && \"text-red-700 dark:text-red-300\"\n )}\n >\n {result.status === \"running\" && \"Running interactions...\"}\n {result.status === \"paused\" && \"Paused at breakpoint\"}\n {result.status === \"passed\" && \"All interactions passed\"}\n {result.status === \"failed\" && \"Interactions failed\"}\n </span>\n </div>\n <span className=\"text-xs text-gray-500 dark:text-gray-400\">\n {result.steps.filter((s) => s.status === \"passed\").length}/{result.steps.length} steps\n </span>\n </div>\n\n {/* Steps */}\n {result.steps.length > 0 && (\n <div className=\"mt-4 space-y-1\">\n <div className=\"flex items-center justify-between mb-2\">\n <h4 className=\"text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wide\">\n Steps\n </h4>\n {debugState.mode === 'debug' && (\n <span className=\"text-xs text-orange-600 dark:text-orange-400\">\n Debug mode - click gutter to set breakpoints\n </span>\n )}\n </div>\n {result.steps.map((step, index) => (\n <div\n key={index}\n className={clsx(\n \"rounded-lg border transition-colors flex\",\n step.status === \"pending\" && \"bg-gray-50 dark:bg-gray-800/50 border-gray-200 dark:border-gray-700\",\n step.status === \"running\" && \"bg-blue-50 dark:bg-blue-950/30 border-blue-200 dark:border-blue-800\",\n step.status === \"paused\" && \"bg-orange-50 dark:bg-orange-950/30 border-orange-200 dark:border-orange-800\",\n step.status === \"passed\" && \"bg-white dark:bg-gray-800 border-gray-200 dark:border-gray-700\",\n step.status === \"failed\" && \"bg-red-50 dark:bg-red-950/30 border-red-200 dark:border-red-800\",\n debugState.currentStepIndex === index && \"ring-2 ring-orange-400 dark:ring-orange-500\"\n )}\n >\n {/* Breakpoint gutter - only show in debug mode */}\n {debugState.mode === 'debug' && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n toggleBreakpoint(index);\n }}\n className=\"w-6 flex-shrink-0 flex items-center justify-center border-r border-gray-200 dark:border-gray-700 hover:bg-gray-100 dark:hover:bg-gray-700/50 transition-colors\"\n title={debugState.breakpoints.has(index) ? \"Remove breakpoint (F9)\" : \"Add breakpoint (F9)\"}\n >\n {debugState.breakpoints.has(index) ? (\n <BreakpointIcon className=\"w-3 h-3 text-red-500\" />\n ) : (\n <BreakpointEmptyIcon className=\"w-3 h-3 text-gray-300 dark:text-gray-600 hover:text-red-400\" />\n )}\n </button>\n )}\n\n <div className=\"flex-1\">\n <button\n onClick={() => step.error && toggleStep(index)}\n className={clsx(\n \"w-full p-3 flex items-center gap-2 text-left\",\n step.error && \"cursor-pointer\"\n )}\n disabled={!step.error}\n >\n {/* Current step indicator */}\n {debugState.mode === 'debug' && debugState.currentStepIndex === index && (\n <span className=\"text-orange-500 font-bold\">ā¶</span>\n )}\n\n {/* Status icon */}\n {step.status === \"pending\" && (\n <div className=\"w-4 h-4 rounded-full border-2 border-gray-300 dark:border-gray-600\" />\n )}\n {step.status === \"running\" && (\n <LoadingIcon className=\"w-4 h-4 text-blue-600 dark:text-blue-400 animate-spin\" />\n )}\n {step.status === \"paused\" && (\n <PauseIcon className=\"w-4 h-4 text-orange-600 dark:text-orange-400\" />\n )}\n {step.status === \"passed\" && (\n <CheckIcon className=\"w-4 h-4 text-green-600 dark:text-green-400\" />\n )}\n {step.status === \"failed\" && (\n <XIcon className=\"w-4 h-4 text-red-600 dark:text-red-400\" />\n )}\n\n {/* Step name */}\n <span\n className={clsx(\n \"flex-1 text-sm\",\n step.status === \"pending\" && \"text-gray-400 dark:text-gray-500\",\n step.status === \"running\" && \"text-blue-700 dark:text-blue-300\",\n step.status === \"paused\" && \"text-orange-700 dark:text-orange-300\",\n step.status === \"passed\" && \"text-gray-700 dark:text-gray-300\",\n step.status === \"failed\" && \"text-red-700 dark:text-red-300\"\n )}\n >\n {step.name}\n </span>\n\n {/* Duration */}\n {step.duration !== undefined && (\n <span className=\"text-xs text-gray-400 dark:text-gray-500\">\n {formatDuration(step.duration)}\n </span>\n )}\n\n {/* Expand icon for errors */}\n {step.error && (\n expandedSteps.has(index) ? (\n <ChevronDownIcon className=\"w-4 h-4 text-gray-400\" />\n ) : (\n <ChevronRightIcon className=\"w-4 h-4 text-gray-400\" />\n )\n )}\n </button>\n\n {/* Error details */}\n {step.error && expandedSteps.has(index) && (\n <div className=\"px-3 pb-3 pl-9\">\n <pre className=\"text-xs text-red-600 dark:text-red-400 bg-red-100 dark:bg-red-950/50 p-2 rounded overflow-x-auto whitespace-pre-wrap\">\n {step.error}\n </pre>\n </div>\n )}\n </div>\n </div>\n ))}\n </div>\n )}\n\n {/* Keyboard shortcuts help in debug mode */}\n {debugState.mode === 'debug' && (\n <div className=\"mt-4 p-3 bg-gray-50 dark:bg-gray-800/50 rounded-lg text-xs text-gray-500 dark:text-gray-400\">\n <div className=\"font-medium mb-1\">Keyboard shortcuts:</div>\n <div className=\"grid grid-cols-2 gap-1\">\n <span><kbd className=\"px-1 bg-gray-200 dark:bg-gray-700 rounded\">F5</kbd> Run with debugger</span>\n <span><kbd className=\"px-1 bg-gray-200 dark:bg-gray-700 rounded\">F8</kbd> Continue</span>\n <span><kbd className=\"px-1 bg-gray-200 dark:bg-gray-700 rounded\">F9</kbd> Toggle breakpoint</span>\n <span><kbd className=\"px-1 bg-gray-200 dark:bg-gray-700 rounded\">F10</kbd> Step over</span>\n </div>\n </div>\n )}\n\n {/* Top-level error (if no steps failed) */}\n {result.error && !result.steps.some((s) => s.status === \"failed\") && (\n <div className=\"mt-4\">\n <h4 className=\"text-xs font-medium text-gray-500 dark:text-gray-400 uppercase tracking-wide mb-2\">\n Error\n </h4>\n <pre className=\"text-xs text-red-600 dark:text-red-400 bg-red-100 dark:bg-red-950/50 p-3 rounded overflow-x-auto whitespace-pre-wrap\">\n {result.error}\n </pre>\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n}\n","/**\n * Actions Panel - Storybook-style event logging\n *\n * Displays a log of callback invocations (onClick, onChange, etc.)\n * with expandable argument details and timestamps.\n */\n\nimport { useState, useMemo, useRef, useEffect } from \"react\";\nimport clsx from \"clsx\";\nimport type { ActionLog } from \"../hooks/useActions.js\";\nimport { formatActionArg } from \"../hooks/useActions.js\";\nimport {\n TrashIcon,\n ChevronDownIcon,\n ChevronRightIcon,\n PlayIcon,\n ExportIcon,\n DownloadIcon,\n CopyIcon,\n CheckIcon,\n} from \"./Icons.js\";\nimport {\n exportActions,\n copyToClipboard,\n downloadAsFile,\n getFileExtension,\n type ExportFormat,\n} from \"../utils/actionExport.js\";\n\ninterface ActionsPanelProps {\n /** List of action logs */\n logs: ActionLog[];\n /** Callback to clear all logs */\n onClear: () => void;\n /** Component name for export context */\n componentName?: string;\n /** Variant name for export context */\n variantName?: string;\n}\n\nexport function ActionsPanel({ logs, onClear, componentName = 'Component', variantName = 'Default' }: ActionsPanelProps) {\n const [expandedLogs, setExpandedLogs] = useState<Set<string>>(new Set());\n const [filter, setFilter] = useState(\"\");\n const [showExportMenu, setShowExportMenu] = useState(false);\n const [copyFeedback, setCopyFeedback] = useState<string | null>(null);\n const exportMenuRef = useRef<HTMLDivElement>(null);\n\n // Close export menu when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (exportMenuRef.current && !exportMenuRef.current.contains(event.target as Node)) {\n setShowExportMenu(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const filteredLogs = useMemo(() => {\n if (!filter) return logs;\n const lowerFilter = filter.toLowerCase();\n return logs.filter((log) => log.name.toLowerCase().includes(lowerFilter));\n }, [logs, filter]);\n\n const toggleExpanded = (id: string) => {\n setExpandedLogs((prev) => {\n const next = new Set(prev);\n if (next.has(id)) {\n next.delete(id);\n } else {\n next.add(id);\n }\n return next;\n });\n };\n\n const formatTime = (timestamp: number) => {\n const date = new Date(timestamp);\n return date.toLocaleTimeString(\"en-US\", {\n hour12: false,\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n });\n };\n\n const handleExport = async (format: ExportFormat, action: 'copy' | 'download') => {\n const content = exportActions(logs, format, {\n componentName,\n variantName,\n includeComments: true,\n });\n\n if (action === 'copy') {\n const success = await copyToClipboard(content);\n if (success) {\n setCopyFeedback(format);\n setTimeout(() => setCopyFeedback(null), 2000);\n }\n } else {\n const filename = `${componentName}-${variantName}-actions${getFileExtension(format)}`;\n downloadAsFile(content, filename.toLowerCase().replace(/\\s+/g, '-'));\n }\n\n setShowExportMenu(false);\n };\n\n // No logs state\n if (logs.length === 0) {\n return (\n <div className=\"h-full flex flex-col\">\n <div className=\"p-4 border-b border-[--border] flex items-center justify-between\">\n <h3 className=\"font-medium text-primary flex items-center gap-2\">\n <PlayIcon className=\"w-4 h-4\" />\n Actions\n </h3>\n </div>\n <div className=\"flex-1 flex items-center justify-center p-8 text-center\">\n <div className=\"max-w-md\">\n <div className=\"w-12 h-12 rounded-full bg-[--bg-tertiary] flex items-center justify-center mx-auto mb-4\">\n <PlayIcon className=\"w-6 h-6 text-tertiary\" />\n </div>\n <h4 className=\"font-medium text-secondary mb-2\">\n No actions logged yet\n </h4>\n <p className=\"text-sm text-tertiary\">\n Interact with the component to see callback invocations here.\n Actions like <code className=\"px-1 py-0.5 bg-[--bg-tertiary] rounded text-xs\">onClick</code>, <code className=\"px-1 py-0.5 bg-[--bg-tertiary] rounded text-xs\">onChange</code>, etc. will be logged automatically.\n </p>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"h-full flex flex-col\">\n {/* Header */}\n <div className=\"p-3 border-b border-[--border] flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2 flex-1\">\n <h3 className=\"font-medium text-primary flex items-center gap-2 text-sm\">\n <PlayIcon className=\"w-4 h-4\" />\n Actions\n </h3>\n <span className=\"text-xs text-tertiary bg-[--bg-tertiary] px-1.5 py-0.5 rounded\">\n {logs.length}\n </span>\n </div>\n <div className=\"flex items-center gap-2\">\n <input\n type=\"text\"\n placeholder=\"Filter...\"\n value={filter}\n onChange={(e) => setFilter(e.target.value)}\n className=\"px-2 py-1 text-xs border border-[--border] rounded bg-[--bg-elevated] text-primary w-24 focus:outline-none focus:ring-1 focus:ring-[--color-accent]\"\n />\n\n {/* Export dropdown */}\n <div className=\"relative\" ref={exportMenuRef}>\n <button\n onClick={() => setShowExportMenu(!showExportMenu)}\n className={clsx(\n \"p-1.5 rounded transition-colors\",\n showExportMenu\n ? \"text-[--color-accent] bg-[--bg-hover]\"\n : \"text-tertiary hover:text-secondary hover:bg-[--bg-hover]\"\n )}\n title=\"Export actions\"\n >\n <ExportIcon className=\"w-4 h-4\" />\n </button>\n\n {showExportMenu && (\n <div className=\"absolute right-0 top-full mt-1 w-56 bg-[--bg-elevated] rounded-lg shadow-[--shadow-lg] border border-[--border] py-1 z-50\">\n <div className=\"px-3 py-1.5 text-xs font-medium text-tertiary uppercase tracking-wide\">\n Export as\n </div>\n\n {/* JSON */}\n <div className=\"px-1\">\n <div className=\"flex items-center justify-between px-2 py-1.5 hover:bg-[--bg-hover] rounded\">\n <span className=\"text-sm text-secondary\">JSON</span>\n <div className=\"flex items-center gap-1\">\n <button\n onClick={() => handleExport('json', 'copy')}\n className=\"p-1 text-tertiary hover:text-secondary hover:bg-[--bg-hover] rounded\"\n title=\"Copy to clipboard\"\n >\n {copyFeedback === 'json' ? <CheckIcon className=\"w-3.5 h-3.5 text-green-500\" /> : <CopyIcon className=\"w-3.5 h-3.5\" />}\n </button>\n <button\n onClick={() => handleExport('json', 'download')}\n className=\"p-1 text-tertiary hover:text-secondary hover:bg-[--bg-hover] rounded\"\n title=\"Download file\"\n >\n <DownloadIcon className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n </div>\n </div>\n\n {/* Jest */}\n <div className=\"px-1\">\n <div className=\"flex items-center justify-between px-2 py-1.5 hover:bg-[--bg-hover] rounded\">\n <span className=\"text-sm text-secondary\">Jest Assertions</span>\n <div className=\"flex items-center gap-1\">\n <button\n onClick={() => handleExport('jest', 'copy')}\n className=\"p-1 text-tertiary hover:text-secondary hover:bg-[--bg-hover] rounded\"\n title=\"Copy to clipboard\"\n >\n {copyFeedback === 'jest' ? <CheckIcon className=\"w-3.5 h-3.5 text-green-500\" /> : <CopyIcon className=\"w-3.5 h-3.5\" />}\n </button>\n <button\n onClick={() => handleExport('jest', 'download')}\n className=\"p-1 text-tertiary hover:text-secondary hover:bg-[--bg-hover] rounded\"\n title=\"Download file\"\n >\n <DownloadIcon className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n </div>\n </div>\n\n {/* Playwright */}\n <div className=\"px-1\">\n <div className=\"flex items-center justify-between px-2 py-1.5 hover:bg-[--bg-hover] rounded\">\n <span className=\"text-sm text-secondary\">Playwright Test</span>\n <div className=\"flex items-center gap-1\">\n <button\n onClick={() => handleExport('playwright', 'copy')}\n className=\"p-1 text-tertiary hover:text-secondary hover:bg-[--bg-hover] rounded\"\n title=\"Copy to clipboard\"\n >\n {copyFeedback === 'playwright' ? <CheckIcon className=\"w-3.5 h-3.5 text-green-500\" /> : <CopyIcon className=\"w-3.5 h-3.5\" />}\n </button>\n <button\n onClick={() => handleExport('playwright', 'download')}\n className=\"p-1 text-tertiary hover:text-secondary hover:bg-[--bg-hover] rounded\"\n title=\"Download file\"\n >\n <DownloadIcon className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n </div>\n </div>\n\n <div className=\"border-t border-[--border-subtle] my-1\" />\n <div className=\"px-3 py-1.5 text-xs text-tertiary\">\n {logs.length} action{logs.length !== 1 ? 's' : ''} recorded\n </div>\n </div>\n )}\n </div>\n\n <button\n onClick={onClear}\n className=\"p-1.5 text-tertiary hover:text-secondary hover:bg-[--bg-hover] rounded transition-colors\"\n title=\"Clear all actions\"\n >\n <TrashIcon className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n {/* Log list */}\n <div className=\"flex-1 overflow-y-auto\">\n {filteredLogs.length === 0 ? (\n <div className=\"p-4 text-center text-sm text-tertiary\">\n No actions match \"{filter}\"\n </div>\n ) : (\n <div className=\"divide-y divide-[--border-subtle]\">\n {filteredLogs.map((log) => (\n <ActionLogItem\n key={log.id}\n log={log}\n isExpanded={expandedLogs.has(log.id)}\n onToggle={() => toggleExpanded(log.id)}\n formatTime={formatTime}\n />\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\ninterface ActionLogItemProps {\n log: ActionLog;\n isExpanded: boolean;\n onToggle: () => void;\n formatTime: (timestamp: number) => string;\n}\n\nfunction ActionLogItem({ log, isExpanded, onToggle, formatTime }: ActionLogItemProps) {\n const hasArgs = log.args.length > 0;\n const argsPreview = hasArgs\n ? log.args.map((arg) => formatActionArg(arg, 50)).join(\", \")\n : \"\";\n\n return (\n <div className=\"hover:bg-[--bg-secondary] transition-colors\">\n <button\n onClick={onToggle}\n disabled={!hasArgs}\n className={clsx(\n \"w-full px-3 py-2 flex items-start gap-2 text-left\",\n hasArgs && \"cursor-pointer\",\n !hasArgs && \"cursor-default\"\n )}\n >\n {/* Expand icon */}\n <div className=\"flex-shrink-0 w-4 h-4 mt-0.5\">\n {hasArgs ? (\n isExpanded ? (\n <ChevronDownIcon className=\"w-4 h-4 text-tertiary\" />\n ) : (\n <ChevronRightIcon className=\"w-4 h-4 text-tertiary\" />\n )\n ) : (\n <div className=\"w-4 h-4\" />\n )}\n </div>\n\n {/* Action name */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-mono text-sm text-[--color-accent]\">\n {log.name}\n </span>\n {log.count > 1 && (\n <span className=\"text-xs text-tertiary bg-[--bg-tertiary] px-1.5 py-0.5 rounded-full\">\n Ć{log.count}\n </span>\n )}\n </div>\n {!isExpanded && hasArgs && (\n <div className=\"text-xs text-tertiary truncate mt-0.5 font-mono\">\n ({argsPreview})\n </div>\n )}\n </div>\n\n {/* Timestamp */}\n <span className=\"flex-shrink-0 text-xs text-tertiary font-mono\">\n {formatTime(log.timestamp)}\n </span>\n </button>\n\n {/* Expanded args */}\n {isExpanded && hasArgs && (\n <div className=\"px-3 pb-3 pl-9\">\n <div className=\"bg-[--bg-secondary] rounded-lg p-2 overflow-x-auto\">\n {log.args.map((arg, index) => (\n <div key={index} className=\"mb-1 last:mb-0\">\n <span className=\"text-xs text-tertiary\">\n {log.args.length > 1 ? `[${index}] ` : \"\"}\n </span>\n <pre className=\"inline text-xs font-mono text-secondary whitespace-pre-wrap\">\n {formatActionArg(arg, 500)}\n </pre>\n </div>\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n","/**\n * Actions logging hook - tracks callback invocations for debugging\n *\n * Similar to Storybook's Actions addon, this logs when callbacks like\n * onClick, onChange, etc. are invoked, showing the arguments passed.\n */\n\nimport { useState, useCallback, useRef } from \"react\";\n\nexport interface ActionLog {\n id: string;\n name: string;\n args: unknown[];\n timestamp: number;\n count: number; // For repeated identical actions\n}\n\nexport interface UseActionsReturn {\n /** All logged actions */\n logs: ActionLog[];\n /** Add a new action log */\n logAction: (name: string, args: unknown[]) => void;\n /** Clear all logs */\n clearLogs: () => void;\n /** Wrap a callback to automatically log when called */\n wrapCallback: <T extends (...args: unknown[]) => unknown>(\n name: string,\n callback?: T\n ) => (...args: Parameters<T>) => ReturnType<T> | undefined;\n /** Wrap multiple callbacks in an object */\n wrapCallbacks: (\n callbacks: Record<string, ((...args: unknown[]) => unknown) | undefined>\n ) => Record<string, (...args: unknown[]) => unknown>;\n}\n\nconst MAX_LOGS = 100;\n\nexport function useActions(): UseActionsReturn {\n const [logs, setLogs] = useState<ActionLog[]>([]);\n const logIdCounter = useRef(0);\n\n const logAction = useCallback((name: string, args: unknown[]) => {\n setLogs((prevLogs) => {\n // Check if the last log is the same action (for counting repeated calls)\n const lastLog = prevLogs[0];\n if (\n lastLog &&\n lastLog.name === name &&\n JSON.stringify(lastLog.args) === JSON.stringify(args)\n ) {\n // Increment count on existing log\n return [\n { ...lastLog, count: lastLog.count + 1, timestamp: Date.now() },\n ...prevLogs.slice(1),\n ];\n }\n\n // Add new log\n const newLog: ActionLog = {\n id: `action-${++logIdCounter.current}`,\n name,\n args,\n timestamp: Date.now(),\n count: 1,\n };\n\n // Keep only the last MAX_LOGS entries\n return [newLog, ...prevLogs].slice(0, MAX_LOGS);\n });\n }, []);\n\n const clearLogs = useCallback(() => {\n setLogs([]);\n }, []);\n\n const wrapCallback = useCallback(\n <T extends (...args: unknown[]) => unknown>(name: string, callback?: T) => {\n return (...args: Parameters<T>): ReturnType<T> | undefined => {\n logAction(name, args);\n if (callback) {\n return callback(...args) as ReturnType<T>;\n }\n return undefined;\n };\n },\n [logAction]\n );\n\n const wrapCallbacks = useCallback(\n (callbacks: Record<string, ((...args: unknown[]) => unknown) | undefined>) => {\n const wrapped: Record<string, (...args: unknown[]) => unknown> = {};\n for (const [name, callback] of Object.entries(callbacks)) {\n wrapped[name] = wrapCallback(name, callback);\n }\n return wrapped;\n },\n [wrapCallback]\n );\n\n return {\n logs,\n logAction,\n clearLogs,\n wrapCallback,\n wrapCallbacks,\n };\n}\n\n/**\n * Format a value for display in the actions panel\n */\nexport function formatActionArg(value: unknown, maxLength = 100): string {\n if (value === undefined) return \"undefined\";\n if (value === null) return \"null\";\n if (typeof value === \"function\") return \"Ę()\";\n if (typeof value === \"symbol\") return value.toString();\n\n if (value instanceof Event) {\n return `${value.constructor.name} { type: \"${value.type}\" }`;\n }\n\n if (value instanceof Element) {\n const tag = value.tagName.toLowerCase();\n const id = value.id ? `#${value.id}` : \"\";\n const className = value.className ? `.${value.className.split(\" \")[0]}` : \"\";\n return `<${tag}${id}${className}>`;\n }\n\n try {\n const str = JSON.stringify(value, null, 2);\n if (str.length > maxLength) {\n return str.slice(0, maxLength) + \"...\";\n }\n return str;\n } catch {\n return String(value);\n }\n}\n","/**\n * Action Export Utilities\n *\n * Generate test assertions from recorded user interactions.\n * Supports multiple export formats: JSON, Jest, Playwright\n */\n\nimport type { ActionLog } from '../hooks/useActions.js';\n\nexport type ExportFormat = 'json' | 'jest' | 'playwright';\n\nexport interface ExportOptions {\n /** Component name for generated test */\n componentName?: string;\n /** Variant name for generated test */\n variantName?: string;\n /** Include timestamps in export */\n includeTimestamps?: boolean;\n /** Include event details in comments */\n includeComments?: boolean;\n}\n\n/**\n * Export actions as JSON\n */\nexport function exportActionsAsJson(\n logs: ActionLog[],\n options: ExportOptions = {}\n): string {\n const { includeTimestamps = false } = options;\n\n const exportData = logs.map((log) => ({\n action: log.name,\n args: serializeArgs(log.args),\n count: log.count > 1 ? log.count : undefined,\n timestamp: includeTimestamps ? log.timestamp : undefined,\n }));\n\n return JSON.stringify(exportData, null, 2);\n}\n\n/**\n * Export actions as Jest test assertions\n */\nexport function exportActionsAsJest(\n logs: ActionLog[],\n options: ExportOptions = {}\n): string {\n const {\n componentName = 'Component',\n variantName = 'Default',\n includeComments = true,\n } = options;\n\n const lines: string[] = [];\n\n // Import statements\n lines.push(\"import { render, screen, fireEvent } from '@testing-library/react';\");\n lines.push(\"import userEvent from '@testing-library/user-event';\");\n lines.push(`import { ${componentName} } from './${componentName}';`);\n lines.push('');\n\n // Test block\n lines.push(`describe('${componentName}', () => {`);\n lines.push(` it('${variantName} - recorded interactions', async () => {`);\n lines.push(' const user = userEvent.setup();');\n lines.push('');\n\n // Mock handlers\n const actionNames = [...new Set(logs.map((l) => l.name))];\n for (const name of actionNames) {\n const handlerName = `mock${capitalize(name)}`;\n lines.push(` const ${handlerName} = jest.fn();`);\n }\n lines.push('');\n\n // Render\n lines.push(` render(`);\n lines.push(` <${componentName}`);\n for (const name of actionNames) {\n lines.push(` ${name}={mock${capitalize(name)}}`);\n }\n lines.push(` />`);\n lines.push(` );`);\n lines.push('');\n\n // Assertions for each action\n if (includeComments) {\n lines.push(' // Recorded interactions:');\n }\n\n for (const log of logs) {\n const handlerName = `mock${capitalize(log.name)}`;\n\n if (includeComments && log.args.length > 0) {\n lines.push(` // ${log.name} called with: ${summarizeArgs(log.args)}`);\n }\n\n if (log.count > 1) {\n lines.push(` expect(${handlerName}).toHaveBeenCalledTimes(${log.count});`);\n } else {\n const serializedArgs = serializeArgsForJest(log.args);\n if (serializedArgs.length > 0) {\n lines.push(` expect(${handlerName}).toHaveBeenCalledWith(${serializedArgs});`);\n } else {\n lines.push(` expect(${handlerName}).toHaveBeenCalled();`);\n }\n }\n }\n\n lines.push(' });');\n lines.push('});');\n\n return lines.join('\\n');\n}\n\n/**\n * Export actions as Playwright test assertions\n */\nexport function exportActionsAsPlaywright(\n logs: ActionLog[],\n options: ExportOptions = {}\n): string {\n const {\n componentName = 'Component',\n variantName = 'Default',\n includeComments = true,\n } = options;\n\n const lines: string[] = [];\n\n // Import statements\n lines.push(\"import { test, expect } from '@playwright/test';\");\n lines.push('');\n\n // Test block\n lines.push(`test('${componentName} - ${variantName}', async ({ page }) => {`);\n lines.push(` // Navigate to component`);\n lines.push(` await page.goto('/?component=${encodeURIComponent(componentName)}&variant=${encodeURIComponent(variantName)}');`);\n lines.push('');\n lines.push(` // Wait for component to render`);\n lines.push(` await page.waitForSelector('[data-preview-container=\"true\"]');`);\n lines.push('');\n\n if (includeComments) {\n lines.push(' // Recorded interactions:');\n }\n\n // Generate interaction replay\n for (const log of logs) {\n if (includeComments) {\n lines.push(` // ${log.name}${log.count > 1 ? ` (Ć${log.count})` : ''}: ${summarizeArgs(log.args)}`);\n }\n\n // Generate appropriate Playwright command based on action type\n const playwrightCode = generatePlaywrightAction(log);\n if (playwrightCode) {\n lines.push(` ${playwrightCode}`);\n }\n }\n\n lines.push('');\n lines.push(' // Add assertions here based on expected state changes');\n lines.push(' // Example: await expect(page.getByRole(\"button\")).toBeDisabled();');\n\n lines.push('});');\n\n return lines.join('\\n');\n}\n\n/**\n * Export actions in specified format\n */\nexport function exportActions(\n logs: ActionLog[],\n format: ExportFormat,\n options: ExportOptions = {}\n): string {\n switch (format) {\n case 'json':\n return exportActionsAsJson(logs, options);\n case 'jest':\n return exportActionsAsJest(logs, options);\n case 'playwright':\n return exportActionsAsPlaywright(logs, options);\n default:\n throw new Error(`Unknown export format: ${format}`);\n }\n}\n\n/**\n * Copy text to clipboard\n */\nexport async function copyToClipboard(text: string): Promise<boolean> {\n try {\n await navigator.clipboard.writeText(text);\n return true;\n } catch {\n // Fallback for older browsers\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n document.body.appendChild(textarea);\n textarea.select();\n try {\n document.execCommand('copy');\n return true;\n } catch {\n return false;\n } finally {\n document.body.removeChild(textarea);\n }\n }\n}\n\n/**\n * Download text as a file\n */\nexport function downloadAsFile(content: string, filename: string): void {\n const blob = new Blob([content], { type: 'text/plain' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n}\n\n/**\n * Get file extension for export format\n */\nexport function getFileExtension(format: ExportFormat): string {\n switch (format) {\n case 'json':\n return '.json';\n case 'jest':\n return '.test.tsx';\n case 'playwright':\n return '.spec.ts';\n default:\n return '.txt';\n }\n}\n\n// Helper functions\n\nfunction capitalize(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\nfunction serializeArgs(args: unknown[]): unknown[] {\n return args.map((arg) => {\n if (arg instanceof Event) {\n return {\n __type: 'Event',\n type: arg.type,\n target: arg.target instanceof Element ? describeElement(arg.target) : null,\n };\n }\n if (arg instanceof Element) {\n return {\n __type: 'Element',\n ...describeElement(arg),\n };\n }\n if (typeof arg === 'function') {\n return { __type: 'function' };\n }\n return arg;\n });\n}\n\nfunction describeElement(el: Element): object {\n return {\n tagName: el.tagName.toLowerCase(),\n id: el.id || undefined,\n className: el.className || undefined,\n textContent: el.textContent?.slice(0, 50) || undefined,\n };\n}\n\nfunction serializeArgsForJest(args: unknown[]): string {\n if (args.length === 0) return '';\n\n const parts: string[] = [];\n for (const arg of args) {\n if (arg instanceof Event) {\n parts.push('expect.any(Event)');\n } else if (arg instanceof Element) {\n parts.push('expect.any(HTMLElement)');\n } else if (typeof arg === 'function') {\n parts.push('expect.any(Function)');\n } else if (typeof arg === 'object' && arg !== null) {\n parts.push(`expect.objectContaining(${JSON.stringify(arg)})`);\n } else {\n parts.push(JSON.stringify(arg));\n }\n }\n return parts.join(', ');\n}\n\nfunction summarizeArgs(args: unknown[]): string {\n if (args.length === 0) return '(no args)';\n\n const summaries = args.map((arg) => {\n if (arg instanceof Event) {\n return `${arg.type} event`;\n }\n if (arg instanceof Element) {\n return `<${arg.tagName.toLowerCase()}>`;\n }\n if (typeof arg === 'function') {\n return 'Ę()';\n }\n if (typeof arg === 'object' && arg !== null) {\n return '{...}';\n }\n return JSON.stringify(arg);\n });\n\n return summaries.join(', ');\n}\n\nfunction generatePlaywrightAction(log: ActionLog): string | null {\n const name = log.name.toLowerCase();\n\n // Common click handlers\n if (name.includes('click') || name === 'onpress') {\n return \"await page.getByRole('button').click(); // Adjust selector as needed\";\n }\n\n // Change handlers\n if (name.includes('change')) {\n const value = log.args[0];\n if (typeof value === 'string') {\n return `await page.getByRole('textbox').fill(${JSON.stringify(value)});`;\n }\n return \"await page.getByRole('textbox').fill('...'); // Add value\";\n }\n\n // Submit handlers\n if (name.includes('submit')) {\n return \"await page.getByRole('button', { name: 'Submit' }).click();\";\n }\n\n // Focus/blur handlers\n if (name.includes('focus')) {\n return \"await page.getByRole('textbox').focus();\";\n }\n if (name.includes('blur')) {\n return \"await page.getByRole('textbox').blur();\";\n }\n\n // Mouse events\n if (name.includes('mouseenter') || name.includes('mouseover')) {\n return \"await page.getByRole('button').hover();\";\n }\n\n // Keyboard events\n if (name.includes('keydown') || name.includes('keyup') || name.includes('keypress')) {\n const event = log.args[0] as { key?: string } | undefined;\n if (event?.key) {\n return `await page.keyboard.press(${JSON.stringify(event.key)});`;\n }\n }\n\n // Default: add as comment\n return `// ${log.name}: ${summarizeArgs(log.args)}`;\n}\n","/**\n * Component Graph Panel - Visualizes component relationships\n *\n * Displays a visual graph showing:\n * - The current component in the center\n * - Related components (parent, child, sibling, alternative, composition)\n * - Auto-detected relationships from render analysis\n * - Click to navigate to related components\n */\n\nimport { useMemo, useState } from \"react\";\nimport clsx from \"clsx\";\nimport type { SegmentDefinition, ComponentRelation, RelationshipType } from \"../../core/index.js\";\nimport { ChevronRightIcon, EmptyIcon, WandIcon } from \"./Icons.js\";\nimport { detectAllRelationships, mergeRelationships } from \"../utils/detectRelationships.js\";\n\ninterface ComponentGraphProps {\n /** Current segment definition */\n segment: SegmentDefinition | null;\n /** All available segments for navigation */\n allSegments: Array<{ path: string; segment: SegmentDefinition }>;\n /** Callback when a component is clicked */\n onNavigate?: (componentName: string) => void;\n}\n\nconst RELATIONSHIP_CONFIG: Record<RelationshipType, { label: string; color: string; bgColor: string; icon: string }> = {\n parent: {\n label: \"Parent\",\n color: \"text-purple-600 dark:text-purple-400\",\n bgColor: \"bg-purple-100 dark:bg-purple-900/30\",\n icon: \"^\",\n },\n child: {\n label: \"Child\",\n color: \"text-blue-600 dark:text-blue-400\",\n bgColor: \"bg-blue-100 dark:bg-blue-900/30\",\n icon: \"v\",\n },\n sibling: {\n label: \"Sibling\",\n color: \"text-green-600 dark:text-green-400\",\n bgColor: \"bg-green-100 dark:bg-green-900/30\",\n icon: \"<->\",\n },\n alternative: {\n label: \"Alternative\",\n color: \"text-amber-600 dark:text-amber-400\",\n bgColor: \"bg-amber-100 dark:bg-amber-900/30\",\n icon: \"~\",\n },\n composition: {\n label: \"Composition\",\n color: \"text-cyan-600 dark:text-cyan-400\",\n bgColor: \"bg-cyan-100 dark:bg-cyan-900/30\",\n icon: \"+\",\n },\n};\n\nexport function ComponentGraph({ segment, allSegments, onNavigate }: ComponentGraphProps) {\n const [showAutoDetected, setShowAutoDetected] = useState(true);\n\n // Auto-detect relationships\n const detectedRelationships = useMemo(() => {\n if (!segment) return [];\n try {\n return detectAllRelationships(segment, allSegments);\n } catch {\n return [];\n }\n }, [segment, allSegments]);\n\n // Merge manual and detected relationships\n const allRelationships = useMemo(() => {\n if (!segment) return [];\n return mergeRelationships(segment.relations, showAutoDetected ? detectedRelationships : []);\n }, [segment, detectedRelationships, showAutoDetected]);\n\n // Group relations by type\n const groupedRelations = useMemo(() => {\n if (allRelationships.length === 0) return null;\n\n const groups: Record<RelationshipType, Array<ComponentRelation & { isDetected?: boolean; confidence?: number }>> = {\n parent: [],\n child: [],\n sibling: [],\n alternative: [],\n composition: [],\n };\n\n for (const relation of allRelationships) {\n groups[relation.relationship].push(relation);\n }\n\n return groups;\n }, [allRelationships]);\n\n // Find reverse relations (components that reference this one)\n const reverseRelations = useMemo(() => {\n if (!segment) return [];\n\n const componentName = segment.meta.name;\n const reverse: Array<{ segment: SegmentDefinition; relation: ComponentRelation }> = [];\n\n for (const { segment: otherSegment } of allSegments) {\n if (otherSegment.meta.name === componentName) continue;\n if (!otherSegment.relations) continue;\n\n for (const relation of otherSegment.relations) {\n if (relation.component === componentName) {\n reverse.push({\n segment: otherSegment,\n relation: {\n ...relation,\n component: otherSegment.meta.name,\n // Flip the relationship direction for display\n relationship: flipRelationship(relation.relationship),\n },\n });\n }\n }\n }\n\n return reverse;\n }, [segment, allSegments]);\n\n // Check if a component exists in our segments\n const componentExists = (name: string) => {\n return allSegments.some(s => s.segment.meta.name === name);\n };\n\n const handleNavigate = (componentName: string) => {\n if (componentExists(componentName) && onNavigate) {\n onNavigate(componentName);\n }\n };\n\n // No segment selected\n if (!segment) {\n return (\n <div className=\"h-full flex flex-col\">\n <div className=\"p-4 border-b border-gray-200 dark:border-gray-700\">\n <h3 className=\"font-medium text-gray-900 dark:text-gray-100 flex items-center gap-2\">\n Component Graph\n </h3>\n </div>\n <div className=\"flex-1 flex items-center justify-center p-8 text-center\">\n <div className=\"max-w-md\">\n <div className=\"w-12 h-12 rounded-full bg-gray-100 dark:bg-gray-800 flex items-center justify-center mx-auto mb-4\">\n <EmptyIcon className=\"w-6 h-6 text-gray-400\" />\n </div>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n Select a component to view its relationships\n </p>\n </div>\n </div>\n </div>\n );\n }\n\n const hasRelations = (groupedRelations && Object.values(groupedRelations).some(g => g.length > 0)) || reverseRelations.length > 0;\n const detectedCount = detectedRelationships.length;\n\n // No relations defined\n if (!hasRelations) {\n return (\n <div className=\"h-full flex flex-col\">\n <div className=\"p-4 border-b border-gray-200 dark:border-gray-700\">\n <h3 className=\"font-medium text-gray-900 dark:text-gray-100 flex items-center gap-2\">\n Component Graph\n </h3>\n </div>\n <div className=\"flex-1 flex items-center justify-center p-8 text-center\">\n <div className=\"max-w-md\">\n <div className=\"w-12 h-12 rounded-full bg-gray-100 dark:bg-gray-800 flex items-center justify-center mx-auto mb-4\">\n <EmptyIcon className=\"w-6 h-6 text-gray-400\" />\n </div>\n <h4 className=\"font-medium text-gray-700 dark:text-gray-300 mb-2\">\n No relationships defined\n </h4>\n <p className=\"text-sm text-gray-500 dark:text-gray-400\">\n This component doesn't have any defined relationships. Add a <code className=\"px-1 py-0.5 bg-gray-100 dark:bg-gray-800 rounded text-xs\">relations</code> array to your segment definition to visualize component connections.\n </p>\n <div className=\"mt-4 p-3 bg-gray-50 dark:bg-gray-800/50 rounded-lg text-left\">\n <pre className=\"text-xs text-gray-600 dark:text-gray-400 overflow-x-auto\">\n{`relations: [\n {\n component: \"ButtonGroup\",\n relationship: \"parent\",\n note: \"Use ButtonGroup for multiple buttons\"\n },\n {\n component: \"IconButton\",\n relationship: \"alternative\",\n note: \"Use when only an icon is needed\"\n }\n]`}\n </pre>\n </div>\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"h-full flex flex-col\">\n {/* Header */}\n <div className=\"p-4 border-b border-gray-200 dark:border-gray-700\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"font-medium text-gray-900 dark:text-gray-100 flex items-center gap-2\">\n Component Graph\n </h3>\n {detectedCount > 0 && (\n <button\n onClick={() => setShowAutoDetected(!showAutoDetected)}\n className={clsx(\n \"flex items-center gap-1.5 px-2 py-1 rounded text-xs font-medium transition-colors\",\n showAutoDetected\n ? \"bg-purple-100 dark:bg-purple-900/30 text-purple-700 dark:text-purple-300\"\n : \"text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200\"\n )}\n title={showAutoDetected ? \"Hide composition relationships detected from variants\" : \"Show composition relationships detected from variants\"}\n >\n <WandIcon className=\"w-3.5 h-3.5\" />\n {showAutoDetected ? \"Composition on\" : \"Composition off\"}\n </button>\n )}\n </div>\n <p className=\"text-xs text-gray-500 dark:text-gray-400 mt-1\">\n Relationships for <span className=\"font-medium\">{segment.meta.name}</span>\n {showAutoDetected && detectedCount > 0 && (\n <span className=\"ml-1\">\n ({detectedCount} from variants)\n </span>\n )}\n </p>\n </div>\n\n {/* Graph visualization */}\n <div className=\"flex-1 overflow-y-auto p-4\">\n {/* Defined relations */}\n {groupedRelations && (\n <div className=\"space-y-4\">\n {(Object.entries(groupedRelations) as [RelationshipType, ComponentRelation[]][]).map(\n ([type, relations]) => {\n if (relations.length === 0) return null;\n const config = RELATIONSHIP_CONFIG[type];\n\n return (\n <div key={type}>\n <div className=\"flex items-center gap-2 mb-2\">\n <span className={clsx(\"text-xs font-medium uppercase tracking-wide\", config.color)}>\n {config.label}\n </span>\n <div className=\"flex-1 h-px bg-gray-200 dark:bg-gray-700\" />\n </div>\n <div className=\"space-y-2\">\n {relations.map((relation, index) => (\n <RelationCard\n key={`${relation.component}-${index}`}\n relation={relation}\n config={config}\n exists={componentExists(relation.component)}\n onNavigate={handleNavigate}\n />\n ))}\n </div>\n </div>\n );\n }\n )}\n </div>\n )}\n\n {/* Reverse relations (inbound references) */}\n {reverseRelations.length > 0 && (\n <div className=\"mt-6\">\n <div className=\"flex items-center gap-2 mb-2\">\n <span className=\"text-xs font-medium uppercase tracking-wide text-gray-500 dark:text-gray-400\">\n Referenced By\n </span>\n <div className=\"flex-1 h-px bg-gray-200 dark:bg-gray-700\" />\n </div>\n <div className=\"space-y-2\">\n {reverseRelations.map(({ relation }, index) => {\n const config = RELATIONSHIP_CONFIG[relation.relationship];\n return (\n <RelationCard\n key={`reverse-${relation.component}-${index}`}\n relation={relation}\n config={config}\n exists={componentExists(relation.component)}\n onNavigate={handleNavigate}\n isReverse\n />\n );\n })}\n </div>\n </div>\n )}\n\n {/* Legend */}\n <div className=\"mt-8 pt-4 border-t border-gray-200 dark:border-gray-700\">\n <div className=\"text-xs font-medium text-gray-500 dark:text-gray-400 mb-2\">Legend</div>\n <div className=\"grid grid-cols-2 gap-2\">\n {(Object.entries(RELATIONSHIP_CONFIG) as [RelationshipType, typeof RELATIONSHIP_CONFIG[RelationshipType]][]).map(\n ([type, config]) => (\n <div key={type} className=\"flex items-center gap-2\">\n <span className={clsx(\"w-2 h-2 rounded-full\", config.bgColor, config.color)} />\n <span className=\"text-xs text-gray-600 dark:text-gray-400\">{config.label}</span>\n </div>\n )\n )}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\ninterface RelationCardProps {\n relation: ComponentRelation & { isDetected?: boolean; confidence?: number };\n config: typeof RELATIONSHIP_CONFIG[RelationshipType];\n exists: boolean;\n onNavigate: (name: string) => void;\n isReverse?: boolean;\n}\n\nfunction RelationCard({ relation, config, exists, onNavigate, isReverse }: RelationCardProps) {\n return (\n <button\n onClick={() => exists && onNavigate(relation.component)}\n disabled={!exists}\n className={clsx(\n \"w-full text-left p-3 rounded-lg border transition-[transform,box-shadow] duration-150\",\n config.bgColor,\n exists\n ? \"cursor-pointer hover:shadow-md hover:scale-[1.01] border-transparent\"\n : \"cursor-not-allowed opacity-60 border-dashed border-gray-300 dark:border-gray-600\"\n )}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n <span className={clsx(\"font-medium text-sm\", config.color)}>\n {relation.component}\n </span>\n {relation.isDetected && (\n <span className=\"flex items-center gap-0.5 text-[10px] uppercase tracking-wide text-purple-600 dark:text-purple-400 bg-purple-100 dark:bg-purple-900/30 px-1.5 py-0.5 rounded\">\n <WandIcon className=\"w-2.5 h-2.5\" />\n auto\n </span>\n )}\n {isReverse && (\n <span className=\"text-[10px] uppercase tracking-wide text-gray-500 dark:text-gray-400 bg-gray-200 dark:bg-gray-700 px-1.5 py-0.5 rounded\">\n inbound\n </span>\n )}\n {!exists && (\n <span className=\"text-[10px] uppercase tracking-wide text-gray-500 dark:text-gray-400\">\n (not found)\n </span>\n )}\n </div>\n {exists && (\n <ChevronRightIcon className=\"w-4 h-4 text-gray-400\" />\n )}\n </div>\n {relation.note && (\n <p className=\"text-xs text-gray-600 dark:text-gray-400 mt-1\">\n {relation.note}\n </p>\n )}\n </button>\n );\n}\n\n/**\n * Flip a relationship for reverse display.\n * e.g., if Button has child: IconButton, then IconButton sees Button as parent\n */\nfunction flipRelationship(type: RelationshipType): RelationshipType {\n switch (type) {\n case \"parent\":\n return \"child\";\n case \"child\":\n return \"parent\";\n case \"sibling\":\n return \"sibling\";\n case \"alternative\":\n return \"alternative\";\n case \"composition\":\n return \"composition\";\n }\n}\n","// @ts-nocheck\n/**\n * Auto-detect component relationships from rendered elements\n *\n * Analyzes React elements to discover:\n * - Composition relationships (components used within other components)\n * - Sibling relationships (components in the same category)\n * - Common usage patterns\n */\n\nimport { isValidElement, type ReactNode, type ReactElement, Children } from \"react\";\nimport type { SegmentDefinition, ComponentRelation, RelationshipType } from \"../../core/index.js\";\n\ninterface DetectedRelationship {\n component: string;\n relationship: RelationshipType;\n note: string;\n confidence: number; // 0-1, how confident we are in this relationship\n}\n\n// Cache for relationship detection to avoid repeated expensive render() calls\nconst relationshipCache = new Map<string, { timestamp: number; relationships: DetectedRelationship[] }>();\nconst CACHE_TTL = 60000; // 1 minute cache\n\n// Cache for known component names (expensive to recompute for 98+ components)\nlet knownComponentsCache: { count: number; set: Set<string> } | null = null;\n\n/**\n * Extract component name from a React element\n */\nfunction getComponentName(element: ReactElement): string | null {\n const type = element.type;\n\n if (typeof type === \"string\") {\n // HTML element, not a component\n return null;\n }\n\n if (typeof type === \"function\") {\n // Function component or class component\n return type.displayName || type.name || null;\n }\n\n if (typeof type === \"object\" && type !== null) {\n // Could be forwardRef, memo, etc.\n const innerType = (type as { $$typeof?: symbol; type?: unknown; render?: unknown })?.type ||\n (type as { render?: unknown })?.render;\n if (typeof innerType === \"function\") {\n return (innerType as { displayName?: string; name?: string }).displayName ||\n (innerType as { name?: string }).name || null;\n }\n }\n\n return null;\n}\n\n/**\n * Recursively collect all component names from an element tree\n */\nfunction collectComponentNames(\n element: ReactNode,\n collected: Set<string> = new Set()\n): Set<string> {\n if (!isValidElement(element)) {\n return collected;\n }\n\n const name = getComponentName(element as ReactElement);\n if (name) {\n collected.add(name);\n }\n\n // Traverse children\n const children = (element.props as { children?: ReactNode })?.children;\n if (children) {\n Children.forEach(children, (child) => {\n collectComponentNames(child, collected);\n });\n }\n\n return collected;\n}\n\n/**\n * Get cached set of known component names\n */\nfunction getKnownComponents(\n allSegments: Array<{ path: string; segment: SegmentDefinition }>\n): Set<string> {\n // Invalidate cache if segment count changed\n if (!knownComponentsCache || knownComponentsCache.count !== allSegments.length) {\n knownComponentsCache = {\n count: allSegments.length,\n set: new Set(allSegments.map(s => s.segment.meta.name)),\n };\n }\n return knownComponentsCache.set;\n}\n\n/**\n * Detect composition relationships from a segment's variants\n */\nexport function detectCompositionRelationships(\n segment: SegmentDefinition,\n allSegments: Array<{ path: string; segment: SegmentDefinition }>\n): DetectedRelationship[] {\n const relationships: DetectedRelationship[] = [];\n const componentName = segment.meta.name;\n const knownComponents = getKnownComponents(allSegments);\n const usedComponents = new Set<string>();\n\n // Analyze each variant's render output\n for (const variant of segment.variants || []) {\n try {\n const rendered = variant.render();\n const componentNames = collectComponentNames(rendered);\n\n for (const name of componentNames) {\n if (name !== componentName && knownComponents.has(name)) {\n usedComponents.add(name);\n }\n }\n } catch {\n // Render might fail, skip this variant\n }\n }\n\n // Create composition relationships for used components\n for (const usedComponent of usedComponents) {\n relationships.push({\n component: usedComponent,\n relationship: \"composition\",\n note: `Used within ${componentName} variants`,\n confidence: 0.8,\n });\n }\n\n return relationships;\n}\n\n/**\n * Detect sibling relationships based on semantic connections.\n *\n * NOTE: Category-based sibling detection was removed because it creates\n * meaningless relationships (e.g., Card ā Separator just because both are \"layout\").\n *\n * True sibling relationships should be defined manually in the fragment definition\n * based on actual use cases (e.g., Table uses Badge for status columns).\n *\n * This function now only detects siblings when:\n * - There's a bidirectional manual relationship (A references B AND B references A)\n * - Components share overlapping variant patterns (future enhancement)\n */\nexport function detectSiblingRelationships(\n _segment: SegmentDefinition,\n _allSegments: Array<{ path: string; segment: SegmentDefinition }>\n): DetectedRelationship[] {\n // Disabled: Category-based sibling detection creates noise\n // Meaningful sibling relationships should be defined manually\n return [];\n}\n\n/**\n * Detect alternative relationships.\n *\n * NOTE: Pattern-based alternative detection was removed because it creates\n * weak relationships based on naming conventions rather than actual use cases.\n *\n * True alternative relationships should be defined manually in the fragment\n * definition based on actual decision criteria (e.g., \"Use IconButton instead\n * of Button when only an icon is needed\").\n *\n * A better approach would analyze the `whenNot` guidelines for semantic matches,\n * but that requires NLP/semantic analysis which is out of scope.\n */\nexport function detectAlternativeRelationships(\n _segment: SegmentDefinition,\n _allSegments: Array<{ path: string; segment: SegmentDefinition }>\n): DetectedRelationship[] {\n // Disabled: Pattern-based alternative detection is too weak\n // Meaningful alternatives should be defined manually with clear rationale\n return [];\n}\n\n/**\n * Combine all detected relationships and deduplicate\n * Uses caching to avoid expensive render() calls on subsequent views\n */\nexport function detectAllRelationships(\n segment: SegmentDefinition,\n allSegments: Array<{ path: string; segment: SegmentDefinition }>\n): DetectedRelationship[] {\n const cacheKey = segment.meta.name;\n const now = Date.now();\n\n // Check cache first\n const cached = relationshipCache.get(cacheKey);\n if (cached && (now - cached.timestamp) < CACHE_TTL) {\n return cached.relationships;\n }\n\n const all = [\n ...detectCompositionRelationships(segment, allSegments),\n ...detectSiblingRelationships(segment, allSegments),\n ...detectAlternativeRelationships(segment, allSegments),\n ];\n\n // Deduplicate by component name, keeping highest confidence\n const byComponent = new Map<string, DetectedRelationship>();\n\n for (const rel of all) {\n const existing = byComponent.get(rel.component);\n if (!existing || rel.confidence > existing.confidence) {\n byComponent.set(rel.component, rel);\n }\n }\n\n // Sort by confidence descending\n const result = Array.from(byComponent.values()).sort((a, b) => b.confidence - a.confidence);\n\n // Cache the result\n relationshipCache.set(cacheKey, { timestamp: now, relationships: result });\n\n return result;\n}\n\n/**\n * Merge manual and auto-detected relationships\n */\nexport function mergeRelationships(\n manual: ComponentRelation[] | undefined,\n detected: DetectedRelationship[]\n): Array<ComponentRelation & { isDetected?: boolean; confidence?: number }> {\n const result: Array<ComponentRelation & { isDetected?: boolean; confidence?: number }> = [];\n const manualComponents = new Set((manual || []).map(r => r.component));\n\n // Add manual relationships first\n for (const rel of manual || []) {\n result.push({ ...rel, isDetected: false });\n }\n\n // Add detected relationships that aren't already defined manually\n for (const rel of detected) {\n if (!manualComponents.has(rel.component)) {\n result.push({\n component: rel.component,\n relationship: rel.relationship,\n note: rel.note,\n isDetected: true,\n confidence: rel.confidence,\n });\n }\n }\n\n return result;\n}\n","/**\n * ContractPanel component - displays SegmentContract metadata for AI agents.\n * Shows propsSummary, scenarioTags, bans, and a11yRules.\n */\n\nimport { memo } from 'react';\nimport type { SegmentContract } from '../../core/index.js';\n\ninterface ContractPanelProps {\n contract?: SegmentContract;\n componentName: string;\n}\n\nexport const ContractPanel = memo(function ContractPanel({\n contract,\n componentName,\n}: ContractPanelProps) {\n // Empty state when no contract metadata\n if (!contract || isContractEmpty(contract)) {\n return (\n <div className=\"p-6 text-center\">\n <div className=\"text-tertiary mb-4\">\n <svg\n className=\"w-12 h-12 mx-auto mb-4 opacity-50\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={1.5}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n <p className=\"text-sm font-medium\">No contract metadata</p>\n </div>\n <p className=\"text-xs text-quaternary mb-4\">\n Add a <code className=\"bg-[--bg-hover] px-1 py-0.5 rounded\">contract</code> field to the segment definition to enable AI agent features.\n </p>\n <div className=\"text-left bg-[--bg-hover] rounded-lg p-4 text-xs font-mono\">\n <pre className=\"text-quaternary\">{`contract: {\n propsSummary: ['variant: primary|secondary'],\n scenarioTags: ['form.submit', 'action.primary'],\n a11yRules: ['A11Y_BTN_LABEL'],\n}`}</pre>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"p-4 space-y-6 text-sm\">\n {/* Props Summary */}\n {contract.propsSummary && contract.propsSummary.length > 0 && (\n <Section title=\"Props Summary\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-xs border-collapse\">\n <thead>\n <tr className=\"border-b border-[--border]\">\n <th className=\"text-left py-2 pr-4 font-medium text-tertiary\">Name</th>\n <th className=\"text-left py-2 pr-4 font-medium text-tertiary\">Type</th>\n <th className=\"text-left py-2 font-medium text-tertiary\">Description</th>\n </tr>\n </thead>\n <tbody>\n {contract.propsSummary.map((prop, i) => {\n const parsed = parsePropSummary(prop);\n return (\n <tr key={i} className=\"border-b border-[--border-subtle] last:border-b-0\">\n <td className=\"py-2 pr-4 align-top\">\n <code className=\"text-xs font-medium text-primary\">{parsed.name}</code>\n </td>\n <td className=\"py-2 pr-4 align-top\">\n <code className=\"text-xs text-purple-600 dark:text-purple-400\">{parsed.type}</code>\n </td>\n <td className=\"py-2 align-top text-secondary\">{parsed.description}</td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </Section>\n )}\n\n {/* Scenario Tags */}\n {contract.scenarioTags && contract.scenarioTags.length > 0 && (\n <Section title=\"Scenario Tags\" subtitle=\"Used by fragments_suggest for AI queries\">\n <div className=\"flex flex-wrap gap-2\">\n {contract.scenarioTags.map((tag, i) => (\n <span\n key={i}\n className=\"inline-flex items-center px-2.5 py-1 rounded-full text-xs font-medium bg-blue-500/10 text-blue-500 border border-blue-500/20\"\n >\n {tag}\n </span>\n ))}\n </div>\n </Section>\n )}\n\n {/* Accessibility Rules */}\n {contract.a11yRules && contract.a11yRules.length > 0 && (\n <Section title=\"Accessibility Rules\">\n <div className=\"space-y-2\">\n {contract.a11yRules.map((rule, i) => (\n <div\n key={i}\n className=\"flex items-center gap-2 p-2 bg-[--bg-hover] rounded\"\n >\n <span className=\"text-green-500\">\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n </span>\n <code className=\"text-xs text-secondary\">{rule}</code>\n </div>\n ))}\n </div>\n </Section>\n )}\n\n {/* Bans */}\n {contract.bans && contract.bans.length > 0 && (\n <Section title=\"Usage Bans\" subtitle=\"Patterns to avoid\">\n <div className=\"space-y-2\">\n {contract.bans.map((ban, i) => (\n <div\n key={i}\n className=\"p-3 bg-amber-500/10 border border-amber-500/20 rounded\"\n >\n <div className=\"flex items-center gap-2 mb-1\">\n <span className=\"text-amber-500\">\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\n </svg>\n </span>\n <code className=\"text-xs text-amber-600 dark:text-amber-400\">\n {ban.pattern}\n </code>\n </div>\n <p className=\"text-xs text-tertiary pl-6\">{ban.message}</p>\n </div>\n ))}\n </div>\n </Section>\n )}\n\n {/* Empty sections message */}\n {isPartialContract(contract) && (\n <div className=\"text-xs text-quaternary p-3 bg-[--bg-hover] rounded\">\n Tip: Add more contract fields to help AI agents better understand this component.\n </div>\n )}\n </div>\n );\n});\n\n// Helper component for consistent section styling\ninterface SectionProps {\n title: string;\n subtitle?: string;\n children: React.ReactNode;\n}\n\nfunction Section({ title, subtitle, children }: SectionProps) {\n return (\n <div>\n <h3 className=\"text-xs font-semibold text-primary mb-2 flex items-center gap-2\">\n {title}\n {subtitle && (\n <span className=\"font-normal text-quaternary\">({subtitle})</span>\n )}\n </h3>\n {children}\n </div>\n );\n}\n\n// Check if contract is empty or has no meaningful content\nfunction isContractEmpty(contract: SegmentContract): boolean {\n return (\n (!contract.propsSummary || contract.propsSummary.length === 0) &&\n (!contract.scenarioTags || contract.scenarioTags.length === 0) &&\n (!contract.a11yRules || contract.a11yRules.length === 0) &&\n (!contract.bans || contract.bans.length === 0)\n );\n}\n\n// Check if contract has some but not all fields\nfunction isPartialContract(contract: SegmentContract): boolean {\n const fieldCount = [\n contract.propsSummary?.length ?? 0,\n contract.scenarioTags?.length ?? 0,\n contract.a11yRules?.length ?? 0,\n contract.bans?.length ?? 0,\n ].filter(n => n > 0).length;\n\n return fieldCount > 0 && fieldCount < 3;\n}\n\n// Parse a prop summary string like \"name: type - description\" or \"name: type (default: value)\"\nfunction parsePropSummary(prop: string): { name: string; type: string; description: string } {\n // Try to match \"name: type - description\" format\n const colonIndex = prop.indexOf(':');\n if (colonIndex === -1) {\n return { name: prop, type: '', description: '' };\n }\n\n const name = prop.slice(0, colonIndex).trim();\n const rest = prop.slice(colonIndex + 1).trim();\n\n // Check for \" - description\" pattern\n const dashIndex = rest.indexOf(' - ');\n if (dashIndex !== -1) {\n const type = rest.slice(0, dashIndex).trim();\n const description = rest.slice(dashIndex + 3).trim();\n return { name, type, description };\n }\n\n // Check for \"(default: value)\" or \"(default: value) description\" pattern\n const defaultMatch = rest.match(/^([^(]+)(\\(default:\\s*[^)]+\\))(.*)$/);\n if (defaultMatch) {\n const type = defaultMatch[1].trim();\n const defaultInfo = defaultMatch[2];\n const extraDesc = defaultMatch[3].trim();\n const description = extraDesc ? `${defaultInfo} ${extraDesc}` : defaultInfo;\n return { name, type, description };\n }\n\n // Just type, no description\n return { name, type: rest, description: '' };\n}\n","import { useMemo, useEffect, useState } from \"react\";\nimport type { SegmentDefinition } from \"../../core/index.js\";\nimport { VariantRenderer } from \"./VariantRenderer.js\";\nimport { getBackgroundStyle, type BackgroundOption, type ZoomLevel } from \"./PreviewToolbar.js\";\n\ninterface IsolatedRenderProps {\n segments: Array<{ path: string; segment: SegmentDefinition }>;\n}\n\n/**\n * Isolated render component for screenshot capture and standalone viewing.\n * Renders a single variant with minimal UI for visual testing.\n * URL params: ?isolated=true&component=Name&variant=VariantName&zoom=100&bg=white&theme=light\n */\nexport function IsolatedRender({ segments }: IsolatedRenderProps) {\n const [ready, setReady] = useState(false);\n\n // Parse query parameters\n const params = useMemo(() => {\n const searchParams = new URLSearchParams(window.location.search);\n const zoomParam = parseInt(searchParams.get(\"zoom\") || \"100\", 10);\n const bgParam = searchParams.get(\"bg\") || \"white\";\n return {\n component: searchParams.get(\"component\"),\n variant: searchParams.get(\"variant\"),\n theme: searchParams.get(\"theme\") || \"light\",\n zoom: [50, 75, 100, 150, 200].includes(zoomParam) ? zoomParam as ZoomLevel : 100 as ZoomLevel,\n background: [\"white\", \"black\", \"checkerboard\", \"transparent\"].includes(bgParam)\n ? bgParam as BackgroundOption\n : \"white\" as BackgroundOption,\n };\n }, []);\n\n // Find the matching segment and variant\n const match = useMemo(() => {\n if (!params.component || !params.variant) {\n return null;\n }\n\n const segment = segments.find(\n (s) => s.segment.meta.name === params.component\n );\n\n if (!segment) {\n return null;\n }\n\n const variant = segment.segment.variants.find(\n (v) => v.name === params.variant\n );\n\n if (!variant) {\n return null;\n }\n\n return { segment: segment.segment, variant };\n }, [segments, params]);\n\n // Apply theme\n useEffect(() => {\n document.documentElement.setAttribute(\"data-theme\", params.theme);\n \n // Signal ready after a short delay for fonts and styles to settle\n const timer = setTimeout(() => {\n setReady(true);\n }, 50);\n\n return () => clearTimeout(timer);\n }, [params.theme]);\n\n // Error state - missing component or variant\n if (!params.component || !params.variant) {\n return (\n <div className=\"p-4 text-red-500 font-mono text-sm\">\n Error: Missing component or variant parameter\n <pre className=\"mt-2 text-xs\">\n Required: ?component=ComponentName&variant=VariantName\n </pre>\n </div>\n );\n }\n\n // Error state - component/variant not found\n if (!match) {\n return (\n <div className=\"p-4 text-red-500 font-mono text-sm\">\n Error: Component \"{params.component}\" variant \"{params.variant}\" not\n found\n </div>\n );\n }\n\n // Render the variant in isolation\n return (\n <div\n id=\"isolated-render\"\n data-ready={ready}\n className=\"min-h-screen p-8 flex items-center justify-center\"\n style={getBackgroundStyle(params.background)}\n >\n <div\n style={{\n transform: `scale(${params.zoom / 100})`,\n transformOrigin: 'center center',\n }}\n >\n <VariantRenderer variant={match.variant} />\n </div>\n </div>\n );\n}\n","// @ts-nocheck\nimport React, { type ReactNode, Suspense } from 'react';\nimport type { SegmentVariant } from '../../core/index.js';\nimport { ErrorBoundary } from './ErrorBoundary.js';\n\ninterface VariantRendererProps {\n /** The variant to render */\n variant: SegmentVariant;\n\n /** Optional loading fallback for async components */\n loadingFallback?: ReactNode;\n\n /** Optional error fallback */\n errorFallback?: ReactNode;\n\n /** Callback when variant render throws */\n onError?: (error: Error) => void;\n}\n\n/**\n * Renders a single variant with error boundary and suspense support.\n */\nexport function VariantRenderer({\n variant,\n loadingFallback,\n errorFallback,\n onError,\n}: VariantRendererProps): React.ReactElement {\n return (\n <ErrorBoundary\n fallback={errorFallback}\n onError={(error) => onError?.(error)}\n >\n <Suspense\n fallback={\n loadingFallback ?? (\n <div\n style={{\n padding: '16px',\n color: '#6b7280',\n fontFamily: 'system-ui, sans-serif',\n }}\n >\n Loading...\n </div>\n )\n }\n >\n {variant.render()}\n </Suspense>\n </ErrorBoundary>\n );\n}\n\ninterface VariantGridProps {\n /** Variants to render */\n variants: SegmentVariant[];\n\n /** Number of columns in the grid */\n columns?: number;\n\n /** Gap between variants in pixels */\n gap?: number;\n\n /** Optional loading fallback */\n loadingFallback?: ReactNode;\n\n /** Optional error fallback */\n errorFallback?: ReactNode;\n}\n\n/**\n * Renders multiple variants in a grid layout.\n */\nexport function VariantGrid({\n variants,\n columns = 2,\n gap = 24,\n loadingFallback,\n errorFallback,\n}: VariantGridProps): React.ReactElement {\n return (\n <div\n style={{\n display: 'grid',\n gridTemplateColumns: `repeat(${columns}, 1fr)`,\n gap: `${gap}px`,\n }}\n >\n {variants.map((variant) => (\n <div key={variant.name}>\n <div\n style={{\n marginBottom: '8px',\n fontWeight: 600,\n fontSize: '14px',\n color: '#374151',\n fontFamily: 'system-ui, sans-serif',\n }}\n >\n {variant.name}\n </div>\n <div\n style={{\n marginBottom: '8px',\n fontSize: '13px',\n color: '#6b7280',\n fontFamily: 'system-ui, sans-serif',\n }}\n >\n {variant.description}\n </div>\n <div\n style={{\n padding: '16px',\n border: '1px solid #e5e7eb',\n borderRadius: '8px',\n background: '#ffffff',\n }}\n >\n <VariantRenderer\n variant={variant}\n loadingFallback={loadingFallback}\n errorFallback={errorFallback}\n />\n </div>\n </div>\n ))}\n </div>\n );\n}\n","/**\n * Dashboard Component\n * Minimalist overview of design system coverage and components\n * with enhanced accessibility insights and top issues aggregation\n */\n\nimport { useMemo, useState, useCallback, useEffect } from 'react';\nimport type { SegmentDefinition } from '../../core/index.js';\nimport type { ImpactValue } from 'axe-core';\nimport {\n getAllA11yData,\n getA11ySummary,\n getAllA11yResults,\n type ComponentA11yData,\n} from '../hooks/useA11yCache.js';\nimport type { A11ySummary, CachedA11yResult } from '../types/a11y.js';\nimport { getImpactColorClass } from '../utils/a11y-fixes.js';\n\ninterface HealthDashboardProps {\n segments: Array<{ path: string; segment: SegmentDefinition }>;\n onNavigate?: (componentName: string) => void;\n}\n\ninterface CoverageMetric {\n label: string;\n count: number;\n total: number;\n}\n\ninterface A11yResults {\n accessibleComponents: number;\n totalComponents: number;\n totalViolations: number;\n totalCritical: number;\n totalSerious: number;\n}\n\ninterface ComponentA11yResult {\n violations: number;\n critical: number;\n serious: number;\n status: 'pending' | 'scanning' | 'pass' | 'warn' | 'fail';\n}\n\ninterface ComponentRow {\n name: string;\n category: string;\n variantCount: number;\n status: string;\n}\n\nfunction calculateCoverage(\n segments: Array<{ path: string; segment: SegmentDefinition }>\n): { metrics: CoverageMetric[]; components: ComponentRow[]; categoryCount: number } {\n const total = segments.length;\n\n if (total === 0) {\n return { metrics: [], components: [], categoryCount: 0 };\n }\n\n const categories = new Set<string>();\n const components: ComponentRow[] = [];\n\n let documented = 0;\n let withVariants = 0;\n let withUsage = 0;\n let figmaLinked = 0;\n\n for (const { segment } of segments) {\n const cat = segment.meta.category || 'uncategorized';\n categories.add(cat);\n\n // Documentation\n if (segment.meta.description && segment.meta.description.trim().length > 10) {\n documented++;\n }\n\n // Variants\n const variantCount = segment.variants?.length || 0;\n if (variantCount > 0) {\n withVariants++;\n }\n\n // Usage\n if (segment.usage && (segment.usage.when.length > 0 || segment.usage.whenNot.length > 0)) {\n withUsage++;\n }\n\n // Figma\n if (segment.meta.figma || segment.variants?.some((v) => v.figma)) {\n figmaLinked++;\n }\n\n components.push({\n name: segment.meta.name,\n category: cat,\n variantCount,\n status: segment.meta.status || 'stable',\n });\n }\n\n // Sort components by category then name\n components.sort((a, b) => {\n if (a.category !== b.category) return a.category.localeCompare(b.category);\n return a.name.localeCompare(b.name);\n });\n\n const metrics: CoverageMetric[] = [\n { label: 'Documented', count: documented, total },\n { label: 'Variants', count: withVariants, total },\n { label: 'Usage', count: withUsage, total },\n { label: 'Figma', count: figmaLinked, total },\n ];\n\n return { metrics, components, categoryCount: categories.size };\n}\n\nexport function HealthDashboard({ segments, onNavigate }: HealthDashboardProps) {\n const { metrics, components, categoryCount } = useMemo(\n () => calculateCoverage(segments),\n [segments]\n );\n\n const [componentA11y, setComponentA11y] = useState<Record<string, ComponentA11yResult>>({});\n const [scanningComponents, setScanningComponents] = useState<Set<string>>(new Set());\n const [a11ySummary, setA11ySummary] = useState<A11ySummary | null>(null);\n\n // Convert cached data to component a11y format\n const convertCacheToA11y = useCallback((cached: Record<string, ComponentA11yData>): Record<string, ComponentA11yResult> => {\n const result: Record<string, ComponentA11yResult> = {};\n for (const [name, data] of Object.entries(cached)) {\n let status: ComponentA11yResult['status'] = 'pass';\n if (data.critical > 0 || data.serious > 0) {\n status = 'fail';\n } else if (data.violations > 0) {\n status = 'warn';\n }\n result[name] = {\n violations: data.violations,\n critical: data.critical,\n serious: data.serious,\n status,\n };\n }\n return result;\n }, []);\n\n // Load cached a11y data on mount and listen for updates\n useEffect(() => {\n // Load initial cached data\n const cached = getAllA11yData();\n if (Object.keys(cached).length > 0) {\n setComponentA11y(convertCacheToA11y(cached));\n setA11ySummary(getA11ySummary());\n }\n\n // Listen for cache updates from AccessibilityPanel\n const handleCacheUpdate = () => {\n const updatedCache = getAllA11yData();\n setComponentA11y(convertCacheToA11y(updatedCache));\n setA11ySummary(getA11ySummary());\n };\n\n const handleCacheCleared = () => {\n setComponentA11y({});\n setA11ySummary(null);\n };\n\n // Listen for scan started events\n const handleScanStarted = (event: CustomEvent<{ componentName: string }>) => {\n setScanningComponents(prev => new Set(prev).add(event.detail.componentName));\n };\n\n // Listen for scan completed events\n const handleScanCompleted = (event: CustomEvent<{ componentName: string }>) => {\n setScanningComponents(prev => {\n const next = new Set(prev);\n next.delete(event.detail.componentName);\n return next;\n });\n };\n\n window.addEventListener('a11y-cache-updated', handleCacheUpdate);\n window.addEventListener('a11y-cache-cleared', handleCacheCleared);\n window.addEventListener('a11y-scan-started', handleScanStarted as EventListener);\n window.addEventListener('a11y-scan-completed', handleScanCompleted as EventListener);\n\n return () => {\n window.removeEventListener('a11y-cache-updated', handleCacheUpdate);\n window.removeEventListener('a11y-cache-cleared', handleCacheCleared);\n window.removeEventListener('a11y-scan-started', handleScanStarted as EventListener);\n window.removeEventListener('a11y-scan-completed', handleScanCompleted as EventListener);\n };\n }, [convertCacheToA11y]);\n\n // Calculate summary from component results\n const a11yResults = useMemo((): A11yResults | null => {\n const scannedComponents = Object.keys(componentA11y).length;\n if (scannedComponents === 0) {\n return null;\n }\n\n const summary = a11ySummary || getA11ySummary();\n return {\n accessibleComponents: summary.accessibleComponents,\n totalComponents: summary.totalComponents,\n totalViolations:\n summary.violationsByImpact.critical +\n summary.violationsByImpact.serious +\n summary.violationsByImpact.moderate +\n summary.violationsByImpact.minor,\n totalCritical: summary.violationsByImpact.critical,\n totalSerious: summary.violationsByImpact.serious,\n };\n }, [componentA11y, a11ySummary]);\n\n if (segments.length === 0) {\n return (\n <div className=\"text-center py-12 text-tertiary\">\n <p className=\"text-sm\">No components loaded</p>\n </div>\n );\n }\n\n // Create accessibility metric if scan has been run\n const a11yMetric: CoverageMetric | null = a11yResults\n ? {\n label: 'Accessible',\n count: a11yResults.accessibleComponents,\n total: a11yResults.totalComponents,\n }\n : null;\n\n return (\n <div className=\"space-y-6 max-w-2xl\">\n {/* Header */}\n <div>\n <h1 className=\"text-xl font-semibold text-primary\">Fragments</h1>\n <p className=\"text-sm text-tertiary mt-0.5\">\n {segments.length} component{segments.length !== 1 ? 's' : ''} Ā· {categoryCount} categor{categoryCount !== 1 ? 'ies' : 'y'}\n </p>\n </div>\n\n {/* Coverage */}\n <div className=\"rounded-lg border border-[--border-subtle] p-4 space-y-3\">\n <h2 className=\"text-sm font-medium text-primary\">Coverage</h2>\n <div className=\"space-y-2.5\">\n {metrics.map((metric) => (\n <CoverageRow key={metric.label} metric={metric} />\n ))}\n {/* Accessibility metric */}\n {a11yMetric ? (\n <CoverageRow metric={a11yMetric} />\n ) : (\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-secondary w-24 flex-shrink-0\">Accessible</span>\n <div className=\"flex-1 h-2 rounded-full bg-[--bg-tertiary] overflow-hidden\">\n <div className=\"h-full rounded-full bg-[--bg-tertiary]\" style={{ width: '0%' }} />\n </div>\n <span className=\"text-xs text-tertiary w-10 text-right flex-shrink-0\">-</span>\n </div>\n )}\n </div>\n {/* Show info about a11y data */}\n <div className=\"pt-2 border-t border-[--border-subtle]\">\n {a11yResults ? (\n a11yResults.totalViolations > 0 ? (\n <p className=\"text-xs text-tertiary\">\n {a11yResults.totalViolations} violation{a11yResults.totalViolations !== 1 ? 's' : ''} found\n ({a11yResults.totalCritical} critical, {a11yResults.totalSerious} serious)\n </p>\n ) : (\n <p className=\"text-xs text-green-600 dark:text-green-400\">\n All scanned components pass accessibility checks\n </p>\n )\n ) : (\n <p className=\"text-xs text-tertiary\">\n Visit components to scan for accessibility issues\n </p>\n )}\n </div>\n </div>\n\n {/* Top Issues Section */}\n {a11ySummary && a11ySummary.topViolations.length > 0 && (\n <div className=\"rounded-lg border border-[--border-subtle] p-4 space-y-3\">\n <h2 className=\"text-sm font-medium text-primary\">Top Issues</h2>\n <p className=\"text-xs text-tertiary\">\n Common accessibility violations across your components\n </p>\n <div className=\"space-y-2\">\n {a11ySummary.topViolations.map((violation) => {\n const impactColors = getImpactColorClass(violation.impact);\n return (\n <div\n key={violation.ruleId}\n className=\"flex items-start gap-2 p-2 rounded bg-[--bg-secondary] border border-[--border-subtle]\"\n >\n {/* Impact badge */}\n {violation.impact && (\n <span\n className={`text-[10px] font-semibold px-1.5 py-0.5 rounded uppercase tracking-wide flex-shrink-0 ${impactColors.bg} ${impactColors.text}`}\n >\n {violation.impact}\n </span>\n )}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-xs text-primary truncate\">{violation.description}</p>\n <p className=\"text-[10px] text-tertiary mt-0.5\">\n <span className=\"font-mono\">{violation.ruleId}</span>\n {' Ā· '}\n {violation.affectedComponents.length} component{violation.affectedComponents.length !== 1 ? 's' : ''}\n </p>\n </div>\n <span className=\"text-xs text-tertiary flex-shrink-0\">\n {violation.affectedComponents.length}\n </span>\n </div>\n );\n })}\n </div>\n {a11ySummary.topViolations.length >= 5 && (\n <p className=\"text-[10px] text-tertiary text-center\">\n Showing top 5 issues\n </p>\n )}\n </div>\n )}\n\n {/* Components Table */}\n <div>\n <h2 className=\"text-sm font-medium text-primary mb-2\">Components</h2>\n <div className=\"rounded-lg border border-[--border-subtle] overflow-hidden\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-[--border-subtle] bg-[--bg-secondary]\">\n <th className=\"text-left px-3 py-2 text-xs font-medium text-tertiary\">Name</th>\n <th className=\"text-left px-3 py-2 text-xs font-medium text-tertiary\">Category</th>\n <th className=\"text-left px-3 py-2 text-xs font-medium text-tertiary\">Variants</th>\n <th className=\"text-left px-3 py-2 text-xs font-medium text-tertiary\">A11y</th>\n <th className=\"text-left px-3 py-2 text-xs font-medium text-tertiary\">Status</th>\n </tr>\n </thead>\n <tbody>\n {components.map((component) => {\n const a11yStatus = componentA11y[component.name];\n const isScanning = scanningComponents.has(component.name);\n return (\n <tr\n key={component.name}\n onClick={() => onNavigate?.(component.name)}\n className=\"border-b last:border-b-0 border-[--border-subtle] hover:bg-[--bg-hover] cursor-pointer transition-colors\"\n >\n <td className=\"px-3 py-2 text-primary font-medium\">{component.name}</td>\n <td className=\"px-3 py-2 text-tertiary\">{component.category}</td>\n <td className=\"px-3 py-2 text-tertiary\">{component.variantCount}</td>\n <td className=\"px-3 py-2\">\n <A11yBadge result={a11yStatus} isScanning={isScanning} />\n </td>\n <td className=\"px-3 py-2 text-tertiary\">{component.status}</td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n </div>\n );\n}\n\nfunction CoverageRow({ metric }: { metric: CoverageMetric }) {\n const percentage = metric.total > 0 ? (metric.count / metric.total) * 100 : 0;\n\n return (\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm text-secondary w-24 flex-shrink-0\">{metric.label}</span>\n <div className=\"flex-1 h-2 rounded-full bg-[--bg-tertiary] overflow-hidden\">\n <div\n className=\"h-full rounded-full bg-[--color-accent] transition-all\"\n style={{ width: `${percentage}%` }}\n />\n </div>\n <span className=\"text-xs text-tertiary w-10 text-right flex-shrink-0\">\n {metric.count}/{metric.total}\n </span>\n </div>\n );\n}\n\nfunction A11yBadge({ result, isScanning }: { result?: ComponentA11yResult; isScanning?: boolean }) {\n // Show scanning state\n if (isScanning) {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs text-amber-600 dark:text-amber-400\">\n <span className=\"w-2 h-2 border border-current border-t-transparent rounded-full animate-spin\" />\n <span className=\"animate-pulse\">Scanning</span>\n </span>\n );\n }\n\n if (!result) {\n return <span className=\"text-xs text-tertiary\">-</span>;\n }\n\n if (result.status === 'pending') {\n return <span className=\"text-xs text-tertiary\">-</span>;\n }\n\n if (result.status === 'scanning') {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs text-tertiary\">\n <span className=\"w-2 h-2 border border-current border-t-transparent rounded-full animate-spin\" />\n </span>\n );\n }\n\n if (result.status === 'pass') {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs text-green-600 dark:text-green-400\">\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M5 13l4 4L19 7\" />\n </svg>\n Pass\n </span>\n );\n }\n\n if (result.status === 'fail') {\n return (\n <span className=\"inline-flex items-center gap-1 text-xs text-red-600 dark:text-red-400 font-medium\">\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n {result.violations}\n </span>\n );\n }\n\n // warn status\n return (\n <span className=\"inline-flex items-center gap-1 text-xs text-amber-600 dark:text-amber-400\">\n <svg className=\"w-3 h-3\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" strokeWidth={2}>\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\n </svg>\n {result.violations}\n </span>\n );\n}\n\nexport default HealthDashboard;\n","/**\n * ActionCapture component - captures DOM events for action logging.\n *\n * Uses event delegation to capture interactions at the DOM level,\n * which works even when component render functions don't pass callbacks.\n */\n\nimport { useRef, useEffect, type ReactNode } from 'react';\n\ninterface ActionCaptureProps {\n children: ReactNode;\n onAction: (name: string, args: unknown[]) => void;\n enabled?: boolean;\n}\n\n// Events to capture\nconst CAPTURE_EVENTS = [\n 'click',\n 'dblclick',\n 'change',\n 'input',\n 'submit',\n 'focus',\n 'blur',\n 'keydown',\n 'keyup',\n] as const;\n\n// Map event types to action names\nfunction getActionName(event: Event): string {\n const type = event.type;\n // Convert to React-style naming\n switch (type) {\n case 'click': return 'onClick';\n case 'dblclick': return 'onDoubleClick';\n case 'change': return 'onChange';\n case 'input': return 'onInput';\n case 'submit': return 'onSubmit';\n case 'focus': return 'onFocus';\n case 'blur': return 'onBlur';\n case 'keydown': return 'onKeyDown';\n case 'keyup': return 'onKeyUp';\n default: return `on${type.charAt(0).toUpperCase() + type.slice(1)}`;\n }\n}\n\n// Extract useful information about the target element\nfunction getElementInfo(element: Element): Record<string, unknown> {\n const tag = element.tagName.toLowerCase();\n const info: Record<string, unknown> = { element: tag };\n\n // Get identifying attributes\n if (element.id) info.id = element.id;\n if (element.className && typeof element.className === 'string') {\n const classes = element.className.trim().split(/\\s+/).slice(0, 3);\n if (classes.length > 0 && classes[0]) info.className = classes.join(' ');\n }\n\n // Get accessibility info\n const role = element.getAttribute('role');\n if (role) info.role = role;\n\n const ariaLabel = element.getAttribute('aria-label');\n if (ariaLabel) info['aria-label'] = ariaLabel;\n\n // Get text content (truncated)\n const text = element.textContent?.trim();\n if (text && text.length > 0 && text.length <= 50) {\n info.text = text;\n } else if (text && text.length > 50) {\n info.text = text.slice(0, 47) + '...';\n }\n\n // Get input-specific info\n if (element instanceof HTMLInputElement) {\n info.type = element.type;\n info.name = element.name || undefined;\n if (element.type === 'checkbox' || element.type === 'radio') {\n info.checked = element.checked;\n } else if (element.type !== 'password') {\n info.value = element.value;\n }\n } else if (element instanceof HTMLSelectElement) {\n info.name = element.name || undefined;\n info.value = element.value;\n info.selectedText = element.options[element.selectedIndex]?.text;\n } else if (element instanceof HTMLTextAreaElement) {\n info.name = element.name || undefined;\n info.value = element.value.length > 100 ? element.value.slice(0, 97) + '...' : element.value;\n } else if (element instanceof HTMLButtonElement) {\n info.type = element.type;\n if (element.name) info.name = element.name;\n }\n\n // Clean up undefined values\n return Object.fromEntries(Object.entries(info).filter(([, v]) => v !== undefined));\n}\n\n// Extract keyboard event info\nfunction getKeyboardInfo(event: KeyboardEvent): Record<string, unknown> {\n return {\n key: event.key,\n code: event.code,\n ...(event.ctrlKey && { ctrlKey: true }),\n ...(event.shiftKey && { shiftKey: true }),\n ...(event.altKey && { altKey: true }),\n ...(event.metaKey && { metaKey: true }),\n };\n}\n\nexport function ActionCapture({ children, onAction, enabled = true }: ActionCaptureProps) {\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!enabled) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n const handleEvent = (event: Event) => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n // Skip if the event is from the container itself\n if (target === container) return;\n\n // Get action name\n const actionName = getActionName(event);\n\n // Build args array with useful info\n const args: unknown[] = [];\n\n // Add element info\n const elementInfo = getElementInfo(target);\n args.push(elementInfo);\n\n // Add keyboard-specific info for key events\n if (event instanceof KeyboardEvent) {\n args.push(getKeyboardInfo(event));\n }\n\n // Add mouse position for click events\n if (event instanceof MouseEvent && (event.type === 'click' || event.type === 'dblclick')) {\n args.push({\n clientX: event.clientX,\n clientY: event.clientY,\n button: event.button,\n });\n }\n\n onAction(actionName, args);\n };\n\n // Attach event listeners with capture phase\n // This ensures we catch events even if stopPropagation is called\n CAPTURE_EVENTS.forEach(eventType => {\n container.addEventListener(eventType, handleEvent, { capture: true });\n });\n\n return () => {\n CAPTURE_EVENTS.forEach(eventType => {\n container.removeEventListener(eventType, handleEvent, { capture: true });\n });\n };\n }, [onAction, enabled]);\n\n return (\n <div ref={containerRef} className=\"contents\">\n {children}\n </div>\n );\n}\n","/**\n * Centralized UI state management for the App component.\n * Uses useReducer for predictable state updates and better performance.\n */\n\nimport { useReducer, useCallback, useMemo } from 'react';\n\nexport type ActivePanel = 'code' | 'styles' | 'accessibility' | 'interactions' | 'actions' | 'graph' | 'contract';\n\ninterface AppUIState {\n activePanel: ActivePanel;\n panelOpen: boolean;\n showHealthDashboard: boolean;\n showComparison: boolean;\n showShortcutsHelp: boolean;\n showMatrixView: boolean;\n showCommandPalette: boolean;\n showMultiViewport: boolean;\n linkCopied: boolean;\n previewKey: number;\n}\n\ntype AppUIAction =\n | { type: 'SET_ACTIVE_PANEL'; payload: ActivePanel }\n | { type: 'TOGGLE_PANEL' }\n | { type: 'SET_PANEL_OPEN'; payload: boolean }\n | { type: 'SET_HEALTH_DASHBOARD'; payload: boolean }\n | { type: 'TOGGLE_COMPARISON' }\n | { type: 'SET_COMPARISON'; payload: boolean }\n | { type: 'TOGGLE_SHORTCUTS_HELP' }\n | { type: 'SET_SHORTCUTS_HELP'; payload: boolean }\n | { type: 'SET_MATRIX_VIEW'; payload: boolean }\n | { type: 'SET_COMMAND_PALETTE'; payload: boolean }\n | { type: 'SET_MULTI_VIEWPORT'; payload: boolean }\n | { type: 'SET_LINK_COPIED'; payload: boolean }\n | { type: 'INCREMENT_PREVIEW_KEY' }\n | { type: 'CLOSE_ALL_MODALS' };\n\nconst initialState: AppUIState = {\n activePanel: 'code',\n panelOpen: true,\n showHealthDashboard: false,\n showComparison: true,\n showShortcutsHelp: false,\n showMatrixView: false,\n showCommandPalette: false,\n showMultiViewport: false,\n linkCopied: false,\n previewKey: 0,\n};\n\nfunction appUIReducer(state: AppUIState, action: AppUIAction): AppUIState {\n switch (action.type) {\n case 'SET_ACTIVE_PANEL':\n return { ...state, activePanel: action.payload };\n case 'TOGGLE_PANEL':\n return { ...state, panelOpen: !state.panelOpen };\n case 'SET_PANEL_OPEN':\n return { ...state, panelOpen: action.payload };\n case 'SET_HEALTH_DASHBOARD':\n return { ...state, showHealthDashboard: action.payload };\n case 'TOGGLE_COMPARISON':\n return { ...state, showComparison: !state.showComparison };\n case 'SET_COMPARISON':\n return { ...state, showComparison: action.payload };\n case 'TOGGLE_SHORTCUTS_HELP':\n return { ...state, showShortcutsHelp: !state.showShortcutsHelp };\n case 'SET_SHORTCUTS_HELP':\n return { ...state, showShortcutsHelp: action.payload };\n case 'SET_MATRIX_VIEW':\n // When enabling matrix view, disable multi-viewport\n return {\n ...state,\n showMatrixView: action.payload,\n showMultiViewport: action.payload ? false : state.showMultiViewport,\n };\n case 'SET_COMMAND_PALETTE':\n return { ...state, showCommandPalette: action.payload };\n case 'SET_MULTI_VIEWPORT':\n // When enabling multi-viewport, disable matrix view\n return {\n ...state,\n showMultiViewport: action.payload,\n showMatrixView: action.payload ? false : state.showMatrixView,\n };\n case 'SET_LINK_COPIED':\n return { ...state, linkCopied: action.payload };\n case 'INCREMENT_PREVIEW_KEY':\n return { ...state, previewKey: state.previewKey + 1 };\n case 'CLOSE_ALL_MODALS':\n return {\n ...state,\n showShortcutsHelp: false,\n showCommandPalette: false,\n };\n default:\n return state;\n }\n}\n\nexport function useAppState() {\n const [state, dispatch] = useReducer(appUIReducer, initialState);\n\n const actions = useMemo(() => ({\n setActivePanel: (panel: ActivePanel) => dispatch({ type: 'SET_ACTIVE_PANEL', payload: panel }),\n togglePanel: () => dispatch({ type: 'TOGGLE_PANEL' }),\n setPanelOpen: (open: boolean) => dispatch({ type: 'SET_PANEL_OPEN', payload: open }),\n setHealthDashboard: (show: boolean) => dispatch({ type: 'SET_HEALTH_DASHBOARD', payload: show }),\n toggleComparison: () => dispatch({ type: 'TOGGLE_COMPARISON' }),\n setComparison: (show: boolean) => dispatch({ type: 'SET_COMPARISON', payload: show }),\n toggleShortcutsHelp: () => dispatch({ type: 'TOGGLE_SHORTCUTS_HELP' }),\n setShortcutsHelp: (show: boolean) => dispatch({ type: 'SET_SHORTCUTS_HELP', payload: show }),\n setMatrixView: (show: boolean) => dispatch({ type: 'SET_MATRIX_VIEW', payload: show }),\n setCommandPalette: (show: boolean) => dispatch({ type: 'SET_COMMAND_PALETTE', payload: show }),\n setMultiViewport: (show: boolean) => dispatch({ type: 'SET_MULTI_VIEWPORT', payload: show }),\n setLinkCopied: (copied: boolean) => dispatch({ type: 'SET_LINK_COPIED', payload: copied }),\n incrementPreviewKey: () => dispatch({ type: 'INCREMENT_PREVIEW_KEY' }),\n closeAllModals: () => dispatch({ type: 'CLOSE_ALL_MODALS' }),\n }), []);\n\n return { state, actions };\n}\n\nexport type { AppUIState, AppUIAction };\n","/**\n * View settings state management.\n * Handles zoom, background, viewport, and theme settings with URL sync.\n */\n\nimport { useReducer, useCallback, useMemo } from 'react';\nimport type { ZoomLevel, BackgroundOption } from '../components/PreviewToolbar.js';\n\n// Preview theme type (for canvas theming)\nexport type PreviewTheme = 'light' | 'dark';\nimport type { ViewportPreset, ViewportSize } from '../components/ViewportSelector.js';\n\ninterface ViewSettings {\n zoom: ZoomLevel;\n background: BackgroundOption;\n viewport: ViewportPreset;\n customSize: ViewportSize;\n previewTheme: PreviewTheme;\n}\n\ntype ViewSettingsAction =\n | { type: 'SET_ZOOM'; payload: ZoomLevel }\n | { type: 'SET_BACKGROUND'; payload: BackgroundOption }\n | { type: 'SET_VIEWPORT'; payload: ViewportPreset }\n | { type: 'SET_CUSTOM_SIZE'; payload: ViewportSize }\n | { type: 'SET_PREVIEW_THEME'; payload: PreviewTheme }\n | { type: 'TOGGLE_THEME' }\n | { type: 'RESET' };\n\ninterface ViewSettingsInit {\n zoom?: ZoomLevel;\n background?: BackgroundOption;\n viewport?: ViewportPreset;\n customSize?: ViewportSize;\n previewTheme?: PreviewTheme;\n}\n\nfunction createInitialState(init?: ViewSettingsInit): ViewSettings {\n return {\n zoom: init?.zoom ?? 100,\n background: init?.background ?? 'transparent',\n viewport: init?.viewport ?? 'responsive',\n customSize: init?.customSize ?? { width: null, height: null },\n previewTheme: init?.previewTheme ?? 'light',\n };\n}\n\nfunction viewSettingsReducer(state: ViewSettings, action: ViewSettingsAction): ViewSettings {\n switch (action.type) {\n case 'SET_ZOOM':\n return { ...state, zoom: action.payload };\n case 'SET_BACKGROUND':\n return { ...state, background: action.payload };\n case 'SET_VIEWPORT':\n return { ...state, viewport: action.payload };\n case 'SET_CUSTOM_SIZE':\n return { ...state, customSize: action.payload, viewport: 'custom' };\n case 'SET_PREVIEW_THEME':\n return { ...state, previewTheme: action.payload };\n case 'TOGGLE_THEME':\n return { ...state, previewTheme: state.previewTheme === 'light' ? 'dark' : 'light' };\n case 'RESET':\n return createInitialState();\n default:\n return state;\n }\n}\n\ninterface UseViewSettingsOptions {\n initialState?: ViewSettingsInit;\n onZoomChange?: (zoom: ZoomLevel) => void;\n onBackgroundChange?: (bg: BackgroundOption) => void;\n onViewportChange?: (viewport: ViewportPreset, customSize?: ViewportSize) => void;\n}\n\nexport function useViewSettings(options: UseViewSettingsOptions = {}) {\n const { initialState: init, onZoomChange, onBackgroundChange, onViewportChange } = options;\n\n const [state, dispatch] = useReducer(\n viewSettingsReducer,\n init,\n createInitialState\n );\n\n const setZoom = useCallback((zoom: ZoomLevel) => {\n dispatch({ type: 'SET_ZOOM', payload: zoom });\n onZoomChange?.(zoom);\n }, [onZoomChange]);\n\n const setBackground = useCallback((bg: BackgroundOption) => {\n dispatch({ type: 'SET_BACKGROUND', payload: bg });\n onBackgroundChange?.(bg);\n }, [onBackgroundChange]);\n\n const setViewport = useCallback((viewport: ViewportPreset) => {\n dispatch({ type: 'SET_VIEWPORT', payload: viewport });\n onViewportChange?.(viewport);\n }, [onViewportChange]);\n\n const setCustomSize = useCallback((size: ViewportSize) => {\n dispatch({ type: 'SET_CUSTOM_SIZE', payload: size });\n onViewportChange?.('custom', size);\n }, [onViewportChange]);\n\n const setPreviewTheme = useCallback((theme: PreviewTheme) => {\n dispatch({ type: 'SET_PREVIEW_THEME', payload: theme });\n }, []);\n\n const toggleTheme = useCallback(() => {\n dispatch({ type: 'TOGGLE_THEME' });\n }, []);\n\n const actions = useMemo(() => ({\n setZoom,\n setBackground,\n setViewport,\n setCustomSize,\n setPreviewTheme,\n toggleTheme,\n }), [setZoom, setBackground, setViewport, setCustomSize, setPreviewTheme, toggleTheme]);\n\n return { ...state, ...actions };\n}\n\nexport type { ViewSettings, ViewSettingsInit };\n","/**\n * Figma integration hook.\n * Handles fetching Figma styles and extracting rendered component styles.\n */\n\nimport { useState, useCallback, useEffect } from 'react';\n\ninterface FigmaStylesState {\n status: 'idle' | 'loading' | 'success' | 'error';\n styles?: Record<string, string>;\n error?: string;\n}\n\ninterface UseFigmaIntegrationOptions {\n figmaUrl?: string;\n showComparison?: boolean;\n dependencies?: unknown[]; // Dependencies that should reset styles when changed\n}\n\nexport function useFigmaIntegration(options: UseFigmaIntegrationOptions = {}) {\n const { figmaUrl, showComparison = false, dependencies = [] } = options;\n\n const [figmaStyles, setFigmaStyles] = useState<FigmaStylesState>({ status: 'idle' });\n const [renderedStyles, setRenderedStyles] = useState<Record<string, string> | null>(null);\n\n // Fetch Figma styles from API\n const fetchFigmaStyles = useCallback(async () => {\n if (!figmaUrl) return;\n\n setFigmaStyles({ status: 'loading' });\n\n try {\n const response = await fetch('/segments/figma-styles', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ figmaUrl }),\n });\n\n const result = await response.json();\n\n if (result.error) {\n setFigmaStyles({ status: 'error', error: result.error });\n } else {\n setFigmaStyles({ status: 'success', styles: result.styles });\n }\n } catch {\n setFigmaStyles({ status: 'error', error: 'Failed to fetch Figma styles' });\n }\n }, [figmaUrl]);\n\n // Extract computed styles from rendered component\n const extractRenderedStyles = useCallback(() => {\n const container = document.querySelector('[data-preview-container=\"true\"]');\n if (!container) return;\n\n const candidates = container.querySelectorAll('*');\n let bestElement: HTMLElement | null = null;\n let bestScore = -1;\n\n const isVisibleColor = (color: string | undefined): boolean => {\n if (!color) return false;\n if (color === 'transparent' || color === 'rgba(0, 0, 0, 0)') return false;\n return true;\n };\n\n for (const el of candidates) {\n const htmlEl = el as HTMLElement;\n const styles = window.getComputedStyle(htmlEl);\n let score = 0;\n\n if (isVisibleColor(styles.backgroundColor)) score += 10;\n if (styles.borderWidth && styles.borderWidth !== '0px') score += 3;\n if (styles.boxShadow && styles.boxShadow !== 'none') score += 3;\n\n const tagName = htmlEl.tagName.toLowerCase();\n if (['button', 'a', 'input', 'select', 'textarea'].includes(tagName)) score += 5;\n if (htmlEl.getAttribute('role') === 'button') score += 5;\n\n const rect = htmlEl.getBoundingClientRect();\n if (rect.width < 10 || rect.height < 10) score -= 10;\n if (rect.width > 500 || rect.height > 500) score -= 3;\n\n if (score > bestScore) {\n bestScore = score;\n bestElement = htmlEl;\n }\n }\n\n if (!bestElement) return;\n\n const styles = window.getComputedStyle(bestElement);\n const relevantProps = [\n 'backgroundColor', 'borderColor', 'borderWidth', 'borderRadius',\n 'fontFamily', 'fontSize', 'fontWeight', 'lineHeight', 'letterSpacing',\n 'textAlign', 'boxShadow', 'padding', 'gap', 'opacity'\n ];\n\n const result: Record<string, string> = {};\n for (const prop of relevantProps) {\n const cssKey = prop.replace(/([A-Z])/g, '-$1').toLowerCase();\n const value = styles.getPropertyValue(cssKey);\n if (value) result[prop] = value;\n }\n\n setRenderedStyles(result);\n }, []);\n\n // Reset styles when dependencies change\n useEffect(() => {\n setFigmaStyles({ status: 'idle' });\n setRenderedStyles(null);\n }, dependencies);\n\n // Auto-fetch Figma styles when comparison is shown\n useEffect(() => {\n if (showComparison && figmaUrl && figmaStyles.status === 'idle') {\n fetchFigmaStyles();\n }\n }, [showComparison, figmaUrl, figmaStyles.status, fetchFigmaStyles]);\n\n return {\n figmaStyles,\n renderedStyles,\n fetchFigmaStyles,\n extractRenderedStyles,\n isLoading: figmaStyles.status === 'loading',\n hasError: figmaStyles.status === 'error',\n errorMessage: figmaStyles.error,\n };\n}\n\nexport type { FigmaStylesState };\n","/**\n * URL State Management Hook\n *\n * Manages URL-based state for deep linking and sharing:\n * - Component path\n * - Variant index/name\n * - Edited props\n * - View settings (zoom, background, viewport)\n *\n * URL format: #/ComponentName/VariantName?props=base64&zoom=100&bg=white\n */\n\nimport { useState, useEffect, useCallback, useMemo } from \"react\";\n\nexport interface UrlState {\n /** Component path or name */\n component: string | null;\n /** Variant name or index */\n variant: string | null;\n /** Encoded props */\n props: Record<string, unknown>;\n /** View settings */\n zoom: number;\n background: string;\n viewport: string;\n customWidth: number | null;\n customHeight: number | null;\n}\n\nconst DEFAULT_STATE: UrlState = {\n component: null,\n variant: null,\n props: {},\n zoom: 100,\n background: \"transparent\",\n viewport: \"responsive\",\n customWidth: null,\n customHeight: null,\n};\n\n/**\n * Encode props to a URL-safe base64 string\n */\nfunction encodeProps(props: Record<string, unknown>): string | null {\n if (Object.keys(props).length === 0) return null;\n try {\n const json = JSON.stringify(props);\n return btoa(encodeURIComponent(json));\n } catch {\n return null;\n }\n}\n\n/**\n * Decode props from a URL-safe base64 string\n */\nfunction decodeProps(encoded: string): Record<string, unknown> {\n try {\n const json = decodeURIComponent(atob(encoded));\n return JSON.parse(json);\n } catch {\n return {};\n }\n}\n\n/**\n * Parse the current URL into state\n */\nfunction parseUrl(): UrlState {\n const state = { ...DEFAULT_STATE };\n\n try {\n const hash = window.location.hash.slice(1); // Remove leading #\n const [path, queryString] = hash.split(\"?\");\n const params = new URLSearchParams(queryString || \"\");\n\n // Parse path: /ComponentName/VariantName\n if (path) {\n const parts = path.split(\"/\").filter(Boolean);\n if (parts.length >= 1) {\n state.component = decodeURIComponent(parts[0]);\n }\n if (parts.length >= 2) {\n state.variant = decodeURIComponent(parts[1]);\n }\n }\n\n // Parse query params\n const propsParam = params.get(\"props\");\n if (propsParam) {\n state.props = decodeProps(propsParam);\n }\n\n const zoom = params.get(\"zoom\");\n if (zoom) {\n const zoomNum = parseInt(zoom, 10);\n if ([50, 75, 100, 150, 200].includes(zoomNum)) {\n state.zoom = zoomNum;\n }\n }\n\n const bg = params.get(\"bg\");\n if (bg && [\"white\", \"black\", \"checkerboard\", \"transparent\"].includes(bg)) {\n state.background = bg;\n }\n\n const viewport = params.get(\"viewport\");\n if (viewport && [\"responsive\", \"desktop\", \"tablet\", \"mobile\", \"custom\"].includes(viewport)) {\n state.viewport = viewport;\n }\n\n const vw = params.get(\"vw\");\n if (vw) {\n state.customWidth = parseInt(vw, 10) || null;\n }\n\n const vh = params.get(\"vh\");\n if (vh) {\n state.customHeight = parseInt(vh, 10) || null;\n }\n } catch {\n // Return default state on parse error\n }\n\n return state;\n}\n\n/**\n * Build a URL from state\n */\nfunction buildUrl(state: Partial<UrlState>): string {\n const parts: string[] = [];\n\n // Build path\n if (state.component) {\n parts.push(encodeURIComponent(state.component));\n if (state.variant) {\n parts.push(encodeURIComponent(state.variant));\n }\n }\n\n const path = parts.length > 0 ? `/${parts.join(\"/\")}` : \"\";\n\n // Build query params\n const params = new URLSearchParams();\n\n if (state.props && Object.keys(state.props).length > 0) {\n const encoded = encodeProps(state.props);\n if (encoded) {\n params.set(\"props\", encoded);\n }\n }\n\n if (state.zoom && state.zoom !== 100) {\n params.set(\"zoom\", String(state.zoom));\n }\n\n if (state.background && state.background !== \"transparent\") {\n params.set(\"bg\", state.background);\n }\n\n if (state.viewport && state.viewport !== \"responsive\") {\n params.set(\"viewport\", state.viewport);\n }\n\n if (state.viewport === \"custom\") {\n if (state.customWidth) {\n params.set(\"vw\", String(state.customWidth));\n }\n if (state.customHeight) {\n params.set(\"vh\", String(state.customHeight));\n }\n }\n\n const queryString = params.toString();\n return `#${path}${queryString ? `?${queryString}` : \"\"}`;\n}\n\n/**\n * Hook to manage URL-based state\n */\nexport function useUrlState() {\n const [state, setState] = useState<UrlState>(parseUrl);\n\n // Update state when URL changes (browser back/forward)\n useEffect(() => {\n const handleHashChange = () => {\n setState(parseUrl());\n };\n\n window.addEventListener(\"hashchange\", handleHashChange);\n window.addEventListener(\"popstate\", handleHashChange);\n\n return () => {\n window.removeEventListener(\"hashchange\", handleHashChange);\n window.removeEventListener(\"popstate\", handleHashChange);\n };\n }, []);\n\n // Update URL when state changes\n const updateUrl = useCallback((updates: Partial<UrlState>, replace = false) => {\n setState((prev) => {\n const newState = { ...prev, ...updates };\n const url = buildUrl(newState);\n\n // Update URL without triggering hashchange event\n if (replace) {\n window.history.replaceState(null, \"\", url);\n } else {\n window.history.pushState(null, \"\", url);\n }\n\n return newState;\n });\n }, []);\n\n // Set component (creates new history entry)\n const setComponent = useCallback(\n (component: string | null, variant?: string | null) => {\n updateUrl({\n component,\n variant: variant ?? null,\n props: {}, // Reset props when changing component\n });\n },\n [updateUrl]\n );\n\n // Set variant (creates new history entry)\n const setVariant = useCallback(\n (variant: string | null) => {\n updateUrl({\n variant,\n props: {}, // Reset props when changing variant\n });\n },\n [updateUrl]\n );\n\n // Set props (replaces current history entry to avoid spam)\n const setProps = useCallback(\n (props: Record<string, unknown>) => {\n updateUrl({ props }, true);\n },\n [updateUrl]\n );\n\n // Set view settings (replaces current history entry)\n const setViewSettings = useCallback(\n (settings: {\n zoom?: number;\n background?: string;\n viewport?: string;\n customWidth?: number | null;\n customHeight?: number | null;\n }) => {\n updateUrl(settings, true);\n },\n [updateUrl]\n );\n\n // Get shareable URL\n const getShareableUrl = useCallback(() => {\n const url = new URL(window.location.href);\n url.hash = buildUrl(state).slice(1); // Remove leading #\n return url.toString();\n }, [state]);\n\n // Copy URL to clipboard\n const copyUrl = useCallback(async () => {\n const url = getShareableUrl();\n try {\n await navigator.clipboard.writeText(url);\n return true;\n } catch {\n return false;\n }\n }, [getShareableUrl]);\n\n return {\n state,\n setComponent,\n setVariant,\n setProps,\n setViewSettings,\n getShareableUrl,\n copyUrl,\n updateUrl,\n };\n}\n\n/**\n * Find a segment by name or path\n * Generic to preserve the full type of the segment\n */\nexport function findSegmentByName<T extends { path: string; segment: { meta: { name: string } } }>(\n segments: T[],\n nameOrPath: string\n): T | undefined {\n // Try exact path match first\n const byPath = segments.find((s) => s.path === nameOrPath);\n if (byPath) return byPath;\n\n // Try name match (case-insensitive)\n const nameLower = nameOrPath.toLowerCase();\n return segments.find((s) => s.segment.meta.name.toLowerCase() === nameLower);\n}\n\n/**\n * Find a variant by name or index\n */\nexport function findVariantIndex(\n variants: Array<{ name: string }> | undefined,\n nameOrIndex: string | null\n): number {\n if (!variants || !nameOrIndex) return 0;\n\n // Try as index\n const index = parseInt(nameOrIndex, 10);\n if (!isNaN(index) && index >= 0 && index < variants.length) {\n return index;\n }\n\n // Try as name (case-insensitive)\n const nameLower = nameOrIndex.toLowerCase();\n const foundIndex = variants.findIndex((v) => v.name.toLowerCase() === nameLower);\n return foundIndex >= 0 ? foundIndex : 0;\n}\n\nexport default useUrlState;\n","/**\n * ScreenshotButton component - captures screenshots of the preview area.\n * Saves directly to file.\n */\n\nimport { useState, memo } from 'react';\nimport html2canvas from 'html2canvas';\nimport { CameraIcon } from './Icons.js';\n\ninterface ScreenshotButtonProps {\n componentName: string;\n variantName: string;\n}\n\nexport const ScreenshotButton = memo(function ScreenshotButton({ componentName, variantName }: ScreenshotButtonProps) {\n const [status, setStatus] = useState<'idle' | 'loading' | 'success' | 'error'>('idle');\n\n const handleSaveToFile = async () => {\n setStatus('loading');\n try {\n const previewContainer = document.querySelector('[data-preview-container=\"true\"]');\n if (!previewContainer) throw new Error('Preview container not found');\n\n // Wait for fonts to be fully loaded\n await document.fonts.ready;\n\n const canvas = await html2canvas(previewContainer as HTMLElement, {\n backgroundColor: null,\n scale: 2,\n logging: false,\n useCORS: true,\n allowTaint: true,\n // Clone callback to ensure styles are properly computed\n onclone: (clonedDoc) => {\n // Force the cloned document to use the same computed styles\n const clonedElement = clonedDoc.querySelector('[data-preview-container=\"true\"]');\n if (clonedElement) {\n // Ensure fonts are applied in the cloned document\n const style = clonedDoc.createElement('style');\n style.textContent = Array.from(document.styleSheets)\n .map(sheet => {\n try {\n return Array.from(sheet.cssRules)\n .map(rule => rule.cssText)\n .join('\\n');\n } catch {\n return '';\n }\n })\n .join('\\n');\n clonedDoc.head.appendChild(style);\n }\n },\n });\n\n const blob = await new Promise<Blob>((resolve, reject) => {\n canvas.toBlob((b) => {\n if (b) resolve(b);\n else reject(new Error('Failed to create blob'));\n }, 'image/png');\n });\n\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `${componentName}-${variantName}.png`;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n setStatus('success');\n setTimeout(() => setStatus('idle'), 2000);\n } catch (err) {\n console.error('Screenshot save failed:', err);\n setStatus('error');\n setTimeout(() => setStatus('idle'), 2000);\n }\n };\n\n return (\n <button\n onClick={handleSaveToFile}\n disabled={status === 'loading'}\n className=\"p-1.5 text-tertiary hover:text-primary hover:bg-[--bg-hover] rounded transition-colors disabled:opacity-50\"\n title=\"Save screenshot\"\n >\n <CameraIcon className=\"w-4 h-4\" />\n </button>\n );\n});\n","import { useState, useEffect, useRef } from 'react';\n\ninterface UseScrollSpyOptions {\n /** IDs of sections to observe */\n sectionIds: string[];\n /** Offset from top of viewport to consider section as active */\n offset?: number;\n /** Root element to observe within (default: document) */\n root?: Element | null;\n}\n\nexport function useScrollSpy({ sectionIds, offset = 100, root = null }: UseScrollSpyOptions) {\n const [activeId, setActiveId] = useState<string | null>(sectionIds[0] ?? null);\n const observerRef = useRef<IntersectionObserver | null>(null);\n\n useEffect(() => {\n const elements = sectionIds\n .map((id) => document.getElementById(id))\n .filter((el): el is HTMLElement => el !== null);\n\n if (elements.length === 0) return;\n\n // Track which sections are currently visible\n const visibleSections = new Map<string, number>();\n\n observerRef.current = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const id = entry.target.id;\n if (entry.isIntersecting) {\n // Store the top position of visible sections\n visibleSections.set(id, entry.boundingClientRect.top);\n } else {\n visibleSections.delete(id);\n }\n });\n\n // Find the section closest to the top\n if (visibleSections.size > 0) {\n let closestId = '';\n let closestDistance = Infinity;\n\n visibleSections.forEach((top, id) => {\n const distance = Math.abs(top - offset);\n if (distance < closestDistance) {\n closestDistance = distance;\n closestId = id;\n }\n });\n\n if (closestId) {\n setActiveId(closestId);\n }\n }\n },\n {\n root,\n rootMargin: `-${offset}px 0px -50% 0px`,\n threshold: [0, 0.25, 0.5, 0.75, 1],\n }\n );\n\n elements.forEach((el) => observerRef.current?.observe(el));\n\n return () => {\n observerRef.current?.disconnect();\n };\n }, [sectionIds, offset, root]);\n\n const scrollToSection = (id: string) => {\n const element = document.getElementById(id);\n if (element) {\n element.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n };\n\n return { activeId, scrollToSection };\n}\n","import type { SegmentDefinition } from '../../core/index.js';\nimport { useScrollSpy } from '../hooks/useScrollSpy.js';\nimport clsx from 'clsx';\n\ninterface RightSidebarProps {\n segment: SegmentDefinition;\n}\n\ninterface TocItem {\n id: string;\n label: string;\n children?: TocItem[];\n}\n\nexport function RightSidebar({ segment }: RightSidebarProps) {\n // Build table of contents from segment\n const tocItems: TocItem[] = [];\n\n // Overview section\n tocItems.push({ id: 'overview', label: 'Overview' });\n\n // Variants section with nested items\n if (segment.variants && segment.variants.length > 0) {\n tocItems.push({\n id: 'variants',\n label: 'Variants',\n children: segment.variants.map((variant, index) => ({\n id: `variant-${index}`,\n label: variant.name,\n })),\n });\n }\n\n // Usage section\n if (segment.usage) {\n tocItems.push({ id: 'usage', label: 'Usage' });\n }\n\n // Props section\n if (segment.props && Object.keys(segment.props).length > 0) {\n tocItems.push({ id: 'props', label: 'Props' });\n }\n\n // Relations section\n if (segment.relations && segment.relations.length > 0) {\n tocItems.push({ id: 'relations', label: 'Relations' });\n }\n\n // Flatten for scroll spy\n const allIds = tocItems.flatMap((item) => [\n item.id,\n ...(item.children?.map((child) => child.id) ?? []),\n ]);\n\n const { activeId, scrollToSection } = useScrollSpy({\n sectionIds: allIds,\n offset: 100,\n });\n\n return (\n <div className=\"py-2\">\n <h4 className=\"px-3 mb-4 text-[11px] font-medium text-tertiary uppercase tracking-wider\">\n On this page\n </h4>\n <nav>\n <ul className=\"space-y-0.5\">\n {tocItems.map((item) => {\n const isActive = activeId === item.id;\n const hasActiveChild = item.children?.some((child) => activeId === child.id);\n\n return (\n <li key={item.id}>\n <button\n onClick={() => scrollToSection(item.id)}\n className={clsx(\n 'group flex items-center w-full text-left px-3 py-1.5 text-[13px] rounded-md transition-all duration-150',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-[--color-accent] focus-visible:ring-inset',\n isActive || hasActiveChild\n ? 'text-primary font-medium'\n : 'text-secondary hover:text-primary hover:bg-[--bg-hover]'\n )}\n >\n {(isActive || hasActiveChild) && (\n <span className=\"w-0.5 h-3.5 rounded-full bg-[--color-accent] mr-2 -ml-1\" />\n )}\n {item.label}\n </button>\n {item.children && item.children.length > 0 && (\n <ul className=\"ml-4 mt-0.5 space-y-0.5 border-l border-[--border-subtle] pl-2\">\n {item.children.map((child) => {\n const isChildActive = activeId === child.id;\n return (\n <li key={child.id}>\n <button\n onClick={() => scrollToSection(child.id)}\n className={clsx(\n 'block w-full text-left px-2 py-1 text-[12px] rounded-md transition-all duration-150',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-[--color-accent] focus-visible:ring-inset',\n isChildActive\n ? 'text-primary font-medium'\n : 'text-tertiary hover:text-secondary'\n )}\n >\n {child.label}\n </button>\n </li>\n );\n })}\n </ul>\n )}\n </li>\n );\n })}\n </ul>\n </nav>\n </div>\n );\n}\n"],"mappings":"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","names":["resolve","dirname","fileURLToPath","config","join","BRAND","server","viewerRoot","resolve","result","__dirname","dirname","fileURLToPath","resolve","useState","useMemo","useEffect","useCallback","useRef","clsx","useState","useEffect","useCallback","jsx","jsx","jsxs","jsx","jsx","jsx","jsxs","jsx","jsx","jsx","jsxs","jsxs","jsx","jsx","jsx","jsx","jsxs","jsx","jsxs","useState","useEffect","sortedEntries","useCallback","useRef","useEffect","useCallback","clsx","jsx","jsxs","useRef","useEffect","useCallback","clsx","useState","useEffect","useRef","useMemo","useCallback","clsx","Fragment","jsx","jsxs","useState","useRef","useMemo","useEffect","useCallback","clsx","useEffect","useEffect","useCallback","jsx","jsxs","useEffect","useEffect","useState","jsx","jsxs","useState","useEffect","useState","useEffect","useCallback","clsx","jsx","jsxs","useState","useCallback","useEffect","clsx","useState","useEffect","clsx","jsx","jsxs","useState","useEffect","clsx","memo","jsx","jsxs","useState","useMemo","useCallback","jsx","jsxs","useState","useMemo","useCallback","useState","useRef","clsx","useState","useEffect","useMemo","Fragment","jsx","jsxs","useRef","useEffect","useState","useCallback","clsx","useRef","useEffect","useCallback","useState","jsx","jsxs","IsolatedPreviewFrame","useRef","useState","useCallback","useEffect","clsx","jsx","jsxs","useState","useRef","clsx","useState","Fragment","jsx","jsxs","useState","jsxs","jsx","Fragment","Fragment","jsx","jsxs","DeviceMockup","memo","PreviewContent","memo","useCallback","clsx","useState","useEffect","useCallback","useRef","clsx","jsx","jsxs","STORAGE_KEY","useState","useRef","useEffect","useCallback","clsx","useState","useCallback","useMemo","useEffect","clsx","Fragment","jsx","jsxs","useState","useMemo","useEffect","useCallback","clsx","jsxCode","useState","useEffect","useCallback","clsx","jsx","jsxs","useState","useEffect","data","useCallback","clsx","useState","useEffect","useCallback","useMemo","useRef","clsx","useCallback","useEffect","useRef","useState","useRef","useState","useCallback","resolve","useEffect","Fragment","jsx","jsxs","axeModule","useState","useRef","useEffect","serializeViolation","useCallback","resolve","counts","useMemo","clsx","useState","useCallback","useRef","useEffect","clsx","Fragment","jsx","jsxs","useState","useRef","useEffect","useCallback","resolve","clsx","useState","useMemo","useRef","useEffect","clsx","useState","useCallback","useRef","jsx","jsxs","useState","useRef","useEffect","useMemo","clsx","useMemo","useState","clsx","isValidElement","jsx","jsxs","useState","useMemo","clsx","memo","jsx","jsxs","ContractPanel","jsx","jsxs","TabButton","memo","clsx","BottomPanel","useCallback","useMemo","useEffect","useState","jsx","jsxs","jsx","jsxs","useState","useMemo","useEffect","useMemo","useState","useCallback","useEffect","jsx","jsxs","useMemo","useState","useCallback","useEffect","useRef","useEffect","jsx","useMemo","useReducer","useCallback","useMemo","useState","useCallback","useEffect","styles","useState","useEffect","useCallback","DEFAULT_STATE","findSegmentByName","useState","memo","jsx","memo","ScreenshotButton","useState","resolve","Fragment","jsx","jsxs","useState","useCallback","findSegmentByName","useMemo","useRef","useEffect","clsx","useState","useEffect","useRef","clsx","jsx","jsxs"]}
|