@bridge-ds/core 0.4.0 → 0.5.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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/node/git-local.ts","../../src/node/git-history.ts","../../src/node/audit.ts","../../src/node/spec-css.ts","../../src/node/component-specs.ts"],"sourcesContent":["// Local git through plumbing commands (Node only). A proposal becomes a commit on a new branch without\n// touching the working tree, the index or the checked-out branch, and nothing is ever pushed.\nimport { execFile } from 'node:child_process';\nimport { mkdtemp, rm } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { type BranchRules, assertSafeBranch } from '../governance';\n\nexport function git(root: string, args: string[], opts: { input?: string; env?: Record<string, string> } = {}): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = execFile('git', args, { cwd: root, env: { ...process.env, ...opts.env }, maxBuffer: 32 * 1024 * 1024 }, (err, stdout, stderr) => {\n if (err) reject(new Error(`git ${args.join(' ')}: ${stderr || err.message}`.trim()));\n else resolve(stdout);\n });\n if (opts.input !== undefined) child.stdin!.end(opts.input);\n });\n}\n\nexport async function isGitRepo(root: string): Promise<boolean> {\n try {\n return (await git(root, ['rev-parse', '--is-inside-work-tree'])).trim() === 'true';\n } catch {\n return false;\n }\n}\n\nexport async function currentBranch(root: string): Promise<string> {\n return (await git(root, ['rev-parse', '--abbrev-ref', 'HEAD'])).trim();\n}\n\nexport async function branchExists(root: string, branch: string): Promise<boolean> {\n try {\n await git(root, ['rev-parse', '--verify', '--quiet', `refs/heads/${branch}`]);\n return true;\n } catch {\n return false;\n }\n}\n\n/** File text at a ref, or null when it does not exist there. */\nexport async function showFile(root: string, ref: string, path: string): Promise<string | null> {\n try {\n return await git(root, ['show', `${ref}:${path}`]);\n } catch {\n return null;\n }\n}\n\nexport async function listFilesAt(root: string, ref: string): Promise<string[]> {\n return (await git(root, ['ls-tree', '-r', '--name-only', ref])).split('\\n').filter(Boolean);\n}\n\n/** \"owner/name\" of the origin remote when it is on github.com. */\nexport async function originRepo(root: string): Promise<string | undefined> {\n try {\n const url = (await git(root, ['remote', 'get-url', 'origin'])).trim();\n return /github\\.com[:/]([\\w.-]+\\/[\\w.-]+?)(\\.git)?$/.exec(url)?.[1];\n } catch {\n return undefined;\n }\n}\n\nexport interface LocalCommitInput extends BranchRules {\n /** Ref the commit builds on (\"HEAD\", a branch or a sha). */\n base: string;\n branch: string;\n message: string;\n files: { path: string; content: string | null }[];\n}\n\n/**\n * Commits `files` on top of `base` into the new branch `branch` using a throwaway index. Refuses protected\n * branches (and, with branchPrefix, branches without it) and existing branches: nothing is ever overwritten.\n */\nexport async function commitToNewLocalBranch(root: string, args: LocalCommitInput): Promise<{ sha: string; diff: string }> {\n try {\n assertSafeBranch(args.branch, args);\n } catch (err) {\n throw new Error(`Refusing to write branch \"${args.branch}\": ${(err as Error).message}`);\n }\n if (await branchExists(root, args.branch)) throw new Error(`Branch \"${args.branch}\" already exists. Pick another title or delete it first.`);\n const baseSha = (await git(root, ['rev-parse', '--verify', `${args.base}^{commit}`])).trim();\n const dir = await mkdtemp(join(tmpdir(), 'bridge-index-'));\n const env = { GIT_INDEX_FILE: join(dir, 'index') };\n try {\n await git(root, ['read-tree', baseSha], { env });\n for (const f of args.files) {\n if (f.content === null) {\n await git(root, ['update-index', '--force-remove', f.path], { env });\n continue;\n }\n const blob = (await git(root, ['hash-object', '-w', '--stdin'], { input: f.content })).trim();\n await git(root, ['update-index', '--add', '--cacheinfo', `100644,${blob},${f.path}`], { env });\n }\n const tree = (await git(root, ['write-tree'], { env })).trim();\n const ident = await identityEnv(root);\n const sha = (await git(root, ['commit-tree', tree, '-p', baseSha, '-F', '-'], { input: args.message, env: ident })).trim();\n // Empty old value: create only, fail if the ref appeared meanwhile.\n await git(root, ['update-ref', `refs/heads/${args.branch}`, sha, '']);\n const diff = await git(root, ['diff', baseSha, sha]);\n return { sha, diff };\n } finally {\n await rm(dir, { recursive: true, force: true });\n }\n}\n\nasync function identityEnv(root: string): Promise<Record<string, string>> {\n const get = async (k: string) => (await git(root, ['config', k]).catch(() => '')).trim();\n const name = (await get('user.name')) || 'Bridge';\n const email = (await get('user.email')) || 'bridge@users.noreply.github.com';\n return { GIT_AUTHOR_NAME: name, GIT_AUTHOR_EMAIL: email, GIT_COMMITTER_NAME: name, GIT_COMMITTER_EMAIL: email };\n}\n","// History from a local git repository (Node only): first-parent commits of a ref that touched the tokens\n// root, so a merged branch is one entry (the merge commit against the base it merged into). PR numbers come\n// from merge and squash subjects. Blobs are read once per sha.\nimport { type BridgeConfig } from '../config';\nimport { type HistoryBackend, type HistoryCommit, type HistoryReport, buildReport, collectHistory, mergeReleases, packageDirCandidates, parseChangelog, prNumberFromSubject, releasesFromTags } from '../history';\nimport { selectTokenFiles } from '../layered';\nimport { git, showFile } from './git-local';\n\nconst US = '\\u001f';\nconst RS = '\\u001e';\n\nexport function localGitHistoryBackend(root: string, config: BridgeConfig): HistoryBackend {\n const trees = new Map<string, Promise<{ path: string; sha: string }[]>>();\n const blobs = new Map<string, Promise<string>>();\n const tokenRoot = config.tokens.root.replace(/\\/$/, '');\n const prefix = tokenRoot === '.' || !tokenRoot ? '' : `${tokenRoot}/`;\n const lsTree = (sha: string, path: string) => {\n const k = `${sha}:${path}`;\n let t = trees.get(k);\n if (!t) {\n t = git(root, ['ls-tree', '-r', sha, '--', path || '.']).then((out) =>\n out\n .split('\\n')\n .filter(Boolean)\n .map((l) => {\n const [meta, p] = l.split('\\t');\n return { path: p!, sha: meta!.split(' ')[2]! };\n }),\n );\n trees.set(k, t);\n }\n return t;\n };\n const blob = (sha: string) => {\n let b = blobs.get(sha);\n if (!b) {\n b = git(root, ['cat-file', 'blob', sha]);\n blobs.set(sha, b);\n }\n return b;\n };\n return {\n async listCommits({ ref, paths, limit }) {\n const fmt = ['%H', '%P', '%cI', '%an', '%s', '%b'].join(US) + RS;\n const out = await git(root, ['log', '--first-parent', `-n${limit}`, `--format=${fmt}`, ref, '--', ...(paths.length ? paths : ['.'])]);\n return out\n .split(RS)\n .map((r) => r.replace(/^\\n/, ''))\n .filter((r) => r.trim())\n .map((r): HistoryCommit => {\n const [sha, parents, date, author, subject, body] = r.split(US);\n const n = prNumberFromSubject(subject ?? '');\n return { sha: sha!, parents: (parents ?? '').split(' ').filter(Boolean), date: date!, author: author!, subject: subject ?? '', body: (body ?? '').trim(), ...(n ? { pr: { number: n, title: '' } } : {}) };\n })\n .map((c) => (c.pr && !c.pr.title ? { ...c, pr: undefined } : c))\n .map((c) => {\n const { pr, ...rest } = c;\n return pr ? c : rest;\n });\n },\n async tokenFiles(sha) {\n const entries = await lsTree(sha, tokenRoot === '.' ? '' : tokenRoot);\n const picked = new Set(selectTokenFiles(config, entries.map((e) => e.path)));\n const wanted = entries.filter((e) => picked.has(prefix ? e.path.slice(prefix.length) : e.path));\n return new Map(await Promise.all(wanted.map(async (e) => [prefix ? e.path.slice(prefix.length) : e.path, await blob(e.sha)] as const)));\n },\n async changesetPaths(sha) {\n const dir = config.changesets?.dir.replace(/\\/$/, '');\n return dir ? (await lsTree(sha, dir)).map((e) => e.path) : [];\n },\n async readFile(sha, path) {\n return showFile(root, sha, path);\n },\n };\n}\n\n/** Tags with their commit and date: `v1.2.0`, `@scope/pkg@1.2.0`. */\nexport async function localTags(root: string): Promise<{ name: string; sha: string; date: string }[]> {\n const out = await git(root, ['for-each-ref', 'refs/tags', '--format=%(refname:short)%09%(*objectname)%09%(objectname)%09%(creatordate:iso-strict)']).catch(() => '');\n return out\n .split('\\n')\n .filter(Boolean)\n .map((l) => {\n const [name, peeled, obj, date] = l.split('\\t');\n return { name: name!, sha: peeled || obj!, date: date! };\n });\n}\n\n/** The whole history report for a local repo at `ref` (default HEAD). */\nexport async function loadLocalHistory(root: string, config: BridgeConfig, opts: { ref?: string; limit?: number } = {}): Promise<HistoryReport> {\n const ref = opts.ref ?? 'HEAD';\n const limit = opts.limit ?? 40;\n const backend = localGitHistoryBackend(root, config);\n let listed = 0;\n const counted: HistoryBackend = {\n ...backend,\n listCommits: async (o) => {\n const r = await backend.listCommits(o);\n listed = r.length;\n return r;\n },\n };\n // A shallow clone (CI, Vercel) has a cut history: read what is there.\n const entries = await collectHistory(config, counted, { ref, limit });\n let changelog: ReturnType<typeof parseChangelog> = [];\n let currentVersion: string | undefined;\n for (const dir of packageDirCandidates(config)) {\n const p = (f: string) => (dir ? `${dir}/${f}` : f);\n const [cl, pkg] = await Promise.all([showFile(root, ref, p('CHANGELOG.md')), showFile(root, ref, p('package.json'))]);\n if (cl === null && pkg === null) continue;\n if (cl) changelog = parseChangelog(cl);\n if (pkg) {\n try {\n const json = JSON.parse(pkg) as { name?: string; version?: string };\n if (!config.changesets || json.name === config.changesets.package) currentVersion = json.version;\n } catch {\n /* not JSON */\n }\n }\n break;\n }\n const releases = mergeReleases(changelog, releasesFromTags(await localTags(root), config.changesets?.package));\n return buildReport({ source: 'git', label: `${root}@${ref}`, ref, entries, releases, ...(currentVersion ? { currentVersion } : {}), truncated: listed >= limit });\n}\n","// Node side of `bridge audit`: load the design system from its repo and read a product folder from disk.\nimport { existsSync, readdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';\nimport { dirname, join, relative, resolve, sep } from 'node:path';\nimport { loadConfig, type BridgeConfig } from '../config';\nimport { globToRegExp, LayeredTokenSet, selectTokenFiles } from '../layered';\nimport { AUDIT_IGNORE_DIRS, buildAuditReport, compareWithBaseline, isAuditable, planCssFixes, type CssFixEdit } from '../audit/report';\nimport { DesignSystemIndex } from '../audit/ds-index';\nimport type { AuditReport } from '../audit/types';\n\nexport interface LoadedDesignSystem {\n root: string;\n config: BridgeConfig;\n set: LayeredTokenSet;\n index: DesignSystemIndex;\n}\n\nconst toPosix = (p: string) => p.split(sep).join('/');\n\nfunction walk(dir: string, root: string, out: string[], skipDirs: string[]): void {\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return;\n }\n for (const name of entries) {\n const abs = join(dir, name);\n let st;\n try {\n st = statSync(abs);\n } catch {\n continue;\n }\n if (st.isDirectory()) {\n if (!skipDirs.includes(name)) walk(abs, root, out, skipDirs);\n } else out.push(toPosix(relative(root, abs)));\n }\n}\n\n/** Nearest folder at or above `from` with a bridge.config.json. */\nexport function findDesignSystemRoot(from: string): string | undefined {\n let dir = resolve(from);\n for (;;) {\n if (existsSync(join(dir, 'bridge.config.json'))) return dir;\n const up = dirname(dir);\n if (up === dir) return undefined;\n dir = up;\n }\n}\n\nconst cache = new Map<string, LoadedDesignSystem>();\n\n/** Design system at `root` (a repo with bridge.config.json): tokens in every mode, components, packages. Cached per root. */\nexport function loadDesignSystem(root: string, opts: { fresh?: boolean } = {}): LoadedDesignSystem {\n const abs = resolve(root);\n const hit = cache.get(abs);\n if (hit && !opts.fresh) return hit;\n const cfgPath = join(abs, 'bridge.config.json');\n if (!existsSync(cfgPath)) throw new Error(`No bridge.config.json in ${abs}: pass the design system repo (--ds <dir>) or run bridge init there.`);\n const config = loadConfig(readFileSync(cfgPath, 'utf8'));\n const tokensRoot = config.tokens.root.replace(/\\/$/, '');\n const listed: string[] = [];\n walk(join(abs, tokensRoot === '.' ? '' : tokensRoot), abs, listed, ['node_modules', '.git', 'dist']);\n const files = new Map<string, string>();\n for (const f of selectTokenFiles(config, listed)) files.set(f, readFileSync(join(abs, tokensRoot === '.' ? '' : tokensRoot, f), 'utf8'));\n const set = new LayeredTokenSet(config, files);\n const components: string[] = [];\n let packages = config.audit?.packages;\n if (config.components) {\n const dir = join(abs, config.components.dir);\n if (existsSync(dir)) for (const name of readdirSync(dir)) if (/^[A-Z][A-Za-z0-9]*$/.test(name) && statSync(join(dir, name)).isDirectory()) components.push(name);\n if (!packages) {\n packages = ['@bridge-ds/react'];\n for (let d = dir; d.startsWith(abs) && d !== abs; d = dirname(d)) {\n const pj = join(d, 'package.json');\n if (existsSync(pj)) {\n const name = (JSON.parse(readFileSync(pj, 'utf8')) as { name?: string }).name;\n if (name && !packages.includes(name)) packages.unshift(name);\n break;\n }\n }\n }\n }\n const index = new DesignSystemIndex(set, {\n packages: packages ?? ['@bridge-ds/react'],\n components: components.sort(),\n ...(config.audit?.foreignLibraries ? { foreignLibraries: config.audit.foreignLibraries } : {}),\n ...(config.audit?.nativeElements ? { nativeElements: config.audit.nativeElements } : {}),\n });\n const loaded = { root: abs, config, set, index };\n cache.set(abs, loaded);\n return loaded;\n}\n\n/** Auditable files under `target` (a folder or a single file), repo-relative to it. */\nexport function collectAuditFiles(target: string, exclude: string[] = []): { root: string; files: { path: string; text: string }[]; skipped: number } {\n const abs = resolve(target);\n if (statSync(abs).isFile()) return { root: dirname(abs), files: [{ path: toPosix(relative(dirname(abs), abs)), text: readFileSync(abs, 'utf8') }], skipped: 0 };\n const all: string[] = [];\n walk(abs, abs, all, AUDIT_IGNORE_DIRS);\n const ex = exclude.map(globToRegExp);\n const files: { path: string; text: string }[] = [];\n let skipped = 0;\n for (const p of all.sort()) {\n if (!isAuditable(p) || ex.some((r) => r.test(p))) continue;\n const full = join(abs, p);\n if (statSync(full).size > 512 * 1024) {\n skipped++;\n continue;\n }\n files.push({ path: p, text: readFileSync(full, 'utf8') });\n }\n return { root: abs, files, skipped };\n}\n\nexport interface RunAuditOptions {\n /** Design system repo root (with bridge.config.json). Default: nearest one above the current directory. */\n ds?: string;\n label?: string;\n baseline?: AuditReport;\n version?: string;\n /** Path recorded in the report (default: target relative to cwd). */\n displayPath?: string;\n exclude?: string[];\n}\n\n/** Audit a product folder against a design system. */\nexport function runAudit(target: string, opts: RunAuditOptions = {}): AuditReport {\n const dsRoot = opts.ds ?? findDesignSystemRoot(process.cwd());\n if (!dsRoot) throw new Error('No design system found: run from a repo with bridge.config.json or pass --ds <dir>.');\n const ds = loadDesignSystem(dsRoot);\n const { files, skipped } = collectAuditFiles(target, [...(ds.config.audit?.exclude ?? []), ...(opts.exclude ?? [])]);\n const report = buildAuditReport(\n { files, skipped, target: opts.displayPath ?? (toPosix(relative(process.cwd(), resolve(target))) || '.'), ...(opts.label ? { label: opts.label } : {}), ...(opts.version ? { version: opts.version } : {}) },\n ds.index,\n );\n return opts.baseline ? compareWithBaseline(report, opts.baseline) : report;\n}\n\n/** Plan (and optionally write) the safe CSS autofix for every CSS/SCSS/Less file under `target`. */\nexport function fixCss(target: string, ds: DesignSystemIndex, write: boolean): { file: string; edits: CssFixEdit[] }[] {\n const { root, files } = collectAuditFiles(target);\n const out: { file: string; edits: CssFixEdit[] }[] = [];\n for (const f of files) {\n const lang = f.path.endsWith('.scss') || f.path.endsWith('.sass') ? 'scss' : f.path.endsWith('.less') ? 'less' : f.path.endsWith('.css') ? 'css' : null;\n if (!lang) continue;\n const plan = planCssFixes(f.text, lang, ds);\n if (!plan.edits.length) continue;\n if (write) writeFileSync(join(root, f.path), plan.output);\n out.push({ file: f.path, edits: plan.edits });\n }\n return out;\n}\n","// A small CSS cascade for component specs: parses CSS modules into rules, matches selectors against a simplified\n// element tree in a given interaction state (default, hover, pressed, disabled) and computes each element's values with\n// inheritance. Enough for token-only component CSS (classes, attributes, :hover, :not(), :has(), combinators, @media);\n// it is not a browser. Pure: no DOM, no Node API.\n\nexport interface CssDecl {\n prop: string;\n value: string;\n}\n\nexport interface CssRule {\n /** CSS module the rule comes from (class names are scoped to it). */\n module: string;\n selector: Complex;\n /** Selector as written, for reports. */\n text: string;\n decls: CssDecl[];\n specificity: [number, number, number];\n order: number;\n}\n\ntype Simple =\n | { t: 'class'; name: string }\n | { t: 'tag'; name: string }\n | { t: 'any' }\n | { t: 'attr'; name: string; value?: string | undefined }\n | { t: 'pseudo'; name: string; args?: Complex[] | undefined }\n | { t: 'element'; name: string };\n\ntype Combinator = ' ' | '>' | '+' | '~';\n\nexport interface Complex {\n /** Left to right. The first part's combinator only matters in :has() (relative selectors). */\n parts: { combinator: Combinator | null; compound: Simple[] }[];\n}\n\n/** An element of a component's rendered tree, as the cascade sees it. */\nexport interface CssElement {\n tag: string;\n /** Module-scoped class names: \"<module>|<class>\". */\n classes: Set<string>;\n parent?: CssElement | undefined;\n children: CssElement[];\n /** Optional parts (hidden by default) do not exist for :has(), sibling and child-position selectors. */\n present: boolean;\n isRoot: boolean;\n /** A text field: matches input, :disabled, [data-disabled] in the disabled state, ::placeholder. */\n inputLike: boolean;\n}\n\nexport interface CssState {\n hover: boolean;\n active: boolean;\n disabled: boolean;\n}\n\nexport const DEFAULT_STATE: CssState = { hover: false, active: false, disabled: false };\n\n// ---------------------------------------------------------------------------------------------\n// Parsing\n\n/** Splits on `sep` at depth 0 (outside parentheses, brackets and quotes). */\nexport function splitTop(text: string, sep: string | RegExp): string[] {\n const out: string[] = [];\n let depth = 0;\n let quote = '';\n let buf = '';\n for (let i = 0; i < text.length; i++) {\n const ch = text[i]!;\n if (quote) {\n buf += ch;\n if (ch === quote) quote = '';\n continue;\n }\n if (ch === '\"' || ch === \"'\") quote = ch;\n else if (ch === '(' || ch === '[') depth++;\n else if (ch === ')' || ch === ']') depth--;\n if (depth === 0 && (typeof sep === 'string' ? ch === sep : sep.test(ch))) {\n out.push(buf);\n buf = '';\n continue;\n }\n buf += ch;\n }\n out.push(buf);\n return out.map((s) => s.trim()).filter(Boolean);\n}\n\n/** Parses one complex selector (\"a > .b:hover .c\"). Throws on syntax it does not know. */\nexport function parseSelector(text: string): Complex {\n let i = 0;\n const s = text.trim();\n const parts: Complex['parts'] = [];\n let combinator: Combinator | null = null;\n const ident = () => {\n const m = /^-?[A-Za-z_][\\w-]*/.exec(s.slice(i));\n if (!m) throw new Error(`Unexpected \"${s.slice(i, i + 12)}\" in selector \"${text}\"`);\n i += m[0].length;\n return m[0];\n };\n const parenArgs = () => {\n // s[i] === '('\n let depth = 0;\n const start = i + 1;\n for (; i < s.length; i++) {\n if (s[i] === '(') depth++;\n else if (s[i] === ')' && --depth === 0) break;\n }\n const inner = s.slice(start, i);\n i++; // ')'\n return inner;\n };\n while (i < s.length) {\n const compound: Simple[] = [];\n for (;;) {\n const ch = s[i];\n if (ch === '.') {\n i++;\n compound.push({ t: 'class', name: ident() });\n } else if (ch === '#') {\n i++;\n compound.push({ t: 'attr', name: 'id', value: ident() });\n } else if (ch === '*') {\n i++;\n compound.push({ t: 'any' });\n } else if (ch === '[') {\n const end = s.indexOf(']', i);\n const inner = s.slice(i + 1, end);\n i = end + 1;\n const m = /^\\s*([\\w-]+)\\s*(?:[~|^$*]?=\\s*[\"']?([^\"'\\]]*)[\"']?)?\\s*$/.exec(inner);\n compound.push({ t: 'attr', name: m?.[1] ?? inner, value: m?.[2] });\n } else if (ch === ':' && s[i + 1] === ':') {\n i += 2;\n compound.push({ t: 'element', name: ident() });\n } else if (ch === ':') {\n i++;\n const name = ident();\n if (s[i] === '(') {\n const inner = parenArgs();\n const args = ['not', 'is', 'where', 'has', 'matches'].includes(name) ? splitTop(inner, ',').map(parseRelative) : undefined;\n compound.push({ t: 'pseudo', name, args });\n } else compound.push({ t: 'pseudo', name });\n } else if (ch && /[A-Za-z]/.test(ch)) {\n compound.push({ t: 'tag', name: ident().toLowerCase() });\n } else break;\n }\n if (!compound.length) throw new Error(`Empty compound in selector \"${text}\"`);\n parts.push({ combinator, compound });\n // Combinator\n const rest = /^\\s*([>+~])?\\s*/.exec(s.slice(i))!;\n if (i + rest[0].length >= s.length) break;\n combinator = (rest[1] as Combinator | undefined) ?? ' ';\n if (!rest[0].length) throw new Error(`Unexpected \"${s.slice(i, i + 12)}\" in selector \"${text}\"`);\n i += rest[0].length;\n }\n return { parts };\n}\n\n/** A selector inside :has() may start with a combinator (\"> .icon\"). */\nfunction parseRelative(text: string): Complex {\n const m = /^\\s*([>+~])\\s*/.exec(text);\n const c = parseSelector(m ? text.slice(m[0].length) : text);\n c.parts[0]!.combinator = (m?.[1] as Combinator | undefined) ?? ' ';\n return c;\n}\n\nfunction specificityOf(c: Complex): [number, number, number] {\n const sp: [number, number, number] = [0, 0, 0];\n const add = (x: [number, number, number]) => {\n sp[0] += x[0];\n sp[1] += x[1];\n sp[2] += x[2];\n };\n for (const p of c.parts)\n for (const s of p.compound) {\n if (s.t === 'class') sp[1]++;\n else if (s.t === 'attr') s.name === 'id' ? sp[0]++ : sp[1]++;\n else if (s.t === 'tag' || s.t === 'element') sp[2]++;\n else if (s.t === 'pseudo') {\n if (s.name === 'where') continue;\n if (s.args) {\n const best = s.args.map(specificityOf).sort(cmpSpec).pop();\n if (best) add(best);\n } else sp[1]++;\n }\n }\n return sp;\n}\n\nconst cmpSpec = (a: [number, number, number], b: [number, number, number]) => a[0] - b[0] || a[1] - b[1] || a[2] - b[2];\n\n/** Media queries a component in Figma is drawn under: a mouse (hover: hover), nothing else. */\nexport function mediaApplies(query: string): boolean {\n const q = query.replace(/\\s+/g, ' ').trim().toLowerCase();\n if (q.startsWith('@supports')) return true;\n const cond = q.replace(/^@media /, '');\n return /^\\((any-)?hover: ?hover\\)$/.test(cond) || cond === 'screen' || cond === 'all';\n}\n\n/** Rules of one CSS module, in source order. `@media` blocks are kept only when they apply in Figma. */\nexport function parseCssModule(module: string, text: string, startOrder = 0): { rules: CssRule[]; errors: string[] } {\n const rules: CssRule[] = [];\n const errors: string[] = [];\n let order = startOrder;\n const clean = text.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\n const walk = (src: string) => {\n let i = 0;\n let buf = '';\n while (i < src.length) {\n const ch = src[i]!;\n if (ch !== '{') {\n if (ch === ';' && buf.trim().startsWith('@')) buf = ''; // @import, @charset\n else buf += ch;\n i++;\n continue;\n }\n const head = buf.trim();\n buf = '';\n let depth = 1;\n const start = ++i;\n while (i < src.length && depth > 0) {\n if (src[i] === '{') depth++;\n else if (src[i] === '}') depth--;\n i++;\n }\n const inner = src.slice(start, i - 1);\n if (head.startsWith('@')) {\n if (/^@(media|supports)/.test(head) && mediaApplies(head)) walk(inner);\n continue;\n }\n const decls = splitTop(inner, ';')\n .map((d) => {\n const c = d.indexOf(':');\n return c < 0 ? undefined : { prop: d.slice(0, c).trim().toLowerCase(), value: d.slice(c + 1).trim().replace(/\\s*!important$/, '') };\n })\n .filter((d): d is CssDecl => !!d && !!d.prop);\n for (const sel of splitTop(head, ',')) {\n try {\n const selector = parseSelector(sel);\n rules.push({ module, selector, text: sel.replace(/\\s+/g, ' '), decls, specificity: specificityOf(selector), order: order++ });\n } catch (err) {\n errors.push(`${module}: ${(err as Error).message}`);\n }\n }\n }\n };\n walk(clean);\n return { rules, errors };\n}\n\n// ---------------------------------------------------------------------------------------------\n// Matching\n\nconst TAG_ALIASES: Record<string, string[]> = {\n input: ['input', 'baseinput'],\n textarea: ['textarea'],\n button: ['button', 'basebutton'],\n svg: ['svg'],\n};\n\nfunction tagMatches(el: CssElement, name: string): boolean {\n const tag = el.tag.toLowerCase();\n return (TAG_ALIASES[name] ?? [name]).includes(tag) || (name === 'input' && el.inputLike);\n}\n\nconst presentChildren = (el: CssElement) => el.children.filter((c) => c.present);\n\nfunction siblingsBefore(el: CssElement): CssElement[] {\n if (!el.parent) return [];\n const sibs = presentChildren(el.parent);\n const idx = sibs.indexOf(el);\n return idx < 0 ? [] : sibs.slice(0, idx);\n}\n\nfunction attrMatches(el: CssElement, s: Extract<Simple, { t: 'attr' }>, state: CssState): boolean {\n switch (s.name) {\n case 'data-disabled':\n case 'disabled':\n return state.disabled && (el.isRoot || el.inputLike);\n default:\n // data-loading, data-pressed, data-invalid, aria-invalid, readonly, data-popup-open...: not part of the drawn states.\n return false;\n }\n}\n\nfunction pseudoMatches(el: CssElement, s: Extract<Simple, { t: 'pseudo' }>, state: CssState, module: string): boolean {\n switch (s.name) {\n case 'hover':\n return state.hover;\n case 'active':\n return state.active;\n case 'disabled':\n return state.disabled && (el.isRoot || el.inputLike);\n case 'enabled':\n return !state.disabled;\n case 'placeholder-shown':\n return el.inputLike;\n case 'not':\n return !(s.args ?? []).some((a) => matchComplex(a, el, state, module));\n case 'is':\n case 'where':\n case 'matches':\n return (s.args ?? []).some((a) => matchComplex(a, el, state, module));\n case 'has':\n return (s.args ?? []).some((a) => hasMatch(a, el, state, module));\n case 'first-child':\n return !!el.parent && presentChildren(el.parent)[0] === el;\n case 'last-child': {\n const sibs = el.parent ? presentChildren(el.parent) : [];\n return sibs[sibs.length - 1] === el;\n }\n case 'only-child':\n return !!el.parent && presentChildren(el.parent).length === 1;\n default:\n // focus, focus-visible, focus-within, checked, invalid...: not drawn.\n return false;\n }\n}\n\nfunction compoundMatches(compound: Simple[], el: CssElement, state: CssState, module: string, pseudoElement?: string): boolean {\n let sawElement = false;\n for (const s of compound) {\n switch (s.t) {\n case 'class':\n if (!el.classes.has(`${module}|${s.name}`)) return false;\n break;\n case 'tag':\n if (!tagMatches(el, s.name)) return false;\n break;\n case 'any':\n break;\n case 'attr':\n if (!attrMatches(el, s, state)) return false;\n break;\n case 'pseudo':\n if (!pseudoMatches(el, s, state, module)) return false;\n break;\n case 'element':\n sawElement = true;\n if (s.name !== pseudoElement) return false;\n break;\n }\n }\n return pseudoElement ? sawElement : !sawElement;\n}\n\nfunction matchAt(c: Complex, i: number, el: CssElement, state: CssState, module: string, anchor?: CssElement, pseudoElement?: string): boolean {\n const part = c.parts[i]!;\n if (!compoundMatches(part.compound, el, state, module, i === c.parts.length - 1 ? pseudoElement : undefined)) return false;\n if (i === 0) {\n if (!anchor) return true;\n switch (part.combinator ?? ' ') {\n case '>':\n return el.parent === anchor;\n case ' ': {\n for (let p = el.parent; p; p = p.parent) if (p === anchor) return true;\n return false;\n }\n case '+':\n return siblingsBefore(el).slice(-1)[0] === anchor;\n case '~':\n return siblingsBefore(el).includes(anchor);\n }\n }\n switch (part.combinator) {\n case '>':\n return !!el.parent && matchAt(c, i - 1, el.parent, state, module, anchor);\n case ' ': {\n for (let p = el.parent; p; p = p.parent) if (matchAt(c, i - 1, p, state, module, anchor)) return true;\n return false;\n }\n case '+': {\n const prev = siblingsBefore(el).slice(-1)[0];\n return !!prev && matchAt(c, i - 1, prev, state, module, anchor);\n }\n case '~':\n return siblingsBefore(el).some((p) => matchAt(c, i - 1, p, state, module, anchor));\n default:\n return false;\n }\n}\n\nexport function matchComplex(c: Complex, el: CssElement, state: CssState, module: string, pseudoElement?: string): boolean {\n return matchAt(c, c.parts.length - 1, el, state, module, undefined, pseudoElement);\n}\n\nfunction descendants(el: CssElement): CssElement[] {\n const out: CssElement[] = [];\n const walk = (e: CssElement) => {\n for (const c of presentChildren(e)) {\n out.push(c);\n walk(c);\n }\n };\n walk(el);\n return out;\n}\n\nfunction hasMatch(c: Complex, anchor: CssElement, state: CssState, module: string): boolean {\n const first = c.parts[0]!.combinator;\n const pool = first === '+' || first === '~' ? (anchor.parent ? presentChildren(anchor.parent) : []) : descendants(anchor);\n return pool.some((el) => matchAt(c, c.parts.length - 1, el, state, module, anchor));\n}\n\n// ---------------------------------------------------------------------------------------------\n// Cascade\n\nconst SIDES = ['top', 'right', 'bottom', 'left'] as const;\nconst BORDER_STYLES = new Set(['none', 'hidden', 'solid', 'dashed', 'dotted', 'double', 'groove', 'ridge', 'inset', 'outset']);\n\nfunction boxValues(parts: string[]): [string, string, string, string] | undefined {\n const [a, b = a, c = a, d = b] = parts;\n return a === undefined ? undefined : [a, b!, c!, d!];\n}\n\n/** Expands the shorthands component CSS uses into longhands, so later longhands override them as in a browser. */\nexport function expandDecl(d: CssDecl): CssDecl[] {\n const parts = splitTop(d.value, /\\s/);\n const sides = (prefix: string, suffix: string, vals: string[] | undefined) =>\n vals ? SIDES.map((s, i) => ({ prop: `${prefix}${s}${suffix}`, value: vals[i]! })) : [d];\n switch (d.prop) {\n case 'padding':\n return sides('padding-', '', boxValues(parts));\n case 'padding-inline': {\n const [s, e = s] = parts;\n return [\n { prop: 'padding-left', value: s! },\n { prop: 'padding-right', value: e! },\n ];\n }\n case 'padding-block': {\n const [s, e = s] = parts;\n return [\n { prop: 'padding-top', value: s! },\n { prop: 'padding-bottom', value: e! },\n ];\n }\n case 'padding-inline-start':\n return [{ prop: 'padding-left', value: d.value }];\n case 'padding-inline-end':\n return [{ prop: 'padding-right', value: d.value }];\n case 'padding-block-start':\n return [{ prop: 'padding-top', value: d.value }];\n case 'padding-block-end':\n return [{ prop: 'padding-bottom', value: d.value }];\n case 'border-width':\n return sides('border-', '-width', boxValues(parts));\n case 'border-color':\n return sides('border-', '-color', boxValues(parts));\n case 'border':\n case 'border-top':\n case 'border-right':\n case 'border-bottom':\n case 'border-left': {\n const { width, color } = splitBorder(parts);\n const which = d.prop === 'border' ? SIDES : [d.prop.slice(7) as (typeof SIDES)[number]];\n return which.flatMap((s) => [\n { prop: `border-${s}-width`, value: width },\n { prop: `border-${s}-color`, value: color },\n ]);\n }\n case 'font':\n return d.value === 'inherit' ? ['font-family', 'font-size', 'font-weight', 'line-height'].map((prop) => ({ prop, value: 'inherit' })) : [d];\n default:\n return [d];\n }\n}\n\nfunction splitBorder(parts: string[]): { width: string; color: string } {\n const styleAt = parts.findIndex((p) => BORDER_STYLES.has(p));\n if (styleAt >= 0) {\n const width = parts.slice(0, styleAt).join(' ') || parts.slice(styleAt + 1).find((p) => /width|^\\d/.test(p)) || 'medium';\n const color = parts.slice(styleAt + 1).filter((p) => p !== width).join(' ') || 'currentcolor';\n return { width, color };\n }\n if (parts.length === 1 && (parts[0] === '0' || parts[0] === 'none')) return { width: '0', color: 'currentcolor' };\n const width = parts.find((p) => /width|^\\d/.test(p)) ?? 'medium';\n return { width, color: parts.filter((p) => p !== width).join(' ') || 'currentcolor' };\n}\n\n/** Properties a child inherits from its parent (custom properties always inherit). */\nexport const INHERITED = new Set(['color', 'font-family', 'font-size', 'font-weight', 'line-height', 'letter-spacing', 'cursor', 'white-space', 'visibility']);\n\nexport interface Declared {\n prop: string;\n value: string;\n rule: CssRule;\n}\n\n/** Winning declarations for an element (own rules only), keyed by longhand property. */\nexport function declaredFor(rules: CssRule[], el: CssElement, state: CssState, pseudoElement?: string): Map<string, Declared> {\n const matched = rules.filter((r) => matchComplex(r.selector, el, state, r.module, pseudoElement));\n matched.sort((a, b) => cmpSpec(a.specificity, b.specificity) || a.order - b.order);\n const out = new Map<string, Declared>();\n for (const r of matched) for (const d of r.decls) for (const x of expandDecl(d)) out.set(x.prop, { prop: x.prop, value: x.value, rule: r });\n return out;\n}\n\n/** Computed values: inherited ones from the parent, then the element's own declarations (\"inherit\" takes the parent's). */\nexport function computeValues(own: Map<string, Declared>, parent: Map<string, string> | undefined): Map<string, string> {\n const out = new Map<string, string>();\n if (parent) for (const [k, v] of parent) if (k.startsWith('--') || INHERITED.has(k)) out.set(k, v);\n for (const [k, d] of own) {\n if (d.value === 'inherit') {\n const pv = parent?.get(k);\n if (pv !== undefined) out.set(k, pv);\n else out.delete(k);\n } else if (d.value === 'initial' || d.value === 'unset') out.delete(k);\n else out.set(k, d.value);\n }\n return out;\n}\n","// Component spec generator: reads a component's TSX (props, defaults, rendered tree) and its CSS modules, and derives a\n// ComponentSpec (see ../component-spec.ts) a design tool can rebuild: variant axes from string-literal union props,\n// a State axis from the interaction states the CSS styles, TEXT and BOOLEAN properties, parts (frames, text, icons),\n// and per variant the token path behind every fill, stroke, radius, padding, gap, size and text property.\n//\n// Derived from code, never hand-maintained: `npm run specs` writes packages/react/component-specs.json, and a test\n// fails when the committed file is out of date. Uses the TypeScript parser (Node only, like the audit).\n\nimport { readFileSync, readdirSync, statSync } from 'node:fs';\nimport { join, posix, relative } from 'node:path';\nimport ts from 'typescript';\nimport {\n COLOR_FIELDS,\n COMPONENT_SPECS_VERSION,\n type ComponentSpec,\n type ComponentSpecsFile,\n type SpecAxis,\n type SpecField,\n type SpecLayout,\n type SpecPart,\n type SpecIcon,\n type SpecIconStyle,\n type SpecProperty,\n type SpecSlot,\n type SpecUnmapped,\n type SpecValue,\n type SpecVariant,\n hashSpec,\n iconComponentName,\n tokenCssVar,\n variantKeyOf,\n} from '../component-spec';\nimport { CONFIG_FILE, loadConfig } from '../config';\nimport { buildTokenSet, layoutOptions } from '../token-set';\nimport { type CssElement, type CssRule, type CssState, DEFAULT_STATE, computeValues, declaredFor, parseCssModule } from './spec-css';\n\nexport interface TokenInfo {\n path: string;\n type: string;\n}\n\nexport interface SpecGeneratorOptions {\n /** Repo-relative components directory (\"packages/react/src/components\"). */\n componentsDir: string;\n /** Reads a repo-relative file; undefined when it does not exist. */\n read: (path: string) => string | undefined;\n /** CSS custom property -> token. */\n tokens: Map<string, TokenInfo>;\n styleSuffix?: string | undefined;\n /** Repo-relative ESM build of lucide-react (\"node_modules/lucide-react/dist/esm\"), for the icons section. */\n lucideDir?: string | undefined;\n}\n\n/** States drawn as the State axis when the CSS styles them, with the selector state they stand for. */\nconst STATES: { name: string; state: CssState }[] = [\n { name: 'Default', state: DEFAULT_STATE },\n { name: 'Hover', state: { hover: true, active: false, disabled: false } },\n { name: 'Pressed', state: { hover: true, active: true, disabled: false } },\n { name: 'Disabled', state: { hover: false, active: false, disabled: true } },\n];\n\n/** Most variants a set may get; a component past it is reported instead of generated. */\nconst MAX_VARIANTS = 240;\n\n/** CSS properties that matter visually but have no mapping in this version. Others (cursor, transition...) are silent. */\nconst REPORTED: Record<string, string> = {\n 'box-shadow': 'shadows are code-only tokens (no Figma variable)',\n outline: 'focus rings are not drawn',\n transform: 'transforms are not drawn',\n opacity: 'opacity is not mapped yet',\n filter: 'filters are not drawn',\n 'margin-left': 'margins have no auto layout equivalent',\n 'margin-right': 'margins have no auto layout equivalent',\n margin: 'margins have no auto layout equivalent',\n 'margin-inline-start': 'margins have no auto layout equivalent',\n};\n\n// ---------------------------------------------------------------------------------------------\n// TSX reading\n\ntype PropKind = 'union' | 'boolean' | 'icon' | 'node' | 'string' | 'function' | 'other';\n\ninterface PropInfo {\n name: string;\n kind: PropKind;\n values?: string[] | undefined;\n optional: boolean;\n}\n\ninterface ComponentSource {\n name: string;\n file: string;\n sf: ts.SourceFile;\n /** Import identifier -> repo-relative CSS module path. */\n styles: Map<string, string>;\n props: Map<string, PropInfo>;\n /** Native element the props extend (button, input, span...), from `extends ButtonHTMLAttributes<...>`. */\n native: string | undefined;\n fn: ts.FunctionLikeDeclaration | undefined;\n /** Other exported forwardRef components in the file (CardHeader, CardBody...). */\n subcomponents: { name: string; fn: ts.FunctionLikeDeclaration }[];\n}\n\nconst NATIVE_ATTRS: Record<string, string> = {\n ButtonHTMLAttributes: 'button',\n InputHTMLAttributes: 'input',\n TextareaHTMLAttributes: 'textarea',\n AnchorHTMLAttributes: 'a',\n HTMLAttributes: 'element',\n};\n\nfunction unquote(s: string): string {\n return s.replace(/^['\"`]|['\"`]$/g, '');\n}\n\nclass Reader {\n private cache = new Map<string, ComponentSource | null>();\n private aliasCache = new Map<string, Map<string, string>>();\n constructor(private opts: SpecGeneratorOptions) {}\n\n private dirOf(name: string) {\n return `${this.opts.componentsDir}/${name}`;\n }\n\n exists(name: string): boolean {\n return this.opts.read(`${this.dirOf(name)}/${name}.tsx`) !== undefined;\n }\n\n /** `export type X = ...` of a component file and of the component files it imports from. */\n private aliases(file: string, sf: ts.SourceFile, depth = 0): Map<string, string> {\n if (this.aliasCache.has(file)) return this.aliasCache.get(file)!;\n const out = new Map<string, string>();\n this.aliasCache.set(file, out);\n for (const st of sf.statements) {\n if (ts.isTypeAliasDeclaration(st)) out.set(st.name.text, st.type.getText(sf));\n if (ts.isImportDeclaration(st) && depth < 2) {\n const spec = unquote(st.moduleSpecifier.getText(sf));\n const m = /^\\.\\.\\/(\\w+)$/.exec(spec);\n if (!m) continue;\n const other = `${this.dirOf(m[1]!)}/${m[1]}.tsx`;\n const text = this.opts.read(other);\n if (!text) continue;\n const osf = ts.createSourceFile(other, text, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);\n for (const [k, v] of this.aliases(other, osf, depth + 1)) if (!out.has(k)) out.set(k, v);\n }\n }\n return out;\n }\n\n load(name: string): ComponentSource | null {\n if (this.cache.has(name)) return this.cache.get(name)!;\n const file = `${this.dirOf(name)}/${name}.tsx`;\n const text = this.opts.read(file);\n if (text === undefined) {\n this.cache.set(name, null);\n return null;\n }\n const sf = ts.createSourceFile(file, text, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);\n const styles = new Map<string, string>();\n for (const st of sf.statements) {\n if (!ts.isImportDeclaration(st) || !st.importClause?.name) continue;\n const spec = unquote(st.moduleSpecifier.getText(sf));\n if (!spec.endsWith(this.opts.styleSuffix ?? '.module.css')) continue;\n styles.set(st.importClause.name.text, posix.normalize(posix.join(this.dirOf(name), spec)));\n }\n const aliases = this.aliases(file, sf);\n const props = new Map<string, PropInfo>();\n let native: string | undefined;\n const iface = sf.statements.find((s): s is ts.InterfaceDeclaration => ts.isInterfaceDeclaration(s) && s.name.text === `${name}Props`);\n if (iface) {\n for (const h of iface.heritageClauses ?? []) {\n const txt = h.getText(sf);\n for (const [k, v] of Object.entries(NATIVE_ATTRS)) if (txt.includes(k)) native ??= v;\n }\n for (const m of iface.members) {\n if (!ts.isPropertySignature(m) || !m.type) continue;\n const pname = m.name.getText(sf);\n props.set(pname, { name: pname, optional: !!m.questionToken, ...classifyType(m.type.getText(sf), aliases) });\n }\n }\n const fns = componentFunctions(sf);\n const fn = fns.get(name);\n const subcomponents = [...fns].filter(([n]) => n !== name && n.startsWith(name)).map(([n, f]) => ({ name: n, fn: f }));\n const src: ComponentSource = { name, file, sf, styles, props, native, fn, subcomponents };\n this.cache.set(name, src);\n return src;\n }\n}\n\nfunction classifyType(text: string, aliases: Map<string, string>, depth = 0): { kind: PropKind; values?: string[] } {\n const t = text.trim();\n if (aliases.has(t) && depth < 4) return classifyType(aliases.get(t)!, aliases, depth + 1);\n const parts = t.split('|').map((p) => p.trim());\n if (parts.length > 1 && parts.every((p) => /^'[^']*'$/.test(p))) return { kind: 'union', values: parts.map(unquote) };\n if (t === 'boolean') return { kind: 'boolean' };\n if (t === 'LucideIcon') return { kind: 'icon' };\n if (/^(ReactNode|ReactElement|React\\.ReactNode)$/.test(t)) return { kind: 'node' };\n if (t === 'string') return { kind: 'string' };\n if (t.includes('=>')) return { kind: 'function' };\n return { kind: 'other' };\n}\n\n/** Exported components of a file: `forwardRef(function Name(...))` or `function Name(...)`. */\nfunction componentFunctions(sf: ts.SourceFile): Map<string, ts.FunctionLikeDeclaration> {\n const out = new Map<string, ts.FunctionLikeDeclaration>();\n const visit = (n: ts.Node) => {\n if (ts.isFunctionExpression(n) && n.name && /^[A-Z]/.test(n.name.text) && ts.isCallExpression(n.parent) && /forwardRef/.test(n.parent.expression.getText(sf))) {\n if (!out.has(n.name.text)) out.set(n.name.text, n);\n } else if (ts.isFunctionDeclaration(n) && n.name && /^[A-Z]/.test(n.name.text) && n.modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword)) {\n if (!out.has(n.name.text)) out.set(n.name.text, n);\n }\n ts.forEachChild(n, visit);\n };\n visit(sf);\n return out;\n}\n\n// ---------------------------------------------------------------------------------------------\n// Evaluating a component for a set of props\n\nconst CHILDREN = Symbol('children');\nconst OPAQUE = Symbol('opaque');\n\ninterface ClassRef {\n cls: string;\n}\ninterface StylesRef {\n module: string;\n}\ninterface JsxRef {\n jsx: ts.Node;\n scope: Scope;\n}\n\ntype Value = undefined | null | boolean | number | string | symbol | ClassRef | StylesRef | JsxRef | Value[] | { [k: string]: Value };\n\nconst isClass = (v: Value): v is ClassRef => !!v && typeof v === 'object' && 'cls' in (v as object);\nconst isStyles = (v: Value): v is StylesRef => !!v && typeof v === 'object' && 'module' in (v as object);\nconst isJsx = (v: Value): v is JsxRef => !!v && typeof v === 'object' && 'jsx' in (v as object);\n\ninterface Scope {\n src: ComponentSource;\n vars: Map<string, Value>;\n /** Local consts, evaluated on first use. */\n locals: Map<string, ts.Expression>;\n /** Identifiers bound to optional icon props (or a boolean shown as a part): JSX conditions on them become BOOLEAN properties. */\n toggles: Map<string, string>;\n /** Component being specified (true) or a nested DS component (false). */\n main: boolean;\n}\n\nfunction lookup(scope: Scope, name: string): Value {\n if (scope.vars.has(name)) return scope.vars.get(name);\n const local = scope.locals.get(name);\n if (local) {\n scope.locals.delete(name);\n const v = evaluate(local, scope);\n scope.vars.set(name, v);\n return v;\n }\n const style = scope.src.styles.get(name);\n if (style) return { module: style };\n if (name === 'undefined') return undefined;\n return undefined;\n}\n\nfunction classList(v: Value, out: string[] = []): string[] {\n if (isClass(v)) out.push(v.cls);\n else if (Array.isArray(v)) for (const x of v) classList(x, out);\n return out;\n}\n\nfunction evaluate(e: ts.Expression, scope: Scope): Value {\n const sf = scope.src.sf;\n if (ts.isParenthesizedExpression(e) || ts.isAsExpression(e) || ts.isNonNullExpression(e) || ts.isSatisfiesExpression(e)) return evaluate(e.expression, scope);\n if (ts.isStringLiteral(e) || ts.isNoSubstitutionTemplateLiteral(e)) return e.text;\n if (ts.isNumericLiteral(e)) return Number(e.text);\n if (e.kind === ts.SyntaxKind.TrueKeyword) return true;\n if (e.kind === ts.SyntaxKind.FalseKeyword) return false;\n if (e.kind === ts.SyntaxKind.NullKeyword) return null;\n if (ts.isIdentifier(e)) return lookup(scope, e.text);\n if (ts.isTemplateExpression(e)) {\n let s = e.head.text;\n for (const span of e.templateSpans) s += String(evaluate(span.expression, scope) ?? '') + span.literal.text;\n return s;\n }\n if (ts.isPropertyAccessExpression(e)) {\n const obj = evaluate(e.expression, scope);\n if (isStyles(obj)) return { cls: `${obj.module}|${e.name.text}` };\n if (obj && typeof obj === 'object' && !Array.isArray(obj) && !isClass(obj) && !isJsx(obj)) return (obj as Record<string, Value>)[e.name.text];\n return undefined;\n }\n if (ts.isElementAccessExpression(e)) {\n const obj = evaluate(e.expression, scope);\n const key = evaluate(e.argumentExpression, scope);\n if (isStyles(obj) && typeof key === 'string') return { cls: `${obj.module}|${key}` };\n return undefined;\n }\n if (ts.isPrefixUnaryExpression(e) && e.operator === ts.SyntaxKind.ExclamationToken) return !truthy(evaluate(e.operand, scope));\n if (ts.isConditionalExpression(e)) return truthy(evaluate(e.condition, scope)) ? evaluate(e.whenTrue, scope) : evaluate(e.whenFalse, scope);\n if (ts.isBinaryExpression(e)) {\n const op = e.operatorToken.kind;\n if (op === ts.SyntaxKind.AmpersandAmpersandToken) {\n const l = evaluate(e.left, scope);\n return truthy(l) ? evaluate(e.right, scope) : l;\n }\n if (op === ts.SyntaxKind.BarBarToken) {\n const l = evaluate(e.left, scope);\n return truthy(l) ? l : evaluate(e.right, scope);\n }\n if (op === ts.SyntaxKind.QuestionQuestionToken) {\n const l = evaluate(e.left, scope);\n return l === undefined || l === null ? evaluate(e.right, scope) : l;\n }\n const l = evaluate(e.left, scope);\n const r = evaluate(e.right, scope);\n switch (op) {\n case ts.SyntaxKind.EqualsEqualsEqualsToken:\n return l === r;\n case ts.SyntaxKind.ExclamationEqualsEqualsToken:\n return l !== r;\n case ts.SyntaxKind.EqualsEqualsToken:\n return l == r; // eslint-disable-line eqeqeq\n case ts.SyntaxKind.ExclamationEqualsToken:\n return l != r; // eslint-disable-line eqeqeq\n default:\n return OPAQUE;\n }\n }\n if (ts.isCallExpression(e)) {\n const callee = e.expression.getText(sf);\n if (callee === 'cx' || callee === 'clsx' || callee === 'classNames') return e.arguments.map((a) => evaluate(a, scope)).filter(truthy);\n return OPAQUE;\n }\n if (ts.isJsxElement(e) || ts.isJsxSelfClosingElement(e) || ts.isJsxFragment(e)) return { jsx: e, scope };\n return OPAQUE;\n}\n\nfunction truthy(v: Value): boolean {\n if (v === OPAQUE) return true;\n if (Array.isArray(v)) return true;\n return !!v;\n}\n\n/** Binds the destructured props of a component function, with their defaults. */\nfunction bindProps(fn: ts.FunctionLikeDeclaration, scope: Scope, given: Record<string, Value>): Map<string, string> {\n const names = new Map<string, string>(); // local name -> prop name\n const param = fn.parameters[0];\n if (!param || !ts.isObjectBindingPattern(param.name)) return names;\n for (const el of param.name.elements) {\n if (el.dotDotDotToken || !ts.isIdentifier(el.name)) continue;\n const prop = el.propertyName ? el.propertyName.getText(scope.src.sf) : el.name.text;\n names.set(el.name.text, prop);\n let v = given[prop];\n if (v === undefined && el.initializer) v = evaluate(el.initializer, scope);\n scope.vars.set(el.name.text, v);\n }\n return names;\n}\n\n/** The JSX a component function returns for the current props: follows `if (cond) return x;` and local consts. */\nfunction renderedJsx(fn: ts.FunctionLikeDeclaration, scope: Scope): JsxRef | undefined {\n const body = fn.body;\n if (!body) return undefined;\n if (!ts.isBlock(body)) {\n const v = evaluate(body, scope);\n return isJsx(v) ? v : undefined;\n }\n const run = (stmts: readonly ts.Statement[]): JsxRef | undefined | null => {\n for (const st of stmts) {\n if (ts.isVariableStatement(st)) {\n for (const d of st.declarationList.declarations) if (ts.isIdentifier(d.name) && d.initializer) scope.locals.set(d.name.text, d.initializer);\n } else if (ts.isIfStatement(st)) {\n const branch = truthy(evaluate(st.expression, scope)) ? st.thenStatement : st.elseStatement;\n if (!branch) continue;\n const r = run(ts.isBlock(branch) ? branch.statements : [branch]);\n if (r !== null) return r;\n } else if (ts.isReturnStatement(st)) {\n if (!st.expression) return undefined;\n const v = evaluate(st.expression, scope);\n return isJsx(v) ? v : undefined;\n }\n }\n return null;\n };\n return run(body.statements) ?? undefined;\n}\n\n// ---------------------------------------------------------------------------------------------\n// Element tree\n\ninterface Node {\n key: string;\n tag: string;\n classes: string[];\n children: Node[];\n kind: 'frame' | 'text' | 'icon';\n /** Text parts: TEXT property name and default; placeholder text of a text field. */\n text?: { property: string; default: string; prop?: string | undefined } | undefined;\n placeholder?: boolean | undefined;\n inputLike?: boolean | undefined;\n /** BOOLEAN property that shows this optional part. */\n visible?: { property: string; prop: string } | undefined;\n /** Spreads `...rest` with no children of its own: children come through props. */\n takesChildren?: boolean | undefined;\n /** Name for the layer, when it is not the class. */\n name?: string | undefined;\n}\n\nconst INPUT_TAGS = new Set(['input', 'textarea', 'BaseInput']);\n\n/** \"iconStart\" -> \"Icon start\". */\nexport const sentenceCase = (prop: string) => {\n const words = prop.replace(/([a-z0-9])([A-Z])/g, '$1 $2').toLowerCase();\n return words.charAt(0).toUpperCase() + words.slice(1);\n};\n\ninterface RenderContext {\n reader: Reader;\n depth: number;\n /** Elements the main component rendered for `{children}`. */\n component: string;\n}\n\nfunction renderJsx(ref: JsxRef, ctx: RenderContext, visible?: Node['visible']): Node[] {\n const { jsx, scope } = ref;\n const sf = scope.src.sf;\n if (ts.isParenthesizedExpression(jsx)) return renderJsx({ jsx: jsx.expression, scope }, ctx, visible);\n if (ts.isJsxFragment(jsx)) return renderChildren(jsx.children, scope, ctx);\n if (!ts.isJsxElement(jsx) && !ts.isJsxSelfClosingElement(jsx)) return [];\n const open = ts.isJsxElement(jsx) ? jsx.openingElement : jsx;\n const tag = open.tagName.getText(sf);\n const attrs: Record<string, Value> = {};\n let spreads = false;\n for (const a of open.attributes.properties) {\n if (ts.isJsxSpreadAttribute(a)) {\n spreads = true;\n continue;\n }\n const name = a.name.getText(sf);\n if (!a.initializer) attrs[name] = true;\n else if (ts.isStringLiteral(a.initializer)) attrs[name] = a.initializer.text;\n else if (ts.isJsxExpression(a.initializer) && a.initializer.expression) attrs[name] = evaluate(a.initializer.expression, scope);\n }\n const children = ts.isJsxElement(jsx) ? jsx.children : undefined;\n\n // A design system component (Icon, Spinner...): rendered through its own TSX and CSS module.\n if (/^[A-Z]/.test(tag) && tag !== ctx.component && ctx.depth < 4 && ctx.reader.exists(tag)) {\n const nested = renderComponent(ctx.reader, tag, attrs, { ...ctx, depth: ctx.depth + 1 });\n if (nested) {\n if (tag === 'Icon') nested.kind = 'icon';\n if (visible) nested.visible = visible;\n return [nested];\n }\n }\n const node: Node = {\n key: '',\n tag,\n classes: classList(attrs.className),\n children: [],\n kind: INPUT_TAGS.has(tag) ? 'text' : 'frame',\n ...(visible ? { visible } : {}),\n };\n if (INPUT_TAGS.has(tag)) {\n node.inputLike = true;\n node.placeholder = true;\n node.text = { property: 'Placeholder', default: typeof attrs.placeholder === 'string' ? attrs.placeholder : 'Placeholder' };\n return [node];\n }\n if (children) node.children = renderChildren(children, scope, ctx);\n else if (spreads) node.takesChildren = true;\n return [node];\n}\n\nfunction renderChildren(children: ts.NodeArray<ts.JsxChild>, scope: Scope, ctx: RenderContext): Node[] {\n const out: Node[] = [];\n for (const c of children) {\n if (ts.isJsxText(c)) continue;\n if (ts.isJsxExpression(c)) {\n if (c.expression) out.push(...renderExpression(c.expression, scope, ctx));\n continue;\n }\n out.push(...renderJsx({ jsx: c, scope }, ctx));\n }\n return out;\n}\n\nfunction toggleOf(e: ts.Expression, scope: Scope): Node['visible'] {\n const inner = ts.isParenthesizedExpression(e) ? e.expression : e;\n if (!ts.isIdentifier(inner)) return undefined;\n const prop = scope.toggles.get(inner.text);\n return prop ? { property: sentenceCase(prop), prop } : undefined;\n}\n\nfunction renderExpression(e: ts.Expression, scope: Scope, ctx: RenderContext, visible?: Node['visible']): Node[] {\n if (ts.isParenthesizedExpression(e)) return renderExpression(e.expression, scope, ctx, visible);\n if (ts.isBinaryExpression(e) && e.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken) {\n const t = toggleOf(e.left, scope);\n if (t) return renderExpression(e.right, scope, ctx, visible ?? t);\n return truthy(evaluate(e.left, scope)) ? renderExpression(e.right, scope, ctx, visible) : [];\n }\n if (ts.isConditionalExpression(e)) {\n const t = toggleOf(e.condition, scope);\n if (t) return renderExpression(e.whenTrue, scope, ctx, visible ?? t);\n return renderExpression(truthy(evaluate(e.condition, scope)) ? e.whenTrue : e.whenFalse, scope, ctx, visible);\n }\n if (ts.isJsxElement(e) || ts.isJsxSelfClosingElement(e) || ts.isJsxFragment(e)) return renderJsx({ jsx: e, scope }, ctx, visible);\n const v = evaluate(e, scope);\n if (v === CHILDREN) return [{ key: '', tag: '#text', classes: [], children: [], kind: 'text', text: { property: 'Label', default: ctx.component, prop: 'children' } }];\n if (isJsx(v)) return renderJsx(v, ctx, visible);\n return [];\n}\n\n/** Renders a component for the given props into a node tree (its root node). */\nfunction renderComponent(reader: Reader, name: string, props: Record<string, Value>, ctx: RenderContext, fnOverride?: ts.FunctionLikeDeclaration): Node | undefined {\n const src = reader.load(name);\n const fn = fnOverride ?? src?.fn;\n if (!src || !fn) return undefined;\n const scope: Scope = { src, vars: new Map(), locals: new Map(), toggles: new Map(), main: ctx.depth === 0 };\n const names = bindProps(fn, scope, props);\n if (scope.main) {\n // Optional icon props are BOOLEAN properties (\"Icon start\"): their JSX condition shows a part.\n for (const [local, prop] of names) if (src.props.get(prop)?.kind === 'icon' && src.props.get(prop)?.optional) scope.toggles.set(local, prop);\n }\n const jsx = renderedJsx(fn, scope);\n if (!jsx) return undefined;\n const nodes = renderJsx(jsx, ctx);\n return nodes.length === 1 ? nodes[0] : nodes.length ? { key: '', tag: 'div', classes: [], children: nodes, kind: 'frame' } : undefined;\n}\n\n/** A wrapper whose only child is the text becomes the text part itself (Button's `<span class=\"label\">`). */\nfunction collapseText(n: Node, root = true): Node {\n n.children = n.children.map((c) => collapseText(c, false));\n // Only inline wrappers (span): a block (Card header) keeps its frame for its padding.\n if (!root && n.tag === 'span' && !n.name && n.kind === 'frame' && n.children.length === 1 && n.children[0]!.kind === 'text' && !n.children[0]!.classes.length && !n.children[0]!.inputLike) {\n const t = n.children[0]!;\n return { ...t, tag: n.tag, classes: n.classes, ...(n.visible ? { visible: n.visible } : {}) };\n }\n return n;\n}\n\n// ---------------------------------------------------------------------------------------------\n// Spec\n\ninterface Built {\n root: Node;\n /** Part id -> node, in tree order. */\n parts: Map<string, Node>;\n parents: Map<string, string | undefined>;\n}\n\n/** Renders the main component for one set of axis values, with stable part ids. */\nfunction build(reader: Reader, src: ComponentSource, props: Record<string, Value>): Built | undefined {\n const root = renderComponent(reader, src.name, { ...props, children: CHILDREN }, { reader, depth: 0, component: src.name });\n if (!root) return undefined;\n // Compound components (Card): children come through props, so draw the parts the file exports (CardHeader...).\n if (root.takesChildren && !root.children.length && src.subcomponents.length) {\n for (const sub of src.subcomponents) {\n const label = sub.name.slice(src.name.length);\n const n = renderComponent(reader, src.name, {}, { reader, depth: 1, component: src.name }, sub.fn);\n if (!n) continue;\n n.name = label;\n if (n.takesChildren && !n.children.length) n.children = [{ key: '', tag: '#text', classes: [], children: [], kind: 'text', text: { property: label, default: label } }];\n root.children.push(n);\n }\n }\n const tree = collapseText(root);\n const parts = new Map<string, Node>();\n const parents = new Map<string, string | undefined>();\n const used = new Set<string>();\n const slug = (s: string) => s.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n const assign = (n: Node, parent: string | undefined) => {\n let base: string;\n if (!parent) base = 'root';\n else if (n.visible) base = slug(n.visible.prop);\n else if (n.text && n.kind === 'text' && !n.placeholder) base = n.text.prop === 'children' ? 'text' : `${slug(n.text.property)}-text`;\n else if (n.placeholder) base = 'placeholder';\n else if (n.name) base = slug(n.name);\n else base = slug(n.classes[0]?.split('|')[1] ?? n.tag) || 'part';\n let id = base;\n for (let i = 2; used.has(id); i++) id = `${base}-${i}`;\n used.add(id);\n n.key = id;\n parts.set(id, n);\n parents.set(id, parent);\n for (const c of n.children) assign(c, id);\n };\n assign(tree, undefined);\n return { root: tree, parts, parents };\n}\n\nfunction toCssTree(b: Built): Map<string, CssElement> {\n const els = new Map<string, CssElement>();\n const make = (n: Node, parent: CssElement | undefined): CssElement => {\n const el: CssElement = { tag: n.tag, classes: new Set(n.classes), parent, children: [], present: !n.visible, isRoot: !parent, inputLike: !!n.inputLike };\n els.set(n.key, el);\n el.children = n.children.map((c) => make(c, el));\n return el;\n };\n make(b.root, undefined);\n return els;\n}\n\ninterface Resolved {\n value?: SpecValue;\n unmapped?: string;\n}\n\nconst isZero = (v: string) => /^0(px|rem|em|%)?$/.test(v);\n\n/** A CSS value as a token path, a literal 0, or null (no paint). */\nfunction resolveValue(raw: string | undefined, values: Map<string, string>, tokens: Map<string, TokenInfo>, depth = 0, parent?: Map<string, string>, forColor = false): Resolved | undefined {\n if (raw === undefined) return undefined;\n const v = raw.trim();\n const low = v.toLowerCase();\n if (depth > 12) return { unmapped: 'custom properties form a cycle' };\n if (low === 'transparent' || low === 'none') return { value: null };\n if (isZero(v)) return { value: 0 };\n // currentcolor is the element's color; inside `color` itself it is the parent's (CSS Color 4).\n if (low === 'currentcolor') return forColor ? resolveValue(parent?.get('color'), parent ?? new Map(), tokens, depth + 1) : resolveValue(values.get('color'), values, tokens, depth + 1, parent, true);\n if (low === 'normal' || low === 'auto' || low === 'inherit' || low === 'initial' || low === 'unset' || low === 'medium') return undefined;\n const m = /^var\\(\\s*(--[\\w-]+)\\s*(?:,\\s*([\\s\\S]+))?\\)$/.exec(v);\n if (m) {\n const name = m[1]!;\n const token = tokens.get(name);\n if (token) return { value: token.path };\n if (values.has(name)) return resolveValue(values.get(name), values, tokens, depth + 1, parent, forColor);\n if (m[2] !== undefined) return resolveValue(m[2], values, tokens, depth + 1, parent, forColor);\n return { unmapped: `${name} is not a token` };\n }\n if (/^calc\\(/i.test(v)) return calcValue(v, values, tokens, depth, parent);\n if (v === '100%') return { unmapped: 'fills its container: Figma draws it at a fixed width' };\n if (/%$/.test(v)) return { unmapped: 'relative size: the Figma part hugs its content' };\n return { unmapped: 'literal value, not a token' };\n}\n\n/**\n * A calc() of tokens (\"calc(var(--space-2) + var(--space-0-5))\") as an expression of token paths: \"calc(space.2 + space.0-5)\".\n * A calc() of a single token is that token (bound in Figma). Literals other than plain numbers and px are not mapped.\n */\nfunction calcValue(v: string, values: Map<string, string>, tokens: Map<string, TokenInfo>, depth: number, parent?: Map<string, string>): Resolved {\n const inner = v.slice(v.indexOf('(') + 1, v.lastIndexOf(')'));\n let failed: string | undefined;\n const substituted = inner.replace(/var\\(\\s*--[\\w-]+\\s*(?:,[^()]*)?\\)/g, (m) => {\n const r = resolveValue(m, values, tokens, depth + 1, parent);\n if (!r || r.unmapped !== undefined || r.value === null || r.value === undefined) {\n failed ??= r?.unmapped ?? `${m} has no value`;\n return '0';\n }\n if (r.value === 0) return '0';\n return r.value.startsWith('calc(') ? `(${r.value.slice(5, -1)})` : r.value;\n });\n if (failed) return { unmapped: `calc(): ${failed}` };\n const types = typesOf(tokens);\n const parts = substituted.match(/[()*/]|[^\\s()*/]+/g) ?? [];\n for (const t of parts) {\n if (/^[()*/+-]$/.test(t) || /^-?\\d+(\\.\\d+)?(px)?$/.test(t) || types.has(t)) continue;\n return { unmapped: `calc() with ${t}: only tokens, numbers and px are mapped` };\n }\n const paths = parts.filter((t) => types.has(t));\n if (!paths.length) return { unmapped: 'calc() of literals, not a token' };\n if (parts.length === 1) return { value: paths[0]! };\n return { value: `calc(${parts.join(' ').replace(/\\( /g, '(').replace(/ \\)/g, ')')})` };\n}\n\nconst FRAME_FIELDS: [string, SpecField][] = [\n ['background-color', 'fill'],\n ['border-radius', 'cornerRadius'],\n ['padding-top', 'paddingTop'],\n ['padding-right', 'paddingRight'],\n ['padding-bottom', 'paddingBottom'],\n ['padding-left', 'paddingLeft'],\n ['gap', 'itemSpacing'],\n ['width', 'width'],\n ['height', 'height'],\n ['min-width', 'minWidth'],\n ['min-height', 'minHeight'],\n];\n\nconst TEXT_FIELDS: [string, SpecField][] = [\n ['color', 'textFill'],\n ['font-family', 'fontFamily'],\n ['font-size', 'fontSize'],\n ['font-weight', 'fontWeight'],\n ['line-height', 'lineHeight'],\n ['letter-spacing', 'letterSpacing'],\n];\n\nconst SIDE_FIELDS: Record<string, SpecField> = { top: 'strokeTopWeight', right: 'strokeRightWeight', bottom: 'strokeBottomWeight', left: 'strokeLeftWeight' };\n\nconst typeCache = new WeakMap<Map<string, TokenInfo>, Map<string, TokenInfo>>();\n/** Token path -> token, for type checks. */\nfunction typesOf(tokens: Map<string, TokenInfo>): Map<string, TokenInfo> {\n let m = typeCache.get(tokens);\n if (!m) {\n m = new Map([...tokens.values()].map((t) => [t.path, t]));\n typeCache.set(tokens, m);\n }\n return m;\n}\n\nfunction expectedTypes(field: SpecField): string[] {\n if (COLOR_FIELDS.has(field)) return ['color'];\n if (field === 'fontFamily') return ['fontFamily'];\n if (field === 'fontWeight') return ['fontWeight', 'number'];\n return ['dimension', 'number'];\n}\n\ninterface PartValues {\n values: Partial<Record<SpecField, SpecValue>>;\n unmapped: { property: string; value: string; reason: string }[];\n}\n\nfunction partValues(node: Node, computed: Map<string, string>, own: Map<string, string>, tokens: Map<string, TokenInfo>, parent: Map<string, string> | undefined): PartValues {\n const out: PartValues = { values: {}, unmapped: [] };\n const set = (field: SpecField, prop: string, raw: string | undefined, skipZero = false) => {\n const r = resolveValue(raw, computed, tokens, 0, parent, prop === 'color');\n if (!r) return;\n if (r.unmapped) {\n out.unmapped.push({ property: prop, value: raw!, reason: r.unmapped });\n return;\n }\n if (r.value === 0 && skipZero) return;\n if (r.value === null && !COLOR_FIELDS.has(field)) return;\n if (typeof r.value === 'string') {\n const t = typesOf(tokens).get(r.value);\n if (t && !expectedTypes(field).includes(t.type)) {\n out.unmapped.push({ property: prop, value: raw!, reason: `${r.value} is a ${t.type} token, ${field} needs ${expectedTypes(field).join(' or ')}` });\n return;\n }\n }\n out.values[field] = r.value as SpecValue;\n };\n if (node.kind === 'text') {\n for (const [prop, field] of TEXT_FIELDS) set(field, prop, computed.get(prop));\n return out;\n }\n if (node.kind === 'icon') {\n set('width', 'width', computed.get('width'));\n set('height', 'height', computed.get('height'));\n set('stroke', 'color', computed.get('color'));\n set('strokeWeight', 'stroke-width', computed.get('stroke-width'));\n return out;\n }\n for (const [prop, field] of FRAME_FIELDS) set(field, prop, computed.get(prop), field === 'minWidth' || field === 'minHeight');\n // Borders: one stroke for four equal sides, or per-side weights (a top rule).\n const widths = (['top', 'right', 'bottom', 'left'] as const).map((s) => computed.get(`border-${s}-width`));\n const colors = (['top', 'right', 'bottom', 'left'] as const).map((s) => computed.get(`border-${s}-color`));\n const present = widths.map((w) => w !== undefined && !isZero(w));\n if (present.every(Boolean) && new Set(widths).size === 1 && new Set(colors).size === 1) {\n set('strokeWeight', 'border-width', widths[0]);\n set('stroke', 'border-color', colors[0]);\n } else if (present.some(Boolean)) {\n const colorAt = present.indexOf(true);\n set('stroke', 'border-color', colors[colorAt]);\n (['top', 'right', 'bottom', 'left'] as const).forEach((s, i) => (present[i] ? set(SIDE_FIELDS[s]!, `border-${s}-width`, widths[i]) : (out.values[SIDE_FIELDS[s]!] = 0)));\n }\n for (const [prop, reason] of Object.entries(REPORTED)) {\n const v = own.get(prop);\n if (v !== undefined && /var\\(/.test(v)) out.unmapped.push({ property: prop, value: v, reason });\n }\n return out;\n}\n\nfunction layoutOf(computed: Map<string, string>): SpecLayout {\n const dir = computed.get('flex-direction') ?? 'row';\n const display = computed.get('display') ?? 'block';\n const flex = /flex/.test(display);\n const justify = computed.get('justify-content') ?? 'normal';\n const align = computed.get('align-items') ?? 'normal';\n const primary = /center/.test(justify) ? 'CENTER' : /space-between/.test(justify) ? 'SPACE_BETWEEN' : /end/.test(justify) ? 'MAX' : 'MIN';\n const counter = /center/.test(align) ? 'CENTER' : /end/.test(align) ? 'MAX' : /stretch|normal/.test(align) && flex ? 'STRETCH' : 'MIN';\n return { direction: flex && !/column/.test(dir) ? 'HORIZONTAL' : 'VERTICAL', primary, counter: flex ? counter : 'STRETCH' };\n}\n\n/** `overflow: hidden | clip`: the frame clips its content (a card's footer fill inside its rounded corners). */\nconst clips = (c: Map<string, string> | undefined) => /^(hidden|clip)\\b/.test(c?.get('overflow') ?? c?.get('overflow-x') ?? '');\n\n/** A block-level root (display block, flex, grid) or `width: 100%`: in code it fills its container's width. */\nfunction fillsContainer(c: Map<string, string> | undefined): boolean {\n if (!c) return false;\n if (c.get('width') === '100%') return true;\n const display = c.get('display') ?? 'block';\n return /^(block|flex|grid|flow-root)$/.test(display);\n}\n\ninterface Evaluated {\n built: Built;\n values: SpecVariant['values'];\n unmapped: SpecUnmapped[];\n layouts: Map<string, SpecLayout>;\n /** Fingerprint of the classes rendered, to tell whether a prop changes anything. */\n classes: string;\n /** Part id -> computed CSS values. */\n computed: Map<string, Map<string, string>>;\n}\n\nfunction evaluateVariant(reader: Reader, src: ComponentSource, rules: CssRule[], props: Record<string, Value>, state: CssState, tokens: Map<string, TokenInfo>): Evaluated | undefined {\n const built = build(reader, src, props);\n if (!built) return undefined;\n const els = toCssTree(built);\n const computedById = new Map<string, Map<string, string>>();\n const values: SpecVariant['values'] = {};\n const unmapped: SpecUnmapped[] = [];\n const layouts = new Map<string, SpecLayout>();\n for (const [id, node] of built.parts) {\n const el = els.get(id)!;\n const parentId = built.parents.get(id);\n const own = declaredFor(rules, el, state);\n let computed = computeValues(own, parentId ? computedById.get(parentId) : undefined);\n const ownValues = new Map([...own].map(([k, d]) => [k, d.value]));\n if (node.placeholder) {\n // The placeholder text: the field's own values, then its ::placeholder rules.\n const ph = declaredFor(rules, el, state, 'placeholder');\n computed = computeValues(ph, computed);\n }\n computedById.set(id, computed);\n const pv = partValues(node, computed, ownValues, tokens, parentId ? computedById.get(parentId) : undefined);\n values[id] = pv.values;\n for (const u of pv.unmapped) unmapped.push({ part: id, ...u });\n if (node.kind === 'frame') layouts.set(id, layoutOf(computed));\n }\n const classes = [...built.parts].map(([id, n]) => `${id}:${n.classes.join(',')}:${n.visible?.prop ?? ''}`).join(';');\n return { built, values, unmapped, layouts, classes, computed: computedById };\n}\n\nfunction product(axes: { name: string; values: string[] }[]): Record<string, string>[] {\n let out: Record<string, string>[] = [{}];\n for (const a of axes) out = out.flatMap((p) => a.values.map((v) => ({ ...p, [a.name]: v })));\n return out;\n}\n\nconst sameValues = (a: SpecVariant['values'], b: SpecVariant['values']) => JSON.stringify(a) === JSON.stringify(b);\n\nconst BOX_FIELDS: SpecField[] = ['paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft', 'itemSpacing'];\nconst PAINT_FIELDS: SpecField[] = ['fill', 'stroke', 'strokeWeight', 'strokeTopWeight', 'strokeRightWeight', 'strokeBottomWeight', 'strokeLeftWeight', 'cornerRadius', 'width', 'height', 'minWidth', 'minHeight'];\nconst empty = (v: SpecValue | undefined) => v === undefined || v === 0 || v === null;\n\n/**\n * A root whose only child is a plain frame that only adds padding and gap (Tag's `<span class=\"label\">`): the wrapper\n * is merged into the root, so Figma gets one auto layout frame with the icon and the text, like Badge. Only when the CSS\n * allows it: the root has no padding or gap of its own, and the wrapper has no paint, border, radius or size, in every\n * variant.\n */\nfunction flattenWrapper(parts: SpecPart[], variants: SpecVariant[], unmapped: SpecUnmapped[]): void {\n const root = parts.find((p) => !p.parent);\n const children = parts.filter((p) => p.parent === root?.id);\n const w = children[0];\n if (!root || root.kind !== 'frame' || children.length !== 1 || !w || w.kind !== 'frame' || w.visible || w.clip) return;\n for (const v of variants) {\n const r = v.values[root.id] ?? {};\n const x = v.values[w.id] ?? {};\n if (BOX_FIELDS.some((f) => !empty(r[f])) || PAINT_FIELDS.some((f) => !empty(x[f]))) return;\n }\n for (const v of variants) {\n const r = (v.values[root.id] ??= {});\n const x = v.values[w.id] ?? {};\n for (const f of BOX_FIELDS) if (x[f] !== undefined) r[f] = x[f];\n delete v.values[w.id];\n }\n if (w.layout) root.layout = w.layout;\n if (w.source) root.source = root.source ? `${root.source}, ${w.source}` : w.source;\n for (const p of parts) if (p.parent === w.id) p.parent = root.id;\n for (const u of unmapped) if (u.part === w.id) u.part = root.id;\n parts.splice(parts.indexOf(w), 1);\n}\n\n/** The spec of one component, or an error message when it cannot be derived. */\nexport function generateComponentSpec(name: string, opts: SpecGeneratorOptions): ComponentSpec {\n const reader = new Reader(opts);\n const src = reader.load(name);\n if (!src) throw new Error(`${name}: ${opts.componentsDir}/${name}/${name}.tsx was not found.`);\n if (!src.fn) throw new Error(`${name}: no forwardRef(function ${name}(...)) or exported function ${name} in ${src.file}.`);\n\n // Every CSS module the rendered tree may use: the component's own, the ones it imports, and those of nested components.\n const modules = new Map<string, string>();\n const addModules = (s: ComponentSource | null) => {\n if (!s) return;\n for (const path of s.styles.values()) {\n if (modules.has(path)) continue;\n const text = opts.read(path);\n if (text !== undefined) modules.set(path, text);\n }\n };\n addModules(src);\n const nestedNames = new Set<string>();\n const findNested = (s: ComponentSource, depth: number) => {\n const visit = (n: ts.Node) => {\n if ((ts.isJsxOpeningElement(n) || ts.isJsxSelfClosingElement(n)) && /^[A-Z]/.test(n.tagName.getText(s.sf))) {\n const tag = n.tagName.getText(s.sf);\n if (tag !== name && !nestedNames.has(tag) && reader.exists(tag)) {\n nestedNames.add(tag);\n const other = reader.load(tag);\n addModules(other);\n if (other && depth < 3) findNested(other, depth + 1);\n }\n }\n ts.forEachChild(n, visit);\n };\n visit(s.sf);\n };\n findNested(src, 0);\n // Base styles of the nested components first, then the component's own (they override, as with CSS module order).\n const ordered = [...modules].sort(([a], [b]) => Number(a.startsWith(`${opts.componentsDir}/${name}/`)) - Number(b.startsWith(`${opts.componentsDir}/${name}/`)));\n const rules: CssRule[] = [];\n const cssErrors: string[] = [];\n for (const [path, text] of ordered) {\n const r = parseCssModule(path, text, rules.length);\n rules.push(...r.rules);\n cssErrors.push(...r.errors);\n }\n\n // Axes: string-literal union props that change the rendered classes.\n const base = evaluateVariant(reader, src, rules, {}, DEFAULT_STATE, opts.tokens);\n if (!base) throw new Error(`${name}: could not read what the component renders.`);\n const unmappedProps: SpecUnmapped[] = [];\n const axes: SpecAxis[] = [];\n const defaults = new Map<string, Value>();\n {\n const scope: Scope = { src, vars: new Map(), locals: new Map(), toggles: new Map(), main: true };\n bindProps(src.fn, scope, {});\n for (const [prop] of src.props) defaults.set(prop, scope.vars.get(prop));\n }\n for (const p of src.props.values()) {\n if (p.kind !== 'union' || !p.values) continue;\n const changes = p.values.some((v) => evaluateVariant(reader, src, rules, { [p.name]: v }, DEFAULT_STATE, opts.tokens)?.classes !== base.classes);\n if (!changes) {\n unmappedProps.push({ part: 'root', property: `prop ${p.name}`, value: p.values.join(' | '), reason: 'does not change the styles' });\n continue;\n }\n const def = defaults.get(p.name);\n axes.push({ name: sentenceCase(p.name), prop: p.name, values: [...p.values], default: typeof def === 'string' && p.values.includes(def) ? def : p.values[0]! });\n }\n\n const combos = product(axes);\n const propsFor = (combo: Record<string, string>) => Object.fromEntries(axes.map((a) => [a.prop!, combo[a.name]!]));\n const canDisable = src.native === 'button' || src.native === 'input' || src.native === 'textarea' || src.props.has('disabled');\n const states = STATES.filter((s) => s.name !== 'Disabled' || canDisable);\n const byState = new Map<string, Map<string, Evaluated>>();\n for (const s of states) {\n const m = new Map<string, Evaluated>();\n for (const combo of combos) {\n const ev = evaluateVariant(reader, src, rules, propsFor(combo), s.state, opts.tokens);\n if (ev) m.set(JSON.stringify(combo), ev);\n }\n byState.set(s.name, m);\n }\n // A state is drawn when it looks different from Default (and Pressed from Hover) in at least one variant.\n const differs = (s: string, from: string) =>\n combos.some((c) => {\n const a = byState.get(s)!.get(JSON.stringify(c));\n const b = byState.get(from)?.get(JSON.stringify(c));\n return a && b && !sameValues(a.values, b.values);\n });\n const stateNames = states\n .map((s) => s.name)\n .filter((s) => s === 'Default' || (differs(s, 'Default') && (s !== 'Pressed' || differs(s, 'Hover'))));\n if (stateNames.length > 1) axes.push({ name: 'State', values: stateNames, default: 'Default' });\n\n const variants: SpecVariant[] = [];\n const unmapped: SpecUnmapped[] = [];\n for (const combo of combos) {\n for (const s of stateNames.length > 1 ? stateNames : ['Default']) {\n const ev = byState.get(s)!.get(JSON.stringify(combo));\n if (!ev) continue;\n const props = stateNames.length > 1 ? { ...combo, State: s } : { ...combo };\n variants.push({ props, values: ev.values });\n unmapped.push(...ev.unmapped);\n }\n }\n if (variants.length > MAX_VARIANTS) throw new Error(`${name}: ${variants.length} variants, more than ${MAX_VARIANTS}. Split an axis before generating.`);\n\n // Parts, layout and properties come from the default variant.\n const parts: SpecPart[] = [];\n const properties: SpecProperty[] = [];\n for (const [id, n] of base.built.parts) {\n const parent = base.built.parents.get(id);\n const part: SpecPart = {\n id,\n name: !parent ? name : n.kind === 'text' ? n.text!.property : n.visible ? n.visible.property : n.name ?? (n.kind === 'icon' ? 'Icon' : n.classes[0]?.split('|')[1] ?? n.tag),\n kind: n.kind,\n ...(parent ? { parent } : {}),\n ...(n.classes.length ? { source: n.classes.map((c) => c.split('|').map((x, i) => (i === 0 ? posix.basename(x) : `.${x}`)).join(' ')).join(', ') } : {}),\n ...(n.kind === 'frame' ? { layout: base.layouts.get(id) } : {}),\n ...(n.kind === 'frame' && clips(base.computed.get(id)) ? { clip: true } : {}),\n ...(!parent && fillsContainer(base.computed.get(id)) ? { fill: true } : {}),\n ...(n.text ? { text: n.text.property } : {}),\n ...(n.visible ? { visible: n.visible.property } : {}),\n };\n parts.push(part);\n if (n.text && !properties.some((p) => p.name === n.text!.property)) properties.push({ name: n.text.property, type: 'TEXT', default: n.text.default, ...(n.text.prop ? { prop: n.text.prop } : {}) });\n }\n for (const n of base.built.parts.values())\n if (n.visible && !properties.some((p) => p.name === n.visible!.property)) properties.push({ name: n.visible.property, type: 'BOOLEAN', default: false, prop: n.visible.prop });\n\n // Props the spec does not draw (loading, slots...), so readers know what is missing.\n const used = new Set([...axes.map((a) => a.prop), ...properties.map((p) => p.prop), 'disabled', 'className', 'children', 'render']);\n for (const p of src.props.values()) {\n if (used.has(p.name) || p.kind === 'function' || p.kind === 'string' || p.kind === 'other' || p.kind === 'union') continue;\n unmappedProps.push({ part: 'root', property: `prop ${p.name}`, value: p.kind, reason: p.kind === 'node' ? 'slot content is not drawn' : p.kind === 'icon' ? 'icon prop with no icon part' : 'not drawn in this version' });\n }\n for (const e of cssErrors) unmappedProps.push({ part: 'root', property: 'css', value: e, reason: 'selector not understood' });\n\n flattenWrapper(parts, variants, unmapped);\n const swapped = addSwaps(name, src, parts, properties, axes, variants, opts);\n for (let i = unmappedProps.length - 1; i >= 0; i--) if (swapped.has(unmappedProps[i]!.property.replace(/^prop /, ''))) unmappedProps.splice(i, 1);\n\n const seen = new Set<string>();\n const dedup = [...unmappedProps, ...unmapped].filter((u) => {\n const k = `${u.part}|${u.property}|${u.reason}`;\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n // Every variant lists all of its fields (even when equal across variants): the plugin binds per variant.\n const source = [src.file, ...[...modules.keys()].sort()];\n const spec: Omit<ComponentSpec, 'hash'> = { name, source, axes, properties, parts, variants, unmapped: dedup };\n return { name, hash: hashSpec(spec), source, axes, properties, parts, variants, unmapped: dedup };\n}\n\n\n// ---------------------------------------------------------------------------------------------\n// Swappable parts: icons and content slots\n\n/** Icons every pulled file gets besides the ones the components use, so designers can swap without importing. */\nexport const COMMON_ICONS = ['Plus', 'Minus', 'Pencil', 'Trash2', 'Copy', 'Search', 'X', 'Check', 'ChevronDown', 'ChevronRight', 'Info', 'AlertTriangle', 'Star', 'Settings', 'ExternalLink', 'Download', 'Upload', 'Ellipsis'];\n\n/** Default icon of a slot when neither the docs preview nor the AllStates story shows one. */\nconst FALLBACK_ICON: Record<string, string> = { Badge: 'Info' };\nconst DEFAULT_FALLBACK_ICON = 'Plus';\n\n/** The icon components themselves: Icon.tsx draws `sm` by default; Lucide's grid is 24, the `lg` size. */\nexport const ICON_STYLE: SpecIconStyle = { size: 'icon.size.lg', color: 'color.text.default', stroke: 'icon.stroke' };\n\n/** Media slot: a neutral plate with a centered image icon, 16:9, as wide as a card (size.80). */\nexport const MEDIA_SLOT: SpecSlot = {\n name: 'Slot/Media',\n kind: 'media',\n values: { fill: 'color.bg.muted', width: 'size.80' },\n aspect: [16, 9],\n icon: 'Image',\n iconValues: { width: 'icon.size.lg', height: 'icon.size.lg', stroke: 'color.text.muted', strokeWeight: 'icon.stroke' },\n};\n\ninterface DocNode {\n c?: string;\n p?: Record<string, unknown>;\n children?: unknown[];\n}\n\n/** Every `{ c, p }` element of a docs.json value, in document order. */\nfunction docElements(v: unknown, out: DocNode[] = []): DocNode[] {\n if (Array.isArray(v)) for (const x of v) docElements(x, out);\n else if (v && typeof v === 'object') {\n const n = v as DocNode;\n if (typeof n.c === 'string') out.push(n);\n for (const x of Object.values(v)) docElements(x, out);\n }\n return out;\n}\n\nfunction readDocs(name: string, opts: SpecGeneratorOptions): Record<string, unknown> | undefined {\n const text = opts.read(`${opts.componentsDir}/${name}/${name}.docs.json`);\n if (!text) return undefined;\n try {\n return JSON.parse(text) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n}\n\nfunction readStories(name: string, opts: SpecGeneratorOptions): ts.SourceFile | undefined {\n const file = `${opts.componentsDir}/${name}/${name}.stories.tsx`;\n const text = opts.read(file);\n return text === undefined ? undefined : ts.createSourceFile(file, text, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);\n}\n\n/** Names imported from lucide-react by a stories file. */\nfunction storyIcons(sf: ts.SourceFile | undefined): string[] {\n const out: string[] = [];\n for (const st of sf?.statements ?? []) {\n if (!ts.isImportDeclaration(st) || unquote(st.moduleSpecifier.getText(sf)) !== 'lucide-react') continue;\n const b = st.importClause?.namedBindings;\n if (b && ts.isNamedImports(b)) for (const e of b.elements) if (!e.isTypeOnly) out.push((e.propertyName ?? e.name).text);\n }\n return out;\n}\n\n/** First icon the AllStates story passes to `<Name prop={Icon}>` (the false branch of a condition: the general case). */\nfunction allStatesIcon(sf: ts.SourceFile | undefined, name: string, prop: string): string | undefined {\n if (!sf) return undefined;\n let decl: ts.Node | undefined;\n for (const st of sf.statements)\n if (ts.isVariableStatement(st)) for (const d of st.declarationList.declarations) if (ts.isIdentifier(d.name) && d.name.text === 'AllStates') decl = d;\n let found: string | undefined;\n const pick = (e: ts.Expression): string | undefined => {\n if (ts.isParenthesizedExpression(e)) return pick(e.expression);\n if (ts.isIdentifier(e)) return e.text;\n if (ts.isConditionalExpression(e)) return pick(e.whenFalse);\n return undefined;\n };\n const visit = (n: ts.Node) => {\n if (found) return;\n if ((ts.isJsxOpeningElement(n) || ts.isJsxSelfClosingElement(n)) && n.tagName.getText(sf) === name) {\n for (const a of n.attributes.properties) {\n if (!ts.isJsxAttribute(a) || a.name.getText(sf) !== prop || !a.initializer || !ts.isJsxExpression(a.initializer) || !a.initializer.expression) continue;\n found = pick(a.initializer.expression);\n if (found) return;\n }\n }\n ts.forEachChild(n, visit);\n };\n if (decl) visit(decl);\n return found;\n}\n\n/** Default icon of an icon prop: the docs preview, then the AllStates story, then a fallback. */\nfunction defaultIcon(name: string, prop: string, opts: SpecGeneratorOptions): string {\n const docs = readDocs(name, opts);\n for (const el of docElements(docs?.preview)) {\n const v = el.c === name ? el.p?.[prop] : undefined;\n if (typeof v === 'string' && /^[A-Z]\\w*$/.test(v)) return v;\n }\n return allStatesIcon(readStories(name, opts), name, prop) ?? FALLBACK_ICON[name] ?? DEFAULT_FALLBACK_ICON;\n}\n\n/** Icon names a component's docs (icon props of any element) and stories (lucide-react imports) reference. */\nfunction referencedIcons(name: string, opts: SpecGeneratorOptions): string[] {\n const out: string[] = [];\n for (const el of docElements(readDocs(name, opts)))\n for (const [k, v] of Object.entries(el.p ?? {})) if (/^icon/i.test(k) && typeof v === 'string' && /^[A-Z]\\w*$/.test(v)) out.push(v);\n out.push(...storyIcons(readStories(name, opts)));\n return out;\n}\n\nconst zeroInline = (v: Partial<Record<SpecField, SpecValue>> | undefined) => !!v && v.paddingLeft === 0 && v.paddingRight === 0;\n\n/**\n * Marks the swappable parts of a spec and returns the code props they stand for:\n * - Icon parts swap between every icon (\"Icon\", \"Icon start\"), default from the docs or stories. Optional icons keep\n * their BOOLEAN visibility property.\n * - A compound part's content (a text in a non-root frame) that code draws full-bleed in some variant (no inline\n * padding: Card padding none, for media) becomes a content slot: \"Slot/<Component> <part> text\" or \"Slot/Media\",\n * Media by default where it is full-bleed. Its TEXT property moves to the text slot component.\n */\nfunction addSwaps(name: string, src: ComponentSource, parts: SpecPart[], properties: SpecProperty[], axes: SpecAxis[], variants: SpecVariant[], opts: SpecGeneratorOptions): Set<string> {\n const props = new Set<string>();\n const iconProps = [...src.props.values()].filter((p) => p.kind === 'icon');\n const defaultKey = variantKeyOf(Object.fromEntries(axes.map((a) => [a.name, a.default])));\n const defaultVariant = variants.find((v) => variantKeyOf(v.props) === defaultKey) ?? variants[0];\n const setSlot = (part: string, value: (v: SpecVariant) => string) => {\n for (const v of variants) (v.slots ??= {})[part] = value(v);\n };\n for (const part of parts) {\n if (part.kind === 'icon') {\n const visibleProp = part.visible ? properties.find((p) => p.type === 'BOOLEAN' && p.name === part.visible)?.prop : undefined;\n const prop = visibleProp ?? iconProps.find((p) => !p.optional && !properties.some((x) => x.prop === p.name))?.name;\n if (!prop) continue;\n const icon = iconComponentName(defaultIcon(name, prop, opts));\n part.swap = { property: sentenceCase(prop), default: icon, prop };\n setSlot(part.id, () => icon);\n props.add(prop);\n continue;\n }\n const parent = parts.find((p) => p.id === part.parent);\n if (part.kind !== 'text' || !part.text || !parent?.parent || parent.kind !== 'frame') continue;\n if (!variants.some((v) => zeroInline(v.values[parent.id]))) continue;\n const textSlot = `Slot/${name} ${part.text.toLowerCase()} text`;\n const media = MEDIA_SLOT.name;\n part.swap = { property: part.text, default: zeroInline(defaultVariant?.values[parent.id]) ? media : textSlot, options: [textSlot, media] };\n setSlot(part.id, (v) => (zeroInline(v.values[parent.id]) ? media : textSlot));\n const i = properties.findIndex((p) => p.type === 'TEXT' && p.name === part.text);\n if (i >= 0) properties.splice(i, 1);\n delete part.text;\n }\n return props;\n}\n\n// ---------------------------------------------------------------------------------------------\n// Lucide icons\n\n/** lucide-react export name -> icon id, from the ESM index (\"export { default as Trash2, ... } from './icons/trash.mjs'\"). */\nfunction lucideIndex(dir: string, opts: SpecGeneratorOptions): Map<string, string> {\n const text = opts.read(`${dir}/lucide-react.mjs`) ?? opts.read(`${dir}/lucide-react.js`);\n if (text === undefined) throw new Error(`lucide-react was not found at ${dir}: run npm install.`);\n const out = new Map<string, string>();\n for (const m of text.matchAll(/export\\s*\\{([^}]*)\\}\\s*from\\s*'\\.\\/icons\\/([\\w-]+)\\.m?js'/g)) {\n for (const part of m[1]!.split(',')) {\n const n = /default as (\\w+)/.exec(part.trim());\n if (n) out.set(n[1]!, m[2]!);\n }\n }\n return out;\n}\n\nconst attrText = (v: string | number) => String(v).replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/</g, '&lt;');\n\n/** The icon's SVG from its lucide-react module (`__iconData.node` or `__iconNode`), with Lucide's default attributes. */\nfunction lucideSvg(dir: string, id: string, opts: SpecGeneratorOptions): string {\n const file = `${dir}/icons/${id}.mjs`;\n const text = opts.read(file) ?? opts.read(`${dir}/icons/${id}.js`);\n if (text === undefined) throw new Error(`lucide-react has no icon file ${file}.`);\n const sf = ts.createSourceFile(file, text, ts.ScriptTarget.Latest, true, ts.ScriptKind.JS);\n let nodeArray: ts.ArrayLiteralExpression | undefined;\n const visit = (n: ts.Node) => {\n if (nodeArray) return;\n if (ts.isVariableDeclaration(n) && ts.isIdentifier(n.name) && n.initializer) {\n if (n.name.text === '__iconNode' && ts.isArrayLiteralExpression(n.initializer)) nodeArray = n.initializer;\n if (n.name.text === '__iconData' && ts.isObjectLiteralExpression(n.initializer)) {\n const prop = n.initializer.properties.find((p): p is ts.PropertyAssignment => ts.isPropertyAssignment(p) && p.name.getText(sf) === 'node');\n if (prop && ts.isArrayLiteralExpression(prop.initializer)) nodeArray = prop.initializer;\n }\n }\n ts.forEachChild(n, visit);\n };\n visit(sf);\n if (!nodeArray) throw new Error(`${file}: no icon node found.`);\n const children = nodeArray.elements.map((el) => {\n if (!ts.isArrayLiteralExpression(el)) throw new Error(`${file}: unexpected icon node.`);\n const [tag, attrs] = el.elements;\n const name = tag && ts.isStringLiteral(tag) ? tag.text : '';\n const pairs: string[] = [];\n if (attrs && ts.isObjectLiteralExpression(attrs)) {\n for (const p of attrs.properties) {\n if (!ts.isPropertyAssignment(p)) continue;\n const key = unquote(p.name.getText(sf));\n if (key === 'key') continue;\n const v = p.initializer;\n const value = ts.isStringLiteral(v) || ts.isNoSubstitutionTemplateLiteral(v) ? v.text : ts.isNumericLiteral(v) ? Number(v.text) : undefined;\n if (value !== undefined) pairs.push(`${key}=\"${attrText(value)}\"`);\n }\n }\n return `<${name}${pairs.length ? ` ${pairs.join(' ')}` : ''}/>`;\n });\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${children.join('')}</svg>`;\n}\n\n/**\n * The icons section: every icon a slot defaults to, every icon the components' docs and stories reference, the media\n * slot's icon, then the common set. One entry per Lucide icon (aliases folded into the first name seen), sorted by name.\n */\nexport function generateIcons(components: ComponentSpec[], opts: SpecGeneratorOptions, slots: SpecSlot[] = []): SpecIcon[] {\n const dir = opts.lucideDir ?? 'node_modules/lucide-react/dist/esm';\n const index = lucideIndex(dir, opts);\n const names: string[] = [];\n for (const c of components) {\n for (const p of c.parts) if (p.swap && !p.swap.options) names.push(p.swap.default.replace(/^Icon\\//, ''));\n names.push(...referencedIcons(c.name, opts));\n }\n for (const s of slots) if (s.icon) names.push(s.icon);\n names.push(...COMMON_ICONS);\n const byId = new Map<string, SpecIcon>();\n for (const n of names) {\n const id = index.get(n);\n if (!id) throw new Error(`Icon ${n} is not exported by lucide-react.`);\n const hit = byId.get(id);\n if (!hit) byId.set(id, { name: n, lucide: id, svg: lucideSvg(dir, id, opts) });\n else if (hit.name !== n && !hit.aliases?.includes(n)) (hit.aliases ??= []).push(n);\n }\n return [...byId.values()].sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0)).map((i) => (i.aliases ? { ...i, aliases: [...i.aliases].sort() } : i));\n}\n\n/** Content components the specs' slots swap to: each component's text slot (its default variant's text fields), then Media. */\nexport function generateSlots(components: ComponentSpec[]): SpecSlot[] {\n const out: SpecSlot[] = [];\n let media = false;\n for (const c of components) {\n const defaultKey = variantKeyOf(Object.fromEntries(c.axes.map((a) => [a.name, a.default])));\n const v = c.variants.find((x) => variantKeyOf(x.props) === defaultKey) ?? c.variants[0];\n for (const p of c.parts) {\n if (!p.swap?.options) continue;\n for (const o of p.swap.options) {\n if (o === MEDIA_SLOT.name) media = true;\n else if (!out.some((s) => s.name === o)) out.push({ name: o, kind: 'text', values: { ...(v?.values[p.id] ?? {}) }, text: { property: 'Text', default: p.name } });\n }\n }\n }\n if (media) out.push(MEDIA_SLOT);\n return out;\n}\n\nexport function generateComponentSpecs(names: string[], opts: SpecGeneratorOptions): ComponentSpecsFile {\n const components = names.map((n) => generateComponentSpec(n, opts));\n const slots = generateSlots(components);\n return {\n version: COMPONENT_SPECS_VERSION,\n generated: 'Generated by `npm run specs` from the component TSX and CSS modules. Do not edit: the test suite fails when it is out of date.',\n components,\n icons: generateIcons(components, opts, slots),\n iconStyle: ICON_STYLE,\n slots,\n };\n}\n\n// ---------------------------------------------------------------------------------------------\n// Repo helpers (Node)\n\n/** The 6 base components of the first version. The generator works on any component folder. */\nexport const SPEC_COMPONENTS = ['Button', 'IconButton', 'Badge', 'Tag', 'Input', 'Card'];\n\n/** CSS custom property -> token, for every token of the repo (all tiers), with the repo's cssVar convention. */\nexport function tokenCssIndex(files: Record<string, string>, opts: { prefix?: string; separator?: string; layout?: Parameters<typeof buildTokenSet>[1] } = {}): Map<string, TokenInfo> {\n const set = buildTokenSet(files, opts.layout ?? {});\n const out = new Map<string, TokenInfo>();\n for (const t of set.tokens.values()) {\n const v = tokenCssVar(t.path, opts.prefix, opts.separator);\n if (!out.has(v)) out.set(v, { path: t.path, type: t.type });\n }\n return out;\n}\n\n/** Specs of `names` for the repo at `root`, with bridge.config.json (tokens root, components dir, cssVar). */\nexport function generateRepoComponentSpecs(root: string, names: string[] = SPEC_COMPONENTS): ComponentSpecsFile {\n const configText = readFileSync(join(root, CONFIG_FILE), 'utf8');\n const config = loadConfig(configText);\n const tokensRoot = join(root, config.tokens.root);\n const files: Record<string, string> = {};\n const walk = (dir: string) => {\n for (const n of readdirSync(dir)) {\n const full = join(dir, n);\n if (statSync(full).isDirectory()) walk(full);\n else if (n.endsWith('.tokens.json')) files[relative(tokensRoot, full).split('\\\\').join('/')] = readFileSync(full, 'utf8');\n }\n };\n walk(tokensRoot);\n const tokens = tokenCssIndex(files, { prefix: config.cssVar.prefix, separator: config.cssVar.separator, layout: layoutOptions(config) });\n const read = (p: string) => {\n try {\n return readFileSync(join(root, p), 'utf8');\n } catch {\n return undefined;\n }\n };\n const componentsDir = config.components?.dir ?? 'packages/react/src/components';\n return generateComponentSpecs(names, { componentsDir, read, tokens, styleSuffix: config.components?.styleSuffix });\n}\n\n/** The JSON text written to disk: stable, two-space indent, trailing newline. */\nexport const serializeComponentSpecs = (f: ComponentSpecsFile) => `${JSON.stringify(f, null, 2)}\\n`;\n"],"names":["resolve","sep","walk","width","l"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../../src/node/git-local.ts","../../src/node/git-history.ts","../../src/node/audit.ts","../../src/node/spec-css.ts","../../src/node/component-specs.ts"],"sourcesContent":["// Local git through plumbing commands (Node only). A proposal becomes a commit on a new branch without\n// touching the working tree, the index or the checked-out branch, and nothing is ever pushed.\nimport { execFile } from 'node:child_process';\nimport { mkdtemp, rm } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport { join } from 'node:path';\nimport { type BranchRules, assertSafeBranch } from '../governance';\n\nexport function git(root: string, args: string[], opts: { input?: string; env?: Record<string, string> } = {}): Promise<string> {\n return new Promise((resolve, reject) => {\n const child = execFile('git', args, { cwd: root, env: { ...process.env, ...opts.env }, maxBuffer: 32 * 1024 * 1024 }, (err, stdout, stderr) => {\n if (err) reject(new Error(`git ${args.join(' ')}: ${stderr || err.message}`.trim()));\n else resolve(stdout);\n });\n if (opts.input !== undefined) child.stdin!.end(opts.input);\n });\n}\n\nexport async function isGitRepo(root: string): Promise<boolean> {\n try {\n return (await git(root, ['rev-parse', '--is-inside-work-tree'])).trim() === 'true';\n } catch {\n return false;\n }\n}\n\nexport async function currentBranch(root: string): Promise<string> {\n return (await git(root, ['rev-parse', '--abbrev-ref', 'HEAD'])).trim();\n}\n\nexport async function branchExists(root: string, branch: string): Promise<boolean> {\n try {\n await git(root, ['rev-parse', '--verify', '--quiet', `refs/heads/${branch}`]);\n return true;\n } catch {\n return false;\n }\n}\n\n/** File text at a ref, or null when it does not exist there. */\nexport async function showFile(root: string, ref: string, path: string): Promise<string | null> {\n try {\n return await git(root, ['show', `${ref}:${path}`]);\n } catch {\n return null;\n }\n}\n\nexport async function listFilesAt(root: string, ref: string): Promise<string[]> {\n return (await git(root, ['ls-tree', '-r', '--name-only', ref])).split('\\n').filter(Boolean);\n}\n\n/** \"owner/name\" of the origin remote when it is on github.com. */\nexport async function originRepo(root: string): Promise<string | undefined> {\n try {\n const url = (await git(root, ['remote', 'get-url', 'origin'])).trim();\n return /github\\.com[:/]([\\w.-]+\\/[\\w.-]+?)(\\.git)?$/.exec(url)?.[1];\n } catch {\n return undefined;\n }\n}\n\nexport interface LocalCommitInput extends BranchRules {\n /** Ref the commit builds on (\"HEAD\", a branch or a sha). */\n base: string;\n branch: string;\n message: string;\n files: { path: string; content: string | null }[];\n}\n\n/**\n * Commits `files` on top of `base` into the new branch `branch` using a throwaway index. Refuses protected\n * branches (and, with branchPrefix, branches without it) and existing branches: nothing is ever overwritten.\n */\nexport async function commitToNewLocalBranch(root: string, args: LocalCommitInput): Promise<{ sha: string; diff: string }> {\n try {\n assertSafeBranch(args.branch, args);\n } catch (err) {\n throw new Error(`Refusing to write branch \"${args.branch}\": ${(err as Error).message}`);\n }\n if (await branchExists(root, args.branch)) throw new Error(`Branch \"${args.branch}\" already exists. Pick another title or delete it first.`);\n const baseSha = (await git(root, ['rev-parse', '--verify', `${args.base}^{commit}`])).trim();\n const dir = await mkdtemp(join(tmpdir(), 'bridge-index-'));\n const env = { GIT_INDEX_FILE: join(dir, 'index') };\n try {\n await git(root, ['read-tree', baseSha], { env });\n for (const f of args.files) {\n if (f.content === null) {\n await git(root, ['update-index', '--force-remove', f.path], { env });\n continue;\n }\n const blob = (await git(root, ['hash-object', '-w', '--stdin'], { input: f.content })).trim();\n await git(root, ['update-index', '--add', '--cacheinfo', `100644,${blob},${f.path}`], { env });\n }\n const tree = (await git(root, ['write-tree'], { env })).trim();\n const ident = await identityEnv(root);\n const sha = (await git(root, ['commit-tree', tree, '-p', baseSha, '-F', '-'], { input: args.message, env: ident })).trim();\n // Empty old value: create only, fail if the ref appeared meanwhile.\n await git(root, ['update-ref', `refs/heads/${args.branch}`, sha, '']);\n const diff = await git(root, ['diff', baseSha, sha]);\n return { sha, diff };\n } finally {\n await rm(dir, { recursive: true, force: true });\n }\n}\n\nasync function identityEnv(root: string): Promise<Record<string, string>> {\n const get = async (k: string) => (await git(root, ['config', k]).catch(() => '')).trim();\n const name = (await get('user.name')) || 'Bridge';\n const email = (await get('user.email')) || 'bridge@users.noreply.github.com';\n return { GIT_AUTHOR_NAME: name, GIT_AUTHOR_EMAIL: email, GIT_COMMITTER_NAME: name, GIT_COMMITTER_EMAIL: email };\n}\n","// History from a local git repository (Node only): first-parent commits of a ref that touched the tokens\n// root, so a merged branch is one entry (the merge commit against the base it merged into). PR numbers come\n// from merge and squash subjects. Blobs are read once per sha.\nimport { type BridgeConfig } from '../config';\nimport { type HistoryBackend, type HistoryCommit, type HistoryReport, buildReport, collectHistory, mergeReleases, packageDirCandidates, parseChangelog, prNumberFromSubject, releasesFromTags } from '../history';\nimport { selectTokenFiles } from '../layered';\nimport { git, showFile } from './git-local';\n\nconst US = '\\u001f';\nconst RS = '\\u001e';\n\nexport function localGitHistoryBackend(root: string, config: BridgeConfig): HistoryBackend {\n const trees = new Map<string, Promise<{ path: string; sha: string }[]>>();\n const blobs = new Map<string, Promise<string>>();\n const tokenRoot = config.tokens.root.replace(/\\/$/, '');\n const prefix = tokenRoot === '.' || !tokenRoot ? '' : `${tokenRoot}/`;\n const lsTree = (sha: string, path: string) => {\n const k = `${sha}:${path}`;\n let t = trees.get(k);\n if (!t) {\n t = git(root, ['ls-tree', '-r', sha, '--', path || '.']).then((out) =>\n out\n .split('\\n')\n .filter(Boolean)\n .map((l) => {\n const [meta, p] = l.split('\\t');\n return { path: p!, sha: meta!.split(' ')[2]! };\n }),\n );\n trees.set(k, t);\n }\n return t;\n };\n const blob = (sha: string) => {\n let b = blobs.get(sha);\n if (!b) {\n b = git(root, ['cat-file', 'blob', sha]);\n blobs.set(sha, b);\n }\n return b;\n };\n return {\n async listCommits({ ref, paths, limit }) {\n const fmt = ['%H', '%P', '%cI', '%an', '%s', '%b'].join(US) + RS;\n const out = await git(root, ['log', '--first-parent', `-n${limit}`, `--format=${fmt}`, ref, '--', ...(paths.length ? paths : ['.'])]);\n return out\n .split(RS)\n .map((r) => r.replace(/^\\n/, ''))\n .filter((r) => r.trim())\n .map((r): HistoryCommit => {\n const [sha, parents, date, author, subject, body] = r.split(US);\n const n = prNumberFromSubject(subject ?? '');\n return { sha: sha!, parents: (parents ?? '').split(' ').filter(Boolean), date: date!, author: author!, subject: subject ?? '', body: (body ?? '').trim(), ...(n ? { pr: { number: n, title: '' } } : {}) };\n })\n .map((c) => (c.pr && !c.pr.title ? { ...c, pr: undefined } : c))\n .map((c) => {\n const { pr, ...rest } = c;\n return pr ? c : rest;\n });\n },\n async tokenFiles(sha) {\n const entries = await lsTree(sha, tokenRoot === '.' ? '' : tokenRoot);\n const picked = new Set(selectTokenFiles(config, entries.map((e) => e.path)));\n const wanted = entries.filter((e) => picked.has(prefix ? e.path.slice(prefix.length) : e.path));\n return new Map(await Promise.all(wanted.map(async (e) => [prefix ? e.path.slice(prefix.length) : e.path, await blob(e.sha)] as const)));\n },\n async changesetPaths(sha) {\n const dir = config.changesets?.dir.replace(/\\/$/, '');\n return dir ? (await lsTree(sha, dir)).map((e) => e.path) : [];\n },\n async readFile(sha, path) {\n return showFile(root, sha, path);\n },\n };\n}\n\n/** Tags with their commit and date: `v1.2.0`, `@scope/pkg@1.2.0`. */\nexport async function localTags(root: string): Promise<{ name: string; sha: string; date: string }[]> {\n const out = await git(root, ['for-each-ref', 'refs/tags', '--format=%(refname:short)%09%(*objectname)%09%(objectname)%09%(creatordate:iso-strict)']).catch(() => '');\n return out\n .split('\\n')\n .filter(Boolean)\n .map((l) => {\n const [name, peeled, obj, date] = l.split('\\t');\n return { name: name!, sha: peeled || obj!, date: date! };\n });\n}\n\n/** The whole history report for a local repo at `ref` (default HEAD). */\nexport async function loadLocalHistory(root: string, config: BridgeConfig, opts: { ref?: string; limit?: number } = {}): Promise<HistoryReport> {\n const ref = opts.ref ?? 'HEAD';\n const limit = opts.limit ?? 40;\n const backend = localGitHistoryBackend(root, config);\n let listed = 0;\n const counted: HistoryBackend = {\n ...backend,\n listCommits: async (o) => {\n const r = await backend.listCommits(o);\n listed = r.length;\n return r;\n },\n };\n // A shallow clone (CI, Vercel) has a cut history: read what is there.\n const entries = await collectHistory(config, counted, { ref, limit });\n let changelog: ReturnType<typeof parseChangelog> = [];\n let currentVersion: string | undefined;\n for (const dir of packageDirCandidates(config)) {\n const p = (f: string) => (dir ? `${dir}/${f}` : f);\n const [cl, pkg] = await Promise.all([showFile(root, ref, p('CHANGELOG.md')), showFile(root, ref, p('package.json'))]);\n if (cl === null && pkg === null) continue;\n if (cl) changelog = parseChangelog(cl);\n if (pkg) {\n try {\n const json = JSON.parse(pkg) as { name?: string; version?: string };\n if (!config.changesets || json.name === config.changesets.package) currentVersion = json.version;\n } catch {\n /* not JSON */\n }\n }\n break;\n }\n const releases = mergeReleases(changelog, releasesFromTags(await localTags(root), config.changesets?.package));\n return buildReport({ source: 'git', label: `${root}@${ref}`, ref, entries, releases, ...(currentVersion ? { currentVersion } : {}), truncated: listed >= limit });\n}\n","// Node side of `bridge audit`: load the design system from its repo and read a product folder from disk.\nimport { existsSync, readdirSync, readFileSync, statSync, writeFileSync } from 'node:fs';\nimport { dirname, join, relative, resolve, sep } from 'node:path';\nimport { loadConfig, type BridgeConfig } from '../config';\nimport { globToRegExp, LayeredTokenSet, selectTokenFiles } from '../layered';\nimport { AUDIT_IGNORE_DIRS, buildAuditReport, compareWithBaseline, isAuditable, planCssFixes, type CssFixEdit } from '../audit/report';\nimport { DesignSystemIndex } from '../audit/ds-index';\nimport { parseAllowlist } from '../audit/ignore';\nimport type { AllowlistEntry, AuditReport } from '../audit/types';\n\nexport interface LoadedDesignSystem {\n root: string;\n config: BridgeConfig;\n set: LayeredTokenSet;\n index: DesignSystemIndex;\n}\n\nconst toPosix = (p: string) => p.split(sep).join('/');\n\nfunction walk(dir: string, root: string, out: string[], skipDirs: string[]): void {\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return;\n }\n for (const name of entries) {\n const abs = join(dir, name);\n let st;\n try {\n st = statSync(abs);\n } catch {\n continue;\n }\n if (st.isDirectory()) {\n if (!skipDirs.includes(name)) walk(abs, root, out, skipDirs);\n } else out.push(toPosix(relative(root, abs)));\n }\n}\n\n/** Nearest folder at or above `from` with a bridge.config.json. */\nexport function findDesignSystemRoot(from: string): string | undefined {\n let dir = resolve(from);\n for (;;) {\n if (existsSync(join(dir, 'bridge.config.json'))) return dir;\n const up = dirname(dir);\n if (up === dir) return undefined;\n dir = up;\n }\n}\n\nconst cache = new Map<string, LoadedDesignSystem>();\n\n/** Design system at `root` (a repo with bridge.config.json): tokens in every mode, components, packages. Cached per root. */\nexport function loadDesignSystem(root: string, opts: { fresh?: boolean } = {}): LoadedDesignSystem {\n const abs = resolve(root);\n const hit = cache.get(abs);\n if (hit && !opts.fresh) return hit;\n const cfgPath = join(abs, 'bridge.config.json');\n if (!existsSync(cfgPath)) throw new Error(`No bridge.config.json in ${abs}: pass the design system repo (--ds <dir>) or run bridge init there.`);\n const config = loadConfig(readFileSync(cfgPath, 'utf8'));\n const tokensRoot = config.tokens.root.replace(/\\/$/, '');\n const listed: string[] = [];\n walk(join(abs, tokensRoot === '.' ? '' : tokensRoot), abs, listed, ['node_modules', '.git', 'dist']);\n const files = new Map<string, string>();\n for (const f of selectTokenFiles(config, listed)) files.set(f, readFileSync(join(abs, tokensRoot === '.' ? '' : tokensRoot, f), 'utf8'));\n const set = new LayeredTokenSet(config, files);\n const components: string[] = [];\n let packages = config.audit?.packages;\n if (config.components) {\n const dir = join(abs, config.components.dir);\n if (existsSync(dir)) for (const name of readdirSync(dir)) if (/^[A-Z][A-Za-z0-9]*$/.test(name) && statSync(join(dir, name)).isDirectory()) components.push(name);\n if (!packages) {\n packages = ['@bridge-ds/react'];\n for (let d = dir; d.startsWith(abs) && d !== abs; d = dirname(d)) {\n const pj = join(d, 'package.json');\n if (existsSync(pj)) {\n const name = (JSON.parse(readFileSync(pj, 'utf8')) as { name?: string }).name;\n if (name && !packages.includes(name)) packages.unshift(name);\n break;\n }\n }\n }\n }\n const index = new DesignSystemIndex(set, {\n packages: packages ?? ['@bridge-ds/react'],\n components: components.sort(),\n ...(config.audit?.foreignLibraries ? { foreignLibraries: config.audit.foreignLibraries } : {}),\n ...(config.audit?.nativeElements ? { nativeElements: config.audit.nativeElements } : {}),\n });\n const loaded = { root: abs, config, set, index };\n cache.set(abs, loaded);\n return loaded;\n}\n\n/** Auditable files under `target` (a folder or a single file), repo-relative to it. */\nexport function collectAuditFiles(target: string, exclude: string[] = []): { root: string; files: { path: string; text: string }[]; skipped: number } {\n const abs = resolve(target);\n if (statSync(abs).isFile()) return { root: dirname(abs), files: [{ path: toPosix(relative(dirname(abs), abs)), text: readFileSync(abs, 'utf8') }], skipped: 0 };\n const all: string[] = [];\n walk(abs, abs, all, AUDIT_IGNORE_DIRS);\n const ex = exclude.map(globToRegExp);\n const files: { path: string; text: string }[] = [];\n let skipped = 0;\n for (const p of all.sort()) {\n if (!isAuditable(p) || ex.some((r) => r.test(p))) continue;\n const full = join(abs, p);\n if (statSync(full).size > 512 * 1024) {\n skipped++;\n continue;\n }\n files.push({ path: p, text: readFileSync(full, 'utf8') });\n }\n return { root: abs, files, skipped };\n}\n\nexport interface RunAuditOptions {\n /** Design system repo root (with bridge.config.json). Default: nearest one above the current directory. */\n ds?: string;\n label?: string;\n baseline?: AuditReport;\n version?: string;\n /** Path recorded in the report (default: target relative to cwd). */\n displayPath?: string;\n exclude?: string[];\n /** Known violations left out of the counts, each with a reason (see loadAllowlist). */\n allowlist?: AllowlistEntry[];\n}\n\n/** Read an allowlist file: `{ \"entries\": [{ \"file\", \"line\", \"what\"?, \"reason\" }] }`, paths relative to the audited folder. */\nexport function loadAllowlist(path: string): AllowlistEntry[] {\n return parseAllowlist(JSON.parse(readFileSync(path, 'utf8')));\n}\n\n/** Audit a product folder against a design system. */\nexport function runAudit(target: string, opts: RunAuditOptions = {}): AuditReport {\n const dsRoot = opts.ds ?? findDesignSystemRoot(process.cwd());\n if (!dsRoot) throw new Error('No design system found: run from a repo with bridge.config.json or pass --ds <dir>.');\n const ds = loadDesignSystem(dsRoot);\n const { files, skipped } = collectAuditFiles(target, [...(ds.config.audit?.exclude ?? []), ...(opts.exclude ?? [])]);\n const report = buildAuditReport(\n { files, skipped, target: opts.displayPath ?? (toPosix(relative(process.cwd(), resolve(target))) || '.'), ...(opts.label ? { label: opts.label } : {}), ...(opts.version ? { version: opts.version } : {}), ...(opts.allowlist ? { allowlist: opts.allowlist } : {}) },\n ds.index,\n );\n return opts.baseline ? compareWithBaseline(report, opts.baseline) : report;\n}\n\n/** Plan (and optionally write) the safe CSS autofix for every CSS/SCSS/Less file under `target`. */\nexport function fixCss(target: string, ds: DesignSystemIndex, write: boolean): { file: string; edits: CssFixEdit[] }[] {\n const { root, files } = collectAuditFiles(target);\n const out: { file: string; edits: CssFixEdit[] }[] = [];\n for (const f of files) {\n const lang = f.path.endsWith('.scss') || f.path.endsWith('.sass') ? 'scss' : f.path.endsWith('.less') ? 'less' : f.path.endsWith('.css') ? 'css' : null;\n if (!lang) continue;\n const plan = planCssFixes(f.text, lang, ds);\n if (!plan.edits.length) continue;\n if (write) writeFileSync(join(root, f.path), plan.output);\n out.push({ file: f.path, edits: plan.edits });\n }\n return out;\n}\n","// A small CSS cascade for component specs: parses CSS modules into rules, matches selectors against a simplified\n// element tree in a given interaction state (default, hover, pressed, disabled) and computes each element's values with\n// inheritance. Enough for token-only component CSS (classes, attributes, :hover, :not(), :has(), combinators, @media);\n// it is not a browser. Pure: no DOM, no Node API.\n\nexport interface CssDecl {\n prop: string;\n value: string;\n}\n\nexport interface CssRule {\n /** CSS module the rule comes from (class names are scoped to it). */\n module: string;\n selector: Complex;\n /** Selector as written, for reports. */\n text: string;\n decls: CssDecl[];\n specificity: [number, number, number];\n order: number;\n}\n\ntype Simple =\n | { t: 'class'; name: string }\n | { t: 'tag'; name: string }\n | { t: 'any' }\n | { t: 'attr'; name: string; value?: string | undefined }\n | { t: 'pseudo'; name: string; args?: Complex[] | undefined }\n | { t: 'element'; name: string };\n\ntype Combinator = ' ' | '>' | '+' | '~';\n\nexport interface Complex {\n /** Left to right. The first part's combinator only matters in :has() (relative selectors). */\n parts: { combinator: Combinator | null; compound: Simple[] }[];\n}\n\n/** An element of a component's rendered tree, as the cascade sees it. */\nexport interface CssElement {\n tag: string;\n /** Module-scoped class names: \"<module>|<class>\". */\n classes: Set<string>;\n parent?: CssElement | undefined;\n children: CssElement[];\n /** Optional parts (hidden by default) do not exist for :has(), sibling and child-position selectors. */\n present: boolean;\n isRoot: boolean;\n /** A text field: matches input, :disabled, [data-disabled] in the disabled state, ::placeholder. */\n inputLike: boolean;\n}\n\nexport interface CssState {\n hover: boolean;\n active: boolean;\n disabled: boolean;\n}\n\nexport const DEFAULT_STATE: CssState = { hover: false, active: false, disabled: false };\n\n// ---------------------------------------------------------------------------------------------\n// Parsing\n\n/** Splits on `sep` at depth 0 (outside parentheses, brackets and quotes). */\nexport function splitTop(text: string, sep: string | RegExp): string[] {\n const out: string[] = [];\n let depth = 0;\n let quote = '';\n let buf = '';\n for (let i = 0; i < text.length; i++) {\n const ch = text[i]!;\n if (quote) {\n buf += ch;\n if (ch === quote) quote = '';\n continue;\n }\n if (ch === '\"' || ch === \"'\") quote = ch;\n else if (ch === '(' || ch === '[') depth++;\n else if (ch === ')' || ch === ']') depth--;\n if (depth === 0 && (typeof sep === 'string' ? ch === sep : sep.test(ch))) {\n out.push(buf);\n buf = '';\n continue;\n }\n buf += ch;\n }\n out.push(buf);\n return out.map((s) => s.trim()).filter(Boolean);\n}\n\n/** Parses one complex selector (\"a > .b:hover .c\"). Throws on syntax it does not know. */\nexport function parseSelector(text: string): Complex {\n let i = 0;\n const s = text.trim();\n const parts: Complex['parts'] = [];\n let combinator: Combinator | null = null;\n const ident = () => {\n const m = /^-?[A-Za-z_][\\w-]*/.exec(s.slice(i));\n if (!m) throw new Error(`Unexpected \"${s.slice(i, i + 12)}\" in selector \"${text}\"`);\n i += m[0].length;\n return m[0];\n };\n const parenArgs = () => {\n // s[i] === '('\n let depth = 0;\n const start = i + 1;\n for (; i < s.length; i++) {\n if (s[i] === '(') depth++;\n else if (s[i] === ')' && --depth === 0) break;\n }\n const inner = s.slice(start, i);\n i++; // ')'\n return inner;\n };\n while (i < s.length) {\n const compound: Simple[] = [];\n for (;;) {\n const ch = s[i];\n if (ch === '.') {\n i++;\n compound.push({ t: 'class', name: ident() });\n } else if (ch === '#') {\n i++;\n compound.push({ t: 'attr', name: 'id', value: ident() });\n } else if (ch === '*') {\n i++;\n compound.push({ t: 'any' });\n } else if (ch === '[') {\n const end = s.indexOf(']', i);\n const inner = s.slice(i + 1, end);\n i = end + 1;\n const m = /^\\s*([\\w-]+)\\s*(?:[~|^$*]?=\\s*[\"']?([^\"'\\]]*)[\"']?)?\\s*$/.exec(inner);\n compound.push({ t: 'attr', name: m?.[1] ?? inner, value: m?.[2] });\n } else if (ch === ':' && s[i + 1] === ':') {\n i += 2;\n compound.push({ t: 'element', name: ident() });\n } else if (ch === ':') {\n i++;\n const name = ident();\n if (s[i] === '(') {\n const inner = parenArgs();\n const args = ['not', 'is', 'where', 'has', 'matches'].includes(name) ? splitTop(inner, ',').map(parseRelative) : undefined;\n compound.push({ t: 'pseudo', name, args });\n } else compound.push({ t: 'pseudo', name });\n } else if (ch && /[A-Za-z]/.test(ch)) {\n compound.push({ t: 'tag', name: ident().toLowerCase() });\n } else break;\n }\n if (!compound.length) throw new Error(`Empty compound in selector \"${text}\"`);\n parts.push({ combinator, compound });\n // Combinator\n const rest = /^\\s*([>+~])?\\s*/.exec(s.slice(i))!;\n if (i + rest[0].length >= s.length) break;\n combinator = (rest[1] as Combinator | undefined) ?? ' ';\n if (!rest[0].length) throw new Error(`Unexpected \"${s.slice(i, i + 12)}\" in selector \"${text}\"`);\n i += rest[0].length;\n }\n return { parts };\n}\n\n/** A selector inside :has() may start with a combinator (\"> .icon\"). */\nfunction parseRelative(text: string): Complex {\n const m = /^\\s*([>+~])\\s*/.exec(text);\n const c = parseSelector(m ? text.slice(m[0].length) : text);\n c.parts[0]!.combinator = (m?.[1] as Combinator | undefined) ?? ' ';\n return c;\n}\n\nfunction specificityOf(c: Complex): [number, number, number] {\n const sp: [number, number, number] = [0, 0, 0];\n const add = (x: [number, number, number]) => {\n sp[0] += x[0];\n sp[1] += x[1];\n sp[2] += x[2];\n };\n for (const p of c.parts)\n for (const s of p.compound) {\n if (s.t === 'class') sp[1]++;\n else if (s.t === 'attr') s.name === 'id' ? sp[0]++ : sp[1]++;\n else if (s.t === 'tag' || s.t === 'element') sp[2]++;\n else if (s.t === 'pseudo') {\n if (s.name === 'where') continue;\n if (s.args) {\n const best = s.args.map(specificityOf).sort(cmpSpec).pop();\n if (best) add(best);\n } else sp[1]++;\n }\n }\n return sp;\n}\n\nconst cmpSpec = (a: [number, number, number], b: [number, number, number]) => a[0] - b[0] || a[1] - b[1] || a[2] - b[2];\n\n/** Media queries a component in Figma is drawn under: a mouse (hover: hover), nothing else. */\nexport function mediaApplies(query: string): boolean {\n const q = query.replace(/\\s+/g, ' ').trim().toLowerCase();\n if (q.startsWith('@supports')) return true;\n const cond = q.replace(/^@media /, '');\n return /^\\((any-)?hover: ?hover\\)$/.test(cond) || cond === 'screen' || cond === 'all';\n}\n\n/** Rules of one CSS module, in source order. `@media` blocks are kept only when they apply in Figma. */\nexport function parseCssModule(module: string, text: string, startOrder = 0): { rules: CssRule[]; errors: string[] } {\n const rules: CssRule[] = [];\n const errors: string[] = [];\n let order = startOrder;\n const clean = text.replace(/\\/\\*[\\s\\S]*?\\*\\//g, '');\n const walk = (src: string) => {\n let i = 0;\n let buf = '';\n while (i < src.length) {\n const ch = src[i]!;\n if (ch !== '{') {\n if (ch === ';' && buf.trim().startsWith('@')) buf = ''; // @import, @charset\n else buf += ch;\n i++;\n continue;\n }\n const head = buf.trim();\n buf = '';\n let depth = 1;\n const start = ++i;\n while (i < src.length && depth > 0) {\n if (src[i] === '{') depth++;\n else if (src[i] === '}') depth--;\n i++;\n }\n const inner = src.slice(start, i - 1);\n if (head.startsWith('@')) {\n if (/^@(media|supports)/.test(head) && mediaApplies(head)) walk(inner);\n continue;\n }\n const decls = splitTop(inner, ';')\n .map((d) => {\n const c = d.indexOf(':');\n return c < 0 ? undefined : { prop: d.slice(0, c).trim().toLowerCase(), value: d.slice(c + 1).trim().replace(/\\s*!important$/, '') };\n })\n .filter((d): d is CssDecl => !!d && !!d.prop);\n for (const sel of splitTop(head, ',')) {\n try {\n const selector = parseSelector(sel);\n rules.push({ module, selector, text: sel.replace(/\\s+/g, ' '), decls, specificity: specificityOf(selector), order: order++ });\n } catch (err) {\n errors.push(`${module}: ${(err as Error).message}`);\n }\n }\n }\n };\n walk(clean);\n return { rules, errors };\n}\n\n// ---------------------------------------------------------------------------------------------\n// Matching\n\nconst TAG_ALIASES: Record<string, string[]> = {\n input: ['input', 'baseinput'],\n textarea: ['textarea'],\n button: ['button', 'basebutton'],\n svg: ['svg'],\n};\n\nfunction tagMatches(el: CssElement, name: string): boolean {\n const tag = el.tag.toLowerCase();\n return (TAG_ALIASES[name] ?? [name]).includes(tag) || (name === 'input' && el.inputLike);\n}\n\nconst presentChildren = (el: CssElement) => el.children.filter((c) => c.present);\n\nfunction siblingsBefore(el: CssElement): CssElement[] {\n if (!el.parent) return [];\n const sibs = presentChildren(el.parent);\n const idx = sibs.indexOf(el);\n return idx < 0 ? [] : sibs.slice(0, idx);\n}\n\nfunction attrMatches(el: CssElement, s: Extract<Simple, { t: 'attr' }>, state: CssState): boolean {\n switch (s.name) {\n case 'data-disabled':\n case 'disabled':\n return state.disabled && (el.isRoot || el.inputLike);\n default:\n // data-loading, data-pressed, data-invalid, aria-invalid, readonly, data-popup-open...: not part of the drawn states.\n return false;\n }\n}\n\nfunction pseudoMatches(el: CssElement, s: Extract<Simple, { t: 'pseudo' }>, state: CssState, module: string): boolean {\n switch (s.name) {\n case 'hover':\n return state.hover;\n case 'active':\n return state.active;\n case 'disabled':\n return state.disabled && (el.isRoot || el.inputLike);\n case 'enabled':\n return !state.disabled;\n case 'placeholder-shown':\n return el.inputLike;\n case 'not':\n return !(s.args ?? []).some((a) => matchComplex(a, el, state, module));\n case 'is':\n case 'where':\n case 'matches':\n return (s.args ?? []).some((a) => matchComplex(a, el, state, module));\n case 'has':\n return (s.args ?? []).some((a) => hasMatch(a, el, state, module));\n case 'first-child':\n return !!el.parent && presentChildren(el.parent)[0] === el;\n case 'last-child': {\n const sibs = el.parent ? presentChildren(el.parent) : [];\n return sibs[sibs.length - 1] === el;\n }\n case 'only-child':\n return !!el.parent && presentChildren(el.parent).length === 1;\n default:\n // focus, focus-visible, focus-within, checked, invalid...: not drawn.\n return false;\n }\n}\n\nfunction compoundMatches(compound: Simple[], el: CssElement, state: CssState, module: string, pseudoElement?: string): boolean {\n let sawElement = false;\n for (const s of compound) {\n switch (s.t) {\n case 'class':\n if (!el.classes.has(`${module}|${s.name}`)) return false;\n break;\n case 'tag':\n if (!tagMatches(el, s.name)) return false;\n break;\n case 'any':\n break;\n case 'attr':\n if (!attrMatches(el, s, state)) return false;\n break;\n case 'pseudo':\n if (!pseudoMatches(el, s, state, module)) return false;\n break;\n case 'element':\n sawElement = true;\n if (s.name !== pseudoElement) return false;\n break;\n }\n }\n return pseudoElement ? sawElement : !sawElement;\n}\n\nfunction matchAt(c: Complex, i: number, el: CssElement, state: CssState, module: string, anchor?: CssElement, pseudoElement?: string): boolean {\n const part = c.parts[i]!;\n if (!compoundMatches(part.compound, el, state, module, i === c.parts.length - 1 ? pseudoElement : undefined)) return false;\n if (i === 0) {\n if (!anchor) return true;\n switch (part.combinator ?? ' ') {\n case '>':\n return el.parent === anchor;\n case ' ': {\n for (let p = el.parent; p; p = p.parent) if (p === anchor) return true;\n return false;\n }\n case '+':\n return siblingsBefore(el).slice(-1)[0] === anchor;\n case '~':\n return siblingsBefore(el).includes(anchor);\n }\n }\n switch (part.combinator) {\n case '>':\n return !!el.parent && matchAt(c, i - 1, el.parent, state, module, anchor);\n case ' ': {\n for (let p = el.parent; p; p = p.parent) if (matchAt(c, i - 1, p, state, module, anchor)) return true;\n return false;\n }\n case '+': {\n const prev = siblingsBefore(el).slice(-1)[0];\n return !!prev && matchAt(c, i - 1, prev, state, module, anchor);\n }\n case '~':\n return siblingsBefore(el).some((p) => matchAt(c, i - 1, p, state, module, anchor));\n default:\n return false;\n }\n}\n\nexport function matchComplex(c: Complex, el: CssElement, state: CssState, module: string, pseudoElement?: string): boolean {\n return matchAt(c, c.parts.length - 1, el, state, module, undefined, pseudoElement);\n}\n\nfunction descendants(el: CssElement): CssElement[] {\n const out: CssElement[] = [];\n const walk = (e: CssElement) => {\n for (const c of presentChildren(e)) {\n out.push(c);\n walk(c);\n }\n };\n walk(el);\n return out;\n}\n\nfunction hasMatch(c: Complex, anchor: CssElement, state: CssState, module: string): boolean {\n const first = c.parts[0]!.combinator;\n const pool = first === '+' || first === '~' ? (anchor.parent ? presentChildren(anchor.parent) : []) : descendants(anchor);\n return pool.some((el) => matchAt(c, c.parts.length - 1, el, state, module, anchor));\n}\n\n// ---------------------------------------------------------------------------------------------\n// Cascade\n\nconst SIDES = ['top', 'right', 'bottom', 'left'] as const;\nconst BORDER_STYLES = new Set(['none', 'hidden', 'solid', 'dashed', 'dotted', 'double', 'groove', 'ridge', 'inset', 'outset']);\n\nfunction boxValues(parts: string[]): [string, string, string, string] | undefined {\n const [a, b = a, c = a, d = b] = parts;\n return a === undefined ? undefined : [a, b!, c!, d!];\n}\n\n/** Expands the shorthands component CSS uses into longhands, so later longhands override them as in a browser. */\nexport function expandDecl(d: CssDecl): CssDecl[] {\n const parts = splitTop(d.value, /\\s/);\n const sides = (prefix: string, suffix: string, vals: string[] | undefined) =>\n vals ? SIDES.map((s, i) => ({ prop: `${prefix}${s}${suffix}`, value: vals[i]! })) : [d];\n switch (d.prop) {\n case 'padding':\n return sides('padding-', '', boxValues(parts));\n case 'padding-inline': {\n const [s, e = s] = parts;\n return [\n { prop: 'padding-left', value: s! },\n { prop: 'padding-right', value: e! },\n ];\n }\n case 'padding-block': {\n const [s, e = s] = parts;\n return [\n { prop: 'padding-top', value: s! },\n { prop: 'padding-bottom', value: e! },\n ];\n }\n case 'padding-inline-start':\n return [{ prop: 'padding-left', value: d.value }];\n case 'padding-inline-end':\n return [{ prop: 'padding-right', value: d.value }];\n case 'padding-block-start':\n return [{ prop: 'padding-top', value: d.value }];\n case 'padding-block-end':\n return [{ prop: 'padding-bottom', value: d.value }];\n case 'border-width':\n return sides('border-', '-width', boxValues(parts));\n case 'border-color':\n return sides('border-', '-color', boxValues(parts));\n case 'border':\n case 'border-top':\n case 'border-right':\n case 'border-bottom':\n case 'border-left': {\n const { width, color } = splitBorder(parts);\n const which = d.prop === 'border' ? SIDES : [d.prop.slice(7) as (typeof SIDES)[number]];\n return which.flatMap((s) => [\n { prop: `border-${s}-width`, value: width },\n { prop: `border-${s}-color`, value: color },\n ]);\n }\n case 'font':\n return d.value === 'inherit' ? ['font-family', 'font-size', 'font-weight', 'line-height'].map((prop) => ({ prop, value: 'inherit' })) : [d];\n default:\n return [d];\n }\n}\n\nfunction splitBorder(parts: string[]): { width: string; color: string } {\n const styleAt = parts.findIndex((p) => BORDER_STYLES.has(p));\n if (styleAt >= 0) {\n const width = parts.slice(0, styleAt).join(' ') || parts.slice(styleAt + 1).find((p) => /width|^\\d/.test(p)) || 'medium';\n const color = parts.slice(styleAt + 1).filter((p) => p !== width).join(' ') || 'currentcolor';\n return { width, color };\n }\n if (parts.length === 1 && (parts[0] === '0' || parts[0] === 'none')) return { width: '0', color: 'currentcolor' };\n const width = parts.find((p) => /width|^\\d/.test(p)) ?? 'medium';\n return { width, color: parts.filter((p) => p !== width).join(' ') || 'currentcolor' };\n}\n\n/** Properties a child inherits from its parent (custom properties always inherit). */\nexport const INHERITED = new Set(['color', 'font-family', 'font-size', 'font-weight', 'line-height', 'letter-spacing', 'cursor', 'white-space', 'visibility']);\n\nexport interface Declared {\n prop: string;\n value: string;\n rule: CssRule;\n}\n\n/** Winning declarations for an element (own rules only), keyed by longhand property. */\nexport function declaredFor(rules: CssRule[], el: CssElement, state: CssState, pseudoElement?: string): Map<string, Declared> {\n const matched = rules.filter((r) => matchComplex(r.selector, el, state, r.module, pseudoElement));\n matched.sort((a, b) => cmpSpec(a.specificity, b.specificity) || a.order - b.order);\n const out = new Map<string, Declared>();\n for (const r of matched) for (const d of r.decls) for (const x of expandDecl(d)) out.set(x.prop, { prop: x.prop, value: x.value, rule: r });\n return out;\n}\n\n/** Computed values: inherited ones from the parent, then the element's own declarations (\"inherit\" takes the parent's). */\nexport function computeValues(own: Map<string, Declared>, parent: Map<string, string> | undefined): Map<string, string> {\n const out = new Map<string, string>();\n if (parent) for (const [k, v] of parent) if (k.startsWith('--') || INHERITED.has(k)) out.set(k, v);\n for (const [k, d] of own) {\n if (d.value === 'inherit') {\n const pv = parent?.get(k);\n if (pv !== undefined) out.set(k, pv);\n else out.delete(k);\n } else if (d.value === 'initial' || d.value === 'unset') out.delete(k);\n else out.set(k, d.value);\n }\n return out;\n}\n","// Component spec generator: reads a component's TSX (props, defaults, rendered tree) and its CSS modules, and derives a\n// ComponentSpec (see ../component-spec.ts) a design tool can rebuild: variant axes from string-literal union props,\n// a State axis from the interaction states the CSS styles, TEXT and BOOLEAN properties, parts (frames, text, icons),\n// and per variant the token path behind every fill, stroke, radius, padding, gap, size and text property.\n//\n// Derived from code, never hand-maintained: `npm run specs` writes packages/react/component-specs.json, and a test\n// fails when the committed file is out of date. Uses the TypeScript parser (Node only, like the audit).\n\nimport { readFileSync, readdirSync, statSync } from 'node:fs';\nimport { join, posix, relative } from 'node:path';\nimport ts from 'typescript';\nimport {\n COLOR_FIELDS,\n COMPONENT_SPECS_VERSION,\n type ComponentSpec,\n type ComponentSpecsFile,\n type SpecAxis,\n type SpecField,\n type SpecLayout,\n type SpecPart,\n type SpecIcon,\n type SpecIconStyle,\n type SpecProperty,\n type SpecSlot,\n type SpecUnmapped,\n type SpecValue,\n type SpecVariant,\n hashSpec,\n iconComponentName,\n tokenCssVar,\n variantKeyOf,\n} from '../component-spec';\nimport { CONFIG_FILE, loadConfig } from '../config';\nimport { buildTokenSet, layoutOptions } from '../token-set';\nimport { type CssElement, type CssRule, type CssState, DEFAULT_STATE, computeValues, declaredFor, parseCssModule } from './spec-css';\n\nexport interface TokenInfo {\n path: string;\n type: string;\n}\n\nexport interface SpecGeneratorOptions {\n /** Repo-relative components directory (\"packages/react/src/components\"). */\n componentsDir: string;\n /** Reads a repo-relative file; undefined when it does not exist. */\n read: (path: string) => string | undefined;\n /** CSS custom property -> token. */\n tokens: Map<string, TokenInfo>;\n styleSuffix?: string | undefined;\n /** Repo-relative ESM build of lucide-react (\"node_modules/lucide-react/dist/esm\"), for the icons section. */\n lucideDir?: string | undefined;\n}\n\n/** States drawn as the State axis when the CSS styles them, with the selector state they stand for. */\nconst STATES: { name: string; state: CssState }[] = [\n { name: 'Default', state: DEFAULT_STATE },\n { name: 'Hover', state: { hover: true, active: false, disabled: false } },\n { name: 'Pressed', state: { hover: true, active: true, disabled: false } },\n { name: 'Disabled', state: { hover: false, active: false, disabled: true } },\n];\n\n/** Most variants a set may get; a component past it is reported instead of generated. */\nconst MAX_VARIANTS = 240;\n\n/** CSS properties that matter visually but have no mapping in this version. Others (cursor, transition...) are silent. */\nconst REPORTED: Record<string, string> = {\n 'box-shadow': 'shadows are code-only tokens (no Figma variable)',\n outline: 'focus rings are not drawn',\n transform: 'transforms are not drawn',\n opacity: 'opacity is not mapped yet',\n filter: 'filters are not drawn',\n 'margin-left': 'margins have no auto layout equivalent',\n 'margin-right': 'margins have no auto layout equivalent',\n margin: 'margins have no auto layout equivalent',\n 'margin-inline-start': 'margins have no auto layout equivalent',\n};\n\n// ---------------------------------------------------------------------------------------------\n// TSX reading\n\ntype PropKind = 'union' | 'boolean' | 'icon' | 'node' | 'string' | 'function' | 'other';\n\ninterface PropInfo {\n name: string;\n kind: PropKind;\n values?: string[] | undefined;\n optional: boolean;\n}\n\ninterface ComponentSource {\n name: string;\n file: string;\n sf: ts.SourceFile;\n /** Import identifier -> repo-relative CSS module path. */\n styles: Map<string, string>;\n props: Map<string, PropInfo>;\n /** Native element the props extend (button, input, span...), from `extends ButtonHTMLAttributes<...>`. */\n native: string | undefined;\n fn: ts.FunctionLikeDeclaration | undefined;\n /** Other exported forwardRef components in the file (CardHeader, CardBody...). */\n subcomponents: { name: string; fn: ts.FunctionLikeDeclaration }[];\n}\n\nconst NATIVE_ATTRS: Record<string, string> = {\n ButtonHTMLAttributes: 'button',\n InputHTMLAttributes: 'input',\n TextareaHTMLAttributes: 'textarea',\n AnchorHTMLAttributes: 'a',\n HTMLAttributes: 'element',\n};\n\nfunction unquote(s: string): string {\n return s.replace(/^['\"`]|['\"`]$/g, '');\n}\n\nclass Reader {\n private cache = new Map<string, ComponentSource | null>();\n private aliasCache = new Map<string, Map<string, string>>();\n constructor(private opts: SpecGeneratorOptions) {}\n\n private dirOf(name: string) {\n return `${this.opts.componentsDir}/${name}`;\n }\n\n exists(name: string): boolean {\n return this.opts.read(`${this.dirOf(name)}/${name}.tsx`) !== undefined;\n }\n\n /** `export type X = ...` of a component file and of the component files it imports from. */\n private aliases(file: string, sf: ts.SourceFile, depth = 0): Map<string, string> {\n if (this.aliasCache.has(file)) return this.aliasCache.get(file)!;\n const out = new Map<string, string>();\n this.aliasCache.set(file, out);\n for (const st of sf.statements) {\n if (ts.isTypeAliasDeclaration(st)) out.set(st.name.text, st.type.getText(sf));\n if (ts.isImportDeclaration(st) && depth < 2) {\n const spec = unquote(st.moduleSpecifier.getText(sf));\n const m = /^\\.\\.\\/(\\w+)$/.exec(spec);\n if (!m) continue;\n const other = `${this.dirOf(m[1]!)}/${m[1]}.tsx`;\n const text = this.opts.read(other);\n if (!text) continue;\n const osf = ts.createSourceFile(other, text, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);\n for (const [k, v] of this.aliases(other, osf, depth + 1)) if (!out.has(k)) out.set(k, v);\n }\n }\n return out;\n }\n\n load(name: string): ComponentSource | null {\n if (this.cache.has(name)) return this.cache.get(name)!;\n const file = `${this.dirOf(name)}/${name}.tsx`;\n const text = this.opts.read(file);\n if (text === undefined) {\n this.cache.set(name, null);\n return null;\n }\n const sf = ts.createSourceFile(file, text, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);\n const styles = new Map<string, string>();\n for (const st of sf.statements) {\n if (!ts.isImportDeclaration(st) || !st.importClause?.name) continue;\n const spec = unquote(st.moduleSpecifier.getText(sf));\n if (!spec.endsWith(this.opts.styleSuffix ?? '.module.css')) continue;\n styles.set(st.importClause.name.text, posix.normalize(posix.join(this.dirOf(name), spec)));\n }\n const aliases = this.aliases(file, sf);\n const props = new Map<string, PropInfo>();\n let native: string | undefined;\n const iface = sf.statements.find((s): s is ts.InterfaceDeclaration => ts.isInterfaceDeclaration(s) && s.name.text === `${name}Props`);\n if (iface) {\n for (const h of iface.heritageClauses ?? []) {\n const txt = h.getText(sf);\n for (const [k, v] of Object.entries(NATIVE_ATTRS)) if (txt.includes(k)) native ??= v;\n }\n for (const m of iface.members) {\n if (!ts.isPropertySignature(m) || !m.type) continue;\n const pname = m.name.getText(sf);\n props.set(pname, { name: pname, optional: !!m.questionToken, ...classifyType(m.type.getText(sf), aliases) });\n }\n }\n const fns = componentFunctions(sf);\n const fn = fns.get(name);\n const subcomponents = [...fns].filter(([n]) => n !== name && n.startsWith(name)).map(([n, f]) => ({ name: n, fn: f }));\n const src: ComponentSource = { name, file, sf, styles, props, native, fn, subcomponents };\n this.cache.set(name, src);\n return src;\n }\n}\n\nfunction classifyType(text: string, aliases: Map<string, string>, depth = 0): { kind: PropKind; values?: string[] } {\n const t = text.trim();\n if (aliases.has(t) && depth < 4) return classifyType(aliases.get(t)!, aliases, depth + 1);\n const parts = t.split('|').map((p) => p.trim());\n if (parts.length > 1 && parts.every((p) => /^'[^']*'$/.test(p))) return { kind: 'union', values: parts.map(unquote) };\n if (t === 'boolean') return { kind: 'boolean' };\n if (t === 'LucideIcon') return { kind: 'icon' };\n if (/^(ReactNode|ReactElement|React\\.ReactNode)$/.test(t)) return { kind: 'node' };\n if (t === 'string') return { kind: 'string' };\n if (t.includes('=>')) return { kind: 'function' };\n return { kind: 'other' };\n}\n\n/** Exported components of a file: `forwardRef(function Name(...))` or `function Name(...)`. */\nfunction componentFunctions(sf: ts.SourceFile): Map<string, ts.FunctionLikeDeclaration> {\n const out = new Map<string, ts.FunctionLikeDeclaration>();\n const visit = (n: ts.Node) => {\n if (ts.isFunctionExpression(n) && n.name && /^[A-Z]/.test(n.name.text) && ts.isCallExpression(n.parent) && /forwardRef/.test(n.parent.expression.getText(sf))) {\n if (!out.has(n.name.text)) out.set(n.name.text, n);\n } else if (ts.isFunctionDeclaration(n) && n.name && /^[A-Z]/.test(n.name.text) && n.modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword)) {\n if (!out.has(n.name.text)) out.set(n.name.text, n);\n }\n ts.forEachChild(n, visit);\n };\n visit(sf);\n return out;\n}\n\n// ---------------------------------------------------------------------------------------------\n// Evaluating a component for a set of props\n\nconst CHILDREN = Symbol('children');\nconst OPAQUE = Symbol('opaque');\n\ninterface ClassRef {\n cls: string;\n}\ninterface StylesRef {\n module: string;\n}\ninterface JsxRef {\n jsx: ts.Node;\n scope: Scope;\n}\n\ntype Value = undefined | null | boolean | number | string | symbol | ClassRef | StylesRef | JsxRef | Value[] | { [k: string]: Value };\n\nconst isClass = (v: Value): v is ClassRef => !!v && typeof v === 'object' && 'cls' in (v as object);\nconst isStyles = (v: Value): v is StylesRef => !!v && typeof v === 'object' && 'module' in (v as object);\nconst isJsx = (v: Value): v is JsxRef => !!v && typeof v === 'object' && 'jsx' in (v as object);\n\ninterface Scope {\n src: ComponentSource;\n vars: Map<string, Value>;\n /** Local consts, evaluated on first use. */\n locals: Map<string, ts.Expression>;\n /** Identifiers bound to optional icon props (or a boolean shown as a part): JSX conditions on them become BOOLEAN properties. */\n toggles: Map<string, string>;\n /** Component being specified (true) or a nested DS component (false). */\n main: boolean;\n}\n\nfunction lookup(scope: Scope, name: string): Value {\n if (scope.vars.has(name)) return scope.vars.get(name);\n const local = scope.locals.get(name);\n if (local) {\n scope.locals.delete(name);\n const v = evaluate(local, scope);\n scope.vars.set(name, v);\n return v;\n }\n const style = scope.src.styles.get(name);\n if (style) return { module: style };\n if (name === 'undefined') return undefined;\n return undefined;\n}\n\nfunction classList(v: Value, out: string[] = []): string[] {\n if (isClass(v)) out.push(v.cls);\n else if (Array.isArray(v)) for (const x of v) classList(x, out);\n return out;\n}\n\nfunction evaluate(e: ts.Expression, scope: Scope): Value {\n const sf = scope.src.sf;\n if (ts.isParenthesizedExpression(e) || ts.isAsExpression(e) || ts.isNonNullExpression(e) || ts.isSatisfiesExpression(e)) return evaluate(e.expression, scope);\n if (ts.isStringLiteral(e) || ts.isNoSubstitutionTemplateLiteral(e)) return e.text;\n if (ts.isNumericLiteral(e)) return Number(e.text);\n if (e.kind === ts.SyntaxKind.TrueKeyword) return true;\n if (e.kind === ts.SyntaxKind.FalseKeyword) return false;\n if (e.kind === ts.SyntaxKind.NullKeyword) return null;\n if (ts.isIdentifier(e)) return lookup(scope, e.text);\n if (ts.isTemplateExpression(e)) {\n let s = e.head.text;\n for (const span of e.templateSpans) s += String(evaluate(span.expression, scope) ?? '') + span.literal.text;\n return s;\n }\n if (ts.isPropertyAccessExpression(e)) {\n const obj = evaluate(e.expression, scope);\n if (isStyles(obj)) return { cls: `${obj.module}|${e.name.text}` };\n if (obj && typeof obj === 'object' && !Array.isArray(obj) && !isClass(obj) && !isJsx(obj)) return (obj as Record<string, Value>)[e.name.text];\n return undefined;\n }\n if (ts.isElementAccessExpression(e)) {\n const obj = evaluate(e.expression, scope);\n const key = evaluate(e.argumentExpression, scope);\n if (isStyles(obj) && typeof key === 'string') return { cls: `${obj.module}|${key}` };\n return undefined;\n }\n if (ts.isPrefixUnaryExpression(e) && e.operator === ts.SyntaxKind.ExclamationToken) return !truthy(evaluate(e.operand, scope));\n if (ts.isConditionalExpression(e)) return truthy(evaluate(e.condition, scope)) ? evaluate(e.whenTrue, scope) : evaluate(e.whenFalse, scope);\n if (ts.isBinaryExpression(e)) {\n const op = e.operatorToken.kind;\n if (op === ts.SyntaxKind.AmpersandAmpersandToken) {\n const l = evaluate(e.left, scope);\n return truthy(l) ? evaluate(e.right, scope) : l;\n }\n if (op === ts.SyntaxKind.BarBarToken) {\n const l = evaluate(e.left, scope);\n return truthy(l) ? l : evaluate(e.right, scope);\n }\n if (op === ts.SyntaxKind.QuestionQuestionToken) {\n const l = evaluate(e.left, scope);\n return l === undefined || l === null ? evaluate(e.right, scope) : l;\n }\n const l = evaluate(e.left, scope);\n const r = evaluate(e.right, scope);\n switch (op) {\n case ts.SyntaxKind.EqualsEqualsEqualsToken:\n return l === r;\n case ts.SyntaxKind.ExclamationEqualsEqualsToken:\n return l !== r;\n case ts.SyntaxKind.EqualsEqualsToken:\n return l == r; // eslint-disable-line eqeqeq\n case ts.SyntaxKind.ExclamationEqualsToken:\n return l != r; // eslint-disable-line eqeqeq\n default:\n return OPAQUE;\n }\n }\n if (ts.isCallExpression(e)) {\n const callee = e.expression.getText(sf);\n if (callee === 'cx' || callee === 'clsx' || callee === 'classNames') return e.arguments.map((a) => evaluate(a, scope)).filter(truthy);\n return OPAQUE;\n }\n if (ts.isJsxElement(e) || ts.isJsxSelfClosingElement(e) || ts.isJsxFragment(e)) return { jsx: e, scope };\n return OPAQUE;\n}\n\nfunction truthy(v: Value): boolean {\n if (v === OPAQUE) return true;\n if (Array.isArray(v)) return true;\n return !!v;\n}\n\n/** Binds the destructured props of a component function, with their defaults. */\nfunction bindProps(fn: ts.FunctionLikeDeclaration, scope: Scope, given: Record<string, Value>): Map<string, string> {\n const names = new Map<string, string>(); // local name -> prop name\n const param = fn.parameters[0];\n if (!param || !ts.isObjectBindingPattern(param.name)) return names;\n for (const el of param.name.elements) {\n if (el.dotDotDotToken || !ts.isIdentifier(el.name)) continue;\n const prop = el.propertyName ? el.propertyName.getText(scope.src.sf) : el.name.text;\n names.set(el.name.text, prop);\n let v = given[prop];\n if (v === undefined && el.initializer) v = evaluate(el.initializer, scope);\n scope.vars.set(el.name.text, v);\n }\n return names;\n}\n\n/** The JSX a component function returns for the current props: follows `if (cond) return x;` and local consts. */\nfunction renderedJsx(fn: ts.FunctionLikeDeclaration, scope: Scope): JsxRef | undefined {\n const body = fn.body;\n if (!body) return undefined;\n if (!ts.isBlock(body)) {\n const v = evaluate(body, scope);\n return isJsx(v) ? v : undefined;\n }\n const run = (stmts: readonly ts.Statement[]): JsxRef | undefined | null => {\n for (const st of stmts) {\n if (ts.isVariableStatement(st)) {\n for (const d of st.declarationList.declarations) if (ts.isIdentifier(d.name) && d.initializer) scope.locals.set(d.name.text, d.initializer);\n } else if (ts.isIfStatement(st)) {\n const branch = truthy(evaluate(st.expression, scope)) ? st.thenStatement : st.elseStatement;\n if (!branch) continue;\n const r = run(ts.isBlock(branch) ? branch.statements : [branch]);\n if (r !== null) return r;\n } else if (ts.isReturnStatement(st)) {\n if (!st.expression) return undefined;\n const v = evaluate(st.expression, scope);\n return isJsx(v) ? v : undefined;\n }\n }\n return null;\n };\n return run(body.statements) ?? undefined;\n}\n\n// ---------------------------------------------------------------------------------------------\n// Element tree\n\ninterface Node {\n key: string;\n tag: string;\n classes: string[];\n children: Node[];\n kind: 'frame' | 'text' | 'icon';\n /** Text parts: TEXT property name and default; placeholder text of a text field. */\n text?: { property: string; default: string; prop?: string | undefined } | undefined;\n placeholder?: boolean | undefined;\n inputLike?: boolean | undefined;\n /** BOOLEAN property that shows this optional part. */\n visible?: { property: string; prop: string } | undefined;\n /** Spreads `...rest` with no children of its own: children come through props. */\n takesChildren?: boolean | undefined;\n /** Name for the layer, when it is not the class. */\n name?: string | undefined;\n}\n\nconst INPUT_TAGS = new Set(['input', 'textarea', 'BaseInput']);\n\n/** \"iconStart\" -> \"Icon start\". */\nexport const sentenceCase = (prop: string) => {\n const words = prop.replace(/([a-z0-9])([A-Z])/g, '$1 $2').toLowerCase();\n return words.charAt(0).toUpperCase() + words.slice(1);\n};\n\ninterface RenderContext {\n reader: Reader;\n depth: number;\n /** Elements the main component rendered for `{children}`. */\n component: string;\n}\n\nfunction renderJsx(ref: JsxRef, ctx: RenderContext, visible?: Node['visible']): Node[] {\n const { jsx, scope } = ref;\n const sf = scope.src.sf;\n if (ts.isParenthesizedExpression(jsx)) return renderJsx({ jsx: jsx.expression, scope }, ctx, visible);\n if (ts.isJsxFragment(jsx)) return renderChildren(jsx.children, scope, ctx);\n if (!ts.isJsxElement(jsx) && !ts.isJsxSelfClosingElement(jsx)) return [];\n const open = ts.isJsxElement(jsx) ? jsx.openingElement : jsx;\n const tag = open.tagName.getText(sf);\n const attrs: Record<string, Value> = {};\n let spreads = false;\n for (const a of open.attributes.properties) {\n if (ts.isJsxSpreadAttribute(a)) {\n spreads = true;\n continue;\n }\n const name = a.name.getText(sf);\n if (!a.initializer) attrs[name] = true;\n else if (ts.isStringLiteral(a.initializer)) attrs[name] = a.initializer.text;\n else if (ts.isJsxExpression(a.initializer) && a.initializer.expression) attrs[name] = evaluate(a.initializer.expression, scope);\n }\n const children = ts.isJsxElement(jsx) ? jsx.children : undefined;\n\n // A design system component (Icon, Spinner...): rendered through its own TSX and CSS module.\n if (/^[A-Z]/.test(tag) && tag !== ctx.component && ctx.depth < 4 && ctx.reader.exists(tag)) {\n const nested = renderComponent(ctx.reader, tag, attrs, { ...ctx, depth: ctx.depth + 1 });\n if (nested) {\n if (tag === 'Icon') nested.kind = 'icon';\n if (visible) nested.visible = visible;\n return [nested];\n }\n }\n const node: Node = {\n key: '',\n tag,\n classes: classList(attrs.className),\n children: [],\n kind: INPUT_TAGS.has(tag) ? 'text' : 'frame',\n ...(visible ? { visible } : {}),\n };\n if (INPUT_TAGS.has(tag)) {\n node.inputLike = true;\n node.placeholder = true;\n node.text = { property: 'Placeholder', default: typeof attrs.placeholder === 'string' ? attrs.placeholder : 'Placeholder' };\n return [node];\n }\n if (children) node.children = renderChildren(children, scope, ctx);\n else if (spreads) node.takesChildren = true;\n return [node];\n}\n\nfunction renderChildren(children: ts.NodeArray<ts.JsxChild>, scope: Scope, ctx: RenderContext): Node[] {\n const out: Node[] = [];\n for (const c of children) {\n if (ts.isJsxText(c)) continue;\n if (ts.isJsxExpression(c)) {\n if (c.expression) out.push(...renderExpression(c.expression, scope, ctx));\n continue;\n }\n out.push(...renderJsx({ jsx: c, scope }, ctx));\n }\n return out;\n}\n\nfunction toggleOf(e: ts.Expression, scope: Scope): Node['visible'] {\n const inner = ts.isParenthesizedExpression(e) ? e.expression : e;\n if (!ts.isIdentifier(inner)) return undefined;\n const prop = scope.toggles.get(inner.text);\n return prop ? { property: sentenceCase(prop), prop } : undefined;\n}\n\nfunction renderExpression(e: ts.Expression, scope: Scope, ctx: RenderContext, visible?: Node['visible']): Node[] {\n if (ts.isParenthesizedExpression(e)) return renderExpression(e.expression, scope, ctx, visible);\n if (ts.isBinaryExpression(e) && e.operatorToken.kind === ts.SyntaxKind.AmpersandAmpersandToken) {\n const t = toggleOf(e.left, scope);\n if (t) return renderExpression(e.right, scope, ctx, visible ?? t);\n return truthy(evaluate(e.left, scope)) ? renderExpression(e.right, scope, ctx, visible) : [];\n }\n if (ts.isConditionalExpression(e)) {\n const t = toggleOf(e.condition, scope);\n if (t) return renderExpression(e.whenTrue, scope, ctx, visible ?? t);\n return renderExpression(truthy(evaluate(e.condition, scope)) ? e.whenTrue : e.whenFalse, scope, ctx, visible);\n }\n if (ts.isJsxElement(e) || ts.isJsxSelfClosingElement(e) || ts.isJsxFragment(e)) return renderJsx({ jsx: e, scope }, ctx, visible);\n const v = evaluate(e, scope);\n if (v === CHILDREN) return [{ key: '', tag: '#text', classes: [], children: [], kind: 'text', text: { property: 'Label', default: ctx.component, prop: 'children' } }];\n if (isJsx(v)) return renderJsx(v, ctx, visible);\n return [];\n}\n\n/** Renders a component for the given props into a node tree (its root node). */\nfunction renderComponent(reader: Reader, name: string, props: Record<string, Value>, ctx: RenderContext, fnOverride?: ts.FunctionLikeDeclaration): Node | undefined {\n const src = reader.load(name);\n const fn = fnOverride ?? src?.fn;\n if (!src || !fn) return undefined;\n const scope: Scope = { src, vars: new Map(), locals: new Map(), toggles: new Map(), main: ctx.depth === 0 };\n const names = bindProps(fn, scope, props);\n if (scope.main) {\n // Optional icon props are BOOLEAN properties (\"Icon start\"): their JSX condition shows a part.\n for (const [local, prop] of names) if (src.props.get(prop)?.kind === 'icon' && src.props.get(prop)?.optional) scope.toggles.set(local, prop);\n }\n const jsx = renderedJsx(fn, scope);\n if (!jsx) return undefined;\n const nodes = renderJsx(jsx, ctx);\n return nodes.length === 1 ? nodes[0] : nodes.length ? { key: '', tag: 'div', classes: [], children: nodes, kind: 'frame' } : undefined;\n}\n\n/** A wrapper whose only child is the text becomes the text part itself (Button's `<span class=\"label\">`). */\nfunction collapseText(n: Node, root = true): Node {\n n.children = n.children.map((c) => collapseText(c, false));\n // Only inline wrappers (span): a block (Card header) keeps its frame for its padding.\n if (!root && n.tag === 'span' && !n.name && n.kind === 'frame' && n.children.length === 1 && n.children[0]!.kind === 'text' && !n.children[0]!.classes.length && !n.children[0]!.inputLike) {\n const t = n.children[0]!;\n return { ...t, tag: n.tag, classes: n.classes, ...(n.visible ? { visible: n.visible } : {}) };\n }\n return n;\n}\n\n// ---------------------------------------------------------------------------------------------\n// Spec\n\ninterface Built {\n root: Node;\n /** Part id -> node, in tree order. */\n parts: Map<string, Node>;\n parents: Map<string, string | undefined>;\n}\n\n/** Renders the main component for one set of axis values, with stable part ids. */\nfunction build(reader: Reader, src: ComponentSource, props: Record<string, Value>): Built | undefined {\n const root = renderComponent(reader, src.name, { ...props, children: CHILDREN }, { reader, depth: 0, component: src.name });\n if (!root) return undefined;\n // Compound components (Card): children come through props, so draw the parts the file exports (CardHeader...).\n if (root.takesChildren && !root.children.length && src.subcomponents.length) {\n for (const sub of src.subcomponents) {\n const label = sub.name.slice(src.name.length);\n const n = renderComponent(reader, src.name, {}, { reader, depth: 1, component: src.name }, sub.fn);\n if (!n) continue;\n n.name = label;\n if (n.takesChildren && !n.children.length) n.children = [{ key: '', tag: '#text', classes: [], children: [], kind: 'text', text: { property: label, default: label } }];\n root.children.push(n);\n }\n }\n const tree = collapseText(root);\n const parts = new Map<string, Node>();\n const parents = new Map<string, string | undefined>();\n const used = new Set<string>();\n const slug = (s: string) => s.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');\n const assign = (n: Node, parent: string | undefined) => {\n let base: string;\n if (!parent) base = 'root';\n else if (n.visible) base = slug(n.visible.prop);\n else if (n.text && n.kind === 'text' && !n.placeholder) base = n.text.prop === 'children' ? 'text' : `${slug(n.text.property)}-text`;\n else if (n.placeholder) base = 'placeholder';\n else if (n.name) base = slug(n.name);\n else base = slug(n.classes[0]?.split('|')[1] ?? n.tag) || 'part';\n let id = base;\n for (let i = 2; used.has(id); i++) id = `${base}-${i}`;\n used.add(id);\n n.key = id;\n parts.set(id, n);\n parents.set(id, parent);\n for (const c of n.children) assign(c, id);\n };\n assign(tree, undefined);\n return { root: tree, parts, parents };\n}\n\nfunction toCssTree(b: Built): Map<string, CssElement> {\n const els = new Map<string, CssElement>();\n const make = (n: Node, parent: CssElement | undefined): CssElement => {\n const el: CssElement = { tag: n.tag, classes: new Set(n.classes), parent, children: [], present: !n.visible, isRoot: !parent, inputLike: !!n.inputLike };\n els.set(n.key, el);\n el.children = n.children.map((c) => make(c, el));\n return el;\n };\n make(b.root, undefined);\n return els;\n}\n\ninterface Resolved {\n value?: SpecValue;\n unmapped?: string;\n}\n\nconst isZero = (v: string) => /^0(px|rem|em|%)?$/.test(v);\n\n/** A CSS value as a token path, a literal 0, or null (no paint). */\nfunction resolveValue(raw: string | undefined, values: Map<string, string>, tokens: Map<string, TokenInfo>, depth = 0, parent?: Map<string, string>, forColor = false): Resolved | undefined {\n if (raw === undefined) return undefined;\n const v = raw.trim();\n const low = v.toLowerCase();\n if (depth > 12) return { unmapped: 'custom properties form a cycle' };\n if (low === 'transparent' || low === 'none') return { value: null };\n if (isZero(v)) return { value: 0 };\n // currentcolor is the element's color; inside `color` itself it is the parent's (CSS Color 4).\n if (low === 'currentcolor') return forColor ? resolveValue(parent?.get('color'), parent ?? new Map(), tokens, depth + 1) : resolveValue(values.get('color'), values, tokens, depth + 1, parent, true);\n if (low === 'normal' || low === 'auto' || low === 'inherit' || low === 'initial' || low === 'unset' || low === 'medium') return undefined;\n const m = /^var\\(\\s*(--[\\w-]+)\\s*(?:,\\s*([\\s\\S]+))?\\)$/.exec(v);\n if (m) {\n const name = m[1]!;\n const token = tokens.get(name);\n if (token) return { value: token.path };\n if (values.has(name)) return resolveValue(values.get(name), values, tokens, depth + 1, parent, forColor);\n if (m[2] !== undefined) return resolveValue(m[2], values, tokens, depth + 1, parent, forColor);\n return { unmapped: `${name} is not a token` };\n }\n if (/^calc\\(/i.test(v)) return calcValue(v, values, tokens, depth, parent);\n if (v === '100%') return { unmapped: 'fills its container: Figma draws it at a fixed width' };\n if (/%$/.test(v)) return { unmapped: 'relative size: the Figma part hugs its content' };\n return { unmapped: 'literal value, not a token' };\n}\n\n/**\n * A calc() of tokens (\"calc(var(--space-2) + var(--space-0-5))\") as an expression of token paths: \"calc(space.2 + space.0-5)\".\n * A calc() of a single token is that token (bound in Figma). Literals other than plain numbers and px are not mapped.\n */\nfunction calcValue(v: string, values: Map<string, string>, tokens: Map<string, TokenInfo>, depth: number, parent?: Map<string, string>): Resolved {\n const inner = v.slice(v.indexOf('(') + 1, v.lastIndexOf(')'));\n let failed: string | undefined;\n const substituted = inner.replace(/var\\(\\s*--[\\w-]+\\s*(?:,[^()]*)?\\)/g, (m) => {\n const r = resolveValue(m, values, tokens, depth + 1, parent);\n if (!r || r.unmapped !== undefined || r.value === null || r.value === undefined) {\n failed ??= r?.unmapped ?? `${m} has no value`;\n return '0';\n }\n if (r.value === 0) return '0';\n return r.value.startsWith('calc(') ? `(${r.value.slice(5, -1)})` : r.value;\n });\n if (failed) return { unmapped: `calc(): ${failed}` };\n const types = typesOf(tokens);\n const parts = substituted.match(/[()*/]|[^\\s()*/]+/g) ?? [];\n for (const t of parts) {\n if (/^[()*/+-]$/.test(t) || /^-?\\d+(\\.\\d+)?(px)?$/.test(t) || types.has(t)) continue;\n return { unmapped: `calc() with ${t}: only tokens, numbers and px are mapped` };\n }\n const paths = parts.filter((t) => types.has(t));\n if (!paths.length) return { unmapped: 'calc() of literals, not a token' };\n if (parts.length === 1) return { value: paths[0]! };\n return { value: `calc(${parts.join(' ').replace(/\\( /g, '(').replace(/ \\)/g, ')')})` };\n}\n\nconst FRAME_FIELDS: [string, SpecField][] = [\n ['background-color', 'fill'],\n ['border-radius', 'cornerRadius'],\n ['padding-top', 'paddingTop'],\n ['padding-right', 'paddingRight'],\n ['padding-bottom', 'paddingBottom'],\n ['padding-left', 'paddingLeft'],\n ['gap', 'itemSpacing'],\n ['width', 'width'],\n ['height', 'height'],\n ['min-width', 'minWidth'],\n ['min-height', 'minHeight'],\n];\n\nconst TEXT_FIELDS: [string, SpecField][] = [\n ['color', 'textFill'],\n ['font-family', 'fontFamily'],\n ['font-size', 'fontSize'],\n ['font-weight', 'fontWeight'],\n ['line-height', 'lineHeight'],\n ['letter-spacing', 'letterSpacing'],\n];\n\nconst SIDE_FIELDS: Record<string, SpecField> = { top: 'strokeTopWeight', right: 'strokeRightWeight', bottom: 'strokeBottomWeight', left: 'strokeLeftWeight' };\n\nconst typeCache = new WeakMap<Map<string, TokenInfo>, Map<string, TokenInfo>>();\n/** Token path -> token, for type checks. */\nfunction typesOf(tokens: Map<string, TokenInfo>): Map<string, TokenInfo> {\n let m = typeCache.get(tokens);\n if (!m) {\n m = new Map([...tokens.values()].map((t) => [t.path, t]));\n typeCache.set(tokens, m);\n }\n return m;\n}\n\nfunction expectedTypes(field: SpecField): string[] {\n if (COLOR_FIELDS.has(field)) return ['color'];\n if (field === 'fontFamily') return ['fontFamily'];\n if (field === 'fontWeight') return ['fontWeight', 'number'];\n return ['dimension', 'number'];\n}\n\ninterface PartValues {\n values: Partial<Record<SpecField, SpecValue>>;\n unmapped: { property: string; value: string; reason: string }[];\n}\n\nfunction partValues(node: Node, computed: Map<string, string>, own: Map<string, string>, tokens: Map<string, TokenInfo>, parent: Map<string, string> | undefined): PartValues {\n const out: PartValues = { values: {}, unmapped: [] };\n const set = (field: SpecField, prop: string, raw: string | undefined, skipZero = false) => {\n const r = resolveValue(raw, computed, tokens, 0, parent, prop === 'color');\n if (!r) return;\n if (r.unmapped) {\n out.unmapped.push({ property: prop, value: raw!, reason: r.unmapped });\n return;\n }\n if (r.value === 0 && skipZero) return;\n if (r.value === null && !COLOR_FIELDS.has(field)) return;\n if (typeof r.value === 'string') {\n const t = typesOf(tokens).get(r.value);\n if (t && !expectedTypes(field).includes(t.type)) {\n out.unmapped.push({ property: prop, value: raw!, reason: `${r.value} is a ${t.type} token, ${field} needs ${expectedTypes(field).join(' or ')}` });\n return;\n }\n }\n out.values[field] = r.value as SpecValue;\n };\n if (node.kind === 'text') {\n for (const [prop, field] of TEXT_FIELDS) set(field, prop, computed.get(prop));\n return out;\n }\n if (node.kind === 'icon') {\n set('width', 'width', computed.get('width'));\n set('height', 'height', computed.get('height'));\n set('stroke', 'color', computed.get('color'));\n set('strokeWeight', 'stroke-width', computed.get('stroke-width'));\n return out;\n }\n for (const [prop, field] of FRAME_FIELDS) set(field, prop, computed.get(prop), field === 'minWidth' || field === 'minHeight');\n // Borders: one stroke for four equal sides, or per-side weights (a top rule).\n const widths = (['top', 'right', 'bottom', 'left'] as const).map((s) => computed.get(`border-${s}-width`));\n const colors = (['top', 'right', 'bottom', 'left'] as const).map((s) => computed.get(`border-${s}-color`));\n const present = widths.map((w) => w !== undefined && !isZero(w));\n if (present.every(Boolean) && new Set(widths).size === 1 && new Set(colors).size === 1) {\n set('strokeWeight', 'border-width', widths[0]);\n set('stroke', 'border-color', colors[0]);\n } else if (present.some(Boolean)) {\n const colorAt = present.indexOf(true);\n set('stroke', 'border-color', colors[colorAt]);\n (['top', 'right', 'bottom', 'left'] as const).forEach((s, i) => (present[i] ? set(SIDE_FIELDS[s]!, `border-${s}-width`, widths[i]) : (out.values[SIDE_FIELDS[s]!] = 0)));\n }\n for (const [prop, reason] of Object.entries(REPORTED)) {\n const v = own.get(prop);\n if (v !== undefined && /var\\(/.test(v)) out.unmapped.push({ property: prop, value: v, reason });\n }\n return out;\n}\n\nfunction layoutOf(computed: Map<string, string>): SpecLayout {\n const dir = computed.get('flex-direction') ?? 'row';\n const display = computed.get('display') ?? 'block';\n const flex = /flex/.test(display);\n const justify = computed.get('justify-content') ?? 'normal';\n const align = computed.get('align-items') ?? 'normal';\n const primary = /center/.test(justify) ? 'CENTER' : /space-between/.test(justify) ? 'SPACE_BETWEEN' : /end/.test(justify) ? 'MAX' : 'MIN';\n const counter = /center/.test(align) ? 'CENTER' : /end/.test(align) ? 'MAX' : /stretch|normal/.test(align) && flex ? 'STRETCH' : 'MIN';\n return { direction: flex && !/column/.test(dir) ? 'HORIZONTAL' : 'VERTICAL', primary, counter: flex ? counter : 'STRETCH' };\n}\n\n/** `overflow: hidden | clip`: the frame clips its content (a card's footer fill inside its rounded corners). */\nconst clips = (c: Map<string, string> | undefined) => /^(hidden|clip)\\b/.test(c?.get('overflow') ?? c?.get('overflow-x') ?? '');\n\n/** A block-level root (display block, flex, grid) or `width: 100%`: in code it fills its container's width. */\nfunction fillsContainer(c: Map<string, string> | undefined): boolean {\n if (!c) return false;\n if (c.get('width') === '100%') return true;\n const display = c.get('display') ?? 'block';\n return /^(block|flex|grid|flow-root)$/.test(display);\n}\n\ninterface Evaluated {\n built: Built;\n values: SpecVariant['values'];\n unmapped: SpecUnmapped[];\n layouts: Map<string, SpecLayout>;\n /** Fingerprint of the classes rendered, to tell whether a prop changes anything. */\n classes: string;\n /** Part id -> computed CSS values. */\n computed: Map<string, Map<string, string>>;\n}\n\nfunction evaluateVariant(reader: Reader, src: ComponentSource, rules: CssRule[], props: Record<string, Value>, state: CssState, tokens: Map<string, TokenInfo>): Evaluated | undefined {\n const built = build(reader, src, props);\n if (!built) return undefined;\n const els = toCssTree(built);\n const computedById = new Map<string, Map<string, string>>();\n const values: SpecVariant['values'] = {};\n const unmapped: SpecUnmapped[] = [];\n const layouts = new Map<string, SpecLayout>();\n for (const [id, node] of built.parts) {\n const el = els.get(id)!;\n const parentId = built.parents.get(id);\n const own = declaredFor(rules, el, state);\n let computed = computeValues(own, parentId ? computedById.get(parentId) : undefined);\n const ownValues = new Map([...own].map(([k, d]) => [k, d.value]));\n if (node.placeholder) {\n // The placeholder text: the field's own values, then its ::placeholder rules.\n const ph = declaredFor(rules, el, state, 'placeholder');\n computed = computeValues(ph, computed);\n }\n computedById.set(id, computed);\n const pv = partValues(node, computed, ownValues, tokens, parentId ? computedById.get(parentId) : undefined);\n values[id] = pv.values;\n for (const u of pv.unmapped) unmapped.push({ part: id, ...u });\n if (node.kind === 'frame') layouts.set(id, layoutOf(computed));\n }\n const classes = [...built.parts].map(([id, n]) => `${id}:${n.classes.join(',')}:${n.visible?.prop ?? ''}`).join(';');\n return { built, values, unmapped, layouts, classes, computed: computedById };\n}\n\nfunction product(axes: { name: string; values: string[] }[]): Record<string, string>[] {\n let out: Record<string, string>[] = [{}];\n for (const a of axes) out = out.flatMap((p) => a.values.map((v) => ({ ...p, [a.name]: v })));\n return out;\n}\n\nconst sameValues = (a: SpecVariant['values'], b: SpecVariant['values']) => JSON.stringify(a) === JSON.stringify(b);\n\nconst BOX_FIELDS: SpecField[] = ['paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft', 'itemSpacing'];\nconst PAINT_FIELDS: SpecField[] = ['fill', 'stroke', 'strokeWeight', 'strokeTopWeight', 'strokeRightWeight', 'strokeBottomWeight', 'strokeLeftWeight', 'cornerRadius', 'width', 'height', 'minWidth', 'minHeight'];\nconst empty = (v: SpecValue | undefined) => v === undefined || v === 0 || v === null;\n\n/**\n * A root whose only child is a plain frame that only adds padding and gap (Tag's `<span class=\"label\">`): the wrapper\n * is merged into the root, so Figma gets one auto layout frame with the icon and the text, like Badge. Only when the CSS\n * allows it: the root has no padding or gap of its own, and the wrapper has no paint, border, radius or size, in every\n * variant.\n */\nfunction flattenWrapper(parts: SpecPart[], variants: SpecVariant[], unmapped: SpecUnmapped[]): void {\n const root = parts.find((p) => !p.parent);\n const children = parts.filter((p) => p.parent === root?.id);\n const w = children[0];\n if (!root || root.kind !== 'frame' || children.length !== 1 || !w || w.kind !== 'frame' || w.visible || w.clip) return;\n for (const v of variants) {\n const r = v.values[root.id] ?? {};\n const x = v.values[w.id] ?? {};\n if (BOX_FIELDS.some((f) => !empty(r[f])) || PAINT_FIELDS.some((f) => !empty(x[f]))) return;\n }\n for (const v of variants) {\n const r = (v.values[root.id] ??= {});\n const x = v.values[w.id] ?? {};\n for (const f of BOX_FIELDS) if (x[f] !== undefined) r[f] = x[f];\n delete v.values[w.id];\n }\n if (w.layout) root.layout = w.layout;\n if (w.source) root.source = root.source ? `${root.source}, ${w.source}` : w.source;\n for (const p of parts) if (p.parent === w.id) p.parent = root.id;\n for (const u of unmapped) if (u.part === w.id) u.part = root.id;\n parts.splice(parts.indexOf(w), 1);\n}\n\n/** The spec of one component, or an error message when it cannot be derived. */\nexport function generateComponentSpec(name: string, opts: SpecGeneratorOptions): ComponentSpec {\n const reader = new Reader(opts);\n const src = reader.load(name);\n if (!src) throw new Error(`${name}: ${opts.componentsDir}/${name}/${name}.tsx was not found.`);\n if (!src.fn) throw new Error(`${name}: no forwardRef(function ${name}(...)) or exported function ${name} in ${src.file}.`);\n\n // Every CSS module the rendered tree may use: the component's own, the ones it imports, and those of nested components.\n const modules = new Map<string, string>();\n const addModules = (s: ComponentSource | null) => {\n if (!s) return;\n for (const path of s.styles.values()) {\n if (modules.has(path)) continue;\n const text = opts.read(path);\n if (text !== undefined) modules.set(path, text);\n }\n };\n addModules(src);\n const nestedNames = new Set<string>();\n const findNested = (s: ComponentSource, depth: number) => {\n const visit = (n: ts.Node) => {\n if ((ts.isJsxOpeningElement(n) || ts.isJsxSelfClosingElement(n)) && /^[A-Z]/.test(n.tagName.getText(s.sf))) {\n const tag = n.tagName.getText(s.sf);\n if (tag !== name && !nestedNames.has(tag) && reader.exists(tag)) {\n nestedNames.add(tag);\n const other = reader.load(tag);\n addModules(other);\n if (other && depth < 3) findNested(other, depth + 1);\n }\n }\n ts.forEachChild(n, visit);\n };\n visit(s.sf);\n };\n findNested(src, 0);\n // Base styles of the nested components first, then the component's own (they override, as with CSS module order).\n const ordered = [...modules].sort(([a], [b]) => Number(a.startsWith(`${opts.componentsDir}/${name}/`)) - Number(b.startsWith(`${opts.componentsDir}/${name}/`)));\n const rules: CssRule[] = [];\n const cssErrors: string[] = [];\n for (const [path, text] of ordered) {\n const r = parseCssModule(path, text, rules.length);\n rules.push(...r.rules);\n cssErrors.push(...r.errors);\n }\n\n // Axes: string-literal union props that change the rendered classes.\n const base = evaluateVariant(reader, src, rules, {}, DEFAULT_STATE, opts.tokens);\n if (!base) throw new Error(`${name}: could not read what the component renders.`);\n const unmappedProps: SpecUnmapped[] = [];\n const axes: SpecAxis[] = [];\n const defaults = new Map<string, Value>();\n {\n const scope: Scope = { src, vars: new Map(), locals: new Map(), toggles: new Map(), main: true };\n bindProps(src.fn, scope, {});\n for (const [prop] of src.props) defaults.set(prop, scope.vars.get(prop));\n }\n for (const p of src.props.values()) {\n if (p.kind !== 'union' || !p.values) continue;\n const changes = p.values.some((v) => evaluateVariant(reader, src, rules, { [p.name]: v }, DEFAULT_STATE, opts.tokens)?.classes !== base.classes);\n if (!changes) {\n unmappedProps.push({ part: 'root', property: `prop ${p.name}`, value: p.values.join(' | '), reason: 'does not change the styles' });\n continue;\n }\n const def = defaults.get(p.name);\n axes.push({ name: sentenceCase(p.name), prop: p.name, values: [...p.values], default: typeof def === 'string' && p.values.includes(def) ? def : p.values[0]! });\n }\n\n const combos = product(axes);\n const propsFor = (combo: Record<string, string>) => Object.fromEntries(axes.map((a) => [a.prop!, combo[a.name]!]));\n const canDisable = src.native === 'button' || src.native === 'input' || src.native === 'textarea' || src.props.has('disabled');\n const states = STATES.filter((s) => s.name !== 'Disabled' || canDisable);\n const byState = new Map<string, Map<string, Evaluated>>();\n for (const s of states) {\n const m = new Map<string, Evaluated>();\n for (const combo of combos) {\n const ev = evaluateVariant(reader, src, rules, propsFor(combo), s.state, opts.tokens);\n if (ev) m.set(JSON.stringify(combo), ev);\n }\n byState.set(s.name, m);\n }\n // A state is drawn when it looks different from Default (and Pressed from Hover) in at least one variant.\n const differs = (s: string, from: string) =>\n combos.some((c) => {\n const a = byState.get(s)!.get(JSON.stringify(c));\n const b = byState.get(from)?.get(JSON.stringify(c));\n return a && b && !sameValues(a.values, b.values);\n });\n const stateNames = states\n .map((s) => s.name)\n .filter((s) => s === 'Default' || (differs(s, 'Default') && (s !== 'Pressed' || differs(s, 'Hover'))));\n if (stateNames.length > 1) axes.push({ name: 'State', values: stateNames, default: 'Default' });\n\n const variants: SpecVariant[] = [];\n const unmapped: SpecUnmapped[] = [];\n for (const combo of combos) {\n for (const s of stateNames.length > 1 ? stateNames : ['Default']) {\n const ev = byState.get(s)!.get(JSON.stringify(combo));\n if (!ev) continue;\n const props = stateNames.length > 1 ? { ...combo, State: s } : { ...combo };\n variants.push({ props, values: ev.values });\n unmapped.push(...ev.unmapped);\n }\n }\n if (variants.length > MAX_VARIANTS) throw new Error(`${name}: ${variants.length} variants, more than ${MAX_VARIANTS}. Split an axis before generating.`);\n\n // Parts, layout and properties come from the default variant.\n const parts: SpecPart[] = [];\n const properties: SpecProperty[] = [];\n for (const [id, n] of base.built.parts) {\n const parent = base.built.parents.get(id);\n const part: SpecPart = {\n id,\n name: !parent ? name : n.kind === 'text' ? n.text!.property : n.visible ? n.visible.property : n.name ?? (n.kind === 'icon' ? 'Icon' : n.classes[0]?.split('|')[1] ?? n.tag),\n kind: n.kind,\n ...(parent ? { parent } : {}),\n ...(n.classes.length ? { source: n.classes.map((c) => c.split('|').map((x, i) => (i === 0 ? posix.basename(x) : `.${x}`)).join(' ')).join(', ') } : {}),\n ...(n.kind === 'frame' ? { layout: base.layouts.get(id) } : {}),\n ...(n.kind === 'frame' && clips(base.computed.get(id)) ? { clip: true } : {}),\n ...(!parent && fillsContainer(base.computed.get(id)) ? { fill: true } : {}),\n ...(n.text ? { text: n.text.property } : {}),\n ...(n.visible ? { visible: n.visible.property } : {}),\n };\n parts.push(part);\n if (n.text && !properties.some((p) => p.name === n.text!.property)) properties.push({ name: n.text.property, type: 'TEXT', default: n.text.default, ...(n.text.prop ? { prop: n.text.prop } : {}) });\n }\n for (const n of base.built.parts.values())\n if (n.visible && !properties.some((p) => p.name === n.visible!.property)) properties.push({ name: n.visible.property, type: 'BOOLEAN', default: false, prop: n.visible.prop });\n\n // Props the spec does not draw (loading, slots...), so readers know what is missing.\n const used = new Set([...axes.map((a) => a.prop), ...properties.map((p) => p.prop), 'disabled', 'className', 'children', 'render']);\n for (const p of src.props.values()) {\n if (used.has(p.name) || p.kind === 'function' || p.kind === 'string' || p.kind === 'other' || p.kind === 'union') continue;\n unmappedProps.push({ part: 'root', property: `prop ${p.name}`, value: p.kind, reason: p.kind === 'node' ? 'slot content is not drawn' : p.kind === 'icon' ? 'icon prop with no icon part' : 'not drawn in this version' });\n }\n for (const e of cssErrors) unmappedProps.push({ part: 'root', property: 'css', value: e, reason: 'selector not understood' });\n\n flattenWrapper(parts, variants, unmapped);\n const swapped = addSwaps(name, src, parts, properties, axes, variants, opts);\n for (let i = unmappedProps.length - 1; i >= 0; i--) if (swapped.has(unmappedProps[i]!.property.replace(/^prop /, ''))) unmappedProps.splice(i, 1);\n\n const seen = new Set<string>();\n const dedup = [...unmappedProps, ...unmapped].filter((u) => {\n const k = `${u.part}|${u.property}|${u.reason}`;\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n // Every variant lists all of its fields (even when equal across variants): the plugin binds per variant.\n const source = [src.file, ...[...modules.keys()].sort()];\n const spec: Omit<ComponentSpec, 'hash'> = { name, source, axes, properties, parts, variants, unmapped: dedup };\n return { name, hash: hashSpec(spec), source, axes, properties, parts, variants, unmapped: dedup };\n}\n\n\n// ---------------------------------------------------------------------------------------------\n// Swappable parts: icons and content slots\n\n/** Icons every pulled file gets besides the ones the components use, so designers can swap without importing. */\nexport const COMMON_ICONS = ['Plus', 'Minus', 'Pencil', 'Trash2', 'Copy', 'Search', 'X', 'Check', 'ChevronDown', 'ChevronRight', 'Info', 'AlertTriangle', 'Star', 'Settings', 'ExternalLink', 'Download', 'Upload', 'Ellipsis'];\n\n/** Default icon of a slot when neither the docs preview nor the AllStates story shows one. */\nconst FALLBACK_ICON: Record<string, string> = { Badge: 'Info' };\nconst DEFAULT_FALLBACK_ICON = 'Plus';\n\n/** The icon components themselves: Icon.tsx draws `sm` by default; Lucide's grid is 24, the `lg` size. */\nexport const ICON_STYLE: SpecIconStyle = { size: 'icon.size.lg', color: 'color.text.default', stroke: 'icon.stroke' };\n\n/** Media slot: a neutral plate with a centered image icon, 16:9, as wide as a card (size.80). */\nexport const MEDIA_SLOT: SpecSlot = {\n name: 'Slot/Media',\n kind: 'media',\n values: { fill: 'color.bg.muted', width: 'size.80' },\n aspect: [16, 9],\n icon: 'Image',\n iconValues: { width: 'icon.size.lg', height: 'icon.size.lg', stroke: 'color.text.muted', strokeWeight: 'icon.stroke' },\n};\n\ninterface DocNode {\n c?: string;\n p?: Record<string, unknown>;\n children?: unknown[];\n}\n\n/** Every `{ c, p }` element of a docs.json value, in document order. */\nfunction docElements(v: unknown, out: DocNode[] = []): DocNode[] {\n if (Array.isArray(v)) for (const x of v) docElements(x, out);\n else if (v && typeof v === 'object') {\n const n = v as DocNode;\n if (typeof n.c === 'string') out.push(n);\n for (const x of Object.values(v)) docElements(x, out);\n }\n return out;\n}\n\nfunction readDocs(name: string, opts: SpecGeneratorOptions): Record<string, unknown> | undefined {\n const text = opts.read(`${opts.componentsDir}/${name}/${name}.docs.json`);\n if (!text) return undefined;\n try {\n return JSON.parse(text) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n}\n\nfunction readStories(name: string, opts: SpecGeneratorOptions): ts.SourceFile | undefined {\n const file = `${opts.componentsDir}/${name}/${name}.stories.tsx`;\n const text = opts.read(file);\n return text === undefined ? undefined : ts.createSourceFile(file, text, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);\n}\n\n/** Names imported from lucide-react by a stories file. */\nfunction storyIcons(sf: ts.SourceFile | undefined): string[] {\n const out: string[] = [];\n for (const st of sf?.statements ?? []) {\n if (!ts.isImportDeclaration(st) || unquote(st.moduleSpecifier.getText(sf)) !== 'lucide-react') continue;\n const b = st.importClause?.namedBindings;\n if (b && ts.isNamedImports(b)) for (const e of b.elements) if (!e.isTypeOnly) out.push((e.propertyName ?? e.name).text);\n }\n return out;\n}\n\n/** First icon the AllStates story passes to `<Name prop={Icon}>` (the false branch of a condition: the general case). */\nfunction allStatesIcon(sf: ts.SourceFile | undefined, name: string, prop: string): string | undefined {\n if (!sf) return undefined;\n let decl: ts.Node | undefined;\n for (const st of sf.statements)\n if (ts.isVariableStatement(st)) for (const d of st.declarationList.declarations) if (ts.isIdentifier(d.name) && d.name.text === 'AllStates') decl = d;\n let found: string | undefined;\n const pick = (e: ts.Expression): string | undefined => {\n if (ts.isParenthesizedExpression(e)) return pick(e.expression);\n if (ts.isIdentifier(e)) return e.text;\n if (ts.isConditionalExpression(e)) return pick(e.whenFalse);\n return undefined;\n };\n const visit = (n: ts.Node) => {\n if (found) return;\n if ((ts.isJsxOpeningElement(n) || ts.isJsxSelfClosingElement(n)) && n.tagName.getText(sf) === name) {\n for (const a of n.attributes.properties) {\n if (!ts.isJsxAttribute(a) || a.name.getText(sf) !== prop || !a.initializer || !ts.isJsxExpression(a.initializer) || !a.initializer.expression) continue;\n found = pick(a.initializer.expression);\n if (found) return;\n }\n }\n ts.forEachChild(n, visit);\n };\n if (decl) visit(decl);\n return found;\n}\n\n/** Default icon of an icon prop: the docs preview, then the AllStates story, then a fallback. */\nfunction defaultIcon(name: string, prop: string, opts: SpecGeneratorOptions): string {\n const docs = readDocs(name, opts);\n for (const el of docElements(docs?.preview)) {\n const v = el.c === name ? el.p?.[prop] : undefined;\n if (typeof v === 'string' && /^[A-Z]\\w*$/.test(v)) return v;\n }\n return allStatesIcon(readStories(name, opts), name, prop) ?? FALLBACK_ICON[name] ?? DEFAULT_FALLBACK_ICON;\n}\n\n/** Icon names a component's docs (icon props of any element) and stories (lucide-react imports) reference. */\nfunction referencedIcons(name: string, opts: SpecGeneratorOptions): string[] {\n const out: string[] = [];\n for (const el of docElements(readDocs(name, opts)))\n for (const [k, v] of Object.entries(el.p ?? {})) if (/^icon/i.test(k) && typeof v === 'string' && /^[A-Z]\\w*$/.test(v)) out.push(v);\n out.push(...storyIcons(readStories(name, opts)));\n return out;\n}\n\nconst zeroInline = (v: Partial<Record<SpecField, SpecValue>> | undefined) => !!v && v.paddingLeft === 0 && v.paddingRight === 0;\n\n/**\n * Marks the swappable parts of a spec and returns the code props they stand for:\n * - Icon parts swap between every icon (\"Icon\", \"Icon start\"), default from the docs or stories. Optional icons keep\n * their BOOLEAN visibility property.\n * - A compound part's content (a text in a non-root frame) that code draws full-bleed in some variant (no inline\n * padding: Card padding none, for media) becomes a content slot: \"Slot/<Component> <part> text\" or \"Slot/Media\",\n * Media by default where it is full-bleed. Its TEXT property moves to the text slot component.\n */\nfunction addSwaps(name: string, src: ComponentSource, parts: SpecPart[], properties: SpecProperty[], axes: SpecAxis[], variants: SpecVariant[], opts: SpecGeneratorOptions): Set<string> {\n const props = new Set<string>();\n const iconProps = [...src.props.values()].filter((p) => p.kind === 'icon');\n const defaultKey = variantKeyOf(Object.fromEntries(axes.map((a) => [a.name, a.default])));\n const defaultVariant = variants.find((v) => variantKeyOf(v.props) === defaultKey) ?? variants[0];\n const setSlot = (part: string, value: (v: SpecVariant) => string) => {\n for (const v of variants) (v.slots ??= {})[part] = value(v);\n };\n for (const part of parts) {\n if (part.kind === 'icon') {\n const visibleProp = part.visible ? properties.find((p) => p.type === 'BOOLEAN' && p.name === part.visible)?.prop : undefined;\n const prop = visibleProp ?? iconProps.find((p) => !p.optional && !properties.some((x) => x.prop === p.name))?.name;\n if (!prop) continue;\n const icon = iconComponentName(defaultIcon(name, prop, opts));\n part.swap = { property: sentenceCase(prop), default: icon, prop };\n setSlot(part.id, () => icon);\n props.add(prop);\n continue;\n }\n const parent = parts.find((p) => p.id === part.parent);\n if (part.kind !== 'text' || !part.text || !parent?.parent || parent.kind !== 'frame') continue;\n if (!variants.some((v) => zeroInline(v.values[parent.id]))) continue;\n const textSlot = `Slot/${name} ${part.text.toLowerCase()} text`;\n const media = MEDIA_SLOT.name;\n part.swap = { property: part.text, default: zeroInline(defaultVariant?.values[parent.id]) ? media : textSlot, options: [textSlot, media] };\n setSlot(part.id, (v) => (zeroInline(v.values[parent.id]) ? media : textSlot));\n const i = properties.findIndex((p) => p.type === 'TEXT' && p.name === part.text);\n if (i >= 0) properties.splice(i, 1);\n delete part.text;\n }\n return props;\n}\n\n// ---------------------------------------------------------------------------------------------\n// Lucide icons\n\n/** lucide-react export name -> icon id, from the ESM index (\"export { default as Trash2, ... } from './icons/trash.mjs'\"). */\nfunction lucideIndex(dir: string, opts: SpecGeneratorOptions): Map<string, string> {\n const text = opts.read(`${dir}/lucide-react.mjs`) ?? opts.read(`${dir}/lucide-react.js`);\n if (text === undefined) throw new Error(`lucide-react was not found at ${dir}: run npm install.`);\n const out = new Map<string, string>();\n for (const m of text.matchAll(/export\\s*\\{([^}]*)\\}\\s*from\\s*'\\.\\/icons\\/([\\w-]+)\\.m?js'/g)) {\n for (const part of m[1]!.split(',')) {\n const n = /default as (\\w+)/.exec(part.trim());\n if (n) out.set(n[1]!, m[2]!);\n }\n }\n return out;\n}\n\nconst attrText = (v: string | number) => String(v).replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/</g, '&lt;');\n\n/** The icon's SVG from its lucide-react module (`__iconData.node` or `__iconNode`), with Lucide's default attributes. */\nfunction lucideSvg(dir: string, id: string, opts: SpecGeneratorOptions): string {\n const file = `${dir}/icons/${id}.mjs`;\n const text = opts.read(file) ?? opts.read(`${dir}/icons/${id}.js`);\n if (text === undefined) throw new Error(`lucide-react has no icon file ${file}.`);\n const sf = ts.createSourceFile(file, text, ts.ScriptTarget.Latest, true, ts.ScriptKind.JS);\n let nodeArray: ts.ArrayLiteralExpression | undefined;\n const visit = (n: ts.Node) => {\n if (nodeArray) return;\n if (ts.isVariableDeclaration(n) && ts.isIdentifier(n.name) && n.initializer) {\n if (n.name.text === '__iconNode' && ts.isArrayLiteralExpression(n.initializer)) nodeArray = n.initializer;\n if (n.name.text === '__iconData' && ts.isObjectLiteralExpression(n.initializer)) {\n const prop = n.initializer.properties.find((p): p is ts.PropertyAssignment => ts.isPropertyAssignment(p) && p.name.getText(sf) === 'node');\n if (prop && ts.isArrayLiteralExpression(prop.initializer)) nodeArray = prop.initializer;\n }\n }\n ts.forEachChild(n, visit);\n };\n visit(sf);\n if (!nodeArray) throw new Error(`${file}: no icon node found.`);\n const children = nodeArray.elements.map((el) => {\n if (!ts.isArrayLiteralExpression(el)) throw new Error(`${file}: unexpected icon node.`);\n const [tag, attrs] = el.elements;\n const name = tag && ts.isStringLiteral(tag) ? tag.text : '';\n const pairs: string[] = [];\n if (attrs && ts.isObjectLiteralExpression(attrs)) {\n for (const p of attrs.properties) {\n if (!ts.isPropertyAssignment(p)) continue;\n const key = unquote(p.name.getText(sf));\n if (key === 'key') continue;\n const v = p.initializer;\n const value = ts.isStringLiteral(v) || ts.isNoSubstitutionTemplateLiteral(v) ? v.text : ts.isNumericLiteral(v) ? Number(v.text) : undefined;\n if (value !== undefined) pairs.push(`${key}=\"${attrText(value)}\"`);\n }\n }\n return `<${name}${pairs.length ? ` ${pairs.join(' ')}` : ''}/>`;\n });\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${children.join('')}</svg>`;\n}\n\n/**\n * The icons section: every icon a slot defaults to, every icon the components' docs and stories reference, the media\n * slot's icon, then the common set. One entry per Lucide icon (aliases folded into the first name seen), sorted by name.\n */\nexport function generateIcons(components: ComponentSpec[], opts: SpecGeneratorOptions, slots: SpecSlot[] = []): SpecIcon[] {\n const dir = opts.lucideDir ?? 'node_modules/lucide-react/dist/esm';\n const index = lucideIndex(dir, opts);\n const names: string[] = [];\n for (const c of components) {\n for (const p of c.parts) if (p.swap && !p.swap.options) names.push(p.swap.default.replace(/^Icon\\//, ''));\n names.push(...referencedIcons(c.name, opts));\n }\n for (const s of slots) if (s.icon) names.push(s.icon);\n names.push(...COMMON_ICONS);\n const byId = new Map<string, SpecIcon>();\n for (const n of names) {\n const id = index.get(n);\n if (!id) throw new Error(`Icon ${n} is not exported by lucide-react.`);\n const hit = byId.get(id);\n if (!hit) byId.set(id, { name: n, lucide: id, svg: lucideSvg(dir, id, opts) });\n else if (hit.name !== n && !hit.aliases?.includes(n)) (hit.aliases ??= []).push(n);\n }\n return [...byId.values()].sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0)).map((i) => (i.aliases ? { ...i, aliases: [...i.aliases].sort() } : i));\n}\n\n/** Content components the specs' slots swap to: each component's text slot (its default variant's text fields), then Media. */\nexport function generateSlots(components: ComponentSpec[]): SpecSlot[] {\n const out: SpecSlot[] = [];\n let media = false;\n for (const c of components) {\n const defaultKey = variantKeyOf(Object.fromEntries(c.axes.map((a) => [a.name, a.default])));\n const v = c.variants.find((x) => variantKeyOf(x.props) === defaultKey) ?? c.variants[0];\n for (const p of c.parts) {\n if (!p.swap?.options) continue;\n for (const o of p.swap.options) {\n if (o === MEDIA_SLOT.name) media = true;\n else if (!out.some((s) => s.name === o)) out.push({ name: o, kind: 'text', values: { ...(v?.values[p.id] ?? {}) }, text: { property: 'Text', default: p.name } });\n }\n }\n }\n if (media) out.push(MEDIA_SLOT);\n return out;\n}\n\nexport function generateComponentSpecs(names: string[], opts: SpecGeneratorOptions): ComponentSpecsFile {\n const components = names.map((n) => generateComponentSpec(n, opts));\n const slots = generateSlots(components);\n return {\n version: COMPONENT_SPECS_VERSION,\n generated: 'Generated by `npm run specs` from the component TSX and CSS modules. Do not edit: the test suite fails when it is out of date.',\n components,\n icons: generateIcons(components, opts, slots),\n iconStyle: ICON_STYLE,\n slots,\n };\n}\n\n// ---------------------------------------------------------------------------------------------\n// Repo helpers (Node)\n\n/** The 6 base components of the first version. The generator works on any component folder. */\nexport const SPEC_COMPONENTS = ['Button', 'IconButton', 'Badge', 'Tag', 'Input', 'Card'];\n\n/** CSS custom property -> token, for every token of the repo (all tiers), with the repo's cssVar convention. */\nexport function tokenCssIndex(files: Record<string, string>, opts: { prefix?: string; separator?: string; layout?: Parameters<typeof buildTokenSet>[1] } = {}): Map<string, TokenInfo> {\n const set = buildTokenSet(files, opts.layout ?? {});\n const out = new Map<string, TokenInfo>();\n for (const t of set.tokens.values()) {\n const v = tokenCssVar(t.path, opts.prefix, opts.separator);\n if (!out.has(v)) out.set(v, { path: t.path, type: t.type });\n }\n return out;\n}\n\n/** Specs of `names` for the repo at `root`, with bridge.config.json (tokens root, components dir, cssVar). */\nexport function generateRepoComponentSpecs(root: string, names: string[] = SPEC_COMPONENTS): ComponentSpecsFile {\n const configText = readFileSync(join(root, CONFIG_FILE), 'utf8');\n const config = loadConfig(configText);\n const tokensRoot = join(root, config.tokens.root);\n const files: Record<string, string> = {};\n const walk = (dir: string) => {\n for (const n of readdirSync(dir)) {\n const full = join(dir, n);\n if (statSync(full).isDirectory()) walk(full);\n else if (n.endsWith('.tokens.json')) files[relative(tokensRoot, full).split('\\\\').join('/')] = readFileSync(full, 'utf8');\n }\n };\n walk(tokensRoot);\n const tokens = tokenCssIndex(files, { prefix: config.cssVar.prefix, separator: config.cssVar.separator, layout: layoutOptions(config) });\n const read = (p: string) => {\n try {\n return readFileSync(join(root, p), 'utf8');\n } catch {\n return undefined;\n }\n };\n const componentsDir = config.components?.dir ?? 'packages/react/src/components';\n return generateComponentSpecs(names, { componentsDir, read, tokens, styleSuffix: config.components?.styleSuffix });\n}\n\n/** The JSON text written to disk: stable, two-space indent, trailing newline. */\nexport const serializeComponentSpecs = (f: ComponentSpecsFile) => `${JSON.stringify(f, null, 2)}\\n`;\n"],"names":["resolve","sep","walk","width","l"],"mappings":"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"}