@agent-scope/site 1.19.0 → 1.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -1
- package/dist/index.cjs +2819 -299
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2819 -299
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/reader.ts","../src/utils.ts","../src/css.ts","../src/templates/layout.ts","../src/templates/component-detail.ts","../src/templates/component-index.ts","../src/templates/dashboard.ts","../src/builder.ts"],"names":["join"],"mappings":"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AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAA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","file":"index.js","sourcesContent":["import { readdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n ComplianceBatchData,\n ManifestData,\n RenderFileData,\n SiteData,\n SiteOptions,\n} from \"./types.js\";\n\nfunction normalizeOptions(options?: SiteOptions): Required<SiteOptions> {\n return {\n inputDir: options?.inputDir ?? \".reactscope\",\n outputDir: options?.outputDir ?? \".reactscope/site\",\n basePath: options?.basePath ?? \"/\",\n compliancePath: options?.compliancePath ?? \"\",\n title: options?.title ?? \"Scope — Component Gallery\",\n };\n}\n\nexport { normalizeOptions };\n\nasync function readJsonFile<T>(filePath: string): Promise<T> {\n const content = await readFile(filePath, \"utf-8\");\n return JSON.parse(content) as T;\n}\n\nexport async function readSiteData(options: Required<SiteOptions>): Promise<SiteData> {\n // 1. Read manifest\n const manifestPath = join(options.inputDir, \"manifest.json\");\n const manifest = await readJsonFile<ManifestData>(manifestPath);\n\n // 2. Scan renders directory\n const renders = new Map<string, RenderFileData>();\n const rendersDir = join(options.inputDir, \"renders\");\n\n try {\n const entries = await readdir(rendersDir);\n const jsonFiles = entries.filter((f) => f.endsWith(\".json\"));\n\n await Promise.all(\n jsonFiles.map(async (file) => {\n const componentName = file.replace(/\\.json$/, \"\");\n const filePath = join(rendersDir, file);\n try {\n const renderData = await readJsonFile<RenderFileData>(filePath);\n renders.set(componentName, renderData);\n } catch (err) {\n console.warn(\n `[scope/site] Warning: could not read render file ${filePath}:`,\n err instanceof Error ? err.message : String(err),\n );\n }\n }),\n );\n } catch {\n // renders directory may not exist — that's fine\n }\n\n // 3. Optionally read compliance JSON\n let complianceBatch: ComplianceBatchData | undefined;\n if (options.compliancePath) {\n try {\n complianceBatch = await readJsonFile<ComplianceBatchData>(options.compliancePath);\n } catch (err) {\n console.warn(\n `[scope/site] Warning: could not read compliance file ${options.compliancePath}:`,\n err instanceof Error ? err.message : String(err),\n );\n }\n }\n\n return {\n manifest,\n renders,\n complianceBatch,\n options,\n };\n}\n","import type { DOMNodeData, PropData } from \"./types.js\";\n\nexport function escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nexport function slugify(name: string): string {\n return name\n .replace(/([A-Z])/g, (m) => `-${m.toLowerCase()}`)\n .replace(/^-/, \"\")\n .replace(/[^a-z0-9-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\nexport function syntaxHighlightJSX(code: string): string {\n const escaped = escapeHtml(code);\n\n return (\n escaped\n // Comments\n .replace(/(\\/\\/[^\\n]*)/g, '<span class=\"token-comment\">$1</span>')\n .replace(/(\\/\\*[\\s\\S]*?\\*\\/)/g, '<span class=\"token-comment\">$1</span>')\n // JSX tags\n .replace(/(<\\/?)([\\w.]+)/g, '<span class=\"token-tag\">$1$2</span>')\n // JSX attributes (word followed by =)\n .replace(/\\b([\\w-]+)(?==)/g, '<span class=\"token-attr\">$1</span>')\n // Strings\n .replace(\n /("[^&]*"|'[^&]*'|`[^`]*`)/g,\n '<span class=\"token-string\">$1</span>',\n )\n // Keywords\n .replace(\n /\\b(import|export|from|default|const|let|var|function|return|if|else|for|while|class|extends|type|interface|async|await|new|typeof|instanceof)\\b/g,\n '<span class=\"token-keyword\">$1</span>',\n )\n // Numbers\n .replace(/\\b(\\d+\\.?\\d*)\\b/g, '<span class=\"token-number\">$1</span>')\n );\n}\n\nexport function renderDOMTree(node: DOMNodeData, depth = 0): string {\n const indent = \" \".repeat(depth);\n\n // Filter to a short display version of attrs (skip long class strings for the summary line)\n const attrsHtml = Object.entries(node.attrs)\n .map(([k, v]) => {\n const display = v.length > 60 ? v.slice(0, 57) + \"…\" : v;\n return ` <span class=\"dom-attr-name\">${escapeHtml(k)}</span>=<span class=\"dom-attr-value\">\"${escapeHtml(display)}\"</span>`;\n })\n .join(\"\");\n\n const nodeIdAttr = node.nodeId !== undefined ? ` data-node-id=\"${node.nodeId}\"` : \"\";\n const clickable = node.nodeId !== undefined ? \" dom-node-clickable\" : \"\";\n\n const hasChildren = node.children.length > 0;\n const hasText = node.text !== undefined && node.text.trim().length > 0;\n\n if (!hasChildren && !hasText) {\n return `${indent}<span class=\"dom-tag-open${clickable}\"${nodeIdAttr}><${escapeHtml(node.tag)}${attrsHtml} /></span>\\n`;\n }\n\n const childrenHtml = node.children.map((child) => renderDOMTree(child, depth + 1)).join(\"\");\n const textHtml = hasText\n ? `${indent} <span class=\"dom-text\">${escapeHtml(node.text ?? \"\")}</span>\\n`\n : \"\";\n\n return `<details class=\"dom-node${clickable}\" ${depth < 2 ? \"open\" : \"\"}${nodeIdAttr}>\n${indent}<summary><span class=\"dom-tag-open\"><${escapeHtml(node.tag)}${attrsHtml}></span></summary>\n${textHtml}${childrenHtml}${indent}<span class=\"dom-tag-close\"></${escapeHtml(node.tag)}></span>\n</details>`;\n}\n\nexport function propTableRow(name: string, prop: PropData): string {\n const valuesHtml =\n prop.values && prop.values.length > 0\n ? `<br><span style=\"color:var(--color-muted);font-size:11px\">${prop.values.map((v) => escapeHtml(v)).join(\" | \")}</span>`\n : \"\";\n\n const defaultHtml = prop.default !== undefined ? escapeHtml(prop.default) : \"—\";\n\n return `<tr>\n <td><span class=\"prop-name\">${escapeHtml(name)}</span></td>\n <td><span class=\"prop-type\">${escapeHtml(prop.type)}</span>${valuesHtml}</td>\n <td>${prop.required ? '<span class=\"prop-required\">required</span>' : '<span style=\"color:var(--color-muted)\">optional</span>'}</td>\n <td><span class=\"prop-default\">${defaultHtml}</span></td>\n </tr>`;\n}\n","export function generateCSS(): string {\n const css = `@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&family=JetBrains+Mono:wght@400;700&display=swap');\n\n:root {\n --color-text: #0f0f0f;\n --color-muted: #6b7280;\n --color-border: #e5e7eb;\n --color-bg: #ffffff;\n --color-bg-subtle: #f9fafb;\n --color-bg-code: #1a1a2e;\n --color-accent: #2563eb;\n --color-success: #16a34a;\n --color-warn: #d97706;\n --color-error: #dc2626;\n --font-body: 'Inter', system-ui, -apple-system, sans-serif;\n --font-mono: 'JetBrains Mono', 'Fira Code', monospace;\n --radius: 6px;\n --shadow-sm: 0 1px 2px rgba(0,0,0,0.05);\n --shadow: 0 1px 3px rgba(0,0,0,0.1), 0 1px 2px rgba(0,0,0,0.06);\n}\n\n*, *::before, *::after { box-sizing: border-box; }\n\nbody {\n font-family: var(--font-body);\n font-size: 14px;\n line-height: 1.6;\n color: var(--color-text);\n background: var(--color-bg);\n margin: 0;\n}\n\n/* Top nav */\n.top-nav {\n position: sticky;\n top: 0;\n z-index: 100;\n background: var(--color-bg);\n border-bottom: 1px solid var(--color-border);\n height: 52px;\n display: flex;\n align-items: center;\n padding: 0 24px;\n gap: 16px;\n}\n.top-nav .site-title { font-weight: 600; font-size: 15px; text-decoration: none; color: var(--color-text); }\n.top-nav .spacer { flex: 1; }\n.search-box {\n border: 1px solid var(--color-border);\n border-radius: var(--radius);\n padding: 6px 12px;\n font-family: var(--font-body);\n font-size: 13px;\n width: 240px;\n outline: none;\n background: var(--color-bg-subtle);\n}\n.search-box:focus { border-color: var(--color-accent); background: var(--color-bg); }\n\n/* Page layout */\n.page-layout {\n display: flex;\n min-height: calc(100vh - 52px);\n}\n\n/* Left sidebar (component list) */\n.sidebar {\n width: 220px;\n min-width: 220px;\n border-right: 1px solid var(--color-border);\n padding: 16px 0;\n position: sticky;\n top: 52px;\n height: calc(100vh - 52px);\n overflow-y: auto;\n}\n.sidebar-heading {\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--color-muted);\n padding: 4px 16px 8px;\n}\n.sidebar a {\n display: block;\n padding: 5px 16px;\n font-size: 13px;\n color: var(--color-text);\n text-decoration: none;\n border-radius: 0;\n}\n.sidebar a:hover { background: var(--color-bg-subtle); }\n.sidebar a.active { color: var(--color-accent); font-weight: 500; }\n\n/* Main content */\n.main-content {\n flex: 1;\n min-width: 0;\n display: flex;\n}\n.content-body {\n flex: 1;\n min-width: 0;\n padding: 32px 40px;\n max-width: 900px;\n}\n\n/* On this page nav (right side) */\n.on-this-page {\n width: 200px;\n min-width: 200px;\n padding: 32px 16px;\n position: sticky;\n top: 52px;\n height: calc(100vh - 52px);\n overflow-y: auto;\n}\n.on-this-page h4 {\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--color-muted);\n margin: 0 0 8px;\n}\n.on-this-page a {\n display: block;\n padding: 3px 0;\n font-size: 12px;\n color: var(--color-muted);\n text-decoration: none;\n}\n.on-this-page a:hover { color: var(--color-text); }\n\n/* Component header */\n.component-header { margin-bottom: 32px; }\n.component-header h1 { font-size: 28px; font-weight: 700; margin: 0 0 8px; }\n.component-header .meta {\n display: flex;\n gap: 8px;\n align-items: center;\n flex-wrap: wrap;\n margin-bottom: 8px;\n}\n.badge {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 500;\n border: 1px solid var(--color-border);\n color: var(--color-muted);\n background: var(--color-bg-subtle);\n}\n.badge.complex { border-color: #fbbf24; color: #92400e; background: #fffbeb; }\n.badge.simple { border-color: #6ee7b7; color: #065f46; background: #ecfdf5; }\n.badge.memoized { border-color: #a5b4fc; color: #3730a3; background: #eef2ff; }\n\n.filepath {\n font-family: var(--font-mono);\n font-size: 12px;\n color: var(--color-muted);\n}\n\n/* Sections */\n.section {\n padding: 32px 0;\n border-bottom: 1px solid var(--color-border);\n}\n.section:last-child { border-bottom: none; }\n.section-header { margin-bottom: 20px; }\n.section-header h2 {\n font-size: 18px;\n font-weight: 600;\n margin: 0 0 4px;\n}\n.section-header p { color: var(--color-muted); margin: 0; font-size: 13px; }\n\n/* Not generated placeholder */\n.not-generated {\n background: var(--color-bg-subtle);\n border: 1px dashed var(--color-border);\n border-radius: var(--radius);\n padding: 32px;\n text-align: center;\n color: var(--color-muted);\n font-size: 13px;\n}\n\n/* Render preview */\n.render-preview {\n border: 1px solid var(--color-border);\n border-radius: var(--radius);\n overflow: hidden;\n background: #f8f8f8;\n display: inline-block;\n max-width: 100%;\n}\n.render-preview img { display: block; max-width: 100%; }\n.scope-screenshot { zoom: 0.5; display: block; image-rendering: -webkit-optimize-contrast; }\n\n/* Props table */\n.props-table { width: 100%; border-collapse: collapse; font-size: 13px; }\n.props-table th {\n text-align: left;\n font-weight: 600;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--color-muted);\n padding: 8px 12px;\n border-bottom: 2px solid var(--color-border);\n}\n.props-table td {\n padding: 8px 12px;\n border-bottom: 1px solid var(--color-border);\n vertical-align: top;\n}\n.props-table tr:last-child td { border-bottom: none; }\n.prop-name { font-family: var(--font-mono); font-size: 12px; font-weight: 700; }\n.prop-type { font-family: var(--font-mono); font-size: 11px; color: var(--color-accent); }\n.prop-required { color: var(--color-error); font-size: 11px; }\n.prop-default { font-family: var(--font-mono); font-size: 11px; color: var(--color-muted); }\n\n/* Code blocks */\npre.code-block {\n background: var(--color-bg-code);\n color: #e2e8f0;\n border-radius: var(--radius);\n padding: 16px 20px;\n overflow-x: auto;\n font-family: var(--font-mono);\n font-size: 13px;\n line-height: 1.6;\n margin: 0;\n}\n.token-keyword { color: #c792ea; }\n.token-string { color: #c3e88d; }\n.token-comment { color: #546e7a; font-style: italic; }\n.token-tag { color: #f07178; }\n.token-attr { color: #ffcb6b; }\n.token-number { color: #f78c6c; }\n\n/* Stats grid */\n.stats-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n margin-bottom: 24px;\n}\n.stat-card {\n background: var(--color-bg-subtle);\n border: 1px solid var(--color-border);\n border-radius: var(--radius);\n padding: 16px;\n}\n.stat-card .stat-label { font-size: 11px; color: var(--color-muted); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 4px; }\n.stat-card .stat-value { font-size: 22px; font-weight: 700; }\n\n/* Analysis grid */\n.analysis-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 16px;\n}\n.analysis-card {\n background: var(--color-bg-subtle);\n border: 1px solid var(--color-border);\n border-radius: var(--radius);\n padding: 16px;\n}\n.analysis-card h3 { font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: var(--color-muted); margin: 0 0 8px; }\n.analysis-card .value { font-size: 14px; }\n.tag-list { display: flex; flex-wrap: wrap; gap: 4px; }\n.tag {\n display: inline-block;\n padding: 2px 8px;\n background: var(--color-border);\n border-radius: 4px;\n font-family: var(--font-mono);\n font-size: 11px;\n}\n\n/* Token pills */\n.pill-on {\n display: inline-flex; align-items: center; gap: 4px;\n padding: 2px 8px; border-radius: 999px;\n background: #dcfce7; color: #166534;\n font-size: 11px; font-weight: 500;\n}\n.pill-off {\n display: inline-flex; align-items: center; gap: 4px;\n padding: 2px 8px; border-radius: 999px;\n background: #fef3c7; color: #92400e;\n font-size: 11px; font-weight: 500;\n}\n\n/* Compliance bar */\n.compliance-bar-container { margin-bottom: 16px; }\n.compliance-bar-bg { background: var(--color-border); border-radius: 999px; height: 8px; overflow: hidden; }\n.compliance-bar-fill { height: 100%; border-radius: 999px; background: var(--color-success); }\n.compliance-label { font-size: 13px; color: var(--color-muted); margin-bottom: 4px; }\n\n/* Token table */\n.token-table { width: 100%; border-collapse: collapse; font-size: 12px; }\n.token-table th {\n text-align: left; font-weight: 600; font-size: 11px;\n text-transform: uppercase; letter-spacing: 0.05em;\n color: var(--color-muted); padding: 6px 10px;\n border-bottom: 2px solid var(--color-border);\n}\n.token-table td { padding: 6px 10px; border-bottom: 1px solid var(--color-border); vertical-align: top; }\n.token-table tr:last-child td { border-bottom: none; }\n.token-path { font-family: var(--font-mono); color: var(--color-accent); }\n.token-value-swatch { display: inline-block; width: 12px; height: 12px; border-radius: 2px; border: 1px solid var(--color-border); margin-right: 4px; vertical-align: middle; }\n\n/* A11y violations */\n.violation-list { list-style: none; padding: 0; margin: 0; }\n.violation-list li {\n padding: 8px 12px;\n background: #fef2f2;\n border: 1px solid #fecaca;\n border-radius: var(--radius);\n margin-bottom: 6px;\n font-size: 13px;\n color: #991b1b;\n}\n.a11y-role-badge { font-family: var(--font-mono); font-size: 11px; background: var(--color-bg-subtle); border: 1px solid var(--color-border); padding: 2px 6px; border-radius: 4px; }\n\n/* Matrix grid */\n.matrix-grid {\n display: grid;\n gap: 1px;\n background: var(--color-border);\n border: 1px solid var(--color-border);\n border-radius: var(--radius);\n overflow: hidden;\n}\n.matrix-cell { background: var(--color-bg); padding: 8px; text-align: center; }\n.matrix-cell img { border-radius: 2px; }\n.matrix-cell .cell-label { font-size: 10px; color: var(--color-muted); margin-top: 4px; }\n.matrix-header { background: var(--color-bg-subtle); padding: 6px 8px; font-size: 11px; font-weight: 600; color: var(--color-muted); }\n\n/* DOM tree */\n.dom-tree { font-family: var(--font-mono); font-size: 12px; line-height: 1.8; }\ndetails.dom-node > summary { cursor: pointer; list-style: none; }\ndetails.dom-node > summary::-webkit-details-marker { display: none; }\n.dom-tag-open { color: #f07178; }\n.dom-tag-close { color: #f07178; }\n.dom-attr-name { color: #ffcb6b; }\n.dom-attr-value { color: #c3e88d; }\n.dom-text { color: #82aaff; font-style: italic; }\n.dom-node-clickable { cursor: pointer; border-radius: 3px; transition: background 0.1s; }\n.dom-node-clickable:hover, details.dom-node-clickable > summary:hover { background: rgba(255,255,255,0.08); }\n.dom-node-selected, details.dom-node-selected > summary { background: rgba(99,179,237,0.15) !important; outline: 1px solid rgba(99,179,237,0.4); border-radius: 3px; }\n.dom-attr-name { color: #ffcb6b; }\n.dom-attr-value { color: #c3e88d; }\n.dom-text { color: #a0a0b0; font-style: italic; }\n\n/* Composition graph */\n.composition-lists { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }\n.comp-list h3 { font-size: 13px; font-weight: 600; margin: 0 0 8px; color: var(--color-muted); }\n.comp-list ul { list-style: none; padding: 0; margin: 0; }\n.comp-list li { padding: 4px 0; font-size: 13px; border-bottom: 1px solid var(--color-border); }\n.comp-list a { color: var(--color-accent); text-decoration: none; }\n.comp-list a:hover { text-decoration: underline; }\n\n/* Index page */\n.index-header { margin-bottom: 32px; }\n.index-header h1 { font-size: 32px; font-weight: 700; margin: 0 0 8px; }\n.index-header p { color: var(--color-muted); font-size: 15px; margin: 0; }\n.component-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n}\n.component-card {\n border: 1px solid var(--color-border);\n border-radius: var(--radius);\n overflow: hidden;\n text-decoration: none;\n color: var(--color-text);\n transition: box-shadow 0.15s;\n display: block;\n}\n.component-card:hover { box-shadow: var(--shadow); }\n.card-preview {\n background: #f8f8f8;\n height: 160px;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n border-bottom: 1px solid var(--color-border);\n}\n.card-preview img { object-fit: contain; }\n.card-preview .no-preview { color: var(--color-muted); font-size: 12px; }\n.card-body { padding: 12px 16px; }\n.card-name { font-weight: 600; font-size: 14px; margin-bottom: 4px; }\n.card-meta { font-size: 12px; color: var(--color-muted); display: flex; gap: 8px; }\n\n/* Dashboard */\n.dashboard-header { margin-bottom: 32px; }\n.dashboard-header h1 { font-size: 28px; font-weight: 700; margin: 0 0 8px; }\n.section-title { font-size: 16px; font-weight: 600; margin: 0 0 16px; }\n\n/* Responsive */\n@media (max-width: 1024px) {\n .on-this-page { display: none; }\n}\n@media (max-width: 768px) {\n .sidebar { display: none; }\n .content-body { padding: 20px 16px; }\n .analysis-grid { grid-template-columns: 1fr; }\n .composition-lists { grid-template-columns: 1fr; }\n}`;\n\n return `<style>\\n${css}\\n</style>`;\n}\n","import { generateCSS } from \"../css.js\";\nimport { escapeHtml, slugify } from \"../utils.js\";\n\nexport function sidebarLinks(\n components: string[],\n currentSlug: string | null,\n basePath: string,\n): string {\n const links = components\n .sort()\n .map((name) => {\n const slug = slugify(name);\n const isActive = slug === currentSlug;\n return `<a href=\"${basePath}${slug}.html\" class=\"${isActive ? \"active\" : \"\"}\">${escapeHtml(name)}</a>`;\n })\n .join(\"\\n\");\n\n return `<div class=\"sidebar-heading\">Components</div>\\n${links}`;\n}\n\nexport function htmlShell(options: {\n title: string;\n body: string;\n sidebar: string;\n onThisPage: string;\n basePath: string;\n}): string {\n const { title, body, sidebar, onThisPage, basePath } = options;\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>${escapeHtml(title)}</title>\n ${generateCSS()}\n</head>\n<body>\n <nav class=\"top-nav\">\n <a class=\"site-title\" href=\"${basePath}index.html\">Scope</a>\n <div class=\"spacer\"></div>\n <input\n class=\"search-box\"\n type=\"search\"\n placeholder=\"Search components…\"\n id=\"sidebar-search\"\n aria-label=\"Search components\"\n />\n </nav>\n <div class=\"page-layout\">\n <nav class=\"sidebar\" id=\"sidebar\">\n ${sidebar}\n </nav>\n <div class=\"main-content\">\n <div class=\"content-body\">\n ${body}\n </div>\n <nav class=\"on-this-page\">\n <h4>On this page</h4>\n ${onThisPage}\n </nav>\n </div>\n </div>\n <script>\n (function () {\n var search = document.getElementById('sidebar-search');\n var sidebar = document.getElementById('sidebar');\n if (!search || !sidebar) return;\n search.addEventListener('input', function () {\n var q = search.value.toLowerCase();\n var links = sidebar.querySelectorAll('a');\n links.forEach(function (link) {\n var text = link.textContent || '';\n link.style.display = text.toLowerCase().includes(q) ? '' : 'none';\n });\n });\n })();\n </script>\n</body>\n</html>`;\n}\n","import type { SiteData } from \"../types.js\";\nimport { escapeHtml, propTableRow, renderDOMTree, slugify } from \"../utils.js\";\nimport { htmlShell, sidebarLinks } from \"./layout.js\";\n\nconst SECTIONS = [\n \"Playground\",\n \"Matrix\",\n \"Docs\",\n \"Analysis\",\n \"X-Ray\",\n \"Tokens\",\n \"Accessibility\",\n \"Composition\",\n \"Responsive\",\n \"Stress Tests\",\n];\n\nfunction notGenerated(message = \"Not generated\"): string {\n return `<div class=\"not-generated\">${escapeHtml(message)}</div>`;\n}\n\nfunction sectionWrap(id: string, title: string, description: string, content: string): string {\n return `<section class=\"section\" id=\"${id}\">\n <div class=\"section-header\">\n <h2>${escapeHtml(title)}</h2>\n <p>${escapeHtml(description)}</p>\n </div>\n ${content}\n</section>`;\n}\n\nfunction renderPlayground(name: string, data: SiteData): string {\n const component = data.manifest.components[name];\n const render = data.renders.get(name);\n\n const props = component ? Object.entries(component.props) : [];\n const propsTable =\n props.length > 0\n ? `<table class=\"props-table\">\n <thead>\n <tr>\n <th>Prop</th>\n <th>Type</th>\n <th>Required</th>\n <th>Default</th>\n </tr>\n </thead>\n <tbody>\n ${props.map(([n, p]) => propTableRow(n, p)).join(\"\\n \")}\n </tbody>\n</table>`\n : `<p style=\"color:var(--color-muted);font-size:13px\">No props defined.</p>`;\n\n const renderW = render?.width != null ? render.width : undefined;\n const renderH = render?.height != null ? render.height : undefined;\n const renderSizeAttr =\n renderW != null && renderH != null ? ` width=\"${renderW}\" height=\"${renderH}\"` : \"\";\n const renderHtml = render?.screenshot\n ? `<div class=\"render-preview\">\n <img src=\"data:image/png;base64,${render.screenshot}\" alt=\"${escapeHtml(name)} render\"${renderSizeAttr} />\n</div>`\n : notGenerated(\"Render not generated. Run scope render to produce screenshots.\");\n\n return sectionWrap(\n \"playground\",\n \"Playground\",\n \"Props reference and rendered preview.\",\n `${propsTable}\n<div style=\"margin-top:24px\">${renderHtml}</div>`,\n );\n}\n\nfunction renderMatrix(name: string, data: SiteData): string {\n const render = data.renders.get(name);\n\n if (!render?.cells || render.cells.length === 0) {\n return sectionWrap(\n \"matrix\",\n \"Matrix\",\n \"Prop combination matrix renders.\",\n notGenerated(\"Matrix renders not generated. Run scope render --matrix to produce a matrix.\"),\n );\n }\n\n const cells = render.cells;\n const cols = Math.ceil(Math.sqrt(cells.length));\n\n const cellsHtml = cells\n .map((cell) => {\n const label = cell.axisValues.join(\" / \");\n const imgHtml = cell.screenshot\n ? `<img class=\"scope-screenshot\" src=\"data:image/png;base64,${cell.screenshot}\" alt=\"${escapeHtml(label)}\" />`\n : `<span style=\"color:var(--color-muted);font-size:11px\">${cell.error ? escapeHtml(cell.error) : \"failed\"}</span>`;\n return `<div class=\"matrix-cell\">${imgHtml}<div class=\"cell-label\">${escapeHtml(label)}</div></div>`;\n })\n .join(\"\\n\");\n\n const grid = `<div class=\"matrix-grid\" style=\"grid-template-columns: repeat(${cols}, 1fr)\">\n${cellsHtml}\n</div>`;\n\n return sectionWrap(\"matrix\", \"Matrix\", \"Prop combination matrix renders.\", grid);\n}\n\nfunction renderDocs(): string {\n return sectionWrap(\n \"docs\",\n \"Docs\",\n \"Component documentation.\",\n `<p style=\"color:var(--color-muted);font-size:13px\">No documentation file found for this component.</p>`,\n );\n}\n\nfunction renderAnalysis(name: string, data: SiteData): string {\n const component = data.manifest.components[name];\n if (!component) {\n return sectionWrap(\"analysis\", \"Analysis\", \"Static analysis results.\", notGenerated());\n }\n\n const propCount = Object.keys(component.props).length;\n const hookCount = component.detectedHooks.length;\n const sideEffectCount =\n component.sideEffects.fetches.length +\n (component.sideEffects.timers ? 1 : 0) +\n component.sideEffects.subscriptions.length +\n (component.sideEffects.globalListeners ? 1 : 0);\n\n const statsGrid = `<div class=\"stats-grid\">\n <div class=\"stat-card\">\n <div class=\"stat-label\">Complexity</div>\n <div class=\"stat-value\"><span class=\"badge ${component.complexityClass}\">${escapeHtml(component.complexityClass)}</span></div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Props</div>\n <div class=\"stat-value\">${propCount}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Hooks</div>\n <div class=\"stat-value\">${hookCount}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Side Effects</div>\n <div class=\"stat-value\">${sideEffectCount}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Export</div>\n <div class=\"stat-value\" style=\"font-size:14px\">${escapeHtml(component.exportType)}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Memoized</div>\n <div class=\"stat-value\" style=\"font-size:14px\">${component.memoized ? \"Yes\" : \"No\"}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">forwardedRef</div>\n <div class=\"stat-value\" style=\"font-size:14px\">${component.forwardedRef ? \"Yes\" : \"No\"}</div>\n </div>\n</div>`;\n\n function tagList(items: string[]): string {\n if (items.length === 0)\n return `<span style=\"color:var(--color-muted);font-size:12px\">None</span>`;\n return `<div class=\"tag-list\">${items.map((i) => `<span class=\"tag\">${escapeHtml(i)}</span>`).join(\"\")}</div>`;\n }\n\n const sideEffectItems: string[] = [\n ...component.sideEffects.fetches.map((f) => `fetch: ${f}`),\n ...(component.sideEffects.timers ? [\"timers\"] : []),\n ...component.sideEffects.subscriptions.map((s) => `sub: ${s}`),\n ...(component.sideEffects.globalListeners ? [\"global listeners\"] : []),\n ];\n\n const analysisGrid = `<div class=\"analysis-grid\">\n <div class=\"analysis-card\">\n <h3>Detected Hooks</h3>\n <div class=\"value\">${tagList(component.detectedHooks)}</div>\n </div>\n <div class=\"analysis-card\">\n <h3>Required Contexts</h3>\n <div class=\"value\">${tagList(component.requiredContexts)}</div>\n </div>\n <div class=\"analysis-card\">\n <h3>HOC Wrappers</h3>\n <div class=\"value\">${tagList(component.hocWrappers)}</div>\n </div>\n <div class=\"analysis-card\">\n <h3>Side Effects</h3>\n <div class=\"value\">${tagList(sideEffectItems)}</div>\n </div>\n</div>`;\n\n return sectionWrap(\n \"analysis\",\n \"Analysis\",\n \"Static analysis results for this component.\",\n `${statsGrid}${analysisGrid}`,\n );\n}\n\nfunction renderXRay(name: string, data: SiteData): string {\n const render = data.renders.get(name);\n\n if (!render?.dom) {\n return sectionWrap(\n \"x-ray\",\n \"X-Ray\",\n \"DOM structure and computed styles.\",\n notGenerated(\"X-Ray data not generated. Run scope render with DOM capture enabled.\"),\n );\n }\n\n const dom = render.dom;\n\n // Extract per-node styles keyed by nodeId from computedStyles map\n const nodeStylesMap: Record<number, Record<string, string>> = {};\n if (render.computedStyles) {\n for (const [key, styles] of Object.entries(render.computedStyles)) {\n const m = key.match(/^#node-(\\d+)$/);\n if (m?.[1] !== undefined) nodeStylesMap[parseInt(m[1], 10)] = styles;\n }\n }\n const nodeStylesJson = escapeHtml(JSON.stringify(nodeStylesMap));\n\n const treeHtml = `<div class=\"dom-tree\">${renderDOMTree(dom.tree)}</div>`;\n\n // Styles panel — populated by JS when user clicks a node\n const stylesPanelHtml = `\n<div id=\"xray-styles-panel-${escapeHtml(name)}\" class=\"xray-styles-panel\" style=\"display:none;margin-top:16px;border:1px solid var(--color-border);border-radius:6px;overflow:hidden\">\n <div class=\"xray-styles-header\" style=\"padding:8px 12px;background:var(--color-surface-2);font-size:12px;font-weight:600;color:var(--color-muted);display:flex;justify-content:space-between;align-items:center\">\n <span id=\"xray-styles-label-${escapeHtml(name)}\">— no node selected —</span>\n <button onclick=\"document.getElementById('xray-styles-panel-${escapeHtml(name)}').style.display='none'\" style=\"background:none;border:none;cursor:pointer;color:var(--color-muted);font-size:16px;line-height:1\">×</button>\n </div>\n <table class=\"token-table\" style=\"margin:0\">\n <thead><tr><th>Property</th><th>Value</th></tr></thead>\n <tbody id=\"xray-styles-body-${escapeHtml(name)}\"></tbody>\n </table>\n</div>\n<script>\n(function() {\n var nodeStyles = JSON.parse(${nodeStylesJson});\n var container = document.currentScript.parentElement;\n container.addEventListener(\"click\", function(e) {\n var el = e.target.closest(\"[data-node-id]\");\n if (!el) return;\n var id = parseInt(el.getAttribute(\"data-node-id\"), 10);\n var styles = nodeStyles[id];\n if (!styles) return;\n var panel = document.getElementById(\"xray-styles-panel-${escapeHtml(name)}\");\n var label = document.getElementById(\"xray-styles-label-${escapeHtml(name)}\");\n var body = document.getElementById(\"xray-styles-body-${escapeHtml(name)}\");\n var tag = el.tagName === \"DETAILS\" ? el.querySelector(\"summary .dom-tag-open\") : el;\n label.textContent = tag ? tag.textContent.trim().slice(0, 60) : \"node #\" + id;\n body.innerHTML = Object.entries(styles).map(function(e) {\n return \"<tr><td>\" + e[0] + \"</td><td style=\"font-family:monospace\">\" + e[1] + \"</td></tr>\";\n }).join(\"\");\n panel.style.display = \"block\";\n // Highlight selected node\n container.querySelectorAll(\".dom-node-selected\").forEach(function(n) { n.classList.remove(\"dom-node-selected\"); });\n el.classList.add(\"dom-node-selected\");\n });\n})();\n</script>`;\n\n return sectionWrap(\n \"x-ray\",\n \"X-Ray\",\n `DOM structure — ${dom.elementCount} elements. Click any element to inspect its computed styles.`,\n `${treeHtml}${stylesPanelHtml}`,\n );\n}\n\nfunction renderTokens(name: string, data: SiteData): string {\n if (!data.complianceBatch) {\n return sectionWrap(\n \"tokens\",\n \"Tokens\",\n \"Design token compliance.\",\n notGenerated(\"Compliance data not generated. Run scope tokens to audit design tokens.\"),\n );\n }\n\n const report = data.complianceBatch.components[name];\n if (!report) {\n return sectionWrap(\n \"tokens\",\n \"Tokens\",\n \"Design token compliance.\",\n notGenerated(\"No compliance report found for this component.\"),\n );\n }\n\n const pct = Math.round(report.compliance * 100);\n const barHtml = `<div class=\"compliance-bar-container\">\n <div class=\"compliance-label\">${pct}% on-system (${report.onSystem} / ${report.total} properties)</div>\n <div class=\"compliance-bar-bg\">\n <div class=\"compliance-bar-fill\" style=\"width:${pct}%\"></div>\n </div>\n</div>`;\n\n const rows = Object.entries(report.properties)\n .map(([prop, result]) => {\n const pill =\n result.status === \"on_system\"\n ? `<span class=\"pill-on\">✓ ${escapeHtml(result.token ?? \"\")}</span>`\n : `<span class=\"pill-off\">✗ off-system</span>`;\n\n const swatchStyle = result.value.startsWith(\"#\")\n ? ` style=\"background:${escapeHtml(result.value)}\"`\n : \"\";\n\n const nearestHtml = result.nearest\n ? `<span style=\"color:var(--color-muted);font-size:10px\"> nearest: ${escapeHtml(result.nearest.token)}</span>`\n : \"\";\n\n return `<tr>\n <td class=\"token-path\">${escapeHtml(prop)}</td>\n <td><span class=\"token-value-swatch\"${swatchStyle}></span>${escapeHtml(result.value)}</td>\n <td>${pill}${nearestHtml}</td>\n </tr>`;\n })\n .join(\"\\n \");\n\n const tableHtml = `<table class=\"token-table\">\n <thead><tr><th>Property</th><th>Value</th><th>Status</th></tr></thead>\n <tbody>${rows}</tbody>\n</table>`;\n\n return sectionWrap(\n \"tokens\",\n \"Tokens\",\n \"Design token compliance audit.\",\n `${barHtml}${tableHtml}`,\n );\n}\n\nfunction renderAccessibility(name: string, data: SiteData): string {\n const render = data.renders.get(name);\n\n if (!render?.accessibility) {\n return sectionWrap(\n \"accessibility\",\n \"Accessibility\",\n \"Accessibility audit results.\",\n notGenerated(\n \"Accessibility data not generated. Run scope render with accessibility capture enabled.\",\n ),\n );\n }\n\n const a11y = render.accessibility;\n const roleBadge = `<span class=\"a11y-role-badge\">${escapeHtml(a11y.role)}</span>`;\n\n const violationsHtml =\n a11y.violations.length > 0\n ? `<ul class=\"violation-list\">${a11y.violations.map((v) => `<li>${escapeHtml(v)}</li>`).join(\"\")}</ul>`\n : `<p style=\"color:var(--color-success);font-size:13px\">✓ No violations found.</p>`;\n\n return sectionWrap(\n \"accessibility\",\n \"Accessibility\",\n \"Accessibility audit results.\",\n `<p style=\"font-size:13px;margin:0 0 12px\">Role: ${roleBadge} Name: <em>${escapeHtml(a11y.name || \"(none)\")}</em></p>\n${violationsHtml}`,\n );\n}\n\nfunction renderComposition(name: string, data: SiteData): string {\n const component = data.manifest.components[name];\n\n if (!component || (component.composes.length === 0 && component.composedBy.length === 0)) {\n return sectionWrap(\n \"composition\",\n \"Composition\",\n \"Component dependency graph.\",\n `<p style=\"color:var(--color-muted);font-size:13px\">This component stands alone.</p>`,\n );\n }\n\n function compList(title: string, items: string[]): string {\n if (items.length === 0) {\n return `<div class=\"comp-list\"><h3>${escapeHtml(title)}</h3><p style=\"color:var(--color-muted);font-size:12px\">None</p></div>`;\n }\n const liItems = items\n .map(\n (n) => `<li><a href=\"${data.options.basePath}${slugify(n)}.html\">${escapeHtml(n)}</a></li>`,\n )\n .join(\"\");\n return `<div class=\"comp-list\"><h3>${escapeHtml(title)}</h3><ul>${liItems}</ul></div>`;\n }\n\n return sectionWrap(\n \"composition\",\n \"Composition\",\n \"Component dependency graph.\",\n `<div class=\"composition-lists\">\n ${compList(\"Composes\", component.composes)}\n ${compList(\"Composed By\", component.composedBy)}\n</div>`,\n );\n}\n\nexport function renderComponentDetail(name: string, data: SiteData): string {\n const component = data.manifest.components[name];\n const slug = slugify(name);\n\n const complexityBadge = component\n ? `<span class=\"badge ${component.complexityClass}\">${escapeHtml(component.complexityClass)}</span>`\n : \"\";\n const memoizedBadge = component?.memoized ? `<span class=\"badge memoized\">memo</span>` : \"\";\n const exportBadge = component\n ? `<span class=\"badge\">${escapeHtml(component.exportType)}</span>`\n : \"\";\n const filepath = component ? `<div class=\"filepath\">${escapeHtml(component.filePath)}</div>` : \"\";\n\n const header = `<div class=\"component-header\">\n <h1>${escapeHtml(name)}</h1>\n <div class=\"meta\">${complexityBadge}${memoizedBadge}${exportBadge}</div>\n ${filepath}\n</div>`;\n\n const sections = [\n renderPlayground(name, data),\n renderMatrix(name, data),\n renderDocs(),\n renderAnalysis(name, data),\n renderXRay(name, data),\n renderTokens(name, data),\n renderAccessibility(name, data),\n renderComposition(name, data),\n sectionWrap(\n \"responsive\",\n \"Responsive\",\n \"Multi-viewport renders.\",\n notGenerated(\n \"Responsive renders not generated. Multi-viewport rendering is a future feature.\",\n ),\n ),\n sectionWrap(\n \"stress-tests\",\n \"Stress Tests\",\n \"Edge case and stress test renders.\",\n notGenerated(\"Stress tests not generated. Stress render runs are a future feature.\"),\n ),\n ];\n\n const body = `${header}${sections.join(\"\\n\")}`;\n\n const onThisPage = SECTIONS.map((s) => {\n const id = s.toLowerCase().replace(/\\s+/g, \"-\");\n return `<a href=\"#${id}\">${escapeHtml(s)}</a>`;\n }).join(\"\\n\");\n\n const componentNames = Object.keys(data.manifest.components);\n const sidebar = sidebarLinks(componentNames, slug, data.options.basePath);\n\n return htmlShell({\n title: `${name} — ${data.options.title}`,\n body,\n sidebar,\n onThisPage,\n basePath: data.options.basePath,\n });\n}\n","import type { SiteData } from \"../types.js\";\nimport { escapeHtml, slugify } from \"../utils.js\";\nimport { htmlShell, sidebarLinks } from \"./layout.js\";\n\nexport function renderComponentIndex(data: SiteData): string {\n const components = Object.entries(data.manifest.components);\n const totalCount = components.length;\n const simpleCount = components.filter(([, c]) => c.complexityClass === \"simple\").length;\n const complexCount = components.filter(([, c]) => c.complexityClass === \"complex\").length;\n const memoizedCount = components.filter(([, c]) => c.memoized).length;\n\n const statsGrid = `<div class=\"stats-grid\">\n <div class=\"stat-card\">\n <div class=\"stat-label\">Total Components</div>\n <div class=\"stat-value\">${totalCount}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Simple</div>\n <div class=\"stat-value\">${simpleCount}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Complex</div>\n <div class=\"stat-value\">${complexCount}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Memoized</div>\n <div class=\"stat-value\">${memoizedCount}</div>\n </div>\n</div>`;\n\n const cards = components\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([name, component]) => {\n const slug = slugify(name);\n const render = data.renders.get(name);\n const propCount = Object.keys(component.props).length;\n const hookCount = component.detectedHooks.length;\n\n const previewHtml = render?.screenshot\n ? `<img class=\"scope-screenshot\" src=\"data:image/png;base64,${render.screenshot}\" alt=\"${escapeHtml(name)}\" />`\n : `<span class=\"no-preview\">No preview</span>`;\n\n return `<a class=\"component-card\" href=\"${data.options.basePath}${slug}.html\" data-name=\"${escapeHtml(name.toLowerCase())}\">\n <div class=\"card-preview\">${previewHtml}</div>\n <div class=\"card-body\">\n <div class=\"card-name\">${escapeHtml(name)}</div>\n <div class=\"card-meta\">\n <span>${propCount} props</span>\n <span class=\"badge ${component.complexityClass}\" style=\"font-size:10px\">${escapeHtml(component.complexityClass)}</span>\n ${hookCount > 0 ? `<span>${hookCount} hooks</span>` : \"\"}\n </div>\n </div>\n</a>`;\n })\n .join(\"\\n\");\n\n const cardGrid = `<div class=\"component-grid\" id=\"component-grid\">${cards}</div>`;\n\n const filterScript = `<script>\n(function () {\n var grid = document.getElementById('component-grid');\n var search = document.getElementById('sidebar-search');\n if (!grid || !search) return;\n var indexSearch = document.getElementById('index-search');\n function filter(q) {\n var cards = grid.querySelectorAll('.component-card');\n cards.forEach(function (card) {\n var name = card.getAttribute('data-name') || '';\n card.style.display = name.includes(q) ? '' : 'none';\n });\n }\n search.addEventListener('input', function () { filter(search.value.toLowerCase()); });\n if (indexSearch) {\n indexSearch.addEventListener('input', function () { filter(indexSearch.value.toLowerCase()); });\n }\n})();\n</script>`;\n\n const header = `<div class=\"index-header\">\n <h1>${escapeHtml(data.options.title)}</h1>\n <p>${totalCount} component${totalCount === 1 ? \"\" : \"s\"} analysed</p>\n <input class=\"search-box\" type=\"search\" id=\"index-search\" placeholder=\"Filter components…\" style=\"margin-top:12px\" />\n</div>`;\n\n const body = `${header}${statsGrid}${cardGrid}${filterScript}`;\n\n const componentNames = Object.keys(data.manifest.components);\n const sidebar = sidebarLinks(componentNames, null, data.options.basePath);\n\n const onThisPage = `<a href=\"#top\">Overview</a>\\n<a href=\"#component-grid\">Components</a>`;\n\n return htmlShell({\n title: data.options.title,\n body,\n sidebar,\n onThisPage,\n basePath: data.options.basePath,\n });\n}\n","import type { SiteData } from \"../types.js\";\nimport { escapeHtml, slugify } from \"../utils.js\";\nimport { htmlShell, sidebarLinks } from \"./layout.js\";\n\nexport function renderDashboard(data: SiteData): string {\n const components = Object.entries(data.manifest.components);\n const totalCount = components.length;\n\n const simpleCount = components.filter(([, c]) => c.complexityClass === \"simple\").length;\n const complexCount = components.filter(([, c]) => c.complexityClass === \"complex\").length;\n const renderedCount = components.filter(([name]) => data.renders.has(name)).length;\n\n const totalProps = components.reduce((sum, [, c]) => sum + Object.keys(c.props).length, 0);\n const avgProps = totalCount > 0 ? Math.round(totalProps / totalCount) : 0;\n\n let overallCompliance: number | null = null;\n if (data.complianceBatch) {\n const reports = Object.values(data.complianceBatch.components);\n if (reports.length > 0) {\n overallCompliance = Math.round(\n (reports.reduce((sum, r) => sum + r.compliance, 0) / reports.length) * 100,\n );\n }\n }\n\n const statsGrid = `<div class=\"stats-grid\" style=\"margin-bottom:32px\">\n <div class=\"stat-card\">\n <div class=\"stat-label\">Total Components</div>\n <div class=\"stat-value\">${totalCount}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Avg Props</div>\n <div class=\"stat-value\">${avgProps}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">With Renders</div>\n <div class=\"stat-value\">${renderedCount}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Compliance</div>\n <div class=\"stat-value\">${overallCompliance !== null ? `${overallCompliance}%` : \"—\"}</div>\n </div>\n</div>`;\n\n // Complexity breakdown\n const complexitySection = `<div class=\"section\" style=\"padding:24px 0;border-bottom:1px solid var(--color-border)\">\n <h2 class=\"section-title\">Complexity Breakdown</h2>\n <div class=\"stats-grid\">\n <div class=\"stat-card\">\n <div class=\"stat-label\">Simple</div>\n <div class=\"stat-value\" style=\"color:var(--color-success)\">${simpleCount}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Complex</div>\n <div class=\"stat-value\" style=\"color:var(--color-warn)\">${complexCount}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Simple %</div>\n <div class=\"stat-value\">${totalCount > 0 ? Math.round((simpleCount / totalCount) * 100) : 0}%</div>\n </div>\n </div>\n</div>`;\n\n // Top components by prop count\n const topByProps = components\n .sort(([, a], [, b]) => Object.keys(b.props).length - Object.keys(a.props).length)\n .slice(0, 10);\n\n const topPropsRows = topByProps\n .map(([name, component]) => {\n const slug = slugify(name);\n const propCount = Object.keys(component.props).length;\n return `<tr>\n <td><a href=\"${data.options.basePath}${slug}.html\" style=\"color:var(--color-accent);text-decoration:none\">${escapeHtml(name)}</a></td>\n <td>${propCount}</td>\n <td><span class=\"badge ${component.complexityClass}\">${escapeHtml(component.complexityClass)}</span></td>\n </tr>`;\n })\n .join(\"\\n \");\n\n const topPropsSection = `<div class=\"section\" style=\"padding:24px 0;border-bottom:1px solid var(--color-border)\">\n <h2 class=\"section-title\">Top Components by Prop Count</h2>\n <table class=\"props-table\">\n <thead><tr><th>Component</th><th>Props</th><th>Complexity</th></tr></thead>\n <tbody>${topPropsRows}</tbody>\n </table>\n</div>`;\n\n // Compliance section\n let complianceSection = \"\";\n if (data.complianceBatch && overallCompliance !== null) {\n const complianceRows = Object.entries(data.complianceBatch.components)\n .sort(([, a], [, b]) => b.compliance - a.compliance)\n .map(([name, report]) => {\n const pct = Math.round(report.compliance * 100);\n const slug = slugify(name);\n const barHtml = `<div class=\"compliance-bar-bg\" style=\"min-width:120px\">\n <div class=\"compliance-bar-fill\" style=\"width:${pct}%\"></div>\n </div>`;\n return `<tr>\n <td><a href=\"${data.options.basePath}${slug}.html\" style=\"color:var(--color-accent);text-decoration:none\">${escapeHtml(name)}</a></td>\n <td>${pct}%</td>\n <td>${barHtml}</td>\n <td>${report.onSystem} / ${report.total}</td>\n </tr>`;\n })\n .join(\"\\n \");\n\n complianceSection = `<div class=\"section\" style=\"padding:24px 0\">\n <h2 class=\"section-title\">Design Token Compliance — ${overallCompliance}% overall</h2>\n <table class=\"props-table\">\n <thead><tr><th>Component</th><th>Score</th><th>Bar</th><th>On-System</th></tr></thead>\n <tbody>${complianceRows}</tbody>\n </table>\n</div>`;\n }\n\n const header = `<div class=\"dashboard-header\">\n <h1>Dashboard</h1>\n <p style=\"color:var(--color-muted);font-size:14px\">Overview of all ${totalCount} analysed components.</p>\n</div>`;\n\n const body = `${header}${statsGrid}${complexitySection}${topPropsSection}${complianceSection}`;\n\n const componentNames = Object.keys(data.manifest.components);\n const sidebar = sidebarLinks(componentNames, null, data.options.basePath);\n\n const onThisPage = `<a href=\"#top\">Overview</a>\n<a href=\"#complexity\">Complexity</a>\n<a href=\"#top-props\">Top by Props</a>\n${data.complianceBatch ? '<a href=\"#compliance\">Compliance</a>' : \"\"}`;\n\n return htmlShell({\n title: `Dashboard — ${data.options.title}`,\n body,\n sidebar,\n onThisPage,\n basePath: data.options.basePath,\n });\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { normalizeOptions, readSiteData } from \"./reader.js\";\nimport { renderComponentDetail } from \"./templates/component-detail.js\";\nimport { renderComponentIndex } from \"./templates/component-index.js\";\nimport { renderDashboard } from \"./templates/dashboard.js\";\nimport type { SiteOptions } from \"./types.js\";\nimport { slugify } from \"./utils.js\";\n\nexport async function buildSite(options?: SiteOptions): Promise<void> {\n const normalizedOptions = normalizeOptions(options);\n\n console.log(`[scope/site] Reading data from ${normalizedOptions.inputDir}…`);\n const data = await readSiteData(normalizedOptions);\n\n const componentNames = Object.keys(data.manifest.components);\n console.log(`[scope/site] Found ${componentNames.length} components.`);\n\n // Create output directory\n await mkdir(normalizedOptions.outputDir, { recursive: true });\n\n // Generate component detail pages\n for (const name of componentNames) {\n const slug = slugify(name);\n const html = renderComponentDetail(name, data);\n const outputPath = join(normalizedOptions.outputDir, `${slug}.html`);\n await writeFile(outputPath, html, \"utf-8\");\n console.log(`[scope/site] ✓ ${name} → ${slug}.html`);\n }\n\n // Generate index page\n const indexHtml = renderComponentIndex(data);\n await writeFile(join(normalizedOptions.outputDir, \"index.html\"), indexHtml, \"utf-8\");\n console.log(`[scope/site] ✓ index.html`);\n\n // Generate dashboard page\n const dashboardHtml = renderDashboard(data);\n await writeFile(join(normalizedOptions.outputDir, \"dashboard.html\"), dashboardHtml, \"utf-8\");\n console.log(`[scope/site] ✓ dashboard.html`);\n\n console.log(\n `[scope/site] Done. Site written to ${normalizedOptions.outputDir} (${componentNames.length + 2} files).`,\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/reader.ts","../src/utils.ts","../src/css.ts","../src/templates/layout.ts","../src/templates/component-detail.ts","../src/templates/component-index.ts","../src/templates/dashboard.ts","../src/templates/icon-browser.ts","../src/templates/token-browser.ts","../src/builder.ts"],"names":["body","join"],"mappings":"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A;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAAA;AA0mDZ,EAAA,OAAO,CAAA;AAAA,EAAY,GAAG;AAAA,QAAA,CAAA;AACxB;;;AChmDO,SAAS,iBAAiB,IAAA,EAA8B;AAC7D,EAAA,MAAM,QAAsB,EAAC;AAC7B,EAAA,MAAM,QAAA,GAAW,KAAK,OAAA,CAAQ,QAAA;AAC9B,EAAA,MAAM,YAAA,GAAe,KAAK,OAAA,CAAQ,YAAA;AAElC,EAAA,KAAA,MAAW,CAAC,MAAM,SAAS,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,EAAG;AACxE,IAAA,MAAM,MAAA,GACJ,YAAA,CAAa,MAAA,GAAS,CAAA,IACtB,YAAA,CAAa,IAAA;AAAA,MACX,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,EAAG,SAAA,CAAU,QAAQ,CAAA,IAAK,SAAA,CAAU,CAAA,EAAG,SAAA,CAAU,WAAW;AAAA,KAC/E;AAEF,IAAA,IAAI,SAAA,CAAU,QAAA,IAAY,CAAC,MAAA,EAAQ;AAEnC,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,IAAA;AAAA,MACA,IAAA,EAAM,SAAS,MAAA,GAAS,WAAA;AAAA,MACxB,KAAK,CAAA,EAAG,QAAQ,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAA,CAAA;AAAA,MAChC,YAAY,SAAA,CAAU,UAAA;AAAA,MACtB,WAAW,SAAA,CAAU,QAAA,IAAY,EAAC,EAAG,KAAK,GAAG;AAAA,KAC9C,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA;AAC1D;AAEO,SAAS,YAAA,CAAa,MAAgB,WAAA,EAAoC;AAC/E,EAAA,MAAM,EAAE,UAAA,EAAW,GAAI,IAAA,CAAK,QAAA;AAC5B,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,CAAS,WAAA,IAAe,EAAC;AAClD,EAAA,MAAM,QAAA,GAAW,KAAK,OAAA,CAAQ,QAAA;AAC9B,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,OAAA,CAAQ,YAAA,CAAa,MAAA,GAAS,CAAA;AAGpD,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,CAAE,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAC,EAAE,QAAQ,CAAA;AAG/E,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAsB;AAChD,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,aAAA,CAAc,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AAAA,EAChC;AACA,EAAA,MAAM,YAAsB,EAAC;AAE7B,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,SAAS,CAAA,IAAK,cAAA,EAAgB;AAC9C,IAAA,IAAI,UAAU,UAAA,EAAY;AACxB,MAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,SAAA,CAAU,UAAU,CAAA,EAAG;AAC5C,QAAA,aAAA,CAAc,GAAA,CAAI,SAAA,CAAU,UAAA,EAAY,EAAE,CAAA;AAAA,MAC5C;AACA,MAAA,aAAA,CAAc,GAAA,CAAI,SAAA,CAAU,UAAU,CAAA,EAAG,KAAK,IAAI,CAAA;AAAA,IACpD,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,IACrB;AAAA,EACF;AAGA,EAAA,MAAM,oBAAoB,aAAA,CAAc,IAAA,GAAO,CAAA,IAAK,SAAA,CAAU,SAAS,cAAA,CAAe,MAAA;AAEtF,EAAA,SAAS,YAAY,KAAA,EAAyB;AAC5C,IAAA,OAAO,KAAA,CACJ,IAAA,EAAK,CACL,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,MAAA,MAAM,IAAA,GAAO,QAAQ,IAAI,CAAA;AACzB,MAAA,MAAM,WAAW,IAAA,KAAS,WAAA;AAC1B,MAAA,OAAO,CAAA,SAAA,EAAY,QAAQ,CAAA,EAAG,IAAI,CAAA,cAAA,EAAiB,QAAA,GAAW,QAAA,GAAW,EAAE,CAAA,EAAA,EAAK,UAAA,CAAW,IAAI,CAAC,CAAA,IAAA,CAAA;AAAA,IAClG,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAAA,EACd;AAEA,EAAA,MAAM,SAAA,GAAA,CAAa,IAAA,CAAK,YAAA,EAAc,MAAA,IAAU,CAAA,IAAK,CAAA;AAErD,EAAA,MAAM,eAAe,CAAA,SAAA,EAAY,QAAQ,sBAAsB,WAAA,KAAgB,IAAA,GAAO,WAAW,EAAE,CAAA,cAAA,CAAA;AACnG,EAAA,MAAM,UAAA,GAAa,YACf,CAAA,SAAA,EAAY,QAAQ,uBAAuB,WAAA,KAAgB,QAAA,GAAW,QAAA,GAAW,EAAE,CAAA,YAAA,CAAA,GACnF,EAAA;AACJ,EAAA,MAAM,SAAA,GAAY,WACd,CAAA,SAAA,EAAY,QAAQ,sBAAsB,WAAA,KAAgB,OAAA,GAAU,QAAA,GAAW,EAAE,CAAA,WAAA,CAAA,GACjF,EAAA;AAEJ,EAAA,IAAI,CAAC,iBAAA,EAAmB;AACtB,IAAA,MAAM,KAAA,GAAQ,YAAY,cAAA,CAAe,GAAA,CAAI,CAAC,CAAC,IAAI,CAAA,KAAM,IAAI,CAAC,CAAA;AAC9D,IAAA,OAAO,GAAG,YAAY;AAAA,EAAK,UAAU;AAAA,EAAK,SAAS;AAAA;AAAA,EAAoD,KAAK,CAAA,CAAA;AAAA,EAC9G;AAEA,EAAA,MAAM,QAAA,GAAqB,CAAC,YAAY,CAAA;AACxC,EAAA,IAAI,UAAA,EAAY,QAAA,CAAS,IAAA,CAAK,UAAU,CAAA;AACxC,EAAA,IAAI,SAAA,EAAW,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA;AAEtC,EAAA,KAAA,MAAW,CAAC,OAAA,EAAS,KAAK,CAAA,IAAK,aAAA,EAAe;AAC5C,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,CAAA,uCAAA,EAA0C,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,EAAW,WAAA,CAAY,KAAK,CAAC,CAAA;AAAA,KAC5F;AAAA,EACF;AAEA,EAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,CAAA;AAAA,EAA2D,WAAA,CAAY,SAAS,CAAC,CAAA;AAAA,KACnF;AAAA,EACF;AAEA,EAAA,OAAO,QAAA,CAAS,KAAK,IAAI,CAAA;AAC3B;AAOO,SAAS,UAAU,OAAA,EAQf;AACT,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,cAAc,EAAC;AAAA,IACf,cAAc;AAAC,GACjB,GAAI,OAAA;AAEJ,EAAA,MAAM,kBAAkB,IAAA,CAAK,SAAA,CAAU,WAAW,CAAA,CAAE,OAAA,CAAQ,gBAAgB,aAAa,CAAA;AAEzF,EAAA,MAAM,OAAA,GAAU,CAAA,k0CAAA,CAAA;AAEhB,EAAA,MAAM,SAAA,GAAY,CAAA,oOAAA,CAAA;AAClB,EAAA,MAAM,OAAA,GAAU,CAAA,gNAAA,CAAA;AAChB,EAAA,MAAM,OAAA,GAAU,CAAA,0QAAA,CAAA;AAEhB,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAA,EAME,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,EAAA,EACxB,aAAa;AAAA;AAAA;AAAA;AAAA,gCAAA,EAIiB,QAAQ,CAAA,YAAA,EAAe,OAAO,CAAA,sBAAA,EAAyB,YAAY,MAAA,GAAS,CAAA,GAAI,CAAA,iDAAA,EAAoD,WAAA,CAAY,IAAI,CAAC,CAAA,KAAO,CAAA,CAAE,GAAA,GAAM,YAAY,CAAA,CAAE,GAAG,CAAA,EAAA,EAAK,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,CAAA,IAAA,CAAA,GAAS,SAAS,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,SAAU,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,WAAW,EAAE;AAAA;AAAA;AAAA,MAAA,EAG7S,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,MAAA,EAUT,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,MAAA,EAcT,OAAO;AAAA;AAAA;AAAA,8BAAA,EAGiB,UAAA,GAAa,KAAK,oBAAoB,CAAA;AAAA,QAAA,EAC5D,IAAI;AAAA;AAAA,MAAA,EAGN,UAAA,GACI,CAAA;AAAA;AAAA,QAAA,EAEF,UAAU;AAAA,YAAA,CAAA,GAER,EACN;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,EAKc,eAAe,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,qBAAA,EAWZ,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;AAAA,oBAAA,EACxB,IAAA,CAAK,SAAA,CAAU,OAAO,CAAC,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAAA,CAAA;AA2G7C;;;AC7TA,SAAS,YAAA,CAAa,UAAU,eAAA,EAAyB;AACvD,EAAA,OAAO,CAAA,2BAAA,EAA8B,UAAA,CAAW,OAAO,CAAC,CAAA,MAAA,CAAA;AAC1D;AAEA,SAAS,aAAA,CAAc,OAAA,EAAiB,cAAA,GAA2B,EAAC,EAAW;AAC7E,EAAA,MAAM,QAAA,GACJ,cAAA,CAAe,MAAA,GAAS,CAAA,GACpB,CAAA,kEAAA,EAAqE,UAAA,CAAW,cAAA,CAAe,IAAA,CAAK,IAAI,CAAC,CAAC,CAAA,MAAA,CAAA,GAC1G,EAAA;AACN,EAAA,OAAO,CAAA,4DAAA,EAA+D,UAAA,CAAW,OAAO,CAAC,GAAG,QAAQ,CAAA,MAAA,CAAA;AACtG;AAEA,SAAS,WAAA,CAAY,EAAA,EAAY,KAAA,EAAe,WAAA,EAAqB,OAAA,EAAyB;AAC5F,EAAA,OAAO,gCAAgC,EAAE,CAAA;AAAA;AAAA,QAAA,EAEjC,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,OAAA,EAClB,UAAA,CAAW,WAAW,CAAC,CAAA;AAAA;AAAA,EAAA,EAE5B,OAAO;AAAA,UAAA,CAAA;AAEX;AAEA,SAAS,gBAAA,CAAiB,MAAc,IAAA,EAAwB;AAC9D,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA;AAC/C,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACpC,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAI,CAAA;AAEzB,EAAA,MAAM,WAAW,SAAA,GAAY,MAAA,CAAO,QAAQ,SAAA,CAAU,KAAK,IAAI,EAAC;AAChE,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA;AACpE,EAAA,MAAM,aAAA,uBAAoB,GAAA,CAAI;AAAA,IAC5B,QAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,aAAA,CAAc,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAG1E,EAAA,MAAM,WAAA,GAAc,SAAS,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,KAAM,MAAM,UAAU,CAAA;AAC3D,EAAA,MAAM,kBAAA,GAAqB,cAAc,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,KAAM,MAAM,UAAU,CAAA;AACvE,EAAA,IAAI,WAAA,IAAe,CAAC,kBAAA,EAAoB;AACtC,IAAA,MAAM,YAAA,GAAe,SAAS,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,KAAM,MAAM,UAAU,CAAA;AAC5D,IAAA,IAAI,YAAA,EAAc,aAAA,CAAc,OAAA,CAAQ,YAAY,CAAA;AAAA,EACtD;AAGA,EAAA,MAAM,gBAAgB,IAAA,CAAK,kBAAA,EAAoB,GAAA,CAAI,IAAI,KAAK,EAAC;AAE7D,EAAA,SAAS,kBAAA,CAAmB,UAAkB,IAAA,EAAmD;AAC/F,IAAA,MAAM,QAAA,GAAW,cAAc,QAAQ,CAAA;AACvC,IAAA,IAAI,QAAA,KAAa,MAAA,EAAW,OAAO,MAAA,CAAO,QAAQ,CAAA;AAClD,IAAA,IAAI,QAAA,KAAa,eAAe,IAAA,CAAK,IAAA,KAAS,UAAU,IAAA,CAAK,IAAA,KAAS,YAAY,OAAO,IAAA;AACzF,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,eACJ,aAAA,CAAc,MAAA,GAAS,IACnB,CAAA,yCAAA,EAA4C,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA;AAAA,EAAA,EAEhE,cAAc,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,MAAM,eAAA,CAAgB,CAAA,EAAG,CAAA,EAAG,kBAAA,CAAmB,GAAG,CAAC,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,MAAM,CAAC;AAAA,MAAA,CAAA,GAEvF,EAAA;AAEN,EAAA,MAAM,YAAY,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,QAAQ,cAAc,IAAI,CAAA,KAAA,CAAA;AAE5D,EAAA,MAAM,MAAA,GACJ,qhBAAA;AACF,EAAA,MAAM,OAAA,GACJ,qNAAA;AACF,EAAA,MAAM,UAAA,GACJ,+RAAA;AACF,EAAA,MAAM,QAAA,GACJ,4PAAA;AACF,EAAA,MAAM,SAAA,GACJ,4PAAA;AACF,EAAA,MAAM,SAAA,GACJ,4SAAA;AACF,EAAA,MAAM,QAAA,GACJ,oOAAA;AAEF,EAAA,MAAM,EAAA,GAAK,WAAW,IAAI,CAAA;AAE1B,EAAA,MAAM,cAAA,GAAiB,MAAA,EAAQ,YAAA,GAC3B,EAAA,GACA,8CAA8C,EAAE,CAAA;AAAA,EAAA,EAClD,YAAY;AAAA,iDAAA,EACmC,EAAE,CAAA;AAAA,2CAAA,EACR,EAAE,CAAA;AAAA,+DAAA,EACkB,EAAE,8BAA8B,MAAM,CAAA;AAAA;AAAA,qFAAA,EAEhB,UAAU,CAAA;AAAA,2FAAA,EACJ,QAAQ,CAAA;AAAA,2FAAA,EACR,SAAS,CAAA;AAAA;AAAA;AAAA,iEAAA,EAGnC,EAAE,wBAAwB,SAAS,CAAA;AAAA;AAAA,mDAAA,EAEjD,EAAE,CAAA;AAAA;AAAA;AAAA,sBAAA,EAG/B,EAAE,CAAA;AAAA,aAAA,EACX,UAAA,CAAW,SAAS,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kDAAA,EASgB,EAAE,CAAA;AAAA,wDAAA,EACI,EAAE,CAAA;AAAA,oDAAA,EACN,EAAE,CAAA;AAAA,oDAAA,EACF,EAAE,CAAA;AAAA,2DAAA,EACK,EAAE,CAAA;AAAA,mDAAA,EACV,EAAE,CAAA;AAAA,6CAAA,EACR,EAAE,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA,kCAAA,EAmDb,IAAA,CAAK,UAAU,OAAO,CAAC,MAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA,sBAAA,EAuC/D,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAAA,EAKlB,IAAA,CAAK,UAAU,QAAQ,CAAC,MAAM,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAA,CAAA;AASpF,EAAA,MAAM,OAAA,GAAU,MAAA,EAAQ,KAAA,IAAS,IAAA,GAAO,OAAO,KAAA,GAAQ,MAAA;AACvD,EAAA,MAAM,OAAA,GAAU,MAAA,EAAQ,MAAA,IAAU,IAAA,GAAO,OAAO,MAAA,GAAS,MAAA;AACzD,EAAA,MAAM,cAAA,GACJ,WAAW,IAAA,IAAQ,OAAA,IAAW,OAAO,CAAA,QAAA,EAAW,OAAO,CAAA,UAAA,EAAa,OAAO,CAAA,CAAA,CAAA,GAAM,EAAA;AACnF,EAAA,MAAM,eAAA,GAAkB,QAAQ,YAAA,GAC5B,aAAA;AAAA,IACE,CAAA,EAAG,OAAO,YAAY;AAAA,4BAAA,EAAiC,IAAI,gDAAgD,IAAI,CAAA,CAAA,CAAA;AAAA,IAC/G,MAAA,CAAO,kBAAkB;AAAC,MAE5B,MAAA,IAAU,CAAC,OAAO,UAAA,IAAc,CAAC,OAAO,UAAA,GACtC,aAAA;AAAA,IACE,uCAAuC,IAAI,CAAA,gEAAA;AAAA,GAC7C,GACA,EAAA;AAEN,EAAA,MAAM,kBAAA,GAAqB,QAAQ,UAAA,GAC/B,CAAA;AAAA;AAAA;AAAA,oCAAA,EAGgC,OAAO,UAAU,CAAA,OAAA,EAAU,WAAW,IAAI,CAAC,WAAW,cAAc,CAAA;AAAA;AAAA,UAAA,CAAA,GAGpG,EAAA;AAEJ,EAAA,OAAO,WAAA;AAAA,IACL,YAAA;AAAA,IACA,YAAA;AAAA,IACA,mDAAA;AAAA,IACA,CAAA,EAAG,eAAe,CAAA,EAAG,cAAc,GAAG,kBAAkB,CAAA;AAAA,GAC1D;AACF;AAEA,SAAS,WAAA,CAAY,MAAc,IAAA,EAAwB;AACzD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA;AAC/C,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,WAAA,CAAY,OAAA,EAAS,OAAA,EAAS,6BAAA,EAA+B,cAAc,CAAA;AAAA,EACpF;AAEA,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA;AAC/C,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA;AACpE,EAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA;AAE1E,EAAA,SAAS,eAAe,IAAA,EAAmD;AACzE,IAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,EAUL,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,GAAG,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,EAAG,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAC;AAAA;AAAA,QAAA,CAAA;AAAA,EAG3D;AAEA,EAAA,MAAM,YAAA,GAAuC;AAAA,IAC3C,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO,aAAA;AAAA,IACP,IAAA,EAAM;AAAA,GACR;AAEA,EAAA,SAAS,oBAAA,CAAqB,WAAmB,IAAA,EAAqC;AACpF,IAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,SAAS,CAAA,IAAK,SAAA;AACzC,IAAA,OAAO,CAAA;AAAA,WAAA,EACE,UAAA,CAAW,KAAK,CAAC,CAAA,qCAAA,EAAwC,KAAK,MAAM,CAAA;AAAA,EAAA,EAC7E,cAAA,CAAe,IAAI,CAAC;AAAA,UAAA,CAAA;AAAA,EAEtB;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,WAAA;AAAA,MACL,OAAA;AAAA,MACA,OAAA;AAAA,MACA,6BAAA;AAAA,MACA,CAAA,wEAAA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,IAAA,OAAA,GAAU,eAAe,QAAQ,CAAA;AAAA,EACnC,CAAA,MAAO;AACL,IAAA,MAAM,WACJ,QAAA,CAAS,MAAA,GAAS,CAAA,GACd,cAAA,CAAe,QAAQ,CAAA,GACvB,CAAA,mFAAA,CAAA;AAEN,IAAA,MAAM,MAAA,uBAAa,GAAA,EAAmC;AACtD,IAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,IAAe,OAAA;AACtC,MAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,KAAK,KAAK,EAAC;AACnC,MAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AACf,MAAA,MAAA,CAAO,GAAA,CAAI,OAAO,IAAI,CAAA;AAAA,IACxB;AAEA,IAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAA;AACtC,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,GAAG,MAAM,MAAA,CAAO,CAAC,MAAM,MAAA,CAAO,GAAA,CAAI,CAAC,CAAC,CAAA;AAAA,MACpC,GAAG,CAAC,GAAG,MAAA,CAAO,IAAA,EAAM,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,KAAA,CAAM,QAAA,CAAS,CAAC,CAAC,EAAE,IAAA;AAAK,KAC/D;AAEA,IAAA,MAAM,YAAY,UAAA,CACf,GAAA,CAAI,CAAC,GAAA,KAAQ,qBAAqB,GAAA,EAAK,MAAA,CAAO,GAAA,CAAI,GAAG,KAAK,EAAE,CAAC,CAAA,CAC7D,KAAK,IAAI,CAAA;AAEZ,IAAA,OAAA,GAAU,GAAG,QAAQ;AAAA;AAAA,uCAAA,EAEgB,eAAe,MAAM,CAAA,eAAA,EAAkB,eAAe,MAAA,KAAW,CAAA,GAAI,KAAK,GAAG,CAAA;AAAA,EAAA,EAClH,SAAS;AAAA,MAAA,CAAA;AAAA,EAEX;AAEA,EAAA,OAAO,WAAA;AAAA,IACL,OAAA;AAAA,IACA,OAAA;AAAA,IACA,CAAA,EAAG,SAAS,MAAM,CAAA,KAAA,EAAQ,SAAS,MAAA,KAAW,CAAA,GAAI,KAAK,GAAG,CAAA,SAAA,CAAA;AAAA,IAC1D;AAAA,GACF;AACF;AAEA,SAAS,YAAA,CAAa,MAAc,IAAA,EAAwB;AAC1D,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAEpC,EAAA,IAAI,CAAC,MAAA,EAAQ,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA,EAAG;AAC/C,IAAA,OAAO,WAAA;AAAA,MACL,QAAA;AAAA,MACA,QAAA;AAAA,MACA,kCAAA;AAAA,MACA,QAAQ,YAAA,GACJ,aAAA;AAAA,QACE,CAAA,EAAG,OAAO,YAAY;AAAA,uFAAA,EAA4F,IAAI,CAAA,YAAA,CAAA;AAAA,QACtH,MAAA,CAAO,kBAAkB;AAAC,OAC5B,GACA,YAAA;AAAA,QACE;AAAA;AACF,KACN;AAAA,EACF;AAEA,EAAA,MAAM,QAAQ,MAAA,CAAO,KAAA;AACrB,EAAA,MAAM,OAAO,IAAA,CAAK,IAAA,CAAK,KAAK,IAAA,CAAK,KAAA,CAAM,MAAM,CAAC,CAAA;AAE9C,EAAA,MAAM,SAAA,GAAY,KAAA,CACf,GAAA,CAAI,CAAC,IAAA,KAAS;AACb,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,UAAA,CAAW,IAAA,CAAK,KAAK,CAAA;AACxC,IAAA,MAAM,UAAU,IAAA,CAAK,UAAA,GACjB,4DAA4D,IAAA,CAAK,UAAU,UAAU,UAAA,CAAW,KAAK,CAAC,CAAA,IAAA,CAAA,GACtG,mCAAmC,IAAA,CAAK,KAAA,GAAQ,WAAW,IAAA,CAAK,KAAK,IAAI,QAAQ,CAAA,OAAA,CAAA;AACrF,IAAA,OAAO,CAAA,yBAAA,EAA4B,OAAO,CAAA,wBAAA,EAA2B,UAAA,CAAW,KAAK,CAAC,CAAA,YAAA,CAAA;AAAA,EACxF,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,EAAA,MAAM,IAAA,GAAO,iEAAiE,IAAI,CAAA;AAAA,EAClF,SAAS;AAAA,MAAA,CAAA;AAGT,EAAA,OAAO,WAAA,CAAY,QAAA,EAAU,QAAA,EAAU,kCAAA,EAAoC,IAAI,CAAA;AACjF;AAEA,SAAS,UAAA,GAAqB;AAC5B,EAAA,OAAO,WAAA;AAAA,IACL,MAAA;AAAA,IACA,MAAA;AAAA,IACA,0BAAA;AAAA,IACA,CAAA,sGAAA;AAAA,GACF;AACF;AAEA,SAAS,cAAA,CAAe,MAAc,IAAA,EAAwB;AAC5D,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA;AAC/C,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,WAAA,CAAY,UAAA,EAAY,UAAA,EAAY,0BAAA,EAA4B,cAAc,CAAA;AAAA,EACvF;AAEA,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CAAE,MAAA;AAC/C,EAAA,MAAM,SAAA,GAAY,UAAU,aAAA,CAAc,MAAA;AAC1C,EAAA,MAAM,kBACJ,SAAA,CAAU,WAAA,CAAY,OAAA,CAAQ,MAAA,IAC7B,UAAU,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,CAAA,CAAA,GACpC,UAAU,WAAA,CAAY,aAAA,CAAc,UACnC,SAAA,CAAU,WAAA,CAAY,kBAAkB,CAAA,GAAI,CAAA,CAAA;AAE/C,EAAA,MAAM,SAAA,GAAY,CAAA;AAAA;AAAA;AAAA,+CAAA,EAG6B,UAAU,eAAe,CAAA,EAAA,EAAK,UAAA,CAAW,SAAA,CAAU,eAAe,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,4BAAA,EAItF,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA,4BAAA,EAIT,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA,4BAAA,EAIT,eAAe,CAAA;AAAA;AAAA;AAAA;AAAA,mDAAA,EAIQ,UAAA,CAAW,SAAA,CAAU,UAAU,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,mDAAA,EAIhC,SAAA,CAAU,QAAA,GAAW,KAAA,GAAQ,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA,mDAAA,EAIjC,SAAA,CAAU,YAAA,GAAe,KAAA,GAAQ,IAAI,CAAA;AAAA;AAAA,MAAA,CAAA;AAIxF,EAAA,SAAS,QAAQ,KAAA,EAAyB;AACxC,IAAA,IAAI,MAAM,MAAA,KAAW,CAAA;AACnB,MAAA,OAAO,CAAA,iEAAA,CAAA;AACT,IAAA,OAAO,CAAA,sBAAA,EAAyB,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,kBAAA,EAAqB,UAAA,CAAW,CAAC,CAAC,CAAA,OAAA,CAAS,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,MAAA,CAAA;AAAA,EACxG;AAEA,EAAA,MAAM,eAAA,GAA4B;AAAA,IAChC,GAAG,UAAU,WAAA,CAAY,OAAA,CAAQ,IAAI,CAAC,CAAA,KAAM,CAAA,OAAA,EAAU,CAAC,CAAA,CAAE,CAAA;AAAA,IACzD,GAAI,SAAA,CAAU,WAAA,CAAY,SAAS,CAAC,QAAQ,IAAI,EAAC;AAAA,IACjD,GAAG,UAAU,WAAA,CAAY,aAAA,CAAc,IAAI,CAAC,CAAA,KAAM,CAAA,KAAA,EAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,IAC7D,GAAI,SAAA,CAAU,WAAA,CAAY,kBAAkB,CAAC,kBAAkB,IAAI;AAAC,GACtE;AAEA,EAAA,MAAM,YAAA,GAAe,CAAA;AAAA;AAAA;AAAA,uBAAA,EAGE,OAAA,CAAQ,SAAA,CAAU,aAAa,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,uBAAA,EAIhC,OAAA,CAAQ,SAAA,CAAU,gBAAgB,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,uBAAA,EAInC,OAAA,CAAQ,SAAA,CAAU,WAAW,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,uBAAA,EAI9B,OAAA,CAAQ,eAAe,CAAC,CAAA;AAAA;AAAA,MAAA,CAAA;AAI/C,EAAA,OAAO,WAAA;AAAA,IACL,UAAA;AAAA,IACA,UAAA;AAAA,IACA,6CAAA;AAAA,IACA,CAAA,EAAG,SAAS,CAAA,EAAG,YAAY,CAAA;AAAA,GAC7B;AACF;AAEA,SAAS,UAAA,CAAW,MAAc,IAAA,EAAwB;AACxD,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAEpC,EAAA,IAAI,CAAC,QAAQ,GAAA,EAAK;AAChB,IAAA,OAAO,WAAA;AAAA,MACL,OAAA;AAAA,MACA,OAAA;AAAA,MACA,oCAAA;AAAA,MACA,QAAQ,YAAA,GACJ,aAAA;AAAA,QACE,CAAA,EAAG,OAAO,YAAY;AAAA,0EAAA,EAA+E,IAAI,CAAA,YAAA,CAAA;AAAA,QACzG,MAAA,CAAO,kBAAkB;AAAC,OAC5B,GACA,YAAA;AAAA,QACE;AAAA;AACF,KACN;AAAA,EACF;AAEA,EAAA,MAAM,MAAM,MAAA,CAAO,GAAA;AAGnB,EAAA,MAAM,gBAAwD,EAAC;AAC/D,EAAA,IAAI,OAAO,cAAA,EAAgB;AACzB,IAAA,KAAA,MAAW,CAAC,KAAK,MAAM,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,cAAc,CAAA,EAAG;AACjE,MAAA,MAAM,CAAA,GAAI,GAAA,CAAI,KAAA,CAAM,eAAe,CAAA;AACnC,MAAA,IAAI,CAAA,GAAI,CAAC,CAAA,KAAM,MAAA,EAAW,aAAA,CAAc,QAAA,CAAS,CAAA,CAAE,CAAC,CAAA,EAAG,EAAE,CAAC,CAAA,GAAI,MAAA;AAAA,IAChE;AAAA,EACF;AACA,EAAA,MAAM,iBAAiB,IAAA,CAAK,SAAA,CAAU,KAAK,SAAA,CAAU,aAAa,CAAC,CAAA,CAAE,OAAA;AAAA,IACnE,cAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,QAAA,GAAW,CAAA,sBAAA,EAAyB,aAAA,CAAc,GAAA,CAAI,IAAI,CAAC,CAAA,MAAA,CAAA;AAGjE,EAAA,MAAM,eAAA,GAAkB;AAAA,2BAAA,EACG,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA;AAAA,gCAAA,EAEX,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,gEAAA,EACgB,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,gCAAA,EAIhD,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAA,EAKlB,cAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2DAAA,EAQe,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,2DAAA,EAChB,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,yDAAA,EAClB,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAA,CAAA;AAczE,EAAA,OAAO,WAAA;AAAA,IACL,OAAA;AAAA,IACA,OAAA;AAAA,IACA,CAAA,qBAAA,EAAmB,IAAI,YAAY,CAAA,4DAAA,CAAA;AAAA,IACnC,CAAA,EAAG,QAAQ,CAAA,EAAG,eAAe,CAAA;AAAA,GAC/B;AACF;AAEA,SAAS,YAAA,CAAa,MAAc,IAAA,EAAwB;AAC1D,EAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,IAAA,OAAO,WAAA;AAAA,MACL,QAAA;AAAA,MACA,QAAA;AAAA,MACA,0BAAA;AAAA,MACA,aAAa,yEAAyE;AAAA,KACxF;AAAA,EACF;AAEA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,eAAA,CAAgB,UAAA,CAAW,IAAI,CAAA;AACnD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,OAAO,WAAA;AAAA,MACL,QAAA;AAAA,MACA,QAAA;AAAA,MACA,0BAAA;AAAA,MACA,aAAa,gDAAgD;AAAA,KAC/D;AAAA,EACF;AAEA,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,aAAa,GAAG,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,CAAA;AAAA,gCAAA,EACgB,GAAG,CAAA,aAAA,EAAgB,MAAA,CAAO,QAAQ,CAAA,GAAA,EAAM,OAAO,KAAK,CAAA;AAAA;AAAA,kDAAA,EAElC,GAAG,CAAA;AAAA;AAAA,MAAA,CAAA;AAIrD,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA,CAC1C,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,MAAM,CAAA,KAAM;AACvB,IAAA,MAAM,IAAA,GACJ,MAAA,CAAO,MAAA,KAAW,WAAA,GACd,CAAA,6BAAA,EAA2B,WAAW,MAAA,CAAO,KAAA,IAAS,EAAE,CAAC,CAAA,OAAA,CAAA,GACzD,CAAA,+CAAA,CAAA;AAEN,IAAA,MAAM,WAAA,GAAc,MAAA,CAAO,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,GAC3C,CAAA,mBAAA,EAAsB,UAAA,CAAW,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA,CAAA,GAC9C,EAAA;AAEJ,IAAA,MAAM,WAAA,GAAc,OAAO,OAAA,GACvB,CAAA,gEAAA,EAAmE,WAAW,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAC,CAAA,OAAA,CAAA,GACnG,EAAA;AAEJ,IAAA,OAAO,CAAA;AAAA,6BAAA,EACkB,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,0CAAA,EACH,WAAW,CAAA,QAAA,EAAW,UAAA,CAAW,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UAAA,EAC9E,IAAI,GAAG,WAAW,CAAA;AAAA,SAAA,CAAA;AAAA,EAE1B,CAAC,CAAA,CACA,IAAA,CAAK,QAAQ,CAAA;AAEhB,EAAA,MAAM,SAAA,GAAY,CAAA;AAAA;AAAA,SAAA,EAET,IAAI,CAAA;AAAA,QAAA,CAAA;AAGb,EAAA,OAAO,WAAA;AAAA,IACL,QAAA;AAAA,IACA,QAAA;AAAA,IACA,gCAAA;AAAA,IACA,CAAA,EAAG,OAAO,CAAA,EAAG,SAAS,CAAA;AAAA,GACxB;AACF;AAEA,SAAS,mBAAA,CAAoB,MAAc,IAAA,EAAwB;AACjE,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AAEpC,EAAA,IAAI,CAAC,QAAQ,aAAA,EAAe;AAC1B,IAAA,OAAO,WAAA;AAAA,MACL,eAAA;AAAA,MACA,eAAA;AAAA,MACA,8BAAA;AAAA,MACA,YAAA;AAAA,QACE;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,MAAM,OAAO,MAAA,CAAO,aAAA;AACpB,EAAA,MAAM,SAAA,GAAY,CAAA,8BAAA,EAAiC,UAAA,CAAW,IAAA,CAAK,IAAI,CAAC,CAAA,OAAA,CAAA;AAExE,EAAA,MAAM,cAAA,GACJ,KAAK,UAAA,CAAW,MAAA,GAAS,IACrB,CAAA,2BAAA,EAA8B,IAAA,CAAK,WAAW,GAAA,CAAI,CAAC,MAAM,CAAA,IAAA,EAAO,UAAA,CAAW,CAAC,CAAC,CAAA,KAAA,CAAO,EAAE,IAAA,CAAK,EAAE,CAAC,CAAA,KAAA,CAAA,GAC9F,CAAA,oFAAA,CAAA;AAEN,EAAA,OAAO,WAAA;AAAA,IACL,eAAA;AAAA,IACA,eAAA;AAAA,IACA,8BAAA;AAAA,IACA,mDAAmD,SAAS,CAAA,kBAAA,EAAqB,WAAW,IAAA,CAAK,IAAA,IAAQ,QAAQ,CAAC,CAAA;AAAA,EACpH,cAAc,CAAA;AAAA,GACd;AACF;AAEA,SAAS,iBAAA,CAAkB,MAAc,IAAA,EAAwB;AAC/D,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA;AAE/C,EAAA,IAAI,CAAC,aAAc,SAAA,CAAU,QAAA,CAAS,WAAW,CAAA,IAAK,SAAA,CAAU,UAAA,CAAW,MAAA,KAAW,CAAA,EAAI;AACxF,IAAA,OAAO,WAAA;AAAA,MACL,aAAA;AAAA,MACA,aAAA;AAAA,MACA,6BAAA;AAAA,MACA,CAAA,mFAAA;AAAA,KACF;AAAA,EACF;AAEA,EAAA,SAAS,QAAA,CAAS,OAAe,KAAA,EAAyB;AACxD,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,OAAO,CAAA,2BAAA,EAA8B,UAAA,CAAW,KAAK,CAAC,CAAA,sEAAA,CAAA;AAAA,IACxD;AACA,IAAA,MAAM,OAAA,GAAU,KAAA,CACb,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,CAAC,CAAA;AAC3C,MAAA,MAAM,aAAA,GACJ,QAAA,EAAU,QAAA,KAAa,IAAA,GAAO,CAAA,4CAAA,CAAA,GAAiD,EAAA;AACjF,MAAA,OAAO,CAAA,aAAA,EAAgB,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,OAAA,EAAU,UAAA,CAAW,CAAC,CAAC,OAAO,aAAa,CAAA,KAAA,CAAA;AAAA,IACtG,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AACV,IAAA,OAAO,CAAA,2BAAA,EAA8B,UAAA,CAAW,KAAK,CAAC,YAAY,OAAO,CAAA,WAAA,CAAA;AAAA,EAC3E;AAEA,EAAA,OAAO,WAAA;AAAA,IACL,aAAA;AAAA,IACA,aAAA;AAAA,IACA,6BAAA;AAAA,IACA,CAAA;AAAA,EAAA,EACA,QAAA,CAAS,UAAA,EAAY,SAAA,CAAU,QAAQ,CAAC;AAAA,EAAA,EACxC,QAAA,CAAS,aAAA,EAAe,SAAA,CAAU,UAAU,CAAC;AAAA,MAAA;AAAA,GAE/C;AACF;AAEO,SAAS,qBAAA,CAAsB,MAAc,IAAA,EAAwB;AAC1E,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA;AAC/C,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAI,CAAA;AAEzB,EAAA,MAAM,eAAA,GAAkB,SAAA,GACpB,CAAA,mBAAA,EAAsB,SAAA,CAAU,eAAe,KAAK,UAAA,CAAW,SAAA,CAAU,eAAe,CAAC,CAAA,OAAA,CAAA,GACzF,EAAA;AACJ,EAAA,MAAM,aAAA,GAAgB,SAAA,EAAW,QAAA,GAAW,CAAA,wCAAA,CAAA,GAA6C,EAAA;AACzF,EAAA,MAAM,cAAc,SAAA,GAChB,CAAA,oBAAA,EAAuB,WAAW,SAAA,CAAU,UAAU,CAAC,CAAA,OAAA,CAAA,GACvD,EAAA;AACJ,EAAA,MAAM,WAAW,SAAA,GAAY,CAAA,sBAAA,EAAyB,WAAW,SAAA,CAAU,QAAQ,CAAC,CAAA,MAAA,CAAA,GAAW,EAAA;AAE/F,EAAA,MAAM,MAAA,GAAS,CAAA;AAAA,MAAA,EACT,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,oBAAA,EACF,eAAe,CAAA,EAAG,aAAa,CAAA,EAAG,WAAW,CAAA;AAAA,EAAA,EAC/D,QAAQ;AAAA,MAAA,CAAA;AAGV,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,gBAAA,CAAiB,MAAM,IAAI,CAAA;AAAA,IAC3B,YAAA,CAAa,MAAM,IAAI,CAAA;AAAA,IACvB,UAAA,EAAW;AAAA,IACX,WAAA;AAAA,MACE,YAAA;AAAA,MACA,YAAA;AAAA,MACA,yBAAA;AAAA,MACA,YAAA;AAAA,QACE;AAAA;AACF,KACF;AAAA,IACA,WAAA;AAAA,MACE,cAAA;AAAA,MACA,cAAA;AAAA,MACA,oCAAA;AAAA,MACA,aAAa,sEAAsE;AAAA;AACrF,GACF;AAEA,EAAA,MAAM,iBAAA,GAAoB;AAAA,IACxB,WAAA,CAAY,MAAM,IAAI,CAAA;AAAA,IACtB,UAAA,CAAW,MAAM,IAAI,CAAA;AAAA,IACrB,YAAA,CAAa,MAAM,IAAI,CAAA;AAAA,IACvB,mBAAA,CAAoB,MAAM,IAAI,CAAA;AAAA,IAC9B,cAAA,CAAe,MAAM,IAAI,CAAA;AAAA,IACzB,iBAAA,CAAkB,MAAM,IAAI;AAAA,GAC9B;AAEA,EAAA,MAAM,IAAA,GAAO,CAAA;AAAA;AAAA,IAAA,EAET,MAAM;AAAA,IAAA,EACN,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA;AAAA,IAAA,EAGvB,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC;AAAA;AAAA,MAAA,CAAA;AAIhC,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,IAAA,EAAM,IAAI,CAAA;AACvC,EAAA,MAAM,QAAA,GAAW,KAAK,OAAA,CAAQ,QAAA;AAE9B,EAAA,MAAM,cAA4B,EAAC;AACnC,EAAA,IAAI,WAAW,UAAA,EAAY;AACzB,IAAA,WAAA,CAAY,IAAA,CAAK;AAAA,MACf,OAAO,SAAA,CAAU,UAAA;AAAA,MACjB,KAAK,CAAA,EAAG,QAAQ,yBAAyB,OAAA,CAAQ,SAAA,CAAU,UAAU,CAAC,CAAA;AAAA,KACvE,CAAA;AAAA,EACH;AACA,EAAA,WAAA,CAAY,IAAA,CAAK,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA;AAEhC,EAAA,OAAO,SAAA,CAAU;AAAA,IACf,OAAO,CAAA,EAAG,IAAI,CAAA,QAAA,EAAM,IAAA,CAAK,QAAQ,KAAK,CAAA,CAAA;AAAA,IACtC,IAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA,EAAY,EAAA;AAAA,IACZ,QAAA;AAAA,IACA,WAAA,EAAa,iBAAiB,IAAI,CAAA;AAAA,IAClC;AAAA,GACD,CAAA;AACH;;;ACxwBA,SAAS,UAAA,CAAW,MAAc,IAAA,EAAwB;AACxD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA;AAC/C,EAAA,IAAI,CAAC,WAAW,OAAO,EAAA;AACvB,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAI,CAAA;AACzB,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACpC,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA;AACrD,EAAA,MAAM,YAAA,GAAe,cAAA,CAAe,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,WAAW,CAAA,CAAE,MAAA;AAChF,EAAA,MAAM,iBAAiB,cAAA,CAAe,MAAA;AACtC,EAAA,MAAM,eAAe,YAAA,GAAe,cAAA;AACpC,EAAA,MAAM,SAAA,GAAY,YAAA;AAClB,EAAA,MAAM,SAAA,GAAY,UAAU,aAAA,CAAc,MAAA;AAE1C,EAAA,MAAM,WAAA,GAAc,MAAA,EAAQ,UAAA,GACxB,CAAA,yDAAA,EAA4D,MAAA,CAAO,UAAU,CAAA,OAAA,EAAU,UAAA,CAAW,IAAI,CAAC,CAAA,IAAA,CAAA,GACvG,CAAA,0CAAA,CAAA;AAEJ,EAAA,OAAO,CAAA,gCAAA,EAAmC,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,EAAG,IAAI,CAAA,kBAAA,EAAqB,UAAA,CAAW,IAAA,CAAK,WAAA,EAAa,CAAC,CAAA;AAAA,4BAAA,EAC7F,WAAW,CAAA;AAAA;AAAA,2BAAA,EAEZ,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA;AAAA,YAAA,EAE/B,SAAS,CAAA,KAAA,EAAQ,SAAA,KAAc,CAAA,GAAI,EAAA,GAAK,GAAG,CAAA,EAAG,YAAA,GAAe,CAAA,0CAAA,EAA6C,cAAA,GAAiB,YAAY,CAAA,QAAA,CAAA,GAAa,EAAE,CAAA;AAAA,yBAAA,EACzI,UAAU,eAAe,CAAA,yBAAA,EAA4B,UAAA,CAAW,SAAA,CAAU,eAAe,CAAC,CAAA;AAAA,MAAA,EAC7G,SAAA,GAAY,CAAA,GAAI,CAAA,MAAA,EAAS,SAAS,kBAAkB,EAAE;AAAA;AAAA;AAAA,IAAA,CAAA;AAI9D;AAEO,SAAS,qBAAqB,IAAA,EAAwB;AAC3D,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,SAAS,UAAU,CAAA;AAC7D,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,QAAA,CAAS,WAAA,IAAe,EAAC;AAGlD,EAAA,MAAM,iBAAA,GAAoB,aAAA,CAAc,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,QAAQ,CAAA;AAErE,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAsB;AAChD,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,aAAA,CAAc,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,EAAE,CAAA;AAAA,EAChC;AACA,EAAA,MAAM,YAAsB,EAAC;AAE7B,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,SAAS,CAAA,IAAK,iBAAA,EAAmB;AACjD,IAAA,IAAI,UAAU,UAAA,EAAY;AACxB,MAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,SAAA,CAAU,UAAU,CAAA,EAAG;AAC5C,QAAA,aAAA,CAAc,GAAA,CAAI,SAAA,CAAU,UAAA,EAAY,EAAE,CAAA;AAAA,MAC5C;AACA,MAAA,aAAA,CAAc,GAAA,CAAI,SAAA,CAAU,UAAU,CAAA,EAAG,KAAK,IAAI,CAAA;AAAA,IACpD,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,KAAK,IAAI,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,MAAM,aAAa,aAAA,CAAc,MAAA;AACjC,EAAA,MAAM,eAAe,iBAAA,CAAkB,MAAA;AACvC,EAAA,MAAM,sBAAsB,CAAC,GAAG,aAAA,CAAc,MAAA,EAAQ,CAAA,CAAE,MAAA;AAAA,IACtD,CAAC,KAAA,KAAU,KAAA,CAAM,MAAA,GAAS;AAAA,GAC5B,CAAE,MAAA;AACF,EAAA,MAAM,WAAA,GAAc,iBAAA,CAAkB,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,KAAoB,QAAQ,CAAA,CAAE,MAAA;AACxF,EAAA,MAAM,YAAA,GAAe,iBAAA,CAAkB,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,KAAoB,SAAS,CAAA,CAAE,MAAA;AAC1F,EAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAA,CAAE,MAAA;AAEtE,EAAA,MAAM,SAAA,GAAY,CAAA;AAAA;AAAA;AAAA,4BAAA,EAGU,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA,4BAAA,EAIV,mBAAmB,CAAA;AAAA;AAAA;AAAA;AAAA,4BAAA,EAInB,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA,4BAAA,EAIX,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA,4BAAA,EAIZ,aAAa,CAAA;AAAA;AAAA,MAAA,CAAA;AAIzC,EAAA,MAAM,cAAA,GAAiB,aAAA,CAAc,IAAA,GAAO,CAAA,IAAK,iBAAA,CAAkB,IAAA,CAAK,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAA;AAG/F,EAAA,MAAM,sBAAA,uBAA6B,GAAA,EAAoB;AACvD,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,IAAI,IAAI,WAAA,EAAa;AACnB,MAAA,sBAAA,CAAuB,GAAA,CAAI,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,WAAW,CAAA;AAAA,IACtD;AAAA,EACF;AAEA,EAAA,SAAS,oBAAA,CAAqB,OAAA,EAAiB,KAAA,EAAiB,WAAA,EAA8B;AAC5F,IAAA,MAAM,OAAO,OAAA,CAAQ,WAAA,EAAY,CAAE,OAAA,CAAQ,eAAe,GAAG,CAAA;AAC7D,IAAA,MAAM,WAAW,WAAA,GACb,CAAA,4BAAA,EAA+B,UAAA,CAAW,WAAW,CAAC,CAAA,MAAA,CAAA,GACtD,EAAA;AAEJ,IAAA,MAAM,MAAA,GAAS,MACZ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CACV,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA;AACjC,MAAA,OAAO,MAAA,EAAQ,aACX,CAAA,mDAAA,EAAsD,MAAA,CAAO,UAAU,CAAA,OAAA,EAAU,UAAA,CAAW,CAAC,CAAC,CAAA,IAAA,CAAA,GAC9F,CAAA,iDAAA,CAAA;AAAA,IACN,CAAC,CAAA,CACA,IAAA,CAAK,EAAE,CAAA;AAEV,IAAA,OAAO,gDAAgD,IAAI,CAAA;AAAA,gCAAA,EAC7B,MAAM,CAAA;AAAA;AAAA,gCAAA,EAEN,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,IAAA,EAC/C,QAAQ;AAAA,iCAAA,EACqB,MAAM,MAAM,CAAA,UAAA,EAAa,MAAM,MAAA,KAAW,CAAA,GAAI,KAAK,GAAG,CAAA;AAAA;AAAA,IAAA,CAAA;AAAA,EAGvF;AAEA,EAAA,IAAI,iBAAA,GAAoB,EAAA;AACxB,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,MAAM,YAAsB,EAAC;AAE7B,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,KAAK,CAAA,IAAK,aAAA,EAAe;AAC5C,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,MAAA,SAAA,CAAU,IAAA,CAAK,qBAAqB,OAAA,EAAS,KAAA,EAAO,uBAAuB,GAAA,CAAI,OAAO,CAAC,CAAC,CAAA;AAAA,IAC1F;AAEA,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,SAAA,CAAU,IAAA,CAAK,oBAAA,CAAqB,WAAA,EAAa,SAAS,CAAC,CAAA;AAAA,IAC7D;AAEA,IAAA,iBAAA,GAAoB,CAAA;AAAA;AAAA,kCAAA,EAEY,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,MAAA,CAAA;AAAA,EAEtD;AAEA,EAAA,IAAI,YAAA;AAEJ,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,MAAM,KAAA,GAAQ,iBAAA,CACX,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA,CACrC,GAAA,CAAI,CAAC,CAAC,IAAI,CAAA,KAAM,UAAA,CAAW,IAAA,EAAM,IAAI,CAAC,CAAA,CACtC,IAAA,CAAK,IAAI,CAAA;AACZ,IAAA,YAAA,GAAe,mDAAmD,KAAK,CAAA,MAAA,CAAA;AAAA,EACzE,CAAA,MAAO;AACL,IAAA,MAAM,eAAyB,EAAC;AAEhC,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,KAAK,CAAA,IAAK,aAAA,EAAe;AAC5C,MAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAExB,MAAA,MAAM,OAAO,OAAA,CAAQ,WAAA,EAAY,CAAE,OAAA,CAAQ,eAAe,GAAG,CAAA;AAC7D,MAAA,MAAM,WAAA,GAAc,sBAAA,CAAuB,GAAA,CAAI,OAAO,CAAA;AACtD,MAAA,MAAM,WAAW,WAAA,GAAc,CAAA,GAAA,EAAM,UAAA,CAAW,WAAW,CAAC,CAAA,IAAA,CAAA,GAAS,EAAA;AAErE,MAAA,MAAM,KAAA,GAAQ,KAAA,CACX,IAAA,EAAK,CACL,GAAA,CAAI,CAAC,IAAA,KAAS,UAAA,CAAW,IAAA,EAAM,IAAI,CAAC,CAAA,CACpC,KAAK,IAAI,CAAA;AAEZ,MAAA,YAAA,CAAa,IAAA,CAAK,kDAAkD,IAAI,CAAA;AAAA;AAAA,QAAA,EAEpE,UAAA,CAAW,OAAO,CAAC,CAAA;AAAA,IAAA,EACvB,QAAQ;AAAA;AAAA,8BAAA,EAEkB,KAAK,CAAA;AAAA,MAAA,CAC9B,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,MAAM,KAAA,GAAQ,SAAA,CACX,IAAA,EAAK,CACL,GAAA,CAAI,CAAC,IAAA,KAAS,UAAA,CAAW,IAAA,EAAM,IAAI,CAAC,CAAA,CACpC,KAAK,IAAI,CAAA;AAEZ,MAAA,YAAA,CAAa,IAAA,CAAK,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8BAAA,EAKQ,KAAK,CAAA;AAAA,MAAA,CAC9B,CAAA;AAAA,IACH;AAEA,IAAA,YAAA,GAAe,CAAA,yBAAA,EAA4B,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,MAAA,CAAA;AAAA,EACpE;AAEA,EAAA,MAAM,YAAA,GAAe,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAA,CAAA;AAgBrB,EAAA,MAAM,MAAA,GAAS,CAAA;AAAA,MAAA,EACT,UAAA,CAAW,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,KAAA,EAC/B,YAAY,CAAA,UAAA,EAAa,YAAA,KAAiB,CAAA,GAAI,KAAK,GAAG,CAAA;AAAA;AAAA,MAAA,CAAA;AAI3D,EAAA,MAAM,IAAA,GAAO,CAAA,EAAG,MAAM,CAAA,EAAG,SAAS,GAAG,iBAAiB,CAAA,EAAG,YAAY,CAAA,EAAG,YAAY,CAAA,CAAA;AAEpF,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,IAAA,EAAM,IAAI,CAAA;AAEvC,EAAA,MAAM,eAAA,GAAkB,CAAC,CAAA,2BAAA,CAA6B,CAAA;AACtD,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,eAAA,CAAgB,KAAK,CAAA,6CAAA,CAA+C,CAAA;AAAA,EACtE;AACA,EAAA,eAAA,CAAgB,KAAK,CAAA,wCAAA,CAA0C,CAAA;AAC/D,EAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA;AAE5C,EAAA,OAAO,SAAA,CAAU;AAAA,IACf,KAAA,EAAO,KAAK,OAAA,CAAQ,KAAA;AAAA,IACpB,IAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA,EAAU,KAAK,OAAA,CAAQ,QAAA;AAAA,IACvB,WAAA,EAAa,iBAAiB,IAAI;AAAA,GACnC,CAAA;AACH;;;ACvOO,SAAS,gBAAgB,IAAA,EAAwB;AACtD,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,SAAS,UAAU,CAAA;AAC1D,EAAA,MAAM,aAAa,UAAA,CAAW,MAAA;AAE9B,EAAA,MAAM,WAAA,GAAc,UAAA,CAAW,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,KAAoB,QAAQ,CAAA,CAAE,MAAA;AACjF,EAAA,MAAM,YAAA,GAAe,UAAA,CAAW,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,eAAA,KAAoB,SAAS,CAAA,CAAE,MAAA;AACnF,EAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,MAAA,CAAO,CAAC,CAAC,IAAI,CAAA,KAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAC,CAAA,CAAE,MAAA;AAE5E,EAAA,MAAM,aAAa,UAAA,CAAW,MAAA,CAAO,CAAC,GAAA,EAAK,GAAG,CAAC,CAAA,KAAM,GAAA,GAAM,OAAO,IAAA,CAAK,CAAA,CAAE,KAAK,CAAA,CAAE,QAAQ,CAAC,CAAA;AACzF,EAAA,MAAM,WAAW,UAAA,GAAa,CAAA,GAAI,KAAK,KAAA,CAAM,UAAA,GAAa,UAAU,CAAA,GAAI,CAAA;AAExE,EAAA,IAAI,iBAAA,GAAmC,IAAA;AACvC,EAAA,IAAI,KAAK,eAAA,EAAiB;AACxB,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,gBAAgB,UAAU,CAAA;AAC7D,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,iBAAA,GAAoB,IAAA,CAAK,KAAA;AAAA,QACtB,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,UAAA,EAAY,CAAC,CAAA,GAAI,OAAA,CAAQ,MAAA,GAAU;AAAA,OACzE;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,CAAA;AAAA;AAAA;AAAA,4BAAA,EAGU,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA,4BAAA,EAIV,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA,4BAAA,EAIR,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA,4BAAA,EAIb,iBAAA,KAAsB,IAAA,GAAO,CAAA,EAAG,iBAAiB,MAAM,QAAG,CAAA;AAAA;AAAA,MAAA,CAAA;AAKtF,EAAA,MAAM,iBAAA,GAAoB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iEAAA,EAKuC,WAAW,CAAA;AAAA;AAAA;AAAA;AAAA,8DAAA,EAId,YAAY,CAAA;AAAA;AAAA;AAAA;AAAA,8BAAA,EAI5C,UAAA,GAAa,IAAI,IAAA,CAAK,KAAA,CAAO,cAAc,UAAA,GAAc,GAAG,IAAI,CAAC,CAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAM/F,EAAA,MAAM,UAAA,GAAa,UAAA,CAChB,IAAA,CAAK,CAAC,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,KAAM,MAAA,CAAO,IAAA,CAAK,CAAA,CAAE,KAAK,CAAA,CAAE,MAAA,GAAS,MAAA,CAAO,IAAA,CAAK,CAAA,CAAE,KAAK,CAAA,CAAE,MAAM,CAAA,CAChF,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAEd,EAAA,MAAM,eAAe,UAAA,CAClB,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,SAAS,CAAA,KAAM;AAC1B,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAI,CAAA;AACzB,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,CAAE,MAAA;AAC/C,IAAA,OAAO,CAAA;AAAA,mBAAA,EACQ,IAAA,CAAK,QAAQ,QAAQ,CAAA,EAAG,IAAI,CAAA,8DAAA,EAAiE,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,UAAA,EACtH,SAAS,CAAA;AAAA,6BAAA,EACU,UAAU,eAAe,CAAA,EAAA,EAAK,UAAA,CAAW,SAAA,CAAU,eAAe,CAAC,CAAA;AAAA,SAAA,CAAA;AAAA,EAE9F,CAAC,CAAA,CACA,IAAA,CAAK,QAAQ,CAAA;AAEhB,EAAA,MAAM,eAAA,GAAkB,CAAA;AAAA;AAAA;AAAA;AAAA,WAAA,EAIb,YAAY,CAAA;AAAA;AAAA,MAAA,CAAA;AAKvB,EAAA,IAAI,iBAAA,GAAoB,EAAA;AACxB,EAAA,IAAI,IAAA,CAAK,eAAA,IAAmB,iBAAA,KAAsB,IAAA,EAAM;AACtD,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,eAAA,CAAgB,UAAU,CAAA,CAClE,IAAA,CAAK,CAAC,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,GAAa,CAAA,CAAE,UAAU,CAAA,CAClD,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,MAAM,CAAA,KAAM;AACvB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,aAAa,GAAG,CAAA;AAC9C,MAAA,MAAM,IAAA,GAAO,QAAQ,IAAI,CAAA;AACzB,MAAA,MAAM,OAAA,GAAU,CAAA;AAAA,wDAAA,EACkC,GAAG,CAAA;AAAA,cAAA,CAAA;AAErD,MAAA,OAAO,CAAA;AAAA,qBAAA,EACQ,IAAA,CAAK,QAAQ,QAAQ,CAAA,EAAG,IAAI,CAAA,8DAAA,EAAiE,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,YAAA,EACtH,GAAG,CAAA;AAAA,YAAA,EACH,OAAO,CAAA;AAAA,YAAA,EACP,MAAA,CAAO,QAAQ,CAAA,GAAA,EAAM,MAAA,CAAO,KAAK,CAAA;AAAA,WAAA,CAAA;AAAA,IAEzC,CAAC,CAAA,CACA,IAAA,CAAK,UAAU,CAAA;AAElB,IAAA,iBAAA,GAAoB,CAAA;AAAA,2DAAA,EACgC,iBAAiB,CAAA;AAAA;AAAA;AAAA,WAAA,EAG5D,cAAc,CAAA;AAAA;AAAA,MAAA,CAAA;AAAA,EAGzB;AAEA,EAAA,MAAM,MAAA,GAAS,CAAA;AAAA;AAAA,qEAAA,EAEsD,UAAU,CAAA;AAAA,MAAA,CAAA;AAG/E,EAAA,MAAM,IAAA,GAAO,CAAA,EAAG,MAAM,CAAA,EAAG,SAAS,GAAG,iBAAiB,CAAA,EAAG,eAAe,CAAA,EAAG,iBAAiB,CAAA,CAAA;AAE5F,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,IAAA,EAAM,IAAI,CAAA;AAEvC,EAAA,MAAM,UAAA,GAAa,CAAA;AAAA;AAAA;AAAA,EAGnB,IAAA,CAAK,eAAA,GAAkB,sCAAA,GAAyC,EAAE,CAAA,CAAA;AAElE,EAAA,OAAO,SAAA,CAAU;AAAA,IACf,KAAA,EAAO,CAAA,iBAAA,EAAe,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA,CAAA;AAAA,IACxC,IAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA,EAAU,KAAK,OAAA,CAAQ,QAAA;AAAA,IACvB,WAAA,EAAa,iBAAiB,IAAI,CAAA;AAAA,IAClC,WAAA,EAAa,CAAC,EAAE,KAAA,EAAO,aAAa;AAAA,GACrC,CAAA;AACH;;;ACxIA,SAAS,eAAA,CAAgB,QAAA,EAAkB,WAAA,EAAqB,QAAA,EAA6B;AAC3F,EAAA,OAAO,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,SAAA,CAAU,CAAA,EAAG,QAAQ,CAAA,IAAK,SAAA,CAAU,CAAA,EAAG,WAAW,CAAC,CAAA;AACjF;AAEA,SAAS,UAAA,CAAW,MAAc,IAAA,EAAoC;AACpE,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACpC,EAAA,IAAI,MAAA,EAAQ,UAAA,EAAY,OAAO,MAAA,CAAO,UAAA;AACtC,EAAA,IAAI,QAAQ,GAAA,EAAK,IAAA,SAAa,YAAA,CAAa,MAAA,CAAO,IAAI,IAAI,CAAA;AAC1D,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,kBAAA,CAAmB,MAAc,SAAA,EAAkC;AAC1E,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA,CAAE,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,WAAW,CAAA;AAC3F,EAAA,MAAM,UAAU,QAAA,CACb,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,EAC5B,GAAA,CAAI,CAAC,CAAC,KAAA,EAAO,CAAC,CAAA,KAAM;AACnB,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU,OAAO,GAAG,KAAK,CAAA,GAAA,CAAA;AACxC,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,QAAA,EAAU,OAAO,GAAG,KAAK,CAAA,IAAA,CAAA;AACxC,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,SAAA,EAAW,OAAO,KAAA;AACjC,IAAA,OAAO,GAAG,KAAK,CAAA,SAAA,CAAA;AAAA,EACjB,CAAC,CAAA,CACA,IAAA,CAAK,GAAG,CAAA;AACX,EAAA,MAAM,YAAA,GAAe,OAAA,GAAU,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,GAAK,EAAA;AAC/C,EAAA,OAAO,CAAA,SAAA,EAAY,IAAI,CAAA,SAAA,EAAY,SAAA,CAAU,SAAS,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAC,CAAA;;AAAA,CAAA,EAAU,IAAI,GAAG,YAAY,CAAA,GAAA,CAAA;AAC3G;AAEO,SAAS,kBAAkB,IAAA,EAAwB;AACxD,EAAA,MAAM,QAAA,GAAW,KAAK,OAAA,CAAQ,YAAA;AAC9B,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,OAAA,CAAQ,IAAA,CAAK,SAAS,UAAU,CAAA;AAE7D,EAAA,MAAM,KAAA,GAAQ,aAAA,CACX,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,eAAA,CAAgB,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,WAAA,EAAa,QAAQ,CAAC,CAAA,CACtE,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AAExC,EAAA,MAAM,kBAAkB,KAAA,CAAM,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,SAAS,CAAA,KAAM;AACvD,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,IAAA,EAAM,IAAI,CAAA;AACjC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAI,WAAA,GAAc,MAAA,CAAO,GAAG,EAAE,MAAA,GAAS,CAAA;AAC9D,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAI,CAAA;AACzB,IAAA,MAAM,QAAA,GAAW,SAAA,CAAU,QAAA,IAAY,EAAC;AACxC,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,UAAA,IAAc,EAAC;AACxC,IAAA,MAAM,GAAA,GAAM,kBAAA,CAAmB,IAAA,EAAM,SAAS,CAAA;AAC9C,IAAA,MAAM,QAAA,GAAW,OAAO,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAA,CAC5C,MAAA,CAAO,CAAC,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,WAAW,CAAA,CAC1C,IAAI,CAAC,CAAC,KAAA,EAAO,CAAC,CAAA,MAAO;AAAA,MACpB,IAAA,EAAM,KAAA;AAAA,MACN,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,SAAS,CAAA,CAAE,OAAA;AAAA,MACX,UAAU,CAAA,CAAE,QAAA;AAAA,MACZ,SAAS,CAAA,CAAE,OAAA;AAAA,MACX,QAAQ,CAAA,CAAE;AAAA,KACZ,CAAE,CAAA;AAEJ,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,IAAA;AAAA,MACA,KAAK,GAAA,IAAO,EAAA;AAAA,MACZ,QAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAA,EAAO,QAAA;AAAA,MACP,UAAU,SAAA,CAAU;AAAA,KACtB;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,YAAY,KAAA,CACf,GAAA,CAAI,CAAC,CAAC,IAAI,CAAA,KAAM;AACf,IAAA,MAAM,GAAA,GAAM,UAAA,CAAW,IAAA,EAAM,IAAI,CAAA;AACjC,IAAA,MAAM,QAAA,GAAA,CAAY,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,IAAI,GAAG,QAAA,IAAY,EAAC,EAAG,IAAA,CAAK,GAAG,CAAA;AAC1E,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAI,CAAA;AAEzB,IAAA,MAAM,WAAA,GAAc,GAAA,GAChB,CAAA,2BAAA,EAA8B,GAAG,CAAA,MAAA,CAAA,GACjC,CAAA,8BAAA,EAAiC,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA,OAAA,CAAA;AAEjE,IAAA,OAAO,CAAA,qCAAA,EAAwC,UAAA,CAAW,IAAA,CAAK,WAAA,EAAa,CAAC,CAAA,aAAA,EAAgB,IAAI,CAAA,iBAAA,EAAoB,UAAA,CAAW,QAAA,CAAS,WAAA,EAAa,CAAC,CAAA;AAAA,iCAAA,EAC1H,WAAW,CAAA;AAAA,8BAAA,EACd,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,SAAA,CAAA;AAAA,EAE5C,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,EAAA,MAAM,aAAA,GAAgB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAoDtB,EAAA,MAAM,IAAA,GAAO,CAAA;AAAA;AAAA;AAAA,OAAA,EAGN,MAAM,MAAM,CAAA,KAAA,EAAQ,MAAM,MAAA,KAAW,CAAA,GAAI,KAAK,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA,IAAA,EAIpD,SAAS;AAAA;AAAA;AAAA,EAGb,aAAa;AAAA;AAAA;AAAA,kBAAA,EAGK,IAAA,CAAK,SAAA,CAAU,eAAe,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAA,EAsBhC,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAA,CAAA;AAmItD,EAAA,MAAM,OAAA,GAAU,YAAA,CAAa,IAAA,EAAM,OAAO,CAAA;AAE1C,EAAA,OAAO,SAAA,CAAU;AAAA,IACf,KAAA,EAAO,CAAA,aAAA,EAAW,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA,CAAA;AAAA,IACpC,IAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA,EAAY,iCAAA;AAAA,IACZ,QAAA,EAAU,KAAK,OAAA,CAAQ,QAAA;AAAA,IACvB,WAAA,EAAa,iBAAiB,IAAI,CAAA;AAAA,IAClC,WAAA,EAAa,CAAC,EAAE,KAAA,EAAO,SAAS;AAAA,GACjC,CAAA;AACH;;;ACnTA,IAAM,MAAA,GAAS,yBAAA;AACf,IAAM,WAAA,GAAc,kDAAA;AAEpB,SAAS,aAAa,KAAA,EAAwB;AAC5C,EAAA,OAAO,OAAO,IAAA,CAAK,KAAK,CAAA,IAAK,WAAA,CAAY,KAAK,KAAK,CAAA;AACrD;AAOA,SAAS,kBAAkB,KAAA,EAA8B;AACvD,EAAA,MAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AAGrB,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG;AAClB,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,OAAA,CAAQ,GAAA,EAAK,EAAE,CAAA;AAC3B,IAAA,MAAM,IAAA,GACJ,CAAA,CAAE,MAAA,IAAU,CAAA,GACR,CAAA,CACG,MAAM,CAAA,EAAG,CAAC,CAAA,CACV,KAAA,CAAM,EAAE,CAAA,CACR,IAAI,CAAC,EAAA,KAAO,EAAA,GAAK,EAAE,CAAA,CACnB,IAAA,CAAK,EAAE,CAAA,GACV,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAClB,IAAA,MAAM,IAAI,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACvC,IAAA,MAAM,IAAI,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACvC,IAAA,MAAM,IAAI,QAAA,CAAS,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,GAAG,EAAE,CAAA;AACvC,IAAA,IAAI,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,IAAK,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,IAAK,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,EAAG,OAAO,IAAA;AAClE,IAAA,OAAA,CAAQ,KAAA,GAAQ,CAAA,GAAI,KAAA,GAAQ,CAAA,GAAI,QAAQ,CAAA,IAAK,GAAA;AAAA,EAC/C;AAGA,EAAA,MAAM,QAAA,GAAW,CAAA,CAAE,KAAA,CAAM,mDAAmD,CAAA;AAC5E,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,CAAA,GAAI,UAAA,CAAW,QAAA,CAAS,CAAC,KAAK,GAAG,CAAA;AACvC,IAAA,MAAM,CAAA,GAAI,UAAA,CAAW,QAAA,CAAS,CAAC,KAAK,GAAG,CAAA;AACvC,IAAA,MAAM,CAAA,GAAI,UAAA,CAAW,QAAA,CAAS,CAAC,KAAK,GAAG,CAAA;AAEvC,IAAA,MAAM,UAAA,GAAa,CAAA,CAAE,KAAA,CAAM,oBAAoB,CAAA;AAC/C,IAAA,MAAM,QAAQ,UAAA,GAAa,UAAA,CAAW,WAAW,CAAC,CAAA,IAAK,GAAG,CAAA,GAAI,CAAA;AAE9D,IAAA,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,GAAA,IAAO,CAAA,GAAI,KAAA,CAAA;AACtC,IAAA,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,GAAA,IAAO,CAAA,GAAI,KAAA,CAAA;AACtC,IAAA,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,GAAQ,GAAA,IAAO,CAAA,GAAI,KAAA,CAAA;AACtC,IAAA,OAAA,CAAQ,KAAA,GAAQ,MAAA,GAAS,KAAA,GAAQ,MAAA,GAAS,QAAQ,MAAA,IAAU,GAAA;AAAA,EAC9D;AAGA,EAAA,MAAM,UAAA,GAAa,CAAA,CAAE,KAAA,CAAM,qBAAqB,CAAA;AAChD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,CAAA,GAAI,UAAA,CAAW,UAAA,CAAW,CAAC,KAAK,KAAK,CAAA;AAC3C,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,MAAM,UAAA,GAAa,CAAA,CAAE,KAAA,CAAM,qBAAqB,CAAA;AAChD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,UAAA,CAAW,UAAA,CAAW,CAAC,CAAA,IAAK,KAAK,CAAA;AAAA,EAC1C;AAGA,EAAA,MAAM,QAAA,GAAW,CAAA,CAAE,KAAA,CAAM,iDAAiD,CAAA;AAC1E,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,UAAA,CAAW,QAAA,CAAS,CAAC,CAAA,IAAK,IAAI,CAAA,GAAI,GAAA;AAAA,EAC3C;AAGA,EAAA,MAAM,aAAA,GAAgB,CAAA,CAAE,KAAA,CAAM,iCAAiC,CAAA;AAC/D,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,WAAW,UAAA,CAAW,aAAA,CAAc,CAAC,CAAA,IAAK,IAAI,CAAA,GAAI,GAAA;AACxD,IAAA,OAAO,CAAA,GAAI,QAAA;AAAA,EACb;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,cAAc,KAAA,EAAuB;AAC5C,EAAA,MAAM,GAAA,GAAM,kBAAkB,KAAK,CAAA;AACnC,EAAA,IAAI,GAAA,KAAQ,MAAM,OAAO,MAAA;AACzB,EAAA,OAAO,GAAA,GAAM,OAAO,MAAA,GAAS,MAAA;AAC/B;AAOA,SAAS,gBAAgB,MAAA,EAAoC;AAC3D,EAAA,MAAM,GAAA,uBAAU,GAAA,EAA0B;AAE1C,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,MAAM,MAAM,KAAA,CAAM,IAAA,CAAK,MAAM,GAAG,CAAA,CAAE,CAAC,CAAA,IAAK,OAAA;AACxC,IAAA,IAAI,CAAC,IAAI,GAAA,CAAI,GAAG,GAAG,GAAA,CAAI,GAAA,CAAI,GAAA,EAAK,EAAE,CAAA;AAClC,IAAA,GAAA,CAAI,GAAA,CAAI,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA;AAAA,EAC1B;AAEA,EAAA,OAAO,MAAM,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,EAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,IAAI,CAAA,MAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,MAAK,CAAE,CAAA;AACjF;AAMA,SAAS,YAAA,CAAa,OAAmB,SAAA,EAA4B;AACnE,EAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,MAAM,GAAG,CAAA,CAAE,KAAI,IAAK,EAAA;AAC7C,EAAA,MAAM,EAAA,GAAK,aAAA,CAAc,KAAA,CAAM,KAAK,CAAA;AACpC,EAAA,MAAM,QAAA,GAAW,aACZ,MAAM;AACL,IAAA,MAAM,MAAA,GAAS,cAAc,SAAS,CAAA;AACtC,IAAA,OAAO,CAAA,8CAAA,EAAiD,WAAW,SAAS,CAAC,UAAU,MAAM,CAAA,eAAA,EAAkB,UAAA,CAAW,SAAS,CAAC,CAAA;AAAA,gCAAA,EAC1G,UAAA,CAAW,SAAS,CAAC,CAAA;AAAA,MAAA,CAAA;AAAA,EAEjD,IAAG,GACH,EAAA;AAEJ,EAAA,OAAO,CAAA,mCAAA,EAAsC,WAAW,KAAA,CAAM,IAAI,CAAC,CAAA,EAAA,EAAK,UAAA,CAAW,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,2CAAA,EACpD,UAAA,CAAW,KAAA,CAAM,KAAK,CAAC,UAAU,EAAE,CAAA;AAAA,kCAAA,EAC5C,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,kCAAA,EACjB,UAAA,CAAW,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,QAAA,EACjD,QAAQ;AAAA,MAAA,CAAA;AAElB;AAEA,SAAS,gBAAA,CAAiB,OAAmB,aAAA,EAAgD;AAC3F,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA0B;AAChD,EAAA,MAAM,aAA2B,EAAC;AAElC,EAAA,KAAA,MAAW,KAAA,IAAS,MAAM,MAAA,EAAQ;AAChC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAClC,IAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,MAAA,MAAM,MAAM,KAAA,CAAM,KAAA,CAAM,GAAG,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AACtC,MAAA,IAAI,CAAC,UAAU,GAAA,CAAI,GAAG,GAAG,SAAA,CAAU,GAAA,CAAI,GAAA,EAAK,EAAE,CAAA;AAC9C,MAAA,SAAA,CAAU,GAAA,CAAI,GAAG,CAAA,EAAG,IAAA,CAAK,KAAK,CAAA;AAAA,IAChC,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,CAAA,CAC7C,GAAA,CAAI,CAAC,CAAC,SAAA,EAAW,MAAM,CAAA,KAAM;AAC5B,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,CAAK,CAAC,MAAM,aAAA,GAAgB,CAAA,CAAE,IAAI,CAAA,KAAM,MAAS,CAAA;AACxE,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,GAAA,CAAI,CAAC,MAAM,YAAA,CAAa,CAAA,EAAG,aAAA,GAAgB,CAAA,CAAE,IAAI,CAAC,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA;AAEtF,IAAA,MAAM,cAAc,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA,CAAE,KAAI,IAAK,SAAA;AAClD,IAAA,MAAM,SAAA,GAAY,UAAU,CAAA,wCAAA,CAAA,GAA6C,EAAA;AACzE,IAAA,OAAO,CAAA;AAAA,6BAAA,EACkB,UAAA,CAAW,WAAW,CAAC,CAAA,EAAG,SAAS,CAAA;AAAA,4BAAA,EACpC,QAAQ,CAAA;AAAA,MAAA,CAAA;AAAA,EAElC,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,EAAA,MAAM,cAAA,GACJ,WAAW,MAAA,GAAS,CAAA,GAChB,qCAAqC,UAAA,CAClC,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,MAAM,KAAA,GAAQ,EAAE,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,MAAS,CAAA,CAAE,IAAA;AAC3C,IAAA,MAAM,OAAA,GAAU,aAAA,GAAgB,CAAA,CAAE,IAAI,CAAA;AACtC,IAAA,MAAM,EAAA,GAAK,aAAA,CAAc,CAAA,CAAE,KAAK,CAAA;AAEhC,IAAA,IAAI,QAAA,GAAW,EAAA;AACf,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,MAAA,GAAS,cAAc,OAAO,CAAA;AACpC,MAAA,QAAA,GAAW,CAAA,qDAAA,EAAwD,UAAA,CAAW,OAAO,CAAC,CAAA,OAAA,EAAU,MAAM,CAAA,eAAA,EAAkB,UAAA,CAAW,OAAO,CAAC,CAAA,gCAAA,EAAmC,UAAA,CAAW,OAAO,CAAC,CAAA,aAAA,CAAA;AAAA,IACnM;AAEA,IAAA,OAAO,CAAA;AAAA,4DAAA,EAC2C,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,UAAU,EAAE,CAAA,SAAA,EAAY,UAAA,CAAW,CAAA,CAAE,IAAI,CAAC,CAAA,EAAA,EAAK,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,kCAAA,EAC/G,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,kCAAA,EACjB,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,QAAA,EAC7C,QAAQ;AAAA,MAAA,CAAA;AAAA,EAER,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAC,CAAA,MAAA,CAAA,GACb,EAAA;AAEN,EAAA,OAAO,CAAA,+BAAA,EAAkC,UAAA,CAAW,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,+BAAA,EAChC,UAAA,CAAW,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,EAAA,EACnD,SAAS,GAAG,cAAc;AAAA,MAAA,CAAA;AAE9B;AAMA,SAAS,mBAAmB,KAAA,EAA2B;AACrD,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAChB,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IAAK,CAAA,CAAE,IAAA;AACxD,IAAA,OAAO,CAAA;AAAA,gCAAA,EACqB,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,gCAAA,EACjB,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,mFAAA,EACgC,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,MAAA,CAAA;AAAA,EAEpG,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,EAAA,OAAO,CAAA,+BAAA,EAAkC,UAAA,CAAW,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,+BAAA,EAChC,UAAA,CAAW,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,EAAA,EACnD,IAAI;AAAA,MAAA,CAAA;AAER;AAMA,SAAS,sBAAsB,KAAA,EAA2B;AACxD,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAChB,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IAAK,CAAA,CAAE,IAAA;AACxD,IAAA,MAAM,cACJ,CAAA,CAAE,IAAA,KAAS,eACP,CAAA,YAAA,EAAe,UAAA,CAAW,EAAE,KAAK,CAAC,CAAA,CAAA,GAClC,CAAA,CAAE,SAAS,WAAA,GACT,CAAA,UAAA,EAAa,WAAW,CAAA,CAAE,KAAK,CAAC,CAAA,CAAA,GAChC,EAAA;AAER,IAAA,OAAO,CAAA;AAAA,6BAAA,EACkB,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,6BAAA,EACjB,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,EAAA,EAC9C,WAAA,GAAc,CAAA,mCAAA,EAAsC,WAAW,CAAA,UAAA,CAAA,GAAe,EAAE;AAAA,MAAA,CAAA;AAAA,EAEhF,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,EAAA,OAAO,CAAA,+BAAA,EAAkC,UAAA,CAAW,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,+BAAA,EAChC,UAAA,CAAW,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,EAAA,EACnD,IAAI;AAAA,MAAA,CAAA;AAER;AAMA,SAAS,kBAAA,CAAmB,OAAmB,aAAA,EAAgD;AAC7F,EAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,KAAM,YAAA,CAAa,CAAA,CAAE,KAAK,CAAC,CAAA;AAEnE,EAAA,IAAI,WAAA,EAAa,OAAO,gBAAA,CAAiB,KAAA,EAAO,aAAa,CAAA;AAE7D,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,CAAC,MAAM,aAAA,GAAgB,CAAA,CAAE,IAAI,CAAA,KAAM,MAAS,CAAA;AAEpF,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,MAAA,CAChB,GAAA,CAAI,CAAC,CAAA,KAAM;AACV,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,IAAK,CAAA,CAAE,IAAA;AACxD,IAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAA,CAAE,KAAK,CAAA,GACnC,sDAAsD,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,CAAA,SAAA,CAAA,GACzE,EAAA;AAEJ,IAAA,MAAM,OAAA,GAAU,aAAA,GAAgB,CAAA,CAAE,IAAI,CAAA;AACtC,IAAA,MAAM,QAAA,GAAW,gBACb,CAAA,6BAAA,EAAgC,OAAA,GAAU,GAAG,YAAA,CAAa,OAAO,IAAI,CAAA,mDAAA,EAAsD,UAAA,CAAW,OAAO,CAAC,CAAA,SAAA,CAAA,GAAc,EAAE,CAAA,EAAG,UAAA,CAAW,OAAO,CAAC,CAAA,CAAA,GAAK,sDAAiD,CAAA,KAAA,CAAA,GAC1O,EAAA;AAEJ,IAAA,OAAO,CAAA;AAAA,8BAAA,EACmB,UAAA,CAAW,KAAK,CAAC,CAAA;AAAA,+BAAA,EAChB,UAAU,CAAA,EAAG,UAAA,CAAW,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,EAAA,EAC7D,QAAQ;AAAA,8BAAA,EACoB,UAAA,CAAW,CAAA,CAAE,IAAI,CAAC,CAAA;AAAA,KAAA,CAAA;AAAA,EAE9C,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,CAAA;AAEZ,EAAA,MAAM,UAAA,GAAa,gBAAgB,eAAA,GAAkB,EAAA;AAErD,EAAA,OAAO,CAAA,+BAAA,EAAkC,UAAA,CAAW,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA,+BAAA,EAChC,UAAA,CAAW,KAAA,CAAM,IAAI,CAAC,CAAA;AAAA;AAAA,2CAAA,EAEV,UAAU,CAAA;AAAA,WAAA,EAC1C,IAAI,CAAA;AAAA;AAAA,MAAA,CAAA;AAGjB;AAMA,SAAS,WAAA,CAAY,OAAmB,aAAA,EAAgD;AACtF,EAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAC,CAAA;AACxD,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,OAAA,IAAW,YAAA,CAAa,CAAA,CAAE,KAAK,CAAC,CAAA;AACvF,EAAA,MAAM,aAAA,GAAgB,MAAM,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,WAAW,CAAA;AACtE,EAAA,MAAM,gBAAgB,QAAA,CAAS,GAAA,CAAI,YAAY,CAAA,IAAK,QAAA,CAAS,IAAI,YAAY,CAAA;AAE7E,EAAA,IAAI,SAAA,IAAa,MAAM,MAAA,CAAO,MAAA,GAAS,GAAG,OAAO,gBAAA,CAAiB,OAAO,aAAa,CAAA;AACtF,EAAA,IAAI,iBAAiB,KAAA,CAAM,MAAA,CAAO,SAAS,CAAA,EAAG,OAAO,mBAAmB,KAAK,CAAA;AAC7E,EAAA,IAAI,aAAA,EAAe,OAAO,qBAAA,CAAsB,KAAK,CAAA;AACrD,EAAA,OAAO,kBAAA,CAAmB,OAAO,aAAa,CAAA;AAChD;AAEO,SAAS,mBAAmB,IAAA,EAAwB;AACzD,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,IAAgB,EAAC;AAErC,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,MAAMA,KAAAA,GAAO,CAAA;AAAA;AAAA;AAAA,MAAA,CAAA;AAKb,IAAA,OAAO,SAAA,CAAU;AAAA,MACf,KAAA,EAAO,CAAA,cAAA,EAAY,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA,CAAA;AAAA,MACrC,IAAA,EAAAA,KAAAA;AAAA,MACA,OAAA,EAAS,YAAA,CAAa,IAAA,EAAM,QAAQ,CAAA;AAAA,MACpC,UAAA,EAAY,EAAA;AAAA,MACZ,QAAA,EAAU,KAAK,OAAA,CAAQ,QAAA;AAAA,MACvB,WAAA,EAAa,iBAAiB,IAAI,CAAA;AAAA,MAClC,WAAA,EAAa,CAAC,EAAE,KAAA,EAAO,UAAU;AAAA,KAClC,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,MAAA,GAAS,gBAAgB,MAAM,CAAA;AAGrC,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,WAAA,IAAe,EAAC;AACpC,EAAA,MAAM,aAAA,GAAwC;AAAA,IAC5C,GAAG,OAAO,MAAM,CAAA;AAAA,IAChB,GAAG,OAAO,oBAAoB;AAAA,GAChC;AACA,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA,CAAE,MAAA;AAE7C,EAAA,MAAM,cAAc,MAAA,CAAO,MAAA;AAAA,IAAO,CAAC,CAAA,KACjC,CAAA,CAAE,MAAA,CAAO,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,OAAA,IAAW,YAAA,CAAa,CAAA,CAAE,KAAK,CAAC;AAAA,GACnE;AACA,EAAA,MAAM,cAAc,MAAA,CAAO,MAAA;AAAA,IACzB,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,OAAO,KAAA,CAAM,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,OAAA,IAAW,YAAA,CAAa,CAAA,CAAE,KAAK,CAAC;AAAA,GAC3E;AAEA,EAAA,MAAM,WAAA,GAAc,WAAA,CAAY,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,CAAE,MAAA,CAAO,MAAA,EAAQ,CAAC,CAAA;AAC3E,EAAA,MAAM,UAAA,GAAa,WAAA,CAAY,MAAA,CAAO,CAAC,GAAA,EAAK,MAAM,GAAA,GAAM,CAAA,CAAE,MAAA,CAAO,MAAA,EAAQ,CAAC,CAAA;AAE1E,EAAA,MAAM,OAAO,IAAA,CAAK,SAAA;AAClB,EAAA,MAAM,QAAA,GAAW,MAAM,IAAA,GAAO,CAAA,QAAA,EAAM,WAAW,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,GAAK,EAAA;AAC9D,EAAA,MAAM,WAAA,GAAc,MAAM,WAAA,GACtB,CAAA,uCAAA,EAA0C,WAAW,IAAA,CAAK,WAAW,CAAC,CAAA,OAAA,CAAA,GACtE,EAAA;AAEJ,EAAA,MAAM,YAAA,GACJ,SAAA,GAAY,CAAA,GACR,CAAA,2FAAA,EAA8F,SAAS,CAAA,YAAA,CAAA,GACvG,EAAA;AAEN,EAAA,MAAM,SAAA,GAAY,CAAA;AAAA,2FAAA,EACyE,OAAO,MAAM,CAAA;AAAA,qFAAA,EACnB,WAAW,CAAA;AAAA,oFAAA,EACZ,UAAU,CAAA;AAAA,qFAAA,EACT,OAAO,MAAM,CAAA;AAAA,EAAA,EAChG,YAAY;AAAA,MAAA,CAAA;AAGd,EAAA,MAAM,UAAA,GAAa,CAAA,iJAAA,CAAA;AAEnB,EAAA,MAAM,YAAA,GAAe,MAAA,CAClB,GAAA,CAAI,CAAC,MAAM,WAAA,CAAY,CAAA,EAAG,SAAA,GAAY,CAAA,GAAI,aAAA,GAAgB,MAAS,CAAC,CAAA,CACpE,KAAK,IAAI,CAAA;AAEZ,EAAA,MAAM,aAAa,MAAA,CAChB,GAAA;AAAA,IACC,CAAC,CAAA,KACC,CAAA,aAAA,EAAgB,UAAA,CAAW,EAAE,IAAI,CAAC,CAAA,EAAA,EAAK,UAAA,CAAW,EAAE,IAAI,CAAC,CAAA,2CAAA,EAA8C,CAAA,CAAE,OAAO,MAAM,CAAA,YAAA;AAAA,GAC1H,CACC,KAAK,IAAI,CAAA;AAEZ,EAAA,MAAM,IAAA,GAAO,CAAA;AAAA,mBAAA,EACM,QAAQ,CAAA;AAAA,KAAA,EACtB,MAAA,CAAO,MAAM,CAAA,eAAA,EAAkB,MAAA,CAAO,MAAM,UAAU,WAAA,GAAc,CAAA,MAAA,EAAM,WAAW,CAAA,CAAA,GAAK,EAAE,CAAA;AAAA;AAAA,EAEjG,SAAS;AAAA,EACT,UAAU;AAAA;AAAA,EAEV,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAA,CAAA;AAgCZ,EAAA,OAAO,SAAA,CAAU;AAAA,IACf,KAAA,EAAO,CAAA,cAAA,EAAY,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA,CAAA;AAAA,IACrC,IAAA;AAAA,IACA,OAAA,EAAS,YAAA,CAAa,IAAA,EAAM,QAAQ,CAAA;AAAA,IACpC,UAAA;AAAA,IACA,QAAA,EAAU,KAAK,OAAA,CAAQ,QAAA;AAAA,IACvB,WAAA,EAAa,iBAAiB,IAAI,CAAA;AAAA,IAClC,WAAA,EAAa,CAAC,EAAE,KAAA,EAAO,UAAU;AAAA,GAClC,CAAA;AACH;;;AC3ZA,eAAsB,UAAU,OAAA,EAAsC;AACpE,EAAA,MAAM,iBAAA,GAAoB,iBAAiB,OAAO,CAAA;AAElD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,+BAAA,EAAkC,iBAAA,CAAkB,QAAQ,CAAA,MAAA,CAAG,CAAA;AAC3E,EAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,iBAAiB,CAAA;AAEjD,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,SAAS,UAAU,CAAA;AAC3D,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mBAAA,EAAsB,cAAA,CAAe,MAAM,CAAA,YAAA,CAAc,CAAA;AAGrE,EAAA,MAAM,MAAM,iBAAA,CAAkB,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAG5D,EAAA,KAAA,MAAW,QAAQ,cAAA,EAAgB;AACjC,IAAA,MAAM,IAAA,GAAO,QAAQ,IAAI,CAAA;AACzB,IAAA,MAAM,IAAA,GAAO,qBAAA,CAAsB,IAAA,EAAM,IAAI,CAAA;AAC7C,IAAA,MAAM,aAAaC,IAAAA,CAAK,iBAAA,CAAkB,SAAA,EAAW,CAAA,EAAG,IAAI,CAAA,KAAA,CAAO,CAAA;AACnE,IAAA,MAAM,SAAA,CAAU,UAAA,EAAY,IAAA,EAAM,OAAO,CAAA;AACzC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sBAAA,EAAoB,IAAI,CAAA,QAAA,EAAM,IAAI,CAAA,KAAA,CAAO,CAAA;AAAA,EACvD;AAGA,EAAA,MAAM,SAAA,GAAY,qBAAqB,IAAI,CAAA;AAC3C,EAAA,MAAM,UAAUA,IAAAA,CAAK,iBAAA,CAAkB,WAAW,YAAY,CAAA,EAAG,WAAW,OAAO,CAAA;AACnF,EAAA,OAAA,CAAQ,IAAI,CAAA,8BAAA,CAA2B,CAAA;AAGvC,EAAA,MAAM,aAAA,GAAgB,gBAAgB,IAAI,CAAA;AAC1C,EAAA,MAAM,UAAUA,IAAAA,CAAK,iBAAA,CAAkB,WAAW,gBAAgB,CAAA,EAAG,eAAe,OAAO,CAAA;AAC3F,EAAA,OAAA,CAAQ,IAAI,CAAA,kCAAA,CAA+B,CAAA;AAG3C,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,iBAAA,CAAkB,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAC7C,IAAA,MAAM,SAAA,GAAY,kBAAkB,IAAI,CAAA;AACxC,IAAA,MAAM,UAAUA,IAAAA,CAAK,iBAAA,CAAkB,WAAW,YAAY,CAAA,EAAG,WAAW,OAAO,CAAA;AACnF,IAAA,OAAA,CAAQ,IAAI,CAAA,8BAAA,CAA2B,CAAA;AACvC,IAAA,UAAA,EAAA;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,YAAA,IAAgB,IAAA,CAAK,YAAA,CAAa,SAAS,CAAA,EAAG;AACrD,IAAA,MAAM,UAAA,GAAa,mBAAmB,IAAI,CAAA;AAC1C,IAAA,MAAM,UAAUA,IAAAA,CAAK,iBAAA,CAAkB,WAAW,aAAa,CAAA,EAAG,YAAY,OAAO,CAAA;AACrF,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,iCAAA,EAA+B,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA,QAAA,CAAU,CAAA;AAC7E,IAAA,UAAA,EAAA;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,GAAA;AAAA,IACN,sCAAsC,iBAAA,CAAkB,SAAS,KAAK,cAAA,CAAe,MAAA,GAAS,IAAI,UAAU,CAAA,QAAA;AAAA,GAC9G;AACF","file":"index.js","sourcesContent":["import { readdir, readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type {\n ComplianceBatchData,\n ManifestData,\n RenderFileData,\n SiteData,\n SiteOptions,\n TokenEntry,\n TokenFileData,\n} from \"./types.js\";\n\nfunction normalizeOptions(options?: SiteOptions): Required<SiteOptions> {\n return {\n inputDir: options?.inputDir ?? \".reactscope\",\n outputDir: options?.outputDir ?? \".reactscope/site\",\n basePath: options?.basePath ?? \"/\",\n compliancePath: options?.compliancePath ?? \"\",\n tokenFilePath: options?.tokenFilePath ?? \"\",\n title: options?.title ?? \"Scope — Component Gallery\",\n iconPatterns: options?.iconPatterns ?? [],\n };\n}\n\nfunction flattenTokens(obj: Record<string, unknown>, prefix: string, result: TokenEntry[]): void {\n for (const [key, value] of Object.entries(obj)) {\n const path = prefix ? `${prefix}.${key}` : key;\n if (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n \"value\" in value &&\n \"type\" in value\n ) {\n const v = value as { value: unknown; type: unknown };\n result.push({\n path,\n value: String(v.value),\n type: String(v.type),\n });\n } else if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n flattenTokens(value as Record<string, unknown>, path, result);\n }\n }\n}\n\nexport { normalizeOptions };\n\nasync function readJsonFile<T>(filePath: string): Promise<T> {\n const content = await readFile(filePath, \"utf-8\");\n return JSON.parse(content) as T;\n}\n\nexport async function readSiteData(options: Required<SiteOptions>): Promise<SiteData> {\n // 1. Read manifest\n const manifestPath = join(options.inputDir, \"manifest.json\");\n const manifest = await readJsonFile<ManifestData>(manifestPath);\n\n // 2. Scan renders directory\n const renders = new Map<string, RenderFileData>();\n const rendersDir = join(options.inputDir, \"renders\");\n\n try {\n const entries = await readdir(rendersDir);\n const jsonFiles = entries.filter((f) => f.endsWith(\".json\"));\n\n await Promise.all(\n jsonFiles.map(async (file) => {\n const componentName = file.replace(/(?:\\.error)?\\.json$/, \"\");\n const filePath = join(rendersDir, file);\n try {\n const renderData = await readJsonFile<RenderFileData>(filePath);\n renders.set(componentName, renderData);\n } catch (err) {\n console.warn(\n `[scope/site] Warning: could not read render file ${filePath}:`,\n err instanceof Error ? err.message : String(err),\n );\n }\n }),\n );\n } catch {\n // renders directory may not exist — that's fine\n }\n\n // 3. Optionally read compliance JSON\n let complianceBatch: ComplianceBatchData | undefined;\n if (options.compliancePath) {\n try {\n complianceBatch = await readJsonFile<ComplianceBatchData>(options.compliancePath);\n } catch (err) {\n console.warn(\n `[scope/site] Warning: could not read compliance file ${options.compliancePath}:`,\n err instanceof Error ? err.message : String(err),\n );\n }\n }\n\n // 4. Optionally read token file\n let tokenEntries: TokenEntry[] | undefined;\n let tokenMeta: { name?: string; lastUpdated?: string } | undefined;\n let siteTokenThemes: Record<string, Record<string, string>> | undefined;\n if (options.tokenFilePath) {\n try {\n const tokenFile = await readJsonFile<TokenFileData>(options.tokenFilePath);\n const entries: TokenEntry[] = [];\n flattenTokens(tokenFile.tokens, \"\", entries);\n tokenEntries = entries;\n tokenMeta = tokenFile.meta;\n if (tokenFile.themes && Object.keys(tokenFile.themes).length > 0) {\n siteTokenThemes = tokenFile.themes;\n }\n } catch (err) {\n console.warn(\n `[scope/site] Warning: could not read token file ${options.tokenFilePath}:`,\n err instanceof Error ? err.message : String(err),\n );\n }\n }\n\n // 5. Optionally read playground defaults from scope files\n let playgroundDefaults: Map<string, Record<string, unknown>> | undefined;\n try {\n const defaultsPath = join(options.inputDir, \"playground-defaults.json\");\n const defaultsRaw = await readJsonFile<Record<string, Record<string, unknown>>>(defaultsPath);\n playgroundDefaults = new Map(Object.entries(defaultsRaw));\n } catch {\n // playground-defaults.json may not exist\n }\n\n return {\n manifest,\n renders,\n complianceBatch,\n tokenEntries,\n tokenThemes: siteTokenThemes,\n tokenMeta,\n options,\n playgroundDefaults,\n };\n}\n","import type { DOMNodeData, PropData } from \"./types.js\";\n\n/**\n * Minimal glob matcher supporting `*` (any chars except `/`) and `**` (any chars).\n */\nexport function matchGlob(pattern: string, value: string): boolean {\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regexStr = escaped\n .replace(/\\*\\*/g, \"§GLOBSTAR§\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/§GLOBSTAR§/g, \".*\");\n return new RegExp(`^${regexStr}$`, \"i\").test(value);\n}\n\n/**\n * Reconstruct an SVG markup string from a DOMNodeData tree.\n * Used to render inline SVG previews for icon components without screenshots.\n */\nexport function domTreeToSvg(node: DOMNodeData): string {\n if (node.tag === \"#text\") {\n return node.text ?? \"\";\n }\n\n const attrs = Object.entries(node.attrs)\n .map(([k, v]) => ` ${k}=\"${escapeHtml(v)}\"`)\n .join(\"\");\n\n const children = node.children.map((child) => domTreeToSvg(child)).join(\"\");\n const textContent = node.text?.trim() ?? \"\";\n\n if (!children && !textContent) {\n return `<${node.tag}${attrs} />`;\n }\n\n return `<${node.tag}${attrs}>${textContent}${children}</${node.tag}>`;\n}\n\nexport function escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nexport function slugify(name: string): string {\n return name\n .replace(/([A-Z])/g, (m) => `-${m.toLowerCase()}`)\n .replace(/^-/, \"\")\n .replace(/[^a-z0-9-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\nexport function syntaxHighlightJSX(code: string): string {\n const escaped = escapeHtml(code);\n\n return (\n escaped\n // Comments\n .replace(/(\\/\\/[^\\n]*)/g, '<span class=\"token-comment\">$1</span>')\n .replace(/(\\/\\*[\\s\\S]*?\\*\\/)/g, '<span class=\"token-comment\">$1</span>')\n // JSX tags\n .replace(/(<\\/?)([\\w.]+)/g, '<span class=\"token-tag\">$1$2</span>')\n // JSX attributes (word followed by =)\n .replace(/\\b([\\w-]+)(?==)/g, '<span class=\"token-attr\">$1</span>')\n // Strings\n .replace(\n /("[^&]*"|'[^&]*'|`[^`]*`)/g,\n '<span class=\"token-string\">$1</span>',\n )\n // Keywords\n .replace(\n /\\b(import|export|from|default|const|let|var|function|return|if|else|for|while|class|extends|type|interface|async|await|new|typeof|instanceof)\\b/g,\n '<span class=\"token-keyword\">$1</span>',\n )\n // Numbers\n .replace(/\\b(\\d+\\.?\\d*)\\b/g, '<span class=\"token-number\">$1</span>')\n );\n}\n\nexport function renderDOMTree(node: DOMNodeData, depth = 0): string {\n const indent = \" \".repeat(depth);\n\n // Filter to a short display version of attrs (skip long class strings for the summary line)\n const attrsHtml = Object.entries(node.attrs)\n .map(([k, v]) => {\n const display = v.length > 60 ? `${v.slice(0, 57)}…` : v;\n return ` <span class=\"dom-attr-name\">${escapeHtml(k)}</span>=<span class=\"dom-attr-value\">\"${escapeHtml(display)}\"</span>`;\n })\n .join(\"\");\n\n const nodeIdAttr = node.nodeId !== undefined ? ` data-node-id=\"${node.nodeId}\"` : \"\";\n const clickable = node.nodeId !== undefined ? \" dom-node-clickable\" : \"\";\n\n const hasChildren = node.children.length > 0;\n const hasText = node.text !== undefined && node.text.trim().length > 0;\n\n if (!hasChildren && !hasText) {\n return `${indent}<span class=\"dom-tag-open${clickable}\"${nodeIdAttr}><${escapeHtml(node.tag)}${attrsHtml} /></span>\\n`;\n }\n\n const childrenHtml = node.children.map((child) => renderDOMTree(child, depth + 1)).join(\"\");\n const textHtml = hasText\n ? `${indent} <span class=\"dom-text\">${escapeHtml(node.text ?? \"\")}</span>\\n`\n : \"\";\n\n return `<details class=\"dom-node${clickable}\" ${depth < 2 ? \"open\" : \"\"}${nodeIdAttr}>\n${indent}<summary><span class=\"dom-tag-open\"><${escapeHtml(node.tag)}${attrsHtml}></span></summary>\n${textHtml}${childrenHtml}${indent}<span class=\"dom-tag-close\"></${escapeHtml(node.tag)}></span>\n</details>`;\n}\n\n/**\n * Generate an interactive control element for a prop in the playground.\n * `overrideDefault` takes precedence over `prop.default` (e.g. from .scope.ts).\n */\nexport function propControlHtml(name: string, prop: PropData, overrideDefault?: string): string {\n const escapedName = escapeHtml(name);\n const dataAttrs = `data-prop-name=\"${escapedName}\" data-prop-type=\"${escapeHtml(prop.type)}\"`;\n\n const rawDefault = overrideDefault ?? prop.default;\n const defaultVal = rawDefault !== undefined ? rawDefault.replace(/^['\"]|['\"]$/g, \"\") : undefined;\n\n switch (prop.type) {\n case \"boolean\": {\n const checked = defaultVal === \"true\" ? \" checked\" : \"\";\n return `<div class=\"pg-control-row\">\n <label class=\"pg-control-label\" for=\"pg-${escapedName}\">${escapedName}</label>\n <input class=\"pg-checkbox\" type=\"checkbox\" id=\"pg-${escapedName}\" ${dataAttrs}${checked} />\n</div>`;\n }\n\n case \"number\": {\n const numVal = defaultVal ?? (prop.required ? \"0\" : \"\");\n return `<div class=\"pg-control-row\">\n <label class=\"pg-control-label\" for=\"pg-${escapedName}\">${escapedName}</label>\n <input class=\"pg-input\" type=\"number\" id=\"pg-${escapedName}\" ${dataAttrs} value=\"${escapeHtml(numVal)}\" />\n</div>`;\n }\n\n case \"union\": {\n if (prop.values && prop.values.length > 0) {\n const options = prop.values\n .map((v) => {\n const sel = defaultVal === v ? \" selected\" : \"\";\n return `<option value=\"${escapeHtml(v)}\"${sel}>${escapeHtml(v)}</option>`;\n })\n .join(\"\");\n const emptyOption = prop.required ? \"\" : '<option value=\"\">—</option>';\n return `<div class=\"pg-control-row\">\n <label class=\"pg-control-label\" for=\"pg-${escapedName}\">${escapedName}</label>\n <select class=\"pg-select\" id=\"pg-${escapedName}\" ${dataAttrs}>${emptyOption}${options}</select>\n</div>`;\n }\n const textVal = defaultVal ?? \"\";\n return `<div class=\"pg-control-row\">\n <label class=\"pg-control-label\" for=\"pg-${escapedName}\">${escapedName}</label>\n <input class=\"pg-input\" type=\"text\" id=\"pg-${escapedName}\" ${dataAttrs} value=\"${escapeHtml(textVal)}\" placeholder=\"${escapeHtml(prop.rawType)}\" />\n</div>`;\n }\n\n case \"string\": {\n const strVal = defaultVal ?? (prop.required ? \"\" : \"\");\n return `<div class=\"pg-control-row\">\n <label class=\"pg-control-label\" for=\"pg-${escapedName}\">${escapedName}</label>\n <input class=\"pg-input\" type=\"text\" id=\"pg-${escapedName}\" ${dataAttrs} value=\"${escapeHtml(strVal)}\" />\n</div>`;\n }\n\n case \"function\":\n return `<div class=\"pg-control-row\">\n <label class=\"pg-control-label\">${escapedName}</label>\n <span class=\"pg-control-readonly\">${escapeHtml(prop.rawType)}</span>\n</div>`;\n\n case \"node\":\n case \"element\": {\n const nodeVal = defaultVal ?? \"\";\n return `<div class=\"pg-control-row\">\n <label class=\"pg-control-label\" for=\"pg-${escapedName}\">${escapedName}</label>\n <input class=\"pg-input\" type=\"text\" id=\"pg-${escapedName}\" ${dataAttrs} value=\"${escapeHtml(nodeVal)}\" placeholder=\"text content\" />\n</div>`;\n }\n\n default: {\n const otherVal = defaultVal ?? \"\";\n return `<div class=\"pg-control-row\">\n <label class=\"pg-control-label\" for=\"pg-${escapedName}\">${escapedName}</label>\n <input class=\"pg-input\" type=\"text\" id=\"pg-${escapedName}\" ${dataAttrs} value=\"${escapeHtml(otherVal)}\" placeholder=\"JSON\" />\n</div>`;\n }\n }\n}\n\nexport function propTableRow(name: string, prop: PropData): string {\n const valuesHtml =\n prop.values && prop.values.length > 0\n ? `<br><span style=\"color:var(--color-muted);font-size:11px\">${prop.values.map((v) => escapeHtml(v)).join(\" | \")}</span>`\n : \"\";\n\n const defaultHtml = prop.default !== undefined ? escapeHtml(prop.default) : \"—\";\n\n return `<tr>\n <td><span class=\"prop-name\">${escapeHtml(name)}</span></td>\n <td><span class=\"prop-type\">${escapeHtml(prop.type)}</span>${valuesHtml}</td>\n <td>${prop.required ? '<span class=\"prop-required\">required</span>' : '<span style=\"color:var(--color-muted)\">optional</span>'}</td>\n <td><span class=\"prop-default\">${defaultHtml}</span></td>\n </tr>`;\n}\n","export function generateCSS(): string {\n const css = `@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&family=JetBrains+Mono:wght@400;700&display=swap');\n\n:root {\n color-scheme: light;\n --color-text: #0f0f0f;\n --color-muted: #6b7280;\n --color-border: #e5e7eb;\n --color-bg: #ffffff;\n --color-bg-subtle: #f9fafb;\n --color-bg-code: #1a1a2e;\n --color-accent: #2563eb;\n --color-success: #16a34a;\n --color-warn: #d97706;\n --color-error: #dc2626;\n --color-on-accent: #fff;\n --color-preview-bg: #f8f8f8;\n --color-code-text: #e2e8f0;\n --badge-complex-border: #fbbf24;\n --badge-complex-color: #92400e;\n --badge-complex-bg: #fffbeb;\n --badge-simple-border: #6ee7b7;\n --badge-simple-color: #065f46;\n --badge-simple-bg: #ecfdf5;\n --badge-memo-border: #a5b4fc;\n --badge-memo-color: #3730a3;\n --badge-memo-bg: #eef2ff;\n --badge-internal-border: #d1d5db;\n --badge-internal-color: #9ca3af;\n --badge-internal-bg: #f3f4f6;\n --pill-on-bg: #dcfce7;\n --pill-on-color: #166534;\n --pill-off-bg: #fef3c7;\n --pill-off-color: #92400e;\n --violation-bg: #fef2f2;\n --violation-border: #fecaca;\n --violation-color: #991b1b;\n --color-bg-selected: #eef2ff;\n --overlay-bg: rgba(0,0,0,0.2);\n --slideout-shadow: -4px 0 24px rgba(0,0,0,0.12);\n --font-body: 'Inter', system-ui, -apple-system, sans-serif;\n --font-mono: 'JetBrains Mono', 'Fira Code', monospace;\n --radius: 6px;\n --shadow-sm: 0 1px 2px rgba(0,0,0,0.05);\n --shadow: 0 1px 3px rgba(0,0,0,0.1), 0 1px 2px rgba(0,0,0,0.06);\n}\n\n[data-theme=\"dark\"] {\n color-scheme: dark;\n --color-text: #f3f4f6;\n --color-muted: #9ca3af;\n --color-border: #1f2937;\n --color-bg: #111827;\n --color-bg-subtle: #1f2937;\n --color-bg-code: #0d1117;\n --color-accent: #60a5fa;\n --color-success: #4ade80;\n --color-warn: #fbbf24;\n --color-error: #f87171;\n --color-on-accent: #fff;\n --color-preview-bg: #1f2937;\n --color-code-text: #e2e8f0;\n --badge-complex-border: #92400e;\n --badge-complex-color: #fcd34d;\n --badge-complex-bg: rgba(120,53,15,0.3);\n --badge-simple-border: #065f46;\n --badge-simple-color: #6ee7b7;\n --badge-simple-bg: rgba(6,78,59,0.3);\n --badge-memo-border: #4338ca;\n --badge-memo-color: #a5b4fc;\n --badge-memo-bg: rgba(67,56,202,0.2);\n --badge-internal-border: #4b5563;\n --badge-internal-color: #9ca3af;\n --badge-internal-bg: #374151;\n --pill-on-bg: rgba(22,101,52,0.3);\n --pill-on-color: #86efac;\n --pill-off-bg: rgba(146,64,14,0.3);\n --pill-off-color: #fde68a;\n --violation-bg: rgba(153,27,27,0.2);\n --violation-border: #991b1b;\n --violation-color: #fca5a5;\n --color-bg-selected: rgba(99,102,241,0.15);\n --overlay-bg: rgba(0,0,0,0.5);\n --slideout-shadow: -4px 0 24px rgba(0,0,0,0.4);\n --shadow-sm: 0 1px 2px rgba(0,0,0,0.4);\n --shadow: 0 2px 4px rgba(0,0,0,0.3), 0 1px 2px rgba(0,0,0,0.2);\n}\n\n*, *::before, *::after { box-sizing: border-box; }\n\nbody {\n font-family: var(--font-body);\n font-size: 14px;\n line-height: 1.6;\n color: var(--color-text);\n background: var(--color-bg);\n margin: 0;\n}\n\n/* Top nav */\n.top-nav {\n position: sticky;\n top: 0;\n z-index: 100;\n background: var(--color-bg);\n border-bottom: 1px solid var(--color-border);\n height: 52px;\n display: flex;\n align-items: center;\n padding: 0 24px;\n gap: 16px;\n}\n.top-nav .site-title { font-weight: 600; font-size: 15px; text-decoration: none; color: var(--color-text); display: flex; align-items: center; gap: 8px; }\n.top-nav .site-logo { flex-shrink: 0; }\n.top-nav .breadcrumbs { display: flex; align-items: center; gap: 0; font-size: 14px; color: var(--color-text-muted); }\n.top-nav .breadcrumbs a, .top-nav .breadcrumbs span { text-decoration: none; color: var(--color-text-muted); }\n.top-nav .breadcrumbs a:hover { color: var(--color-text); }\n.top-nav .breadcrumbs span:last-child { color: var(--color-text); font-weight: 500; }\n.top-nav .breadcrumbs a::before, .top-nav .breadcrumbs span::before { content: \"/\"; margin: 0 8px; color: var(--color-border); }\n.top-nav .spacer { flex: 1; }\n.search-box {\n border: 1px solid var(--color-border);\n border-radius: var(--radius);\n padding: 6px 12px;\n font-family: var(--font-body);\n font-size: 13px;\n width: 240px;\n outline: none;\n background: var(--color-bg-subtle);\n}\n.search-box:focus { border-color: var(--color-accent); background: var(--color-bg); }\n\n/* Theme toggle */\n.theme-toggle {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: 1px solid var(--color-border);\n border-radius: var(--radius);\n background: var(--color-bg-subtle);\n color: var(--color-muted);\n cursor: pointer;\n transition: color 0.15s, border-color 0.15s;\n padding: 0;\n flex-shrink: 0;\n}\n.theme-toggle:hover { color: var(--color-text); border-color: var(--color-muted); }\n\n/* Page layout */\n.page-layout {\n display: flex;\n min-height: calc(100vh - 52px);\n}\n\n/* Left sidebar (component list) */\n.sidebar {\n width: 220px;\n min-width: 220px;\n border-right: 1px solid var(--color-border);\n padding: 16px 0;\n position: sticky;\n top: 52px;\n height: calc(100vh - 52px);\n overflow-y: auto;\n}\n.sidebar-heading {\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--color-muted);\n padding: 4px 16px 8px;\n}\n.sidebar a {\n display: block;\n padding: 5px 16px;\n font-size: 13px;\n color: var(--color-text);\n text-decoration: none;\n border-radius: 0;\n}\n.sidebar a:hover { background: var(--color-bg-subtle); }\n.sidebar a.active { color: var(--color-accent); font-weight: 500; }\n\n/* Main content */\n.main-content {\n flex: 1;\n min-width: 0;\n display: flex;\n}\n.content-body {\n flex: 1;\n min-width: 0;\n padding: 32px 40px;\n max-width: 900px;\n}\n\n/* On this page nav (right side) */\n.on-this-page {\n width: 200px;\n min-width: 200px;\n padding: 32px 16px;\n position: sticky;\n top: 52px;\n height: calc(100vh - 52px);\n overflow-y: auto;\n}\n.on-this-page h4 {\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--color-muted);\n margin: 0 0 8px;\n}\n.on-this-page a {\n display: block;\n padding: 3px 0;\n font-size: 12px;\n color: var(--color-muted);\n text-decoration: none;\n}\n.on-this-page a:hover { color: var(--color-text); }\n\n/* Component header */\n.component-header { margin-bottom: 32px; }\n.component-header h1 { font-size: 28px; font-weight: 700; margin: 0 0 8px; }\n.component-header .meta {\n display: flex;\n gap: 8px;\n align-items: center;\n flex-wrap: wrap;\n margin-bottom: 8px;\n}\n.badge {\n display: inline-flex;\n align-items: center;\n padding: 2px 8px;\n border-radius: 999px;\n font-size: 11px;\n font-weight: 500;\n border: 1px solid var(--color-border);\n color: var(--color-muted);\n background: var(--color-bg-subtle);\n}\n.badge.complex { border-color: var(--badge-complex-border); color: var(--badge-complex-color); background: var(--badge-complex-bg); }\n.badge.simple { border-color: var(--badge-simple-border); color: var(--badge-simple-color); background: var(--badge-simple-bg); }\n.badge.memoized { border-color: var(--badge-memo-border); color: var(--badge-memo-color); background: var(--badge-memo-bg); }\n\n.filepath {\n font-family: var(--font-mono);\n font-size: 12px;\n color: var(--color-muted);\n}\n\n/* Sections */\n.section {\n padding: 32px 0;\n border-bottom: 1px solid var(--color-border);\n}\n.section:last-child { border-bottom: none; }\n.section-header { margin-bottom: 20px; }\n.section-header h2 {\n font-size: 18px;\n font-weight: 600;\n margin: 0 0 4px;\n}\n.section-header p { color: var(--color-muted); margin: 0; font-size: 13px; }\n\n/* Not generated placeholder */\n.render-failure {\n background: var(--violation-bg);\n border: 1px solid var(--violation-border);\n border-radius: var(--radius);\n padding: 12px 16px;\n color: var(--violation-color);\n font-size: 13px;\n margin-bottom: 16px;\n}\n.matrix-cell-error { color: var(--color-error); font-size: 11px; font-weight: 600; }\n\n.not-generated {\n background: var(--color-bg-subtle);\n border: 1px dashed var(--color-border);\n border-radius: var(--radius);\n padding: 32px;\n text-align: center;\n color: var(--color-muted);\n font-size: 13px;\n}\n\n/* Render preview */\n.render-preview {\n border: 1px solid var(--color-border);\n border-radius: var(--radius);\n overflow: hidden;\n background: var(--color-preview-bg);\n display: inline-block;\n max-width: 100%;\n}\n.render-preview img { display: block; max-width: 100%; }\n.scope-screenshot { zoom: 0.5; display: block; image-rendering: -webkit-optimize-contrast; }\n\n/* Props table */\n.props-table { width: 100%; border-collapse: collapse; font-size: 13px; }\n.props-table th {\n text-align: left;\n font-weight: 600;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--color-muted);\n padding: 8px 12px;\n border-bottom: 2px solid var(--color-border);\n}\n.props-table td {\n padding: 8px 12px;\n border-bottom: 1px solid var(--color-border);\n vertical-align: top;\n}\n.props-table tr:last-child td { border-bottom: none; }\n.prop-name { font-family: var(--font-mono); font-size: 12px; font-weight: 700; }\n.prop-type { font-family: var(--font-mono); font-size: 11px; color: var(--color-accent); }\n.prop-required { color: var(--color-error); font-size: 11px; }\n.prop-default { font-family: var(--font-mono); font-size: 11px; color: var(--color-muted); }\n\n/* Inherited props section */\n.inherited-props-section { margin-top: 20px; }\n.inherited-props-heading {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--color-muted);\n padding-bottom: 8px;\n border-bottom: 1px solid var(--color-border);\n margin-bottom: 8px;\n}\n.inherited-group {\n border: 1px solid var(--color-border);\n border-radius: 6px;\n margin-bottom: 6px;\n}\n.inherited-group summary {\n padding: 6px 12px;\n font-size: 12px;\n font-weight: 500;\n color: var(--color-muted);\n cursor: pointer;\n user-select: none;\n display: flex;\n align-items: center;\n gap: 6px;\n}\n.inherited-group summary:hover { color: var(--color-text); }\n.inherited-group[open] summary { border-bottom: 1px solid var(--color-border); }\n.inherited-group-count {\n font-size: 10px;\n font-weight: 400;\n color: var(--color-muted);\n opacity: 0.7;\n}\n.inherited-group .props-table { font-size: 12px; }\n.inherited-group .props-table td,\n.inherited-group .props-table th { padding: 4px 12px; }\n\n/* Code blocks */\npre.code-block {\n background: var(--color-bg-code);\n color: var(--color-code-text);\n border-radius: var(--radius);\n padding: 16px 20px;\n overflow-x: auto;\n font-family: var(--font-mono);\n font-size: 13px;\n line-height: 1.6;\n margin: 0;\n}\n.token-keyword { color: #c792ea; }\n.token-string { color: #c3e88d; }\n.token-comment { color: #546e7a; font-style: italic; }\n.token-tag { color: #f07178; }\n.token-attr { color: #ffcb6b; }\n.token-number { color: #f78c6c; }\n\n/* Stats grid */\n.stats-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\n gap: 12px;\n margin-bottom: 24px;\n}\n.stat-card {\n background: var(--color-bg-subtle);\n border: 1px solid var(--color-border);\n border-radius: var(--radius);\n padding: 16px;\n}\n.stat-card .stat-label { font-size: 11px; color: var(--color-muted); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 4px; }\n.stat-card .stat-value { font-size: 22px; font-weight: 700; }\n\n/* Analysis grid */\n.analysis-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 16px;\n}\n.analysis-card {\n background: var(--color-bg-subtle);\n border: 1px solid var(--color-border);\n border-radius: var(--radius);\n padding: 16px;\n}\n.analysis-card h3 { font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: var(--color-muted); margin: 0 0 8px; }\n.analysis-card .value { font-size: 14px; }\n.tag-list { display: flex; flex-wrap: wrap; gap: 4px; }\n.tag {\n display: inline-block;\n padding: 2px 8px;\n background: var(--color-border);\n border-radius: 4px;\n font-family: var(--font-mono);\n font-size: 11px;\n}\n\n/* Token pills */\n.pill-on {\n display: inline-flex; align-items: center; gap: 4px;\n padding: 2px 8px; border-radius: 999px;\n background: var(--pill-on-bg); color: var(--pill-on-color);\n font-size: 11px; font-weight: 500;\n}\n.pill-off {\n display: inline-flex; align-items: center; gap: 4px;\n padding: 2px 8px; border-radius: 999px;\n background: var(--pill-off-bg); color: var(--pill-off-color);\n font-size: 11px; font-weight: 500;\n}\n\n/* Compliance bar */\n.compliance-bar-container { margin-bottom: 16px; }\n.compliance-bar-bg { background: var(--color-border); border-radius: 999px; height: 8px; overflow: hidden; }\n.compliance-bar-fill { height: 100%; border-radius: 999px; background: var(--color-success); }\n.compliance-label { font-size: 13px; color: var(--color-muted); margin-bottom: 4px; }\n\n/* Token table */\n.token-table { width: 100%; border-collapse: collapse; font-size: 12px; }\n.token-table th {\n text-align: left; font-weight: 600; font-size: 11px;\n text-transform: uppercase; letter-spacing: 0.05em;\n color: var(--color-muted); padding: 6px 10px;\n border-bottom: 2px solid var(--color-border);\n}\n.token-table td { padding: 6px 10px; border-bottom: 1px solid var(--color-border); vertical-align: top; }\n.token-table tr:last-child td { border-bottom: none; }\n.token-path { font-family: var(--font-mono); color: var(--color-accent); }\n.token-value-swatch { display: inline-block; width: 12px; height: 12px; border-radius: 2px; border: 1px solid var(--color-border); margin-right: 4px; vertical-align: middle; }\n\n/* A11y violations */\n.violation-list { list-style: none; padding: 0; margin: 0; }\n.violation-list li {\n padding: 8px 12px;\n background: var(--violation-bg);\n border: 1px solid var(--violation-border);\n border-radius: var(--radius);\n margin-bottom: 6px;\n font-size: 13px;\n color: var(--violation-color);\n}\n.a11y-role-badge { font-family: var(--font-mono); font-size: 11px; background: var(--color-bg-subtle); border: 1px solid var(--color-border); padding: 2px 6px; border-radius: 4px; }\n\n/* Matrix grid */\n.matrix-grid {\n display: grid;\n gap: 1px;\n background: var(--color-border);\n border: 1px solid var(--color-border);\n border-radius: var(--radius);\n overflow: hidden;\n}\n.matrix-cell { background: var(--color-bg); padding: 8px; text-align: center; }\n.matrix-cell img { border-radius: 2px; }\n.matrix-cell .cell-label { font-size: 10px; color: var(--color-muted); margin-top: 4px; }\n.matrix-header { background: var(--color-bg-subtle); padding: 6px 8px; font-size: 11px; font-weight: 600; color: var(--color-muted); }\n\n/* DOM tree */\n.dom-tree { font-family: var(--font-mono); font-size: 12px; line-height: 1.8; }\ndetails.dom-node > summary { cursor: pointer; list-style: none; }\ndetails.dom-node > summary::-webkit-details-marker { display: none; }\n.dom-tag-open { color: #f07178; }\n.dom-tag-close { color: #f07178; }\n.dom-attr-name { color: #ffcb6b; }\n.dom-attr-value { color: #c3e88d; }\n.dom-text { color: #82aaff; font-style: italic; }\n.dom-node-clickable { cursor: pointer; border-radius: 3px; transition: background 0.1s; }\n.dom-node-clickable:hover, details.dom-node-clickable > summary:hover { background: rgba(255,255,255,0.08); }\n.dom-node-selected, details.dom-node-selected > summary { background: rgba(99,179,237,0.15) !important; outline: 1px solid rgba(99,179,237,0.4); border-radius: 3px; }\n.dom-attr-name { color: #ffcb6b; }\n.dom-attr-value { color: #c3e88d; }\n.dom-text { color: #a0a0b0; font-style: italic; }\n\n/* Composition graph */\n.composition-lists { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }\n.comp-list h3 { font-size: 13px; font-weight: 600; margin: 0 0 8px; color: var(--color-muted); }\n.comp-list ul { list-style: none; padding: 0; margin: 0; }\n.comp-list li { padding: 4px 0; font-size: 13px; border-bottom: 1px solid var(--color-border); }\n.comp-list a { color: var(--color-accent); text-decoration: none; }\n.comp-list a:hover { text-decoration: underline; }\n\n/* Index page */\n.index-header { margin-bottom: 32px; }\n.index-header h1 { font-size: 32px; font-weight: 700; margin: 0 0 8px; }\n.index-header p { color: var(--color-muted); font-size: 15px; margin: 0; }\n.component-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n gap: 16px;\n}\n.component-card {\n border: 1px solid var(--color-border);\n border-radius: var(--radius);\n overflow: hidden;\n text-decoration: none;\n color: var(--color-text);\n transition: box-shadow 0.15s;\n display: block;\n}\n.component-card:hover { box-shadow: var(--shadow); }\n.card-preview {\n background: var(--color-preview-bg);\n height: 160px;\n overflow: hidden;\n display: flex;\n align-items: center;\n justify-content: center;\n border-bottom: 1px solid var(--color-border);\n}\n.card-preview img { object-fit: contain; }\n.card-preview .no-preview { color: var(--color-muted); font-size: 12px; }\n.card-body { padding: 12px 16px; }\n.card-name { font-weight: 600; font-size: 14px; margin-bottom: 4px; }\n.card-meta { font-size: 12px; color: var(--color-muted); display: flex; gap: 8px; }\n\n/* Dashboard */\n.dashboard-header { margin-bottom: 32px; }\n.dashboard-header h1 { font-size: 28px; font-weight: 700; margin: 0 0 8px; }\n.section-title { font-size: 16px; font-weight: 600; margin: 0 0 16px; }\n\n/* Responsive */\n@media (max-width: 1024px) {\n .on-this-page { display: none; }\n}\n@media (max-width: 768px) {\n .sidebar { display: none; }\n .content-body { padding: 20px 16px; }\n .analysis-grid { grid-template-columns: 1fr; }\n .composition-lists { grid-template-columns: 1fr; }\n}\n/* Collection section headers in sidebar */\n.sidebar-collection-header {\n font-size: 10px;\n font-weight: 700;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n color: var(--color-muted);\n padding: 12px 16px 4px;\n margin-top: 4px;\n border-top: 1px solid var(--color-border);\n}\n.sidebar-collection-header:first-child {\n margin-top: 0;\n border-top: none;\n}\n\n/* Collection section headers on index page */\n.collection-section {\n margin-bottom: 40px;\n}\n.collection-section-header {\n margin-bottom: 16px;\n padding-bottom: 10px;\n border-bottom: 2px solid var(--color-border);\n}\n.collection-section-header h2 {\n font-size: 18px;\n font-weight: 600;\n margin: 0 0 4px;\n color: var(--color-text);\n}\n.collection-section-header p {\n font-size: 13px;\n color: var(--color-muted);\n margin: 0;\n}\n\n/* Collection gallery (index page) */\n.collection-gallery-section { margin-bottom: 32px; }\n.gallery-section-title {\n font-size: 16px;\n font-weight: 600;\n margin: 0 0 12px;\n color: var(--color-text);\n}\n.collection-gallery {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));\n gap: 12px;\n}\n.collection-tile {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--color-border);\n border-radius: var(--radius);\n overflow: hidden;\n text-decoration: none;\n color: var(--color-text);\n transition: box-shadow 0.15s, border-color 0.15s;\n}\n.collection-tile:hover {\n box-shadow: var(--shadow);\n border-color: var(--color-accent);\n}\n.coll-tile-thumbs {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 1px;\n background: var(--color-border);\n height: 100px;\n overflow: hidden;\n}\n.coll-thumb {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: cover;\n background: var(--color-preview-bg);\n}\n.coll-thumb-empty { background: var(--color-bg-subtle); }\n.coll-tile-body { padding: 10px 14px; }\n.coll-tile-name { font-weight: 600; font-size: 14px; margin-bottom: 2px; }\n.coll-tile-desc {\n font-size: 12px;\n color: var(--color-muted);\n margin-bottom: 4px;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n.coll-tile-count {\n font-size: 11px;\n color: var(--color-muted);\n font-weight: 500;\n}\n\n/* Sidebar overview link */\n.sidebar a:first-child {\n font-weight: 500;\n margin-bottom: 4px;\n}\n\n/* Internal component badge */\n.badge-internal {\n display: inline-flex;\n align-items: center;\n padding: 1px 6px;\n border-radius: 999px;\n font-size: 10px;\n font-weight: 500;\n border: 1px solid var(--badge-internal-border);\n color: var(--badge-internal-color);\n background: var(--badge-internal-bg);\n margin-left: 4px;\n vertical-align: middle;\n line-height: 1.4;\n}\n\n/* Playground */\n.pg-container {\n display: flex;\n flex-direction: row;\n gap: 16px;\n}\n.pg-controls {\n width: 260px;\n flex-shrink: 0;\n border: 1px solid var(--color-border);\n border-radius: var(--radius);\n background: var(--color-bg-subtle);\n padding: 12px 16px;\n max-height: 500px;\n overflow-y: auto;\n}\n.pg-controls-header {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--color-muted);\n margin-bottom: 10px;\n}\n.pg-control-row {\n display: flex;\n flex-direction: column;\n gap: 4px;\n margin-bottom: 10px;\n}\n.pg-control-row:last-child { margin-bottom: 0; }\n.pg-control-label {\n font-family: var(--font-mono);\n font-size: 10px;\n font-weight: 600;\n color: var(--color-muted);\n letter-spacing: 0.03em;\n}\n.pg-input, .pg-select {\n width: 100%;\n border: 1px solid var(--color-border);\n border-radius: var(--radius);\n padding: 4px 6px;\n font-family: var(--font-body);\n font-size: 12px;\n background: var(--color-bg);\n color: var(--color-text);\n outline: none;\n}\n.pg-select {\n appearance: none;\n -webkit-appearance: none;\n background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%23888' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E\");\n background-repeat: no-repeat;\n background-position: right 6px center;\n padding-right: 22px;\n padding-left: 4px;\n}\n.pg-input:focus, .pg-select:focus {\n border-color: var(--color-accent);\n}\n.pg-checkbox {\n width: 16px;\n height: 16px;\n accent-color: var(--color-accent);\n cursor: pointer;\n}\n.pg-control-readonly {\n font-family: var(--font-mono);\n font-size: 11px;\n color: var(--color-muted);\n font-style: italic;\n}\n\n/* Preview wrapper with checkerboard background */\n.pg-preview-wrapper {\n flex: 1;\n min-width: 0;\n border: 1px solid var(--color-border);\n border-radius: var(--radius);\n overflow: hidden;\n position: relative;\n display: flex;\n flex-direction: column;\n}\n.pg-iframe-area {\n flex: 1;\n background-color: #fff;\n background-image:\n linear-gradient(45deg, #f0f0f0 25%, transparent 25%),\n linear-gradient(-45deg, #f0f0f0 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #f0f0f0 75%),\n linear-gradient(-45deg, transparent 75%, #f0f0f0 75%);\n background-size: 16px 16px;\n background-position: 0 0, 0 8px, 8px -8px, -8px 0;\n}\n.pg-preview-wrapper.pg-dark .pg-iframe-area {\n background-color: #1a1a1a;\n background-image:\n linear-gradient(45deg, #252525 25%, transparent 25%),\n linear-gradient(-45deg, #252525 25%, transparent 25%),\n linear-gradient(45deg, transparent 75%, #252525 75%),\n linear-gradient(-45deg, transparent 75%, #252525 75%);\n}\n\n/* Toolbar */\n.pg-toolbar {\n display: flex;\n align-items: center;\n gap: 2px;\n padding: 4px 6px;\n background: var(--color-bg-subtle);\n border-bottom: 1px solid var(--color-border);\n flex-shrink: 0;\n}\n.pg-toolbar-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n border-radius: var(--radius);\n background: none;\n color: var(--color-muted);\n cursor: pointer;\n transition: background 0.1s, color 0.1s;\n padding: 0;\n flex-shrink: 0;\n}\n.pg-toolbar-btn:hover { background: var(--color-border); color: var(--color-text); }\n.pg-toolbar-btn.active { background: var(--color-accent); color: var(--color-on-accent); }\n.pg-toolbar-sep {\n width: 1px;\n height: 16px;\n background: var(--color-border);\n margin: 0 4px;\n flex-shrink: 0;\n}\n.pg-toolbar-spacer { flex: 1; }\n\n/* iframe */\n.pg-iframe {\n display: block;\n width: 100%;\n min-height: 300px;\n height: 300px;\n border: none;\n background: transparent;\n color-scheme: normal;\n transition: max-width 0.2s ease;\n}\n\n/* Fullscreen overlay */\n.pg-preview-wrapper.pg-fullscreen {\n position: fixed;\n inset: 0;\n z-index: 999;\n border-radius: 0;\n border: none;\n}\n.pg-preview-wrapper.pg-fullscreen .pg-iframe-area { flex: 1; overflow: auto; }\n.pg-preview-wrapper.pg-fullscreen .pg-iframe { height: 100%; min-height: 100%; }\n\n.pg-static-fallback {\n margin-top: 16px;\n}\n.pg-static-fallback summary {\n font-size: 12px;\n color: var(--color-muted);\n cursor: pointer;\n user-select: none;\n margin-bottom: 8px;\n}\n\n@media (max-width: 768px) {\n .pg-container { flex-direction: column; }\n .pg-controls { width: 100%; max-height: none; }\n}\n\n/* Full-width content body (no on-this-page nav) */\n.content-body-full { max-width: none; padding: 0; }\n\n/* Two-column detail layout */\n.detail-columns {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 0;\n}\n.detail-main {\n min-width: 0;\n padding: 32px 32px 32px 40px;\n}\n.detail-inspector {\n position: sticky;\n top: 52px;\n align-self: start;\n height: calc(100vh - 52px);\n overflow-y: auto;\n border-left: 1px solid var(--color-border);\n padding: 16px 24px 32px;\n background: var(--color-bg-subtle);\n}\n.detail-inspector .section { padding: 20px 0; }\n.detail-inspector .section-header { margin-bottom: 12px; }\n.detail-inspector .section-header h2 { font-size: 15px; }\n.detail-inspector .section-header p { font-size: 12px; }\n.detail-inspector .stats-grid { grid-template-columns: repeat(auto-fit, minmax(100px, 1fr)); gap: 8px; }\n.detail-inspector .stat-card { padding: 10px; }\n.detail-inspector .stat-card .stat-value { font-size: 18px; }\n.detail-inspector .analysis-grid { grid-template-columns: 1fr; gap: 8px; }\n.detail-inspector .composition-lists { grid-template-columns: 1fr; gap: 8px; }\n\n@media (max-width: 1200px) {\n .detail-columns { grid-template-columns: 1fr; }\n .detail-main { padding: 20px 16px; }\n .detail-inspector {\n position: static;\n height: auto;\n border-left: none;\n border-top: 1px solid var(--color-border);\n padding: 20px 16px;\n background: none;\n }\n}\n\n/* Icon browser */\n.icon-browser-header { margin-bottom: 24px; }\n.icon-browser-header h1 { font-size: 28px; font-weight: 700; margin: 0 0 4px; }\n.icon-browser-header p { color: var(--color-muted); font-size: 14px; margin: 0; }\n\n.icon-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(88px, 1fr));\n gap: 2px;\n}\n\n.icon-cell {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 6px;\n padding: 12px 4px 8px;\n border: 1px solid transparent;\n border-radius: var(--radius);\n cursor: pointer;\n background: none;\n font-family: var(--font-body);\n transition: background 0.1s, border-color 0.1s;\n}\n.icon-cell:hover {\n background: var(--color-bg-subtle);\n border-color: var(--color-border);\n}\n.icon-cell.selected {\n background: var(--color-bg-selected);\n border-color: var(--color-accent);\n}\n\n.icon-cell-preview {\n width: 40px;\n height: 40px;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n}\n.icon-cell-svg { display: flex; align-items: center; justify-content: center; }\n.icon-cell-svg svg { width: 28px; height: 28px; }\n.icon-no-preview {\n font-size: 16px;\n font-weight: 600;\n color: var(--color-muted);\n}\n\n.icon-cell-name {\n font-size: 10px;\n color: var(--color-muted);\n text-align: center;\n line-height: 1.2;\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Icon slide-out panel */\n.icon-slideout-overlay {\n position: fixed;\n inset: 0;\n background: var(--overlay-bg);\n z-index: 200;\n}\n.icon-slideout {\n position: fixed;\n top: 0;\n right: 0;\n width: 380px;\n max-width: 100vw;\n height: 100vh;\n background: var(--color-bg);\n border-left: 1px solid var(--color-border);\n box-shadow: var(--slideout-shadow);\n z-index: 201;\n display: flex;\n flex-direction: column;\n overflow-y: auto;\n animation: icon-slide-in 0.2s ease-out;\n}\n.icon-slideout[hidden] { display: none; }\n.icon-slideout-overlay[hidden] { display: none; }\n@keyframes icon-slide-in {\n from { transform: translateX(100%); }\n to { transform: translateX(0); }\n}\n\n.icon-slideout-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px 24px 16px;\n border-bottom: 1px solid var(--color-border);\n flex-shrink: 0;\n}\n.icon-slideout-name {\n font-size: 18px;\n font-weight: 600;\n margin: 0;\n word-break: break-word;\n}\n.icon-slideout-close {\n background: none;\n border: none;\n color: var(--color-muted);\n cursor: pointer;\n padding: 4px;\n border-radius: var(--radius);\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.1s, color 0.1s;\n}\n.icon-slideout-close:hover {\n background: var(--color-bg-subtle);\n color: var(--color-text);\n}\n\n.icon-slideout-body {\n flex: 1;\n padding: 0 24px 24px;\n overflow-y: auto;\n}\n\n.icon-slideout-preview-lg {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 40px 32px;\n background: var(--color-bg-subtle);\n border: 1px solid var(--color-border);\n border-radius: var(--radius);\n margin: 20px 0;\n}\n.icon-slideout-preview-lg svg {\n width: 100%;\n max-width: 120px;\n height: auto;\n}\n\n.icon-detail-section {\n padding: 16px 0;\n border-bottom: 1px solid var(--color-border);\n}\n.icon-detail-section:last-child { border-bottom: none; }\n.icon-detail-section-title {\n font-size: 11px;\n font-weight: 600;\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--color-muted);\n margin-bottom: 10px;\n}\n\n/* Size previews */\n.icon-size-row {\n display: flex;\n gap: 16px;\n align-items: flex-end;\n}\n.icon-size-cell {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 6px;\n}\n.icon-size-cell span {\n font-size: 10px;\n color: var(--color-muted);\n font-weight: 500;\n}\n.icon-size-preview {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 8px;\n background: var(--color-bg-subtle);\n border: 1px solid var(--color-border);\n border-radius: var(--radius);\n}\n\n/* Action buttons */\n.icon-slideout-actions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n}\n.icon-action-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 7px 14px;\n border-radius: var(--radius);\n border: 1px solid var(--color-border);\n background: var(--color-bg);\n color: var(--color-text);\n text-decoration: none;\n font-family: var(--font-body);\n font-size: 12px;\n font-weight: 500;\n cursor: pointer;\n transition: background 0.1s, border-color 0.1s;\n}\n.icon-action-btn:hover {\n background: var(--color-bg-subtle);\n border-color: var(--color-muted);\n}\n.icon-action-primary {\n background: var(--color-accent);\n border-color: var(--color-accent);\n color: var(--color-on-accent);\n}\n.icon-action-primary:hover {\n opacity: 0.9;\n background: var(--color-accent);\n border-color: var(--color-accent);\n}\n\n/* Compiled size */\n.icon-compiled-size {\n font-family: var(--font-mono);\n font-size: 14px;\n font-weight: 600;\n}\n\n/* Props */\n.icon-prop-row {\n display: flex;\n flex-wrap: wrap;\n gap: 4px 12px;\n align-items: baseline;\n padding: 6px 0;\n border-bottom: 1px solid var(--color-border);\n}\n.icon-prop-row:last-child { border-bottom: none; }\n.icon-prop-name {\n font-family: var(--font-mono);\n font-size: 12px;\n font-weight: 600;\n}\n.icon-prop-type {\n font-family: var(--font-mono);\n font-size: 11px;\n color: var(--color-accent);\n}\n.icon-prop-meta {\n font-size: 11px;\n color: var(--color-muted);\n}\n.icon-prop-required { color: var(--color-error); }\n.icon-prop-optional { color: var(--color-muted); }\n.icon-prop-default {\n font-family: var(--font-mono);\n font-size: 10px;\n color: var(--color-muted);\n margin-left: 4px;\n}\n\n/* Keywords */\n.icon-keywords {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n}\n.icon-keyword-tag {\n display: inline-block;\n padding: 2px 8px;\n background: var(--color-bg-subtle);\n border: 1px solid var(--color-border);\n border-radius: 999px;\n font-size: 11px;\n color: var(--color-muted);\n}\n\n/* Usage list */\n.icon-usage-list {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n.icon-usage-link {\n display: block;\n padding: 4px 0;\n font-size: 13px;\n color: var(--color-accent);\n text-decoration: none;\n}\n.icon-usage-link:hover { text-decoration: underline; }\n\n@media (max-width: 768px) {\n .icon-slideout { width: 100vw; }\n}\n\n/* CMD-K trigger button */\n.cmdk-trigger {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n border: 1px solid var(--color-border);\n border-radius: var(--radius);\n padding: 6px 10px 6px 12px;\n font-family: var(--font-body);\n font-size: 13px;\n color: var(--color-muted);\n background: var(--color-bg-subtle);\n cursor: pointer;\n transition: border-color 0.15s, color 0.15s;\n height: 34px;\n min-width: 200px;\n}\n.cmdk-trigger:hover {\n border-color: var(--color-muted);\n color: var(--color-text);\n}\n.cmdk-trigger svg { flex-shrink: 0; opacity: 0.5; }\n.cmdk-trigger span { flex: 1; text-align: left; }\n.cmdk-trigger kbd {\n font-family: var(--font-body);\n font-size: 10px;\n font-weight: 500;\n padding: 2px 5px;\n border: 1px solid var(--color-border);\n border-radius: 4px;\n background: var(--color-bg);\n color: var(--color-muted);\n line-height: 1;\n flex-shrink: 0;\n}\n\n/* CMD-K overlay */\n.cmdk-overlay {\n position: fixed;\n inset: 0;\n background: var(--overlay-bg);\n z-index: 300;\n animation: cmdk-fade-in 0.1s ease-out;\n}\n.cmdk-overlay[hidden] { display: none; }\n\n@keyframes cmdk-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* CMD-K dialog */\n.cmdk-dialog {\n position: fixed;\n top: min(20vh, 140px);\n left: 50%;\n transform: translateX(-50%);\n width: 520px;\n max-width: calc(100vw - 32px);\n background: var(--color-bg);\n border: 1px solid var(--color-border);\n border-radius: 12px;\n box-shadow: 0 16px 70px rgba(0,0,0,0.2);\n z-index: 301;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n animation: cmdk-dialog-in 0.15s ease-out;\n}\n.cmdk-dialog[hidden] { display: none; }\n\n@keyframes cmdk-dialog-in {\n from { opacity: 0; transform: translateX(-50%) scale(0.96); }\n to { opacity: 1; transform: translateX(-50%) scale(1); }\n}\n\n/* CMD-K input */\n.cmdk-input-wrapper {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 14px 16px;\n border-bottom: 1px solid var(--color-border);\n}\n.cmdk-input-wrapper svg { flex-shrink: 0; color: var(--color-muted); }\n.cmdk-input {\n flex: 1;\n border: none;\n outline: none;\n background: none;\n font-family: var(--font-body);\n font-size: 15px;\n color: var(--color-text);\n padding: 0;\n}\n.cmdk-input::placeholder { color: var(--color-muted); }\n\n/* CMD-K results list */\n.cmdk-list {\n max-height: 340px;\n overflow-y: auto;\n padding: 6px;\n}\n.cmdk-list:empty { display: none; }\n\n.cmdk-item {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 8px 10px;\n border-radius: var(--radius);\n text-decoration: none;\n color: var(--color-text);\n cursor: pointer;\n transition: background 0.06s;\n}\n.cmdk-item-active {\n background: var(--color-bg-selected);\n}\n.cmdk-item-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border-radius: var(--radius);\n background: var(--color-bg-subtle);\n border: 1px solid var(--color-border);\n color: var(--color-muted);\n flex-shrink: 0;\n}\n.cmdk-item-name {\n flex: 1;\n font-size: 13px;\n font-weight: 500;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.cmdk-item-collection {\n font-size: 11px;\n color: var(--color-muted);\n flex-shrink: 0;\n}\n.cmdk-item-type {\n font-size: 10px;\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--color-muted);\n opacity: 0.7;\n flex-shrink: 0;\n}\n\n/* CMD-K empty state */\n.cmdk-empty {\n padding: 32px 16px;\n text-align: center;\n color: var(--color-muted);\n font-size: 13px;\n}\n.cmdk-empty[hidden] { display: none; }\n\n/* CMD-K footer */\n.cmdk-footer {\n display: flex;\n align-items: center;\n gap: 16px;\n padding: 8px 16px;\n border-top: 1px solid var(--color-border);\n font-size: 11px;\n color: var(--color-muted);\n}\n.cmdk-footer kbd {\n font-family: var(--font-body);\n font-size: 10px;\n font-weight: 500;\n padding: 1px 4px;\n border: 1px solid var(--color-border);\n border-radius: 3px;\n background: var(--color-bg-subtle);\n margin-right: 2px;\n}\n\n@media (max-width: 768px) {\n .cmdk-trigger { min-width: 0; }\n .cmdk-trigger span { display: none; }\n .cmdk-dialog { top: 16px; }\n}\n\n/* Token browser */\n.tb-header { margin-bottom: 24px; }\n.tb-header h1 { font-size: 28px; font-weight: 700; margin: 0 0 6px; }\n.tb-header p { color: var(--color-muted); font-size: 14px; margin: 0; }\n.tb-updated { font-size: 12px; color: var(--color-muted); }\n\n.tb-section {\n padding: 28px 0;\n border-bottom: 1px solid var(--color-border);\n}\n.tb-section:last-child { border-bottom: none; }\n.tb-section-title {\n font-size: 18px;\n font-weight: 600;\n margin: 0 0 16px;\n text-transform: capitalize;\n}\n\n/* Color scales */\n.tb-scale { margin-bottom: 20px; }\n.tb-scale-name {\n font-size: 12px;\n font-weight: 600;\n text-transform: capitalize;\n color: var(--color-muted);\n margin-bottom: 6px;\n letter-spacing: 0.03em;\n}\n.tb-scale-row {\n display: flex;\n gap: 0;\n border-radius: var(--radius);\n overflow: hidden;\n border: 1px solid var(--color-border);\n}\n.tb-swatch {\n flex: 1;\n min-width: 0;\n padding: 24px 6px 8px;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 2px;\n cursor: default;\n transition: transform 0.1s, box-shadow 0.1s;\n position: relative;\n}\n.tb-swatch:hover {\n transform: scaleY(1.08);\n z-index: 1;\n box-shadow: 0 4px 12px rgba(0,0,0,0.2);\n}\n.tb-swatch-label {\n font-size: 10px;\n font-weight: 600;\n opacity: 0.85;\n}\n.tb-swatch-value {\n font-size: 9px;\n font-family: var(--font-mono);\n opacity: 0.7;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 100%;\n}\n\n/* Swatch pair (light + dark) */\n.tb-swatch-pair {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n}\n.tb-swatch-pair .tb-swatch {\n border-radius: 0;\n border: none;\n}\n.tb-swatch-dark {\n padding: 4px 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 24px;\n}\n.tb-swatch-dark .tb-swatch-value {\n font-size: 8px;\n font-family: var(--font-mono);\n opacity: 0.8;\n}\n\n.tb-standalone-colors {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-top: 12px;\n}\n.tb-swatch-pair-single {\n display: flex;\n flex-direction: column;\n width: 80px;\n border-radius: var(--radius);\n overflow: hidden;\n border: 1px solid var(--color-border);\n}\n.tb-swatch-pair-single .tb-swatch-single {\n border: none;\n border-radius: 0;\n width: auto;\n min-width: auto;\n flex: none;\n}\n.tb-swatch-dark-single {\n padding: 4px 6px;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 22px;\n}\n.tb-swatch-dark-single .tb-swatch-value {\n font-size: 8px;\n font-family: var(--font-mono);\n opacity: 0.8;\n}\n.tb-swatch-single {\n width: 80px;\n min-width: 80px;\n flex: 0 0 80px;\n height: 72px;\n border-radius: var(--radius);\n border: 1px solid var(--color-border);\n justify-content: flex-end;\n}\n\n/* Scale badge */\n.tb-scale-badge {\n display: inline-block;\n font-size: 9px;\n font-weight: 500;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n padding: 1px 5px;\n border-radius: 3px;\n background: var(--color-bg-code);\n color: var(--color-code-text);\n margin-left: 6px;\n vertical-align: middle;\n}\n\n/* Spacing */\n.tb-spacing-row {\n display: grid;\n grid-template-columns: 140px 80px 1fr;\n align-items: center;\n gap: 12px;\n padding: 8px 0;\n border-bottom: 1px solid var(--color-border);\n}\n.tb-spacing-row:last-child { border-bottom: none; }\n.tb-spacing-label {\n font-family: var(--font-mono);\n font-size: 12px;\n font-weight: 500;\n color: var(--color-text);\n}\n.tb-spacing-value {\n font-family: var(--font-mono);\n font-size: 12px;\n color: var(--color-muted);\n}\n.tb-spacing-bar-wrapper {\n height: 20px;\n background: var(--color-bg-subtle);\n border-radius: 3px;\n overflow: hidden;\n}\n.tb-spacing-bar {\n height: 100%;\n background: var(--color-accent);\n border-radius: 3px;\n opacity: 0.5;\n min-width: 2px;\n}\n\n/* Typography */\n.tb-typo-row {\n display: grid;\n grid-template-columns: 160px 1fr auto;\n align-items: baseline;\n gap: 16px;\n padding: 10px 0;\n border-bottom: 1px solid var(--color-border);\n}\n.tb-typo-row:last-child { border-bottom: none; }\n.tb-typo-label {\n font-family: var(--font-mono);\n font-size: 12px;\n font-weight: 500;\n}\n.tb-typo-value {\n font-family: var(--font-mono);\n font-size: 12px;\n color: var(--color-muted);\n}\n.tb-typo-sample {\n font-size: 18px;\n color: var(--color-text);\n}\n\n/* Generic table */\n.tb-generic-table { width: 100%; border-collapse: collapse; font-size: 13px; }\n.tb-generic-table th {\n text-align: left;\n font-weight: 600;\n font-size: 11px;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--color-muted);\n padding: 8px 12px;\n border-bottom: 2px solid var(--color-border);\n}\n.tb-generic-table td {\n padding: 8px 12px;\n border-bottom: 1px solid var(--color-border);\n vertical-align: middle;\n}\n.tb-generic-table tr:last-child td { border-bottom: none; }\n.tb-generic-path {\n font-family: var(--font-mono);\n font-size: 12px;\n color: var(--color-accent);\n}\n.tb-generic-value {\n font-family: var(--font-mono);\n font-size: 12px;\n}\n.tb-generic-type {\n font-size: 11px;\n color: var(--color-muted);\n text-transform: capitalize;\n}\n\n@media (max-width: 768px) {\n .tb-scale-row { flex-wrap: wrap; }\n .tb-swatch { min-width: 48px; }\n .tb-spacing-row { grid-template-columns: 1fr 1fr; }\n .tb-spacing-bar-wrapper { display: none; }\n .tb-typo-row { grid-template-columns: 1fr 1fr; }\n}`;\n\n return `<style>\\n${css}\\n</style>`;\n}\n\n// NOTE: Additional styles appended for collection grouping and internal badges\n// are injected at the end of generateCSS() via string append — see below.\n","import { generateCSS } from \"../css.js\";\nimport type { SiteData } from \"../types.js\";\nimport { escapeHtml, matchGlob, slugify } from \"../utils.js\";\n\nexport interface SearchItem {\n name: string;\n type: \"component\" | \"icon\";\n url: string;\n collection?: string;\n keywords?: string;\n}\n\nexport function buildSearchItems(data: SiteData): SearchItem[] {\n const items: SearchItem[] = [];\n const basePath = data.options.basePath;\n const iconPatterns = data.options.iconPatterns;\n\n for (const [name, component] of Object.entries(data.manifest.components)) {\n const isIcon =\n iconPatterns.length > 0 &&\n iconPatterns.some(\n (p) => matchGlob(p, component.filePath) || matchGlob(p, component.displayName),\n );\n\n if (component.internal && !isIcon) continue;\n\n items.push({\n name,\n type: isIcon ? \"icon\" : \"component\",\n url: `${basePath}${slugify(name)}.html`,\n collection: component.collection,\n keywords: (component.keywords ?? []).join(\" \"),\n });\n }\n\n return items.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function sidebarLinks(data: SiteData, currentSlug: string | null): string {\n const { components } = data.manifest;\n const collections = data.manifest.collections ?? [];\n const basePath = data.options.basePath;\n const hasIcons = data.options.iconPatterns.length > 0;\n\n // Filter out internal components entirely\n const visibleEntries = Object.entries(components).filter(([, c]) => !c.internal);\n\n // Build collection → names map (ordered by collections config, then ungrouped)\n const collectionMap = new Map<string, string[]>();\n for (const col of collections) {\n collectionMap.set(col.name, []);\n }\n const ungrouped: string[] = [];\n\n for (const [name, component] of visibleEntries) {\n if (component.collection) {\n if (!collectionMap.has(component.collection)) {\n collectionMap.set(component.collection, []);\n }\n collectionMap.get(component.collection)?.push(name);\n } else {\n ungrouped.push(name);\n }\n }\n\n // If no collections at all, render flat list (backwards-compat)\n const hasAnyCollections = collectionMap.size > 0 || ungrouped.length < visibleEntries.length;\n\n function renderLinks(names: string[]): string {\n return names\n .sort()\n .map((name) => {\n const slug = slugify(name);\n const isActive = slug === currentSlug;\n return `<a href=\"${basePath}${slug}.html\" class=\"${isActive ? \"active\" : \"\"}\">${escapeHtml(name)}</a>`;\n })\n .join(\"\\n\");\n }\n\n const hasTokens = (data.tokenEntries?.length ?? 0) > 0;\n\n const overviewLink = `<a href=\"${basePath}index.html\" class=\"${currentSlug === null ? \"active\" : \"\"}\">Overview</a>`;\n const tokensLink = hasTokens\n ? `<a href=\"${basePath}tokens.html\" class=\"${currentSlug === \"tokens\" ? \"active\" : \"\"}\">Tokens</a>`\n : \"\";\n const iconsLink = hasIcons\n ? `<a href=\"${basePath}icons.html\" class=\"${currentSlug === \"icons\" ? \"active\" : \"\"}\">Icons</a>`\n : \"\";\n\n if (!hasAnyCollections) {\n const links = renderLinks(visibleEntries.map(([name]) => name));\n return `${overviewLink}\\n${tokensLink}\\n${iconsLink}\\n<div class=\"sidebar-heading\">Components</div>\\n${links}`;\n }\n\n const sections: string[] = [overviewLink];\n if (tokensLink) sections.push(tokensLink);\n if (iconsLink) sections.push(iconsLink);\n\n for (const [colName, names] of collectionMap) {\n if (names.length === 0) continue;\n sections.push(\n `<div class=\"sidebar-collection-header\">${escapeHtml(colName)}</div>\\n${renderLinks(names)}`,\n );\n }\n\n if (ungrouped.length > 0) {\n sections.push(\n `<div class=\"sidebar-collection-header\">Ungrouped</div>\\n${renderLinks(ungrouped)}`,\n );\n }\n\n return sections.join(\"\\n\");\n}\n\nexport interface Breadcrumb {\n label: string;\n url?: string;\n}\n\nexport function htmlShell(options: {\n title: string;\n body: string;\n sidebar: string;\n onThisPage: string;\n basePath: string;\n searchItems?: SearchItem[];\n breadcrumbs?: Breadcrumb[];\n}): string {\n const {\n title,\n body,\n sidebar,\n onThisPage,\n basePath,\n searchItems = [],\n breadcrumbs = [],\n } = options;\n\n const searchItemsJson = JSON.stringify(searchItems).replace(/<\\/script>/gi, \"<\\\\/script>\");\n\n const logoSvg = `<svg class=\"site-logo\" width=\"22\" height=\"22\" viewBox=\"0 0 1200 1200\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"m627.03 392.79c93.695 14.414 169.37 86.488 180.18 183.79h90.09c18.02 0 18.02 50.449 0 50.449h-90.09c-10.812 93.695-86.488 169.37-180.18 180.18v90.09c0 18.02-50.449 18.02-50.449 0v-90.09c-97.297-10.812-169.37-86.488-183.79-180.18h-86.488c-18.02 0-18.02-50.449 0-50.449h86.488c14.414-97.297 86.488-169.37 183.79-183.79v-86.488c0-18.02 50.449-21.621 50.449 0zm486.49-313.51h-201.8c-18.02 0-18.02-50.449 0-50.449h237.84c7.207 0 14.414 7.207 14.414 14.414v237.84c0 18.02-50.449 18.02-50.449 0zm7.207 1034.2v-201.8c0-18.02 50.449-18.02 50.449 0v237.84c0 7.207-3.6055 14.414-10.812 14.414h-241.44c-18.02 0-18.02-50.449 0-50.449zm-1030.6 7.207h198.2c21.621 0 21.621 50.449 0 50.449h-237.84c-7.207 0-10.812-3.6055-10.812-10.812v-241.44c0-18.02 50.449-18.02 50.449 0zm-10.812-1030.6v198.2c0 21.621-50.449 21.621-50.449 0v-237.84c0-7.207 7.207-10.812 14.414-10.812h237.84c18.02 0 18.02 50.449 0 50.449zm547.75 356.76v129.73h129.73c-10.812-68.469-64.863-118.92-129.73-129.73zm129.73 180.18h-129.73v129.73c64.863-10.812 118.92-64.863 129.73-129.73zm-180.18 129.73v-129.73h-129.73c10.812 64.863 61.262 118.92 129.73 129.73zm-129.73-180.18h129.73v-129.73c-68.469 10.812-118.92 61.262-129.73 129.73z\" fill-rule=\"evenodd\"/></svg>`;\n\n const searchSvg = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"/></svg>`;\n const compSvg = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/></svg>`;\n const iconSvg = `<svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\"/></svg>`;\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <script>(function(){var t=localStorage.getItem('scope-theme');if(t==='dark'||t==='light'){document.documentElement.setAttribute('data-theme',t)}else if(window.matchMedia&&window.matchMedia('(prefers-color-scheme:dark)').matches){document.documentElement.setAttribute('data-theme','dark')}else{document.documentElement.setAttribute('data-theme','light')}})();</script>\n <title>${escapeHtml(title)}</title>\n ${generateCSS()}\n</head>\n<body>\n <nav class=\"top-nav\">\n <a class=\"site-title\" href=\"${basePath}index.html\">${logoSvg}<span>Scope</span></a>${breadcrumbs.length > 0 ? `<nav class=\"breadcrumbs\" aria-label=\"Breadcrumb\">${breadcrumbs.map((b) => (b.url ? `<a href=\"${b.url}\">${escapeHtml(b.label)}</a>` : `<span>${escapeHtml(b.label)}</span>`)).join(\"\")}</nav>` : \"\"}\n <div class=\"spacer\"></div>\n <button class=\"cmdk-trigger\" id=\"cmdk-trigger\" type=\"button\">\n ${searchSvg}\n <span>Search…</span>\n <kbd>⌘K</kbd>\n </button>\n <button class=\"theme-toggle\" id=\"theme-toggle\" type=\"button\" aria-label=\"Toggle theme\" title=\"Toggle theme\"></button>\n </nav>\n\n <div class=\"cmdk-overlay\" id=\"cmdk-overlay\" hidden></div>\n <div class=\"cmdk-dialog\" id=\"cmdk-dialog\" hidden role=\"dialog\" aria-label=\"Search components\">\n <div class=\"cmdk-input-wrapper\">\n ${searchSvg}\n <input class=\"cmdk-input\" id=\"cmdk-input\" placeholder=\"Jump to component or icon…\" autocomplete=\"off\" spellcheck=\"false\" />\n </div>\n <div class=\"cmdk-list\" id=\"cmdk-list\"></div>\n <div class=\"cmdk-empty\" id=\"cmdk-empty\" hidden>No results found.</div>\n <div class=\"cmdk-footer\">\n <span><kbd>↑↓</kbd> navigate</span>\n <span><kbd>↵</kbd> open</span>\n <span><kbd>esc</kbd> close</span>\n </div>\n </div>\n\n <div class=\"page-layout\">\n <nav class=\"sidebar\" id=\"sidebar\">\n ${sidebar}\n </nav>\n <div class=\"main-content\">\n <div class=\"content-body${onThisPage ? \"\" : \" content-body-full\"}\">\n ${body}\n </div>\n ${\n onThisPage\n ? `<nav class=\"on-this-page\">\n <h4>On this page</h4>\n ${onThisPage}\n </nav>`\n : \"\"\n }\n </div>\n </div>\n <script>\n (function () {\n var ITEMS = ${searchItemsJson};\n var overlay = document.getElementById('cmdk-overlay');\n var dialog = document.getElementById('cmdk-dialog');\n var input = document.getElementById('cmdk-input');\n var list = document.getElementById('cmdk-list');\n var trigger = document.getElementById('cmdk-trigger');\n var emptyEl = document.getElementById('cmdk-empty');\n if (!overlay || !dialog || !input || !list || !trigger) return;\n\n var activeIdx = 0;\n var filtered = ITEMS.slice();\n var compIcon = ${JSON.stringify(compSvg)};\n var icoIcon = ${JSON.stringify(iconSvg)};\n\n function render() {\n if (filtered.length === 0) {\n list.innerHTML = '';\n list.style.display = 'none';\n if (emptyEl) emptyEl.hidden = false;\n return;\n }\n if (emptyEl) emptyEl.hidden = true;\n list.style.display = '';\n list.innerHTML = filtered.map(function (item, i) {\n var cls = 'cmdk-item' + (i === activeIdx ? ' cmdk-item-active' : '');\n var icon = item.type === 'icon' ? icoIcon : compIcon;\n var col = item.collection ? '<span class=\"cmdk-item-collection\">' + item.collection + '</span>' : '';\n return '<a class=\"' + cls + '\" href=\"' + item.url + '\" data-idx=\"' + i + '\">' +\n '<span class=\"cmdk-item-icon\">' + icon + '</span>' +\n '<span class=\"cmdk-item-name\">' + item.name + '</span>' +\n col +\n '<span class=\"cmdk-item-type\">' + item.type + '</span>' +\n '</a>';\n }).join('');\n }\n\n function filter(q) {\n if (!q) {\n filtered = ITEMS.slice();\n } else {\n filtered = ITEMS.filter(function (item) {\n var haystack = item.name.toLowerCase();\n if (item.collection) haystack += ' ' + item.collection.toLowerCase();\n if (item.keywords) haystack += ' ' + item.keywords.toLowerCase();\n return haystack.includes(q);\n });\n }\n activeIdx = 0;\n render();\n }\n\n function open() {\n overlay.hidden = false;\n dialog.hidden = false;\n input.value = '';\n filter('');\n input.focus();\n }\n\n function close() {\n overlay.hidden = true;\n dialog.hidden = true;\n }\n\n function scrollActive() {\n var el = list.querySelector('.cmdk-item-active');\n if (el) el.scrollIntoView({ block: 'nearest' });\n }\n\n document.addEventListener('keydown', function (e) {\n if ((e.metaKey || e.ctrlKey) && e.key === 'k') {\n e.preventDefault();\n if (dialog.hidden) open(); else close();\n return;\n }\n if (dialog.hidden) return;\n if (e.key === 'Escape') { e.preventDefault(); close(); }\n if (e.key === 'ArrowDown') { e.preventDefault(); activeIdx = Math.min(activeIdx + 1, filtered.length - 1); render(); scrollActive(); }\n if (e.key === 'ArrowUp') { e.preventDefault(); activeIdx = Math.max(activeIdx - 1, 0); render(); scrollActive(); }\n if (e.key === 'Enter') { e.preventDefault(); if (filtered[activeIdx]) window.location.href = filtered[activeIdx].url; }\n });\n\n overlay.addEventListener('click', close);\n trigger.addEventListener('click', open);\n input.addEventListener('input', function () { filter(input.value.toLowerCase()); });\n\n list.addEventListener('mousemove', function (e) {\n var item = e.target.closest('.cmdk-item');\n if (item) {\n var idx = parseInt(item.getAttribute('data-idx'), 10);\n if (idx !== activeIdx) { activeIdx = idx; render(); }\n }\n });\n\n list.addEventListener('click', function (e) {\n var item = e.target.closest('.cmdk-item');\n if (item) { e.preventDefault(); window.location.href = item.getAttribute('href'); }\n });\n })();\n (function () {\n var btn = document.getElementById('theme-toggle');\n if (!btn) return;\n var sunSvg = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"5\"/><line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\"/><line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\"/><line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\"/><line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\"/><line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\"/><line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\"/><line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\"/><line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\"/></svg>';\n var moonSvg = '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\"/></svg>';\n function setIcon() {\n btn.innerHTML = document.documentElement.getAttribute('data-theme') === 'dark' ? moonSvg : sunSvg;\n }\n setIcon();\n btn.addEventListener('click', function () {\n var current = document.documentElement.getAttribute('data-theme');\n var next = current === 'dark' ? 'light' : 'dark';\n document.documentElement.setAttribute('data-theme', next);\n localStorage.setItem('scope-theme', next);\n setIcon();\n });\n })();\n </script>\n</body>\n</html>`;\n}\n","import type { SiteData } from \"../types.js\";\nimport { escapeHtml, propControlHtml, propTableRow, renderDOMTree, slugify } from \"../utils.js\";\nimport { type Breadcrumb, buildSearchItems, htmlShell, sidebarLinks } from \"./layout.js\";\n\nfunction notGenerated(message = \"Not generated\"): string {\n return `<div class=\"not-generated\">${escapeHtml(message)}</div>`;\n}\n\nfunction renderFailure(message: string, heuristicFlags: string[] = []): string {\n const hintHtml =\n heuristicFlags.length > 0\n ? `<div class=\"render-failure-hints\"><strong>Failure hints:</strong> ${escapeHtml(heuristicFlags.join(\", \"))}</div>`\n : \"\";\n return `<div class=\"render-failure\"><strong>Render failed:</strong> ${escapeHtml(message)}${hintHtml}</div>`;\n}\n\nfunction sectionWrap(id: string, title: string, description: string, content: string): string {\n return `<section class=\"section\" id=\"${id}\">\n <div class=\"section-header\">\n <h2>${escapeHtml(title)}</h2>\n <p>${escapeHtml(description)}</p>\n </div>\n ${content}\n</section>`;\n}\n\nfunction renderPlayground(name: string, data: SiteData): string {\n const component = data.manifest.components[name];\n const render = data.renders.get(name);\n const slug = slugify(name);\n\n const allProps = component ? Object.entries(component.props) : [];\n const ownProps = allProps.filter(([, p]) => p.source !== \"inherited\");\n const editableTypes = new Set([\n \"string\",\n \"number\",\n \"boolean\",\n \"union\",\n \"array\",\n \"any\",\n \"unknown\",\n \"other\",\n \"node\",\n \"element\",\n ]);\n const editableProps = ownProps.filter(([, p]) => editableTypes.has(p.type));\n\n // Always include `children` if the component accepts it, even if inherited\n const hasChildren = allProps.some(([n]) => n === \"children\");\n const childrenInEditable = editableProps.some(([n]) => n === \"children\");\n if (hasChildren && !childrenInEditable) {\n const childrenProp = allProps.find(([n]) => n === \"children\");\n if (childrenProp) editableProps.unshift(childrenProp);\n }\n\n // Scope file defaults for this component (from .scope.ts \"default\" scenario)\n const scopeDefaults = data.playgroundDefaults?.get(name) ?? {};\n\n function getOverrideDefault(propName: string, prop: (typeof allProps)[0][1]): string | undefined {\n const scopeVal = scopeDefaults[propName];\n if (scopeVal !== undefined) return String(scopeVal);\n if (propName === \"children\" && (prop.type === \"node\" || prop.type === \"element\")) return name;\n return undefined;\n }\n\n const controlsHtml =\n editableProps.length > 0\n ? `<div class=\"pg-controls\" id=\"pg-controls-${escapeHtml(slug)}\">\n <div class=\"pg-controls-header\">Props</div>\n ${editableProps.map(([n, p]) => propControlHtml(n, p, getOverrideDefault(n, p))).join(\"\\n \")}\n</div>`\n : \"\";\n\n const iframeSrc = `${data.options.basePath}playground/${slug}.html`;\n\n const svgSun =\n '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"5\"/><line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"3\"/><line x1=\"12\" y1=\"21\" x2=\"12\" y2=\"23\"/><line x1=\"4.22\" y1=\"4.22\" x2=\"5.64\" y2=\"5.64\"/><line x1=\"18.36\" y1=\"18.36\" x2=\"19.78\" y2=\"19.78\"/><line x1=\"1\" y1=\"12\" x2=\"3\" y2=\"12\"/><line x1=\"21\" y1=\"12\" x2=\"23\" y2=\"12\"/><line x1=\"4.22\" y1=\"19.78\" x2=\"5.64\" y2=\"18.36\"/><line x1=\"18.36\" y1=\"5.64\" x2=\"19.78\" y2=\"4.22\"/></svg>';\n const svgMoon =\n '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\"/></svg>';\n const svgMonitor =\n '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" ry=\"2\"/><line x1=\"8\" y1=\"21\" x2=\"16\" y2=\"21\"/><line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"21\"/></svg>';\n const svgPhone =\n '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"5\" y=\"2\" width=\"14\" height=\"20\" rx=\"2\" ry=\"2\"/><line x1=\"12\" y1=\"18\" x2=\"12.01\" y2=\"18\"/></svg>';\n const svgTablet =\n '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"4\" y=\"2\" width=\"16\" height=\"20\" rx=\"2\" ry=\"2\"/><line x1=\"12\" y1=\"18\" x2=\"12.01\" y2=\"18\"/></svg>';\n const svgExpand =\n '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"15 3 21 3 21 9\"/><polyline points=\"9 21 3 21 3 15\"/><line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\"/><line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\"/></svg>';\n const svgClose =\n '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>';\n\n const es = escapeHtml(slug);\n\n const playgroundHtml = render?.errorMessage\n ? \"\"\n : `<div class=\"pg-container\" id=\"pg-container-${es}\">\n ${controlsHtml}\n <div class=\"pg-preview-wrapper\" id=\"pg-preview-${es}\">\n <div class=\"pg-toolbar\" id=\"pg-toolbar-${es}\">\n <button class=\"pg-toolbar-btn pg-theme-btn\" id=\"pg-theme-${es}\" title=\"Toggle dark mode\">${svgSun}</button>\n <span class=\"pg-toolbar-sep\"></span>\n <button class=\"pg-toolbar-btn pg-device-btn active\" data-width=\"\" title=\"Auto\">${svgMonitor}</button>\n <button class=\"pg-toolbar-btn pg-device-btn\" data-width=\"375\" title=\"Mobile (375px)\">${svgPhone}</button>\n <button class=\"pg-toolbar-btn pg-device-btn\" data-width=\"768\" title=\"Tablet (768px)\">${svgTablet}</button>\n <span class=\"pg-toolbar-sep\"></span>\n <span class=\"pg-toolbar-spacer\"></span>\n <button class=\"pg-toolbar-btn pg-fullscreen-btn\" id=\"pg-fs-${es}\" title=\"Fullscreen\">${svgExpand}</button>\n </div>\n <div class=\"pg-iframe-area\" id=\"pg-iframe-area-${es}\">\n <iframe\n class=\"pg-iframe\"\n id=\"pg-iframe-${es}\"\n src=\"${escapeHtml(iframeSrc)}\"\n loading=\"lazy\"\n allowtransparency=\"true\"\n ></iframe>\n </div>\n </div>\n</div>\n<script>\n(function() {\n var iframe = document.getElementById(\"pg-iframe-${es}\");\n var container = document.getElementById(\"pg-container-${es}\");\n var preview = document.getElementById(\"pg-preview-${es}\");\n var toolbar = document.getElementById(\"pg-toolbar-${es}\");\n var iframeArea = document.getElementById(\"pg-iframe-area-${es}\");\n var themeBtn = document.getElementById(\"pg-theme-${es}\");\n var fsBtn = document.getElementById(\"pg-fs-${es}\");\n if (!iframe || !container || !preview) return;\n\n // --- Props ---\n function collectProps() {\n var props = {};\n var controls = container.querySelectorAll(\"[data-prop-name]\");\n for (var i = 0; i < controls.length; i++) {\n var el = controls[i];\n var propName = el.getAttribute(\"data-prop-name\");\n if (!propName) continue;\n if (el.type === \"checkbox\") {\n props[propName] = el.checked;\n } else {\n var v = (el.value || \"\").trim();\n if (v === \"\") continue;\n try { props[propName] = JSON.parse(v); } catch(_) { props[propName] = v; }\n }\n }\n return props;\n }\n\n function sendProps() {\n if (!iframe.contentWindow) return;\n iframe.contentWindow.postMessage({ type: \"scope-playground-props\", props: collectProps() }, \"*\");\n }\n\n var propsSent = false;\n function sendOnce() {\n if (!propsSent) {\n propsSent = true;\n setTimeout(function() { sendProps(); applyTheme(); }, 50);\n }\n }\n iframe.addEventListener(\"load\", sendOnce);\n try { if (iframe.contentDocument && iframe.contentDocument.readyState === \"complete\") sendOnce(); } catch(e) {}\n container.addEventListener(\"input\", sendProps);\n container.addEventListener(\"change\", sendProps);\n\n window.addEventListener(\"message\", function(e) {\n if (e.data && e.data.type === \"scope-playground-height\" && e.source === iframe.contentWindow) {\n var h = Math.max(300, e.data.height + 32);\n iframe.style.height = h + \"px\";\n }\n });\n\n // --- Dark / Light mode ---\n var isDark = document.documentElement.getAttribute(\"data-theme\") === \"dark\";\n var userOverride = false;\n\n function applyTheme() {\n themeBtn.innerHTML = isDark ? ${JSON.stringify(svgMoon)} : ${JSON.stringify(svgSun)};\n themeBtn.classList.toggle(\"active\", isDark);\n preview.classList.toggle(\"pg-dark\", isDark);\n if (iframe.contentWindow) {\n iframe.contentWindow.postMessage({ type: \"scope-playground-theme\", theme: isDark ? \"dark\" : \"light\" }, \"*\");\n }\n }\n\n // Apply initial theme from global setting\n applyTheme();\n\n themeBtn.addEventListener(\"click\", function() {\n userOverride = true;\n isDark = !isDark;\n applyTheme();\n });\n\n // Follow global theme changes unless the user has manually toggled\n new MutationObserver(function() {\n if (userOverride) return;\n isDark = document.documentElement.getAttribute(\"data-theme\") === \"dark\";\n applyTheme();\n }).observe(document.documentElement, { attributes: true, attributeFilter: [\"data-theme\"] });\n\n // --- Device size ---\n var deviceBtns = toolbar.querySelectorAll(\".pg-device-btn\");\n for (var d = 0; d < deviceBtns.length; d++) {\n deviceBtns[d].addEventListener(\"click\", function() {\n for (var j = 0; j < deviceBtns.length; j++) deviceBtns[j].classList.remove(\"active\");\n this.classList.add(\"active\");\n var w = this.getAttribute(\"data-width\");\n iframe.style.maxWidth = w ? w + \"px\" : \"\";\n iframe.style.margin = w ? \"0 auto\" : \"\";\n });\n }\n\n // --- Fullscreen ---\n function exitFullscreen() {\n preview.classList.remove(\"pg-fullscreen\");\n fsBtn.innerHTML = ${JSON.stringify(svgExpand)};\n fsBtn.title = \"Fullscreen\";\n }\n fsBtn.addEventListener(\"click\", function() {\n var isFs = preview.classList.toggle(\"pg-fullscreen\");\n fsBtn.innerHTML = isFs ? ${JSON.stringify(svgClose)} : ${JSON.stringify(svgExpand)};\n fsBtn.title = isFs ? \"Exit fullscreen\" : \"Fullscreen\";\n });\n document.addEventListener(\"keydown\", function(e) {\n if (e.key === \"Escape\" && preview.classList.contains(\"pg-fullscreen\")) exitFullscreen();\n });\n})();\n</script>`;\n\n const renderW = render?.width != null ? render.width : undefined;\n const renderH = render?.height != null ? render.height : undefined;\n const renderSizeAttr =\n renderW != null && renderH != null ? ` width=\"${renderW}\" height=\"${renderH}\"` : \"\";\n const playgroundError = render?.errorMessage\n ? renderFailure(\n `${render.errorMessage}\\nInspect .reactscope/renders/${name}.error.json and rerun scope render component ${name}.`,\n render.heuristicFlags ?? [],\n )\n : render && !render.screenshot && !render.svgContent\n ? renderFailure(\n `No static preview was generated for ${name}. Check .reactscope/run-summary.json and rerun scope render all.`,\n )\n : \"\";\n\n const screenshotFallback = render?.screenshot\n ? `<details class=\"pg-static-fallback\">\n <summary>Static Preview</summary>\n <div class=\"render-preview\">\n <img src=\"data:image/png;base64,${render.screenshot}\" alt=\"${escapeHtml(name)} render\"${renderSizeAttr} />\n </div>\n</details>`\n : \"\";\n\n return sectionWrap(\n \"playground\",\n \"Playground\",\n \"Interactive component preview with prop controls.\",\n `${playgroundError}${playgroundHtml}${screenshotFallback}`,\n );\n}\n\nfunction renderProps(name: string, data: SiteData): string {\n const component = data.manifest.components[name];\n if (!component) {\n return sectionWrap(\"props\", \"Props\", \"Component prop definitions.\", notGenerated());\n }\n\n const allProps = Object.entries(component.props);\n const ownProps = allProps.filter(([, p]) => p.source !== \"inherited\");\n const inheritedProps = allProps.filter(([, p]) => p.source === \"inherited\");\n\n function propsTableHtml(rows: [string, (typeof allProps)[0][1]][]): string {\n return `<table class=\"props-table\">\n <thead>\n <tr>\n <th>Prop</th>\n <th>Type</th>\n <th>Required</th>\n <th>Default</th>\n </tr>\n </thead>\n <tbody>\n ${rows.map(([n, p]) => propTableRow(n, p)).join(\"\\n \")}\n </tbody>\n</table>`;\n }\n\n const GROUP_LABELS: Record<string, string> = {\n html: \"HTML Attributes\",\n react: \"React Props\",\n aria: \"ARIA Attributes\",\n };\n\n function renderInheritedGroup(groupName: string, rows: typeof inheritedProps): string {\n const label = GROUP_LABELS[groupName] ?? groupName;\n return `<details class=\"inherited-group\">\n <summary>${escapeHtml(label)} <span class=\"inherited-group-count\">${rows.length}</span></summary>\n ${propsTableHtml(rows)}\n</details>`;\n }\n\n if (allProps.length === 0) {\n return sectionWrap(\n \"props\",\n \"Props\",\n \"Component prop definitions.\",\n `<p style=\"color:var(--color-muted);font-size:13px\">No props defined.</p>`,\n );\n }\n\n let content: string;\n if (inheritedProps.length === 0) {\n content = propsTableHtml(allProps);\n } else {\n const ownTable =\n ownProps.length > 0\n ? propsTableHtml(ownProps)\n : `<p style=\"color:var(--color-muted);font-size:13px\">No component-specific props.</p>`;\n\n const groups = new Map<string, typeof inheritedProps>();\n for (const entry of inheritedProps) {\n const group = entry[1].sourceGroup ?? \"other\";\n const list = groups.get(group) ?? [];\n list.push(entry);\n groups.set(group, list);\n }\n\n const order = [\"html\", \"react\", \"aria\"];\n const sortedKeys = [\n ...order.filter((k) => groups.has(k)),\n ...[...groups.keys()].filter((k) => !order.includes(k)).sort(),\n ];\n\n const groupHtml = sortedKeys\n .map((key) => renderInheritedGroup(key, groups.get(key) ?? []))\n .join(\"\\n\");\n\n content = `${ownTable}\n<div class=\"inherited-props-section\">\n <div class=\"inherited-props-heading\">${inheritedProps.length} inherited prop${inheritedProps.length === 1 ? \"\" : \"s\"}</div>\n ${groupHtml}\n</div>`;\n }\n\n return sectionWrap(\n \"props\",\n \"Props\",\n `${allProps.length} prop${allProps.length === 1 ? \"\" : \"s\"} defined.`,\n content,\n );\n}\n\nfunction renderMatrix(name: string, data: SiteData): string {\n const render = data.renders.get(name);\n\n if (!render?.cells || render.cells.length === 0) {\n return sectionWrap(\n \"matrix\",\n \"Matrix\",\n \"Prop combination matrix renders.\",\n render?.errorMessage\n ? renderFailure(\n `${render.errorMessage}\\nMatrix renders unavailable because the base render failed. Inspect .reactscope/renders/${name}.error.json.`,\n render.heuristicFlags ?? [],\n )\n : notGenerated(\n \"Matrix renders not generated. Run scope render matrix <Component> to produce a matrix.\",\n ),\n );\n }\n\n const cells = render.cells;\n const cols = Math.ceil(Math.sqrt(cells.length));\n\n const cellsHtml = cells\n .map((cell) => {\n const label = cell.axisValues.join(\" / \");\n const imgHtml = cell.screenshot\n ? `<img class=\"scope-screenshot\" src=\"data:image/png;base64,${cell.screenshot}\" alt=\"${escapeHtml(label)}\" />`\n : `<span class=\"matrix-cell-error\">${cell.error ? escapeHtml(cell.error) : \"failed\"}</span>`;\n return `<div class=\"matrix-cell\">${imgHtml}<div class=\"cell-label\">${escapeHtml(label)}</div></div>`;\n })\n .join(\"\\n\");\n\n const grid = `<div class=\"matrix-grid\" style=\"grid-template-columns: repeat(${cols}, 1fr)\">\n${cellsHtml}\n</div>`;\n\n return sectionWrap(\"matrix\", \"Matrix\", \"Prop combination matrix renders.\", grid);\n}\n\nfunction renderDocs(): string {\n return sectionWrap(\n \"docs\",\n \"Docs\",\n \"Component documentation.\",\n `<p style=\"color:var(--color-muted);font-size:13px\">No documentation file found for this component.</p>`,\n );\n}\n\nfunction renderAnalysis(name: string, data: SiteData): string {\n const component = data.manifest.components[name];\n if (!component) {\n return sectionWrap(\"analysis\", \"Analysis\", \"Static analysis results.\", notGenerated());\n }\n\n const propCount = Object.keys(component.props).length;\n const hookCount = component.detectedHooks.length;\n const sideEffectCount =\n component.sideEffects.fetches.length +\n (component.sideEffects.timers ? 1 : 0) +\n component.sideEffects.subscriptions.length +\n (component.sideEffects.globalListeners ? 1 : 0);\n\n const statsGrid = `<div class=\"stats-grid\">\n <div class=\"stat-card\">\n <div class=\"stat-label\">Complexity</div>\n <div class=\"stat-value\"><span class=\"badge ${component.complexityClass}\">${escapeHtml(component.complexityClass)}</span></div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Props</div>\n <div class=\"stat-value\">${propCount}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Hooks</div>\n <div class=\"stat-value\">${hookCount}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Side Effects</div>\n <div class=\"stat-value\">${sideEffectCount}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Export</div>\n <div class=\"stat-value\" style=\"font-size:14px\">${escapeHtml(component.exportType)}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Memoized</div>\n <div class=\"stat-value\" style=\"font-size:14px\">${component.memoized ? \"Yes\" : \"No\"}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">forwardedRef</div>\n <div class=\"stat-value\" style=\"font-size:14px\">${component.forwardedRef ? \"Yes\" : \"No\"}</div>\n </div>\n</div>`;\n\n function tagList(items: string[]): string {\n if (items.length === 0)\n return `<span style=\"color:var(--color-muted);font-size:12px\">None</span>`;\n return `<div class=\"tag-list\">${items.map((i) => `<span class=\"tag\">${escapeHtml(i)}</span>`).join(\"\")}</div>`;\n }\n\n const sideEffectItems: string[] = [\n ...component.sideEffects.fetches.map((f) => `fetch: ${f}`),\n ...(component.sideEffects.timers ? [\"timers\"] : []),\n ...component.sideEffects.subscriptions.map((s) => `sub: ${s}`),\n ...(component.sideEffects.globalListeners ? [\"global listeners\"] : []),\n ];\n\n const analysisGrid = `<div class=\"analysis-grid\">\n <div class=\"analysis-card\">\n <h3>Detected Hooks</h3>\n <div class=\"value\">${tagList(component.detectedHooks)}</div>\n </div>\n <div class=\"analysis-card\">\n <h3>Required Contexts</h3>\n <div class=\"value\">${tagList(component.requiredContexts)}</div>\n </div>\n <div class=\"analysis-card\">\n <h3>HOC Wrappers</h3>\n <div class=\"value\">${tagList(component.hocWrappers)}</div>\n </div>\n <div class=\"analysis-card\">\n <h3>Side Effects</h3>\n <div class=\"value\">${tagList(sideEffectItems)}</div>\n </div>\n</div>`;\n\n return sectionWrap(\n \"analysis\",\n \"Analysis\",\n \"Static analysis results for this component.\",\n `${statsGrid}${analysisGrid}`,\n );\n}\n\nfunction renderXRay(name: string, data: SiteData): string {\n const render = data.renders.get(name);\n\n if (!render?.dom) {\n return sectionWrap(\n \"x-ray\",\n \"X-Ray\",\n \"DOM structure and computed styles.\",\n render?.errorMessage\n ? renderFailure(\n `${render.errorMessage}\\nX-Ray data unavailable because render failed. Inspect .reactscope/renders/${name}.error.json.`,\n render.heuristicFlags ?? [],\n )\n : notGenerated(\n \"X-Ray data not generated. Run scope render component <Component> with DOM capture enabled.\",\n ),\n );\n }\n\n const dom = render.dom;\n\n // Extract per-node styles keyed by nodeId from computedStyles map\n const nodeStylesMap: Record<number, Record<string, string>> = {};\n if (render.computedStyles) {\n for (const [key, styles] of Object.entries(render.computedStyles)) {\n const m = key.match(/^#node-(\\d+)$/);\n if (m?.[1] !== undefined) nodeStylesMap[parseInt(m[1], 10)] = styles;\n }\n }\n const nodeStylesJson = JSON.stringify(JSON.stringify(nodeStylesMap)).replace(\n /<\\/script>/gi,\n \"<\\\\/script>\",\n );\n\n const treeHtml = `<div class=\"dom-tree\">${renderDOMTree(dom.tree)}</div>`;\n\n // Styles panel — populated by JS when user clicks a node\n const stylesPanelHtml = `\n<div id=\"xray-styles-panel-${escapeHtml(name)}\" class=\"xray-styles-panel\" style=\"display:none;margin-top:16px;border:1px solid var(--color-border);border-radius:6px;overflow:hidden\">\n <div class=\"xray-styles-header\" style=\"padding:8px 12px;background:var(--color-bg-subtle);font-size:12px;font-weight:600;color:var(--color-muted);display:flex;justify-content:space-between;align-items:center\">\n <span id=\"xray-styles-label-${escapeHtml(name)}\">— no node selected —</span>\n <button onclick=\"document.getElementById('xray-styles-panel-${escapeHtml(name)}').style.display='none'\" style=\"background:none;border:none;cursor:pointer;color:var(--color-muted);font-size:16px;line-height:1\">×</button>\n </div>\n <table class=\"token-table\" style=\"margin:0\">\n <thead><tr><th>Property</th><th>Value</th></tr></thead>\n <tbody id=\"xray-styles-body-${escapeHtml(name)}\"></tbody>\n </table>\n</div>\n<script>\n(function() {\n var nodeStyles = JSON.parse(${nodeStylesJson});\n var container = document.currentScript.parentElement;\n container.addEventListener(\"click\", function(e) {\n var el = e.target.closest(\"[data-node-id]\");\n if (!el) return;\n var id = parseInt(el.getAttribute(\"data-node-id\"), 10);\n var styles = nodeStyles[id];\n if (!styles) return;\n var panel = document.getElementById(\"xray-styles-panel-${escapeHtml(name)}\");\n var label = document.getElementById(\"xray-styles-label-${escapeHtml(name)}\");\n var body = document.getElementById(\"xray-styles-body-${escapeHtml(name)}\");\n var tag = el.tagName === \"DETAILS\" ? el.querySelector(\"summary .dom-tag-open\") : el;\n label.textContent = tag ? tag.textContent.trim().slice(0, 60) : \"node #\" + id;\n body.innerHTML = Object.entries(styles).map(function(e) {\n return \"<tr><td>\" + e[0] + \"</td><td style='font-family:monospace'>\" + e[1] + \"</td></tr>\";\n }).join(\"\");\n panel.style.display = \"block\";\n // Highlight selected node\n container.querySelectorAll(\".dom-node-selected\").forEach(function(n) { n.classList.remove(\"dom-node-selected\"); });\n el.classList.add(\"dom-node-selected\");\n });\n})();\n</script>`;\n\n return sectionWrap(\n \"x-ray\",\n \"X-Ray\",\n `DOM structure — ${dom.elementCount} elements. Click any element to inspect its computed styles.`,\n `${treeHtml}${stylesPanelHtml}`,\n );\n}\n\nfunction renderTokens(name: string, data: SiteData): string {\n if (!data.complianceBatch) {\n return sectionWrap(\n \"tokens\",\n \"Tokens\",\n \"Design token compliance.\",\n notGenerated(\"Compliance data not generated. Run scope tokens to audit design tokens.\"),\n );\n }\n\n const report = data.complianceBatch.components[name];\n if (!report) {\n return sectionWrap(\n \"tokens\",\n \"Tokens\",\n \"Design token compliance.\",\n notGenerated(\"No compliance report found for this component.\"),\n );\n }\n\n const pct = Math.round(report.compliance * 100);\n const barHtml = `<div class=\"compliance-bar-container\">\n <div class=\"compliance-label\">${pct}% on-system (${report.onSystem} / ${report.total} properties)</div>\n <div class=\"compliance-bar-bg\">\n <div class=\"compliance-bar-fill\" style=\"width:${pct}%\"></div>\n </div>\n</div>`;\n\n const rows = Object.entries(report.properties)\n .map(([prop, result]) => {\n const pill =\n result.status === \"on_system\"\n ? `<span class=\"pill-on\">✓ ${escapeHtml(result.token ?? \"\")}</span>`\n : `<span class=\"pill-off\">✗ off-system</span>`;\n\n const swatchStyle = result.value.startsWith(\"#\")\n ? ` style=\"background:${escapeHtml(result.value)}\"`\n : \"\";\n\n const nearestHtml = result.nearest\n ? `<span style=\"color:var(--color-muted);font-size:10px\"> nearest: ${escapeHtml(result.nearest.token)}</span>`\n : \"\";\n\n return `<tr>\n <td class=\"token-path\">${escapeHtml(prop)}</td>\n <td><span class=\"token-value-swatch\"${swatchStyle}></span>${escapeHtml(result.value)}</td>\n <td>${pill}${nearestHtml}</td>\n </tr>`;\n })\n .join(\"\\n \");\n\n const tableHtml = `<table class=\"token-table\">\n <thead><tr><th>Property</th><th>Value</th><th>Status</th></tr></thead>\n <tbody>${rows}</tbody>\n</table>`;\n\n return sectionWrap(\n \"tokens\",\n \"Tokens\",\n \"Design token compliance audit.\",\n `${barHtml}${tableHtml}`,\n );\n}\n\nfunction renderAccessibility(name: string, data: SiteData): string {\n const render = data.renders.get(name);\n\n if (!render?.accessibility) {\n return sectionWrap(\n \"accessibility\",\n \"Accessibility\",\n \"Accessibility audit results.\",\n notGenerated(\n \"Accessibility data not generated. Run scope render with accessibility capture enabled.\",\n ),\n );\n }\n\n const a11y = render.accessibility;\n const roleBadge = `<span class=\"a11y-role-badge\">${escapeHtml(a11y.role)}</span>`;\n\n const violationsHtml =\n a11y.violations.length > 0\n ? `<ul class=\"violation-list\">${a11y.violations.map((v) => `<li>${escapeHtml(v)}</li>`).join(\"\")}</ul>`\n : `<p style=\"color:var(--color-success);font-size:13px\">✓ No violations found.</p>`;\n\n return sectionWrap(\n \"accessibility\",\n \"Accessibility\",\n \"Accessibility audit results.\",\n `<p style=\"font-size:13px;margin:0 0 12px\">Role: ${roleBadge} Name: <em>${escapeHtml(a11y.name || \"(none)\")}</em></p>\n${violationsHtml}`,\n );\n}\n\nfunction renderComposition(name: string, data: SiteData): string {\n const component = data.manifest.components[name];\n\n if (!component || (component.composes.length === 0 && component.composedBy.length === 0)) {\n return sectionWrap(\n \"composition\",\n \"Composition\",\n \"Component dependency graph.\",\n `<p style=\"color:var(--color-muted);font-size:13px\">This component stands alone.</p>`,\n );\n }\n\n function compList(title: string, items: string[]): string {\n if (items.length === 0) {\n return `<div class=\"comp-list\"><h3>${escapeHtml(title)}</h3><p style=\"color:var(--color-muted);font-size:12px\">None</p></div>`;\n }\n const liItems = items\n .map((n) => {\n const compData = data.manifest.components[n];\n const internalBadge =\n compData?.internal === true ? `<span class=\"badge-internal\">internal</span>` : \"\";\n return `<li><a href=\"${data.options.basePath}${slugify(n)}.html\">${escapeHtml(n)}</a>${internalBadge}</li>`;\n })\n .join(\"\");\n return `<div class=\"comp-list\"><h3>${escapeHtml(title)}</h3><ul>${liItems}</ul></div>`;\n }\n\n return sectionWrap(\n \"composition\",\n \"Composition\",\n \"Component dependency graph.\",\n `<div class=\"composition-lists\">\n ${compList(\"Composes\", component.composes)}\n ${compList(\"Composed By\", component.composedBy)}\n</div>`,\n );\n}\n\nexport function renderComponentDetail(name: string, data: SiteData): string {\n const component = data.manifest.components[name];\n const slug = slugify(name);\n\n const complexityBadge = component\n ? `<span class=\"badge ${component.complexityClass}\">${escapeHtml(component.complexityClass)}</span>`\n : \"\";\n const memoizedBadge = component?.memoized ? `<span class=\"badge memoized\">memo</span>` : \"\";\n const exportBadge = component\n ? `<span class=\"badge\">${escapeHtml(component.exportType)}</span>`\n : \"\";\n const filepath = component ? `<div class=\"filepath\">${escapeHtml(component.filePath)}</div>` : \"\";\n\n const header = `<div class=\"component-header\">\n <h1>${escapeHtml(name)}</h1>\n <div class=\"meta\">${complexityBadge}${memoizedBadge}${exportBadge}</div>\n ${filepath}\n</div>`;\n\n const mainSections = [\n renderPlayground(name, data),\n renderMatrix(name, data),\n renderDocs(),\n sectionWrap(\n \"responsive\",\n \"Responsive\",\n \"Multi-viewport renders.\",\n notGenerated(\n \"Responsive renders not generated. Multi-viewport rendering is a future feature.\",\n ),\n ),\n sectionWrap(\n \"stress-tests\",\n \"Stress Tests\",\n \"Edge case and stress test renders.\",\n notGenerated(\"Stress tests not generated. Stress render runs are a future feature.\"),\n ),\n ];\n\n const inspectorSections = [\n renderProps(name, data),\n renderXRay(name, data),\n renderTokens(name, data),\n renderAccessibility(name, data),\n renderAnalysis(name, data),\n renderComposition(name, data),\n ];\n\n const body = `<div class=\"detail-columns\">\n <div class=\"detail-main\">\n ${header}\n ${mainSections.join(\"\\n\")}\n </div>\n <div class=\"detail-inspector\">\n ${inspectorSections.join(\"\\n\")}\n </div>\n</div>`;\n\n const sidebar = sidebarLinks(data, slug);\n const basePath = data.options.basePath;\n\n const breadcrumbs: Breadcrumb[] = [];\n if (component?.collection) {\n breadcrumbs.push({\n label: component.collection,\n url: `${basePath}index.html#collection-${slugify(component.collection)}`,\n });\n }\n breadcrumbs.push({ label: name });\n\n return htmlShell({\n title: `${name} — ${data.options.title}`,\n body,\n sidebar,\n onThisPage: \"\",\n basePath,\n searchItems: buildSearchItems(data),\n breadcrumbs,\n });\n}\n","import type { SiteData } from \"../types.js\";\nimport { escapeHtml, slugify } from \"../utils.js\";\nimport { buildSearchItems, htmlShell, sidebarLinks } from \"./layout.js\";\n\nfunction renderCard(name: string, data: SiteData): string {\n const component = data.manifest.components[name];\n if (!component) return \"\";\n const slug = slugify(name);\n const render = data.renders.get(name);\n const allPropEntries = Object.entries(component.props);\n const ownPropCount = allPropEntries.filter(([, p]) => p.source !== \"inherited\").length;\n const totalPropCount = allPropEntries.length;\n const hasInherited = ownPropCount < totalPropCount;\n const propCount = ownPropCount;\n const hookCount = component.detectedHooks.length;\n\n const previewHtml = render?.screenshot\n ? `<img class=\"scope-screenshot\" src=\"data:image/png;base64,${render.screenshot}\" alt=\"${escapeHtml(name)}\" />`\n : `<span class=\"no-preview\">No preview</span>`;\n\n return `<a class=\"component-card\" href=\"${data.options.basePath}${slug}.html\" data-name=\"${escapeHtml(name.toLowerCase())}\">\n <div class=\"card-preview\">${previewHtml}</div>\n <div class=\"card-body\">\n <div class=\"card-name\">${escapeHtml(name)}</div>\n <div class=\"card-meta\">\n <span>${propCount} prop${propCount === 1 ? \"\" : \"s\"}${hasInherited ? ` <span style=\"color:var(--color-muted)\">(+${totalPropCount - ownPropCount})</span>` : \"\"}</span>\n <span class=\"badge ${component.complexityClass}\" style=\"font-size:10px\">${escapeHtml(component.complexityClass)}</span>\n ${hookCount > 0 ? `<span>${hookCount} hooks</span>` : \"\"}\n </div>\n </div>\n</a>`;\n}\n\nexport function renderComponentIndex(data: SiteData): string {\n const allComponents = Object.entries(data.manifest.components);\n const collections = data.manifest.collections ?? [];\n\n // Exclude internal components from the grid\n const visibleComponents = allComponents.filter(([, c]) => !c.internal);\n\n const collectionMap = new Map<string, string[]>();\n for (const col of collections) {\n collectionMap.set(col.name, []);\n }\n const ungrouped: string[] = [];\n\n for (const [name, component] of visibleComponents) {\n if (component.collection) {\n if (!collectionMap.has(component.collection)) {\n collectionMap.set(component.collection, []);\n }\n collectionMap.get(component.collection)?.push(name);\n } else {\n ungrouped.push(name);\n }\n }\n\n const totalCount = allComponents.length;\n const visibleCount = visibleComponents.length;\n const nonEmptyCollections = [...collectionMap.values()].filter(\n (names) => names.length > 0,\n ).length;\n const simpleCount = visibleComponents.filter(([, c]) => c.complexityClass === \"simple\").length;\n const complexCount = visibleComponents.filter(([, c]) => c.complexityClass === \"complex\").length;\n const memoizedCount = visibleComponents.filter(([, c]) => c.memoized).length;\n\n const statsGrid = `<div class=\"stats-grid\">\n <div class=\"stat-card\">\n <div class=\"stat-label\">Total Components</div>\n <div class=\"stat-value\">${totalCount}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Collections</div>\n <div class=\"stat-value\">${nonEmptyCollections}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Simple</div>\n <div class=\"stat-value\">${simpleCount}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Complex</div>\n <div class=\"stat-value\">${complexCount}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Memoized</div>\n <div class=\"stat-value\">${memoizedCount}</div>\n </div>\n</div>`;\n\n const hasCollections = collectionMap.size > 0 || visibleComponents.some(([, c]) => c.collection);\n\n // Build a description lookup from the config-level collections\n const collectionDescriptions = new Map<string, string>();\n for (const col of collections) {\n if (col.description) {\n collectionDescriptions.set(col.name, col.description);\n }\n }\n\n function renderCollectionTile(colName: string, names: string[], description?: string): string {\n const slug = colName.toLowerCase().replace(/[^a-z0-9]+/g, \"-\");\n const descHtml = description\n ? `<div class=\"coll-tile-desc\">${escapeHtml(description)}</div>`\n : \"\";\n\n const thumbs = names\n .slice(0, 4)\n .map((n) => {\n const render = data.renders.get(n);\n return render?.screenshot\n ? `<img class=\"coll-thumb\" src=\"data:image/png;base64,${render.screenshot}\" alt=\"${escapeHtml(n)}\" />`\n : `<span class=\"coll-thumb coll-thumb-empty\"></span>`;\n })\n .join(\"\");\n\n return `<a class=\"collection-tile\" href=\"#collection-${slug}\">\n <div class=\"coll-tile-thumbs\">${thumbs}</div>\n <div class=\"coll-tile-body\">\n <div class=\"coll-tile-name\">${escapeHtml(colName)}</div>\n ${descHtml}\n <div class=\"coll-tile-count\">${names.length} component${names.length === 1 ? \"\" : \"s\"}</div>\n </div>\n</a>`;\n }\n\n let collectionGallery = \"\";\n if (hasCollections) {\n const tileParts: string[] = [];\n\n for (const [colName, names] of collectionMap) {\n if (names.length === 0) continue;\n tileParts.push(renderCollectionTile(colName, names, collectionDescriptions.get(colName)));\n }\n\n if (ungrouped.length > 0) {\n tileParts.push(renderCollectionTile(\"Ungrouped\", ungrouped));\n }\n\n collectionGallery = `<div class=\"collection-gallery-section\">\n <h2 class=\"gallery-section-title\">Collections</h2>\n <div class=\"collection-gallery\">${tileParts.join(\"\\n\")}</div>\n</div>`;\n }\n\n let cardSections: string;\n\n if (!hasCollections) {\n const cards = visibleComponents\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([name]) => renderCard(name, data))\n .join(\"\\n\");\n cardSections = `<div class=\"component-grid\" id=\"component-grid\">${cards}</div>`;\n } else {\n const sectionParts: string[] = [];\n\n for (const [colName, names] of collectionMap) {\n if (names.length === 0) continue;\n\n const slug = colName.toLowerCase().replace(/[^a-z0-9]+/g, \"-\");\n const description = collectionDescriptions.get(colName);\n const descHtml = description ? `<p>${escapeHtml(description)}</p>` : \"\";\n\n const cards = names\n .sort()\n .map((name) => renderCard(name, data))\n .join(\"\\n\");\n\n sectionParts.push(`<div class=\"collection-section\" id=\"collection-${slug}\">\n <div class=\"collection-section-header\">\n <h2>${escapeHtml(colName)}</h2>\n ${descHtml}\n </div>\n <div class=\"component-grid\">${cards}</div>\n</div>`);\n }\n\n if (ungrouped.length > 0) {\n const cards = ungrouped\n .sort()\n .map((name) => renderCard(name, data))\n .join(\"\\n\");\n\n sectionParts.push(`<div class=\"collection-section\" id=\"collection-ungrouped\">\n <div class=\"collection-section-header\">\n <h2>Ungrouped</h2>\n <p>Components not assigned to a collection.</p>\n </div>\n <div class=\"component-grid\">${cards}</div>\n</div>`);\n }\n\n cardSections = `<div id=\"component-grid\">${sectionParts.join(\"\\n\")}</div>`;\n }\n\n const filterScript = `<script>\n(function () {\n var grid = document.getElementById('component-grid');\n var indexSearch = document.getElementById('index-search');\n if (!grid || !indexSearch) return;\n function filter(q) {\n var cards = grid.querySelectorAll('.component-card');\n cards.forEach(function (card) {\n var name = card.getAttribute('data-name') || '';\n card.style.display = name.includes(q) ? '' : 'none';\n });\n }\n indexSearch.addEventListener('input', function () { filter(indexSearch.value.toLowerCase()); });\n})();\n</script>`;\n\n const header = `<div class=\"index-header\">\n <h1>${escapeHtml(data.options.title)}</h1>\n <p>${visibleCount} component${visibleCount === 1 ? \"\" : \"s\"} analysed</p>\n <input class=\"search-box\" type=\"search\" id=\"index-search\" placeholder=\"Filter components…\" style=\"margin-top:12px\" />\n</div>`;\n\n const body = `${header}${statsGrid}${collectionGallery}${cardSections}${filterScript}`;\n\n const sidebar = sidebarLinks(data, null);\n\n const onThisPageParts = [`<a href=\"#top\">Overview</a>`];\n if (hasCollections) {\n onThisPageParts.push(`<a href=\"#collection-gallery\">Collections</a>`);\n }\n onThisPageParts.push(`<a href=\"#component-grid\">Components</a>`);\n const onThisPage = onThisPageParts.join(\"\\n\");\n\n return htmlShell({\n title: data.options.title,\n body,\n sidebar,\n onThisPage,\n basePath: data.options.basePath,\n searchItems: buildSearchItems(data),\n });\n}\n","import type { SiteData } from \"../types.js\";\nimport { escapeHtml, slugify } from \"../utils.js\";\nimport { buildSearchItems, htmlShell, sidebarLinks } from \"./layout.js\";\n\nexport function renderDashboard(data: SiteData): string {\n const components = Object.entries(data.manifest.components);\n const totalCount = components.length;\n\n const simpleCount = components.filter(([, c]) => c.complexityClass === \"simple\").length;\n const complexCount = components.filter(([, c]) => c.complexityClass === \"complex\").length;\n const renderedCount = components.filter(([name]) => data.renders.has(name)).length;\n\n const totalProps = components.reduce((sum, [, c]) => sum + Object.keys(c.props).length, 0);\n const avgProps = totalCount > 0 ? Math.round(totalProps / totalCount) : 0;\n\n let overallCompliance: number | null = null;\n if (data.complianceBatch) {\n const reports = Object.values(data.complianceBatch.components);\n if (reports.length > 0) {\n overallCompliance = Math.round(\n (reports.reduce((sum, r) => sum + r.compliance, 0) / reports.length) * 100,\n );\n }\n }\n\n const statsGrid = `<div class=\"stats-grid\" style=\"margin-bottom:32px\">\n <div class=\"stat-card\">\n <div class=\"stat-label\">Total Components</div>\n <div class=\"stat-value\">${totalCount}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Avg Props</div>\n <div class=\"stat-value\">${avgProps}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">With Renders</div>\n <div class=\"stat-value\">${renderedCount}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Compliance</div>\n <div class=\"stat-value\">${overallCompliance !== null ? `${overallCompliance}%` : \"—\"}</div>\n </div>\n</div>`;\n\n // Complexity breakdown\n const complexitySection = `<div class=\"section\" style=\"padding:24px 0;border-bottom:1px solid var(--color-border)\">\n <h2 class=\"section-title\">Complexity Breakdown</h2>\n <div class=\"stats-grid\">\n <div class=\"stat-card\">\n <div class=\"stat-label\">Simple</div>\n <div class=\"stat-value\" style=\"color:var(--color-success)\">${simpleCount}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Complex</div>\n <div class=\"stat-value\" style=\"color:var(--color-warn)\">${complexCount}</div>\n </div>\n <div class=\"stat-card\">\n <div class=\"stat-label\">Simple %</div>\n <div class=\"stat-value\">${totalCount > 0 ? Math.round((simpleCount / totalCount) * 100) : 0}%</div>\n </div>\n </div>\n</div>`;\n\n // Top components by prop count\n const topByProps = components\n .sort(([, a], [, b]) => Object.keys(b.props).length - Object.keys(a.props).length)\n .slice(0, 10);\n\n const topPropsRows = topByProps\n .map(([name, component]) => {\n const slug = slugify(name);\n const propCount = Object.keys(component.props).length;\n return `<tr>\n <td><a href=\"${data.options.basePath}${slug}.html\" style=\"color:var(--color-accent);text-decoration:none\">${escapeHtml(name)}</a></td>\n <td>${propCount}</td>\n <td><span class=\"badge ${component.complexityClass}\">${escapeHtml(component.complexityClass)}</span></td>\n </tr>`;\n })\n .join(\"\\n \");\n\n const topPropsSection = `<div class=\"section\" style=\"padding:24px 0;border-bottom:1px solid var(--color-border)\">\n <h2 class=\"section-title\">Top Components by Prop Count</h2>\n <table class=\"props-table\">\n <thead><tr><th>Component</th><th>Props</th><th>Complexity</th></tr></thead>\n <tbody>${topPropsRows}</tbody>\n </table>\n</div>`;\n\n // Compliance section\n let complianceSection = \"\";\n if (data.complianceBatch && overallCompliance !== null) {\n const complianceRows = Object.entries(data.complianceBatch.components)\n .sort(([, a], [, b]) => b.compliance - a.compliance)\n .map(([name, report]) => {\n const pct = Math.round(report.compliance * 100);\n const slug = slugify(name);\n const barHtml = `<div class=\"compliance-bar-bg\" style=\"min-width:120px\">\n <div class=\"compliance-bar-fill\" style=\"width:${pct}%\"></div>\n </div>`;\n return `<tr>\n <td><a href=\"${data.options.basePath}${slug}.html\" style=\"color:var(--color-accent);text-decoration:none\">${escapeHtml(name)}</a></td>\n <td>${pct}%</td>\n <td>${barHtml}</td>\n <td>${report.onSystem} / ${report.total}</td>\n </tr>`;\n })\n .join(\"\\n \");\n\n complianceSection = `<div class=\"section\" style=\"padding:24px 0\">\n <h2 class=\"section-title\">Design Token Compliance — ${overallCompliance}% overall</h2>\n <table class=\"props-table\">\n <thead><tr><th>Component</th><th>Score</th><th>Bar</th><th>On-System</th></tr></thead>\n <tbody>${complianceRows}</tbody>\n </table>\n</div>`;\n }\n\n const header = `<div class=\"dashboard-header\">\n <h1>Dashboard</h1>\n <p style=\"color:var(--color-muted);font-size:14px\">Overview of all ${totalCount} analysed components.</p>\n</div>`;\n\n const body = `${header}${statsGrid}${complexitySection}${topPropsSection}${complianceSection}`;\n\n const sidebar = sidebarLinks(data, null);\n\n const onThisPage = `<a href=\"#top\">Overview</a>\n<a href=\"#complexity\">Complexity</a>\n<a href=\"#top-props\">Top by Props</a>\n${data.complianceBatch ? '<a href=\"#compliance\">Compliance</a>' : \"\"}`;\n\n return htmlShell({\n title: `Dashboard — ${data.options.title}`,\n body,\n sidebar,\n onThisPage,\n basePath: data.options.basePath,\n searchItems: buildSearchItems(data),\n breadcrumbs: [{ label: \"Dashboard\" }],\n });\n}\n","import type { ComponentData, SiteData } from \"../types.js\";\nimport { domTreeToSvg, escapeHtml, matchGlob, slugify } from \"../utils.js\";\nimport { buildSearchItems, htmlShell, sidebarLinks } from \"./layout.js\";\n\nfunction isIconComponent(filePath: string, displayName: string, patterns: string[]): boolean {\n return patterns.some((p) => matchGlob(p, filePath) || matchGlob(p, displayName));\n}\n\nfunction getIconSvg(name: string, data: SiteData): string | undefined {\n const render = data.renders.get(name);\n if (render?.svgContent) return render.svgContent;\n if (render?.dom?.tree) return domTreeToSvg(render.dom.tree);\n return undefined;\n}\n\nfunction generateJsxSnippet(name: string, component: ComponentData): string {\n const ownProps = Object.entries(component.props).filter(([, p]) => p.source !== \"inherited\");\n const propStr = ownProps\n .filter(([, p]) => p.required)\n .map(([pName, p]) => {\n if (p.type === \"string\") return `${pName}=\"\"`;\n if (p.type === \"number\") return `${pName}={0}`;\n if (p.type === \"boolean\") return pName;\n return `${pName}={…}`;\n })\n .join(\" \");\n const propsSection = propStr ? ` ${propStr}` : \"\";\n return `import { ${name} } from \"${component.filePath.replace(/\\.tsx?$/, \"\")}\";\\n\\n<${name}${propsSection} />`;\n}\n\nexport function renderIconBrowser(data: SiteData): string {\n const patterns = data.options.iconPatterns;\n const allComponents = Object.entries(data.manifest.components);\n\n const icons = allComponents\n .filter(([, c]) => isIconComponent(c.filePath, c.displayName, patterns))\n .sort(([a], [b]) => a.localeCompare(b));\n\n const iconDataEntries = icons.map(([name, component]) => {\n const svg = getIconSvg(name, data);\n const svgBytes = svg ? new TextEncoder().encode(svg).length : 0;\n const slug = slugify(name);\n const keywords = component.keywords ?? [];\n const usedBy = component.composedBy ?? [];\n const jsx = generateJsxSnippet(name, component);\n const ownProps = Object.entries(component.props)\n .filter(([, p]) => p.source !== \"inherited\")\n .map(([pName, p]) => ({\n name: pName,\n type: p.type,\n rawType: p.rawType,\n required: p.required,\n default: p.default,\n values: p.values,\n }));\n\n return {\n name,\n slug,\n svg: svg ?? \"\",\n svgBytes,\n keywords,\n usedBy,\n jsx,\n props: ownProps,\n filePath: component.filePath,\n };\n });\n\n const iconCards = icons\n .map(([name]) => {\n const svg = getIconSvg(name, data);\n const keywords = (data.manifest.components[name]?.keywords ?? []).join(\" \");\n const slug = slugify(name);\n\n const previewHtml = svg\n ? `<div class=\"icon-cell-svg\">${svg}</div>`\n : `<span class=\"icon-no-preview\">${escapeHtml(name.slice(0, 2))}</span>`;\n\n return `<button class=\"icon-cell\" data-name=\"${escapeHtml(name.toLowerCase())}\" data-slug=\"${slug}\" data-keywords=\"${escapeHtml(keywords.toLowerCase())}\" type=\"button\">\n <div class=\"icon-cell-preview\">${previewHtml}</div>\n <div class=\"icon-cell-name\">${escapeHtml(name)}</div>\n</button>`;\n })\n .join(\"\\n\");\n\n const slideOutPanel = `<div class=\"icon-slideout-overlay\" id=\"icon-slideout-overlay\" hidden></div>\n<div class=\"icon-slideout\" id=\"icon-slideout\" hidden>\n <div class=\"icon-slideout-header\">\n <h2 class=\"icon-slideout-name\" id=\"icon-slideout-name\"></h2>\n <button class=\"icon-slideout-close\" id=\"icon-slideout-close\" type=\"button\" aria-label=\"Close\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>\n </button>\n </div>\n\n <div class=\"icon-slideout-body\">\n <div class=\"icon-slideout-preview-lg\" id=\"icon-slideout-preview-lg\"></div>\n\n <div class=\"icon-detail-section\">\n <div class=\"icon-detail-section-title\">Sizes</div>\n <div class=\"icon-size-row\">\n <div class=\"icon-size-cell\"><div class=\"icon-size-preview\" id=\"icon-size-lg\"></div><span>lg (48)</span></div>\n <div class=\"icon-size-cell\"><div class=\"icon-size-preview\" id=\"icon-size-md\"></div><span>md (32)</span></div>\n <div class=\"icon-size-cell\"><div class=\"icon-size-preview\" id=\"icon-size-sm\"></div><span>sm (24)</span></div>\n <div class=\"icon-size-cell\"><div class=\"icon-size-preview\" id=\"icon-size-xs\"></div><span>xs (16)</span></div>\n </div>\n </div>\n\n <div class=\"icon-detail-section\">\n <div class=\"icon-slideout-actions\">\n <a class=\"icon-action-btn icon-action-primary\" id=\"icon-slideout-link\" href=\"#\">View component page</a>\n <button class=\"icon-action-btn\" id=\"icon-copy-svg\" type=\"button\">Copy SVG</button>\n <button class=\"icon-action-btn\" id=\"icon-copy-jsx\" type=\"button\">Copy JSX</button>\n </div>\n </div>\n\n <div class=\"icon-detail-section\">\n <div class=\"icon-detail-section-title\">Compiled size</div>\n <div class=\"icon-compiled-size\" id=\"icon-compiled-size\"></div>\n </div>\n\n <div class=\"icon-detail-section\" id=\"icon-props-section\" hidden>\n <div class=\"icon-detail-section-title\">Props</div>\n <div id=\"icon-props-list\"></div>\n </div>\n\n <div class=\"icon-detail-section\" id=\"icon-keywords-section\" hidden>\n <div class=\"icon-detail-section-title\">Keywords</div>\n <div class=\"icon-keywords\" id=\"icon-keywords\"></div>\n </div>\n\n <div class=\"icon-detail-section\" id=\"icon-usage-section\" hidden>\n <div class=\"icon-detail-section-title\">Used by</div>\n <div class=\"icon-usage-list\" id=\"icon-usage-list\"></div>\n </div>\n </div>\n</div>`;\n\n const body = `<div class=\"icon-browser\">\n <div class=\"icon-browser-header\">\n <h1>Icons</h1>\n <p>${icons.length} icon${icons.length === 1 ? \"\" : \"s\"}</p>\n <input class=\"search-box\" type=\"search\" id=\"icon-search\" placeholder=\"Search icons…\" style=\"margin-top:12px\" />\n </div>\n <div class=\"icon-grid\" id=\"icon-grid\">\n ${iconCards}\n </div>\n</div>\n${slideOutPanel}\n<script>\n(function () {\n var ICON_DATA = ${JSON.stringify(iconDataEntries)};\n var grid = document.getElementById('icon-grid');\n var search = document.getElementById('icon-search');\n var slideout = document.getElementById('icon-slideout');\n var overlay = document.getElementById('icon-slideout-overlay');\n var closeBtn = document.getElementById('icon-slideout-close');\n var nameEl = document.getElementById('icon-slideout-name');\n var previewLg = document.getElementById('icon-slideout-preview-lg');\n var sizeLg = document.getElementById('icon-size-lg');\n var sizeMd = document.getElementById('icon-size-md');\n var sizeSm = document.getElementById('icon-size-sm');\n var sizeXs = document.getElementById('icon-size-xs');\n var linkEl = document.getElementById('icon-slideout-link');\n var copySvgBtn = document.getElementById('icon-copy-svg');\n var copyJsxBtn = document.getElementById('icon-copy-jsx');\n var compiledSizeEl = document.getElementById('icon-compiled-size');\n var propsSection = document.getElementById('icon-props-section');\n var propsList = document.getElementById('icon-props-list');\n var keywordsSection = document.getElementById('icon-keywords-section');\n var keywordsEl = document.getElementById('icon-keywords');\n var usageSection = document.getElementById('icon-usage-section');\n var usageList = document.getElementById('icon-usage-list');\n var basePath = ${JSON.stringify(data.options.basePath)};\n var currentData = null;\n\n if (!grid) return;\n\n function filter(q) {\n var cells = grid.querySelectorAll('.icon-cell');\n cells.forEach(function (cell) {\n var name = cell.getAttribute('data-name') || '';\n var kw = cell.getAttribute('data-keywords') || '';\n var show = name.includes(q) || kw.includes(q);\n cell.style.display = show ? '' : 'none';\n });\n }\n\n if (search) {\n search.addEventListener('input', function () { filter(search.value.toLowerCase()); });\n }\n\n function setSvgSize(container, svg, px) {\n if (!container || !svg) return;\n container.innerHTML = svg;\n var svgEl = container.querySelector('svg');\n if (svgEl) { svgEl.setAttribute('width', String(px)); svgEl.setAttribute('height', String(px)); }\n }\n\n function openSlideout(slug) {\n var iconData = ICON_DATA.find(function (d) { return d.slug === slug; });\n if (!iconData || !slideout) return;\n currentData = iconData;\n\n if (nameEl) nameEl.textContent = iconData.name;\n if (previewLg) previewLg.innerHTML = iconData.svg;\n\n setSvgSize(sizeLg, iconData.svg, 48);\n setSvgSize(sizeMd, iconData.svg, 32);\n setSvgSize(sizeSm, iconData.svg, 24);\n setSvgSize(sizeXs, iconData.svg, 16);\n\n if (linkEl) linkEl.href = basePath + iconData.slug + '.html';\n\n if (compiledSizeEl) {\n var bytes = iconData.svgBytes;\n var label = bytes < 1024 ? bytes + ' B' : (bytes / 1024).toFixed(1) + ' KB';\n compiledSizeEl.textContent = label;\n }\n\n if (propsSection && propsList) {\n if (iconData.props.length > 0) {\n propsSection.hidden = false;\n propsList.innerHTML = iconData.props.map(function (p) {\n var typeStr = p.values && p.values.length > 0 ? p.values.join(' | ') : p.rawType;\n var reqStr = p.required ? '<span class=\"icon-prop-required\">required</span>' : '<span class=\"icon-prop-optional\">optional</span>';\n var defStr = p.default ? ' <span class=\"icon-prop-default\">' + p.default + '</span>' : '';\n return '<div class=\"icon-prop-row\"><div class=\"icon-prop-name\">' + p.name + '</div><div class=\"icon-prop-type\">' + typeStr + '</div><div class=\"icon-prop-meta\">' + reqStr + defStr + '</div></div>';\n }).join('');\n } else {\n propsSection.hidden = true;\n }\n }\n\n if (keywordsSection && keywordsEl) {\n if (iconData.keywords.length > 0) {\n keywordsSection.hidden = false;\n keywordsEl.innerHTML = iconData.keywords.map(function (kw) {\n return '<span class=\"icon-keyword-tag\">' + kw + '</span>';\n }).join('');\n } else {\n keywordsSection.hidden = true;\n }\n }\n\n if (usageSection && usageList) {\n if (iconData.usedBy.length > 0) {\n usageSection.hidden = false;\n usageList.innerHTML = iconData.usedBy.map(function (u) {\n var uSlug = u.replace(/([A-Z])/g, function (m) { return '-' + m.toLowerCase(); }).replace(/^-/, '').replace(/[^a-z0-9-]/g, '-');\n return '<a class=\"icon-usage-link\" href=\"' + basePath + uSlug + '.html\">' + u + '</a>';\n }).join('');\n } else {\n usageSection.hidden = true;\n }\n }\n\n grid.querySelectorAll('.icon-cell.selected').forEach(function (el) { el.classList.remove('selected'); });\n var activeCell = grid.querySelector('[data-slug=\"' + slug + '\"]');\n if (activeCell) activeCell.classList.add('selected');\n\n slideout.hidden = false;\n if (overlay) overlay.hidden = false;\n }\n\n function closeSlideout() {\n if (slideout) slideout.hidden = true;\n if (overlay) overlay.hidden = true;\n currentData = null;\n grid.querySelectorAll('.icon-cell.selected').forEach(function (el) { el.classList.remove('selected'); });\n }\n\n grid.addEventListener('click', function (e) {\n var cell = e.target.closest('.icon-cell');\n if (!cell) return;\n var slug = cell.getAttribute('data-slug');\n if (slug) openSlideout(slug);\n });\n\n if (closeBtn) closeBtn.addEventListener('click', closeSlideout);\n if (overlay) overlay.addEventListener('click', closeSlideout);\n document.addEventListener('keydown', function (e) { if (e.key === 'Escape') closeSlideout(); });\n\n function copyToClipboard(text, btn) {\n navigator.clipboard.writeText(text).then(function () {\n var orig = btn.textContent;\n btn.textContent = 'Copied!';\n setTimeout(function () { btn.textContent = orig; }, 1500);\n });\n }\n\n if (copySvgBtn) {\n copySvgBtn.addEventListener('click', function () {\n if (currentData && currentData.svg) copyToClipboard(currentData.svg, copySvgBtn);\n });\n }\n if (copyJsxBtn) {\n copyJsxBtn.addEventListener('click', function () {\n if (currentData && currentData.jsx) copyToClipboard(currentData.jsx, copyJsxBtn);\n });\n }\n})();\n</script>`;\n\n const sidebar = sidebarLinks(data, \"icons\");\n\n return htmlShell({\n title: `Icons — ${data.options.title}`,\n body,\n sidebar,\n onThisPage: '<a href=\"#top\">Icon Browser</a>',\n basePath: data.options.basePath,\n searchItems: buildSearchItems(data),\n breadcrumbs: [{ label: \"Icons\" }],\n });\n}\n","import type { SiteData, TokenEntry } from \"../types.js\";\nimport { escapeHtml } from \"../utils.js\";\nimport { buildSearchItems, htmlShell, sidebarLinks } from \"./layout.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst HEX_RE = /^#(?:[0-9a-fA-F]{3,8})$/;\nconst COLOR_FN_RE = /^(?:rgba?|hsla?|oklch|oklab|lch|lab|color|hwb)\\(/;\n\nfunction isColorValue(value: string): boolean {\n return HEX_RE.test(value) || COLOR_FN_RE.test(value);\n}\n\n/**\n * Estimate perceived luminance (0–1) from a CSS color value.\n * Handles hex, rgb/rgba, oklch, and hsl/hsla.\n * Returns null if the format can't be parsed.\n */\nfunction estimateLuminance(value: string): number | null {\n const v = value.trim();\n\n // Hex\n if (HEX_RE.test(v)) {\n const c = v.replace(\"#\", \"\");\n const full =\n c.length <= 4\n ? c\n .slice(0, 3)\n .split(\"\")\n .map((ch) => ch + ch)\n .join(\"\")\n : c.slice(0, 6);\n const r = parseInt(full.slice(0, 2), 16);\n const g = parseInt(full.slice(2, 4), 16);\n const b = parseInt(full.slice(4, 6), 16);\n if (Number.isNaN(r) || Number.isNaN(g) || Number.isNaN(b)) return null;\n return (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n }\n\n // rgb/rgba — rgb(r, g, b) or rgba(r, g, b, a)\n const rgbMatch = v.match(/^rgba?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)/);\n if (rgbMatch) {\n const r = parseFloat(rgbMatch[1] ?? \"0\");\n const g = parseFloat(rgbMatch[2] ?? \"0\");\n const b = parseFloat(rgbMatch[3] ?? \"0\");\n // Also consider alpha — low alpha on any background is effectively transparent\n const alphaMatch = v.match(/,\\s*([\\d.]+)\\s*\\)$/);\n const alpha = alphaMatch ? parseFloat(alphaMatch[1] ?? \"1\") : 1;\n // Blend with white background for luminance estimation\n const blendR = r * alpha + 255 * (1 - alpha);\n const blendG = g * alpha + 255 * (1 - alpha);\n const blendB = b * alpha + 255 * (1 - alpha);\n return (0.299 * blendR + 0.587 * blendG + 0.114 * blendB) / 255;\n }\n\n // oklch(L C H) — L is perceptual lightness 0–1\n const oklchMatch = v.match(/^oklch\\(\\s*([\\d.]+)/);\n if (oklchMatch) {\n const L = parseFloat(oklchMatch[1] ?? \"0.5\");\n return L;\n }\n\n // oklab(L a b) — L is perceptual lightness 0–1\n const oklabMatch = v.match(/^oklab\\(\\s*([\\d.]+)/);\n if (oklabMatch) {\n return parseFloat(oklabMatch[1] ?? \"0.5\");\n }\n\n // hsl/hsla — hsl(h, s%, l%) — l is lightness 0–100\n const hslMatch = v.match(/^hsla?\\(\\s*[\\d.]+\\s*,\\s*[\\d.]+%\\s*,\\s*([\\d.]+)%/);\n if (hslMatch) {\n return parseFloat(hslMatch[1] ?? \"50\") / 100;\n }\n\n // color-mix — rough heuristic based on percentage\n const colorMixMatch = v.match(/^color-mix\\(.*black\\s+([\\d.]+)%/);\n if (colorMixMatch) {\n const blackPct = parseFloat(colorMixMatch[1] ?? \"50\") / 100;\n return 1 - blackPct;\n }\n\n return null;\n}\n\nfunction contrastColor(value: string): string {\n const lum = estimateLuminance(value);\n if (lum === null) return \"#fff\";\n return lum > 0.55 ? \"#000\" : \"#fff\";\n}\n\ninterface TokenGroup {\n name: string;\n tokens: TokenEntry[];\n}\n\nfunction groupByTopLevel(tokens: TokenEntry[]): TokenGroup[] {\n const map = new Map<string, TokenEntry[]>();\n\n for (const token of tokens) {\n const top = token.path.split(\".\")[0] ?? \"other\";\n if (!map.has(top)) map.set(top, []);\n map.get(top)?.push(token);\n }\n\n return Array.from(map.entries()).map(([name, toks]) => ({ name, tokens: toks }));\n}\n\n// ---------------------------------------------------------------------------\n// Color section — renders swatches in scale rows\n// ---------------------------------------------------------------------------\n\nfunction renderSwatch(token: TokenEntry, darkValue?: string): string {\n const label = token.path.split(\".\").pop() ?? \"\";\n const fg = contrastColor(token.value);\n const darkHtml = darkValue\n ? (() => {\n const darkFg = contrastColor(darkValue);\n return `<div class=\"tb-swatch-dark\" style=\"background:${escapeHtml(darkValue)};color:${darkFg}\" title=\"dark: ${escapeHtml(darkValue)}\">\n <span class=\"tb-swatch-value\">${escapeHtml(darkValue)}</span>\n</div>`;\n })()\n : \"\";\n\n return `<div class=\"tb-swatch-pair\" title=\"${escapeHtml(token.path)}: ${escapeHtml(token.value)}\">\n <div class=\"tb-swatch\" style=\"background:${escapeHtml(token.value)};color:${fg}\">\n <span class=\"tb-swatch-label\">${escapeHtml(label)}</span>\n <span class=\"tb-swatch-value\">${escapeHtml(token.value)}</span>\n </div>${darkHtml}\n</div>`;\n}\n\nfunction renderColorGroup(group: TokenGroup, darkOverrides?: Record<string, string>): string {\n const subgroups = new Map<string, TokenEntry[]>();\n const standalone: TokenEntry[] = [];\n\n for (const token of group.tokens) {\n const parts = token.path.split(\".\");\n if (parts.length >= 3) {\n const sub = parts.slice(0, 2).join(\".\");\n if (!subgroups.has(sub)) subgroups.set(sub, []);\n subgroups.get(sub)?.push(token);\n } else {\n standalone.push(token);\n }\n }\n\n const scaleHtml = Array.from(subgroups.entries())\n .map(([scaleName, tokens]) => {\n const hasDark = tokens.some((t) => darkOverrides?.[t.path] !== undefined);\n const swatches = tokens.map((t) => renderSwatch(t, darkOverrides?.[t.path])).join(\"\\n\");\n\n const displayName = scaleName.split(\".\").pop() ?? scaleName;\n const darkLabel = hasDark ? `<span class=\"tb-scale-badge\">dark</span>` : \"\";\n return `<div class=\"tb-scale\">\n <div class=\"tb-scale-name\">${escapeHtml(displayName)}${darkLabel}</div>\n <div class=\"tb-scale-row\">${swatches}</div>\n</div>`;\n })\n .join(\"\\n\");\n\n const standaloneHtml =\n standalone.length > 0\n ? `<div class=\"tb-standalone-colors\">${standalone\n .map((t) => {\n const label = t.path.split(\".\").pop() ?? t.path;\n const darkVal = darkOverrides?.[t.path];\n const fg = contrastColor(t.value);\n\n let darkPart = \"\";\n if (darkVal) {\n const darkFg = contrastColor(darkVal);\n darkPart = `<div class=\"tb-swatch-dark-single\" style=\"background:${escapeHtml(darkVal)};color:${darkFg}\" title=\"dark: ${escapeHtml(darkVal)}\"><span class=\"tb-swatch-value\">${escapeHtml(darkVal)}</span></div>`;\n }\n\n return `<div class=\"tb-swatch-pair-single\">\n <div class=\"tb-swatch tb-swatch-single\" style=\"background:${escapeHtml(t.value)};color:${fg}\" title=\"${escapeHtml(t.path)}: ${escapeHtml(t.value)}\">\n <span class=\"tb-swatch-label\">${escapeHtml(label)}</span>\n <span class=\"tb-swatch-value\">${escapeHtml(t.value)}</span>\n </div>${darkPart}\n</div>`;\n })\n .join(\"\\n\")}</div>`\n : \"\";\n\n return `<div class=\"tb-section\" id=\"tb-${escapeHtml(group.name)}\">\n <h2 class=\"tb-section-title\">${escapeHtml(group.name)}</h2>\n ${scaleHtml}${standaloneHtml}\n</div>`;\n}\n\n// ---------------------------------------------------------------------------\n// Spacing / dimension section\n// ---------------------------------------------------------------------------\n\nfunction renderSpacingGroup(group: TokenGroup): string {\n const rows = group.tokens\n .map((t) => {\n const label = t.path.split(\".\").slice(1).join(\".\") || t.path;\n return `<div class=\"tb-spacing-row\">\n <div class=\"tb-spacing-label\">${escapeHtml(label)}</div>\n <div class=\"tb-spacing-value\">${escapeHtml(t.value)}</div>\n <div class=\"tb-spacing-bar-wrapper\"><div class=\"tb-spacing-bar\" style=\"width:min(${escapeHtml(t.value)}, 100%)\"></div></div>\n</div>`;\n })\n .join(\"\\n\");\n\n return `<div class=\"tb-section\" id=\"tb-${escapeHtml(group.name)}\">\n <h2 class=\"tb-section-title\">${escapeHtml(group.name)}</h2>\n ${rows}\n</div>`;\n}\n\n// ---------------------------------------------------------------------------\n// Typography section\n// ---------------------------------------------------------------------------\n\nfunction renderTypographyGroup(group: TokenGroup): string {\n const rows = group.tokens\n .map((t) => {\n const label = t.path.split(\".\").slice(1).join(\".\") || t.path;\n const sampleStyle =\n t.type === \"fontFamily\"\n ? `font-family:${escapeHtml(t.value)}`\n : t.type === \"dimension\"\n ? `font-size:${escapeHtml(t.value)}`\n : \"\";\n\n return `<div class=\"tb-typo-row\">\n <div class=\"tb-typo-label\">${escapeHtml(label)}</div>\n <div class=\"tb-typo-value\">${escapeHtml(t.value)}</div>\n ${sampleStyle ? `<div class=\"tb-typo-sample\" style=\"${sampleStyle}\">Aa</div>` : \"\"}\n</div>`;\n })\n .join(\"\\n\");\n\n return `<div class=\"tb-section\" id=\"tb-${escapeHtml(group.name)}\">\n <h2 class=\"tb-section-title\">${escapeHtml(group.name)}</h2>\n ${rows}\n</div>`;\n}\n\n// ---------------------------------------------------------------------------\n// Generic table section (durations, shadows, etc.)\n// ---------------------------------------------------------------------------\n\nfunction renderGenericGroup(group: TokenGroup, darkOverrides?: Record<string, string>): string {\n const isAllColors = group.tokens.every((t) => isColorValue(t.value));\n\n if (isAllColors) return renderColorGroup(group, darkOverrides);\n\n const hasDarkColumn = group.tokens.some((t) => darkOverrides?.[t.path] !== undefined);\n\n const rows = group.tokens\n .map((t) => {\n const label = t.path.split(\".\").slice(1).join(\".\") || t.path;\n const swatchHtml = isColorValue(t.value)\n ? `<span class=\"token-value-swatch\" style=\"background:${escapeHtml(t.value)}\"></span>`\n : \"\";\n\n const darkVal = darkOverrides?.[t.path];\n const darkCell = hasDarkColumn\n ? `<td class=\"tb-generic-value\">${darkVal ? `${isColorValue(darkVal) ? `<span class=\"token-value-swatch\" style=\"background:${escapeHtml(darkVal)}\"></span>` : \"\"}${escapeHtml(darkVal)}` : `<span style=\"color:var(--color-muted)\">—</span>`}</td>`\n : \"\";\n\n return `<tr>\n <td class=\"tb-generic-path\">${escapeHtml(label)}</td>\n <td class=\"tb-generic-value\">${swatchHtml}${escapeHtml(t.value)}</td>\n ${darkCell}\n <td class=\"tb-generic-type\">${escapeHtml(t.type)}</td>\n</tr>`;\n })\n .join(\"\\n\");\n\n const darkHeader = hasDarkColumn ? \"<th>Dark</th>\" : \"\";\n\n return `<div class=\"tb-section\" id=\"tb-${escapeHtml(group.name)}\">\n <h2 class=\"tb-section-title\">${escapeHtml(group.name)}</h2>\n <table class=\"tb-generic-table\">\n <thead><tr><th>Token</th><th>Value</th>${darkHeader}<th>Type</th></tr></thead>\n <tbody>${rows}</tbody>\n </table>\n</div>`;\n}\n\n// ---------------------------------------------------------------------------\n// Main render\n// ---------------------------------------------------------------------------\n\nfunction renderGroup(group: TokenGroup, darkOverrides?: Record<string, string>): string {\n const allTypes = new Set(group.tokens.map((t) => t.type));\n const allColors = group.tokens.every((t) => t.type === \"color\" || isColorValue(t.value));\n const allDimensions = group.tokens.every((t) => t.type === \"dimension\");\n const hasTypography = allTypes.has(\"fontFamily\") || allTypes.has(\"fontWeight\");\n\n if (allColors && group.tokens.length > 0) return renderColorGroup(group, darkOverrides);\n if (allDimensions && group.tokens.length > 0) return renderSpacingGroup(group);\n if (hasTypography) return renderTypographyGroup(group);\n return renderGenericGroup(group, darkOverrides);\n}\n\nexport function renderTokenBrowser(data: SiteData): string {\n const tokens = data.tokenEntries ?? [];\n\n if (tokens.length === 0) {\n const body = `<div class=\"tb-header\">\n <h1>Design Tokens</h1>\n <p>No tokens loaded. Run <code>scope tokens init</code> to generate a token file, then pass <code>--tokens</code> to <code>scope site build</code>.</p>\n</div>`;\n\n return htmlShell({\n title: `Tokens — ${data.options.title}`,\n body,\n sidebar: sidebarLinks(data, \"tokens\"),\n onThisPage: \"\",\n basePath: data.options.basePath,\n searchItems: buildSearchItems(data),\n breadcrumbs: [{ label: \"Tokens\" }],\n });\n }\n\n const groups = groupByTopLevel(tokens);\n\n // Merge all theme overrides into a flat dark overrides map\n const themes = data.tokenThemes ?? {};\n const darkOverrides: Record<string, string> = {\n ...themes[\"dark\"],\n ...themes[\"dark-high-contrast\"],\n };\n const darkCount = Object.keys(darkOverrides).length;\n\n const colorGroups = groups.filter((g) =>\n g.tokens.every((t) => t.type === \"color\" || isColorValue(t.value)),\n );\n const otherGroups = groups.filter(\n (g) => !g.tokens.every((t) => t.type === \"color\" || isColorValue(t.value)),\n );\n\n const totalColors = colorGroups.reduce((sum, g) => sum + g.tokens.length, 0);\n const totalOther = otherGroups.reduce((sum, g) => sum + g.tokens.length, 0);\n\n const meta = data.tokenMeta;\n const subtitle = meta?.name ? ` — ${escapeHtml(meta.name)}` : \"\";\n const lastUpdated = meta?.lastUpdated\n ? `<span class=\"tb-updated\">Last updated: ${escapeHtml(meta.lastUpdated)}</span>`\n : \"\";\n\n const darkStatCard =\n darkCount > 0\n ? `<div class=\"stat-card\"><div class=\"stat-label\">Dark Overrides</div><div class=\"stat-value\">${darkCount}</div></div>`\n : \"\";\n\n const statsHtml = `<div class=\"stats-grid\" style=\"margin-bottom:32px\">\n <div class=\"stat-card\"><div class=\"stat-label\">Total Tokens</div><div class=\"stat-value\">${tokens.length}</div></div>\n <div class=\"stat-card\"><div class=\"stat-label\">Colors</div><div class=\"stat-value\">${totalColors}</div></div>\n <div class=\"stat-card\"><div class=\"stat-label\">Other</div><div class=\"stat-value\">${totalOther}</div></div>\n <div class=\"stat-card\"><div class=\"stat-label\">Groups</div><div class=\"stat-value\">${groups.length}</div></div>\n ${darkStatCard}\n</div>`;\n\n const searchHtml = `<input class=\"search-box\" type=\"search\" id=\"tb-search\" placeholder=\"Search tokens…\" style=\"margin-bottom:24px;width:100%;max-width:400px\" />`;\n\n const sectionsHtml = groups\n .map((g) => renderGroup(g, darkCount > 0 ? darkOverrides : undefined))\n .join(\"\\n\");\n\n const onThisPage = groups\n .map(\n (g) =>\n `<a href=\"#tb-${escapeHtml(g.name)}\">${escapeHtml(g.name)} <span style=\"opacity:0.5;font-size:10px\">(${g.tokens.length})</span></a>`,\n )\n .join(\"\\n\");\n\n const body = `<div class=\"tb-header\">\n <h1>Design Tokens${subtitle}</h1>\n <p>${tokens.length} tokens across ${groups.length} groups${lastUpdated ? ` · ${lastUpdated}` : \"\"}</p>\n</div>\n${statsHtml}\n${searchHtml}\n<div id=\"tb-sections\">\n${sectionsHtml}\n</div>\n<script>\n(function () {\n var search = document.getElementById('tb-search');\n var sections = document.getElementById('tb-sections');\n if (!search || !sections) return;\n\n search.addEventListener('input', function () {\n var q = search.value.toLowerCase();\n var swatches = sections.querySelectorAll('.tb-swatch, .tb-spacing-row, .tb-typo-row, .tb-generic-table tr');\n var sectionEls = sections.querySelectorAll('.tb-section');\n\n if (!q) {\n swatches.forEach(function (el) { el.style.display = ''; });\n sectionEls.forEach(function (el) { el.style.display = ''; });\n return;\n }\n\n swatches.forEach(function (el) {\n var title = (el.getAttribute('title') || el.textContent || '').toLowerCase();\n el.style.display = title.includes(q) ? '' : 'none';\n });\n\n sectionEls.forEach(function (sec) {\n var visible = sec.querySelectorAll('.tb-swatch:not([style*=\"display: none\"]), .tb-spacing-row:not([style*=\"display: none\"]), .tb-typo-row:not([style*=\"display: none\"]), .tb-generic-table tr:not([style*=\"display: none\"])');\n sec.style.display = visible.length > 0 ? '' : 'none';\n });\n });\n})();\n</script>`;\n\n return htmlShell({\n title: `Tokens — ${data.options.title}`,\n body,\n sidebar: sidebarLinks(data, \"tokens\"),\n onThisPage,\n basePath: data.options.basePath,\n searchItems: buildSearchItems(data),\n breadcrumbs: [{ label: \"Tokens\" }],\n });\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { normalizeOptions, readSiteData } from \"./reader.js\";\nimport { renderComponentDetail } from \"./templates/component-detail.js\";\nimport { renderComponentIndex } from \"./templates/component-index.js\";\nimport { renderDashboard } from \"./templates/dashboard.js\";\nimport { renderIconBrowser } from \"./templates/icon-browser.js\";\nimport { renderTokenBrowser } from \"./templates/token-browser.js\";\nimport type { SiteOptions } from \"./types.js\";\nimport { slugify } from \"./utils.js\";\n\nexport async function buildSite(options?: SiteOptions): Promise<void> {\n const normalizedOptions = normalizeOptions(options);\n\n console.log(`[scope/site] Reading data from ${normalizedOptions.inputDir}…`);\n const data = await readSiteData(normalizedOptions);\n\n const componentNames = Object.keys(data.manifest.components);\n console.log(`[scope/site] Found ${componentNames.length} components.`);\n\n // Create output directory\n await mkdir(normalizedOptions.outputDir, { recursive: true });\n\n // Generate component detail pages\n for (const name of componentNames) {\n const slug = slugify(name);\n const html = renderComponentDetail(name, data);\n const outputPath = join(normalizedOptions.outputDir, `${slug}.html`);\n await writeFile(outputPath, html, \"utf-8\");\n console.log(`[scope/site] ✓ ${name} → ${slug}.html`);\n }\n\n // Generate index page\n const indexHtml = renderComponentIndex(data);\n await writeFile(join(normalizedOptions.outputDir, \"index.html\"), indexHtml, \"utf-8\");\n console.log(`[scope/site] ✓ index.html`);\n\n // Generate dashboard page\n const dashboardHtml = renderDashboard(data);\n await writeFile(join(normalizedOptions.outputDir, \"dashboard.html\"), dashboardHtml, \"utf-8\");\n console.log(`[scope/site] ✓ dashboard.html`);\n\n // Generate icon browser page (when icon patterns are configured)\n let extraPages = 0;\n if (normalizedOptions.iconPatterns.length > 0) {\n const iconsHtml = renderIconBrowser(data);\n await writeFile(join(normalizedOptions.outputDir, \"icons.html\"), iconsHtml, \"utf-8\");\n console.log(`[scope/site] ✓ icons.html`);\n extraPages++;\n }\n\n // Generate token browser page (when token file is provided)\n if (data.tokenEntries && data.tokenEntries.length > 0) {\n const tokensHtml = renderTokenBrowser(data);\n await writeFile(join(normalizedOptions.outputDir, \"tokens.html\"), tokensHtml, \"utf-8\");\n console.log(`[scope/site] ✓ tokens.html (${data.tokenEntries.length} tokens)`);\n extraPages++;\n }\n\n console.log(\n `[scope/site] Done. Site written to ${normalizedOptions.outputDir} (${componentNames.length + 2 + extraPages} files).`,\n );\n}\n"]}
|