@fragments-sdk/cli 0.14.2 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -3
- package/dist/bin.js +4290 -3754
- package/dist/bin.js.map +1 -1
- package/dist/{chunk-TXFCEDOC.js → chunk-2WXKALIG.js} +2 -2
- package/dist/{chunk-I34BC3CU.js → chunk-32LIWN2P.js} +1006 -3
- package/dist/chunk-32LIWN2P.js.map +1 -0
- package/dist/{chunk-55KERLWL.js → chunk-65WSVDV5.js} +314 -89
- package/dist/chunk-65WSVDV5.js.map +1 -0
- package/dist/chunk-7DZC4YEV.js +294 -0
- package/dist/chunk-7DZC4YEV.js.map +1 -0
- package/dist/{chunk-LOYS64QS.js → chunk-7WHVW72L.js} +230 -19
- package/dist/chunk-7WHVW72L.js.map +1 -0
- package/dist/{chunk-PJT5IZ37.js → chunk-BJE3425I.js} +19 -52
- package/dist/{chunk-PJT5IZ37.js.map → chunk-BJE3425I.js.map} +1 -1
- package/dist/{chunk-5A6X2Y73.js → chunk-CZD3AD4Q.js} +12 -11
- package/dist/chunk-CZD3AD4Q.js.map +1 -0
- package/dist/{chunk-EYXVAMEX.js → chunk-MN3TJ3D5.js} +72 -3
- package/dist/chunk-MN3TJ3D5.js.map +1 -0
- package/dist/chunk-QCN35LJU.js +630 -0
- package/dist/chunk-QCN35LJU.js.map +1 -0
- package/dist/chunk-T47OLCSF.js +36 -0
- package/dist/chunk-T47OLCSF.js.map +1 -0
- package/dist/{chunk-APTQIBS5.js → chunk-XJQ5BIWI.js} +144 -1049
- package/dist/chunk-XJQ5BIWI.js.map +1 -0
- package/dist/codebase-scanner-VOTPXRYW.js +22 -0
- package/dist/converter-JLINP7CJ.js +34 -0
- package/dist/converter-JLINP7CJ.js.map +1 -0
- package/dist/core/index.js +43 -1
- package/dist/{generate-RYWIPDN2.js → generate-A4FP5426.js} +3 -4
- package/dist/{generate-RYWIPDN2.js.map → generate-A4FP5426.js.map} +1 -1
- package/dist/govern-scan-UCBZR6D6.js +280 -0
- package/dist/govern-scan-UCBZR6D6.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +11 -11
- package/dist/{init-WRUSW7R5.js → init-HGSM35XA.js} +131 -128
- package/dist/init-HGSM35XA.js.map +1 -0
- package/dist/{init-cloud-REQ3XLHO.js → init-cloud-MQ6GRJAZ.js} +2 -2
- package/dist/mcp-bin.js +5 -36
- package/dist/mcp-bin.js.map +1 -1
- package/dist/scan-VNNKACG2.js +15 -0
- package/dist/{scan-generate-TFZVL3BT.js → scan-generate-TWRHNU5M.js} +335 -46
- package/dist/scan-generate-TWRHNU5M.js.map +1 -0
- package/dist/scanner-7LAZYPWZ.js +13 -0
- package/dist/{service-HKJ6B7P7.js → service-FHQU7YS7.js} +27 -23
- package/dist/{snapshot-C5DYIGIV.js → snapshot-KQEQ6XHL.js} +2 -2
- package/dist/{static-viewer-DUVC4UIM.js → static-viewer-63PG6FWY.js} +3 -3
- package/dist/static-viewer-63PG6FWY.js.map +1 -0
- package/dist/{test-JW7JIDFG.js → test-UQYUCZIS.js} +4 -6
- package/dist/{test-JW7JIDFG.js.map → test-UQYUCZIS.js.map} +1 -1
- package/dist/{tokens-KE73G5JC.js → tokens-6GYKDV6U.js} +6 -5
- package/dist/{tokens-KE73G5JC.js.map → tokens-6GYKDV6U.js.map} +1 -1
- package/dist/tokens-generate-VTZV5EEW.js +86 -0
- package/dist/tokens-generate-VTZV5EEW.js.map +1 -0
- package/package.json +6 -6
- package/src/bin.ts +210 -48
- package/src/build.ts +130 -6
- package/src/commands/__fixtures__/shadcn-label-wrapper/package.json +7 -0
- package/src/commands/__fixtures__/shadcn-label-wrapper/src/components/ui/label.contract.json +42 -0
- package/src/commands/__fixtures__/shadcn-label-wrapper/src/components/ui/label.tsx +11 -0
- package/src/commands/__fixtures__/shadcn-label-wrapper/src/components/ui/primitive.contract.json +20 -0
- package/src/commands/__fixtures__/shadcn-label-wrapper/src/components/ui/primitive.tsx +14 -0
- package/src/commands/__fixtures__/shadcn-label-wrapper/tsconfig.app.json +23 -0
- package/src/commands/__tests__/init.test.ts +113 -0
- package/src/commands/__tests__/scan-generate.test.ts +188 -69
- package/src/commands/__tests__/verify.test.ts +91 -0
- package/src/commands/discover.ts +151 -0
- package/src/commands/enhance.ts +3 -1
- package/src/commands/govern-scan.ts +386 -0
- package/src/commands/govern.ts +2 -2
- package/src/commands/init.ts +152 -28
- package/src/commands/inspect.ts +290 -0
- package/src/commands/migrate-contract.ts +85 -0
- package/src/commands/scan-generate.ts +438 -50
- package/src/commands/scan.ts +1 -0
- package/src/commands/setup.ts +27 -50
- package/src/commands/tokens-generate.ts +113 -0
- package/src/commands/verify.ts +195 -1
- package/src/core/__fixtures__/shadcn-input/input.tsx +7 -0
- package/src/core/__fixtures__/shadcn-input/tsconfig.json +14 -0
- package/src/core/__fixtures__/shadcn-label/label.tsx +11 -0
- package/src/core/__fixtures__/shadcn-label/primitive.tsx +14 -0
- package/src/core/__fixtures__/shadcn-label/tsconfig.json +14 -0
- package/src/core/__fixtures__/shadcn-radix-label/label.tsx +11 -0
- package/src/core/__fixtures__/shadcn-radix-label/node_modules/radix-ui/index.d.ts +12 -0
- package/src/core/__fixtures__/shadcn-radix-label/tsconfig.json +14 -0
- package/src/core/__tests__/contract-parity.test.ts +316 -0
- package/src/core/component-extractor.test.ts +39 -0
- package/src/core/component-extractor.ts +92 -1
- package/src/core/config.ts +2 -1
- package/src/core/discovery.ts +13 -2
- package/src/core/drift-verifier.ts +123 -0
- package/src/core/extractor-adapter.ts +80 -0
- package/src/mcp/__tests__/projectFields.test.ts +1 -1
- package/src/mcp/utils.ts +1 -50
- package/src/migrate/converter.ts +3 -3
- package/src/migrate/fragment-to-contract.ts +253 -0
- package/src/migrate/report.ts +1 -1
- package/src/scripts/token-benchmark.ts +121 -0
- package/src/service/__tests__/props-extractor.test.ts +94 -0
- package/src/service/__tests__/token-normalizer.test.ts +690 -0
- package/src/service/ast-utils.ts +4 -23
- package/src/service/babel-config.ts +23 -0
- package/src/service/enhance/converter.ts +61 -0
- package/src/service/enhance/props-extractor.ts +25 -8
- package/src/service/enhance/scanner.ts +5 -24
- package/src/service/snippet-validation.ts +9 -3
- package/src/service/token-normalizer.ts +510 -0
- package/src/shared/index.ts +1 -0
- package/src/shared/project-fields.ts +46 -0
- package/src/viewer/__tests__/viewer-integration.test.ts +8 -8
- package/src/viewer/preview-adapter.ts +116 -0
- package/src/viewer/style-utils.ts +27 -412
- package/src/viewer/vite-plugin.ts +2 -2
- package/dist/chunk-55KERLWL.js.map +0 -1
- package/dist/chunk-5A6X2Y73.js.map +0 -1
- package/dist/chunk-APTQIBS5.js.map +0 -1
- package/dist/chunk-EYXVAMEX.js.map +0 -1
- package/dist/chunk-I34BC3CU.js.map +0 -1
- package/dist/chunk-LOYS64QS.js.map +0 -1
- package/dist/chunk-ZKTFKHWN.js +0 -324
- package/dist/chunk-ZKTFKHWN.js.map +0 -1
- package/dist/discovery-VDANZAJ2.js +0 -28
- package/dist/init-WRUSW7R5.js.map +0 -1
- package/dist/scan-YJHQIRKG.js +0 -14
- package/dist/scan-generate-TFZVL3BT.js.map +0 -1
- package/dist/viewer-2TZS3NDL.js +0 -2730
- package/dist/viewer-2TZS3NDL.js.map +0 -1
- package/src/commands/dev.ts +0 -107
- /package/dist/{chunk-TXFCEDOC.js.map → chunk-2WXKALIG.js.map} +0 -0
- /package/dist/{discovery-VDANZAJ2.js.map → codebase-scanner-VOTPXRYW.js.map} +0 -0
- /package/dist/{init-cloud-REQ3XLHO.js.map → init-cloud-MQ6GRJAZ.js.map} +0 -0
- /package/dist/{scan-YJHQIRKG.js.map → scan-VNNKACG2.js.map} +0 -0
- /package/dist/{service-HKJ6B7P7.js.map → scanner-7LAZYPWZ.js.map} +0 -0
- /package/dist/{static-viewer-DUVC4UIM.js.map → service-FHQU7YS7.js.map} +0 -0
- /package/dist/{snapshot-C5DYIGIV.js.map → snapshot-KQEQ6XHL.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../core/src/constants.ts","../../core/src/performance-presets.ts","../../core/src/style-comparison.ts","../../core/src/schema.ts","../../core/src/defineFragment.ts","../../core/src/storyAdapter.ts","../../core/src/storybook-csf.ts","../../core/src/storyFilters.ts","../../core/src/context.ts","../../core/src/figma.ts","../../core/src/token-parser.ts","../../core/src/dtcg-parser.ts","../../core/src/dtcg.ts","../../core/src/component-contract.ts","../../core/src/contract-parser.ts","../../core/src/dtcg-generators.ts","../../core/src/composition.ts","../../core/src/preview-runtime.tsx","../../core/src/component-discovery.ts"],"sourcesContent":["/**\n * Brand constants for easy rebranding if domain availability requires it.\n * All naming throughout the codebase should reference these constants.\n */\nexport const BRAND = {\n /** Display name (e.g., \"Fragments\") */\n name: \"Fragments\",\n\n /** Lowercase name for file paths and CLI (e.g., \"fragments\") */\n nameLower: \"fragments\",\n\n /** File extension for fragment definition files — V2 canonical format */\n fileExtension: \".contract.json\",\n\n /** Legacy file extension for segments (still supported for migration) */\n legacyFileExtension: \".segment.tsx\",\n\n /** JSON file extension for compiled output */\n jsonExtension: \".fragment.json\",\n\n /** Default output file name (e.g., \"fragments.json\") */\n outFile: \"fragments.json\",\n\n /** Config file name (e.g., \"fragments.config.ts\") */\n configFile: \"fragments.config.ts\",\n\n /** Legacy config file name (still supported for migration) */\n legacyConfigFile: \"segments.config.ts\",\n\n /** CLI command name (e.g., \"fragments\") */\n cliCommand: \"fragments\",\n\n /** Package scope (e.g., \"@fragments\") */\n packageScope: \"@fragments\",\n\n /** Directory for storing fragments, registry, and cache */\n dataDir: \".fragments\",\n\n /** Components subdirectory within .fragments/ */\n componentsDir: \"components\",\n\n /** Registry file name */\n registryFile: \"registry.json\",\n\n /** Context file name (AI-ready markdown) */\n contextFile: \"context.md\",\n\n /** Screenshots subdirectory */\n screenshotsDir: \"screenshots\",\n\n /** Cache subdirectory (gitignored) */\n cacheDir: \"cache\",\n\n /** Diff output subdirectory (gitignored) */\n diffDir: \"diff\",\n\n /** Manifest filename */\n manifestFile: \"manifest.json\",\n\n /** Prefix for localStorage keys (e.g., \"fragments-\") */\n storagePrefix: \"fragments-\",\n\n /** Static viewer HTML file name */\n viewerHtmlFile: \"fragments-viewer.html\",\n\n /** MCP tool name prefix (e.g., \"fragments_\") */\n mcpToolPrefix: \"fragments_\",\n\n /** File extension for block definition files */\n blockFileExtension: \".block.ts\",\n\n /** @deprecated Use blockFileExtension instead */\n recipeFileExtension: \".recipe.ts\",\n\n /** Vite plugin namespace */\n vitePluginNamespace: \"fragments-core-shim\",\n} as const;\n\nexport type Brand = typeof BRAND;\n\n/**\n * Default configuration values for the service.\n * These can be overridden in fragments.config.ts\n */\nexport const DEFAULTS = {\n /** Default viewport dimensions */\n viewport: {\n width: 1280,\n height: 800,\n },\n\n /** Default diff threshold (percentage) */\n diffThreshold: 5,\n\n /** Browser pool size */\n poolSize: 3,\n\n /** Idle timeout before browser shutdown (ms) - 5 minutes */\n idleTimeoutMs: 5 * 60 * 1000,\n\n /** Delay after render before capture (ms) */\n captureDelayMs: 100,\n\n /** Font loading timeout (ms) */\n fontTimeoutMs: 3000,\n\n /** Default theme */\n theme: \"light\" as const,\n\n /** Dev server port */\n port: 6006,\n} as const;\n\nexport type Defaults = typeof DEFAULTS;\n","/**\n * Performance budget presets and classification utilities.\n *\n * ESLint model: global defaults, zero-config, auto-measurement.\n * Users configure 0-3 numbers. Per-component overrides are the `eslint-disable` equivalent.\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface PerformanceBudgets {\n /** Maximum gzipped bundle size in bytes */\n bundleSize: number;\n}\n\nexport interface PerformanceConfig {\n preset: string;\n budgets: PerformanceBudgets;\n}\n\nexport type ComplexityTier = 'lightweight' | 'moderate' | 'heavy';\n\nexport interface PerformanceData {\n /** Gzipped bundle size in bytes */\n bundleSize: number;\n /** Raw (minified, not gzipped) bundle size in bytes */\n rawSize: number;\n /** Complexity classification */\n complexity: ComplexityTier;\n /** Percentage of budget used (0-100+) */\n budgetPercent: number;\n /** Whether the component exceeds its budget */\n overBudget: boolean;\n /** ISO timestamp when measured */\n measuredAt: string;\n}\n\nexport interface PerformanceSummary {\n /** Preset name used */\n preset: string;\n /** Budget applied in bytes */\n budget: number;\n /** Total components measured */\n total: number;\n /** Number of components over budget */\n overBudget: number;\n /** Distribution by tier */\n tiers: Record<ComplexityTier, number>;\n}\n\n// ---------------------------------------------------------------------------\n// Presets\n// ---------------------------------------------------------------------------\n\nconst PRESETS: Record<string, PerformanceBudgets> = {\n strict: { bundleSize: 8 * 1024 }, // 8KB gzipped\n standard: { bundleSize: 15 * 1024 }, // 15KB gzipped\n relaxed: { bundleSize: 30 * 1024 }, // 30KB gzipped\n};\n\nexport const PRESET_NAMES = Object.keys(PRESETS) as readonly string[];\n\n// ---------------------------------------------------------------------------\n// Resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve a performance config from user input.\n * Accepts a preset name string or a custom config object.\n */\nexport function resolvePerformanceConfig(\n input: string | { preset?: string; budgets?: Partial<PerformanceBudgets> } | undefined\n): PerformanceConfig {\n if (!input) {\n return { preset: 'standard', budgets: PRESETS.standard };\n }\n\n if (typeof input === 'string') {\n const budgets = PRESETS[input];\n if (!budgets) {\n throw new Error(\n `Unknown performance preset \"${input}\". Available: ${PRESET_NAMES.join(', ')}`\n );\n }\n return { preset: input, budgets };\n }\n\n const presetName = input.preset ?? 'standard';\n const baseBudgets = PRESETS[presetName];\n if (!baseBudgets) {\n throw new Error(\n `Unknown performance preset \"${presetName}\". Available: ${PRESET_NAMES.join(', ')}`\n );\n }\n\n return {\n preset: presetName,\n budgets: {\n bundleSize: input.budgets?.bundleSize ?? baseBudgets.bundleSize,\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Classification\n// ---------------------------------------------------------------------------\n\n/**\n * Classify a component's complexity based on gzipped bundle size.\n *\n * - lightweight: < 5KB — simple, leaf components\n * - moderate: < 15KB — typical composed components\n * - heavy: >= 15KB — complex widgets with dependencies\n */\nexport function classifyComplexity(gzipBytes: number): ComplexityTier {\n if (gzipBytes < 5 * 1024) return 'lightweight';\n if (gzipBytes < 15 * 1024) return 'moderate';\n return 'heavy';\n}\n\n// ---------------------------------------------------------------------------\n// Formatting helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Format bytes to a human-readable string (e.g. \"2.1KB\", \"15.3KB\").\n */\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes}B`;\n const kb = bytes / 1024;\n return kb < 10 ? `${kb.toFixed(1)}KB` : `${Math.round(kb)}KB`;\n}\n\n/**\n * Create a visual budget bar for terminal output.\n */\nexport function budgetBar(percent: number, width = 20): string {\n const filled = Math.min(Math.round((percent / 100) * width), width);\n const bar = '█'.repeat(filled) + '░'.repeat(width - filled);\n return percent > 100 ? `\\x1b[31m${bar}\\x1b[0m` : `\\x1b[32m${bar}\\x1b[0m`;\n}\n","/**\n * Canonical Style Comparison Engine\n *\n * Pure comparison logic for design-code drift detection.\n * No React, no filesystem, no browser APIs, no Figma client, no Cloud types.\n *\n * This module is the single source of truth for style comparison.\n * Both @fragments-sdk/viewer and @fragments-sdk/cli consume these exports.\n */\n\nimport type {\n DesignToken,\n EnhancedStyleDiffItem,\n TokenCategory,\n TokenFix,\n TokenUsageSummary,\n} from \"./token-types.js\";\n\n// ─── Canonical Contract Types ────────────────────────────────────────────────\n\n/**\n * Source-agnostic normalized token for comparison.\n *\n * This is the canonical shape that all token sources (CSS vars, Tailwind,\n * DTCG, Figma) must produce before entering the comparison engine.\n * A `DesignToken` (CSS-custom-property-specific) can be converted to this\n * by dropping source-specific fields.\n */\nexport interface NormalizedToken {\n /** Canonical token name (e.g., \"--color-primary\", \"colors.primary\") */\n name: string;\n /** Normalized resolved value suitable for comparison (e.g., \"#0051c2\", \"16px\") */\n value: string;\n /** Token category for grouping */\n category: TokenCategory;\n /** Source system identifier */\n source: \"css-var\" | \"tailwind\" | \"dtcg\" | \"figma\" | (string & {});\n /** Original token name as declared in the source system */\n originalName: string;\n /** Theme or mode (e.g., \"default\", \"dark\", \"light\") */\n theme: string;\n}\n\n/**\n * Normalized style map: a record of CSS property names to their string values.\n * Used as the canonical input shape for both design-side and code-side styles.\n */\nexport type NormalizedStyleMap = Record<string, string>;\n\n/**\n * Options for configuring style comparison behavior.\n */\nexport interface StyleComparisonOptions {\n /** Color comparison tolerance in RGB channel delta (default: 5) */\n colorTolerance?: number;\n /** Numeric comparison tolerance in pixels (default: 1) */\n numericTolerance?: number;\n /** Alpha channel comparison tolerance (default: 0.05) */\n alphaTolerance?: number;\n /** CSS properties to compare. If omitted, uses DEFAULT_STYLE_PROPERTIES */\n properties?: string[];\n /** Theme to use for token lookup (default: \"default\") */\n theme?: string;\n}\n\n// ─── Comparison Types ────────────────────────────────────────────────────────\n\n/**\n * Style diff result for a single CSS property.\n */\nexport interface StyleDiffItem {\n /** CSS property name */\n property: string;\n /** Expected value from design source */\n figma: string;\n /** Actual value from rendered component */\n rendered: string;\n /** Whether values match (within tolerance) */\n match: boolean;\n}\n\n/**\n * Result of comparing styles between design and code.\n */\nexport interface StyleComparisonResult {\n /** Whether all styles match */\n match: boolean;\n /** Individual property comparisons */\n properties: StyleDiffItem[];\n /** CSS properties from design source */\n figmaStyles: NormalizedStyleMap;\n /** Computed CSS properties from rendered component */\n renderedStyles: NormalizedStyleMap;\n}\n\n/**\n * Token registry interface for style comparison.\n * Subset of TokenRegistryManager methods needed by the comparison engine.\n */\nexport interface TokenLookup {\n findByValue(value: string, theme?: string): string[];\n getToken(name: string): DesignToken | undefined;\n calculateUsageSummary(\n styleDiffs: Array<{\n property: string;\n figma: string;\n rendered: string;\n match: boolean;\n }>,\n theme?: string\n ): TokenUsageSummary;\n}\n\n/**\n * Enhanced style comparison result with token information.\n */\nexport interface EnhancedStyleComparisonResult extends StyleComparisonResult {\n /** Individual property comparisons with token info */\n properties: EnhancedStyleDiffItem[];\n /** Token usage summary */\n tokenSummary?: TokenUsageSummary;\n}\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\n/** Properties that use color comparison with tolerance */\nconst COLOR_PROPERTIES = new Set([\"backgroundColor\", \"borderColor\", \"color\"]);\n\n/** Properties that use numeric comparison with tolerance */\nconst NUMERIC_PROPERTIES = new Set([\n \"borderWidth\",\n \"borderRadius\",\n \"fontSize\",\n \"padding\",\n \"gap\",\n]);\n\n/** Default CSS properties compared by compareStyles() */\nexport const DEFAULT_STYLE_PROPERTIES = [\n \"backgroundColor\",\n \"borderColor\",\n \"borderWidth\",\n \"borderRadius\",\n \"fontFamily\",\n \"fontSize\",\n \"fontWeight\",\n \"lineHeight\",\n \"letterSpacing\",\n \"textAlign\",\n \"boxShadow\",\n \"padding\",\n \"gap\",\n \"opacity\",\n] as const;\n\n/** Default CSS properties compared by compareStylesWithTokens() (includes \"color\") */\nexport const DEFAULT_ENHANCED_STYLE_PROPERTIES = [\n ...DEFAULT_STYLE_PROPERTIES,\n \"color\",\n] as const;\n\n// ─── Pure Comparison Functions ───────────────────────────────────────────────\n\n/**\n * Normalize a style value for comparison.\n */\nexport function normalizeStyleValue(prop: string, value: string): string {\n let normalized = value.trim().replace(/\\s+/g, \" \");\n\n // Normalize \"none\" shadow to empty\n if (prop === \"boxShadow\" && normalized === \"none\") {\n normalized = \"\";\n }\n\n // Normalize rgba(0, 0, 0, 0) to \"transparent\"\n if (normalized.match(/rgba\\(\\s*0\\s*,\\s*0\\s*,\\s*0\\s*,\\s*0\\s*\\)/)) {\n normalized = \"transparent\";\n }\n\n return normalized;\n}\n\n/**\n * Parse a color string to RGB(A) values.\n */\nexport function parseColor(\n color: string\n): { r: number; g: number; b: number; a?: number } | null {\n // Handle hex colors\n const hexMatch = color.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);\n if (hexMatch) {\n return {\n r: parseInt(hexMatch[1], 16),\n g: parseInt(hexMatch[2], 16),\n b: parseInt(hexMatch[3], 16),\n };\n }\n\n // Handle rgb/rgba\n const rgbaMatch = color.match(\n /rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+))?\\s*\\)/\n );\n if (rgbaMatch) {\n return {\n r: parseInt(rgbaMatch[1], 10),\n g: parseInt(rgbaMatch[2], 10),\n b: parseInt(rgbaMatch[3], 10),\n a: rgbaMatch[4] ? parseFloat(rgbaMatch[4]) : 1,\n };\n }\n\n return null;\n}\n\n/**\n * Compare two color values with tolerance.\n */\nexport function compareColors(\n color1: string,\n color2: string,\n tolerance: number,\n alphaTolerance = 0.05\n): boolean {\n const rgb1 = parseColor(color1);\n const rgb2 = parseColor(color2);\n\n if (!rgb1 || !rgb2) {\n return color1 === color2;\n }\n\n return (\n Math.abs(rgb1.r - rgb2.r) <= tolerance &&\n Math.abs(rgb1.g - rgb2.g) <= tolerance &&\n Math.abs(rgb1.b - rgb2.b) <= tolerance &&\n Math.abs((rgb1.a ?? 1) - (rgb2.a ?? 1)) <= alphaTolerance\n );\n}\n\n/**\n * Compare numeric values (e.g., \"10px\" vs \"11px\") with tolerance.\n */\nexport function compareNumericValues(\n value1: string,\n value2: string,\n tolerance: number\n): boolean {\n const num1 = parseFloat(value1);\n const num2 = parseFloat(value2);\n\n if (isNaN(num1) || isNaN(num2)) {\n return value1 === value2;\n }\n\n return Math.abs(num1 - num2) <= tolerance;\n}\n\n/**\n * Compare a single style value with tolerance for color and numeric differences.\n */\nexport function compareStyleValue(\n prop: string,\n figma: string,\n rendered: string\n): boolean {\n const normalizedFigma = normalizeStyleValue(prop, figma);\n const normalizedRendered = normalizeStyleValue(prop, rendered);\n\n // Direct match\n if (normalizedFigma === normalizedRendered) {\n return true;\n }\n\n // Color comparison with tolerance\n if (COLOR_PROPERTIES.has(prop)) {\n return compareColors(normalizedFigma, normalizedRendered, 5);\n }\n\n // Numeric comparison with tolerance (for pixels)\n if (NUMERIC_PROPERTIES.has(prop)) {\n return compareNumericValues(normalizedFigma, normalizedRendered, 1);\n }\n\n return false;\n}\n\n/**\n * Compare design CSS properties with rendered computed styles.\n */\nexport function compareStyles(\n figmaStyles: Record<string, string | undefined>,\n renderedStyles: NormalizedStyleMap\n): StyleComparisonResult {\n const properties: StyleDiffItem[] = [];\n const cleanFigmaStyles: NormalizedStyleMap = {};\n\n const propsToCompare = DEFAULT_STYLE_PROPERTIES;\n\n for (const prop of propsToCompare) {\n const figmaValue = figmaStyles[prop];\n const renderedValue = renderedStyles[prop];\n\n if (figmaValue !== undefined) {\n cleanFigmaStyles[prop] = figmaValue;\n\n const match = compareStyleValue(prop, figmaValue, renderedValue || \"\");\n properties.push({\n property: prop,\n figma: figmaValue,\n rendered: renderedValue || \"(not set)\",\n match,\n });\n }\n }\n\n const allMatch = properties.every((p) => p.match);\n\n return {\n match: allMatch,\n properties,\n figmaStyles: cleanFigmaStyles,\n renderedStyles,\n };\n}\n\n// ─── Token-Aware Comparison ──────────────────────────────────────────────────\n\n/**\n * Compare styles with token awareness.\n *\n * This enhanced version:\n * 1. Performs normal style comparison\n * 2. Identifies which values match design tokens\n * 3. Flags hardcoded values that should use tokens\n * 4. Generates fix suggestions\n */\nexport function compareStylesWithTokens(\n figmaStyles: Record<string, string | undefined>,\n renderedStyles: NormalizedStyleMap,\n tokenLookup?: TokenLookup,\n theme = \"default\"\n): EnhancedStyleComparisonResult {\n const properties: EnhancedStyleDiffItem[] = [];\n const cleanFigmaStyles: NormalizedStyleMap = {};\n\n const propsToCompare = DEFAULT_ENHANCED_STYLE_PROPERTIES;\n\n for (const prop of propsToCompare) {\n const figmaValue = figmaStyles[prop];\n const renderedValue = renderedStyles[prop];\n\n if (figmaValue !== undefined) {\n cleanFigmaStyles[prop] = figmaValue;\n\n const match = compareStyleValue(prop, figmaValue, renderedValue || \"\");\n\n const item: EnhancedStyleDiffItem = {\n property: prop,\n figma: figmaValue,\n rendered: renderedValue || \"(not set)\",\n match,\n isHardcoded: false,\n };\n\n if (tokenLookup) {\n const figmaTokens = tokenLookup.findByValue(figmaValue, theme);\n const renderedTokens = renderedValue\n ? tokenLookup.findByValue(renderedValue, theme)\n : [];\n\n if (figmaTokens.length > 0) {\n item.figmaToken = figmaTokens[0];\n }\n\n if (renderedTokens.length > 0) {\n item.renderedToken = renderedTokens[0];\n }\n\n // Hardcoded = Figma matches a token, but rendered doesn't use a token\n item.isHardcoded = !!item.figmaToken && !item.renderedToken;\n\n if (item.isHardcoded && item.figmaToken) {\n const token = tokenLookup.getToken(item.figmaToken);\n if (token) {\n const cssProperty = toCssProperty(prop);\n item.suggestedFix = {\n tokenName: item.figmaToken,\n tokenValue: token.resolvedValue,\n codeFix: `${cssProperty}: var(${item.figmaToken});`,\n confidence: 0.9,\n reason: `Figma uses token ${item.figmaToken} (${token.resolvedValue}). Replace hardcoded value with token for consistency.`,\n };\n }\n }\n }\n\n properties.push(item);\n }\n }\n\n const allMatch = properties.every((p) => p.match);\n\n let tokenSummary: TokenUsageSummary | undefined;\n if (tokenLookup) {\n tokenSummary = tokenLookup.calculateUsageSummary(\n properties.map((p) => ({\n property: p.property,\n figma: p.figma,\n rendered: p.rendered,\n match: p.match,\n })),\n theme\n );\n }\n\n return {\n match: allMatch,\n properties,\n figmaStyles: cleanFigmaStyles,\n renderedStyles,\n tokenSummary,\n };\n}\n\n// ─── Formatting Helpers ──────────────────────────────────────────────────────\n\n/**\n * Convert camelCase CSS property name to kebab-case.\n */\nfunction toCssProperty(prop: string): string {\n return prop.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n}\n\n/**\n * Format token usage summary for display.\n */\nexport function formatTokenSummary(summary: TokenUsageSummary): string {\n const lines: string[] = [];\n\n lines.push(`Token Compliance: ${summary.compliancePercent}%`);\n lines.push(\n `${summary.usingTokens}/${summary.totalProperties} properties using tokens`\n );\n\n if (summary.hardcoded > 0) {\n lines.push(`${summary.hardcoded} hardcoded value(s) detected`);\n }\n\n if (summary.implicitMatches > 0) {\n lines.push(`${summary.implicitMatches} implicit match(es)`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Get status badge for token compliance level.\n */\nexport function getComplianceBadge(\n compliancePercent: number\n): { label: string; color: string } {\n if (compliancePercent >= 100) {\n return { label: \"Excellent\", color: \"green\" };\n } else if (compliancePercent >= 80) {\n return { label: \"Good\", color: \"blue\" };\n } else if (compliancePercent >= 50) {\n return { label: \"Fair\", color: \"yellow\" };\n } else {\n return { label: \"Poor\", color: \"red\" };\n }\n}\n","import { z } from 'zod';\n\n/**\n * Zod schemas for runtime validation of fragment definitions\n */\n\n// Figma property mapping schemas\nconst figmaStringMappingSchema = z.object({\n __type: z.literal('figma-string'),\n figmaProperty: z.string().min(1),\n});\n\nconst figmaBooleanMappingSchema = z.object({\n __type: z.literal('figma-boolean'),\n figmaProperty: z.string().min(1),\n valueMapping: z.object({ true: z.unknown(), false: z.unknown() }).optional(),\n});\n\nconst figmaEnumMappingSchema = z.object({\n __type: z.literal('figma-enum'),\n figmaProperty: z.string().min(1),\n valueMapping: z.record(z.unknown()),\n});\n\nconst figmaInstanceMappingSchema = z.object({\n __type: z.literal('figma-instance'),\n figmaProperty: z.string().min(1),\n});\n\nconst figmaChildrenMappingSchema = z.object({\n __type: z.literal('figma-children'),\n layers: z.array(z.string().min(1)),\n});\n\nconst figmaTextContentMappingSchema = z.object({\n __type: z.literal('figma-text-content'),\n layer: z.string().min(1),\n});\n\nexport const figmaPropMappingSchema = z.discriminatedUnion('__type', [\n figmaStringMappingSchema,\n figmaBooleanMappingSchema,\n figmaEnumMappingSchema,\n figmaInstanceMappingSchema,\n figmaChildrenMappingSchema,\n figmaTextContentMappingSchema,\n]);\n\nexport const fragmentMetaSchema = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n category: z.string().min(1),\n tags: z.array(z.string()).optional(),\n status: z.enum(['stable', 'beta', 'deprecated', 'experimental']).optional(),\n since: z.string().optional(),\n dependencies: z.array(z.object({\n name: z.string().min(1),\n version: z.string().min(1),\n reason: z.string().optional(),\n })).optional(),\n figma: z.string().url().optional(),\n figmaProps: z.record(figmaPropMappingSchema).optional(),\n});\n\nexport const fragmentUsageSchema = z.object({\n when: z.array(z.string()),\n whenNot: z.array(z.string()),\n guidelines: z.array(z.string()).optional(),\n accessibility: z.array(z.string()).optional(),\n});\n\nexport const propTypeSchema: z.ZodType<string> = z.enum([\n 'string',\n 'number',\n 'boolean',\n 'enum',\n 'function',\n 'node',\n 'element',\n 'object',\n 'array',\n 'union',\n 'custom',\n]);\n\nexport const propDefinitionSchema = z.object({\n type: propTypeSchema,\n values: z.array(z.string()).readonly().optional(),\n default: z.unknown().optional(),\n description: z.string().optional(),\n required: z.boolean().optional(),\n constraints: z.array(z.string()).optional(),\n typeDetails: z.record(z.unknown()).optional(),\n});\n\nexport const relationshipTypeSchema = z.enum([\n 'alternative',\n 'sibling',\n 'parent',\n 'child',\n 'composition',\n 'complementary',\n 'used-by',\n]);\n\nexport const componentRelationSchema = z.object({\n component: z.string().min(1),\n relationship: relationshipTypeSchema,\n note: z.string().min(1),\n});\n\nexport const fragmentVariantSchema = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n render: z.function().returns(z.unknown()),\n code: z.string().optional(),\n figma: z.string().url().optional(),\n});\n\n/**\n * Schema for banned patterns in codebase\n */\nexport const fragmentBanSchema = z.object({\n pattern: z.string().min(1),\n message: z.string().min(1),\n});\n\n/**\n * Schema for agent-optimized contract metadata\n */\nexport const fragmentContractSchema = z.object({\n propsSummary: z.array(z.string()).optional(),\n a11yRules: z.array(z.string()).optional(),\n bans: z.array(fragmentBanSchema).optional(),\n scenarioTags: z.array(z.string()).optional(),\n performanceBudget: z.number().positive().optional(),\n compoundChildren: z.record(z.object({\n required: z.boolean().optional(),\n accepts: z.array(z.string()).optional(),\n description: z.string().optional(),\n })).optional(),\n canonicalUsage: z.array(z.string()).optional(),\n});\n\n/**\n * Schema for provenance tracking of generated fragments\n */\nexport const fragmentGeneratedSchema = z.object({\n source: z.enum(['storybook', 'manual', 'ai']),\n sourceFile: z.string().optional(),\n confidence: z.number().min(0).max(1).optional(),\n timestamp: z.string().datetime().optional(),\n});\n\n/**\n * Schema for AI-specific metadata for playground context generation\n */\nexport const aiMetadataSchema = z.object({\n compositionPattern: z.enum(['compound', 'simple', 'controlled', 'wrapper']).optional(),\n subComponents: z.array(z.string()).optional(),\n requiredChildren: z.array(z.string()).optional(),\n commonPatterns: z.array(z.string()).optional(),\n});\n\n/**\n * Schema for block definitions\n */\nexport const blockDefinitionSchema = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n category: z.string().min(1),\n components: z.array(z.string().min(1)).min(1),\n code: z.string().min(1),\n tags: z.array(z.string()).optional(),\n});\n\nexport const fragmentDefinitionSchema = z.object({\n component: z.any(), // Allow any component type (function, class, forwardRef, etc.)\n meta: fragmentMetaSchema,\n usage: fragmentUsageSchema,\n props: z.record(propDefinitionSchema),\n relations: z.array(componentRelationSchema).optional(),\n variants: z.array(fragmentVariantSchema), // Allow empty variants array\n contract: fragmentContractSchema.optional(),\n ai: aiMetadataSchema.optional(),\n _generated: fragmentGeneratedSchema.optional(),\n});\n\n/**\n * Config schema - validates required fields, passes through optional config objects.\n * Type definitions are in types.ts - schema just ensures basic structure.\n */\nexport const fragmentsConfigSchema = z.object({\n include: z.array(z.string()).min(1),\n exclude: z.array(z.string()).optional(),\n components: z.array(z.string()).optional(),\n outFile: z.string().optional(),\n framework: z.enum(['react', 'vue', 'svelte']).optional(),\n figmaFile: z.string().url().optional(),\n figmaToken: z.string().optional(),\n screenshots: z.object({}).passthrough().optional(),\n service: z.object({}).passthrough().optional(),\n registry: z.object({}).passthrough().optional(),\n tokens: z.object({\n include: z.array(z.string()).min(1),\n }).passthrough().optional(),\n snippets: z.object({\n mode: z.enum(['warn', 'error']).optional(),\n scope: z.enum(['snippet', 'snippet+render']).optional(),\n requireFullSnippet: z.boolean().optional(),\n allowedExternalModules: z.array(z.string().min(1)).optional(),\n }).optional(),\n performance: z.union([\n z.enum(['strict', 'standard', 'relaxed']),\n z.object({\n preset: z.enum(['strict', 'standard', 'relaxed']).optional(),\n budgets: z.object({\n bundleSize: z.number().positive().optional(),\n }).optional(),\n }),\n ]).optional(),\n storybook: z.object({\n exclude: z.array(z.string()).optional(),\n include: z.array(z.string()).optional(),\n excludeDeprecated: z.boolean().optional(),\n excludeTests: z.boolean().optional(),\n excludeSvgIcons: z.boolean().optional(),\n excludeSubComponents: z.boolean().optional(),\n }).optional(),\n govern: z.object({\n extends: z.array(z.string()).optional(),\n rules: z.record(z.string(), z.unknown()).optional(),\n agents: z.record(z.string(), z.object({\n rules: z.record(z.string(), z.unknown()).optional(),\n })).optional(),\n audit: z.object({}).passthrough().optional(),\n runners: z.record(z.string(), z.object({}).passthrough()).optional(),\n }).optional(),\n});\n\n// ---------------------------------------------------------------------------\n// v2 Schemas — alongside v1 (non-breaking)\n// ---------------------------------------------------------------------------\n\n/**\n * Schema for v2 composition metadata (promoted from ai)\n * Uses shorter field names since parent field is `composition`.\n */\nexport const compositionMetadataSchema = z.object({\n pattern: z.enum(['compound', 'simple', 'controlled', 'wrapper']).optional(),\n subComponents: z.array(z.string()).optional(),\n requiredChildren: z.array(z.string()).optional(),\n commonPatterns: z.array(z.string()).optional(),\n});\n\n/**\n * Schema for v2 extended provenance tracking\n */\nexport const fragmentProvenanceSchema = z.object({\n source: z.enum(['storybook', 'manual', 'ai', 'scan']),\n sourceFile: z.string().optional(),\n confidence: z.number().min(0).max(1).optional(),\n timestamp: z.string().datetime().optional(),\n autoFields: z.array(z.string()).optional(),\n humanFields: z.array(z.string()).optional(),\n});\n\n/**\n * Schema for v2 fragment definitions.\n * Accepts the v2 field names (guidance, examples, composition, _provenance).\n */\nexport const fragmentDefinitionV2Schema = z.object({\n component: z.any(),\n meta: fragmentMetaSchema,\n guidance: fragmentUsageSchema,\n props: z.record(propDefinitionSchema),\n relations: z.array(componentRelationSchema).optional(),\n examples: z.array(fragmentVariantSchema),\n composition: compositionMetadataSchema.optional(),\n contract: fragmentContractSchema.optional(),\n _provenance: fragmentProvenanceSchema.optional(),\n});\n\n/**\n * @deprecated Use blockDefinitionSchema instead\n */\nexport const recipeDefinitionSchema = blockDefinitionSchema;\n","import type {\n FragmentDefinition,\n FragmentDefinitionV2,\n CompiledFragment,\n FragmentComponent,\n BlockDefinition,\n CompiledBlock,\n AIMetadata,\n FragmentGenerated,\n} from './types.js';\nimport { fragmentDefinitionSchema, fragmentDefinitionV2Schema, blockDefinitionSchema } from './schema.js';\n\n/**\n * Check if a definition uses v2 field names.\n * Detects `guidance` or `examples` (v2) vs `usage` or `variants` (v1).\n */\nfunction isV2Definition<T>(\n def: FragmentDefinition<T> | FragmentDefinitionV2<T>\n): def is FragmentDefinitionV2<T> {\n return 'guidance' in def || 'examples' in def;\n}\n\n/**\n * Normalize a v2 definition to v1 shape for downstream compatibility.\n * The build pipeline, compiler, and validators all work with v1 internally.\n */\nexport function normalizeToV1<T>(def: FragmentDefinitionV2<T>): FragmentDefinition<T> {\n // Map composition → ai (rename fields)\n let ai: AIMetadata | undefined;\n if (def.composition) {\n ai = {\n compositionPattern: def.composition.pattern,\n subComponents: def.composition.subComponents,\n requiredChildren: def.composition.requiredChildren,\n commonPatterns: def.composition.commonPatterns,\n };\n }\n\n // Map _provenance → _generated (narrow source type, drop extended fields)\n let generated: FragmentGenerated | undefined;\n if (def._provenance) {\n generated = {\n source: def._provenance.source === 'scan' ? 'ai' : def._provenance.source,\n sourceFile: def._provenance.sourceFile,\n confidence: def._provenance.confidence,\n timestamp: def._provenance.timestamp,\n };\n }\n\n return {\n component: def.component,\n meta: def.meta,\n usage: def.guidance,\n props: def.props,\n relations: def.relations,\n variants: def.examples,\n contract: def.contract,\n ai,\n _generated: generated,\n };\n}\n\n/**\n * Define a fragment for a component.\n *\n * This is the main API for creating fragment documentation.\n * It provides runtime validation and type safety.\n *\n * Accepts both v1 and v2 shapes:\n * - v1: `{ usage, variants, ai, _generated }`\n * - v2: `{ guidance, examples, composition, _provenance }`\n *\n * @example v1\n * ```tsx\n * import { defineFragment } from '@fragments-sdk/core';\n * import { Button } from './Button';\n *\n * export default defineFragment({\n * component: Button,\n * meta: {\n * name: 'Button',\n * description: 'Primary action trigger',\n * category: 'actions',\n * },\n * usage: {\n * when: ['User needs to trigger an action'],\n * whenNot: ['Navigation without side effects'],\n * },\n * props: {\n * variant: {\n * type: 'enum',\n * values: ['primary', 'secondary'],\n * default: 'primary',\n * description: 'Visual style',\n * },\n * },\n * variants: [\n * {\n * name: 'Default',\n * description: 'Default button',\n * render: () => <Button>Click me</Button>,\n * },\n * ],\n * });\n * ```\n *\n * @example v2\n * ```tsx\n * import { defineFragment } from '@fragments-sdk/core';\n * import { Card } from './Card';\n *\n * export default defineFragment({\n * component: Card,\n * meta: { name: 'Card', description: 'Content container', category: 'layout' },\n * guidance: {\n * when: ['Grouping related content'],\n * whenNot: ['Full-page layouts'],\n * },\n * props: { ... },\n * examples: [{ name: 'Default', description: 'Basic card', render: () => <Card>...</Card> }],\n * composition: { pattern: 'compound', subComponents: ['Header', 'Body', 'Footer'] },\n * });\n * ```\n */\nexport function defineFragment<TProps>(\n definition: FragmentDefinition<TProps>\n): FragmentDefinition<TProps>;\nexport function defineFragment<TProps>(\n definition: FragmentDefinitionV2<TProps>\n): FragmentDefinitionV2<TProps>;\nexport function defineFragment<TProps>(\n definition: FragmentDefinition<TProps> | FragmentDefinitionV2<TProps>\n): FragmentDefinition<TProps> | FragmentDefinitionV2<TProps> {\n // Validate at runtime in development\n if (process.env.NODE_ENV !== 'production') {\n const v2 = isV2Definition(definition);\n const schema = v2 ? fragmentDefinitionV2Schema : fragmentDefinitionSchema;\n const result = schema.safeParse(definition);\n if (!result.success) {\n const name = definition.meta?.name || 'unknown';\n const errors = result.error.errors\n .map((e) => ` - ${e.path.join('.')}: ${e.message}`)\n .join('\\n');\n throw new Error(\n `Invalid fragment definition for \"${name}\":\\n${errors}`\n );\n }\n }\n\n return definition;\n}\n\n/**\n * Compile a fragment definition to JSON-serializable format.\n * Used for generating fragments.json for AI consumption.\n *\n * Accepts both v1 and v2 shapes. V2 is normalized to v1 internally.\n */\nexport function compileFragment(\n definition: FragmentDefinition | FragmentDefinitionV2,\n filePath: string\n): CompiledFragment {\n // Normalize v2 → v1 if needed\n const v1 = isV2Definition(definition)\n ? normalizeToV1(definition)\n : definition;\n\n return {\n filePath,\n meta: v1.meta,\n usage: v1.usage,\n props: v1.props,\n relations: v1.relations,\n variants: v1.variants.map((v) => ({\n name: v.name,\n description: v.description,\n code: v.code,\n figma: v.figma,\n })),\n contract: v1.contract,\n ai: v1.ai,\n _generated: v1._generated,\n };\n}\n\n/**\n * Define a composition block.\n *\n * Blocks are pure data describing how design system components\n * wire together for common use cases.\n */\nexport function defineBlock(definition: BlockDefinition): BlockDefinition {\n if (process.env.NODE_ENV !== 'production') {\n const result = blockDefinitionSchema.safeParse(definition);\n if (!result.success) {\n const errors = result.error.errors\n .map((e) => ` - ${e.path.join('.')}: ${e.message}`)\n .join('\\n');\n throw new Error(\n `Invalid block definition for \"${definition.name || 'unknown'}\":\\n${errors}`\n );\n }\n }\n\n return definition;\n}\n\n/**\n * @deprecated Use defineBlock instead\n */\nexport const defineRecipe = defineBlock;\n\n/**\n * Compile a block definition to JSON-serializable format.\n */\nexport function compileBlock(\n definition: BlockDefinition,\n filePath: string\n): CompiledBlock {\n return {\n filePath,\n name: definition.name,\n description: definition.description,\n category: definition.category,\n components: definition.components,\n code: definition.code,\n tags: definition.tags,\n };\n}\n\n/**\n * @deprecated Use compileBlock instead\n */\nexport const compileRecipe = compileBlock;\n\n/**\n * Type helper for extracting props type from a component\n */\nexport type InferProps<T> = T extends FragmentComponent<infer P> ? P : never;\n","/**\n * Runtime adapter for converting Storybook CSF modules to Fragment definitions.\n *\n * This operates on IMPORTED modules at runtime, not source code parsing.\n * By leveraging Vite's module system, we get 100% accurate render functions\n * without any regex or AST parsing complexity.\n *\n * Supports Storybook 8.x with both CSF2 (Template.bind) and CSF3 (object stories).\n */\n\nimport { createElement, type ComponentType, type ReactNode } from \"react\";\nimport { toId, storyNameFromExport, isExportStory } from \"./storybook-csf.js\";\nimport type {\n FragmentDefinition,\n FragmentMeta,\n FragmentUsage,\n PropDefinition,\n FragmentVariant,\n ControlType,\n VariantLoader,\n PlayFunction,\n PlayFunctionContext,\n VariantRenderOptions,\n} from \"./types.js\";\n\n// Re-export @storybook/csf utilities for use in other modules\nexport { toId, storyNameFromExport, isExportStory };\n\n/**\n * Storybook decorator function signature\n */\nexport type Decorator = (\n Story: () => ReactNode,\n context: StoryContext\n) => ReactNode;\n\n/**\n * Storybook loader function signature\n */\nexport type Loader = (context: StoryContext) => Promise<Record<string, unknown>>;\n\n/**\n * Storybook play function signature (internal, extends StoryContext)\n */\ntype StorybookPlayFunction = (context: StorybookPlayFunctionContext) => Promise<void>;\n\n/**\n * Context passed to Storybook play functions (extends StoryContext for compatibility)\n */\ninterface StorybookPlayFunctionContext extends StoryContext {\n canvasElement: HTMLElement;\n step: (name: string, fn: () => Promise<void>) => Promise<void>;\n}\n\n/**\n * Context passed to decorators and render functions\n */\nexport interface StoryContext {\n args: Record<string, unknown>;\n argTypes: Record<string, StoryArgType>;\n globals: Record<string, unknown>;\n parameters: Record<string, unknown>;\n id: string;\n kind: string;\n name: string;\n story: string;\n viewMode: \"story\" | \"docs\";\n loaded: Record<string, unknown>;\n abortSignal: AbortSignal;\n componentId: string;\n title: string;\n}\n\n/**\n * Storybook Meta (default export)\n */\nexport interface StoryMeta {\n title?: string;\n component?: ComponentType<unknown>;\n subcomponents?: Record<string, ComponentType<unknown>>;\n tags?: string[];\n parameters?: Record<string, unknown> & {\n docs?: {\n description?: {\n component?: string;\n };\n };\n };\n argTypes?: Record<string, StoryArgType>;\n args?: Record<string, unknown>;\n decorators?: Decorator[];\n loaders?: Loader[];\n render?: (args: Record<string, unknown>, context?: StoryContext) => ReactNode;\n // Story filtering\n includeStories?: string[] | RegExp;\n excludeStories?: string[] | RegExp;\n}\n\n/**\n * Storybook argType definition\n */\nexport interface StoryArgType {\n control?:\n | string\n | false\n | { type: string; min?: number; max?: number; step?: number; presetColors?: string[] };\n options?: string[];\n description?: string;\n table?: {\n defaultValue?: { summary: string };\n type?: { summary: string };\n category?: string;\n subcategory?: string;\n disable?: boolean;\n };\n type?: { name: string; required?: boolean };\n name?: string;\n defaultValue?: unknown;\n if?: { arg?: string; exists?: boolean };\n mapping?: Record<string, unknown>;\n action?: string;\n}\n\n/**\n * Storybook Story export (CSF3)\n */\nexport interface Story {\n args?: Record<string, unknown>;\n argTypes?: Record<string, StoryArgType>;\n render?: (args: Record<string, unknown>, context?: StoryContext) => ReactNode;\n decorators?: Decorator[];\n loaders?: Loader[];\n play?: StorybookPlayFunction;\n parameters?: Record<string, unknown> & {\n docs?: {\n description?: {\n story?: string;\n };\n };\n };\n name?: string;\n storyName?: string; // Legacy CSF2\n tags?: string[];\n}\n\n/**\n * CSF2 story function (from Template.bind({})) with args attached\n */\nexport type CSF2Story = ((args: Record<string, unknown>) => ReactNode) & {\n args?: Record<string, unknown>;\n argTypes?: Record<string, StoryArgType>;\n decorators?: Decorator[];\n loaders?: Loader[];\n play?: StorybookPlayFunction;\n parameters?: Record<string, unknown>;\n storyName?: string;\n};\n\n/**\n * A complete Storybook module with default meta and named story exports\n */\nexport interface StoryModule {\n default: StoryMeta;\n [exportName: string]: Story | CSF2Story | StoryMeta | unknown;\n}\n\n/**\n * Global configuration from preview.tsx\n */\nexport interface PreviewConfig {\n decorators?: Decorator[];\n parameters?: Record<string, unknown>;\n globalTypes?: Record<string, unknown>;\n args?: Record<string, unknown>;\n argTypes?: Record<string, StoryArgType>;\n loaders?: Loader[];\n}\n\n// Store for global preview config (set by previewLoader)\nlet globalPreviewConfig: PreviewConfig = {};\n\n/**\n * Set the global preview configuration loaded from .storybook/preview.tsx\n */\nexport function setPreviewConfig(config: PreviewConfig): void {\n globalPreviewConfig = config;\n}\n\n/**\n * Get the current global preview configuration\n */\nexport function getPreviewConfig(): PreviewConfig {\n return globalPreviewConfig;\n}\n\n/**\n * Convert a Storybook module to a Fragment definition at runtime.\n *\n * @param storyModule - The imported Storybook module\n * @param filePath - File path for metadata extraction\n * @returns A complete FragmentDefinition ready for the viewer\n */\nexport function storyModuleToFragment(\n storyModule: StoryModule,\n filePath: string\n): FragmentDefinition | null {\n const meta = storyModule.default;\n const component = meta.component;\n\n // Stories without a component (e.g., documentation pages, icon galleries) are skipped\n if (!component) {\n return null;\n }\n\n const componentName = extractComponentName(meta, filePath);\n const category = extractCategory(meta.title);\n const props = convertArgTypes(meta.argTypes ?? {}, globalPreviewConfig.argTypes);\n const variants = extractVariants(storyModule, component, meta);\n\n // Extract Figma URL from parameters.design.url (storybook-addon-designs) or parameters.figma\n const figmaUrl = extractFigmaUrl(meta.parameters);\n\n const fragmentMeta: FragmentMeta = {\n name: componentName,\n description:\n meta.parameters?.docs?.description?.component ??\n `${componentName} component`,\n category,\n tags: meta.tags?.filter((t) => t !== \"autodocs\"),\n status: \"stable\",\n figma: figmaUrl,\n };\n\n const usage: FragmentUsage = {\n when: [`Use ${componentName} for its intended purpose`],\n whenNot: [\"When a more specific component is available\"],\n };\n\n return {\n component,\n meta: fragmentMeta,\n usage,\n props,\n variants,\n };\n}\n\n/**\n * Extract component name from meta or file path\n */\nfunction extractComponentName(meta: StoryMeta, filePath: string): string {\n // Try title (last fragment of path like \"Components/Forms/Button\" -> \"Button\")\n if (meta.title) {\n const parts = meta.title.split(\"/\");\n return parts[parts.length - 1];\n }\n\n // Try component displayName\n if (meta.component?.displayName) {\n return meta.component.displayName;\n }\n\n // Try component name\n if (meta.component?.name && meta.component.name !== \"Component\") {\n return meta.component.name;\n }\n\n // Fallback: extract from file path\n const match = filePath.match(/([^/\\\\]+)\\.stories\\.(tsx?|jsx?)$/);\n return match?.[1] ?? \"Unknown\";\n}\n\n/**\n * Extract category from Storybook title path\n */\nfunction extractCategory(title?: string): string {\n if (!title) return \"general\";\n\n const parts = title.split(\"/\");\n // \"Components/Forms/Button\" -> \"forms\" (need at least 3 parts for a subcategory)\n if (parts.length >= 3) {\n return parts[parts.length - 2].toLowerCase();\n }\n // \"Components/Button\" -> \"general\" (no subcategory specified)\n return \"general\";\n}\n\n/**\n * Extract Figma URL from Storybook parameters\n * Supports storybook-addon-designs format and custom figma parameter\n */\nfunction extractFigmaUrl(parameters?: Record<string, unknown>): string | undefined {\n if (!parameters) return undefined;\n\n // Try storybook-addon-designs format: parameters.design.url\n const design = parameters.design as { url?: string; type?: string } | undefined;\n if (design?.url && typeof design.url === \"string\") {\n return design.url;\n }\n\n // Try custom figma parameter: parameters.figma\n if (typeof parameters.figma === \"string\") {\n return parameters.figma;\n }\n\n return undefined;\n}\n\n/**\n * Convert Storybook argTypes to Fragment props\n * Merges global argTypes from preview config with meta argTypes\n */\nfunction convertArgTypes(\n argTypes: Record<string, StoryArgType>,\n globalArgTypes?: Record<string, StoryArgType>\n): Record<string, PropDefinition> {\n const props: Record<string, PropDefinition> = {};\n\n // Merge global and meta argTypes (meta takes precedence)\n const mergedArgTypes = { ...globalArgTypes, ...argTypes };\n\n for (const [name, argType] of Object.entries(mergedArgTypes)) {\n // Skip disabled argTypes\n if (argType.table?.disable) continue;\n // Skip action-only argTypes (no control)\n if (argType.control === false && argType.action) continue;\n\n // Extract control type and options\n const { controlType, controlOptions } = extractControlInfo(argType);\n\n props[name] = {\n type: inferPropType(argType),\n description: argType.description ?? `${name} prop`,\n ...(argType.options && { values: argType.options }),\n ...(argType.table?.defaultValue && {\n default: argType.table.defaultValue.summary,\n }),\n ...(argType.defaultValue !== undefined && {\n default: argType.defaultValue,\n }),\n ...(argType.type?.required && { required: true }),\n ...(controlType && { controlType }),\n ...(controlOptions && Object.keys(controlOptions).length > 0 && { controlOptions }),\n };\n }\n\n return props;\n}\n\n/**\n * Extract control type and options from a Storybook argType\n */\nfunction extractControlInfo(argType: StoryArgType): {\n controlType?: ControlType;\n controlOptions?: PropDefinition[\"controlOptions\"];\n} {\n // Handle no control or explicitly disabled control\n if (argType.control === undefined || argType.control === false) {\n return {};\n }\n\n const control = typeof argType.control === \"string\"\n ? { type: argType.control }\n : argType.control;\n\n // Map control type string to ControlType\n const validControlTypes: ControlType[] = [\n \"text\", \"number\", \"range\", \"boolean\", \"select\", \"multi-select\",\n \"radio\", \"inline-radio\", \"check\", \"inline-check\", \"object\", \"file\", \"color\", \"date\"\n ];\n\n const controlType = validControlTypes.includes(control.type as ControlType)\n ? (control.type as ControlType)\n : undefined;\n\n // Extract control options for controls that need them\n const controlOptions: PropDefinition[\"controlOptions\"] = {};\n\n if (control.min !== undefined) controlOptions.min = control.min;\n if (control.max !== undefined) controlOptions.max = control.max;\n if (control.step !== undefined) controlOptions.step = control.step;\n if (control.presetColors) controlOptions.presetColors = control.presetColors;\n\n return {\n controlType,\n controlOptions: Object.keys(controlOptions).length > 0 ? controlOptions : undefined,\n };\n}\n\n/**\n * Infer prop type from Storybook control/type\n * Handles all Storybook 8.x control types\n */\nfunction inferPropType(argType: StoryArgType): PropDefinition[\"type\"] {\n // Action argType → function\n if (argType.action) return \"function\";\n\n // If has options, it's an enum\n if (argType.options?.length) return \"enum\";\n\n // Check explicit type\n if (argType.type?.name) {\n const typeMap: Record<string, PropDefinition[\"type\"]> = {\n string: \"string\",\n number: \"number\",\n boolean: \"boolean\",\n object: \"object\",\n array: \"array\",\n function: \"function\",\n };\n const mapped = typeMap[argType.type.name];\n if (mapped) return mapped;\n }\n\n // Check control type\n const control =\n typeof argType.control === \"string\"\n ? argType.control\n : argType.control\n ? argType.control.type\n : undefined;\n\n if (control) {\n const controlMap: Record<string, PropDefinition[\"type\"]> = {\n // Text controls\n text: \"string\",\n\n // Number controls\n number: \"number\",\n range: \"number\",\n\n // Boolean controls\n boolean: \"boolean\",\n check: \"boolean\",\n \"inline-check\": \"boolean\",\n\n // Enum/selection controls\n select: \"enum\",\n \"multi-select\": \"enum\",\n radio: \"enum\",\n \"inline-radio\": \"enum\",\n\n // Object controls\n object: \"object\",\n file: \"object\",\n\n // Special string controls\n color: \"string\",\n date: \"string\",\n };\n const mapped = controlMap[control];\n if (mapped) return mapped;\n }\n\n return \"string\";\n}\n\n/**\n * Check if a value looks like a Storybook story\n * Handles both CSF 3 (objects) and CSF 2 (functions from Template.bind({}))\n */\nfunction isStory(value: unknown): value is Story | CSF2Story {\n // CSF 3: Story is an object with args/render/play\n if (typeof value === \"object\" && value !== null) {\n const obj = value as Record<string, unknown>;\n if (\"args\" in obj || \"render\" in obj || \"play\" in obj) return true;\n }\n\n // CSF 2: Story is a function (from Template.bind({})) with args attached\n if (typeof value === \"function\") {\n const fn = value as ((...args: unknown[]) => unknown) & { args?: unknown };\n if (\"args\" in fn) return true;\n }\n\n return false;\n}\n\n/**\n * Extract variants from story exports using @storybook/csf utilities\n */\nfunction extractVariants(\n storyModule: StoryModule,\n component: ComponentType<unknown>,\n meta: StoryMeta\n): FragmentVariant[] {\n const variants: FragmentVariant[] = [];\n\n for (const [exportName, exportValue] of Object.entries(storyModule)) {\n // Skip default export\n if (exportName === \"default\") continue;\n\n // Use isExportStory to filter based on includeStories/excludeStories\n if (!isExportStory(exportName, meta)) continue;\n\n // Check if it's a story\n if (!isStory(exportValue)) continue;\n\n const story = exportValue as Story | CSF2Story;\n\n // Get story name using storyNameFromExport\n const storyName =\n (typeof story === \"object\" && story.name) ||\n (typeof story === \"object\" && story.storyName) ||\n (typeof story === \"function\" && story.storyName) ||\n storyNameFromExport(exportName);\n\n // Generate story ID matching Storybook format\n const storyId = toId(meta.title || \"Unknown\", exportName);\n\n // Extract description based on story format\n let description = `${storyName} variant`;\n if (typeof story === \"object\" && story.parameters?.docs?.description?.story) {\n description = story.parameters.docs.description.story;\n }\n\n // Check for play function and capture it\n const storyPlayFn = typeof story === \"object\" ? story.play : story.play;\n const hasPlayFunction = !!storyPlayFn;\n\n // Create wrapped play function that adapts Storybook context to our PlayFunctionContext\n const wrappedPlay: PlayFunction | undefined = storyPlayFn\n ? async (context: PlayFunctionContext): Promise<void> => {\n // Build full Storybook context for compatibility\n const args = {\n ...globalPreviewConfig.args,\n ...meta.args,\n ...(typeof story === \"function\" ? story.args : story.args),\n };\n const fullContext = buildStoryContext(meta, story, args, storyId, storyName);\n\n // Merge our context with Storybook context\n const playContext = {\n ...fullContext,\n canvasElement: context.canvasElement,\n args: context.args,\n step: context.step,\n };\n\n await storyPlayFn(playContext as unknown as StorybookPlayFunctionContext);\n }\n : undefined;\n\n // Get story tags\n const storyTags = typeof story === \"object\" ? story.tags : undefined;\n\n // Collect loaders from global, meta, and story (in order)\n const loaders = collectLoaders(meta, story);\n\n // Compute the merged args for this variant (for code generation)\n const variantArgs = {\n ...globalPreviewConfig.args,\n ...meta.args,\n ...(typeof story === \"function\" ? story.args : story.args),\n };\n\n // Only include args if there are any defined\n const hasArgs = Object.keys(variantArgs).length > 0;\n\n variants.push({\n name: storyName,\n description,\n render: createRenderFunction(story, component, meta, storyId, storyName),\n // Store Storybook-specific metadata\n ...(hasPlayFunction && { hasPlayFunction: true }),\n ...(wrappedPlay && { play: wrappedPlay }),\n ...(storyId && { storyId }),\n ...(storyTags && { tags: storyTags }),\n ...(loaders.length > 0 && { loaders }),\n ...(hasArgs && { args: variantArgs }),\n });\n }\n\n return variants;\n}\n\n/**\n * Collect loaders from global, meta, and story levels\n * Returns wrapped loader functions that execute with context\n */\nfunction collectLoaders(\n meta: StoryMeta,\n story: Story | CSF2Story\n): VariantLoader[] {\n const allLoaders: Loader[] = [\n ...(globalPreviewConfig.loaders ?? []),\n ...(meta.loaders ?? []),\n ...(typeof story === \"function\" ? story.loaders ?? [] : story.loaders ?? []),\n ];\n\n if (allLoaders.length === 0) {\n return [];\n }\n\n // Wrap each loader to execute without requiring context at call time\n // The actual context will be built when the loader is executed\n return allLoaders.map((loader) => {\n return async (): Promise<Record<string, unknown>> => {\n // Create a minimal context for loader execution\n const minimalContext: StoryContext = {\n args: {},\n argTypes: {},\n globals: {},\n parameters: {},\n id: \"\",\n kind: meta.title || \"Unknown\",\n name: \"\",\n story: \"\",\n viewMode: \"story\",\n loaded: {},\n abortSignal: new AbortController().signal,\n componentId: \"\",\n title: meta.title || \"Unknown\",\n };\n return loader(minimalContext);\n };\n });\n}\n\n/**\n * Build a StoryContext for decorators and render functions\n */\nfunction buildStoryContext(\n meta: StoryMeta,\n story: Story | CSF2Story,\n args: Record<string, unknown>,\n storyId: string,\n storyName: string,\n loadedData?: Record<string, unknown>\n): StoryContext {\n const mergedArgs = {\n ...globalPreviewConfig.args,\n ...meta.args,\n ...(typeof story === \"object\" ? story.args : story.args),\n ...args,\n };\n\n const mergedArgTypes = {\n ...globalPreviewConfig.argTypes,\n ...meta.argTypes,\n ...(typeof story === \"object\" ? story.argTypes : story.argTypes),\n };\n\n const mergedParameters = {\n ...globalPreviewConfig.parameters,\n ...meta.parameters,\n ...(typeof story === \"object\" ? story.parameters : story.parameters),\n };\n\n return {\n args: mergedArgs,\n argTypes: mergedArgTypes ?? {},\n globals: {},\n parameters: mergedParameters ?? {},\n id: storyId,\n kind: meta.title || \"Unknown\",\n name: storyName,\n story: storyName,\n viewMode: \"story\",\n loaded: loadedData ?? {},\n abortSignal: new AbortController().signal,\n componentId: toId(meta.title || \"Unknown\", \"\"),\n title: meta.title || \"Unknown\",\n };\n}\n\n/**\n * Create a render function for a story\n * Handles both CSF 3 (objects) and CSF 2 (functions)\n * Applies decorators in correct order: story → meta → global (innermost first)\n * Accepts optional args overrides and loaded data from loaders\n */\nfunction createRenderFunction(\n story: Story | CSF2Story,\n component: ComponentType<unknown>,\n meta: StoryMeta,\n storyId: string,\n storyName: string\n): (options?: VariantRenderOptions) => ReactNode {\n return (options?: VariantRenderOptions) => {\n // Merge args: global → meta → story → runtime overrides\n const args = {\n ...globalPreviewConfig.args,\n ...meta.args,\n ...(typeof story === \"function\" ? story.args : story.args),\n ...options?.args, // Runtime overrides from viewer props panel\n };\n\n const loadedData = options?.loadedData;\n\n // Build the story context with loaded data\n const context = buildStoryContext(meta, story, args, storyId, storyName, loadedData);\n\n // Create the base render function\n let renderFn: () => ReactNode;\n\n if (typeof story === \"function\") {\n // CSF 2: Story is a function (from Template.bind({}))\n renderFn = () => story(args);\n } else if (story.render) {\n // CSF 3: Story has custom render function\n // Support both render(args) and render(args, context) signatures\n renderFn = () =>\n story.render!.length >= 2\n ? story.render!(args, context)\n : story.render!(args);\n } else if (meta.render) {\n // CSF 3: Meta has default render function\n renderFn = () =>\n meta.render!.length >= 2\n ? meta.render!(args, context)\n : meta.render!(args);\n } else {\n // Default: render component with args\n renderFn = () => createElement(component, args);\n }\n\n // Collect decorators in Storybook order\n // story → meta → global, then reverse to apply innermost first\n const allDecorators = [\n ...(globalPreviewConfig.decorators ?? []),\n ...(meta.decorators ?? []),\n ...(typeof story === \"function\" ? story.decorators ?? [] : story.decorators ?? []),\n ].reverse();\n\n // Apply decorators if any\n if (allDecorators.length > 0) {\n return applyDecorators(renderFn, allDecorators, context);\n }\n\n return renderFn();\n };\n}\n\n/**\n * Apply decorators in the correct order\n * Decorators wrap from innermost to outermost\n */\nfunction applyDecorators(\n renderFn: () => ReactNode,\n decorators: Decorator[],\n context: StoryContext\n): ReactNode {\n // Start with the base render function\n let storyFn: () => ReactNode = renderFn;\n\n // Each decorator wraps the previous one\n for (const decorator of decorators) {\n const wrappedFn = storyFn;\n storyFn = () => decorator(wrappedFn, context);\n }\n\n return storyFn();\n}\n\n/**\n * Convert PascalCase to Title Case\n * @deprecated Use storyNameFromExport from @storybook/csf instead\n */\nfunction pascalToTitle(name: string): string {\n return name.replace(/([A-Z])/g, \" $1\").trim();\n}\n","import {\n toId as storybookToId,\n storyNameFromExport as storybookStoryNameFromExport,\n isExportStory as storybookIsExportStory,\n} from \"@storybook/csf\";\n\nexport const toId: typeof storybookToId = (...args) => storybookToId(...args);\nexport const storyNameFromExport: typeof storybookStoryNameFromExport = (...args) =>\n storybookStoryNameFromExport(...args);\nexport const isExportStory: typeof storybookIsExportStory = (...args) =>\n storybookIsExportStory(...args);\n","/**\n * Smart filtering for Storybook adapter.\n *\n * Two layers:\n * 1. Per-file heuristics — checkStoryExclusion() checks title, tags, component name, etc.\n * 2. Cross-file sub-component detection — detectSubComponentPaths() uses directory structure.\n *\n * All functions are pure (no I/O, no side effects) for easy testing.\n */\n\nimport type { StorybookFilterConfig } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ExclusionReason =\n | 'deprecated' // title contains \"Deprecated\"\n | 'test-story' // title ends /tests? OR file matches *.test.stories.*\n | 'svg-icon' // component name starts with Svg[A-Z]\n | 'tag-excluded' // meta.tags includes hidden/internal/no-fragment\n | 'empty-variants' // zero renderable story exports\n | 'sub-component' // directory-based: file in another component's folder\n | 'config-excluded'; // user explicit exclude pattern\n\nexport interface ExclusionResult {\n excluded: boolean;\n reason?: ExclusionReason;\n detail?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Per-file heuristics\n// ---------------------------------------------------------------------------\n\nconst EXCLUDED_TAGS = new Set(['hidden', 'internal', 'no-fragment']);\n\nconst SVG_ICON_RE = /^Svg[A-Z]/;\nconst TEST_TITLE_RE = /\\/tests?$/i;\nconst TEST_FILE_RE = /\\.test\\.stories\\./;\nconst DEPRECATED_TITLE_RE = /\\bDeprecated\\b/i;\n\nexport interface CheckStoryExclusionOpts {\n storybookTitle?: string;\n componentName: string;\n componentDisplayName?: string;\n componentFunctionName?: string;\n tags?: string[];\n variantCount: number;\n filePath: string;\n config: StorybookFilterConfig;\n}\n\n/**\n * Per-file exclusion check. Returns `{ excluded: true, reason, detail }` when\n * the fragment should be filtered out, or `{ excluded: false }` when it should\n * be kept.\n *\n * Config `include` trumps everything — if a name matches `include`, it is\n * never excluded by heuristics.\n */\nexport function checkStoryExclusion(opts: CheckStoryExclusionOpts): ExclusionResult {\n const { config } = opts;\n\n // Force-included names bypass all heuristic filters\n if (isForceIncluded(opts.componentName, config)) {\n return { excluded: false };\n }\n\n // Config explicit exclude\n if (isConfigExcluded(opts.componentName, config)) {\n return {\n excluded: true,\n reason: 'config-excluded',\n detail: `'${opts.componentName}' matches storybook.exclude pattern`,\n };\n }\n\n // Deprecated\n if (config.excludeDeprecated !== false && opts.storybookTitle && DEPRECATED_TITLE_RE.test(opts.storybookTitle)) {\n return {\n excluded: true,\n reason: 'deprecated',\n detail: `Title \"${opts.storybookTitle}\" contains \"Deprecated\"`,\n };\n }\n\n // Test stories\n if (config.excludeTests !== false) {\n if (opts.storybookTitle && TEST_TITLE_RE.test(opts.storybookTitle)) {\n return {\n excluded: true,\n reason: 'test-story',\n detail: `Title \"${opts.storybookTitle}\" ends with /test(s)`,\n };\n }\n if (TEST_FILE_RE.test(opts.filePath)) {\n return {\n excluded: true,\n reason: 'test-story',\n detail: `File path matches *.test.stories.*`,\n };\n }\n }\n\n // SVG icons\n if (config.excludeSvgIcons !== false) {\n const names = [opts.componentName, opts.componentDisplayName, opts.componentFunctionName].filter(Boolean) as string[];\n for (const name of names) {\n if (SVG_ICON_RE.test(name)) {\n return {\n excluded: true,\n reason: 'svg-icon',\n detail: `Component name \"${name}\" matches Svg[A-Z] pattern`,\n };\n }\n }\n }\n\n // Excluded tags\n if (opts.tags?.length) {\n const hit = opts.tags.find(t => EXCLUDED_TAGS.has(t));\n if (hit) {\n return {\n excluded: true,\n reason: 'tag-excluded',\n detail: `Tag \"${hit}\" is in the exclusion set`,\n };\n }\n }\n\n // Empty variants\n if (opts.variantCount === 0) {\n return {\n excluded: true,\n reason: 'empty-variants',\n detail: 'Zero renderable story exports',\n };\n }\n\n return { excluded: false };\n}\n\n// ---------------------------------------------------------------------------\n// Cross-file sub-component detection\n// ---------------------------------------------------------------------------\n\n/**\n * Given all story file relative paths, detect which ones are sub-components\n * based on directory structure.\n *\n * Heuristic: within a directory, if one story file's base name matches the\n * directory name, it is the \"primary\" component. All other story files in\n * the same directory are considered sub-components.\n *\n * Example:\n * src/components/Form/Form.stories.tsx → primary (\"Form\")\n * src/components/Form/Checkbox.stories.tsx → sub-component of \"Form\"\n * src/components/Form/RadioGroup.stories.tsx → sub-component of \"Form\"\n *\n * Returns a Map from relative path → parent component name.\n * Paths NOT in the map are standalone components.\n */\nexport function detectSubComponentPaths(\n storyFiles: Array<{ relativePath: string }>\n): Map<string, string> {\n // Group story files by their parent directory\n const byDir = new Map<string, Array<{ relativePath: string; baseName: string }>>();\n\n for (const file of storyFiles) {\n const parts = file.relativePath.split('/');\n if (parts.length < 2) continue; // skip root-level files\n\n const fileName = parts[parts.length - 1];\n // Extract base name: \"Form.stories.tsx\" → \"Form\"\n const baseMatch = fileName.match(/^([^.]+)\\.stories\\./);\n if (!baseMatch) continue;\n\n const dir = parts.slice(0, -1).join('/');\n const baseName = baseMatch[1];\n\n if (!byDir.has(dir)) byDir.set(dir, []);\n byDir.get(dir)!.push({ relativePath: file.relativePath, baseName });\n }\n\n const subComponentMap = new Map<string, string>();\n\n for (const [dir, files] of byDir) {\n if (files.length <= 1) continue; // single file in dir → always standalone\n\n // Directory name is the last segment: \"src/components/Form\" → \"Form\"\n const dirName = dir.split('/').pop()!;\n\n // Find the primary: story whose base name matches the directory name\n const primary = files.find(f => f.baseName === dirName);\n if (!primary) continue; // no clear primary → keep all\n\n // All others in this dir are sub-components\n for (const file of files) {\n if (file.relativePath === primary.relativePath) continue;\n subComponentMap.set(file.relativePath, primary.baseName);\n }\n }\n\n return subComponentMap;\n}\n\n// ---------------------------------------------------------------------------\n// Config helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Check if a component name matches the `storybook.include` patterns.\n * Include is a force-include that bypasses all heuristic filters.\n */\nexport function isForceIncluded(name: string, config: StorybookFilterConfig): boolean {\n if (!config.include?.length) return false;\n return config.include.some(pattern => matchesPattern(name, pattern));\n}\n\n/**\n * Check if a component name matches the `storybook.exclude` patterns.\n */\nexport function isConfigExcluded(name: string, config: StorybookFilterConfig): boolean {\n if (!config.exclude?.length) return false;\n return config.exclude.some(pattern => matchesPattern(name, pattern));\n}\n\n/**\n * Simple pattern matching: exact match or glob-style prefix/suffix wildcards.\n * \"Button\" → exact match\n * \"Svg*\" → prefix match\n * \"*Icon\" → suffix match\n * \"*Badge*\" → contains match\n */\nfunction matchesPattern(name: string, pattern: string): boolean {\n if (!pattern.includes('*')) {\n return name === pattern;\n }\n\n const parts = pattern.split('*');\n if (parts.length === 2) {\n const [prefix, suffix] = parts;\n if (prefix && suffix) return name.startsWith(prefix) && name.endsWith(suffix);\n if (prefix) return name.startsWith(prefix);\n if (suffix) return name.endsWith(suffix);\n return true; // pattern is just \"*\"\n }\n\n // Multi-wildcard: convert to regex\n const escaped = parts.map(p => p.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('.*');\n return new RegExp(`^${escaped}$`).test(name);\n}\n","export { generateContext, filterPlaceholders, PLACEHOLDER_PATTERNS } from '@fragments-sdk/context/generate';\nexport type { ContextOptions, ContextResult } from '@fragments-sdk/context/generate';\n","/**\n * Figma property mapping DSL\n *\n * Provides helpers for mapping Figma component properties to code props.\n * Inspired by Figma Code Connect's API.\n *\n * @example\n * ```tsx\n * import { defineFragment, figma } from '@fragments-sdk/cli/core';\n *\n * export default defineFragment({\n * component: Button,\n * meta: {\n * name: 'Button',\n * description: 'Primary action trigger',\n * category: 'actions',\n * figma: 'https://figma.com/file/abc/Design?node-id=1-2',\n * figmaProps: {\n * children: figma.string('Label'),\n * disabled: figma.boolean('Disabled'),\n * variant: figma.enum('Type', {\n * 'Primary': 'primary',\n * 'Secondary': 'secondary',\n * }),\n * },\n * },\n * // ...\n * });\n * ```\n */\n\nimport type {\n FigmaStringMapping,\n FigmaBooleanMapping,\n FigmaEnumMapping,\n FigmaInstanceMapping,\n FigmaChildrenMapping,\n FigmaTextContentMapping,\n} from './types.js';\n\n/**\n * Map a Figma text property to a string prop.\n *\n * @param figmaProperty - The name of the text property in Figma\n * @returns A string mapping descriptor\n *\n * @example\n * ```tsx\n * figmaProps: {\n * label: figma.string('Button Text'),\n * placeholder: figma.string('Placeholder'),\n * }\n * ```\n */\nfunction string(figmaProperty: string): FigmaStringMapping {\n return {\n __type: 'figma-string',\n figmaProperty,\n };\n}\n\n/**\n * Map a Figma boolean property to a boolean prop.\n * Optionally map true/false to different values.\n *\n * @param figmaProperty - The name of the boolean property in Figma\n * @param valueMapping - Optional mapping of true/false to other values\n * @returns A boolean mapping descriptor\n *\n * @example\n * ```tsx\n * figmaProps: {\n * disabled: figma.boolean('Disabled'),\n * // Map boolean to string values\n * size: figma.boolean('Large', { true: 'lg', false: 'md' }),\n * }\n * ```\n */\nfunction boolean(\n figmaProperty: string,\n valueMapping?: { true: unknown; false: unknown }\n): FigmaBooleanMapping {\n return {\n __type: 'figma-boolean',\n figmaProperty,\n valueMapping,\n };\n}\n\n/**\n * Map a Figma variant property to an enum prop.\n *\n * @param figmaProperty - The name of the variant property in Figma\n * @param valueMapping - Mapping of Figma values to code values\n * @returns An enum mapping descriptor\n *\n * @example\n * ```tsx\n * figmaProps: {\n * variant: figma.enum('Type', {\n * 'Primary': 'primary',\n * 'Secondary': 'secondary',\n * 'Outline': 'outline',\n * }),\n * size: figma.enum('Size', {\n * 'Small': 'sm',\n * 'Medium': 'md',\n * 'Large': 'lg',\n * }),\n * }\n * ```\n */\nfunction enumValue<T extends Record<string, unknown>>(\n figmaProperty: string,\n valueMapping: T\n): FigmaEnumMapping {\n return {\n __type: 'figma-enum',\n figmaProperty,\n valueMapping,\n };\n}\n\n/**\n * Reference a nested Figma component instance.\n * Use this when a prop accepts a component that's represented\n * as an instance swap in Figma.\n *\n * @param figmaProperty - The name of the instance property in Figma\n * @returns An instance mapping descriptor\n *\n * @example\n * ```tsx\n * figmaProps: {\n * icon: figma.instance('Icon'),\n * avatar: figma.instance('Avatar'),\n * }\n * ```\n */\nfunction instance(figmaProperty: string): FigmaInstanceMapping {\n return {\n __type: 'figma-instance',\n figmaProperty,\n };\n}\n\n/**\n * Render children from specific Figma layers.\n * Use this when children are represented as named layers in Figma.\n *\n * @param layers - Array of layer names to include as children\n * @returns A children mapping descriptor\n *\n * @example\n * ```tsx\n * figmaProps: {\n * children: figma.children(['Title', 'Description', 'Actions']),\n * }\n * ```\n */\nfunction children(layers: string[]): FigmaChildrenMapping {\n return {\n __type: 'figma-children',\n layers,\n };\n}\n\n/**\n * Extract text content from a Figma text layer.\n * Use this when a prop should be the actual text from a layer.\n *\n * @param layer - The name of the text layer in Figma\n * @returns A text content mapping descriptor\n *\n * @example\n * ```tsx\n * figmaProps: {\n * title: figma.textContent('Header Text'),\n * description: figma.textContent('Body Text'),\n * }\n * ```\n */\nfunction textContent(layer: string): FigmaTextContentMapping {\n return {\n __type: 'figma-text-content',\n layer,\n };\n}\n\n/**\n * Figma property mapping helpers.\n *\n * Use these to define how Figma properties map to your component props.\n * The mappings are used for:\n * - Generating accurate code snippets in Figma Dev Mode\n * - AI agents understanding the design-to-code relationship\n * - Automated design verification\n */\nexport const figma = {\n string,\n boolean,\n enum: enumValue,\n instance,\n children,\n textContent,\n} as const;\n\n/**\n * Helper type to check if a value is a Figma prop mapping\n */\nexport function isFigmaPropMapping(\n value: unknown\n): value is FigmaStringMapping | FigmaBooleanMapping | FigmaEnumMapping | FigmaInstanceMapping | FigmaChildrenMapping | FigmaTextContentMapping {\n if (typeof value !== 'object' || value === null || !('__type' in value)) {\n return false;\n }\n const typeValue = (value as Record<string, unknown>).__type;\n return typeof typeValue === 'string' && typeValue.startsWith('figma-');\n}\n\n/**\n * Resolve a Figma prop mapping to an actual value given Figma property values.\n *\n * @param mapping - The Figma prop mapping\n * @param figmaValues - Object containing Figma property values\n * @returns The resolved value for the code prop\n */\nexport function resolveFigmaMapping(\n mapping: FigmaStringMapping | FigmaBooleanMapping | FigmaEnumMapping | FigmaInstanceMapping | FigmaChildrenMapping | FigmaTextContentMapping,\n figmaValues: Record<string, unknown>\n): unknown {\n switch (mapping.__type) {\n case 'figma-string':\n return figmaValues[mapping.figmaProperty] ?? '';\n\n case 'figma-boolean': {\n const boolValue = figmaValues[mapping.figmaProperty] as boolean;\n if (mapping.valueMapping) {\n return boolValue ? mapping.valueMapping.true : mapping.valueMapping.false;\n }\n return boolValue;\n }\n\n case 'figma-enum': {\n const enumKey = figmaValues[mapping.figmaProperty] as string;\n return mapping.valueMapping[enumKey] ?? enumKey;\n }\n\n case 'figma-instance':\n // Instance mappings return the instance reference\n return figmaValues[mapping.figmaProperty];\n\n case 'figma-children':\n // Children mappings return array of layer contents\n return mapping.layers.map((layer) => figmaValues[layer]);\n\n case 'figma-text-content':\n return figmaValues[mapping.layer] ?? '';\n\n default:\n return undefined;\n }\n}\n","/**\n * Token Parser — extracts CSS custom property declarations from SCSS/CSS files.\n *\n * Parses files for `--prefix-*: value;` declarations and groups them\n * by SCSS comment sections (e.g., `// Typography`, `// Colors`).\n * Falls back to naming-convention-based categorization when comments\n * are absent.\n */\n\nexport interface ParsedToken {\n /** Full CSS variable name (e.g., \"--fui-color-accent\") */\n name: string;\n /** Raw value from the declaration (e.g., \"#{$fui-space-4}\" or \"16px\") */\n value?: string;\n /** Resolved value after SCSS variable substitution (e.g., \"16px\") */\n resolvedValue?: string;\n /** Category inferred from SCSS comment or naming convention */\n category: string;\n /** Description from inline comment, if any */\n description?: string;\n}\n\nexport interface TokenParseOutput {\n /** Detected prefix (e.g., \"--fui-\") */\n prefix: string;\n /** Tokens grouped by category */\n categories: Record<string, ParsedToken[]>;\n /** Total number of tokens found */\n total: number;\n}\n\n/**\n * Category inference from naming conventions.\n * Order matters — first match wins.\n */\nconst NAMING_RULES: Array<{ pattern: RegExp; category: string }> = [\n { pattern: /--\\w+-font-/, category: 'typography' },\n { pattern: /--\\w+-line-height-/, category: 'typography' },\n { pattern: /--\\w+-space-/, category: 'spacing' },\n { pattern: /--\\w+-padding-/, category: 'spacing' },\n { pattern: /--\\w+-radius-/, category: 'radius' },\n { pattern: /--\\w+-color-/, category: 'colors' },\n { pattern: /--\\w+-bg-/, category: 'surfaces' },\n { pattern: /--\\w+-text-/, category: 'text' },\n { pattern: /--\\w+-border/, category: 'borders' },\n { pattern: /--\\w+-shadow-/, category: 'shadows' },\n { pattern: /--\\w+-focus-/, category: 'focus' },\n { pattern: /--\\w+-transition-/, category: 'transitions' },\n { pattern: /--\\w+-scrollbar-/, category: 'scrollbar' },\n { pattern: /--\\w+-z-index/, category: 'z-index' },\n { pattern: /--\\w+-(button|input|touch)-/, category: 'component-sizing' },\n { pattern: /--\\w+-appshell-/, category: 'layout' },\n { pattern: /--\\w+-header-/, category: 'layout' },\n { pattern: /--\\w+-code-/, category: 'code' },\n { pattern: /--\\w+-tooltip-/, category: 'tooltip' },\n { pattern: /--\\w+-hero-/, category: 'marketing' },\n];\n\n/**\n * Infer category from a CSS variable name using naming conventions.\n */\nfunction inferCategory(name: string): string {\n for (const rule of NAMING_RULES) {\n if (rule.pattern.test(name)) {\n return rule.category;\n }\n }\n return 'other';\n}\n\n/**\n * Detect the most common prefix from a list of CSS variable names.\n * E.g., given [\"--fui-color-accent\", \"--fui-bg-primary\"] → \"--fui-\"\n */\nfunction detectPrefix(names: string[]): string {\n if (names.length === 0) return '--';\n\n // Find common prefix after \"--\"\n const stripped = names.map((n) => n.slice(2)); // remove \"--\"\n let prefix = '';\n const first = stripped[0];\n\n for (let i = 0; i < first.length; i++) {\n const ch = first[i];\n if (stripped.every((s) => s[i] === ch)) {\n prefix += ch;\n } else {\n break;\n }\n }\n\n // Trim to last hyphen to get clean prefix\n const lastHyphen = prefix.lastIndexOf('-');\n if (lastHyphen > 0) {\n prefix = prefix.slice(0, lastHyphen + 1);\n }\n\n return `--${prefix}`;\n}\n\n/**\n * Normalize a SCSS comment into a category name.\n * \"// Typography\" → \"typography\"\n * \"// Component heights\" → \"component-sizing\"\n * \"// Hero/Marketing gradient\" → \"marketing\"\n */\nfunction normalizeCategory(comment: string): string {\n const text = comment\n .trim()\n .replace(/^\\/\\/\\s*/, '')\n .replace(/^\\/\\*+\\s*/, '')\n .replace(/\\s*\\*+\\/$/, '')\n .trim()\n .toLowerCase();\n\n // Map common comment headings to clean category names\n const mappings: Record<string, string> = {\n 'base configuration': 'base',\n 'typography': 'typography',\n 'spacing (micro)': 'spacing',\n 'spacing': 'spacing',\n 'density padding': 'spacing',\n 'border radius': 'radius',\n 'transitions': 'transitions',\n 'colors': 'colors',\n 'surfaces': 'surfaces',\n 'text': 'text',\n 'borders': 'borders',\n 'shadows': 'shadows',\n 'focus': 'focus',\n 'scrollbar': 'scrollbar',\n 'component heights': 'component-sizing',\n 'appshell layout': 'layout',\n 'codeblock': 'code',\n 'tooltip': 'tooltip',\n 'hero/marketing gradient': 'marketing',\n };\n\n return mappings[text] ?? text.replace(/\\s+/g, '-');\n}\n\n/**\n * Extract SCSS variable declarations ($name: value;) from file content.\n * Returns a map of variable name → value.\n */\nfunction extractScssVariables(content: string): Map<string, string> {\n const vars = new Map<string, string>();\n // Match: $var-name: value; (handles multi-word values, stops at semicolon)\n const scssVarRegex = /^\\s*(\\$[\\w-]+)\\s*:\\s*(.+?)\\s*(?:!default\\s*)?;/gm;\n\n let match: RegExpExecArray | null;\n while ((match = scssVarRegex.exec(content)) !== null) {\n const name = match[1];\n const value = match[2].replace(/\\s*\\/\\/.*$/, '').trim();\n // Only store the first occurrence (canonical definition)\n if (!vars.has(name)) {\n vars.set(name, value);\n }\n }\n\n return vars;\n}\n\n/**\n * Resolve SCSS interpolations and variable references in a token value.\n *\n * Handles:\n * - `#{$var}` → looks up $var in scssVars map\n * - `$var` standalone → looks up in scssVars map\n * - `var(--other-token, fallback)` → returns fallback if provided\n * - Recursive resolution up to 5 levels deep\n */\nfunction resolveTokenValue(\n rawValue: string,\n scssVars: Map<string, string>,\n cssVarValues: Map<string, string>,\n depth = 0\n): string {\n if (depth > 5) return rawValue; // Prevent infinite recursion\n\n let resolved = rawValue;\n\n // Resolve #{$var} interpolations\n resolved = resolved.replace(/#\\{(\\$[\\w-]+)\\}/g, (_, varName) => {\n const val = scssVars.get(varName);\n return val !== undefined\n ? resolveTokenValue(val, scssVars, cssVarValues, depth + 1)\n : `#{${varName}}`;\n });\n\n // Resolve standalone $var references (not inside #{})\n resolved = resolved.replace(/(?<![#\\{])(\\$[\\w-]+)/g, (_, varName) => {\n const val = scssVars.get(varName);\n return val !== undefined\n ? resolveTokenValue(val, scssVars, cssVarValues, depth + 1)\n : varName;\n });\n\n // Resolve var(--token, fallback) — use the referenced token value or fallback\n resolved = resolved.replace(\n /var\\((--[\\w-]+)(?:\\s*,\\s*(.+?))?\\)/g,\n (original, tokenName, fallback) => {\n const tokenVal = cssVarValues.get(tokenName);\n if (tokenVal !== undefined) {\n return resolveTokenValue(tokenVal, scssVars, cssVarValues, depth + 1);\n }\n if (fallback) {\n return resolveTokenValue(fallback.trim(), scssVars, cssVarValues, depth + 1);\n }\n return original;\n }\n );\n\n return resolved;\n}\n\n/**\n * Parse a SCSS or CSS file and extract CSS custom property declarations.\n *\n * Handles two grouping strategies:\n * 1. Comment-based: Uses `// Category` comments above groups of declarations\n * 2. Naming-based: Falls back to inferring category from variable name patterns\n *\n * Also resolves SCSS variable interpolations (e.g., `#{$fui-space-4}` → `16px`)\n * when the SCSS variable definitions are found in the same file content.\n */\nexport function parseTokenFile(content: string, filePath: string): TokenParseOutput {\n const lines = content.split('\\n');\n const tokens: ParsedToken[] = [];\n const seenNames = new Set<string>();\n let currentCategory = 'other';\n let hasCommentCategories = false;\n\n // First pass: extract SCSS variable declarations for resolution\n const scssVars = extractScssVariables(content);\n\n // Regex for CSS custom property declarations\n // Matches: --name: value; (with optional SCSS interpolation)\n // Captures both the variable name and its value\n const varDeclRegex = /^\\s*(--[\\w-]+)\\s*:\\s*(.+?)\\s*;/;\n // Regex for section comments (// Category or /* Category */)\n // Allow any characters after uppercase start (including / for \"Hero/Marketing\")\n const sectionCommentRegex = /^\\s*\\/\\/\\s+([A-Z].+)$/;\n\n for (const line of lines) {\n // Check for section comment\n const commentMatch = line.match(sectionCommentRegex);\n if (commentMatch) {\n const normalized = normalizeCategory(commentMatch[0]);\n if (normalized) {\n currentCategory = normalized;\n hasCommentCategories = true;\n }\n continue;\n }\n\n // Check for CSS variable declaration\n const varMatch = line.match(varDeclRegex);\n if (varMatch) {\n const name = varMatch[1];\n const rawValue = varMatch[2];\n\n // Deduplicate: keep only the first occurrence of each variable.\n // Dark mode and high contrast blocks redefine the same variables\n // with different values — we only want the canonical list.\n if (seenNames.has(name)) continue;\n seenNames.add(name);\n\n // Extract inline comment if present\n const inlineComment = line.match(/\\/\\/\\s*(.+)$/);\n const description = inlineComment ? inlineComment[1].trim() : undefined;\n\n // Clean the value: strip trailing inline comments\n const cleanValue = rawValue.replace(/\\s*\\/\\/.*$/, '').trim();\n\n tokens.push({\n name,\n value: cleanValue || undefined,\n category: hasCommentCategories ? currentCategory : inferCategory(name),\n description,\n });\n }\n }\n\n // Second pass: build a CSS custom property → raw value map for cross-references\n const cssVarValues = new Map<string, string>();\n for (const token of tokens) {\n if (token.value) {\n cssVarValues.set(token.name, token.value);\n }\n }\n\n // Third pass: resolve SCSS interpolations and var() references\n for (const token of tokens) {\n if (token.value) {\n const resolved = resolveTokenValue(token.value, scssVars, cssVarValues);\n // Only set resolvedValue if it's different from raw and doesn't still contain unresolved refs\n if (resolved !== token.value && !resolved.includes('#{') && !resolved.includes('$')) {\n token.resolvedValue = resolved;\n }\n }\n }\n\n // Group by category\n const categories: Record<string, ParsedToken[]> = {};\n for (const token of tokens) {\n if (!categories[token.category]) {\n categories[token.category] = [];\n }\n categories[token.category].push(token);\n }\n\n // Detect prefix\n const prefix = detectPrefix(tokens.map((t) => t.name));\n\n return {\n prefix,\n categories,\n total: tokens.length,\n };\n}\n","/**\n * DTCG Token Parser — parses W3C DTCG .tokens.json files into TokenParseOutput.\n *\n * The output shape matches the existing SCSS parser exactly, so all downstream\n * consumers (build pipeline, MCP tools, governance) work unchanged.\n */\n\nimport type { DTCGTokenFile, DTCGTokenType, DTCGGroup, DTCGToken, ResolvedDTCGToken } from './dtcg.js';\nimport type { ParsedToken, TokenParseOutput } from './token-parser.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Properties that indicate a DTCG group/token meta field (not a child token) */\nconst DTCG_META_KEYS = new Set([\n '$type', '$value', '$description', '$deprecated', '$extensions', '$extends',\n]);\n\n/** Max alias resolution depth to prevent cycles */\nconst MAX_ALIAS_DEPTH = 10;\n\n// ---------------------------------------------------------------------------\n// File detection\n// ---------------------------------------------------------------------------\n\n/**\n * Check if a file path is a DTCG token file based on extension.\n */\nexport function isDTCGFile(filePath: string): boolean {\n return filePath.endsWith('.tokens.json') || filePath.endsWith('.tokens');\n}\n\n// ---------------------------------------------------------------------------\n// DTCG type → token category mapping\n// ---------------------------------------------------------------------------\n\nfunction mapDTCGTypeToCategory(type: DTCGTokenType, tokenPath: string): string {\n switch (type) {\n case 'color':\n return 'colors';\n case 'dimension':\n if (/radius/i.test(tokenPath)) return 'radius';\n return 'spacing';\n case 'fontFamily':\n case 'fontWeight':\n return 'typography';\n case 'shadow':\n return 'shadows';\n case 'border':\n return 'borders';\n case 'duration':\n case 'cubicBezier':\n case 'transition':\n return 'transitions';\n case 'typography':\n return 'typography';\n case 'gradient':\n return 'colors';\n case 'strokeStyle':\n return 'borders';\n case 'number':\n return 'other';\n default:\n return 'other';\n }\n}\n\n// ---------------------------------------------------------------------------\n// Value → CSS conversion\n// ---------------------------------------------------------------------------\n\nfunction colorValueToCSS(value: unknown): string {\n if (typeof value === 'string') return value;\n if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n // Prefer hex if available\n if (typeof obj.hex === 'string') {\n if (obj.alpha !== undefined && typeof obj.alpha === 'number' && obj.alpha < 1) {\n // Convert hex + alpha to rgba\n const hex = obj.hex.replace('#', '');\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${obj.alpha})`;\n }\n return obj.hex as string;\n }\n // Fall back to components\n if (Array.isArray(obj.components)) {\n const comps = obj.components as number[];\n if (comps.length >= 3) {\n const alpha = obj.alpha ?? (comps.length >= 4 ? comps[3] : 1);\n if (typeof alpha === 'number' && alpha < 1) {\n return `rgba(${Math.round(comps[0] * 255)}, ${Math.round(comps[1] * 255)}, ${Math.round(comps[2] * 255)}, ${alpha})`;\n }\n // Convert normalized 0-1 to 0-255 if values are <= 1\n if (comps.every((c) => c <= 1)) {\n const r = Math.round(comps[0] * 255);\n const g = Math.round(comps[1] * 255);\n const b = Math.round(comps[2] * 255);\n return `rgb(${r}, ${g}, ${b})`;\n }\n return `rgb(${comps[0]}, ${comps[1]}, ${comps[2]})`;\n }\n }\n }\n return String(value);\n}\n\nfunction dimensionValueToCSS(value: unknown): string {\n if (typeof value === 'string') return value;\n if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n if (typeof obj.value === 'number' && typeof obj.unit === 'string') {\n return `${obj.value}${obj.unit}`;\n }\n }\n return String(value);\n}\n\nfunction shadowValueToCSS(value: unknown): string {\n if (typeof value === 'string') return value;\n if (Array.isArray(value)) {\n return value.map((v) => shadowSingleToCSS(v)).join(', ');\n }\n return shadowSingleToCSS(value);\n}\n\nfunction shadowSingleToCSS(value: unknown): string {\n if (typeof value === 'string') return value;\n if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n const parts: string[] = [];\n if (obj.inset) parts.push('inset');\n parts.push(dimensionValueToCSS(obj.offsetX));\n parts.push(dimensionValueToCSS(obj.offsetY));\n parts.push(dimensionValueToCSS(obj.blur));\n if (obj.spread !== undefined) parts.push(dimensionValueToCSS(obj.spread));\n parts.push(colorValueToCSS(obj.color));\n return parts.join(' ');\n }\n return String(value);\n}\n\nfunction borderValueToCSS(value: unknown): string {\n if (typeof value === 'string') return value;\n if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n return `${dimensionValueToCSS(obj.width)} ${obj.style ?? 'solid'} ${colorValueToCSS(obj.color)}`;\n }\n return String(value);\n}\n\nfunction typographyValueToCSS(value: unknown): string {\n if (typeof value === 'string') return value;\n if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n const parts: string[] = [];\n if (obj.fontWeight) parts.push(String(obj.fontWeight));\n if (obj.fontSize) parts.push(dimensionValueToCSS(obj.fontSize));\n if (obj.lineHeight) parts.push(`/ ${obj.lineHeight}`);\n if (obj.fontFamily) {\n const family = Array.isArray(obj.fontFamily)\n ? obj.fontFamily.join(', ')\n : String(obj.fontFamily);\n parts.push(family);\n }\n return parts.join(' ');\n }\n return String(value);\n}\n\nfunction cubicBezierValueToCSS(value: unknown): string {\n if (typeof value === 'string') return value;\n if (Array.isArray(value) && value.length === 4) {\n return `cubic-bezier(${value.join(', ')})`;\n }\n return String(value);\n}\n\nfunction transitionValueToCSS(value: unknown): string {\n if (typeof value === 'string') return value;\n if (value && typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n const parts: string[] = [];\n if (obj.duration) parts.push(String(obj.duration));\n if (obj.timingFunction) parts.push(cubicBezierValueToCSS(obj.timingFunction));\n if (obj.delay) parts.push(String(obj.delay));\n return parts.join(' ');\n }\n return String(value);\n}\n\nfunction gradientValueToCSS(value: unknown): string {\n if (typeof value === 'string') return value;\n if (Array.isArray(value)) {\n const stops = value.map((stop) => {\n if (stop && typeof stop === 'object') {\n const s = stop as Record<string, unknown>;\n const color = colorValueToCSS(s.color);\n const position = typeof s.position === 'number' ? ` ${s.position * 100}%` : '';\n return `${color}${position}`;\n }\n return String(stop);\n });\n return `linear-gradient(${stops.join(', ')})`;\n }\n return String(value);\n}\n\nfunction fontFamilyValueToCSS(value: unknown): string {\n if (typeof value === 'string') return value;\n if (Array.isArray(value)) return value.join(', ');\n return String(value);\n}\n\nfunction valueToCSS(type: DTCGTokenType, value: unknown): string {\n switch (type) {\n case 'color': return colorValueToCSS(value);\n case 'dimension': return dimensionValueToCSS(value);\n case 'shadow': return shadowValueToCSS(value);\n case 'border': return borderValueToCSS(value);\n case 'typography': return typographyValueToCSS(value);\n case 'cubicBezier': return cubicBezierValueToCSS(value);\n case 'transition': return transitionValueToCSS(value);\n case 'gradient': return gradientValueToCSS(value);\n case 'fontFamily': return fontFamilyValueToCSS(value);\n case 'fontWeight': return String(value);\n case 'duration': return String(value);\n case 'number': return String(value);\n case 'strokeStyle': return typeof value === 'string' ? value : String(value);\n default: return String(value);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Alias resolution\n// ---------------------------------------------------------------------------\n\nfunction isAlias(value: unknown): value is string {\n return typeof value === 'string' && /^\\{.+\\}$/.test(value);\n}\n\nfunction resolveAliasPath(alias: string): string {\n return alias.slice(1, -1); // Remove { and }\n}\n\nfunction resolveAlias(\n alias: string,\n root: DTCGTokenFile,\n visited: Set<string>,\n depth: number,\n): unknown {\n if (depth > MAX_ALIAS_DEPTH) {\n throw new Error(`Circular alias detected: ${alias} (max depth ${MAX_ALIAS_DEPTH} reached)`);\n }\n\n const path = resolveAliasPath(alias);\n\n if (visited.has(path)) {\n throw new Error(`Circular alias detected: ${[...visited, path].join(' → ')}`);\n }\n visited.add(path);\n\n const parts = path.split('.');\n let current: unknown = root;\n\n for (const part of parts) {\n if (current && typeof current === 'object' && part in (current as Record<string, unknown>)) {\n current = (current as Record<string, unknown>)[part];\n } else {\n throw new Error(`Alias reference \"${alias}\" could not be resolved: \"${part}\" not found in path \"${path}\"`);\n }\n }\n\n // If the resolved value is itself a token with $value, extract it\n if (current && typeof current === 'object' && '$value' in (current as Record<string, unknown>)) {\n const resolvedValue = (current as Record<string, unknown>).$value;\n if (isAlias(resolvedValue)) {\n return resolveAlias(resolvedValue as string, root, visited, depth + 1);\n }\n return resolvedValue;\n }\n\n // The resolved value might be a plain value (in an alias chain)\n if (isAlias(current)) {\n return resolveAlias(current as string, root, visited, depth + 1);\n }\n\n return current;\n}\n\n// ---------------------------------------------------------------------------\n// Group $extends resolution\n// ---------------------------------------------------------------------------\n\nfunction resolveExtends(\n group: DTCGGroup,\n root: DTCGTokenFile,\n visited: Set<string>,\n): DTCGGroup {\n if (!group.$extends) return group;\n\n const extendsPath = group.$extends;\n if (visited.has(extendsPath)) {\n throw new Error(`Circular $extends detected: ${[...visited, extendsPath].join(' → ')}`);\n }\n visited.add(extendsPath);\n\n const parts = extendsPath.split('.');\n let parent: unknown = root;\n for (const part of parts) {\n if (parent && typeof parent === 'object' && part in (parent as Record<string, unknown>)) {\n parent = (parent as Record<string, unknown>)[part];\n } else {\n throw new Error(`$extends reference \"${extendsPath}\" could not be resolved`);\n }\n }\n\n if (!parent || typeof parent !== 'object') {\n throw new Error(`$extends target \"${extendsPath}\" is not a group`);\n }\n\n // Recursively resolve the parent's $extends\n const resolvedParent = resolveExtends(parent as DTCGGroup, root, visited);\n\n // Deep merge: parent values as defaults, child values override\n const merged: Record<string, unknown> = { ...resolvedParent };\n for (const [key, value] of Object.entries(group)) {\n if (key === '$extends') continue;\n merged[key] = value;\n }\n\n return merged as DTCGGroup;\n}\n\n// ---------------------------------------------------------------------------\n// Tree walker\n// ---------------------------------------------------------------------------\n\nfunction walkTokenTree(\n node: DTCGGroup,\n root: DTCGTokenFile,\n path: string[],\n inheritedType: DTCGTokenType | undefined,\n tokens: ResolvedDTCGToken[],\n): void {\n // Resolve $extends if present\n const resolved = resolveExtends(node, root, new Set());\n\n // Determine type inheritance\n const currentType = resolved.$type ?? inheritedType;\n\n for (const [key, child] of Object.entries(resolved)) {\n if (DTCG_META_KEYS.has(key)) continue;\n if (typeof child !== 'object' || child === null) continue;\n\n const childObj = child as Record<string, unknown>;\n const childPath = [...path, key];\n\n if ('$value' in childObj) {\n // This is a token node\n const tokenType = (childObj.$type as DTCGTokenType | undefined) ?? currentType;\n if (!tokenType) {\n // Skip tokens without a resolvable type\n continue;\n }\n\n let rawValue = childObj.$value;\n\n // Resolve aliases\n if (isAlias(rawValue)) {\n try {\n rawValue = resolveAlias(rawValue as string, root, new Set(), 0);\n } catch {\n // Keep raw alias value if resolution fails\n }\n }\n\n const cssValue = valueToCSS(tokenType, rawValue);\n\n tokens.push({\n path: childPath.join('.'),\n type: tokenType,\n rawValue,\n cssValue,\n description: childObj.$description as string | undefined,\n deprecated: childObj.$deprecated as boolean | string | undefined,\n extensions: childObj.$extensions as Record<string, unknown> | undefined,\n });\n } else {\n // This is a group node — recurse\n walkTokenTree(\n childObj as DTCGGroup,\n root,\n childPath,\n currentType,\n tokens,\n );\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Prefix detection\n// ---------------------------------------------------------------------------\n\nfunction detectDTCGPrefix(tokens: ResolvedDTCGToken[], root: DTCGTokenFile): string {\n // Check for explicit prefix in extensions\n const extensions = root.$extensions as Record<string, unknown> | undefined;\n if (extensions) {\n const fragmentsExt = extensions['com.usefragments'] as Record<string, unknown> | undefined;\n if (fragmentsExt?.prefix && typeof fragmentsExt.prefix === 'string') {\n const p = fragmentsExt.prefix.replace(/-$/, '');\n return `--${p}-`;\n }\n }\n\n // Derive from top-level group name\n const topLevelKeys = Object.keys(root).filter((k) => !DTCG_META_KEYS.has(k));\n if (topLevelKeys.length === 1) {\n return `--${topLevelKeys[0]}-`;\n }\n\n // Fall back to common path prefix\n if (tokens.length === 0) return '--';\n\n const firstParts = tokens[0].path.split('.');\n if (firstParts.length > 0) {\n return `--${firstParts[0]}-`;\n }\n\n return '--';\n}\n\n// ---------------------------------------------------------------------------\n// Token path → CSS variable name\n// ---------------------------------------------------------------------------\n\nfunction tokenPathToCSSName(path: string, prefix: string): string {\n // Convert dot-separated path to CSS custom property\n // e.g., \"color.brand.primary\" with prefix \"--ds-\" → \"--ds-color-brand-primary\"\n const suffix = path.replace(/\\./g, '-');\n // Ensure prefix ends with hyphen\n const normalizedPrefix = prefix.endsWith('-') ? prefix : `${prefix}-`;\n // If prefix already ends with the first path segment, avoid duplication\n const prefixBase = normalizedPrefix.replace(/^--/, '').replace(/-$/, '');\n if (suffix.startsWith(prefixBase + '-') || suffix === prefixBase) {\n return `--${suffix}`;\n }\n return `${normalizedPrefix}${suffix}`;\n}\n\n// ---------------------------------------------------------------------------\n// Main parser\n// ---------------------------------------------------------------------------\n\n/**\n * Parse a DTCG .tokens.json file and return TokenParseOutput.\n *\n * The output shape matches the existing SCSS parser exactly, so all\n * downstream consumers work unchanged.\n */\nexport function parseDTCGFile(content: string, filePath: string): TokenParseOutput {\n const root: DTCGTokenFile = JSON.parse(content);\n\n // Walk the token tree\n const resolvedTokens: ResolvedDTCGToken[] = [];\n walkTokenTree(root, root, [], undefined, resolvedTokens);\n\n // Detect prefix\n const prefix = detectDTCGPrefix(resolvedTokens, root);\n\n // Convert to ParsedToken[] grouped by category\n const categories: Record<string, ParsedToken[]> = {};\n\n for (const token of resolvedTokens) {\n const category = mapDTCGTypeToCategory(token.type, token.path);\n const cssName = tokenPathToCSSName(token.path, prefix);\n\n const parsed: ParsedToken = {\n name: cssName,\n value: token.cssValue,\n category,\n description: token.description,\n };\n\n if (!categories[category]) {\n categories[category] = [];\n }\n categories[category].push(parsed);\n }\n\n return {\n prefix,\n categories,\n total: resolvedTokens.length,\n };\n}\n","/**\n * W3C Design Token Community Group (DTCG) format types and Zod schemas.\n *\n * Implements the W3C DTCG specification for design token files.\n * @see https://www.designtokens.org/tr/2025.10/format/\n */\n\nimport { z } from 'zod';\n\n// ---------------------------------------------------------------------------\n// Token types per DTCG spec\n// ---------------------------------------------------------------------------\n\nexport type DTCGTokenType =\n | 'color'\n | 'dimension'\n | 'fontFamily'\n | 'fontWeight'\n | 'duration'\n | 'cubicBezier'\n | 'number'\n | 'shadow'\n | 'border'\n | 'strokeStyle'\n | 'transition'\n | 'gradient'\n | 'typography';\n\n// ---------------------------------------------------------------------------\n// Value types per DTCG spec\n// ---------------------------------------------------------------------------\n\n/** Color value (sRGB) */\nexport interface DTCGColorValue {\n colorSpace: string;\n components: number[];\n hex?: string;\n alpha?: number;\n}\n\n/** Dimension value */\nexport interface DTCGDimensionValue {\n value: number;\n unit: 'px' | 'rem';\n}\n\n/** Shadow value (single layer) */\nexport interface DTCGShadowValue {\n color: string | DTCGColorValue;\n offsetX: string | DTCGDimensionValue;\n offsetY: string | DTCGDimensionValue;\n blur: string | DTCGDimensionValue;\n spread: string | DTCGDimensionValue;\n inset?: boolean;\n}\n\n/** Border value */\nexport interface DTCGBorderValue {\n color: string | DTCGColorValue;\n width: string | DTCGDimensionValue;\n style: string;\n}\n\n/** Typography value */\nexport interface DTCGTypographyValue {\n fontFamily: string | string[];\n fontSize: string | DTCGDimensionValue;\n fontWeight: number | string;\n letterSpacing?: string | DTCGDimensionValue;\n lineHeight?: string | number;\n}\n\n/** Transition value */\nexport interface DTCGTransitionValue {\n duration: string;\n delay?: string;\n timingFunction: number[];\n}\n\n/** Gradient stop */\nexport interface DTCGGradientStop {\n color: string | DTCGColorValue;\n position: number;\n}\n\n/** Cubic bezier value */\nexport type DTCGCubicBezierValue = [number, number, number, number];\n\n// ---------------------------------------------------------------------------\n// Token and group structures\n// ---------------------------------------------------------------------------\n\n/** A single design token */\nexport interface DTCGToken {\n $value: unknown;\n $type?: DTCGTokenType;\n $description?: string;\n $deprecated?: boolean | string;\n $extensions?: Record<string, unknown>;\n}\n\n/** A group (recursive container for tokens and sub-groups) */\nexport interface DTCGGroup {\n $type?: DTCGTokenType;\n $description?: string;\n $deprecated?: boolean | string;\n $extensions?: Record<string, unknown>;\n $extends?: string;\n [key: string]: DTCGToken | DTCGGroup | unknown;\n}\n\n/** Root file structure — a top-level group */\nexport type DTCGTokenFile = DTCGGroup;\n\n// ---------------------------------------------------------------------------\n// Resolved token (after parsing)\n// ---------------------------------------------------------------------------\n\nexport interface ResolvedDTCGToken {\n /** Dot-separated path (e.g., \"color.brand.primary\") */\n path: string;\n /** Resolved type (inherited from group if not set on token) */\n type: DTCGTokenType;\n /** Raw $value from the token */\n rawValue: unknown;\n /** CSS-compatible string value */\n cssValue: string;\n /** Description */\n description?: string;\n /** Whether token is deprecated */\n deprecated?: boolean | string;\n /** Extensions data */\n extensions?: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Zod schemas for runtime validation\n// ---------------------------------------------------------------------------\n\nconst dtcgTokenTypeSchema = z.enum([\n 'color', 'dimension', 'fontFamily', 'fontWeight',\n 'duration', 'cubicBezier', 'number',\n 'shadow', 'border', 'strokeStyle', 'transition',\n 'gradient', 'typography',\n]);\n\nconst dtcgColorValueSchema = z.union([\n z.string(),\n z.object({\n colorSpace: z.string().default('srgb'),\n components: z.array(z.number()),\n hex: z.string().optional(),\n alpha: z.number().optional(),\n }),\n]);\n\nconst dtcgDimensionValueSchema = z.union([\n z.string(),\n z.object({\n value: z.number(),\n unit: z.enum(['px', 'rem']),\n }),\n]);\n\nconst dtcgShadowValueSchema = z.object({\n color: dtcgColorValueSchema,\n offsetX: dtcgDimensionValueSchema,\n offsetY: dtcgDimensionValueSchema,\n blur: dtcgDimensionValueSchema,\n spread: dtcgDimensionValueSchema.optional(),\n inset: z.boolean().optional(),\n});\n\nconst dtcgBorderValueSchema = z.object({\n color: dtcgColorValueSchema,\n width: dtcgDimensionValueSchema,\n style: z.string(),\n});\n\nconst dtcgTypographyValueSchema = z.object({\n fontFamily: z.union([z.string(), z.array(z.string())]),\n fontSize: dtcgDimensionValueSchema,\n fontWeight: z.union([z.number(), z.string()]),\n letterSpacing: dtcgDimensionValueSchema.optional(),\n lineHeight: z.union([z.string(), z.number()]).optional(),\n});\n\nconst dtcgTransitionValueSchema = z.object({\n duration: z.string(),\n delay: z.string().optional(),\n timingFunction: z.array(z.number()).length(4),\n});\n\nconst dtcgGradientStopSchema = z.object({\n color: dtcgColorValueSchema,\n position: z.number(),\n});\n\nconst dtcgCubicBezierValueSchema = z.tuple([\n z.number(), z.number(), z.number(), z.number(),\n]);\n\n/** Schema for a single token node (has $value) */\nconst dtcgTokenSchema = z.object({\n $value: z.unknown(),\n $type: dtcgTokenTypeSchema.optional(),\n $description: z.string().optional(),\n $deprecated: z.union([z.boolean(), z.string()]).optional(),\n $extensions: z.record(z.string(), z.unknown()).optional(),\n}).passthrough();\n\n/**\n * Top-level schema for a DTCG token file.\n * Validates the root structure — individual tokens are validated by type\n * during parsing since the tree is recursive.\n */\nexport const dtcgTokenFileSchema = z.record(z.string(), z.unknown()).refine(\n (data) => {\n // A valid DTCG file should not be empty and should not be an array\n return data !== null && typeof data === 'object' && !Array.isArray(data);\n },\n { message: 'DTCG token file must be a JSON object' },\n);\n\n// Export individual schemas for consumers\nexport {\n dtcgTokenTypeSchema,\n dtcgTokenSchema,\n dtcgColorValueSchema,\n dtcgDimensionValueSchema,\n dtcgShadowValueSchema,\n dtcgBorderValueSchema,\n dtcgTypographyValueSchema,\n dtcgTransitionValueSchema,\n dtcgGradientStopSchema,\n dtcgCubicBezierValueSchema,\n};\n","/**\n * Framework-agnostic component contract format.\n *\n * Allows non-React teams to define component metadata via `.contract.json`\n * files instead of `.fragment.tsx`. Maps trivially to CompiledFragment.\n */\n\nimport { z } from 'zod';\n\n// ---------------------------------------------------------------------------\n// Component Contract interface\n// ---------------------------------------------------------------------------\n\nexport interface ComponentContract {\n /** JSON Schema reference for tooling — required for validation */\n $schema: string;\n\n /** Component name */\n name: string;\n description: string;\n category: string;\n tags?: string[];\n status?: 'stable' | 'beta' | 'deprecated' | 'experimental';\n\n /** Framework hint (for extraction and documentation) */\n framework?: 'react' | 'vue' | 'svelte' | 'web-components' | 'angular';\n\n /** Path to the component source file, relative to fragments.config.ts root */\n sourcePath: string;\n\n /** Named export from the source file */\n exportName: string;\n\n /** Compact one-line-per-prop summaries for agent first-pass (e.g., \"variant: primary|secondary (required)\") */\n propsSummary: string[];\n\n /** Component props schema */\n props: Record<string, {\n type: string;\n values?: string[];\n default?: unknown;\n description: string;\n required?: boolean;\n constraints?: string[];\n }>;\n\n /** Usage guidelines */\n usage: {\n when: string[];\n whenNot: string[];\n guidelines?: string[];\n accessibility?: string[];\n };\n\n /** Code examples (as strings, not render functions) */\n examples?: Array<{\n name: string;\n description: string;\n code: string;\n args?: Record<string, unknown>;\n }>;\n\n /** Relations to other components */\n relations?: Array<{\n component: string;\n relationship: 'alternative' | 'parent' | 'child' | 'sibling' | 'composition' | 'complementary' | 'used-by';\n note: string;\n }>;\n\n /** AI generation contract */\n contract?: {\n propsSummary?: string[];\n scenarioTags?: string[];\n a11yRules?: string[];\n bans?: Array<{ pattern: string; message: string }>;\n /** Sub-component slot metadata for compound components */\n compoundChildren?: Record<string, {\n required?: boolean;\n accepts?: string[];\n description?: string;\n }>;\n /** Canonical JSX usage examples */\n canonicalUsage?: string[];\n /** Per-component performance budget override in bytes (gzipped) */\n performanceBudget?: number;\n };\n\n /** AI metadata for compound component generation */\n ai?: {\n compositionPattern?: 'compound' | 'simple' | 'controlled' | 'wrapper';\n subComponents?: string[];\n requiredChildren?: string[];\n commonPatterns?: string[];\n };\n\n /** Per-component preview configuration */\n preview?: {\n setupModule?: string;\n wrapperModule?: string;\n wrapperExport?: string;\n css?: string[];\n theme?: 'light' | 'dark';\n };\n\n /** Provenance tracking — required for verification */\n provenance: {\n source: 'manual' | 'extracted' | 'merged' | 'migrated';\n verified: boolean;\n frameworkSupport?: 'native' | 'manual-only';\n sourceHash?: string;\n extractedAt?: string;\n };\n\n /** Design token references used by this component */\n tokens?: string[];\n\n /** Figma mappings (same DSL as .fragment.tsx but in JSON form) */\n figma?: {\n nodeUrl?: string;\n propMappings?: Record<string, {\n type: 'string' | 'boolean' | 'enum' | 'instance' | 'children' | 'textContent';\n figmaProperty: string;\n values?: Record<string, string>;\n }>;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Zod schema for validation\n// ---------------------------------------------------------------------------\n\nconst contractPropSchema = z.object({\n type: z.string(),\n values: z.array(z.string()).optional(),\n default: z.unknown().optional(),\n description: z.string(),\n required: z.boolean().optional(),\n constraints: z.array(z.string()).optional(),\n});\n\nconst contractUsageSchema = z.object({\n when: z.array(z.string()),\n whenNot: z.array(z.string()),\n guidelines: z.array(z.string()).optional(),\n accessibility: z.array(z.string()).optional(),\n});\n\nconst contractExampleSchema = z.object({\n name: z.string(),\n description: z.string(),\n code: z.string(),\n args: z.record(z.string(), z.unknown()).optional(),\n});\n\nconst contractRelationSchema = z.object({\n component: z.string(),\n relationship: z.enum(['alternative', 'parent', 'child', 'sibling', 'composition', 'complementary', 'used-by']),\n note: z.string(),\n});\n\nconst contractContractSchema = z.object({\n propsSummary: z.array(z.string()).optional(),\n scenarioTags: z.array(z.string()).optional(),\n a11yRules: z.array(z.string()).optional(),\n bans: z.array(z.object({\n pattern: z.string(),\n message: z.string(),\n })).optional(),\n compoundChildren: z.record(z.string(), z.object({\n required: z.boolean().optional(),\n accepts: z.array(z.string()).optional(),\n description: z.string().optional(),\n })).optional(),\n canonicalUsage: z.array(z.string()).optional(),\n performanceBudget: z.number().optional(),\n});\n\nconst contractAiSchema = z.object({\n compositionPattern: z.enum(['compound', 'simple', 'controlled', 'wrapper']).optional(),\n subComponents: z.array(z.string()).optional(),\n requiredChildren: z.array(z.string()).optional(),\n commonPatterns: z.array(z.string()).optional(),\n});\n\nconst contractPreviewSchema = z.object({\n setupModule: z.string().optional(),\n wrapperModule: z.string().optional(),\n wrapperExport: z.string().optional(),\n css: z.array(z.string()).optional(),\n theme: z.enum(['light', 'dark']).optional(),\n});\n\nconst contractProvenanceSchema = z.object({\n source: z.enum(['manual', 'extracted', 'merged', 'migrated']),\n verified: z.boolean(),\n frameworkSupport: z.enum(['native', 'manual-only']).optional(),\n sourceHash: z.string().optional(),\n extractedAt: z.string().optional(),\n});\n\nconst contractFigmaSchema = z.object({\n nodeUrl: z.string().optional(),\n propMappings: z.record(z.string(), z.object({\n type: z.enum(['string', 'boolean', 'enum', 'instance', 'children', 'textContent']),\n figmaProperty: z.string(),\n values: z.record(z.string(), z.string()).optional(),\n })).optional(),\n});\n\nexport const componentContractSchema = z.object({\n $schema: z.string(),\n name: z.string(),\n description: z.string(),\n category: z.string(),\n tags: z.array(z.string()).optional(),\n status: z.enum(['stable', 'beta', 'deprecated', 'experimental']).optional(),\n framework: z.enum(['react', 'vue', 'svelte', 'web-components', 'angular']).optional(),\n sourcePath: z.string(),\n exportName: z.string(),\n propsSummary: z.array(z.string()),\n props: z.record(z.string(), contractPropSchema),\n usage: contractUsageSchema,\n examples: z.array(contractExampleSchema).optional(),\n relations: z.array(contractRelationSchema).optional(),\n contract: contractContractSchema.optional(),\n ai: contractAiSchema.optional(),\n preview: contractPreviewSchema.optional(),\n provenance: contractProvenanceSchema,\n tokens: z.array(z.string()).optional(),\n figma: contractFigmaSchema.optional(),\n});\n","/**\n * Component Contract Parser — converts .contract.json files to CompiledFragment.\n *\n * Maps the framework-agnostic ComponentContract format to the same\n * CompiledFragment type used by .fragment.tsx, so all downstream consumers\n * (MCP tools, governance, search) work unchanged.\n */\n\nimport { componentContractSchema } from './component-contract.js';\nimport type { ComponentContract } from './component-contract.js';\n\n// Use the context package's CompiledFragment type via re-export from types.ts\n// Since core can't depend on context, we define the minimal output shape here\n// that matches CompiledFragment structurally.\n\nexport interface CompiledContractOutput {\n filePath: string;\n meta: {\n name: string;\n description: string;\n category: string;\n tags?: string[];\n status?: 'stable' | 'beta' | 'deprecated' | 'experimental';\n figma?: string;\n figmaProps?: Record<string, unknown>;\n };\n usage: {\n when: string[];\n whenNot: string[];\n guidelines?: string[];\n accessibility?: string[];\n };\n props: Record<string, {\n type: string;\n description: string;\n default?: unknown;\n required?: boolean;\n values?: string[];\n constraints?: string[];\n }>;\n relations?: Array<{\n component: string;\n relationship: 'alternative' | 'parent' | 'child' | 'sibling' | 'composition' | 'complementary' | 'used-by';\n note: string;\n }>;\n variants: Array<{\n name: string;\n description: string;\n code?: string;\n args?: Record<string, unknown>;\n }>;\n contract?: {\n propsSummary?: string[];\n scenarioTags?: string[];\n a11yRules?: string[];\n bans?: Array<{ pattern: string; message: string }>;\n compoundChildren?: Record<string, {\n required?: boolean;\n accepts?: string[];\n description?: string;\n }>;\n canonicalUsage?: string[];\n performanceBudget?: number;\n };\n /** Framework hint from contract, used by extractor adapter selection */\n framework?: string;\n /** AI metadata for compound component generation */\n ai?: {\n compositionPattern?: 'compound' | 'simple' | 'controlled' | 'wrapper';\n subComponents?: string[];\n requiredChildren?: string[];\n commonPatterns?: string[];\n };\n /** Top-level compact prop summaries for agent first-pass */\n propsSummary?: string[];\n /** Provenance tracking */\n provenance?: {\n source: string;\n verified: boolean;\n frameworkSupport?: string;\n sourceHash?: string;\n extractedAt?: string;\n };\n /** Source file path relative to config root */\n sourcePath?: string;\n /** Named export from source file */\n exportName?: string;\n}\n\n/**\n * Check if a file path is a component contract file.\n */\nexport function isContractFile(filePath: string): boolean {\n return filePath.endsWith('.contract.json');\n}\n\n/**\n * Parse a component contract JSON file into CompiledFragment-compatible output.\n */\nexport function parseComponentContract(\n content: string,\n filePath: string,\n): CompiledContractOutput {\n const raw = JSON.parse(content);\n const validated: ComponentContract = componentContractSchema.parse(raw);\n\n return {\n filePath,\n meta: {\n name: validated.name,\n description: validated.description,\n category: validated.category,\n tags: validated.tags,\n status: validated.status,\n figma: validated.figma?.nodeUrl,\n figmaProps: validated.figma?.propMappings as Record<string, unknown> | undefined,\n },\n usage: validated.usage,\n props: validated.props,\n relations: validated.relations ?? [],\n variants: (validated.examples ?? []).map((ex) => ({\n name: ex.name,\n description: ex.description,\n code: ex.code,\n args: ex.args,\n })),\n contract: validated.contract ? {\n ...validated.contract,\n // Merge top-level propsSummary into contract.propsSummary if not already set\n propsSummary: validated.contract.propsSummary ?? validated.propsSummary,\n } : {\n propsSummary: validated.propsSummary,\n },\n framework: validated.framework,\n ai: validated.ai,\n propsSummary: validated.propsSummary,\n provenance: validated.provenance,\n sourcePath: validated.sourcePath,\n exportName: validated.exportName,\n };\n}\n","/**\n * DTCG Output Generators — generate CSS, SCSS, Tailwind, and Figma output\n * from a DTCG token source file.\n *\n * Makes DTCG the single source of truth with everything else as derived output.\n */\n\nimport type { DTCGTokenFile, DTCGTokenType, DTCGGroup, ResolvedDTCGToken } from './dtcg.js';\nimport { parseDTCGFile } from './dtcg-parser.js';\nimport type { ParsedToken } from './token-parser.js';\n\n// ---------------------------------------------------------------------------\n// Internal: parse a DTCG file to flat tokens\n// ---------------------------------------------------------------------------\n\nfunction parseToFlatTokens(\n tokens: DTCGTokenFile,\n prefix?: string,\n): Array<{ cssName: string; cssValue: string; category: string; description?: string }> {\n // Use parseDTCGFile to get consistent output\n const parsed = parseDTCGFile(JSON.stringify(tokens), 'tokens.tokens.json');\n const effectivePrefix = prefix ? `--${prefix.replace(/^--/, '').replace(/-$/, '')}-` : parsed.prefix;\n\n const result: Array<{ cssName: string; cssValue: string; category: string; description?: string }> = [];\n\n for (const [category, categoryTokens] of Object.entries(parsed.categories)) {\n for (const token of categoryTokens) {\n // Re-prefix if a custom prefix was requested\n let cssName = token.name;\n if (prefix && token.name.startsWith(parsed.prefix)) {\n cssName = effectivePrefix + token.name.slice(parsed.prefix.length);\n }\n\n result.push({\n cssName,\n cssValue: token.value ?? '',\n category,\n description: token.description,\n });\n }\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// CSS Custom Properties Generator\n// ---------------------------------------------------------------------------\n\nexport interface CSSGeneratorOptions {\n /** Token name prefix (e.g., 'ds' → '--ds-*') */\n prefix?: string;\n /** CSS selector to wrap variables in (default: ':root') */\n selector?: string;\n}\n\n/**\n * Generate CSS custom properties from a DTCG token file.\n */\nexport function generateCSSCustomProperties(\n tokens: DTCGTokenFile,\n options?: CSSGeneratorOptions,\n): string {\n const selector = options?.selector ?? ':root';\n const flatTokens = parseToFlatTokens(tokens, options?.prefix);\n\n const lines: string[] = [];\n lines.push(`${selector} {`);\n\n // Group by category for readability\n const grouped = new Map<string, typeof flatTokens>();\n for (const token of flatTokens) {\n const group = grouped.get(token.category) ?? [];\n group.push(token);\n grouped.set(token.category, group);\n }\n\n for (const [category, categoryTokens] of grouped) {\n lines.push(` /* ${category} */`);\n for (const token of categoryTokens) {\n if (token.description) {\n lines.push(` /* ${token.description} */`);\n }\n lines.push(` ${token.cssName}: ${token.cssValue};`);\n }\n lines.push('');\n }\n\n lines.push('}');\n return lines.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// SCSS Variables Generator\n// ---------------------------------------------------------------------------\n\nexport interface SCSSGeneratorOptions {\n /** Token name prefix (e.g., 'ds' → '$ds-*') */\n prefix?: string;\n}\n\n/**\n * Generate SCSS variables from a DTCG token file.\n */\nexport function generateSCSSVariables(\n tokens: DTCGTokenFile,\n options?: SCSSGeneratorOptions,\n): string {\n const flatTokens = parseToFlatTokens(tokens, options?.prefix);\n\n const lines: string[] = [];\n lines.push('// Auto-generated from DTCG token file');\n lines.push('// Do not edit directly — modify the .tokens.json source');\n lines.push('');\n\n // Group by category for readability\n const grouped = new Map<string, typeof flatTokens>();\n for (const token of flatTokens) {\n const group = grouped.get(token.category) ?? [];\n group.push(token);\n grouped.set(token.category, group);\n }\n\n for (const [category, categoryTokens] of grouped) {\n lines.push(`// ${category}`);\n for (const token of categoryTokens) {\n // Convert CSS variable name to SCSS variable name\n const scssName = token.cssName.replace(/^--/, '$');\n lines.push(`${scssName}: ${token.cssValue} !default;`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// Tailwind Config Generator\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a Tailwind CSS configuration object from a DTCG token file.\n * Compatible with Tailwind v3 and v4.\n */\nexport function generateTailwindConfig(\n tokens: DTCGTokenFile,\n): Record<string, unknown> {\n const flatTokens = parseToFlatTokens(tokens);\n\n const theme: Record<string, Record<string, string>> = {};\n\n for (const token of flatTokens) {\n const tailwindKey = categoryToTailwindKey(token.category);\n if (!tailwindKey) continue;\n\n if (!theme[tailwindKey]) {\n theme[tailwindKey] = {};\n }\n\n // Convert CSS name to Tailwind token key\n // e.g., \"--ds-color-brand-primary\" → \"brand-primary\"\n const parts = token.cssName.replace(/^--[\\w]+-/, '').split('-');\n // Remove the category prefix if it matches\n const tokenKey = parts.join('-') || token.cssName;\n\n theme[tailwindKey][tokenKey] = `var(${token.cssName})`;\n }\n\n return {\n theme: {\n extend: theme,\n },\n };\n}\n\nfunction categoryToTailwindKey(category: string): string | undefined {\n switch (category) {\n case 'colors':\n case 'surfaces':\n case 'text':\n return 'colors';\n case 'spacing':\n return 'spacing';\n case 'radius':\n return 'borderRadius';\n case 'typography':\n return 'fontFamily';\n case 'shadows':\n return 'boxShadow';\n case 'borders':\n return 'borderWidth';\n case 'transitions':\n return 'transitionDuration';\n case 'z-index':\n return 'zIndex';\n default:\n return undefined;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Figma Variables Generator\n// ---------------------------------------------------------------------------\n\nexport interface FigmaVariable {\n name: string;\n type: 'COLOR' | 'FLOAT' | 'STRING' | 'BOOLEAN';\n value: unknown;\n description?: string;\n scopes?: string[];\n}\n\nexport interface FigmaVariableCollection {\n name: string;\n modes: Array<{ name: string; modeId: string }>;\n variables: FigmaVariable[];\n}\n\n/**\n * Generate Figma Variables REST API-compatible payload from a DTCG token file.\n */\nexport function generateFigmaVariables(\n tokens: DTCGTokenFile,\n): FigmaVariableCollection[] {\n const flatTokens = parseToFlatTokens(tokens);\n\n // Group by category into collections\n const collections = new Map<string, FigmaVariable[]>();\n\n for (const token of flatTokens) {\n const collectionName = categoryToFigmaCollection(token.category);\n const vars = collections.get(collectionName) ?? [];\n\n vars.push({\n name: token.cssName.replace(/^--/, '').replace(/-/g, '/'),\n type: categoryToFigmaType(token.category),\n value: parseFigmaValue(token.cssValue, token.category),\n description: token.description,\n scopes: categoryToFigmaScopes(token.category),\n });\n\n collections.set(collectionName, vars);\n }\n\n return Array.from(collections.entries()).map(([name, variables]) => ({\n name,\n modes: [{ name: 'Default', modeId: 'default' }],\n variables,\n }));\n}\n\nfunction categoryToFigmaCollection(category: string): string {\n switch (category) {\n case 'colors':\n case 'surfaces':\n case 'text':\n return 'Colors';\n case 'spacing':\n case 'radius':\n return 'Dimensions';\n case 'typography':\n return 'Typography';\n case 'shadows':\n return 'Effects';\n default:\n return 'Other';\n }\n}\n\nfunction categoryToFigmaType(category: string): 'COLOR' | 'FLOAT' | 'STRING' | 'BOOLEAN' {\n switch (category) {\n case 'colors':\n case 'surfaces':\n case 'text':\n return 'COLOR';\n case 'spacing':\n case 'radius':\n case 'z-index':\n return 'FLOAT';\n default:\n return 'STRING';\n }\n}\n\nfunction categoryToFigmaScopes(category: string): string[] {\n switch (category) {\n case 'colors':\n return ['ALL_FILLS', 'STROKE_COLOR'];\n case 'surfaces':\n return ['FRAME_FILL', 'SHAPE_FILL'];\n case 'text':\n return ['TEXT_FILL'];\n case 'spacing':\n return ['GAP', 'WIDTH_HEIGHT'];\n case 'radius':\n return ['CORNER_RADIUS'];\n default:\n return ['ALL_SCOPES'];\n }\n}\n\nfunction parseFigmaValue(cssValue: string, category: string): unknown {\n // For colors, try to parse hex to Figma RGBA object\n if (category === 'colors' || category === 'surfaces' || category === 'text') {\n const hexMatch = cssValue.match(/^#([0-9a-f]{6})$/i);\n if (hexMatch) {\n const hex = hexMatch[1];\n return {\n r: parseInt(hex.substring(0, 2), 16) / 255,\n g: parseInt(hex.substring(2, 4), 16) / 255,\n b: parseInt(hex.substring(4, 6), 16) / 255,\n a: 1,\n };\n }\n }\n\n // For dimensions, extract numeric value\n if (category === 'spacing' || category === 'radius') {\n const numMatch = cssValue.match(/^(\\d+(?:\\.\\d+)?)/);\n if (numMatch) {\n return parseFloat(numMatch[1]);\n }\n }\n\n return cssValue;\n}\n","import type { CompiledFragment, RelationshipType } from \"./types.js\";\nimport type { ComponentGraph } from \"@fragments-sdk/context/graph\";\nimport { ComponentGraphEngine } from \"@fragments-sdk/context/graph\";\n\n// --- Public types ---\n\nexport interface CompositionWarning {\n type:\n | \"missing_parent\"\n | \"missing_child\"\n | \"missing_composition\"\n | \"redundant_alternative\"\n | \"deprecated\"\n | \"experimental\";\n component: string;\n message: string;\n relatedComponent?: string;\n}\n\nexport interface CompositionSuggestion {\n component: string;\n reason: string;\n relationship: RelationshipType | \"category_gap\";\n sourceComponent: string;\n}\n\nexport interface CompositionGuideline {\n component: string;\n guideline: string;\n}\n\nexport interface CompositionAnalysis {\n /** The validated component names (filtered to those that exist) */\n components: string[];\n\n /** Components requested but not found in the registry */\n unknown: string[];\n\n /** Issues with the current selection */\n warnings: CompositionWarning[];\n\n /** Components to consider adding */\n suggestions: CompositionSuggestion[];\n\n /** Relevant usage guidelines for the selected components */\n guidelines: CompositionGuideline[];\n}\n\n// --- Category affinities ---\n\nconst CATEGORY_AFFINITIES: Record<string, string[]> = {\n forms: [\"feedback\"],\n actions: [\"feedback\"],\n};\n\n// --- Main function ---\n\n/**\n * Analyzes a set of components as a composition group.\n * Returns warnings about missing relations, usage conflicts,\n * and suggestions for additional components.\n *\n * When a ComponentGraph is provided via `options.graph`, the analysis is\n * enhanced with graph-based dependency detection and block-based suggestions.\n *\n * Browser-safe: no Node.js APIs used.\n */\nexport function analyzeComposition(\n fragments: Record<string, CompiledFragment>,\n componentNames: string[],\n _context?: string,\n options?: { graph?: ComponentGraph },\n): CompositionAnalysis {\n const allNames = new Set(Object.keys(fragments));\n\n // 1. Validate names\n const components: string[] = [];\n const unknown: string[] = [];\n for (const name of componentNames) {\n if (allNames.has(name)) {\n components.push(name);\n } else {\n unknown.push(name);\n }\n }\n\n const selectedSet = new Set(components);\n const warnings: CompositionWarning[] = [];\n const suggestions: CompositionSuggestion[] = [];\n const guidelines: CompositionGuideline[] = [];\n\n // Track suggestions to avoid duplicates\n const suggestedSet = new Set<string>();\n\n for (const name of components) {\n const fragment = fragments[name];\n\n // 2. Relation checks\n if (fragment.relations) {\n for (const rel of fragment.relations) {\n switch (rel.relationship) {\n case \"parent\":\n if (!selectedSet.has(rel.component)) {\n warnings.push({\n type: \"missing_parent\",\n component: name,\n message: `\"${name}\" expects to be wrapped by \"${rel.component}\"${rel.note ? `: ${rel.note}` : \"\"}`,\n relatedComponent: rel.component,\n });\n }\n break;\n\n case \"child\":\n if (!selectedSet.has(rel.component) && !suggestedSet.has(rel.component)) {\n suggestions.push({\n component: rel.component,\n reason: `\"${name}\" typically contains \"${rel.component}\"${rel.note ? `: ${rel.note}` : \"\"}`,\n relationship: \"child\",\n sourceComponent: name,\n });\n suggestedSet.add(rel.component);\n }\n break;\n\n case \"composition\":\n if (!selectedSet.has(rel.component)) {\n warnings.push({\n type: \"missing_composition\",\n component: name,\n message: `\"${name}\" is typically used together with \"${rel.component}\"${rel.note ? `: ${rel.note}` : \"\"}`,\n relatedComponent: rel.component,\n });\n }\n break;\n\n case \"sibling\":\n if (!selectedSet.has(rel.component) && !suggestedSet.has(rel.component)) {\n suggestions.push({\n component: rel.component,\n reason: `\"${rel.component}\" is a sibling of \"${name}\"${rel.note ? `: ${rel.note}` : \"\"}`,\n relationship: \"sibling\",\n sourceComponent: name,\n });\n suggestedSet.add(rel.component);\n }\n break;\n\n case \"alternative\":\n if (selectedSet.has(rel.component)) {\n warnings.push({\n type: \"redundant_alternative\",\n component: name,\n message: `\"${name}\" and \"${rel.component}\" are alternatives — using both may be redundant${rel.note ? `: ${rel.note}` : \"\"}`,\n relatedComponent: rel.component,\n });\n }\n break;\n }\n }\n }\n\n // 3. Usage conflict checks (whenNot)\n if (fragment.usage?.whenNot) {\n for (const whenNotEntry of fragment.usage.whenNot) {\n const lower = whenNotEntry.toLowerCase();\n for (const other of components) {\n if (other !== name && lower.includes(other.toLowerCase())) {\n guidelines.push({\n component: name,\n guideline: `Potential conflict with \"${other}\": ${whenNotEntry}`,\n });\n }\n }\n }\n }\n\n // 4. Status warnings\n if (fragment.meta.status === \"deprecated\") {\n warnings.push({\n type: \"deprecated\",\n component: name,\n message: fragment.meta.description\n ? `\"${name}\" is deprecated: ${fragment.meta.description}`\n : `\"${name}\" is deprecated`,\n });\n } else if (fragment.meta.status === \"experimental\") {\n warnings.push({\n type: \"experimental\",\n component: name,\n message: `\"${name}\" is experimental and may change without notice`,\n });\n }\n }\n\n // 5. Category gap analysis\n const selectedCategories = new Set(\n components.map((name) => fragments[name].meta.category)\n );\n\n for (const [category, affinities] of Object.entries(CATEGORY_AFFINITIES)) {\n if (!selectedCategories.has(category)) continue;\n\n for (const neededCategory of affinities) {\n if (selectedCategories.has(neededCategory)) continue;\n\n // Find the best component from the needed category\n const candidate = findBestCategoryCandidate(\n fragments,\n neededCategory,\n selectedSet,\n suggestedSet\n );\n if (candidate) {\n suggestions.push({\n component: candidate,\n reason: `Compositions using \"${category}\" components often benefit from a \"${neededCategory}\" component`,\n relationship: \"category_gap\",\n sourceComponent: components.find(\n (n) => fragments[n].meta.category === category\n )!,\n });\n suggestedSet.add(candidate);\n }\n }\n }\n\n // 6. Graph-enhanced analysis (when graph data is available)\n if (options?.graph) {\n const engine = new ComponentGraphEngine(options.graph);\n\n // Add graph-based dependency warnings\n for (const name of components) {\n const deps = engine.dependencies(name, [\"imports\", \"hook-depends\"]);\n for (const dep of deps) {\n if (\n !selectedSet.has(dep.target) &&\n !suggestedSet.has(dep.target) &&\n allNames.has(dep.target)\n ) {\n suggestions.push({\n component: dep.target,\n reason: `\"${name}\" ${dep.type === \"hook-depends\" ? \"uses a hook from\" : \"imports\"} \"${dep.target}\"`,\n relationship: \"composition\",\n sourceComponent: name,\n });\n suggestedSet.add(dep.target);\n }\n }\n }\n\n // Add block-based suggestions\n for (const name of components) {\n const blocks = engine.blocksUsing(name);\n for (const blockName of blocks) {\n // Find other components in this block that aren't selected\n const blockComps = options.graph.edges\n .filter(\n (e) =>\n e.type === \"composes\" &&\n e.provenance === `block:${blockName}` &&\n (e.source === name || e.target === name)\n )\n .map((e) => (e.source === name ? e.target : e.source));\n\n for (const comp of blockComps) {\n if (\n !selectedSet.has(comp) &&\n !suggestedSet.has(comp) &&\n allNames.has(comp)\n ) {\n suggestions.push({\n component: comp,\n reason: `\"${name}\" and \"${comp}\" are used together in the \"${blockName}\" block`,\n relationship: \"composition\",\n sourceComponent: name,\n });\n suggestedSet.add(comp);\n }\n }\n }\n }\n }\n\n return { components, unknown, warnings, suggestions, guidelines };\n}\n\n/**\n * Find the best candidate component from a given category.\n * Prefers stable components and avoids already-selected or already-suggested ones.\n */\nfunction findBestCategoryCandidate(\n fragments: Record<string, CompiledFragment>,\n category: string,\n selectedSet: Set<string>,\n suggestedSet: Set<string>\n): string | null {\n let best: string | null = null;\n let bestScore = -1;\n\n for (const [name, fragment] of Object.entries(fragments)) {\n if (fragment.meta.category !== category) continue;\n if (selectedSet.has(name) || suggestedSet.has(name)) continue;\n\n const status = fragment.meta.status ?? \"stable\";\n let score = 0;\n if (status === \"stable\") score = 3;\n else if (status === \"beta\") score = 2;\n else if (status === \"experimental\") score = 1;\n // deprecated gets 0\n\n if (score > bestScore) {\n bestScore = score;\n best = name;\n }\n }\n\n return best;\n}\n","import { useEffect, useState, type ReactNode } from \"react\";\nimport type { VariantLoader, VariantRenderOptions } from \"./types.js\";\n\n/**\n * Minimal contract for rendering a preview variant.\n * Compatible with fragment variants and Storybook-adapted variants.\n */\nexport interface PreviewVariantLike {\n render: (options?: VariantRenderOptions) => ReactNode;\n loaders?: VariantLoader[];\n}\n\nexport interface PreviewRuntimeState {\n content: ReactNode | null;\n isLoading: boolean;\n error: Error | null;\n loadedData?: Record<string, unknown>;\n}\n\nexport interface PreviewRuntimeOptions {\n variant?: PreviewVariantLike | null;\n loadedData?: Record<string, unknown>;\n}\n\nconst EMPTY_STATE: PreviewRuntimeState = {\n content: null,\n isLoading: false,\n error: null,\n loadedData: undefined,\n};\n\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\n/**\n * Execute all variant loaders and merge their payloads.\n * `loadedData` is applied last so host-level overrides win.\n */\nexport async function executeVariantLoaders(\n loaders: VariantLoader[] | undefined,\n loadedData?: Record<string, unknown>,\n): Promise<Record<string, unknown> | undefined> {\n const hasLoaders = !!loaders && loaders.length > 0;\n if (!hasLoaders) {\n return loadedData;\n }\n\n const results = await Promise.all(loaders.map((loader) => loader()));\n const mergedFromLoaders = results.reduce<Record<string, unknown>>(\n (acc, result) => ({ ...acc, ...result }),\n {},\n );\n\n return loadedData ? { ...mergedFromLoaders, ...loadedData } : mergedFromLoaders;\n}\n\n/**\n * Resolve a full runtime state (loader execution + render) in one async call.\n * This is useful for testing and for hook/component orchestration.\n */\nexport async function resolvePreviewRuntimeState(\n options: PreviewRuntimeOptions,\n): Promise<PreviewRuntimeState> {\n const { variant, loadedData } = options;\n if (!variant) {\n return EMPTY_STATE;\n }\n\n try {\n const mergedLoadedData = await executeVariantLoaders(variant.loaders, loadedData);\n const content = variant.render({ loadedData: mergedLoadedData });\n return {\n content,\n isLoading: false,\n error: null,\n loadedData: mergedLoadedData,\n };\n } catch (error) {\n return {\n content: null,\n isLoading: false,\n error: toError(error),\n loadedData: undefined,\n };\n }\n}\n\n/**\n * Hook for rendering a preview variant with loader support.\n */\nexport function usePreviewVariantRuntime(\n options: PreviewRuntimeOptions,\n): PreviewRuntimeState {\n const { variant, loadedData } = options;\n const [state, setState] = useState<PreviewRuntimeState>(EMPTY_STATE);\n\n useEffect(() => {\n let cancelled = false;\n\n if (!variant) {\n setState(EMPTY_STATE);\n return () => {\n cancelled = true;\n };\n }\n\n const hasLoaders = !!variant.loaders && variant.loaders.length > 0;\n setState({\n content: null,\n isLoading: hasLoaders,\n error: null,\n loadedData: undefined,\n });\n\n resolvePreviewRuntimeState({ variant, loadedData }).then((nextState) => {\n if (!cancelled) {\n setState(nextState);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [variant, loadedData]);\n\n return state;\n}\n\ninterface PreviewVariantRuntimeProps extends PreviewRuntimeOptions {\n children: (state: PreviewRuntimeState) => ReactNode;\n}\n\n/**\n * Render-prop component wrapper around `usePreviewVariantRuntime`.\n */\nexport function PreviewVariantRuntime({\n variant,\n loadedData,\n children,\n}: PreviewVariantRuntimeProps) {\n const state = usePreviewVariantRuntime({ variant, loadedData });\n return <>{children(state)}</>;\n}\n","/**\n * Component discovery utilities.\n *\n * Extracted from the docs app component-registry so that any consumer\n * (govern presets, CLI tools, third-party integrations) can discover\n * components from a module's exports without duplicating the logic.\n */\n\n/**\n * Check if a value is likely a React component.\n * Functions or objects with $$typeof (forwardRef, memo) qualify.\n */\nexport function isReactComponent(value: unknown): boolean {\n if (!value) return false;\n\n // Function component (most common case)\n if (typeof value === 'function') {\n return true;\n }\n\n // ForwardRef, memo, etc. have $$typeof\n if (typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n if (obj.$$typeof) return true;\n }\n\n return false;\n}\n\nexport interface DiscoverComponentsOptions {\n /** Set of export names to skip */\n exclude?: Set<string>;\n}\n\n/**\n * Discover all components and sub-components from a module's exports.\n * Returns a sorted array of component names including compound names (e.g. 'Card.Header').\n *\n * @param moduleExports - The exports object from a component library (e.g. `import * as UI from '@fragments-sdk/ui'`)\n * @param options - Optional configuration\n */\nexport function discoverComponents(\n moduleExports: Record<string, unknown>,\n options?: DiscoverComponentsOptions,\n): string[] {\n const exclude = options?.exclude;\n const names: string[] = [];\n\n for (const [exportName, exportValue] of Object.entries(moduleExports)) {\n // Skip excluded exports\n if (exclude?.has(exportName)) continue;\n\n // Skip non-components (types, constants, etc.)\n if (!isReactComponent(exportValue)) continue;\n\n // Skip lowercase exports (likely utilities)\n if (exportName[0] !== exportName[0].toUpperCase()) continue;\n\n // Add the main component\n names.push(exportName);\n\n // Check for sub-components by looking at ALL properties of the component\n const componentObj = exportValue as Record<string, unknown>;\n\n for (const key of Object.keys(componentObj)) {\n // Skip internal properties and non-component properties\n if (key.startsWith('_') || key.startsWith('$')) continue;\n if (key === 'displayName' || key === 'propTypes' || key === 'defaultProps') continue;\n // Skip 'render' which is a forwardRef internal, and 'Tabbed' which is a special variant\n if (key === 'render' || key === 'Tabbed') continue;\n\n const subComponent = componentObj[key];\n if (isReactComponent(subComponent)) {\n names.push(`${exportName}.${key}`);\n }\n }\n }\n\n return names.sort();\n}\n"],"mappings":"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","names":["z","figma","children"]}
|