@fragments-sdk/cli 0.7.0 → 0.7.2

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 (173) hide show
  1. package/LICENSE +77 -14
  2. package/dist/bin.js +247 -247
  3. package/dist/bin.js.map +1 -1
  4. package/dist/{chunk-CVXKXVOY.js → chunk-3T6QL7IY.js} +47 -29
  5. package/dist/chunk-3T6QL7IY.js.map +1 -0
  6. package/dist/{chunk-7OPWMLOE.js → chunk-7KUSBMI4.js} +114 -112
  7. package/dist/chunk-7KUSBMI4.js.map +1 -0
  8. package/dist/{chunk-XHUDJNN3.js → chunk-DH4ETVSM.js} +18 -18
  9. package/dist/chunk-DH4ETVSM.js.map +1 -0
  10. package/dist/{chunk-RVRTRESS.js → chunk-DQHWLAUV.js} +29 -29
  11. package/dist/chunk-DQHWLAUV.js.map +1 -0
  12. package/dist/{chunk-6JBGU74P.js → chunk-GHYYFAQN.js} +23 -23
  13. package/dist/chunk-GHYYFAQN.js.map +1 -0
  14. package/dist/{chunk-NWQ4CJOQ.js → chunk-GKX2HPZ6.js} +40 -40
  15. package/dist/chunk-GKX2HPZ6.js.map +1 -0
  16. package/dist/{chunk-TJ34N7C7.js → chunk-OOGTG5FM.js} +34 -33
  17. package/dist/chunk-OOGTG5FM.js.map +1 -0
  18. package/dist/{core-W2HYIQW6.js → core-UQXZTBFZ.js} +24 -26
  19. package/dist/{generate-LMTISDIJ.js → generate-GP6ZLAQB.js} +5 -5
  20. package/dist/generate-GP6ZLAQB.js.map +1 -0
  21. package/dist/index.d.ts +23 -27
  22. package/dist/index.js +10 -10
  23. package/dist/{init-7CHRKQ7P.js → init-W72WBSU2.js} +5 -5
  24. package/dist/{init-7CHRKQ7P.js.map → init-W72WBSU2.js.map} +1 -1
  25. package/dist/mcp-bin.js +73 -73
  26. package/dist/mcp-bin.js.map +1 -1
  27. package/dist/scan-V54HWRDY.js +12 -0
  28. package/dist/{service-T2L7VLTE.js → service-PVGTYUKX.js} +6 -6
  29. package/dist/{static-viewer-GBR7YNF3.js → static-viewer-KILKIVN7.js} +4 -4
  30. package/dist/{test-OJRXNDO2.js → test-3YRYQRGV.js} +19 -19
  31. package/dist/test-3YRYQRGV.js.map +1 -0
  32. package/dist/{tokens-3BWDESVM.js → tokens-IXSQHPQK.js} +5 -5
  33. package/dist/{viewer-SUFOISZM.js → viewer-K42REJU2.js} +199 -199
  34. package/dist/viewer-K42REJU2.js.map +1 -0
  35. package/package.json +13 -2
  36. package/src/ai.ts +5 -5
  37. package/src/analyze.ts +11 -11
  38. package/src/bin.ts +1 -1
  39. package/src/build.ts +37 -35
  40. package/src/commands/a11y.ts +6 -6
  41. package/src/commands/add.ts +11 -11
  42. package/src/commands/audit.ts +4 -4
  43. package/src/commands/baseline.ts +3 -3
  44. package/src/commands/build.ts +8 -8
  45. package/src/commands/compare.ts +20 -20
  46. package/src/commands/context.ts +16 -16
  47. package/src/commands/enhance.ts +36 -36
  48. package/src/commands/generate.ts +1 -1
  49. package/src/commands/graph.ts +5 -5
  50. package/src/commands/init.ts +1 -1
  51. package/src/commands/link/figma.ts +82 -82
  52. package/src/commands/link/index.ts +3 -3
  53. package/src/commands/link/storybook.ts +9 -9
  54. package/src/commands/list.ts +2 -2
  55. package/src/commands/reset.ts +15 -15
  56. package/src/commands/scan.ts +27 -27
  57. package/src/commands/storygen.ts +24 -24
  58. package/src/commands/validate.ts +2 -2
  59. package/src/commands/verify.ts +8 -8
  60. package/src/core/auto-props.ts +4 -4
  61. package/src/core/composition.test.ts +36 -36
  62. package/src/core/composition.ts +19 -19
  63. package/src/core/config.ts +6 -6
  64. package/src/core/{defineSegment.ts → defineFragment.ts} +16 -22
  65. package/src/core/discovery.ts +6 -6
  66. package/src/core/figma.ts +2 -2
  67. package/src/core/graph-extractor.test.ts +77 -77
  68. package/src/core/graph-extractor.ts +32 -32
  69. package/src/core/importAnalyzer.ts +1 -1
  70. package/src/core/index.ts +22 -23
  71. package/src/core/loader.ts +21 -24
  72. package/src/core/node.ts +5 -5
  73. package/src/core/parser.ts +71 -31
  74. package/src/core/previewLoader.ts +1 -1
  75. package/src/core/schema.ts +16 -16
  76. package/src/core/storyAdapter.test.ts +87 -87
  77. package/src/core/storyAdapter.ts +16 -16
  78. package/src/core/token-parser.ts +9 -1
  79. package/src/core/types.ts +21 -26
  80. package/src/diff.ts +22 -22
  81. package/src/index.ts +2 -2
  82. package/src/mcp/server.ts +80 -80
  83. package/src/migrate/__tests__/utils/utils.test.ts +3 -3
  84. package/src/migrate/bin.ts +4 -4
  85. package/src/migrate/converter.ts +16 -16
  86. package/src/migrate/index.ts +3 -3
  87. package/src/migrate/migrate.ts +3 -3
  88. package/src/migrate/parser.ts +8 -8
  89. package/src/migrate/report.ts +2 -2
  90. package/src/migrate/types.ts +4 -4
  91. package/src/screenshot.ts +22 -22
  92. package/src/service/__tests__/props-extractor.test.ts +15 -15
  93. package/src/service/analytics.ts +39 -39
  94. package/src/service/enhance/codebase-scanner.ts +1 -1
  95. package/src/service/enhance/index.ts +1 -1
  96. package/src/service/enhance/props-extractor.ts +2 -2
  97. package/src/service/enhance/types.ts +2 -2
  98. package/src/service/index.ts +2 -2
  99. package/src/service/metrics-store.ts +1 -1
  100. package/src/service/patch-generator.ts +1 -1
  101. package/src/setup.ts +52 -52
  102. package/src/shared/dev-server-client.ts +7 -7
  103. package/src/shared/fragment-loader.ts +59 -0
  104. package/src/shared/index.ts +1 -1
  105. package/src/shared/types.ts +4 -4
  106. package/src/static-viewer.ts +35 -35
  107. package/src/test/discovery.ts +6 -6
  108. package/src/test/index.ts +5 -5
  109. package/src/test/reporters/console.ts +1 -1
  110. package/src/test/reporters/junit.ts +1 -1
  111. package/src/test/runner.ts +7 -7
  112. package/src/test/types.ts +3 -3
  113. package/src/test/watch.ts +9 -9
  114. package/src/validators.ts +26 -26
  115. package/src/viewer/__tests__/render-utils.test.ts +28 -28
  116. package/src/viewer/__tests__/viewer-integration.test.ts +4 -4
  117. package/src/viewer/cli/health.ts +26 -26
  118. package/src/viewer/components/App.tsx +79 -79
  119. package/src/viewer/components/BottomPanel.tsx +17 -17
  120. package/src/viewer/components/CodePanel.tsx +3 -3
  121. package/src/viewer/components/CommandPalette.tsx +11 -11
  122. package/src/viewer/components/ComponentGraph.tsx +28 -28
  123. package/src/viewer/components/ComponentHeader.tsx +2 -2
  124. package/src/viewer/components/ContractPanel.tsx +6 -6
  125. package/src/viewer/components/FigmaEmbed.tsx +9 -9
  126. package/src/viewer/components/HealthDashboard.tsx +17 -17
  127. package/src/viewer/components/InteractionsPanel.tsx +2 -2
  128. package/src/viewer/components/IsolatedPreviewFrame.tsx +6 -6
  129. package/src/viewer/components/IsolatedRender.tsx +10 -10
  130. package/src/viewer/components/LeftSidebar.tsx +28 -28
  131. package/src/viewer/components/MultiViewportPreview.tsx +14 -14
  132. package/src/viewer/components/PreviewArea.tsx +11 -11
  133. package/src/viewer/components/PreviewFrameHost.tsx +51 -51
  134. package/src/viewer/components/RightSidebar.tsx +9 -9
  135. package/src/viewer/components/Sidebar.tsx +17 -17
  136. package/src/viewer/components/StoryRenderer.tsx +2 -2
  137. package/src/viewer/components/TokenStylePanel.tsx +1 -1
  138. package/src/viewer/components/UsageSection.tsx +2 -2
  139. package/src/viewer/components/VariantMatrix.tsx +11 -11
  140. package/src/viewer/components/VariantRenderer.tsx +3 -3
  141. package/src/viewer/components/VariantTabs.tsx +2 -2
  142. package/src/viewer/components/_future/CreatePage.tsx +6 -6
  143. package/src/viewer/composition-renderer.ts +11 -11
  144. package/src/viewer/entry.tsx +40 -40
  145. package/src/viewer/hooks/useFigmaIntegration.ts +1 -1
  146. package/src/viewer/hooks/usePreviewBridge.ts +5 -5
  147. package/src/viewer/hooks/useUrlState.ts +6 -6
  148. package/src/viewer/index.ts +2 -2
  149. package/src/viewer/intelligence/healthReport.ts +17 -17
  150. package/src/viewer/intelligence/styleDrift.ts +1 -1
  151. package/src/viewer/intelligence/usageScanner.ts +1 -1
  152. package/src/viewer/render-template.html +1 -1
  153. package/src/viewer/render-utils.ts +21 -21
  154. package/src/viewer/server.ts +18 -18
  155. package/src/viewer/utils/detectRelationships.ts +22 -22
  156. package/src/viewer/vite-plugin.ts +213 -213
  157. package/dist/chunk-6JBGU74P.js.map +0 -1
  158. package/dist/chunk-7OPWMLOE.js.map +0 -1
  159. package/dist/chunk-CVXKXVOY.js.map +0 -1
  160. package/dist/chunk-NWQ4CJOQ.js.map +0 -1
  161. package/dist/chunk-RVRTRESS.js.map +0 -1
  162. package/dist/chunk-TJ34N7C7.js.map +0 -1
  163. package/dist/chunk-XHUDJNN3.js.map +0 -1
  164. package/dist/generate-LMTISDIJ.js.map +0 -1
  165. package/dist/scan-WY23TJCP.js +0 -12
  166. package/dist/test-OJRXNDO2.js.map +0 -1
  167. package/dist/viewer-SUFOISZM.js.map +0 -1
  168. package/src/shared/segment-loader.ts +0 -59
  169. /package/dist/{core-W2HYIQW6.js.map → core-UQXZTBFZ.js.map} +0 -0
  170. /package/dist/{scan-WY23TJCP.js.map → scan-V54HWRDY.js.map} +0 -0
  171. /package/dist/{service-T2L7VLTE.js.map → service-PVGTYUKX.js.map} +0 -0
  172. /package/dist/{static-viewer-GBR7YNF3.js.map → static-viewer-KILKIVN7.js.map} +0 -0
  173. /package/dist/{tokens-3BWDESVM.js.map → tokens-IXSQHPQK.js.map} +0 -0
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { useState, useMemo, useEffect, useCallback, useRef, type RefObject } from "react";
7
- import { BRAND, type SegmentDefinition } from "../../core/index.js";
7
+ import { BRAND, type FragmentDefinition } from "../../core/index.js";
8
8
 
9
9
  // Layout & Navigation
10
10
  import { Layout } from "./Layout.js";
@@ -39,7 +39,7 @@ import { useViewSettings } from "../hooks/useViewSettings.js";
39
39
  import { useFigmaIntegration } from "../hooks/useFigmaIntegration.js";
40
40
  import { useKeyboardShortcuts } from "../hooks/useKeyboardShortcuts.js";
41
41
  import { useActions } from "../hooks/useActions.js";
42
- import { useUrlState, findSegmentByName, findVariantIndex } from "../hooks/useUrlState.js";
42
+ import { useUrlState, findFragmentByName, findVariantIndex } from "../hooks/useUrlState.js";
43
43
  import { usePanelDock } from "./ResizablePanel.js";
44
44
  import { useTheme } from "./ThemeProvider.js";
45
45
 
@@ -47,10 +47,10 @@ import { useTheme } from "./ThemeProvider.js";
47
47
  import { ScreenshotButton } from "./ScreenshotButton.js";
48
48
 
49
49
  interface AppProps {
50
- segments: Array<{ path: string; segment: SegmentDefinition }>;
50
+ fragments: Array<{ path: string; fragment: FragmentDefinition }>;
51
51
  }
52
52
 
53
- export function App({ segments }: AppProps) {
53
+ export function App({ fragments }: AppProps) {
54
54
  // URL state management
55
55
  const { state: urlState, setComponent: setUrlComponent, setVariant: setUrlVariant, setViewSettings: setUrlViewSettings, copyUrl } = useUrlState();
56
56
 
@@ -84,18 +84,18 @@ export function App({ segments }: AppProps) {
84
84
  const { info, success } = useToast();
85
85
 
86
86
  // Navigation state
87
- const [activeSegmentPath, setActiveSegmentPath] = useState<string | null>(() => {
87
+ const [activeFragmentPath, setActiveFragmentPath] = useState<string | null>(() => {
88
88
  if (urlState.component) {
89
- const found = findSegmentByName(segments, urlState.component);
90
- return found?.path ?? segments[0]?.path ?? null;
89
+ const found = findFragmentByName(fragments, urlState.component);
90
+ return found?.path ?? fragments[0]?.path ?? null;
91
91
  }
92
- return segments[0]?.path ?? null;
92
+ return fragments[0]?.path ?? null;
93
93
  });
94
94
 
95
95
  const [activeVariantIndex, setActiveVariantIndex] = useState<number>(() => {
96
- const segment = segments.find(s => s.path === activeSegmentPath);
97
- if (urlState.variant && segment?.segment.variants) {
98
- return findVariantIndex(segment.segment.variants, urlState.variant);
96
+ const fragment = fragments.find(s => s.path === activeFragmentPath);
97
+ if (urlState.variant && fragment?.fragment.variants) {
98
+ return findVariantIndex(fragment.fragment.variants, urlState.variant);
99
99
  }
100
100
  return 0;
101
101
  });
@@ -103,18 +103,18 @@ export function App({ segments }: AppProps) {
103
103
  const searchInputRef = useRef<HTMLInputElement>(null);
104
104
 
105
105
  // Derived values
106
- const activeSegment = useMemo(
107
- () => segments.find((s) => s.path === activeSegmentPath),
108
- [segments, activeSegmentPath]
106
+ const activeFragment = useMemo(
107
+ () => fragments.find((s) => s.path === activeFragmentPath),
108
+ [fragments, activeFragmentPath]
109
109
  );
110
- const activeVariant = activeSegment?.segment.variants?.[activeVariantIndex];
111
- const figmaUrl = activeVariant?.figma || activeSegment?.segment.meta.figma;
110
+ const activeVariant = activeFragment?.fragment.variants?.[activeVariantIndex];
111
+ const figmaUrl = activeVariant?.figma || activeFragment?.fragment.meta.figma;
112
112
 
113
113
  // Figma integration
114
114
  const figmaIntegration = useFigmaIntegration({
115
115
  figmaUrl,
116
116
  showComparison: uiState.showComparison,
117
- dependencies: [activeSegmentPath, activeVariantIndex],
117
+ dependencies: [activeFragmentPath, activeVariantIndex],
118
118
  });
119
119
 
120
120
  // Actions logging
@@ -123,12 +123,12 @@ export function App({ segments }: AppProps) {
123
123
  useActionsRef.current = { logAction };
124
124
 
125
125
  // Figma URLs for preloading
126
- const allFigmaUrls = useAllFigmaUrls(activeSegment?.segment);
126
+ const allFigmaUrls = useAllFigmaUrls(activeFragment?.fragment);
127
127
 
128
128
  // Reset action logs on variant change
129
129
  useEffect(() => {
130
130
  clearActionLogs();
131
- }, [activeSegmentPath, activeVariantIndex, clearActionLogs]);
131
+ }, [activeFragmentPath, activeVariantIndex, clearActionLogs]);
132
132
 
133
133
  // Extract rendered styles after component renders
134
134
  useEffect(() => {
@@ -141,14 +141,14 @@ export function App({ segments }: AppProps) {
141
141
  // Sync URL state on browser navigation
142
142
  useEffect(() => {
143
143
  if (urlState.component) {
144
- const found = findSegmentByName(segments, urlState.component);
145
- if (found && found.path !== activeSegmentPath) {
146
- setActiveSegmentPath(found.path);
147
- const variantIndex = findVariantIndex(found.segment.variants, urlState.variant);
144
+ const found = findFragmentByName(fragments, urlState.component);
145
+ if (found && found.path !== activeFragmentPath) {
146
+ setActiveFragmentPath(found.path);
147
+ const variantIndex = findVariantIndex(found.fragment.variants, urlState.variant);
148
148
  setActiveVariantIndex(variantIndex);
149
149
  }
150
150
  }
151
- }, [urlState.component, urlState.variant, segments, activeSegmentPath]);
151
+ }, [urlState.component, urlState.variant, fragments, activeFragmentPath]);
152
152
 
153
153
  // HMR toast notifications
154
154
  useEffect(() => {
@@ -167,22 +167,22 @@ export function App({ segments }: AppProps) {
167
167
  }, [info]);
168
168
 
169
169
  // Navigation handlers
170
- const handleSelectSegment = useCallback((path: string) => {
171
- const segment = segments.find((s) => s.path === path);
172
- const componentName = segment?.segment.meta.name || path;
173
- const firstVariant = segment?.segment.variants?.[0]?.name;
170
+ const handleSelectFragment = useCallback((path: string) => {
171
+ const fragment = fragments.find((s) => s.path === path);
172
+ const componentName = fragment?.fragment.meta.name || path;
173
+ const firstVariant = fragment?.fragment.variants?.[0]?.name;
174
174
 
175
- setActiveSegmentPath(path);
175
+ setActiveFragmentPath(path);
176
176
  setActiveVariantIndex(0);
177
177
  uiActions.setHealthDashboard(false);
178
178
  setUrlComponent(componentName, firstVariant);
179
- }, [segments, setUrlComponent, uiActions]);
179
+ }, [fragments, setUrlComponent, uiActions]);
180
180
 
181
181
  const handleSelectVariant = useCallback((index: number) => {
182
- const variantName = activeSegment?.segment.variants?.[index]?.name;
182
+ const variantName = activeFragment?.fragment.variants?.[index]?.name;
183
183
  setActiveVariantIndex(index);
184
184
  setUrlVariant(variantName || null);
185
- }, [activeSegment, setUrlVariant]);
185
+ }, [activeFragment, setUrlVariant]);
186
186
 
187
187
  // Copy link handler
188
188
  const handleCopyLink = useCallback(async () => {
@@ -199,27 +199,27 @@ export function App({ segments }: AppProps) {
199
199
  searchInputRef.current?.select();
200
200
  }, []);
201
201
 
202
- // Sorted segment paths for keyboard navigation
203
- const sortedSegmentPaths = useMemo(() => {
204
- return [...segments]
205
- .filter(s => s.segment?.meta?.name)
206
- .sort((a, b) => a.segment.meta.name.localeCompare(b.segment.meta.name))
202
+ // Sorted fragment paths for keyboard navigation
203
+ const sortedFragmentPaths = useMemo(() => {
204
+ return [...fragments]
205
+ .filter(s => s.fragment?.meta?.name)
206
+ .sort((a, b) => a.fragment.meta.name.localeCompare(b.fragment.meta.name))
207
207
  .map(s => s.path);
208
- }, [segments]);
208
+ }, [fragments]);
209
209
 
210
- const currentSegmentIndex = sortedSegmentPaths.indexOf(activeSegmentPath || '');
211
- const variantCount = activeSegment?.segment.variants?.length || 0;
210
+ const currentFragmentIndex = sortedFragmentPaths.indexOf(activeFragmentPath || '');
211
+ const variantCount = activeFragment?.fragment.variants?.length || 0;
212
212
 
213
213
  // Keyboard shortcuts
214
214
  useKeyboardShortcuts(
215
215
  {
216
216
  nextComponent: () => {
217
- const nextIndex = currentSegmentIndex < sortedSegmentPaths.length - 1 ? currentSegmentIndex + 1 : 0;
218
- handleSelectSegment(sortedSegmentPaths[nextIndex]);
217
+ const nextIndex = currentFragmentIndex < sortedFragmentPaths.length - 1 ? currentFragmentIndex + 1 : 0;
218
+ handleSelectFragment(sortedFragmentPaths[nextIndex]);
219
219
  },
220
220
  prevComponent: () => {
221
- const prevIndex = currentSegmentIndex > 0 ? currentSegmentIndex - 1 : sortedSegmentPaths.length - 1;
222
- handleSelectSegment(sortedSegmentPaths[prevIndex]);
221
+ const prevIndex = currentFragmentIndex > 0 ? currentFragmentIndex - 1 : sortedFragmentPaths.length - 1;
222
+ handleSelectFragment(sortedFragmentPaths[prevIndex]);
223
223
  },
224
224
  nextVariant: () => handleSelectVariant(activeVariantIndex < variantCount - 1 ? activeVariantIndex + 1 : 0),
225
225
  prevVariant: () => handleSelectVariant(activeVariantIndex > 0 ? activeVariantIndex - 1 : variantCount - 1),
@@ -269,7 +269,7 @@ export function App({ segments }: AppProps) {
269
269
  }, []);
270
270
 
271
271
  if (isIsolated) {
272
- return <IsolatedRender segments={segments} />;
272
+ return <IsolatedRender fragments={fragments} />;
273
273
  }
274
274
 
275
275
  return (
@@ -278,19 +278,19 @@ export function App({ segments }: AppProps) {
278
278
  <CommandPalette
279
279
  isOpen={uiState.showCommandPalette}
280
280
  onClose={() => uiActions.setCommandPalette(false)}
281
- segments={segments}
282
- onSelectComponent={handleSelectSegment}
281
+ fragments={fragments}
282
+ onSelectComponent={handleSelectFragment}
283
283
  onSelectVariant={(path, variantIndex) => {
284
- handleSelectSegment(path);
284
+ handleSelectFragment(path);
285
285
  setTimeout(() => handleSelectVariant(variantIndex), 0);
286
286
  }}
287
287
  />
288
288
 
289
289
  <Layout
290
290
  header={
291
- activeSegment && !uiState.showHealthDashboard ? (
291
+ activeFragment && !uiState.showHealthDashboard ? (
292
292
  <TopToolbar
293
- segment={activeSegment}
293
+ fragment={activeFragment}
294
294
  variant={activeVariant}
295
295
  viewSettings={viewSettings}
296
296
  uiState={uiState}
@@ -313,14 +313,14 @@ export function App({ segments }: AppProps) {
313
313
  }
314
314
  leftSidebar={
315
315
  <LeftSidebar
316
- segments={segments}
317
- activeSegment={uiState.showHealthDashboard ? null : activeSegmentPath}
316
+ fragments={fragments}
317
+ activeFragment={uiState.showHealthDashboard ? null : activeFragmentPath}
318
318
  searchQuery={searchQuery}
319
- onSelect={handleSelectSegment}
319
+ onSelect={handleSelectFragment}
320
320
  showHealth={uiState.showHealthDashboard}
321
321
  onHealthClick={() => {
322
322
  uiActions.setHealthDashboard(true);
323
- setActiveSegmentPath(null);
323
+ setActiveFragmentPath(null);
324
324
  }}
325
325
  />
326
326
  }
@@ -329,25 +329,25 @@ export function App({ segments }: AppProps) {
329
329
  <div style={{ height: '100%', overflow: 'auto', backgroundColor: 'var(--bg-primary)' }}>
330
330
  <Box padding="lg" style={{ maxWidth: '896px', margin: '0 auto' }}>
331
331
  <HealthDashboard
332
- segments={segments}
332
+ fragments={fragments}
333
333
  onNavigate={(componentName) => {
334
- const target = segments.find(s => s.segment.meta.name === componentName);
334
+ const target = fragments.find(s => s.fragment.meta.name === componentName);
335
335
  if (target) {
336
336
  uiActions.setHealthDashboard(false);
337
- handleSelectSegment(target.path);
337
+ handleSelectFragment(target.path);
338
338
  }
339
339
  }}
340
340
  />
341
341
  </Box>
342
342
  </div>
343
- ) : activeSegment ? (
343
+ ) : activeFragment ? (
344
344
  <div style={{ display: 'flex', height: '100%', flexDirection: panelDock === "bottom" ? 'column' : 'row' }}>
345
345
  {/* Main Content Area */}
346
346
  <div style={{ flex: 1, display: 'flex', flexDirection: 'column', minWidth: 0, minHeight: 0 }}>
347
347
  {/* Variant Tabs */}
348
- {activeSegment.segment.variants && activeSegment.segment.variants.length > 0 && (
348
+ {activeFragment.fragment.variants && activeFragment.fragment.variants.length > 0 && (
349
349
  <VariantTabsBar
350
- variants={activeSegment.segment.variants}
350
+ variants={activeFragment.fragment.variants}
351
351
  activeIndex={activeVariantIndex}
352
352
  onSelect={handleSelectVariant}
353
353
  showMatrixView={uiState.showMatrixView}
@@ -368,10 +368,10 @@ export function App({ segments }: AppProps) {
368
368
  >
369
369
  {activeVariant ? (
370
370
  <PreviewArea
371
- componentName={activeSegment.segment.meta.name}
372
- segmentPath={activeSegment.path}
371
+ componentName={activeFragment.fragment.meta.name}
372
+ fragmentPath={activeFragment.path}
373
373
  variant={activeVariant}
374
- variants={activeSegment.segment.variants}
374
+ variants={activeFragment.fragment.variants}
375
375
  zoom={viewSettings.zoom}
376
376
  background={viewSettings.background}
377
377
  viewport={viewSettings.viewport}
@@ -388,10 +388,10 @@ export function App({ segments }: AppProps) {
388
388
  }}
389
389
  onRetry={uiActions.incrementPreviewKey}
390
390
  renderContent={renderVariantWithProps}
391
- previewKey={`${activeSegmentPath}-${activeVariantIndex}-${uiState.previewKey}`}
391
+ previewKey={`${activeFragmentPath}-${activeVariantIndex}-${uiState.previewKey}`}
392
392
  />
393
393
  ) : (
394
- <NoVariantsMessage segment={activeSegment?.segment} />
394
+ <NoVariantsMessage fragment={activeFragment?.fragment} />
395
395
  )}
396
396
  </div>
397
397
  </div>
@@ -399,9 +399,9 @@ export function App({ segments }: AppProps) {
399
399
  {/* Bottom Panel */}
400
400
  {activeVariant && (
401
401
  <BottomPanel
402
- segment={activeSegment.segment}
402
+ fragment={activeFragment.fragment}
403
403
  variant={activeVariant}
404
- segments={segments}
404
+ fragments={fragments}
405
405
  activePanel={uiState.activePanel}
406
406
  onPanelChange={uiActions.setActivePanel}
407
407
  figmaUrl={figmaUrl}
@@ -414,11 +414,11 @@ export function App({ segments }: AppProps) {
414
414
  actionLogs={actionLogs}
415
415
  onClearActionLogs={clearActionLogs}
416
416
  onNavigateToComponent={(name) => {
417
- const target = segments.find(s => s.segment.meta.name === name);
418
- if (target) handleSelectSegment(target.path);
417
+ const target = fragments.find(s => s.fragment.meta.name === name);
418
+ if (target) handleSelectFragment(target.path);
419
419
  }}
420
420
  previewKey={uiState.previewKey}
421
- segmentKey={`${activeSegmentPath}-${activeVariantIndex}`}
421
+ fragmentKey={`${activeFragmentPath}-${activeVariantIndex}`}
422
422
  />
423
423
  )}
424
424
  </div>
@@ -438,7 +438,7 @@ export function App({ segments }: AppProps) {
438
438
 
439
439
  // Top Toolbar Component
440
440
  interface TopToolbarProps {
441
- segment: { path: string; segment: SegmentDefinition };
441
+ fragment: { path: string; fragment: FragmentDefinition };
442
442
  variant: any;
443
443
  viewSettings: ReturnType<typeof useViewSettings>;
444
444
  uiState: ReturnType<typeof useAppState>['state'];
@@ -498,7 +498,7 @@ function ViewerHeader({ showHealth, searchQuery, onSearchChange, searchInputRef
498
498
  }
499
499
 
500
500
  function TopToolbar({
501
- segment,
501
+ fragment,
502
502
  variant,
503
503
  viewSettings,
504
504
  uiState,
@@ -515,8 +515,8 @@ function TopToolbar({
515
515
  <Header.Trigger />
516
516
  <Header.Brand>
517
517
  <Stack direction="row" align="center" gap="sm">
518
- <Text weight="medium" size="sm">{segment.segment.meta.name}</Text>
519
- <Text size="xs" color="tertiary">{segment.segment.meta.category}</Text>
518
+ <Text weight="medium" size="sm">{fragment.fragment.meta.name}</Text>
519
+ <Text size="xs" color="tertiary">{fragment.fragment.meta.category}</Text>
520
520
  </Stack>
521
521
  </Header.Brand>
522
522
  <HeaderSearch value={searchQuery} onChange={onSearchChange} inputRef={searchInputRef} />
@@ -570,7 +570,7 @@ function TopToolbar({
570
570
  const url = new URL(window.location.href);
571
571
  url.hash = '';
572
572
  url.searchParams.set('isolated', 'true');
573
- url.searchParams.set('component', segment.segment.meta.name);
573
+ url.searchParams.set('component', fragment.fragment.meta.name);
574
574
  url.searchParams.set('variant', variant.name);
575
575
  if (viewSettings.zoom !== 100) url.searchParams.set('zoom', String(viewSettings.zoom));
576
576
  if (viewSettings.background !== 'transparent') url.searchParams.set('bg', viewSettings.background);
@@ -582,7 +582,7 @@ function TopToolbar({
582
582
  <ExternalLinkIcon style={{ width: '16px', height: '16px' }} />
583
583
  </Button>
584
584
  </Tooltip>
585
- <ScreenshotButton componentName={segment.segment.meta.name} variantName={variant.name} />
585
+ <ScreenshotButton componentName={fragment.fragment.meta.name} variantName={variant.name} />
586
586
  <Tooltip content="Copy link to share">
587
587
  <Button
588
588
  onClick={onCopyLink}
@@ -651,11 +651,11 @@ function VariantTabsBar({ variants, activeIndex, onSelect, showMatrixView, showM
651
651
 
652
652
  // No variants message
653
653
  interface NoVariantsMessageProps {
654
- segment?: SegmentDefinition;
654
+ fragment?: FragmentDefinition;
655
655
  }
656
656
 
657
- function NoVariantsMessage({ segment }: NoVariantsMessageProps) {
658
- const skippedVariants = (segment?._generated as any)?.skippedVariants;
657
+ function NoVariantsMessage({ fragment }: NoVariantsMessageProps) {
658
+ const skippedVariants = (fragment?._generated as any)?.skippedVariants;
659
659
 
660
660
  if (!skippedVariants || skippedVariants.length === 0) {
661
661
  return (
@@ -4,7 +4,7 @@
4
4
  */
5
5
 
6
6
  import { memo, useCallback } from 'react';
7
- import type { SegmentDefinition, SegmentVariant } from '../../core/index.js';
7
+ import type { FragmentDefinition, FragmentVariant } from '../../core/index.js';
8
8
  import { Tabs, Badge } from '@fragments/ui';
9
9
  import { ResizablePanel } from './ResizablePanel.js';
10
10
  import { CodePanel } from './CodePanel.js';
@@ -19,9 +19,9 @@ import type { ActionLog } from '../hooks/useActions.js';
19
19
 
20
20
  interface BottomPanelProps {
21
21
  // Component data
22
- segment: SegmentDefinition;
23
- variant: SegmentVariant;
24
- segments: Array<{ path: string; segment: SegmentDefinition }>;
22
+ fragment: FragmentDefinition;
23
+ variant: FragmentVariant;
24
+ fragments: Array<{ path: string; fragment: FragmentDefinition }>;
25
25
 
26
26
  // Panel state
27
27
  activePanel: ActivePanel;
@@ -45,13 +45,13 @@ interface BottomPanelProps {
45
45
 
46
46
  // Keys
47
47
  previewKey: number;
48
- segmentKey: string;
48
+ fragmentKey: string;
49
49
  }
50
50
 
51
51
  export const BottomPanel = memo(function BottomPanel({
52
- segment,
52
+ fragment,
53
53
  variant,
54
- segments,
54
+ fragments,
55
55
  activePanel,
56
56
  onPanelChange,
57
57
  figmaUrl,
@@ -65,7 +65,7 @@ export const BottomPanel = memo(function BottomPanel({
65
65
  onClearActionLogs,
66
66
  onNavigateToComponent,
67
67
  previewKey,
68
- segmentKey,
68
+ fragmentKey,
69
69
  }: BottomPanelProps) {
70
70
  const handleStylesClick = useCallback(() => {
71
71
  onPanelChange('styles');
@@ -121,8 +121,8 @@ export const BottomPanel = memo(function BottomPanel({
121
121
  <div style={{ padding: '16px' }}>
122
122
  <CodePanel
123
123
  variant={variant}
124
- componentName={segment.meta.name}
125
- propDefs={segment.props}
124
+ componentName={fragment.meta.name}
125
+ propDefs={fragment.props}
126
126
  compact
127
127
  />
128
128
  </div>
@@ -142,17 +142,17 @@ export const BottomPanel = memo(function BottomPanel({
142
142
 
143
143
  {activePanel === 'accessibility' && (
144
144
  <AccessibilityPanel
145
- cacheKey={segmentKey}
145
+ cacheKey={fragmentKey}
146
146
  previewKey={previewKey}
147
147
  autoScan={true}
148
- componentName={segment.meta.name}
148
+ componentName={fragment.meta.name}
149
149
  variantName={variant.name}
150
150
  />
151
151
  )}
152
152
 
153
153
  {activePanel === 'interactions' && (
154
154
  <InteractionsPanel
155
- key={segmentKey}
155
+ key={fragmentKey}
156
156
  variant={variant}
157
157
  previewKey={previewKey}
158
158
  />
@@ -167,16 +167,16 @@ export const BottomPanel = memo(function BottomPanel({
167
167
 
168
168
  {activePanel === 'graph' && (
169
169
  <ComponentGraph
170
- segment={segment}
171
- allSegments={segments}
170
+ fragment={fragment}
171
+ allFragments={fragments}
172
172
  onNavigate={onNavigateToComponent}
173
173
  />
174
174
  )}
175
175
 
176
176
  {activePanel === 'contract' && (
177
177
  <ContractPanel
178
- contract={segment.contract}
179
- componentName={segment.meta.name}
178
+ contract={fragment.contract}
179
+ componentName={fragment.meta.name}
180
180
  />
181
181
  )}
182
182
  </ResizablePanel>
@@ -1,16 +1,16 @@
1
1
  import { useMemo, isValidElement, type ReactNode } from 'react';
2
- import type { SegmentVariant, PropDefinition } from '../../core/index.js';
2
+ import type { FragmentVariant, PropDefinition } from '../../core/index.js';
3
3
  import { CodeBlock } from '@fragments/ui';
4
4
 
5
5
  interface CodePanelProps {
6
- variant: SegmentVariant;
6
+ variant: FragmentVariant;
7
7
  componentName: string;
8
8
  compact?: boolean;
9
9
  propDefs?: Record<string, PropDefinition>;
10
10
  }
11
11
 
12
12
  // Extract props from rendered element by calling render() and introspecting
13
- function extractPropsFromRender(variant: SegmentVariant, componentName: string): Record<string, unknown> | null {
13
+ function extractPropsFromRender(variant: FragmentVariant, componentName: string): Record<string, unknown> | null {
14
14
  try {
15
15
  const rendered = variant.render();
16
16
  if (!isValidElement(rendered)) return null;
@@ -11,7 +11,7 @@
11
11
 
12
12
  import { useState, useEffect, useRef, useMemo, useCallback } from "react";
13
13
  import { Dialog, Stack, Text, Badge, Separator, Input } from '@fragments/ui';
14
- import type { SegmentDefinition } from "../../core/index.js";
14
+ import type { FragmentDefinition } from "../../core/index.js";
15
15
  import { SearchIcon, ChevronRightIcon } from "./Icons.js";
16
16
 
17
17
  interface CommandPaletteProps {
@@ -19,8 +19,8 @@ interface CommandPaletteProps {
19
19
  isOpen: boolean;
20
20
  /** Callback to close the palette */
21
21
  onClose: () => void;
22
- /** All available segments */
23
- segments: Array<{ path: string; segment: SegmentDefinition }>;
22
+ /** All available fragments */
23
+ fragments: Array<{ path: string; fragment: FragmentDefinition }>;
24
24
  /** Callback when a component is selected */
25
25
  onSelectComponent: (path: string) => void;
26
26
  /** Callback when a variant is selected */
@@ -40,7 +40,7 @@ interface SearchResult {
40
40
  export function CommandPalette({
41
41
  isOpen,
42
42
  onClose,
43
- segments,
43
+ fragments,
44
44
  onSelectComponent,
45
45
  onSelectVariant,
46
46
  }: CommandPaletteProps) {
@@ -53,9 +53,9 @@ export function CommandPalette({
53
53
  const results = useMemo(() => {
54
54
  const allResults: SearchResult[] = [];
55
55
 
56
- for (const { path, segment } of segments) {
57
- const componentName = segment.meta.name;
58
- const category = segment.meta.category;
56
+ for (const { path, fragment } of fragments) {
57
+ const componentName = fragment.meta.name;
58
+ const category = fragment.meta.category;
59
59
 
60
60
  // Add component result
61
61
  allResults.push({
@@ -67,9 +67,9 @@ export function CommandPalette({
67
67
  });
68
68
 
69
69
  // Add variant results
70
- if (segment.variants) {
71
- for (let i = 0; i < segment.variants.length; i++) {
72
- const variant = segment.variants[i];
70
+ if (fragment.variants) {
71
+ for (let i = 0; i < fragment.variants.length; i++) {
72
+ const variant = fragment.variants[i];
73
73
  allResults.push({
74
74
  type: "variant",
75
75
  path,
@@ -106,7 +106,7 @@ export function CommandPalette({
106
106
  .slice(0, 20);
107
107
 
108
108
  return scored;
109
- }, [segments, query]);
109
+ }, [fragments, query]);
110
110
 
111
111
  // Reset selection when results change
112
112
  useEffect(() => {