prev-cli 0.24.19 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (150) hide show
  1. package/dist/cli.js +2006 -1703
  2. package/dist/previews/components/cart-item/index.d.ts +5 -0
  3. package/dist/previews/components/price-tag/index.d.ts +6 -0
  4. package/dist/previews/screens/cart/empty.d.ts +1 -0
  5. package/dist/previews/screens/cart/index.d.ts +1 -0
  6. package/dist/previews/screens/payment/error.d.ts +1 -0
  7. package/dist/previews/screens/payment/index.d.ts +1 -0
  8. package/dist/previews/screens/payment/processing.d.ts +1 -0
  9. package/dist/previews/screens/receipt/index.d.ts +1 -0
  10. package/dist/previews/shared/data.d.ts +30 -0
  11. package/dist/src/content/config-parser.d.ts +30 -0
  12. package/dist/src/content/flow-verifier.d.ts +21 -0
  13. package/dist/src/content/preview-types.d.ts +288 -0
  14. package/dist/{vite → src/content}/previews.d.ts +3 -11
  15. package/dist/{preview-runtime → src/preview-runtime}/build-optimized.d.ts +2 -0
  16. package/dist/{preview-runtime → src/preview-runtime}/build.d.ts +1 -1
  17. package/dist/src/preview-runtime/region-bridge.d.ts +1 -0
  18. package/dist/{preview-runtime → src/preview-runtime}/types.d.ts +18 -0
  19. package/dist/src/preview-runtime/vendors.d.ts +11 -0
  20. package/dist/{renderers → src/renderers}/index.d.ts +1 -1
  21. package/dist/{renderers → src/renderers}/types.d.ts +3 -31
  22. package/dist/src/server/build.d.ts +6 -0
  23. package/dist/src/server/dev.d.ts +13 -0
  24. package/dist/src/server/plugins/aliases.d.ts +5 -0
  25. package/dist/src/server/plugins/mdx.d.ts +5 -0
  26. package/dist/src/server/plugins/virtual-modules.d.ts +8 -0
  27. package/dist/src/server/preview.d.ts +10 -0
  28. package/dist/src/server/routes/component-bundle.d.ts +1 -0
  29. package/dist/src/server/routes/jsx-bundle.d.ts +3 -0
  30. package/dist/src/server/routes/og-image.d.ts +15 -0
  31. package/dist/src/server/routes/preview-bundle.d.ts +1 -0
  32. package/dist/src/server/routes/preview-config.d.ts +1 -0
  33. package/dist/src/server/routes/tokens.d.ts +1 -0
  34. package/dist/{vite → src/server}/start.d.ts +5 -2
  35. package/dist/{ui → src/ui}/button.d.ts +1 -1
  36. package/dist/{validators → src/validators}/index.d.ts +0 -5
  37. package/dist/{validators → src/validators}/semantic-validator.d.ts +2 -3
  38. package/package.json +8 -11
  39. package/src/jsx/CLAUDE.md +18 -0
  40. package/src/jsx/jsx-runtime.ts +1 -1
  41. package/src/preview-runtime/CLAUDE.md +21 -0
  42. package/src/preview-runtime/build-optimized.ts +189 -73
  43. package/src/preview-runtime/build.ts +75 -79
  44. package/src/preview-runtime/fast-template.html +5 -1
  45. package/src/preview-runtime/region-bridge.test.ts +41 -0
  46. package/src/preview-runtime/region-bridge.ts +101 -0
  47. package/src/preview-runtime/types.ts +6 -0
  48. package/src/preview-runtime/vendors.ts +215 -22
  49. package/src/primitives/CLAUDE.md +17 -0
  50. package/src/theme/CLAUDE.md +20 -0
  51. package/src/theme/Preview.tsx +10 -4
  52. package/src/theme/Toolbar.tsx +2 -2
  53. package/src/theme/entry.tsx +247 -121
  54. package/src/theme/hooks/useAnnotations.ts +77 -0
  55. package/src/theme/hooks/useApprovalStatus.ts +50 -0
  56. package/src/theme/hooks/useSnapshots.ts +147 -0
  57. package/src/theme/hooks/useStorage.ts +26 -0
  58. package/src/theme/hooks/useTokenOverrides.ts +56 -0
  59. package/src/theme/hooks/useViewport.ts +23 -0
  60. package/src/theme/icons.tsx +39 -1
  61. package/src/theme/index.html +18 -0
  62. package/src/theme/mdx-components.tsx +1 -1
  63. package/src/theme/previews/AnnotationLayer.tsx +285 -0
  64. package/src/theme/previews/AnnotationPin.tsx +61 -0
  65. package/src/theme/previews/AnnotationThread.tsx +257 -0
  66. package/src/theme/previews/CLAUDE.md +18 -0
  67. package/src/theme/previews/ComponentPreview.tsx +487 -107
  68. package/src/theme/previews/FlowDiagram.tsx +111 -0
  69. package/src/theme/previews/FlowPreview.tsx +938 -174
  70. package/src/theme/previews/PreviewRouter.tsx +1 -4
  71. package/src/theme/previews/ScreenPreview.tsx +515 -175
  72. package/src/theme/previews/SnapshotButton.tsx +68 -0
  73. package/src/theme/previews/SnapshotCompare.tsx +216 -0
  74. package/src/theme/previews/SnapshotPanel.tsx +274 -0
  75. package/src/theme/previews/StatusBadge.tsx +66 -0
  76. package/src/theme/previews/StatusDropdown.tsx +158 -0
  77. package/src/theme/previews/TokenPlayground.tsx +438 -0
  78. package/src/theme/previews/ViewportControls.tsx +67 -0
  79. package/src/theme/previews/flow-diagram.test.ts +141 -0
  80. package/src/theme/previews/flow-diagram.ts +109 -0
  81. package/src/theme/previews/flow-navigation.test.ts +90 -0
  82. package/src/theme/previews/flow-navigation.ts +47 -0
  83. package/src/theme/previews/machines/derived.test.ts +225 -0
  84. package/src/theme/previews/machines/derived.ts +73 -0
  85. package/src/theme/previews/machines/flow-machine.test.ts +379 -0
  86. package/src/theme/previews/machines/flow-machine.ts +207 -0
  87. package/src/theme/previews/machines/screen-machine.test.ts +149 -0
  88. package/src/theme/previews/machines/screen-machine.ts +76 -0
  89. package/src/theme/previews/stores/flow-store.test.ts +157 -0
  90. package/src/theme/previews/stores/flow-store.ts +49 -0
  91. package/src/theme/previews/stores/screen-store.test.ts +68 -0
  92. package/src/theme/previews/stores/screen-store.ts +33 -0
  93. package/src/theme/storage.test.ts +97 -0
  94. package/src/theme/storage.ts +71 -0
  95. package/src/theme/styles.css +296 -25
  96. package/src/theme/types.ts +64 -0
  97. package/src/tokens/CLAUDE.md +16 -0
  98. package/src/tokens/resolver.ts +1 -1
  99. package/dist/preview-runtime/vendors.d.ts +0 -6
  100. package/dist/vite/config-parser.d.ts +0 -13
  101. package/dist/vite/config.d.ts +0 -12
  102. package/dist/vite/plugins/config-plugin.d.ts +0 -3
  103. package/dist/vite/plugins/debug-plugin.d.ts +0 -3
  104. package/dist/vite/plugins/entry-plugin.d.ts +0 -2
  105. package/dist/vite/plugins/fumadocs-plugin.d.ts +0 -9
  106. package/dist/vite/plugins/pages-plugin.d.ts +0 -5
  107. package/dist/vite/plugins/previews-plugin.d.ts +0 -2
  108. package/dist/vite/plugins/tokens-plugin.d.ts +0 -2
  109. package/dist/vite/preview-types.d.ts +0 -70
  110. package/src/theme/previews/AtlasPreview.tsx +0 -528
  111. package/dist/{cli.d.ts → src/cli.d.ts} +0 -0
  112. package/dist/{config → src/config}/index.d.ts +0 -0
  113. package/dist/{config → src/config}/loader.d.ts +0 -0
  114. package/dist/{config → src/config}/schema.d.ts +0 -0
  115. package/dist/{vite → src/content}/pages.d.ts +0 -0
  116. package/dist/{jsx → src/jsx}/adapters/html.d.ts +0 -0
  117. package/dist/{jsx → src/jsx}/adapters/react.d.ts +0 -0
  118. package/dist/{jsx → src/jsx}/define-component.d.ts +0 -0
  119. package/dist/{jsx → src/jsx}/index.d.ts +0 -0
  120. package/dist/{jsx → src/jsx}/jsx-runtime.d.ts +0 -0
  121. package/dist/{jsx → src/jsx}/migrate.d.ts +0 -0
  122. package/dist/{jsx → src/jsx}/schemas/index.d.ts +0 -0
  123. package/dist/{jsx → src/jsx}/schemas/primitives.d.ts +10 -10
  124. package/dist/{jsx → src/jsx}/schemas/tokens.d.ts +3 -3
  125. /package/dist/{jsx → src/jsx}/validation.d.ts +0 -0
  126. /package/dist/{jsx → src/jsx}/vnode.d.ts +0 -0
  127. /package/dist/{migrate.d.ts → src/migrate.d.ts} +0 -0
  128. /package/dist/{preview-runtime → src/preview-runtime}/tailwind.d.ts +0 -0
  129. /package/dist/{primitives → src/primitives}/index.d.ts +0 -0
  130. /package/dist/{primitives → src/primitives}/migrate.d.ts +0 -0
  131. /package/dist/{primitives → src/primitives}/parser.d.ts +0 -0
  132. /package/dist/{primitives → src/primitives}/template-parser.d.ts +0 -0
  133. /package/dist/{primitives → src/primitives}/template-renderer.d.ts +0 -0
  134. /package/dist/{primitives → src/primitives}/types.d.ts +0 -0
  135. /package/dist/{renderers → src/renderers}/html/index.d.ts +0 -0
  136. /package/dist/{renderers → src/renderers}/react/index.d.ts +0 -0
  137. /package/dist/{renderers → src/renderers}/registry.d.ts +0 -0
  138. /package/dist/{renderers → src/renderers}/render.d.ts +0 -0
  139. /package/dist/{tokens → src/tokens}/defaults.d.ts +0 -0
  140. /package/dist/{tokens → src/tokens}/resolver.d.ts +0 -0
  141. /package/dist/{tokens → src/tokens}/utils.d.ts +0 -0
  142. /package/dist/{tokens → src/tokens}/validation.d.ts +0 -0
  143. /package/dist/{typecheck → src/typecheck}/index.d.ts +0 -0
  144. /package/dist/{ui → src/ui}/card.d.ts +0 -0
  145. /package/dist/{ui → src/ui}/index.d.ts +0 -0
  146. /package/dist/{ui → src/ui}/utils.d.ts +0 -0
  147. /package/dist/{utils → src/utils}/cache.d.ts +0 -0
  148. /package/dist/{utils → src/utils}/debug.d.ts +0 -0
  149. /package/dist/{utils → src/utils}/port.d.ts +0 -0
  150. /package/dist/{validators → src/validators}/schema-validator.d.ts +0 -0
@@ -1,528 +0,0 @@
1
- import React, { useState, useEffect } from 'react'
2
- import type { PreviewUnit, AtlasDefinition } from '../../vite/preview-types'
3
-
4
- interface AtlasPreviewProps {
5
- unit: PreviewUnit
6
- }
7
-
8
- type ViewMode = 'tree' | 'map' | 'navigate'
9
-
10
- export function AtlasPreview({ unit }: AtlasPreviewProps) {
11
- const [atlas, setAtlas] = useState<AtlasDefinition | null>(null)
12
- const [viewMode, setViewMode] = useState<ViewMode>('tree')
13
- const [selectedArea, setSelectedArea] = useState<string | null>(null)
14
- const [loading, setLoading] = useState(true)
15
-
16
- // Load atlas definition
17
- useEffect(() => {
18
- fetch(`/_preview-config/atlas/${unit.name}`)
19
- .then(res => res.json())
20
- .then(data => {
21
- setAtlas(data)
22
- setSelectedArea(data.hierarchy?.root || null)
23
- setLoading(false)
24
- })
25
- .catch(() => setLoading(false))
26
- }, [unit.name])
27
-
28
- if (loading) {
29
- return (
30
- <div style={{
31
- padding: '32px',
32
- textAlign: 'center',
33
- color: 'var(--fd-muted-foreground)',
34
- }}>
35
- Loading atlas...
36
- </div>
37
- )
38
- }
39
-
40
- if (!atlas || !atlas.hierarchy) {
41
- return (
42
- <div style={{
43
- padding: '32px',
44
- textAlign: 'center',
45
- color: 'oklch(0.65 0.15 85)',
46
- }}>
47
- <h2 style={{
48
- margin: '0 0 8px 0',
49
- fontSize: '18px',
50
- fontWeight: 600,
51
- }}>
52
- {unit.config?.title || unit.name}
53
- </h2>
54
- <p style={{ margin: 0 }}>
55
- {atlas ? 'This atlas has no hierarchy defined.' : 'Failed to load atlas definition.'}
56
- </p>
57
- </div>
58
- )
59
- }
60
-
61
- // Fix 8: Tree view with cycle detection
62
- const renderTree = (areaId: string, depth = 0, visited = new Set<string>()): React.ReactNode => {
63
- // Cycle detection
64
- if (visited.has(areaId)) {
65
- return (
66
- <div
67
- key={`cycle-${areaId}-${depth}`}
68
- style={{
69
- marginLeft: `${depth * 24}px`,
70
- padding: '8px 12px',
71
- color: 'oklch(0.65 0.20 25)',
72
- fontSize: '14px',
73
- }}
74
- >
75
- Cycle detected: {areaId}
76
- </div>
77
- )
78
- }
79
- visited.add(areaId)
80
-
81
- const area = atlas.hierarchy.areas[areaId]
82
- if (!area) {
83
- return (
84
- <div
85
- key={`missing-${areaId}-${depth}`}
86
- style={{
87
- marginLeft: `${depth * 24}px`,
88
- padding: '8px 12px',
89
- color: 'var(--fd-muted-foreground)',
90
- fontSize: '14px',
91
- fontStyle: 'italic',
92
- }}
93
- >
94
- Missing area: {areaId}
95
- </div>
96
- )
97
- }
98
-
99
- const hasChildren = area.children && area.children.length > 0
100
- const isSelected = selectedArea === areaId
101
-
102
- return (
103
- <div key={`${areaId}-${depth}`}>
104
- <button
105
- onClick={() => setSelectedArea(areaId)}
106
- style={{
107
- display: 'flex',
108
- alignItems: 'center',
109
- gap: '8px',
110
- width: '100%',
111
- textAlign: 'left',
112
- marginLeft: `${depth * 24}px`,
113
- padding: '8px 12px',
114
- border: 'none',
115
- borderRadius: '4px',
116
- cursor: 'pointer',
117
- backgroundColor: isSelected ? 'var(--fd-primary)' : 'transparent',
118
- color: isSelected ? 'var(--fd-primary-foreground)' : 'var(--fd-foreground)',
119
- fontSize: '14px',
120
- fontWeight: isSelected ? 500 : 400,
121
- transition: 'background-color 0.15s, color 0.15s',
122
- }}
123
- onMouseEnter={(e) => {
124
- if (!isSelected) {
125
- e.currentTarget.style.backgroundColor = 'var(--fd-secondary)'
126
- }
127
- }}
128
- onMouseLeave={(e) => {
129
- if (!isSelected) {
130
- e.currentTarget.style.backgroundColor = 'transparent'
131
- }
132
- }}
133
- >
134
- <span style={{
135
- width: '16px',
136
- textAlign: 'center',
137
- color: isSelected ? 'var(--fd-primary-foreground)' : 'var(--fd-muted-foreground)',
138
- }}>
139
- {hasChildren ? (depth === 0 ? '/' : '+') : '-'}
140
- </span>
141
- <span>{area.title}</span>
142
- {area.access && (
143
- <span style={{
144
- marginLeft: 'auto',
145
- padding: '2px 6px',
146
- fontSize: '11px',
147
- borderRadius: '3px',
148
- backgroundColor: isSelected ? 'rgba(255,255,255,0.2)' : 'var(--fd-muted)',
149
- color: isSelected ? 'var(--fd-primary-foreground)' : 'var(--fd-muted-foreground)',
150
- }}>
151
- {area.access}
152
- </span>
153
- )}
154
- </button>
155
- {hasChildren && area.children?.map(childId =>
156
- renderTree(childId, depth + 1, new Set(visited))
157
- )}
158
- </div>
159
- )
160
- }
161
-
162
- // Navigate view: sidebar + screen preview
163
- const renderNavigateView = () => {
164
- const selectedAreaData = selectedArea ? atlas.hierarchy.areas[selectedArea] : null
165
- const routes = atlas.routes || {}
166
- const areaRoutes = Object.entries(routes).filter(([, r]) => r.area === selectedArea)
167
-
168
- return (
169
- <div style={{
170
- display: 'flex',
171
- gap: '24px',
172
- padding: '24px',
173
- backgroundColor: 'var(--fd-muted)',
174
- minHeight: '400px',
175
- }}>
176
- {/* Sidebar */}
177
- <div style={{
178
- width: '280px',
179
- flexShrink: 0,
180
- backgroundColor: 'var(--fd-background)',
181
- borderRadius: '8px',
182
- padding: '16px',
183
- overflow: 'auto',
184
- }}>
185
- <h3 style={{
186
- margin: '0 0 12px 0',
187
- fontSize: '14px',
188
- fontWeight: 600,
189
- color: 'var(--fd-foreground)',
190
- }}>
191
- Areas
192
- </h3>
193
- {renderTree(atlas.hierarchy.root)}
194
- </div>
195
-
196
- {/* Screen preview area */}
197
- <div style={{
198
- flex: 1,
199
- backgroundColor: 'var(--fd-background)',
200
- borderRadius: '8px',
201
- padding: '24px',
202
- display: 'flex',
203
- flexDirection: 'column',
204
- }}>
205
- {selectedAreaData ? (
206
- <>
207
- <div style={{ marginBottom: '16px' }}>
208
- <h3 style={{
209
- margin: '0 0 4px 0',
210
- fontSize: '18px',
211
- fontWeight: 600,
212
- color: 'var(--fd-foreground)',
213
- }}>
214
- {selectedAreaData.title}
215
- </h3>
216
- {selectedAreaData.description && (
217
- <p style={{
218
- margin: 0,
219
- fontSize: '14px',
220
- color: 'var(--fd-muted-foreground)',
221
- }}>
222
- {selectedAreaData.description}
223
- </p>
224
- )}
225
- </div>
226
-
227
- {/* Routes in this area */}
228
- {areaRoutes.length > 0 ? (
229
- <div>
230
- <h4 style={{
231
- margin: '0 0 12px 0',
232
- fontSize: '14px',
233
- fontWeight: 500,
234
- color: 'var(--fd-foreground)',
235
- }}>
236
- Routes
237
- </h4>
238
- <div style={{
239
- display: 'flex',
240
- flexDirection: 'column',
241
- gap: '8px',
242
- }}>
243
- {areaRoutes.map(([path, route]) => (
244
- <div
245
- key={path}
246
- style={{
247
- padding: '12px',
248
- backgroundColor: 'var(--fd-muted)',
249
- borderRadius: '4px',
250
- fontSize: '14px',
251
- }}
252
- >
253
- <div style={{
254
- fontFamily: 'var(--fd-font-mono)',
255
- color: 'var(--fd-foreground)',
256
- marginBottom: '4px',
257
- }}>
258
- {path}
259
- </div>
260
- <div style={{
261
- display: 'flex',
262
- gap: '8px',
263
- color: 'var(--fd-muted-foreground)',
264
- fontSize: '13px',
265
- }}>
266
- <span>Screen: {route.screen}</span>
267
- {route.guard && <span>Guard: {route.guard}</span>}
268
- </div>
269
- </div>
270
- ))}
271
- </div>
272
- </div>
273
- ) : (
274
- <div style={{
275
- flex: 1,
276
- display: 'flex',
277
- alignItems: 'center',
278
- justifyContent: 'center',
279
- color: 'var(--fd-muted-foreground)',
280
- fontSize: '14px',
281
- }}>
282
- No routes defined for this area
283
- </div>
284
- )}
285
- </>
286
- ) : (
287
- <div style={{
288
- flex: 1,
289
- display: 'flex',
290
- alignItems: 'center',
291
- justifyContent: 'center',
292
- color: 'var(--fd-muted-foreground)',
293
- fontSize: '14px',
294
- }}>
295
- Select an area to view details
296
- </div>
297
- )}
298
- </div>
299
- </div>
300
- )
301
- }
302
-
303
- // Map view: placeholder for future D2/Mermaid diagram
304
- const renderMapView = () => {
305
- return (
306
- <div style={{
307
- padding: '48px',
308
- display: 'flex',
309
- flexDirection: 'column',
310
- alignItems: 'center',
311
- justifyContent: 'center',
312
- backgroundColor: 'var(--fd-muted)',
313
- minHeight: '400px',
314
- }}>
315
- <div style={{
316
- padding: '24px 32px',
317
- backgroundColor: 'var(--fd-background)',
318
- borderRadius: '8px',
319
- textAlign: 'center',
320
- }}>
321
- <h3 style={{
322
- margin: '0 0 8px 0',
323
- fontSize: '16px',
324
- fontWeight: 600,
325
- color: 'var(--fd-foreground)',
326
- }}>
327
- Map View
328
- </h3>
329
- <p style={{
330
- margin: 0,
331
- fontSize: '14px',
332
- color: 'var(--fd-muted-foreground)',
333
- }}>
334
- D2/Mermaid diagram visualization coming soon
335
- </p>
336
- </div>
337
- </div>
338
- )
339
- }
340
-
341
- // Tree view: full hierarchy
342
- const renderTreeView = () => {
343
- return (
344
- <div style={{
345
- padding: '24px',
346
- backgroundColor: 'var(--fd-muted)',
347
- }}>
348
- <div style={{
349
- backgroundColor: 'var(--fd-background)',
350
- borderRadius: '8px',
351
- padding: '16px',
352
- }}>
353
- {renderTree(atlas.hierarchy.root)}
354
- </div>
355
- </div>
356
- )
357
- }
358
-
359
- const viewModeButtons: { mode: ViewMode; label: string }[] = [
360
- { mode: 'tree', label: 'Tree' },
361
- { mode: 'map', label: 'Map' },
362
- { mode: 'navigate', label: 'Navigate' },
363
- ]
364
-
365
- return (
366
- <div style={{
367
- display: 'flex',
368
- flexDirection: 'column',
369
- border: '1px solid var(--fd-border)',
370
- borderRadius: '8px',
371
- overflow: 'hidden',
372
- backgroundColor: 'var(--fd-background)',
373
- }}>
374
- {/* Header */}
375
- <div style={{
376
- display: 'flex',
377
- alignItems: 'center',
378
- justifyContent: 'space-between',
379
- padding: '12px 16px',
380
- backgroundColor: 'var(--fd-muted)',
381
- borderBottom: '1px solid var(--fd-border)',
382
- }}>
383
- <div>
384
- <h2 style={{
385
- margin: 0,
386
- fontSize: '18px',
387
- fontWeight: 600,
388
- color: 'var(--fd-foreground)',
389
- }}>
390
- {atlas.name}
391
- </h2>
392
- {atlas.description && (
393
- <p style={{
394
- margin: '4px 0 0 0',
395
- fontSize: '14px',
396
- color: 'var(--fd-muted-foreground)',
397
- }}>
398
- {atlas.description}
399
- </p>
400
- )}
401
- </div>
402
-
403
- {/* View mode toggle */}
404
- <div style={{
405
- display: 'flex',
406
- gap: '4px',
407
- }}>
408
- {viewModeButtons.map(({ mode, label }) => (
409
- <button
410
- key={mode}
411
- onClick={() => setViewMode(mode)}
412
- style={{
413
- padding: '6px 12px',
414
- fontSize: '13px',
415
- border: 'none',
416
- borderRadius: '4px',
417
- cursor: 'pointer',
418
- backgroundColor: viewMode === mode ? 'var(--fd-primary)' : 'transparent',
419
- color: viewMode === mode ? 'var(--fd-primary-foreground)' : 'var(--fd-muted-foreground)',
420
- fontWeight: viewMode === mode ? 500 : 400,
421
- transition: 'background-color 0.15s, color 0.15s',
422
- }}
423
- onMouseEnter={(e) => {
424
- if (viewMode !== mode) {
425
- e.currentTarget.style.backgroundColor = 'var(--fd-secondary)'
426
- e.currentTarget.style.color = 'var(--fd-foreground)'
427
- }
428
- }}
429
- onMouseLeave={(e) => {
430
- if (viewMode !== mode) {
431
- e.currentTarget.style.backgroundColor = 'transparent'
432
- e.currentTarget.style.color = 'var(--fd-muted-foreground)'
433
- }
434
- }}
435
- >
436
- {label}
437
- </button>
438
- ))}
439
- </div>
440
- </div>
441
-
442
- {/* Content based on view mode */}
443
- {viewMode === 'tree' && renderTreeView()}
444
- {viewMode === 'map' && renderMapView()}
445
- {viewMode === 'navigate' && renderNavigateView()}
446
-
447
- {/* Relationships section */}
448
- {atlas.relationships && atlas.relationships.length > 0 && (
449
- <div style={{
450
- padding: '16px',
451
- borderTop: '1px solid var(--fd-border)',
452
- backgroundColor: 'var(--fd-muted)',
453
- }}>
454
- <h3 style={{
455
- margin: '0 0 12px 0',
456
- fontSize: '14px',
457
- fontWeight: 500,
458
- color: 'var(--fd-foreground)',
459
- }}>
460
- Relationships
461
- </h3>
462
- <div style={{
463
- display: 'flex',
464
- flexWrap: 'wrap',
465
- gap: '8px',
466
- }}>
467
- {atlas.relationships.map((rel, i) => (
468
- <div
469
- key={i}
470
- style={{
471
- display: 'flex',
472
- alignItems: 'center',
473
- gap: '8px',
474
- padding: '8px 12px',
475
- backgroundColor: 'var(--fd-background)',
476
- borderRadius: '4px',
477
- fontSize: '13px',
478
- }}
479
- >
480
- <span style={{ color: 'var(--fd-foreground)' }}>
481
- {atlas.hierarchy.areas[rel.from]?.title || rel.from}
482
- </span>
483
- <span style={{
484
- padding: '2px 6px',
485
- backgroundColor: 'var(--fd-secondary)',
486
- borderRadius: '3px',
487
- color: 'var(--fd-secondary-foreground)',
488
- fontSize: '11px',
489
- }}>
490
- {rel.type}
491
- </span>
492
- <span style={{ color: 'var(--fd-foreground)' }}>
493
- {atlas.hierarchy.areas[rel.to]?.title || rel.to}
494
- </span>
495
- </div>
496
- ))}
497
- </div>
498
- </div>
499
- )}
500
-
501
- {/* Tags */}
502
- {unit.config?.tags && unit.config.tags.length > 0 && (
503
- <div style={{
504
- padding: '12px 16px',
505
- borderTop: '1px solid var(--fd-border)',
506
- display: 'flex',
507
- gap: '8px',
508
- flexWrap: 'wrap',
509
- }}>
510
- {unit.config.tags.map(tag => (
511
- <span
512
- key={tag}
513
- style={{
514
- padding: '2px 8px',
515
- fontSize: '12px',
516
- backgroundColor: 'var(--fd-secondary)',
517
- color: 'var(--fd-secondary-foreground)',
518
- borderRadius: '4px',
519
- }}
520
- >
521
- {tag}
522
- </span>
523
- ))}
524
- </div>
525
- )}
526
- </div>
527
- )
528
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -10,8 +10,8 @@ export declare const ColProps: z.ZodObject<{
10
10
  "2xl": "2xl";
11
11
  }>>;
12
12
  align: z.ZodOptional<z.ZodEnum<{
13
- end: "end";
14
13
  start: "start";
14
+ end: "end";
15
15
  center: "center";
16
16
  stretch: "stretch";
17
17
  between: "between";
@@ -39,8 +39,8 @@ export declare const RowProps: z.ZodObject<{
39
39
  "2xl": "2xl";
40
40
  }>>;
41
41
  align: z.ZodOptional<z.ZodEnum<{
42
- end: "end";
43
42
  start: "start";
43
+ end: "end";
44
44
  center: "center";
45
45
  stretch: "stretch";
46
46
  between: "between";
@@ -79,12 +79,12 @@ export declare const BoxProps: z.ZodObject<{
79
79
  card: "card";
80
80
  }>>;
81
81
  radius: z.ZodOptional<z.ZodEnum<{
82
+ full: "full";
82
83
  none: "none";
83
84
  sm: "sm";
84
85
  md: "md";
85
86
  lg: "lg";
86
87
  xl: "xl";
87
- full: "full";
88
88
  }>>;
89
89
  children: z.ZodOptional<z.ZodAny>;
90
90
  }, z.core.$strip>;
@@ -108,12 +108,12 @@ export type SlotProps = z.infer<typeof SlotProps>;
108
108
  export declare const TextProps: z.ZodObject<{
109
109
  children: z.ZodOptional<z.ZodString>;
110
110
  size: z.ZodOptional<z.ZodEnum<{
111
- base: "base";
112
111
  xs: "xs";
113
112
  sm: "sm";
114
113
  lg: "lg";
115
114
  xl: "xl";
116
115
  "2xl": "2xl";
116
+ base: "base";
117
117
  }>>;
118
118
  weight: z.ZodOptional<z.ZodEnum<{
119
119
  bold: "bold";
@@ -142,12 +142,12 @@ export type TextProps = z.infer<typeof TextProps>;
142
142
  export declare const IconProps: z.ZodObject<{
143
143
  name: z.ZodString;
144
144
  size: z.ZodOptional<z.ZodEnum<{
145
- base: "base";
146
145
  xs: "xs";
147
146
  sm: "sm";
148
147
  lg: "lg";
149
148
  xl: "xl";
150
149
  "2xl": "2xl";
150
+ base: "base";
151
151
  }>>;
152
152
  color: z.ZodOptional<z.ZodEnum<{
153
153
  foreground: "foreground";
@@ -200,8 +200,8 @@ export declare const PrimitiveProps: z.ZodUnion<readonly [z.ZodObject<{
200
200
  "2xl": "2xl";
201
201
  }>>;
202
202
  align: z.ZodOptional<z.ZodEnum<{
203
- end: "end";
204
203
  start: "start";
204
+ end: "end";
205
205
  center: "center";
206
206
  stretch: "stretch";
207
207
  between: "between";
@@ -227,8 +227,8 @@ export declare const PrimitiveProps: z.ZodUnion<readonly [z.ZodObject<{
227
227
  "2xl": "2xl";
228
228
  }>>;
229
229
  align: z.ZodOptional<z.ZodEnum<{
230
- end: "end";
231
230
  start: "start";
231
+ end: "end";
232
232
  center: "center";
233
233
  stretch: "stretch";
234
234
  between: "between";
@@ -265,12 +265,12 @@ export declare const PrimitiveProps: z.ZodUnion<readonly [z.ZodObject<{
265
265
  card: "card";
266
266
  }>>;
267
267
  radius: z.ZodOptional<z.ZodEnum<{
268
+ full: "full";
268
269
  none: "none";
269
270
  sm: "sm";
270
271
  md: "md";
271
272
  lg: "lg";
272
273
  xl: "xl";
273
- full: "full";
274
274
  }>>;
275
275
  children: z.ZodOptional<z.ZodAny>;
276
276
  }, z.core.$strip>, z.ZodObject<{
@@ -288,12 +288,12 @@ export declare const PrimitiveProps: z.ZodUnion<readonly [z.ZodObject<{
288
288
  }, z.core.$strip>, z.ZodObject<{
289
289
  children: z.ZodOptional<z.ZodString>;
290
290
  size: z.ZodOptional<z.ZodEnum<{
291
- base: "base";
292
291
  xs: "xs";
293
292
  sm: "sm";
294
293
  lg: "lg";
295
294
  xl: "xl";
296
295
  "2xl": "2xl";
296
+ base: "base";
297
297
  }>>;
298
298
  weight: z.ZodOptional<z.ZodEnum<{
299
299
  bold: "bold";
@@ -320,12 +320,12 @@ export declare const PrimitiveProps: z.ZodUnion<readonly [z.ZodObject<{
320
320
  }, z.core.$strip>, z.ZodObject<{
321
321
  name: z.ZodString;
322
322
  size: z.ZodOptional<z.ZodEnum<{
323
- base: "base";
324
323
  xs: "xs";
325
324
  sm: "sm";
326
325
  lg: "lg";
327
326
  xl: "xl";
328
327
  "2xl": "2xl";
328
+ base: "base";
329
329
  }>>;
330
330
  color: z.ZodOptional<z.ZodEnum<{
331
331
  foreground: "foreground";