@fragments-sdk/cli 0.7.14 → 0.7.16

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 (67) hide show
  1. package/dist/bin.js +7 -7
  2. package/dist/{chunk-CRTN6BIW.js → chunk-QLTLLQBI.js} +2 -2
  3. package/dist/{chunk-TQOGBAOZ.js → chunk-WLXFE6XW.js} +91 -2
  4. package/dist/chunk-WLXFE6XW.js.map +1 -0
  5. package/dist/core/index.d.ts +44 -3
  6. package/dist/core/index.js +11 -3
  7. package/dist/{defineFragment-C6PFzZyo.d.ts → defineFragment-BI9KoPrs.d.ts} +1 -1
  8. package/dist/{generate-ZPERYZLF.js → generate-ICIPKCKV.js} +2 -2
  9. package/dist/index.d.ts +2 -2
  10. package/dist/index.js +2 -2
  11. package/dist/init-DIZ6UNBL.js +806 -0
  12. package/dist/init-DIZ6UNBL.js.map +1 -0
  13. package/dist/mcp-bin.js +2 -2
  14. package/dist/{scan-BSMLGBX4.js → scan-X3DI2X5G.js} +2 -2
  15. package/dist/{service-QACVPR37.js → service-JEWWTSKI.js} +2 -2
  16. package/dist/{static-viewer-2RQD5QLR.js → static-viewer-JIWCYKVK.js} +2 -2
  17. package/dist/{tokens-A3BZIQPB.js → tokens-K2AGUUOJ.js} +2 -2
  18. package/dist/{viewer-CNLZQUFO.js → viewer-QKIAPTPG.js} +126 -15
  19. package/dist/viewer-QKIAPTPG.js.map +1 -0
  20. package/package.json +3 -2
  21. package/src/commands/init-framework.ts +414 -0
  22. package/src/commands/init.ts +41 -1
  23. package/src/core/__tests__/preview-runtime.test.tsx +111 -0
  24. package/src/core/index.ts +13 -0
  25. package/src/core/preview-runtime.tsx +144 -0
  26. package/src/viewer/components/App.tsx +8 -3
  27. package/src/viewer/components/FragmentRenderer.tsx +61 -0
  28. package/src/viewer/components/HealthDashboard.tsx +1 -1
  29. package/src/viewer/components/IsolatedPreviewFrame.tsx +10 -8
  30. package/src/viewer/components/PreviewFrameHost.tsx +27 -60
  31. package/src/viewer/components/PropsTable.tsx +2 -2
  32. package/src/viewer/components/RuntimeToolsRegistrar.tsx +17 -0
  33. package/src/viewer/components/SkeletonLoader.tsx +114 -125
  34. package/src/viewer/components/VariantMatrix.tsx +3 -3
  35. package/src/viewer/components/ViewerStateSync.tsx +52 -0
  36. package/src/viewer/components/WebMCPDevTools.tsx +509 -0
  37. package/src/viewer/components/WebMCPIntegration.tsx +47 -0
  38. package/src/viewer/components/WebMCPStatusIndicator.tsx +60 -0
  39. package/src/viewer/entry.tsx +32 -5
  40. package/src/viewer/hooks/useA11yService.ts +1 -135
  41. package/src/viewer/hooks/useCompiledFragments.ts +42 -0
  42. package/src/viewer/index.html +1 -1
  43. package/src/viewer/public/favicon.ico +0 -0
  44. package/src/viewer/server.ts +59 -3
  45. package/src/viewer/vendor/shared/src/DocsHeaderBar.tsx +19 -0
  46. package/src/viewer/vendor/shared/src/DocsPageAsideHost.tsx +1 -1
  47. package/src/viewer/vendor/shared/src/DocsSearchCommand.tsx +69 -104
  48. package/src/viewer/vite-plugin.ts +76 -1
  49. package/src/viewer/webmcp/__tests__/analytics.test.ts +108 -0
  50. package/src/viewer/webmcp/analytics.ts +165 -0
  51. package/src/viewer/webmcp/index.ts +3 -0
  52. package/src/viewer/webmcp/posthog-bridge.ts +39 -0
  53. package/src/viewer/webmcp/runtime-tools.ts +152 -0
  54. package/src/viewer/webmcp/scan-utils.ts +135 -0
  55. package/src/viewer/webmcp/use-tool-analytics.ts +69 -0
  56. package/src/viewer/webmcp/viewer-state.ts +45 -0
  57. package/dist/chunk-TQOGBAOZ.js.map +0 -1
  58. package/dist/init-GID2DXB3.js +0 -498
  59. package/dist/init-GID2DXB3.js.map +0 -1
  60. package/dist/viewer-CNLZQUFO.js.map +0 -1
  61. package/src/viewer/components/StoryRenderer.tsx +0 -121
  62. /package/dist/{chunk-CRTN6BIW.js.map → chunk-QLTLLQBI.js.map} +0 -0
  63. /package/dist/{generate-ZPERYZLF.js.map → generate-ICIPKCKV.js.map} +0 -0
  64. /package/dist/{scan-BSMLGBX4.js.map → scan-X3DI2X5G.js.map} +0 -0
  65. /package/dist/{service-QACVPR37.js.map → service-JEWWTSKI.js.map} +0 -0
  66. /package/dist/{static-viewer-2RQD5QLR.js.map → static-viewer-JIWCYKVK.js.map} +0 -0
  67. /package/dist/{tokens-A3BZIQPB.js.map → tokens-K2AGUUOJ.js.map} +0 -0
package/dist/bin.js CHANGED
@@ -10,7 +10,7 @@ import {
10
10
  validateCoverage,
11
11
  validateSchema,
12
12
  validateSnippets
13
- } from "./chunk-CRTN6BIW.js";
13
+ } from "./chunk-QLTLLQBI.js";
14
14
  import {
15
15
  scan
16
16
  } from "./chunk-M42XIHPV.js";
@@ -39,7 +39,7 @@ import {
39
39
  } from "./chunk-YMPGYEWK.js";
40
40
  import {
41
41
  generateContext
42
- } from "./chunk-TQOGBAOZ.js";
42
+ } from "./chunk-WLXFE6XW.js";
43
43
  import "./chunk-7CRC46HV.js";
44
44
  import {
45
45
  BRAND
@@ -1806,7 +1806,7 @@ ${BRAND.name} Dev Server
1806
1806
  }
1807
1807
  }
1808
1808
  }
1809
- const { createDevServer } = await import("./viewer-CNLZQUFO.js");
1809
+ const { createDevServer } = await import("./viewer-QKIAPTPG.js");
1810
1810
  console.log(pc7.dim("\nStarting dev server..."));
1811
1811
  const parsedPort = typeof port === "string" ? parseInt(port, 10) : port;
1812
1812
  try {
@@ -5577,7 +5577,7 @@ Make sure the dev server is running: ${BRAND.cliCommand} dev`));
5577
5577
  });
5578
5578
  program.command("view").description(`Generate a static HTML viewer for ${BRAND.outFile}`).option("-i, --input <path>", `Path to ${BRAND.outFile}`, BRAND.outFile).option("-o, --output <path>", "Output HTML file path", BRAND.viewerHtmlFile).option("--open", "Open in browser after generation").action(async (options) => {
5579
5579
  try {
5580
- const { generateViewerFromJson } = await import("./static-viewer-2RQD5QLR.js");
5580
+ const { generateViewerFromJson } = await import("./static-viewer-JIWCYKVK.js");
5581
5581
  const fs2 = await import("fs/promises");
5582
5582
  const path = await import("path");
5583
5583
  const inputPath = path.resolve(process.cwd(), options.input);
@@ -5625,7 +5625,7 @@ program.command("add").argument("[name]", 'Component name (e.g., "Button", "Text
5625
5625
  });
5626
5626
  program.command("init").description("Initialize fragments in a project (interactive by default)").option("--force", "Overwrite existing config").option("-y, --yes", "Non-interactive mode - auto-detect and use defaults").action(async (options) => {
5627
5627
  try {
5628
- const { init } = await import("./init-GID2DXB3.js");
5628
+ const { init } = await import("./init-DIZ6UNBL.js");
5629
5629
  const result = await init({
5630
5630
  projectRoot: process.cwd(),
5631
5631
  force: options.force,
@@ -5645,7 +5645,7 @@ program.command("init").description("Initialize fragments in a project (interact
5645
5645
  });
5646
5646
  program.command("tokens").description("Discover and list design tokens from CSS/SCSS files").option("-c, --config <path>", "Path to config file").option("--json", "Output as JSON").option("--categories", "Group tokens by category").option("--theme <theme>", "Filter by theme name").option("--category <category>", "Filter by category (color, spacing, typography, etc.)").option("--verbose", "Show all tokens (no truncation)").action(async (options) => {
5647
5647
  try {
5648
- const { tokens } = await import("./tokens-A3BZIQPB.js");
5648
+ const { tokens } = await import("./tokens-K2AGUUOJ.js");
5649
5649
  const result = await tokens({
5650
5650
  config: options.config,
5651
5651
  json: options.json,
@@ -5664,7 +5664,7 @@ program.command("tokens").description("Discover and list design tokens from CSS/
5664
5664
  });
5665
5665
  program.command("generate").description("Generate fragment files from component source code").argument("[component]", "Specific component name to generate (optional)").option("--force", "Overwrite existing fragment files").option("--pattern <glob>", "Pattern for component files", "src/components/**/*.tsx").action(async (component, options) => {
5666
5666
  try {
5667
- const { generate } = await import("./generate-ZPERYZLF.js");
5667
+ const { generate } = await import("./generate-ICIPKCKV.js");
5668
5668
  const result = await generate({
5669
5669
  projectRoot: process.cwd(),
5670
5670
  component,
@@ -25,7 +25,7 @@ import {
25
25
  import {
26
26
  compileBlock,
27
27
  parseTokenFile
28
- } from "./chunk-TQOGBAOZ.js";
28
+ } from "./chunk-WLXFE6XW.js";
29
29
  import {
30
30
  fragmentDefinitionSchema
31
31
  } from "./chunk-7CRC46HV.js";
@@ -2229,4 +2229,4 @@ export {
2229
2229
  runDiffCommand,
2230
2230
  runAnalyzeCommand
2231
2231
  };
2232
- //# sourceMappingURL=chunk-CRTN6BIW.js.map
2232
+ //# sourceMappingURL=chunk-QLTLLQBI.js.map
@@ -869,6 +869,91 @@ function findBestCategoryCandidate(fragments, category, selectedSet, suggestedSe
869
869
  return best;
870
870
  }
871
871
 
872
+ // src/core/preview-runtime.tsx
873
+ import { useEffect, useState } from "react";
874
+ import { Fragment, jsx } from "react/jsx-runtime";
875
+ var EMPTY_STATE = {
876
+ content: null,
877
+ isLoading: false,
878
+ error: null,
879
+ loadedData: void 0
880
+ };
881
+ function toError(error) {
882
+ return error instanceof Error ? error : new Error(String(error));
883
+ }
884
+ async function executeVariantLoaders(loaders, loadedData) {
885
+ const hasLoaders = !!loaders && loaders.length > 0;
886
+ if (!hasLoaders) {
887
+ return loadedData;
888
+ }
889
+ const results = await Promise.all(loaders.map((loader) => loader()));
890
+ const mergedFromLoaders = results.reduce(
891
+ (acc, result) => ({ ...acc, ...result }),
892
+ {}
893
+ );
894
+ return loadedData ? { ...mergedFromLoaders, ...loadedData } : mergedFromLoaders;
895
+ }
896
+ async function resolvePreviewRuntimeState(options) {
897
+ const { variant, loadedData } = options;
898
+ if (!variant) {
899
+ return EMPTY_STATE;
900
+ }
901
+ try {
902
+ const mergedLoadedData = await executeVariantLoaders(variant.loaders, loadedData);
903
+ const content = variant.render({ loadedData: mergedLoadedData });
904
+ return {
905
+ content,
906
+ isLoading: false,
907
+ error: null,
908
+ loadedData: mergedLoadedData
909
+ };
910
+ } catch (error) {
911
+ return {
912
+ content: null,
913
+ isLoading: false,
914
+ error: toError(error),
915
+ loadedData: void 0
916
+ };
917
+ }
918
+ }
919
+ function usePreviewVariantRuntime(options) {
920
+ const { variant, loadedData } = options;
921
+ const [state, setState] = useState(EMPTY_STATE);
922
+ useEffect(() => {
923
+ let cancelled = false;
924
+ if (!variant) {
925
+ setState(EMPTY_STATE);
926
+ return () => {
927
+ cancelled = true;
928
+ };
929
+ }
930
+ const hasLoaders = !!variant.loaders && variant.loaders.length > 0;
931
+ setState({
932
+ content: null,
933
+ isLoading: hasLoaders,
934
+ error: null,
935
+ loadedData: void 0
936
+ });
937
+ resolvePreviewRuntimeState({ variant, loadedData }).then((nextState) => {
938
+ if (!cancelled) {
939
+ setState(nextState);
940
+ }
941
+ });
942
+ return () => {
943
+ cancelled = true;
944
+ };
945
+ }, [variant, loadedData]);
946
+ return state;
947
+ }
948
+ function PreviewVariantRuntime({
949
+ variant,
950
+ loadedData,
951
+ children: children2
952
+ }) {
953
+ const state = usePreviewVariantRuntime({ variant, loadedData });
954
+ return /* @__PURE__ */ jsx(Fragment, { children: children2(state) });
955
+ }
956
+
872
957
  export {
873
958
  defineFragment,
874
959
  compileFragment,
@@ -887,6 +972,10 @@ export {
887
972
  isFigmaPropMapping,
888
973
  resolveFigmaMapping,
889
974
  parseTokenFile,
890
- analyzeComposition
975
+ analyzeComposition,
976
+ executeVariantLoaders,
977
+ resolvePreviewRuntimeState,
978
+ usePreviewVariantRuntime,
979
+ PreviewVariantRuntime
891
980
  };
892
- //# sourceMappingURL=chunk-TQOGBAOZ.js.map
981
+ //# sourceMappingURL=chunk-WLXFE6XW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/defineFragment.ts","../src/core/storyAdapter.ts","../src/core/storybook-csf.ts","../src/core/context.ts","../src/core/figma.ts","../src/core/token-parser.ts","../src/core/composition.ts","../src/core/preview-runtime.tsx"],"sourcesContent":["import type { FragmentDefinition, CompiledFragment, FragmentComponent, BlockDefinition, CompiledBlock } from './types.js';\nimport { fragmentDefinitionSchema, blockDefinitionSchema } from './schema.js';\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 * @example\n * ```tsx\n * import { defineFragment } from '@fragments-sdk/cli/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 */\nexport function defineFragment<TProps>(\n definition: FragmentDefinition<TProps>\n): FragmentDefinition<TProps> {\n // Validate at runtime in development\n if (process.env.NODE_ENV !== 'production') {\n const result = fragmentDefinitionSchema.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 fragment definition for \"${definition.meta?.name || 'unknown'}\":\\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 */\nexport function compileFragment(\n definition: FragmentDefinition,\n filePath: string\n): CompiledFragment {\n return {\n filePath,\n meta: definition.meta,\n usage: definition.usage,\n props: definition.props,\n relations: definition.relations,\n variants: definition.variants.map((v) => ({\n name: v.name,\n description: v.description,\n code: v.code,\n figma: v.figma,\n })),\n contract: definition.contract,\n _generated: definition._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","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","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"],"mappings":"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","names":["children"]}
@@ -1,11 +1,12 @@
1
- import { b as FragmentDefinition, c as FigmaStringMapping, e as FigmaBooleanMapping, f as FigmaEnumMapping, g as FigmaInstanceMapping, h as FigmaChildrenMapping, i as FigmaTextContentMapping, R as RelationshipType } from '../defineFragment-C6PFzZyo.js';
2
- export { A as AIMetadata, H as BaselineInfo, B as BlockDefinition, G as BoundingBox, t as CompiledRecipe, n as ComponentRelation, C as ControlType, D as DiffResult, K as FigmaPropMapping, j as FragmentComponent, u as FragmentContract, v as FragmentGenerated, k as FragmentMeta, l as FragmentUsage, q as FragmentVariant, F as FragmentsConfig, W as InferProps, M as Manifest, o as PlayFunction, p as PlayFunctionContext, m as PropDefinition, P as PropType, s as RecipeDefinition, r as RegistryOptions, z as Screenshot, w as ScreenshotConfig, E as ScreenshotMetadata, x as ServiceConfig, S as SnippetPolicyConfig, T as Theme, L as TokenConfig, V as VariantLoader, I as VerifyRequest, J as VerifyResult, y as Viewport, O as compileBlock, N as compileFragment, U as compileRecipe, a as defineBlock, d as defineFragment, Q as defineRecipe } from '../defineFragment-C6PFzZyo.js';
1
+ import { b as FragmentDefinition, c as FigmaStringMapping, e as FigmaBooleanMapping, f as FigmaEnumMapping, g as FigmaInstanceMapping, h as FigmaChildrenMapping, i as FigmaTextContentMapping, R as RelationshipType, V as VariantLoader, j as VariantRenderOptions } from '../defineFragment-BI9KoPrs.js';
2
+ export { A as AIMetadata, I as BaselineInfo, B as BlockDefinition, H as BoundingBox, u as CompiledRecipe, o as ComponentRelation, C as ControlType, D as DiffResult, L as FigmaPropMapping, k as FragmentComponent, v as FragmentContract, w as FragmentGenerated, l as FragmentMeta, m as FragmentUsage, r as FragmentVariant, F as FragmentsConfig, X as InferProps, M as Manifest, p as PlayFunction, q as PlayFunctionContext, n as PropDefinition, P as PropType, t as RecipeDefinition, s as RegistryOptions, E as Screenshot, x as ScreenshotConfig, G as ScreenshotMetadata, y as ServiceConfig, S as SnippetPolicyConfig, T as Theme, N as TokenConfig, J as VerifyRequest, K as VerifyResult, z as Viewport, Q as compileBlock, O as compileFragment, W as compileRecipe, a as defineBlock, d as defineFragment, U as defineRecipe } from '../defineFragment-BI9KoPrs.js';
3
3
  import { z } from 'zod';
4
4
  import { ComponentType, ReactNode } from 'react';
5
5
  export { ContextOptions, ContextResult, generateContext } from '@fragments-sdk/context/generate';
6
6
  import { ComponentGraph } from '@fragments-sdk/context/graph';
7
7
  import { CompiledFragment } from '@fragments-sdk/context/types';
8
8
  export { CompiledBlock, CompiledFragment, CompiledFragmentsFile, CompiledTokenData, CompiledTokenEntry } from '@fragments-sdk/context/types';
9
+ import * as react_jsx_runtime from 'react/jsx-runtime';
9
10
  import { toId as toId$1, storyNameFromExport as storyNameFromExport$1, isExportStory as isExportStory$1 } from '@storybook/csf';
10
11
 
11
12
  declare const toId: typeof toId$1;
@@ -1941,4 +1942,44 @@ declare function analyzeComposition(fragments: Record<string, CompiledFragment>,
1941
1942
  graph?: ComponentGraph;
1942
1943
  }): CompositionAnalysis;
1943
1944
 
1944
- export { BRAND, type Brand, type CSF2Story, type CompositionAnalysis, type CompositionGuideline, type CompositionSuggestion, type CompositionWarning, DEFAULTS, type Decorator, type Defaults, type DesignToken, type EnhancedStyleDiffItem, FigmaBooleanMapping, FigmaChildrenMapping, FigmaEnumMapping, FigmaInstanceMapping, FigmaStringMapping, FigmaTextContentMapping, type Fragment, type FragmentAccessibility, type FragmentContextOptions, FragmentDefinition, type FragmentDoNotItem, type FragmentFigma, type FragmentIndex, type FragmentMeta as FragmentJsonMeta, type FragmentUsage as FragmentJsonUsage, type FragmentPattern, type FragmentRegistry, type FragmentRelated, type Loader, type ParsedToken, type PreviewConfig, type RegistryComponentEntry, type RegistryPropEntry, RelationshipType, type Story, type StoryArgType, type StoryContext, type StoryMeta, type StoryModule, type TokenCategory, type TokenFix, type TokenMatchRequest, type TokenMatchResult, type TokenParseError, type TokenParseOutput, type TokenParseResult, type TokenRegistry, type TokenRegistryMeta, type TokenUsageSummary, aiMetadataSchema, analyzeComposition, blockDefinitionSchema, componentRelationSchema, figma, figmaPropMappingSchema, fragmentBanSchema, fragmentContractSchema, fragmentDefinitionSchema, fragmentGeneratedSchema, fragmentMetaSchema, fragmentUsageSchema, fragmentVariantSchema, fragmentsConfigSchema, getPreviewConfig, isExportStory, isFigmaPropMapping, parseTokenFile, propDefinitionSchema, recipeDefinitionSchema, resolveFigmaMapping, setPreviewConfig, storyModuleToFragment, storyNameFromExport, toId };
1945
+ /**
1946
+ * Minimal contract for rendering a preview variant.
1947
+ * Compatible with fragment variants and Storybook-adapted variants.
1948
+ */
1949
+ interface PreviewVariantLike {
1950
+ render: (options?: VariantRenderOptions) => ReactNode;
1951
+ loaders?: VariantLoader[];
1952
+ }
1953
+ interface PreviewRuntimeState {
1954
+ content: ReactNode | null;
1955
+ isLoading: boolean;
1956
+ error: Error | null;
1957
+ loadedData?: Record<string, unknown>;
1958
+ }
1959
+ interface PreviewRuntimeOptions {
1960
+ variant?: PreviewVariantLike | null;
1961
+ loadedData?: Record<string, unknown>;
1962
+ }
1963
+ /**
1964
+ * Execute all variant loaders and merge their payloads.
1965
+ * `loadedData` is applied last so host-level overrides win.
1966
+ */
1967
+ declare function executeVariantLoaders(loaders: VariantLoader[] | undefined, loadedData?: Record<string, unknown>): Promise<Record<string, unknown> | undefined>;
1968
+ /**
1969
+ * Resolve a full runtime state (loader execution + render) in one async call.
1970
+ * This is useful for testing and for hook/component orchestration.
1971
+ */
1972
+ declare function resolvePreviewRuntimeState(options: PreviewRuntimeOptions): Promise<PreviewRuntimeState>;
1973
+ /**
1974
+ * Hook for rendering a preview variant with loader support.
1975
+ */
1976
+ declare function usePreviewVariantRuntime(options: PreviewRuntimeOptions): PreviewRuntimeState;
1977
+ interface PreviewVariantRuntimeProps extends PreviewRuntimeOptions {
1978
+ children: (state: PreviewRuntimeState) => ReactNode;
1979
+ }
1980
+ /**
1981
+ * Render-prop component wrapper around `usePreviewVariantRuntime`.
1982
+ */
1983
+ declare function PreviewVariantRuntime({ variant, loadedData, children, }: PreviewVariantRuntimeProps): react_jsx_runtime.JSX.Element;
1984
+
1985
+ export { BRAND, type Brand, type CSF2Story, type CompositionAnalysis, type CompositionGuideline, type CompositionSuggestion, type CompositionWarning, DEFAULTS, type Decorator, type Defaults, type DesignToken, type EnhancedStyleDiffItem, FigmaBooleanMapping, FigmaChildrenMapping, FigmaEnumMapping, FigmaInstanceMapping, FigmaStringMapping, FigmaTextContentMapping, type Fragment, type FragmentAccessibility, type FragmentContextOptions, FragmentDefinition, type FragmentDoNotItem, type FragmentFigma, type FragmentIndex, type FragmentMeta as FragmentJsonMeta, type FragmentUsage as FragmentJsonUsage, type FragmentPattern, type FragmentRegistry, type FragmentRelated, type Loader, type ParsedToken, type PreviewConfig, type PreviewRuntimeOptions, type PreviewRuntimeState, type PreviewVariantLike, PreviewVariantRuntime, type RegistryComponentEntry, type RegistryPropEntry, RelationshipType, type Story, type StoryArgType, type StoryContext, type StoryMeta, type StoryModule, type TokenCategory, type TokenFix, type TokenMatchRequest, type TokenMatchResult, type TokenParseError, type TokenParseOutput, type TokenParseResult, type TokenRegistry, type TokenRegistryMeta, type TokenUsageSummary, VariantLoader, aiMetadataSchema, analyzeComposition, blockDefinitionSchema, componentRelationSchema, executeVariantLoaders, figma, figmaPropMappingSchema, fragmentBanSchema, fragmentContractSchema, fragmentDefinitionSchema, fragmentGeneratedSchema, fragmentMetaSchema, fragmentUsageSchema, fragmentVariantSchema, fragmentsConfigSchema, getPreviewConfig, isExportStory, isFigmaPropMapping, parseTokenFile, propDefinitionSchema, recipeDefinitionSchema, resolveFigmaMapping, resolvePreviewRuntimeState, setPreviewConfig, storyModuleToFragment, storyNameFromExport, toId, usePreviewVariantRuntime };
@@ -1,5 +1,6 @@
1
1
  import { createRequire as __banner_createRequire } from 'module'; const require = __banner_createRequire(import.meta.url);
2
2
  import {
3
+ PreviewVariantRuntime,
3
4
  analyzeComposition,
4
5
  compileBlock,
5
6
  compileFragment,
@@ -7,6 +8,7 @@ import {
7
8
  defineBlock,
8
9
  defineFragment,
9
10
  defineRecipe,
11
+ executeVariantLoaders,
10
12
  figma,
11
13
  generateContext,
12
14
  getPreviewConfig,
@@ -14,11 +16,13 @@ import {
14
16
  isFigmaPropMapping,
15
17
  parseTokenFile,
16
18
  resolveFigmaMapping,
19
+ resolvePreviewRuntimeState,
17
20
  setPreviewConfig,
18
21
  storyModuleToFragment,
19
22
  storyNameFromExport,
20
- toId
21
- } from "../chunk-TQOGBAOZ.js";
23
+ toId,
24
+ usePreviewVariantRuntime
25
+ } from "../chunk-WLXFE6XW.js";
22
26
  import {
23
27
  aiMetadataSchema,
24
28
  blockDefinitionSchema,
@@ -43,6 +47,7 @@ import "../chunk-Z7EY4VHE.js";
43
47
  export {
44
48
  BRAND,
45
49
  DEFAULTS,
50
+ PreviewVariantRuntime,
46
51
  aiMetadataSchema,
47
52
  analyzeComposition,
48
53
  blockDefinitionSchema,
@@ -53,6 +58,7 @@ export {
53
58
  defineBlock,
54
59
  defineFragment,
55
60
  defineRecipe,
61
+ executeVariantLoaders,
56
62
  figma,
57
63
  figmaPropMappingSchema,
58
64
  fragmentBanSchema,
@@ -71,9 +77,11 @@ export {
71
77
  propDefinitionSchema,
72
78
  recipeDefinitionSchema,
73
79
  resolveFigmaMapping,
80
+ resolvePreviewRuntimeState,
74
81
  setPreviewConfig,
75
82
  storyModuleToFragment,
76
83
  storyNameFromExport,
77
- toId
84
+ toId,
85
+ usePreviewVariantRuntime
78
86
  };
79
87
  //# sourceMappingURL=index.js.map
@@ -653,4 +653,4 @@ declare const compileRecipe: typeof compileBlock;
653
653
  */
654
654
  type InferProps<T> = T extends FragmentComponent<infer P> ? P : never;
655
655
 
656
- export { type AIMetadata as A, type BlockDefinition as B, type ControlType as C, type DiffResult as D, type ScreenshotMetadata as E, type FragmentsConfig as F, type BoundingBox as G, type BaselineInfo as H, type VerifyRequest as I, type VerifyResult as J, type FigmaPropMapping as K, type TokenConfig as L, type Manifest as M, compileFragment as N, compileBlock as O, type PropType as P, defineRecipe as Q, type RelationshipType as R, type SnippetPolicyConfig as S, type Theme as T, compileRecipe as U, type VariantLoader as V, type InferProps as W, defineBlock as a, type FragmentDefinition as b, type FigmaStringMapping as c, defineFragment as d, type FigmaBooleanMapping as e, type FigmaEnumMapping as f, type FigmaInstanceMapping as g, type FigmaChildrenMapping as h, type FigmaTextContentMapping as i, type FragmentComponent as j, type FragmentMeta as k, type FragmentUsage as l, type PropDefinition as m, type ComponentRelation as n, type PlayFunction as o, type PlayFunctionContext as p, type FragmentVariant as q, type RegistryOptions as r, type RecipeDefinition as s, type CompiledRecipe as t, type FragmentContract as u, type FragmentGenerated as v, type ScreenshotConfig as w, type ServiceConfig as x, type Viewport as y, type Screenshot as z };
656
+ export { type AIMetadata as A, type BlockDefinition as B, type ControlType as C, type DiffResult as D, type Screenshot as E, type FragmentsConfig as F, type ScreenshotMetadata as G, type BoundingBox as H, type BaselineInfo as I, type VerifyRequest as J, type VerifyResult as K, type FigmaPropMapping as L, type Manifest as M, type TokenConfig as N, compileFragment as O, type PropType as P, compileBlock as Q, type RelationshipType as R, type SnippetPolicyConfig as S, type Theme as T, defineRecipe as U, type VariantLoader as V, compileRecipe as W, type InferProps as X, defineBlock as a, type FragmentDefinition as b, type FigmaStringMapping as c, defineFragment as d, type FigmaBooleanMapping as e, type FigmaEnumMapping as f, type FigmaInstanceMapping as g, type FigmaChildrenMapping as h, type FigmaTextContentMapping as i, type VariantRenderOptions as j, type FragmentComponent as k, type FragmentMeta as l, type FragmentUsage as m, type PropDefinition as n, type ComponentRelation as o, type PlayFunction as p, type PlayFunctionContext as q, type FragmentVariant as r, type RegistryOptions as s, type RecipeDefinition as t, type CompiledRecipe as u, type FragmentContract as v, type FragmentGenerated as w, type ScreenshotConfig as x, type ServiceConfig as y, type Viewport as z };
@@ -3,7 +3,7 @@ import {
3
3
  extractPropsFromFile
4
4
  } from "./chunk-57OW43NL.js";
5
5
  import "./chunk-AWYCDRPG.js";
6
- import "./chunk-TQOGBAOZ.js";
6
+ import "./chunk-WLXFE6XW.js";
7
7
  import "./chunk-7CRC46HV.js";
8
8
  import {
9
9
  BRAND
@@ -249,4 +249,4 @@ function inferStatus(filePath) {
249
249
  export {
250
250
  generate
251
251
  };
252
- //# sourceMappingURL=generate-ZPERYZLF.js.map
252
+ //# sourceMappingURL=generate-ICIPKCKV.js.map
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { F as FragmentsConfig, T as Theme, D as DiffResult } from './defineFragment-C6PFzZyo.js';
2
- export { a as defineBlock, d as defineFragment } from './defineFragment-C6PFzZyo.js';
1
+ import { F as FragmentsConfig, T as Theme, D as DiffResult } from './defineFragment-BI9KoPrs.js';
2
+ export { a as defineBlock, d as defineFragment } from './defineFragment-BI9KoPrs.js';
3
3
  import { CompiledFragmentsFile } from '@fragments-sdk/context/types';
4
4
  export { CLI_COMMANDS, CLI_COMMAND_CATEGORIES, CliCategoryInfo, CliCommandCategory, CliCommandDef, CliOptionDef } from '@fragments-sdk/context/cli-commands';
5
5
  import 'react';
package/dist/index.js CHANGED
@@ -12,7 +12,7 @@ import {
12
12
  validateCoverage,
13
13
  validateSchema,
14
14
  validateSnippets
15
- } from "./chunk-CRTN6BIW.js";
15
+ } from "./chunk-QLTLLQBI.js";
16
16
  import {
17
17
  findConfigFile,
18
18
  loadConfig
@@ -26,7 +26,7 @@ import "./chunk-YMPGYEWK.js";
26
26
  import {
27
27
  defineBlock,
28
28
  defineFragment
29
- } from "./chunk-TQOGBAOZ.js";
29
+ } from "./chunk-WLXFE6XW.js";
30
30
  import "./chunk-7CRC46HV.js";
31
31
  import "./chunk-EKLMXTWU.js";
32
32
  import "./chunk-Z7EY4VHE.js";