@usefragments/core 1.0.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.
Files changed (228) hide show
  1. package/LICENSE +21 -0
  2. package/dist/chunk-243QYRUF.js +2145 -0
  3. package/dist/chunk-243QYRUF.js.map +1 -0
  4. package/dist/chunk-3LLRNCPX.js +111 -0
  5. package/dist/chunk-3LLRNCPX.js.map +1 -0
  6. package/dist/chunk-EIYNNS77.js +48 -0
  7. package/dist/chunk-EIYNNS77.js.map +1 -0
  8. package/dist/chunk-JNBFJ34I.js +326 -0
  9. package/dist/chunk-JNBFJ34I.js.map +1 -0
  10. package/dist/chunk-R3X7UBHU.js +228 -0
  11. package/dist/chunk-R3X7UBHU.js.map +1 -0
  12. package/dist/chunk-SH4KPIYH.js +393 -0
  13. package/dist/chunk-SH4KPIYH.js.map +1 -0
  14. package/dist/chunk-V4VQB57N.js +56 -0
  15. package/dist/chunk-V4VQB57N.js.map +1 -0
  16. package/dist/chunk-X34IA4LR.js +319 -0
  17. package/dist/chunk-X34IA4LR.js.map +1 -0
  18. package/dist/chunk-YF65VYRY.js +493 -0
  19. package/dist/chunk-YF65VYRY.js.map +1 -0
  20. package/dist/codes/index.d.ts +40 -0
  21. package/dist/codes/index.js +23 -0
  22. package/dist/codes/index.js.map +1 -0
  23. package/dist/compiled-types/index.d.ts +5 -0
  24. package/dist/compiled-types/index.js +1 -0
  25. package/dist/compiled-types/index.js.map +1 -0
  26. package/dist/generate/index.d.ts +47 -0
  27. package/dist/generate/index.js +11 -0
  28. package/dist/generate/index.js.map +1 -0
  29. package/dist/governance-BOa3KyiJ.d.ts +3279 -0
  30. package/dist/graph/index.d.ts +66 -0
  31. package/dist/graph/index.js +17 -0
  32. package/dist/graph/index.js.map +1 -0
  33. package/dist/index.d.ts +11388 -0
  34. package/dist/index.js +8711 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/package-identity.d.ts +42 -0
  37. package/dist/package-identity.js +23 -0
  38. package/dist/package-identity.js.map +1 -0
  39. package/dist/preview/index.d.ts +484 -0
  40. package/dist/preview/index.js +1129 -0
  41. package/dist/preview/index.js.map +1 -0
  42. package/dist/react-types.d.ts +22 -0
  43. package/dist/react-types.js +1 -0
  44. package/dist/react-types.js.map +1 -0
  45. package/dist/registry.d.ts +2367 -0
  46. package/dist/registry.js +62 -0
  47. package/dist/registry.js.map +1 -0
  48. package/dist/schemas/index.d.ts +2584 -0
  49. package/dist/schemas/index.js +55 -0
  50. package/dist/schemas/index.js.map +1 -0
  51. package/dist/severity.d.ts +18 -0
  52. package/dist/severity.js +27 -0
  53. package/dist/severity.js.map +1 -0
  54. package/dist/test-utils.d.ts +14 -0
  55. package/dist/test-utils.js +63 -0
  56. package/dist/test-utils.js.map +1 -0
  57. package/dist/topology/index.d.ts +48 -0
  58. package/dist/topology/index.js +7 -0
  59. package/dist/topology/index.js.map +1 -0
  60. package/dist/types-xJ2xyp_G.d.ts +119 -0
  61. package/package.json +120 -0
  62. package/src/__tests__/contract-parser.test.ts +614 -0
  63. package/src/__tests__/dtcg-generators.test.ts +439 -0
  64. package/src/__tests__/dtcg-parser.test.ts +884 -0
  65. package/src/__tests__/preview-runtime.test.tsx +111 -0
  66. package/src/__tests__/schema.test.ts +31 -0
  67. package/src/__tests__/severity.test.ts +34 -0
  68. package/src/__tests__/style-comparison.test.ts +662 -0
  69. package/src/__tests__/tokens-compat.test.ts +51 -0
  70. package/src/agent-format.test.ts +105 -0
  71. package/src/agent-format.ts +141 -0
  72. package/src/bundle.ts +149 -0
  73. package/src/codes/__tests__/codes.test.ts +73 -0
  74. package/src/codes/codes.ts +463 -0
  75. package/src/codes/index.ts +7 -0
  76. package/src/codes/source-finding-bridge.ts +113 -0
  77. package/src/compiled-types/index.ts +293 -0
  78. package/src/component-contract.ts +231 -0
  79. package/src/component-discovery.ts +80 -0
  80. package/src/composition.test.ts +262 -0
  81. package/src/composition.ts +318 -0
  82. package/src/config-paths.test.ts +78 -0
  83. package/src/config-paths.ts +47 -0
  84. package/src/config.ts +18 -0
  85. package/src/conform-prove.test.ts +274 -0
  86. package/src/conform-prove.ts +326 -0
  87. package/src/conform.ts +160 -0
  88. package/src/constants.ts +114 -0
  89. package/src/context.ts +2 -0
  90. package/src/contract/fixture.ts +110 -0
  91. package/src/contract/hash.test.ts +86 -0
  92. package/src/contract/hash.ts +195 -0
  93. package/src/contract/index.ts +43 -0
  94. package/src/contract/preimage.test.ts +254 -0
  95. package/src/contract/preimage.ts +365 -0
  96. package/src/contract/stamp.test.ts +100 -0
  97. package/src/contract/stamp.ts +105 -0
  98. package/src/contract-parser.ts +141 -0
  99. package/src/defineFragment.test.ts +257 -0
  100. package/src/defineFragment.ts +293 -0
  101. package/src/dtcg-generators.ts +324 -0
  102. package/src/dtcg-parser.ts +1 -0
  103. package/src/dtcg.ts +237 -0
  104. package/src/facts/__snapshots__/facts.test.ts.snap +124 -0
  105. package/src/facts/builders.ts +835 -0
  106. package/src/facts/compile.ts +422 -0
  107. package/src/facts/fact-index.ts +394 -0
  108. package/src/facts/facts.test.ts +494 -0
  109. package/src/facts/ids.ts +125 -0
  110. package/src/facts/index.ts +119 -0
  111. package/src/facts/types.ts +614 -0
  112. package/src/figma.ts +263 -0
  113. package/src/fragment-types.ts +214 -0
  114. package/src/generate/generate.test.ts +594 -0
  115. package/src/generate/index.ts +438 -0
  116. package/src/governance-integrity.test.ts +186 -0
  117. package/src/governance-integrity.ts +282 -0
  118. package/src/governance.test.ts +300 -0
  119. package/src/governance.ts +605 -0
  120. package/src/governance.type-test.ts +75 -0
  121. package/src/graph/engine.ts +446 -0
  122. package/src/graph/graph.test.ts +746 -0
  123. package/src/graph/index.ts +32 -0
  124. package/src/graph/serialization.ts +55 -0
  125. package/src/graph/types.ts +178 -0
  126. package/src/index.ts +891 -0
  127. package/src/local-canonical.ts +102 -0
  128. package/src/mcp-snapshot.ts +222 -0
  129. package/src/package-identity-match.ts +33 -0
  130. package/src/package-identity.generated.ts +233 -0
  131. package/src/package-identity.test.ts +99 -0
  132. package/src/package-identity.ts +157 -0
  133. package/src/performance-presets.ts +142 -0
  134. package/src/preview/comparison-artifact.test.ts +228 -0
  135. package/src/preview/comparison-artifact.ts +181 -0
  136. package/src/preview/comparison-context.ts +93 -0
  137. package/src/preview/comparison-evidence.ts +112 -0
  138. package/src/preview/comparison-format.ts +21 -0
  139. package/src/preview/comparison-presentation.ts +187 -0
  140. package/src/preview/comparison-references.test.ts +430 -0
  141. package/src/preview/comparison-references.ts +72 -0
  142. package/src/preview/comparison-score.ts +59 -0
  143. package/src/preview/comparison-styles.ts +197 -0
  144. package/src/preview/comparison.test.ts +559 -0
  145. package/src/preview/comparison.ts +488 -0
  146. package/src/preview/index.ts +10 -0
  147. package/src/preview/types.ts +309 -0
  148. package/src/preview/validation.test.ts +290 -0
  149. package/src/preview/validation.ts +356 -0
  150. package/src/preview-runtime.tsx +144 -0
  151. package/src/raw-html-canonical.test.ts +41 -0
  152. package/src/raw-html-canonical.ts +179 -0
  153. package/src/react-types.ts +21 -0
  154. package/src/registry-install-plan.ts +344 -0
  155. package/src/registry.test.ts +245 -0
  156. package/src/registry.ts +369 -0
  157. package/src/rules/a11y-required-accessible-name.ts +93 -0
  158. package/src/rules/color-math.test.ts +72 -0
  159. package/src/rules/color-math.ts +192 -0
  160. package/src/rules/components-forbidden-prop-value.ts +108 -0
  161. package/src/rules/components-prefer-library.ts +943 -0
  162. package/src/rules/components-unknown-prop.ts +94 -0
  163. package/src/rules/composition-pattern-schema.ts +125 -0
  164. package/src/rules/composition-pattern.test.ts +320 -0
  165. package/src/rules/composition-pattern.ts +271 -0
  166. package/src/rules/emit-gate.test.ts +42 -0
  167. package/src/rules/emit-gate.ts +60 -0
  168. package/src/rules/finding.ts +54 -0
  169. package/src/rules/index.ts +235 -0
  170. package/src/rules/jsx-preferred-component.ts +68 -0
  171. package/src/rules/jsx-preferred-import-path.ts +67 -0
  172. package/src/rules/presets.ts +57 -0
  173. package/src/rules/props-invalid-value.ts +115 -0
  174. package/src/rules/rules.test.ts +3636 -0
  175. package/src/rules/spacing-resolution.ts +184 -0
  176. package/src/rules/styles-no-raw-color.ts +329 -0
  177. package/src/rules/styles-no-raw-dimensions.ts +357 -0
  178. package/src/rules/styles-no-raw-spacing.ts +236 -0
  179. package/src/rules/styles-no-raw-typography.ts +237 -0
  180. package/src/rules/tailwind-arbitrary-color.test.ts +128 -0
  181. package/src/rules/tailwind-arbitrary-color.ts +93 -0
  182. package/src/rules/tailwind-arbitrary-spacing.test.ts +157 -0
  183. package/src/rules/tailwind-arbitrary-spacing.ts +120 -0
  184. package/src/rules/tailwind-forbidden-palette.test.ts +116 -0
  185. package/src/rules/tailwind-forbidden-palette.ts +107 -0
  186. package/src/rules/tailwind-off-scale-spacing-token.test.ts +100 -0
  187. package/src/rules/tailwind-off-scale-spacing-token.ts +108 -0
  188. package/src/rules/tailwind-raw-color-via-token.test.ts +108 -0
  189. package/src/rules/tailwind-raw-color-via-token.ts +82 -0
  190. package/src/rules/tailwind-rule-utils.ts +106 -0
  191. package/src/rules/tailwind-unknown-class.test.ts +157 -0
  192. package/src/rules/tailwind-unknown-class.ts +121 -0
  193. package/src/rules/taxonomy.test.ts +238 -0
  194. package/src/rules/theme-no-theme-coupled-literal.ts +132 -0
  195. package/src/rules/tiers.ts +111 -0
  196. package/src/rules/tokens-css-vars-must-be-defined.test.ts +244 -0
  197. package/src/rules/tokens-css-vars-must-be-defined.ts +156 -0
  198. package/src/rules/tokens-require-dual-fallback.ts +78 -0
  199. package/src/rules/types.ts +27 -0
  200. package/src/rules/utils.test.ts +110 -0
  201. package/src/rules/utils.ts +599 -0
  202. package/src/schema.ts +427 -0
  203. package/src/schemas/index.ts +275 -0
  204. package/src/schemas/schemas.test.ts +124 -0
  205. package/src/severity.ts +54 -0
  206. package/src/storyAdapter.test.ts +571 -0
  207. package/src/storyAdapter.ts +761 -0
  208. package/src/storyFilters.test.ts +350 -0
  209. package/src/storyFilters.ts +253 -0
  210. package/src/storybook-csf.ts +11 -0
  211. package/src/style-comparison.ts +423 -0
  212. package/src/test-utils.ts +68 -0
  213. package/src/token-parser.ts +2 -0
  214. package/src/token-types.ts +287 -0
  215. package/src/tokens/categories.ts +131 -0
  216. package/src/tokens/color.ts +193 -0
  217. package/src/tokens/design-token-parser.test.ts +159 -0
  218. package/src/tokens/design-token-parser.ts +402 -0
  219. package/src/tokens/dtcg.ts +428 -0
  220. package/src/tokens/index.ts +130 -0
  221. package/src/tokens/lookup.ts +19 -0
  222. package/src/tokens/scss.ts +171 -0
  223. package/src/tokens/tailwind-v4.ts +187 -0
  224. package/src/tokens/types.ts +43 -0
  225. package/src/topology/index.ts +9 -0
  226. package/src/topology/resolve-area.test.ts +174 -0
  227. package/src/topology/resolve-area.ts +215 -0
  228. package/src/types.ts +1057 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/preview/comparison-context.ts","../../src/preview/comparison-score.ts","../../src/preview/comparison-styles.ts","../../src/preview/comparison-format.ts","../../src/preview/comparison-evidence.ts","../../src/preview/comparison-references.ts","../../src/preview/comparison.ts","../../src/preview/comparison-artifact.ts","../../src/preview/comparison-presentation.ts","../../src/preview/validation.ts"],"sourcesContent":["import type {\n PreviewComponentDefinition,\n PreviewDesignComparisonReference,\n PreviewViewport,\n} from \"./types\";\nimport type {\n BuildPreviewComparisonReportInput,\n PreviewComparisonContext,\n PreviewComparisonContextMismatch,\n PreviewComparisonFinding,\n PreviewComparisonReferenceScope,\n} from \"./comparison\";\n\nexport function analyzeComparisonContext(\n comparison: PreviewDesignComparisonReference | undefined,\n preview: BuildPreviewComparisonReportInput[\"preview\"] | undefined,\n variantId: string | undefined,\n component: PreviewComponentDefinition,\n scope: PreviewComparisonReferenceScope\n): { context?: PreviewComparisonContext; findings: PreviewComparisonFinding[] } {\n const expected = comparison?.state;\n if (!expected) return { findings: [] };\n const actual = {\n variantId: preview?.variantId ?? variantId,\n theme: preview?.theme,\n viewport: preview?.viewport,\n };\n\n const staleReasons: PreviewComparisonContextMismatch[] = [];\n const mismatchLabels: string[] = [];\n\n const expectedVariantStillExists =\n !expected.variantId || component.variants.some((variant) => variant.id === expected.variantId);\n if (\n scope === \"variant\" &&\n expected.variantId &&\n expectedVariantStillExists &&\n actual.variantId &&\n expected.variantId !== actual.variantId\n ) {\n staleReasons.push(\"variant\");\n mismatchLabels.push(`variant ${actual.variantId}`);\n }\n if (expected.theme && actual.theme && expected.theme !== actual.theme) {\n staleReasons.push(\"theme\");\n mismatchLabels.push(`theme ${actual.theme}`);\n }\n if (expected.viewport && actual.viewport && !sameViewport(expected.viewport, actual.viewport)) {\n staleReasons.push(\"viewport\");\n mismatchLabels.push(`viewport ${formatViewport(actual.viewport)}`);\n }\n\n const context = {\n scope,\n captured: expected,\n active: actual,\n stale: staleReasons.length > 0,\n staleReasons,\n };\n\n if (staleReasons.length === 0) return { context, findings: [] };\n\n return {\n context,\n findings: [\n {\n code: \"stale-comparison-signal\",\n severity: \"warning\",\n message: `Stored comparison evidence was captured for ${formatComparisonState(\n expected\n )}; current preview uses ${mismatchLabels.join(\", \")}.`,\n },\n ],\n };\n}\n\nfunction sameViewport(a: PreviewViewport, b: PreviewViewport): boolean {\n return a.width === b.width && a.height === b.height && a.background === b.background;\n}\n\nfunction formatComparisonState(state: NonNullable<PreviewDesignComparisonReference[\"state\"]>) {\n return [\n state.variantId ? `variant ${state.variantId}` : undefined,\n state.theme ? `theme ${state.theme}` : undefined,\n state.viewport ? `viewport ${formatViewport(state.viewport)}` : undefined,\n ]\n .filter(Boolean)\n .join(\", \");\n}\n\nfunction formatViewport(viewport: PreviewViewport): string {\n return `${viewport.width}x${viewport.height}`;\n}\n","import type {\n PreviewComparisonFinding,\n PreviewComparisonReport,\n PreviewComparisonStatus,\n} from \"./comparison\";\n\nexport function scoreComparison(parts: {\n image: PreviewComparisonReport[\"image\"] | undefined;\n dimensions: PreviewComparisonReport[\"dimensions\"] | undefined;\n styles: PreviewComparisonReport[\"styles\"] | undefined;\n}): number | null {\n const scores: Array<{ weight: number; score: number }> = [];\n\n if (parts.image) {\n scores.push({\n weight: 0.5,\n score: Math.max(0, 100 - parts.image.diffPercentage * 10),\n });\n }\n\n if (parts.dimensions) {\n const delta = Math.abs(parts.dimensions.delta.width) + Math.abs(parts.dimensions.delta.height);\n scores.push({ weight: 0.15, score: Math.max(0, 100 - delta * 2) });\n }\n\n if (parts.styles) {\n const matches = parts.styles.properties.filter((property) => property.match).length;\n scores.push({ weight: 0.35, score: (matches / parts.styles.properties.length) * 100 });\n }\n\n if (scores.length === 0) return null;\n\n const totalWeight = scores.reduce((sum, item) => sum + item.weight, 0);\n const weighted = scores.reduce((sum, item) => sum + item.score * item.weight, 0);\n return Math.round(weighted / totalWeight);\n}\n\nexport function resolveStatus(\n score: number | null,\n findings: PreviewComparisonFinding[]\n): PreviewComparisonStatus {\n if (score === null) return \"incomplete\";\n if (findings.some((finding) => finding.severity === \"error\")) return \"fail\";\n if (findings.some((finding) => finding.severity === \"warning\")) return \"review\";\n if (score >= 90) return \"pass\";\n if (score >= 65) return \"review\";\n return \"fail\";\n}\n\nexport function summarizeStatus(\n status: PreviewComparisonStatus,\n score: number | null,\n findings: PreviewComparisonFinding[]\n): string {\n if (score === null) return \"Comparison needs at least one captured signal.\";\n if (status === \"pass\") return `Preview matches the Figma reference (${score}/100).`;\n const issueCount = findings.length === 1 ? \"1 issue\" : `${findings.length} issues`;\n return `Preview needs ${status === \"fail\" ? \"changes\" : \"review\"} (${score}/100, ${issueCount}).`;\n}\n","import type {\n PreviewComparisonFinding,\n PreviewComparisonReport,\n PreviewComparisonStyleMap,\n PreviewComparisonThresholds,\n PreviewStyleComparisonItem,\n} from \"./comparison\";\n\nconst COLOR_PROPERTIES = new Set([\n \"background\",\n \"backgroundColor\",\n \"borderColor\",\n \"color\",\n \"fill\",\n \"stroke\",\n]);\n\nconst NUMERIC_PROPERTIES = new Set([\n \"borderRadius\",\n \"borderWidth\",\n \"fontSize\",\n \"gap\",\n \"height\",\n \"letterSpacing\",\n \"lineHeight\",\n \"margin\",\n \"opacity\",\n \"padding\",\n \"width\",\n]);\n\nexport function compareStyles(\n design: PreviewComparisonStyleMap | undefined,\n preview: PreviewComparisonStyleMap | undefined,\n thresholds: PreviewComparisonThresholds,\n findings: PreviewComparisonFinding[]\n): PreviewComparisonReport[\"styles\"] | undefined {\n if (!design || !preview) return undefined;\n\n const properties: PreviewStyleComparisonItem[] = [];\n\n for (const [property, designValue] of Object.entries(design)) {\n if (designValue === undefined || designValue === \"\") continue;\n\n const previewValue = preview[property] ?? \"(not set)\";\n const match = compareStyleValue(property, designValue, previewValue, thresholds);\n properties.push({ property, design: designValue, preview: previewValue, match });\n\n if (!match) {\n findings.push({\n code: \"style-mismatch\",\n severity: \"warning\",\n message: `${property} differs between Figma and the preview.`,\n property,\n designValue,\n previewValue,\n });\n }\n }\n\n if (properties.length === 0) return undefined;\n\n return {\n match: properties.every((property) => property.match),\n properties,\n };\n}\n\nfunction compareStyleValue(\n property: string,\n designValue: string,\n previewValue: string,\n thresholds: PreviewComparisonThresholds\n): boolean {\n const design = normalizeStyleValue(designValue);\n const preview = normalizeStyleValue(previewValue);\n if (design === preview) return true;\n if (COLOR_PROPERTIES.has(property)) {\n return compareColors(design, preview, thresholds);\n }\n if (NUMERIC_PROPERTIES.has(property)) {\n return compareNumericValues(design, preview, thresholds.numericPx);\n }\n return false;\n}\n\nfunction normalizeStyleValue(value: string): string {\n return value\n .trim()\n .replace(/\\s+/g, \" \")\n .replace(/^none$/, \"\");\n}\n\nfunction compareNumericValues(valueA: string, valueB: string, tolerance: number): boolean {\n const numberA = Number.parseFloat(valueA);\n const numberB = Number.parseFloat(valueB);\n if (Number.isNaN(numberA) || Number.isNaN(numberB)) return valueA === valueB;\n return Math.abs(numberA - numberB) <= tolerance;\n}\n\nfunction compareColors(\n valueA: string,\n valueB: string,\n thresholds: PreviewComparisonThresholds\n): boolean {\n const colorA = parseColor(valueA);\n const colorB = parseColor(valueB);\n if (!colorA || !colorB) return valueA === valueB;\n\n return (\n Math.abs(colorA.r - colorB.r) <= thresholds.colorChannel &&\n Math.abs(colorA.g - colorB.g) <= thresholds.colorChannel &&\n Math.abs(colorA.b - colorB.b) <= thresholds.colorChannel &&\n Math.abs(colorA.a - colorB.a) <= thresholds.alpha\n );\n}\n\nfunction parseColor(value: string): { r: number; g: number; b: number; a: number } | null {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"transparent\") return { r: 0, g: 0, b: 0, a: 0 };\n\n const hex = normalized.match(/^#([0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})$/);\n if (hex) return parseHexColor(hex[1]);\n\n const rgb = normalized.match(/^rgba?\\(([^)]+)\\)$/);\n if (rgb) return parseRgbColor(rgb[1]);\n\n return null;\n}\n\nfunction parseHexColor(raw: string): { r: number; g: number; b: number; a: number } {\n const expanded =\n raw.length === 3 || raw.length === 4\n ? raw\n .split(\"\")\n .map((part) => part + part)\n .join(\"\")\n : raw;\n\n return {\n r: Number.parseInt(expanded.slice(0, 2), 16),\n g: Number.parseInt(expanded.slice(2, 4), 16),\n b: Number.parseInt(expanded.slice(4, 6), 16),\n a: expanded.length === 8 ? Number.parseInt(expanded.slice(6, 8), 16) / 255 : 1,\n };\n}\n\nfunction parseRgbColor(value: string): { r: number; g: number; b: number; a: number } | null {\n const channels = splitRgbChannels(value);\n if (channels.length < 3 || channels.length > 4) return null;\n\n const [rawR, rawG, rawB, rawA] = channels;\n const r = parseRgbChannel(rawR);\n const g = parseRgbChannel(rawG);\n const b = parseRgbChannel(rawB);\n const a = rawA === undefined ? 1 : parseAlphaChannel(rawA);\n if (r === null || g === null || b === null || a === null) return null;\n\n return { r, g, b, a };\n}\n\nfunction splitRgbChannels(value: string): string[] {\n if (value.includes(\",\")) {\n return value.split(\",\").map((part) => part.trim());\n }\n\n const parts = value\n .replace(/\\s*\\/\\s*/g, \" / \")\n .split(/\\s+/)\n .filter(Boolean);\n const slashIndex = parts.indexOf(\"/\");\n if (slashIndex === -1) return parts;\n\n return [...parts.slice(0, slashIndex), parts[slashIndex + 1]].filter(\n (part): part is string => part !== undefined\n );\n}\n\nfunction parseRgbChannel(value: string): number | null {\n if (value.endsWith(\"%\")) {\n const percentage = Number.parseFloat(value);\n return Number.isFinite(percentage) ? (percentage / 100) * 255 : null;\n }\n\n const channel = Number.parseFloat(value);\n return Number.isFinite(channel) ? channel : null;\n}\n\nfunction parseAlphaChannel(value: string): number | null {\n if (value.endsWith(\"%\")) {\n const percentage = Number.parseFloat(value);\n return Number.isFinite(percentage) ? percentage / 100 : null;\n }\n\n const alpha = Number.parseFloat(value);\n return Number.isFinite(alpha) ? alpha : null;\n}\n","import type { PreviewComparisonSize } from \"./comparison\";\n\nexport function formatPercent(value: number): string {\n return `${round(value)}%`;\n}\n\nexport function formatDelta(value: number): string {\n return value > 0 ? `+${round(value)}` : `${round(value)}`;\n}\n\nexport function formatSize(size: PreviewComparisonSize): string {\n return `${round(size.width)} x ${round(size.height)}`;\n}\n\nexport function formatInteger(value: number): string {\n return Math.round(value).toLocaleString(\"en-US\");\n}\n\nexport function round(value: number): number {\n return Math.round(value * 100) / 100;\n}\n","import type {\n PreviewComparisonBounds,\n PreviewComparisonFinding,\n PreviewComparisonSize,\n PreviewImageDiffInput,\n} from \"./comparison\";\n\nexport interface NormalizedImageDiffEvidence {\n diffPercentage: number;\n changedRegions: PreviewComparisonBounds[];\n diffImageDataUrl?: string;\n diffImageUrl?: string;\n diffPixelCount?: number;\n totalPixels?: number;\n}\n\nexport function normalizeImageDiffEvidence(\n imageDiff: PreviewImageDiffInput,\n findings: PreviewComparisonFinding[]\n): NormalizedImageDiffEvidence | undefined {\n if (!isValidPercentage(imageDiff.diffPercentage)) {\n findings.push({\n code: \"invalid-comparison-signal\",\n severity: \"warning\",\n message: \"Image diff percentage must be a finite number between 0 and 100.\",\n });\n return undefined;\n }\n\n return {\n diffPercentage: imageDiff.diffPercentage,\n changedRegions: normalizeChangedRegions(imageDiff.changedRegions, findings),\n ...(imageDiff.diffImageDataUrl && { diffImageDataUrl: imageDiff.diffImageDataUrl }),\n ...(imageDiff.diffImageUrl && { diffImageUrl: imageDiff.diffImageUrl }),\n ...normalizePixelCounts(imageDiff, findings),\n };\n}\n\nexport function isPositiveComparisonSize(value: PreviewComparisonSize): boolean {\n return (\n Number.isFinite(value.width) &&\n Number.isFinite(value.height) &&\n value.width > 0 &&\n value.height > 0\n );\n}\n\nfunction normalizeChangedRegions(\n regions: PreviewComparisonBounds[] | undefined,\n findings: PreviewComparisonFinding[]\n): PreviewComparisonBounds[] {\n if (!regions) return [];\n\n const validRegions: PreviewComparisonBounds[] = [];\n for (const region of regions) {\n if (isValidBounds(region)) {\n validRegions.push(region);\n continue;\n }\n findings.push({\n code: \"invalid-comparison-signal\",\n severity: \"warning\",\n message: \"Changed regions must use finite non-negative coordinates and positive sizes.\",\n });\n }\n return validRegions;\n}\n\nfunction normalizePixelCounts(\n imageDiff: PreviewImageDiffInput,\n findings: PreviewComparisonFinding[]\n): Pick<NormalizedImageDiffEvidence, \"diffPixelCount\" | \"totalPixels\"> {\n const { diffPixelCount, totalPixels } = imageDiff;\n if (diffPixelCount === undefined && totalPixels === undefined) return {};\n\n if (\n !Number.isInteger(diffPixelCount) ||\n !Number.isInteger(totalPixels) ||\n diffPixelCount === undefined ||\n totalPixels === undefined ||\n diffPixelCount < 0 ||\n totalPixels <= 0 ||\n diffPixelCount > totalPixels\n ) {\n findings.push({\n code: \"invalid-comparison-signal\",\n severity: \"warning\",\n message:\n \"Image diff pixel counts must be whole numbers with changed pixels less than or equal to total pixels.\",\n });\n return {};\n }\n\n return { diffPixelCount, totalPixels };\n}\n\nfunction isValidPercentage(value: number): boolean {\n return Number.isFinite(value) && value >= 0 && value <= 100;\n}\n\nfunction isValidBounds(value: PreviewComparisonBounds): boolean {\n return (\n Number.isFinite(value.x) &&\n Number.isFinite(value.y) &&\n Number.isFinite(value.width) &&\n Number.isFinite(value.height) &&\n value.x >= 0 &&\n value.y >= 0 &&\n value.width > 0 &&\n value.height > 0\n );\n}\n","import type { PreviewComponentDefinition, PreviewDesignReference } from \"./types\";\nimport type { FigmaDesignComparisonSource } from \"./comparison\";\n\nexport function parseFigmaNodeUrl(url: string): { fileKey: string; nodeId: string } | null {\n const parsed = parseUrl(url);\n if (!parsed || !isFigmaHostname(parsed.hostname)) return null;\n\n const [, surface, fileKey] = parsed.pathname.split(\"/\");\n if ((surface !== \"file\" && surface !== \"design\") || !fileKey) return null;\n\n const nodeId = parsed.searchParams.get(\"node-id\");\n if (!nodeId) return null;\n\n return { fileKey, nodeId: nodeId.replace(/-/g, \":\") };\n}\n\nexport function getPreviewDesignReference(\n component: PreviewComponentDefinition,\n variantId?: string\n): PreviewDesignReference | undefined {\n const variant = variantId\n ? component.variants.find((candidate) => candidate.id === variantId)\n : undefined;\n\n return normalizePreviewDesignReference(variant?.design ?? component.design);\n}\n\nexport function buildFigmaDesignSource(\n reference: PreviewDesignReference,\n fallbackLabel: string\n): FigmaDesignComparisonSource {\n const normalized = normalizePreviewDesignReference(reference);\n\n return {\n kind: \"figma\",\n label: normalized?.label ?? fallbackLabel,\n fileKey: normalized?.fileKey,\n nodeId: normalized?.nodeId,\n nodeUrl: normalized?.nodeUrl,\n imageUrl: normalized?.imageUrl,\n size: normalized?.size,\n };\n}\n\nexport function normalizePreviewDesignReference(\n reference: PreviewDesignReference | undefined\n): PreviewDesignReference | undefined {\n if (!reference) return undefined;\n if (reference.fileKey && reference.nodeId) return reference;\n if (!reference.nodeUrl) return reference;\n\n const parsed = parseFigmaNodeUrl(reference.nodeUrl);\n if (!parsed) return reference;\n\n return {\n ...reference,\n fileKey: reference.fileKey ?? parsed.fileKey,\n nodeId: reference.nodeId ?? parsed.nodeId,\n };\n}\n\nfunction isFigmaHostname(hostname: string): boolean {\n return hostname === \"figma.com\" || hostname.endsWith(\".figma.com\");\n}\n\nfunction parseUrl(url: string): URL | null {\n try {\n return new URL(url.includes(\"://\") ? url : `https://${url}`);\n } catch {\n return null;\n }\n}\n","import type {\n PreviewComponentDefinition,\n PreviewDesignComparisonReference,\n PreviewDesignComparisonState,\n PreviewDesignReference,\n PreviewViewport,\n} from \"./types\";\nimport { analyzeComparisonContext } from \"./comparison-context\";\nimport { scoreComparison, resolveStatus, summarizeStatus } from \"./comparison-score\";\nimport { compareStyles } from \"./comparison-styles\";\nimport { formatDelta, formatPercent, round } from \"./comparison-format\";\nimport { isPositiveComparisonSize, normalizeImageDiffEvidence } from \"./comparison-evidence\";\nimport { buildFigmaDesignSource, normalizePreviewDesignReference } from \"./comparison-references\";\n\nexport type PreviewComparisonSourceKind = \"figma\" | \"preview\";\n\nexport type PreviewComparisonStatus = \"pass\" | \"review\" | \"fail\" | \"incomplete\";\n\nexport type PreviewComparisonSeverity = \"info\" | \"warning\" | \"error\";\n\nexport interface PreviewComparisonSize {\n width: number;\n height: number;\n}\n\nexport interface PreviewComparisonBounds extends PreviewComparisonSize {\n x: number;\n y: number;\n}\n\nexport type PreviewComparisonStyleMap = Record<string, string | undefined>;\n\nexport interface PreviewComparisonSource {\n kind: PreviewComparisonSourceKind;\n label: string;\n imageDataUrl?: string;\n imageUrl?: string;\n size?: PreviewComparisonSize;\n styles?: PreviewComparisonStyleMap;\n capturedAt?: string;\n}\n\nexport interface FigmaDesignComparisonSource extends PreviewComparisonSource {\n kind: \"figma\";\n fileKey?: string;\n nodeId?: string;\n nodeUrl?: string;\n}\n\nexport interface RenderedPreviewComparisonSource extends PreviewComparisonSource {\n kind: \"preview\";\n componentKey: string;\n variantId?: string;\n theme?: string;\n viewport?: PreviewViewport;\n}\n\nexport interface PreviewComparisonThresholds {\n imageDiffPercentage: number;\n dimensionPx: number;\n numericPx: number;\n colorChannel: number;\n alpha: number;\n}\n\nexport interface PreviewImageDiffInput {\n diffPercentage: number;\n changedRegions?: PreviewComparisonBounds[];\n diffImageDataUrl?: string;\n diffImageUrl?: string;\n diffPixelCount?: number;\n totalPixels?: number;\n}\n\nexport interface PreviewComparisonInput {\n design: FigmaDesignComparisonSource;\n preview: RenderedPreviewComparisonSource;\n imageDiff?: PreviewImageDiffInput;\n thresholds?: Partial<PreviewComparisonThresholds>;\n findings?: PreviewComparisonFinding[];\n context?: PreviewComparisonContext;\n}\n\nexport interface BuildPreviewComparisonReportInput {\n component: PreviewComponentDefinition;\n variantId?: string;\n designReference?: PreviewDesignReference;\n designReferenceScope?: \"component\" | \"variant\";\n preview?: Partial<Omit<RenderedPreviewComparisonSource, \"kind\" | \"componentKey\">> & {\n componentKey?: string;\n };\n imageDiff?: PreviewImageDiffInput;\n thresholds?: Partial<PreviewComparisonThresholds>;\n}\n\nexport interface PreviewStyleComparisonItem {\n property: string;\n design: string;\n preview: string;\n match: boolean;\n}\n\nexport interface PreviewComparisonFinding {\n code:\n | \"image-diff-threshold-exceeded\"\n | \"dimension-mismatch\"\n | \"style-mismatch\"\n | \"missing-comparison-signal\"\n | \"invalid-comparison-signal\"\n | \"stale-comparison-signal\";\n severity: PreviewComparisonSeverity;\n message: string;\n bounds?: PreviewComparisonBounds;\n property?: string;\n designValue?: string;\n previewValue?: string;\n}\n\nexport type PreviewComparisonReferenceScope = \"component\" | \"variant\";\n\nexport type PreviewComparisonContextMismatch = \"variant\" | \"theme\" | \"viewport\";\n\nexport interface PreviewComparisonContext {\n scope: PreviewComparisonReferenceScope;\n captured?: PreviewDesignComparisonState;\n active: PreviewDesignComparisonState;\n stale: boolean;\n staleReasons: PreviewComparisonContextMismatch[];\n}\n\nexport interface PreviewComparisonReport {\n status: PreviewComparisonStatus;\n score: number | null;\n summary: string;\n design: FigmaDesignComparisonSource;\n preview: RenderedPreviewComparisonSource;\n thresholds: PreviewComparisonThresholds;\n image?: {\n match: boolean;\n diffPercentage: number;\n diffImageDataUrl?: string;\n diffImageUrl?: string;\n changedRegions: PreviewComparisonBounds[];\n diffPixelCount?: number;\n totalPixels?: number;\n };\n dimensions?: {\n match: boolean;\n design: PreviewComparisonSize;\n preview: PreviewComparisonSize;\n delta: PreviewComparisonSize;\n };\n styles?: {\n match: boolean;\n properties: PreviewStyleComparisonItem[];\n };\n findings: PreviewComparisonFinding[];\n context?: PreviewComparisonContext;\n}\n\nexport type PreviewComparisonSignalId = \"image\" | \"dimensions\" | \"styles\";\n\nexport type PreviewComparisonSignalStatus = \"pass\" | \"review\" | \"fail\" | \"missing\";\n\nexport interface PreviewComparisonSignal {\n id: PreviewComparisonSignalId;\n label: string;\n status: PreviewComparisonSignalStatus;\n value: string;\n detail: string;\n}\n\nexport interface PreviewComparisonContextSummary {\n status: \"current\" | \"stale\";\n label: string;\n value: string;\n detail: string;\n}\n\nexport interface PreviewComparisonRegionOverlay extends PreviewComparisonBounds {\n label: string;\n leftPercent: number;\n topPercent: number;\n widthPercent: number;\n heightPercent: number;\n}\n\nconst DEFAULT_THRESHOLDS: PreviewComparisonThresholds = {\n imageDiffPercentage: 1,\n dimensionPx: 1,\n numericPx: 1,\n colorChannel: 5,\n alpha: 0.05,\n};\n\nexport function comparePreviewToDesign(input: PreviewComparisonInput): PreviewComparisonReport {\n const thresholds = resolvePreviewComparisonThresholds(input.thresholds);\n const findings: PreviewComparisonFinding[] = [...(input.findings ?? [])];\n const image = compareImageDiff(input.imageDiff, thresholds, findings);\n const dimensions = compareDimensions(input.design.size, input.preview.size, thresholds, findings);\n const styles = compareStyles(input.design.styles, input.preview.styles, thresholds, findings);\n const score = scoreComparison({ image, dimensions, styles });\n\n if (score === null) {\n findings.push({\n code: \"missing-comparison-signal\",\n severity: \"warning\",\n message: \"No image, dimension, or style comparison data was provided.\",\n });\n }\n\n const status = resolveStatus(score, findings);\n\n return {\n status,\n score,\n summary: summarizeStatus(status, score, findings),\n design: input.design,\n preview: input.preview,\n thresholds,\n ...(image && { image }),\n ...(dimensions && { dimensions }),\n ...(styles && { styles }),\n findings,\n ...(input.context && { context: input.context }),\n };\n}\n\nexport function resolvePreviewComparisonThresholds(\n thresholds?: Partial<PreviewComparisonThresholds> | null\n): PreviewComparisonThresholds {\n return {\n imageDiffPercentage: readThreshold(\n thresholds?.imageDiffPercentage,\n DEFAULT_THRESHOLDS.imageDiffPercentage,\n { min: 0, max: 100 }\n ),\n dimensionPx: readThreshold(thresholds?.dimensionPx, DEFAULT_THRESHOLDS.dimensionPx, {\n min: 0,\n }),\n numericPx: readThreshold(thresholds?.numericPx, DEFAULT_THRESHOLDS.numericPx, { min: 0 }),\n colorChannel: readThreshold(thresholds?.colorChannel, DEFAULT_THRESHOLDS.colorChannel, {\n min: 0,\n max: 255,\n }),\n alpha: readThreshold(thresholds?.alpha, DEFAULT_THRESHOLDS.alpha, { min: 0, max: 1 }),\n };\n}\n\nexport function buildPreviewComparisonReport(\n input: BuildPreviewComparisonReportInput\n): PreviewComparisonReport | null {\n const variant = input.variantId\n ? input.component.variants.find((candidate) => candidate.id === input.variantId)\n : undefined;\n const rawReference = input.designReference ?? variant?.design ?? input.component.design;\n const reference = normalizePreviewDesignReference(rawReference);\n if (!reference) return null;\n\n const fallbackLabel = `${input.component.displayName}${variant ? ` / ${variant.name}` : \"\"}`;\n const comparison = reference.comparison;\n const comparisonContext = analyzeComparisonContext(\n comparison,\n input.preview,\n input.variantId,\n input.component,\n resolveDesignReferenceScope(input, rawReference, variant)\n );\n const scoredComparison = comparisonContext.findings.length === 0 ? comparison : undefined;\n const imageDiff = input.imageDiff ?? imageDiffFromComparison(scoredComparison);\n const previewSize = scoredComparison?.previewSize ?? input.preview?.size;\n\n return comparePreviewToDesign({\n design: {\n ...buildFigmaDesignSource(reference, fallbackLabel),\n ...(scoredComparison?.designStyles && { styles: scoredComparison.designStyles }),\n },\n preview: {\n kind: \"preview\",\n label: input.preview?.label ?? fallbackLabel,\n componentKey: input.preview?.componentKey ?? input.component.componentKey,\n ...((input.preview?.variantId ?? input.variantId) && {\n variantId: input.preview?.variantId ?? input.variantId,\n }),\n ...(input.preview?.theme && { theme: input.preview.theme }),\n ...(input.preview?.viewport && { viewport: input.preview.viewport }),\n ...(previewSize && { size: previewSize }),\n ...((input.preview?.styles ?? scoredComparison?.previewStyles) && {\n styles: input.preview?.styles ?? scoredComparison?.previewStyles,\n }),\n ...(input.preview?.imageDataUrl && { imageDataUrl: input.preview.imageDataUrl }),\n ...((input.preview?.imageUrl ?? scoredComparison?.previewImageUrl) && {\n imageUrl: input.preview?.imageUrl ?? scoredComparison?.previewImageUrl,\n }),\n ...((input.preview?.capturedAt ?? scoredComparison?.capturedAt) && {\n capturedAt: input.preview?.capturedAt ?? scoredComparison?.capturedAt,\n }),\n },\n ...(imageDiff && { imageDiff }),\n ...(input.thresholds && { thresholds: input.thresholds }),\n ...(comparisonContext.findings.length > 0 && { findings: comparisonContext.findings }),\n ...(comparisonContext.context && { context: comparisonContext.context }),\n });\n}\n\nfunction resolveDesignReferenceScope(\n input: BuildPreviewComparisonReportInput,\n reference: PreviewDesignReference | undefined,\n variant: PreviewComponentDefinition[\"variants\"][number] | undefined\n): \"component\" | \"variant\" {\n if (input.designReferenceScope) return input.designReferenceScope;\n return reference === variant?.design ? \"variant\" : \"component\";\n}\n\nexport function buildPreviewDesignComparisonEvidence(\n report: PreviewComparisonReport\n): PreviewDesignComparisonReference | null {\n if (report.context?.stale) return null;\n\n const state = buildStoredComparisonState(report.preview);\n const previewImageUrl = report.preview.imageUrl ?? report.preview.imageDataUrl;\n const diffImageUrl = report.image?.diffImageUrl ?? report.image?.diffImageDataUrl;\n const designStyles = cleanStyleMap(report.design.styles);\n const previewStyles = cleanStyleMap(report.preview.styles);\n const previewSize =\n report.preview.size && isPositiveComparisonSize(report.preview.size)\n ? report.preview.size\n : report.dimensions?.preview;\n\n const evidence: PreviewDesignComparisonReference = {\n ...(state && { state }),\n ...(previewImageUrl && { previewImageUrl }),\n ...(previewSize && { previewSize }),\n ...(designStyles && { designStyles }),\n ...(previewStyles && { previewStyles }),\n ...(diffImageUrl && { diffImageUrl }),\n ...(report.image && { diffPercentage: report.image.diffPercentage }),\n ...(report.image?.diffPixelCount !== undefined && {\n diffPixelCount: report.image.diffPixelCount,\n }),\n ...(report.image?.totalPixels !== undefined && {\n totalPixels: report.image.totalPixels,\n }),\n ...(report.image?.changedRegions.length && {\n changedRegions: report.image.changedRegions,\n }),\n ...(report.preview.capturedAt && { capturedAt: report.preview.capturedAt }),\n };\n\n return Object.keys(evidence).length > 0 ? evidence : null;\n}\n\nexport function buildPreviewDesignReferenceFromReport(\n report: PreviewComparisonReport\n): PreviewDesignReference {\n const comparison = buildPreviewDesignComparisonEvidence(report);\n const imageUrl = report.design.imageUrl ?? report.design.imageDataUrl;\n\n return {\n provider: \"figma\",\n label: report.design.label,\n ...(report.design.nodeUrl && { nodeUrl: report.design.nodeUrl }),\n ...(report.design.fileKey && { fileKey: report.design.fileKey }),\n ...(report.design.nodeId && { nodeId: report.design.nodeId }),\n ...(imageUrl && { imageUrl }),\n ...(report.design.size &&\n isPositiveComparisonSize(report.design.size) && {\n size: report.design.size,\n }),\n ...(comparison && { comparison }),\n };\n}\n\nfunction buildStoredComparisonState(\n preview: RenderedPreviewComparisonSource\n): PreviewDesignComparisonState | undefined {\n const state: PreviewDesignComparisonState = {\n ...(preview.variantId && { variantId: preview.variantId }),\n ...(preview.theme && { theme: preview.theme }),\n ...(preview.viewport && { viewport: preview.viewport }),\n };\n return Object.keys(state).length > 0 ? state : undefined;\n}\n\nfunction cleanStyleMap(\n styles: PreviewComparisonStyleMap | undefined\n): Record<string, string> | undefined {\n if (!styles) return undefined;\n const entries = Object.entries(styles).filter(\n (entry): entry is [string, string] => typeof entry[1] === \"string\"\n );\n return entries.length > 0 ? Object.fromEntries(entries) : undefined;\n}\n\nfunction imageDiffFromComparison(\n comparison: PreviewDesignComparisonReference | undefined\n): PreviewImageDiffInput | undefined {\n if (!comparison || comparison.diffPercentage === undefined) return undefined;\n\n return {\n diffPercentage: comparison.diffPercentage,\n changedRegions: comparison.changedRegions,\n diffImageUrl: comparison.diffImageUrl,\n diffPixelCount: comparison.diffPixelCount,\n totalPixels: comparison.totalPixels,\n };\n}\n\nfunction compareImageDiff(\n imageDiff: PreviewImageDiffInput | undefined,\n thresholds: PreviewComparisonThresholds,\n findings: PreviewComparisonFinding[]\n): PreviewComparisonReport[\"image\"] | undefined {\n if (!imageDiff) return undefined;\n const normalized = normalizeImageDiffEvidence(imageDiff, findings);\n if (!normalized) return undefined;\n\n const match = normalized.diffPercentage <= thresholds.imageDiffPercentage;\n\n if (!match) {\n findings.push({\n code: \"image-diff-threshold-exceeded\",\n severity: \"error\",\n message: `Image diff ${formatPercent(normalized.diffPercentage)} exceeds ${formatPercent(\n thresholds.imageDiffPercentage\n )}.`,\n bounds: normalized.changedRegions[0],\n });\n }\n\n return {\n match,\n diffPercentage: round(normalized.diffPercentage),\n diffImageDataUrl: normalized.diffImageDataUrl,\n diffImageUrl: normalized.diffImageUrl,\n changedRegions: normalized.changedRegions,\n diffPixelCount: normalized.diffPixelCount,\n totalPixels: normalized.totalPixels,\n };\n}\n\nfunction compareDimensions(\n design: PreviewComparisonSize | undefined,\n preview: PreviewComparisonSize | undefined,\n thresholds: PreviewComparisonThresholds,\n findings: PreviewComparisonFinding[]\n): PreviewComparisonReport[\"dimensions\"] | undefined {\n if (!design || !preview) return undefined;\n if (!isPositiveComparisonSize(design) || !isPositiveComparisonSize(preview)) {\n findings.push({\n code: \"invalid-comparison-signal\",\n severity: \"warning\",\n message: \"Design and preview sizes must be finite positive numbers.\",\n });\n return undefined;\n }\n\n const delta = {\n width: round(preview.width - design.width),\n height: round(preview.height - design.height),\n };\n const match =\n Math.abs(delta.width) <= thresholds.dimensionPx &&\n Math.abs(delta.height) <= thresholds.dimensionPx;\n\n if (!match) {\n findings.push({\n code: \"dimension-mismatch\",\n severity: \"warning\",\n message: `Preview is ${formatDelta(delta.width)}px wide and ${formatDelta(\n delta.height\n )}px tall compared with the Figma frame.`,\n });\n }\n\n return { match, design, preview, delta };\n}\n\nfunction readThreshold(\n value: unknown,\n fallback: number,\n bounds: { min: number; max?: number }\n): number {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return fallback;\n if (value < bounds.min) return fallback;\n if (bounds.max !== undefined && value > bounds.max) return fallback;\n return value;\n}\n","import type {\n PreviewArtifactManifest,\n PreviewDesignComparisonReference,\n PreviewDesignReference,\n} from \"./types\";\nimport {\n buildPreviewDesignComparisonEvidence,\n buildPreviewDesignReferenceFromReport,\n type PreviewComparisonReferenceScope,\n type PreviewComparisonReport,\n} from \"./comparison\";\n\nexport interface PreviewComparisonArtifactAssetPaths {\n rendered?: string;\n figma?: string;\n diff?: string;\n}\n\nexport interface PreviewComparisonArtifactTarget {\n componentKey: string;\n variantId?: string;\n designReferenceScope: PreviewComparisonReferenceScope;\n}\n\nexport interface BuildPreviewComparisonArtifactPayloadInput {\n report?: PreviewComparisonReport;\n designReference?: PreviewDesignReference;\n comparisonEvidence?: PreviewDesignComparisonReference;\n assets?: PreviewComparisonArtifactAssetPaths;\n}\n\nexport interface PreviewComparisonArtifactPayload {\n target: PreviewComparisonArtifactTarget;\n report: PreviewComparisonReport;\n designReference: PreviewDesignReference;\n comparisonEvidence?: PreviewDesignComparisonReference;\n}\n\nexport type ApplyPreviewComparisonArtifactStatus =\n | \"applied\"\n | \"component-not-found\"\n | \"variant-not-found\"\n | \"missing-comparison-evidence\";\n\nexport interface ApplyPreviewComparisonArtifactPayloadResult {\n status: ApplyPreviewComparisonArtifactStatus;\n applied: boolean;\n manifest: PreviewArtifactManifest;\n message: string;\n}\n\nexport function buildPreviewComparisonArtifactPayload(\n input: BuildPreviewComparisonArtifactPayloadInput\n): PreviewComparisonArtifactPayload | null {\n if (!input.report) return null;\n\n const report = input.report;\n const designReference: PreviewDesignReference = {\n ...(input.designReference ?? buildPreviewDesignReferenceFromReport(report)),\n };\n const reportEvidence = buildPreviewDesignComparisonEvidence(report);\n const comparisonEvidence: PreviewDesignComparisonReference | undefined = report.context?.stale\n ? undefined\n : input.comparisonEvidence\n ? { ...input.comparisonEvidence }\n : designReference.comparison\n ? { ...designReference.comparison }\n : reportEvidence\n ? { ...reportEvidence }\n : undefined;\n\n if (report.context?.stale) {\n delete designReference.comparison;\n }\n if (input.assets?.figma) {\n designReference.imageUrl = input.assets.figma;\n }\n if (comparisonEvidence && input.assets?.rendered) {\n comparisonEvidence.previewImageUrl = input.assets.rendered;\n }\n if (comparisonEvidence && input.assets?.diff) {\n comparisonEvidence.diffImageUrl = input.assets.diff;\n }\n if (comparisonEvidence) {\n designReference.comparison = comparisonEvidence;\n }\n\n return {\n target: buildComparisonArtifactTarget(report),\n report,\n designReference,\n ...(comparisonEvidence && { comparisonEvidence }),\n };\n}\n\nexport function applyPreviewComparisonArtifactPayload(\n manifest: PreviewArtifactManifest,\n payload: PreviewComparisonArtifactPayload\n): ApplyPreviewComparisonArtifactPayloadResult {\n if (!payload.comparisonEvidence) {\n return {\n status: \"missing-comparison-evidence\",\n applied: false,\n manifest,\n message: \"Comparison payload has no reusable evidence to apply.\",\n };\n }\n\n const component = manifest.components[payload.target.componentKey];\n if (!component) {\n return {\n status: \"component-not-found\",\n applied: false,\n manifest,\n message: `Component ${payload.target.componentKey} was not found in the manifest.`,\n };\n }\n\n if (payload.target.designReferenceScope === \"variant\") {\n const variantIndex = component.variants.findIndex(\n (variant) => variant.id === payload.target.variantId\n );\n if (variantIndex < 0) {\n return {\n status: \"variant-not-found\",\n applied: false,\n manifest,\n message: `Variant ${payload.target.variantId ?? \"(missing)\"} was not found on component ${\n payload.target.componentKey\n }.`,\n };\n }\n\n const variants = component.variants.map((variant, index) =>\n index === variantIndex ? { ...variant, design: payload.designReference } : variant\n );\n\n return {\n status: \"applied\",\n applied: true,\n manifest: {\n ...manifest,\n components: {\n ...manifest.components,\n [payload.target.componentKey]: {\n ...component,\n variants,\n },\n },\n },\n message: `Applied comparison evidence to ${payload.target.componentKey} variant ${payload.target.variantId}.`,\n };\n }\n\n return {\n status: \"applied\",\n applied: true,\n manifest: {\n ...manifest,\n components: {\n ...manifest.components,\n [payload.target.componentKey]: {\n ...component,\n design: payload.designReference,\n },\n },\n },\n message: `Applied comparison evidence to ${payload.target.componentKey}.`,\n };\n}\n\nfunction buildComparisonArtifactTarget(\n report: PreviewComparisonReport\n): PreviewComparisonArtifactTarget {\n return {\n componentKey: report.preview.componentKey,\n ...(report.preview.variantId && { variantId: report.preview.variantId }),\n designReferenceScope:\n report.context?.scope ?? (report.preview.variantId ? \"variant\" : \"component\"),\n };\n}\n","import type {\n PreviewComparisonBounds,\n PreviewComparisonFinding,\n PreviewComparisonContextSummary,\n PreviewComparisonRegionOverlay,\n PreviewComparisonReport,\n PreviewComparisonSignal,\n PreviewComparisonSize,\n} from \"./comparison\";\nimport type { PreviewDesignComparisonState } from \"./types\";\nimport { formatDelta, formatInteger, formatPercent, formatSize, round } from \"./comparison-format\";\n\nexport function getPreviewComparisonSignals(\n report: PreviewComparisonReport\n): PreviewComparisonSignal[] {\n return [buildImageSignal(report), buildDimensionSignal(report), buildStyleSignal(report)];\n}\n\nexport function getPreviewComparisonRegionOverlays(\n report: PreviewComparisonReport\n): PreviewComparisonRegionOverlay[] {\n const sourceSize = report.dimensions?.preview ?? report.preview.size ?? report.design.size;\n if (!sourceSize || sourceSize.width <= 0 || sourceSize.height <= 0) return [];\n\n return (report.image?.changedRegions ?? []).flatMap((region) => {\n const clipped = clipRegionToSize(region, sourceSize);\n if (!clipped) return [];\n\n return {\n ...region,\n label: formatChangedRegionLabel(region),\n leftPercent: round((clipped.x / sourceSize.width) * 100),\n topPercent: round((clipped.y / sourceSize.height) * 100),\n widthPercent: round((clipped.width / sourceSize.width) * 100),\n heightPercent: round((clipped.height / sourceSize.height) * 100),\n };\n });\n}\n\nexport function getPreviewComparisonContextSummary(\n report: PreviewComparisonReport\n): PreviewComparisonContextSummary | null {\n if (!report.context) return null;\n\n const captured = report.context.captured\n ? formatComparisonState(report.context.captured, {\n includeVariant: report.context.scope === \"variant\",\n })\n : \"unknown capture state\";\n const active = formatComparisonState(report.context.active, {\n includeVariant: report.context.scope === \"variant\",\n });\n\n if (report.context.stale) {\n return {\n status: \"stale\",\n label: \"Capture context\",\n value: \"Stale evidence\",\n detail: `Captured ${captured}; current ${active}.`,\n };\n }\n\n return {\n status: \"current\",\n label: \"Capture context\",\n value: \"Current evidence\",\n detail: `Captured ${captured}.`,\n };\n}\n\nexport function formatPreviewComparisonFinding(finding: PreviewComparisonFinding): string {\n const prefix = finding.severity.toUpperCase();\n const subject = finding.property ? `${finding.property}: ` : \"\";\n return `${prefix}: ${subject}${finding.message}`;\n}\n\nfunction formatComparisonState(\n state: PreviewDesignComparisonState,\n options: { includeVariant: boolean }\n): string {\n const parts = [\n options.includeVariant && state.variantId ? `variant ${state.variantId}` : undefined,\n state.theme ? `theme ${state.theme}` : undefined,\n state.viewport ? `viewport ${formatSize(state.viewport)}` : undefined,\n ].filter((part): part is string => Boolean(part));\n\n return parts.length > 0 ? parts.join(\", \") : \"unspecified preview state\";\n}\n\nfunction buildImageSignal(report: PreviewComparisonReport): PreviewComparisonSignal {\n if (!report.image) {\n return {\n id: \"image\",\n label: \"Image diff\",\n status: \"missing\",\n value: \"No capture\",\n detail: \"Capture a Figma image and preview screenshot to compare pixels.\",\n };\n }\n\n const changedPixels =\n report.image.diffPixelCount !== undefined && report.image.totalPixels !== undefined\n ? `${formatInteger(report.image.diffPixelCount)} of ${formatInteger(\n report.image.totalPixels\n )} pixels changed`\n : `${report.image.changedRegions.length} changed ${\n report.image.changedRegions.length === 1 ? \"region\" : \"regions\"\n }`;\n\n return {\n id: \"image\",\n label: \"Image diff\",\n status: report.image.match ? \"pass\" : \"fail\",\n value: `${formatPercent(report.image.diffPercentage)} changed`,\n detail: `${changedPixels}; threshold ${formatPercent(report.thresholds.imageDiffPercentage)}.`,\n };\n}\n\nfunction buildDimensionSignal(report: PreviewComparisonReport): PreviewComparisonSignal {\n if (!report.dimensions) {\n return {\n id: \"dimensions\",\n label: \"Size\",\n status: \"missing\",\n value: \"No size\",\n detail: \"Provide both Figma frame size and captured preview size.\",\n };\n }\n\n return {\n id: \"dimensions\",\n label: \"Size\",\n status: report.dimensions.match ? \"pass\" : \"review\",\n value: `${formatDelta(report.dimensions.delta.width)} x ${formatDelta(\n report.dimensions.delta.height\n )} px`,\n detail: `${formatSize(report.dimensions.design)} design, ${formatSize(\n report.dimensions.preview\n )} preview; tolerance +/-${report.thresholds.dimensionPx}px.`,\n };\n}\n\nfunction buildStyleSignal(report: PreviewComparisonReport): PreviewComparisonSignal {\n if (!report.styles) {\n return {\n id: \"styles\",\n label: \"Styles\",\n status: \"missing\",\n value: \"No styles\",\n detail: \"Provide computed Figma and preview styles to compare tokens and CSS.\",\n };\n }\n\n const matchCount = report.styles.properties.filter((property) => property.match).length;\n const firstMismatch = report.styles.properties.find((property) => !property.match);\n\n return {\n id: \"styles\",\n label: \"Styles\",\n status: report.styles.match ? \"pass\" : \"review\",\n value: `${matchCount}/${report.styles.properties.length} matched`,\n detail: firstMismatch\n ? `${firstMismatch.property}: ${firstMismatch.design} in Figma, ${firstMismatch.preview} in preview.`\n : \"All checked computed styles are within tolerance.\",\n };\n}\n\nfunction formatChangedRegionLabel(region: PreviewComparisonBounds): string {\n return `Changed region x ${region.x} y ${region.y} width ${region.width} height ${region.height}`;\n}\n\nfunction clipRegionToSize(\n region: PreviewComparisonBounds,\n size: PreviewComparisonSize\n): PreviewComparisonBounds | null {\n const x = Math.max(0, region.x);\n const y = Math.max(0, region.y);\n const right = Math.min(size.width, region.x + region.width);\n const bottom = Math.min(size.height, region.y + region.height);\n if (right <= x || bottom <= y) return null;\n return {\n x,\n y,\n width: right - x,\n height: bottom - y,\n };\n}\n","import type { PreviewArtifactManifest } from \"./types\";\n\nexport interface PreviewArtifactValidationResult {\n ok: boolean;\n issues: string[];\n}\n\nexport function definePreviewArtifactManifest(\n manifest: PreviewArtifactManifest\n): PreviewArtifactManifest {\n const validation = validatePreviewArtifactManifest(manifest);\n if (!validation.ok) {\n throw new Error(`Invalid preview artifact manifest:\\n${validation.issues.join(\"\\n\")}`);\n }\n return manifest;\n}\n\nexport function validatePreviewArtifactManifest(value: unknown): PreviewArtifactValidationResult {\n const issues: string[] = [];\n if (!isRecord(value)) {\n return { ok: false, issues: [\"manifest must be an object\"] };\n }\n requireLiteral(value, \"artifactVersion\", \"preview-artifact/v1\", issues);\n validateIdentity(value.identity, issues);\n validateBuilder(value.builder, issues);\n validateRuntime(value.runtime, issues);\n validateComponents(value.components, issues);\n if (!Array.isArray(value.diagnostics)) {\n issues.push(\"diagnostics must be an array\");\n }\n return { ok: issues.length === 0, issues };\n}\n\nexport function isPreviewArtifactManifest(value: unknown): value is PreviewArtifactManifest {\n return validatePreviewArtifactManifest(value).ok;\n}\n\nfunction validateIdentity(value: unknown, issues: string[]) {\n if (!isRecord(value)) {\n issues.push(\"identity must be an object\");\n return;\n }\n requireLiteral(value, \"artifactVersion\", \"preview-artifact/v1\", issues);\n for (const key of [\n \"artifactId\",\n \"orgId\",\n \"projectId\",\n \"bindingId\",\n \"repoFullName\",\n \"commitSha\",\n \"sourceRef\",\n \"createdAt\",\n ]) {\n requireString(value, key, issues);\n }\n}\n\nfunction validateBuilder(value: unknown, issues: string[]) {\n if (!isRecord(value)) {\n issues.push(\"builder must be an object\");\n return;\n }\n requireString(value, \"name\", issues);\n requireString(value, \"version\", issues);\n if (value.typecheck !== \"typescript\" && value.typecheck !== \"none\") {\n issues.push('builder.typecheck must be \"typescript\" or \"none\"');\n }\n if (!Array.isArray(value.sources)) {\n issues.push(\"builder.sources must be an array\");\n } else {\n for (const source of value.sources) {\n if (!isPreviewDefinitionSource(source)) {\n issues.push(`builder.sources contains unsupported source ${JSON.stringify(source)}`);\n }\n }\n }\n if (!Array.isArray(value.adapters)) {\n issues.push(\"builder.adapters must be an array\");\n }\n}\n\nfunction validateRuntime(value: unknown, issues: string[]) {\n if (!isRecord(value)) {\n issues.push(\"runtime must be an object\");\n return;\n }\n requireLiteral(value, \"framework\", \"react\", issues);\n requireLiteral(value, \"moduleFormat\", \"esm\", issues);\n requireString(value, \"entry\", issues);\n requireString(value, \"assetsBaseUrl\", issues);\n if (!Array.isArray(value.css)) issues.push(\"runtime.css must be an array\");\n}\n\nfunction validateComponents(value: unknown, issues: string[]) {\n if (!isRecord(value)) {\n issues.push(\"components must be an object\");\n return;\n }\n for (const [key, component] of Object.entries(value)) {\n if (!isRecord(component)) {\n issues.push(`components.${key} must be an object`);\n continue;\n }\n requireString(component, \"componentKey\", issues, `components.${key}`);\n requireString(component, \"publicRef\", issues, `components.${key}`);\n requireString(component, \"displayName\", issues, `components.${key}`);\n requireString(component, \"exportName\", issues, `components.${key}`);\n requireString(component, \"importPath\", issues, `components.${key}`);\n requireString(component, \"definitionSource\", issues, `components.${key}`);\n if (!isPreviewDefinitionSource(component.definitionSource)) {\n issues.push(\n `components.${key}.definitionSource must be one of typescript, fragment, manual, synthesized`\n );\n }\n if (!isRecord(component.props)) {\n issues.push(`components.${key}.props must be an object`);\n }\n if (!Array.isArray(component.variants)) {\n issues.push(`components.${key}.variants must be an array`);\n } else {\n component.variants.forEach((variant, index) => {\n if (!isRecord(variant)) {\n issues.push(`components.${key}.variants.${index} must be an object`);\n return;\n }\n validateDesignReference(\n variant.design,\n issues,\n `components.${key}.variants.${index}.design`\n );\n });\n }\n validateDesignReference(component.design, issues, `components.${key}.design`);\n }\n}\n\nfunction validateDesignReference(value: unknown, issues: string[], path: string) {\n if (value === undefined) return;\n if (!isRecord(value)) {\n issues.push(`${path} must be an object`);\n return;\n }\n if (value.provider !== \"figma\") {\n issues.push(`${path}.provider must be \"figma\"`);\n }\n for (const key of [\"label\", \"nodeUrl\", \"fileKey\", \"nodeId\", \"imageUrl\"]) {\n if (value[key] !== undefined && typeof value[key] !== \"string\") {\n issues.push(`${path}.${key} must be a string`);\n }\n }\n validateSize(value.size, issues, `${path}.size`);\n validateComparisonEvidence(value.comparison, issues, `${path}.comparison`, readSize(value.size));\n}\n\nfunction validateComparisonEvidence(\n value: unknown,\n issues: string[],\n path: string,\n designSize: { width: number; height: number } | undefined\n) {\n if (value === undefined) return;\n if (!isRecord(value)) {\n issues.push(`${path} must be an object`);\n return;\n }\n\n for (const key of [\"previewImageUrl\", \"diffImageUrl\", \"capturedAt\"]) {\n if (value[key] !== undefined && typeof value[key] !== \"string\") {\n issues.push(`${path}.${key} must be a string`);\n }\n }\n\n validateSize(value.previewSize, issues, `${path}.previewSize`);\n validateComparisonState(value.state, issues, `${path}.state`);\n const comparisonSize = readSize(value.previewSize) ?? designSize;\n validateStyleMap(value.designStyles, issues, `${path}.designStyles`);\n validateStyleMap(value.previewStyles, issues, `${path}.previewStyles`);\n\n validateFiniteNumber(value.diffPercentage, issues, `${path}.diffPercentage`);\n validatePixelCounts(value, issues, path);\n\n if (\n typeof value.diffPercentage === \"number\" &&\n (value.diffPercentage < 0 || value.diffPercentage > 100)\n ) {\n issues.push(`${path}.diffPercentage must be between 0 and 100`);\n }\n\n if (value.changedRegions !== undefined) {\n if (!Array.isArray(value.changedRegions)) {\n issues.push(`${path}.changedRegions must be an array`);\n } else {\n value.changedRegions.forEach((region, index) =>\n validateBounds(region, issues, `${path}.changedRegions.${index}`, comparisonSize)\n );\n }\n }\n}\n\nfunction validateComparisonState(value: unknown, issues: string[], path: string) {\n if (value === undefined) return;\n if (!isRecord(value)) {\n issues.push(`${path} must be an object`);\n return;\n }\n if (value.variantId !== undefined && typeof value.variantId !== \"string\") {\n issues.push(`${path}.variantId must be a string`);\n }\n if (value.theme !== undefined && typeof value.theme !== \"string\") {\n issues.push(`${path}.theme must be a string`);\n }\n validateSize(value.viewport, issues, `${path}.viewport`);\n}\n\nfunction validatePixelCounts(value: Record<string, unknown>, issues: string[], path: string) {\n if (value.diffPixelCount !== undefined) {\n validateNonNegativeInteger(value.diffPixelCount, issues, `${path}.diffPixelCount`);\n }\n if (value.totalPixels !== undefined) {\n validatePositiveInteger(value.totalPixels, issues, `${path}.totalPixels`);\n }\n if (\n isFiniteNumber(value.diffPixelCount) &&\n isFiniteNumber(value.totalPixels) &&\n value.diffPixelCount > value.totalPixels\n ) {\n issues.push(`${path}.diffPixelCount must be less than or equal to ${path}.totalPixels`);\n }\n}\n\nfunction validateSize(value: unknown, issues: string[], path: string) {\n if (value === undefined) return;\n if (!isRecord(value)) {\n issues.push(`${path} must be an object`);\n return;\n }\n validatePositiveNumber(value.width, issues, `${path}.width`);\n validatePositiveNumber(value.height, issues, `${path}.height`);\n}\n\nfunction validateStyleMap(value: unknown, issues: string[], path: string) {\n if (value === undefined) return;\n if (!isRecord(value)) {\n issues.push(`${path} must be an object`);\n return;\n }\n for (const [key, styleValue] of Object.entries(value)) {\n if (typeof styleValue !== \"string\") {\n issues.push(`${path}.${key} must be a string`);\n }\n }\n}\n\nfunction validateBounds(\n value: unknown,\n issues: string[],\n path: string,\n sourceSize?: { width: number; height: number }\n) {\n if (!isRecord(value)) {\n issues.push(`${path} must be an object`);\n return;\n }\n validateNonNegativeNumber(value.x, issues, `${path}.x`);\n validateNonNegativeNumber(value.y, issues, `${path}.y`);\n validatePositiveNumber(value.width, issues, `${path}.width`);\n validatePositiveNumber(value.height, issues, `${path}.height`);\n\n if (!sourceSize) return;\n if (\n isFiniteNumber(value.x) &&\n isFiniteNumber(value.width) &&\n value.x >= 0 &&\n value.width > 0 &&\n value.x + value.width > sourceSize.width\n ) {\n issues.push(`${path} must fit within comparison source width ${sourceSize.width}`);\n }\n if (\n isFiniteNumber(value.y) &&\n isFiniteNumber(value.height) &&\n value.y >= 0 &&\n value.height > 0 &&\n value.y + value.height > sourceSize.height\n ) {\n issues.push(`${path} must fit within comparison source height ${sourceSize.height}`);\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isPreviewDefinitionSource(value: unknown): boolean {\n return (\n value === \"typescript\" || value === \"fragment\" || value === \"manual\" || value === \"synthesized\"\n );\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n}\n\nfunction validatePositiveNumber(value: unknown, issues: string[], path: string) {\n if (!isFiniteNumber(value) || value <= 0) {\n issues.push(`${path} must be a positive number`);\n }\n}\n\nfunction validateNonNegativeNumber(value: unknown, issues: string[], path: string) {\n if (!isFiniteNumber(value) || value < 0) {\n issues.push(`${path} must be a non-negative number`);\n }\n}\n\nfunction validateFiniteNumber(value: unknown, issues: string[], path: string) {\n if (value !== undefined && !isFiniteNumber(value)) {\n issues.push(`${path} must be a finite number`);\n }\n}\n\nfunction validatePositiveInteger(value: unknown, issues: string[], path: string) {\n if (!Number.isInteger(value) || !isFiniteNumber(value) || value <= 0) {\n issues.push(`${path} must be a positive integer`);\n }\n}\n\nfunction validateNonNegativeInteger(value: unknown, issues: string[], path: string) {\n if (!Number.isInteger(value) || !isFiniteNumber(value) || value < 0) {\n issues.push(`${path} must be a non-negative integer`);\n }\n}\n\nfunction readSize(value: unknown): { width: number; height: number } | undefined {\n if (!isRecord(value)) return undefined;\n if (!isFiniteNumber(value.width) || value.width <= 0) return undefined;\n if (!isFiniteNumber(value.height) || value.height <= 0) return undefined;\n return { width: value.width, height: value.height };\n}\n\nfunction requireString(object: Record<string, unknown>, key: string, issues: string[], path = \"\") {\n if (typeof object[key] !== \"string\" || !object[key]) {\n issues.push(`${path ? `${path}.` : \"\"}${key} must be a non-empty string`);\n }\n}\n\nfunction requireLiteral(\n object: Record<string, unknown>,\n key: string,\n expected: string,\n issues: string[]\n) {\n if (object[key] !== expected) {\n issues.push(`${key} must be ${JSON.stringify(expected)}`);\n }\n}\n"],"mappings":"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","names":["formatComparisonState"]}
@@ -0,0 +1,22 @@
1
+ import { ComponentType, ReactNode, JSX } from 'react';
2
+ export { F as FragmentDefinition, a as FragmentDefinitionV2 } from './governance-BOa3KyiJ.js';
3
+ import 'zod';
4
+ import './topology/index.js';
5
+ import './types-xJ2xyp_G.js';
6
+
7
+ /**
8
+ * React-specific types for Fragments.
9
+ *
10
+ * Import from '@usefragments/core/react' when you need React-typed
11
+ * component definitions. The main '@usefragments/core' entrypoint
12
+ * works without React installed.
13
+ */
14
+
15
+ /**
16
+ * A React component that can be used in a fragment definition.
17
+ * This type is intentionally broad to support various React component patterns
18
+ * including FC, forwardRef, memo, and class components across different React versions.
19
+ */
20
+ type FragmentComponent<TProps = any> = ComponentType<TProps> | ((props: TProps) => ReactNode | JSX.Element | null);
21
+
22
+ export type { FragmentComponent };
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=react-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}