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
@@ -0,0 +1,61 @@
1
+ import React from 'react'
2
+ import type { AnnotationCategory } from '../types'
3
+
4
+ const CATEGORY_COLORS: Record<AnnotationCategory, string> = {
5
+ bug: 'oklch(0.65 0.20 25)',
6
+ copy: 'oklch(0.65 0.15 250)',
7
+ design: 'oklch(0.65 0.18 310)',
8
+ general: 'oklch(0.65 0.10 85)',
9
+ }
10
+
11
+ interface AnnotationPinProps {
12
+ x: number
13
+ y: number
14
+ index: number
15
+ category: AnnotationCategory
16
+ resolved: boolean
17
+ isActive: boolean
18
+ onClick: () => void
19
+ }
20
+
21
+ export function AnnotationPin({ x, y, index, category, resolved, isActive, onClick }: AnnotationPinProps) {
22
+ const color = CATEGORY_COLORS[category]
23
+
24
+ return (
25
+ <button
26
+ onClick={(e) => {
27
+ e.stopPropagation()
28
+ onClick()
29
+ }}
30
+ style={{
31
+ position: 'absolute',
32
+ left: `${x}%`,
33
+ top: `${y}%`,
34
+ transform: 'translate(-50%, -50%)',
35
+ width: '24px',
36
+ height: '24px',
37
+ borderRadius: '50%',
38
+ border: '2px solid white',
39
+ backgroundColor: color,
40
+ color: 'white',
41
+ fontSize: '11px',
42
+ fontWeight: 700,
43
+ display: 'flex',
44
+ alignItems: 'center',
45
+ justifyContent: 'center',
46
+ cursor: 'pointer',
47
+ zIndex: isActive ? 21 : 20,
48
+ opacity: resolved ? 0.4 : 1,
49
+ boxShadow: isActive
50
+ ? `0 0 0 3px ${color}, 0 2px 8px rgba(0, 0, 0, 0.3)`
51
+ : '0 2px 6px rgba(0, 0, 0, 0.25)',
52
+ transition: 'box-shadow 0.15s ease, opacity 0.15s ease',
53
+ padding: 0,
54
+ lineHeight: 1,
55
+ }}
56
+ title={`#${index} (${category})${resolved ? ' - resolved' : ''}`}
57
+ >
58
+ {index}
59
+ </button>
60
+ )
61
+ }
@@ -0,0 +1,257 @@
1
+ import React, { useState } from 'react'
2
+ import type { Annotation, AnnotationCategory } from '../types'
3
+ import { Icon } from '../icons'
4
+
5
+ const CATEGORY_LABELS: Record<AnnotationCategory, string> = {
6
+ bug: 'Bug',
7
+ copy: 'Copy',
8
+ design: 'Design',
9
+ general: 'General',
10
+ }
11
+
12
+ const CATEGORY_STYLES: Record<AnnotationCategory, { bg: string; color: string; border: string }> = {
13
+ bug: {
14
+ bg: 'oklch(0.92 0.08 25)',
15
+ color: 'oklch(0.45 0.15 25)',
16
+ border: 'oklch(0.85 0.12 25)',
17
+ },
18
+ copy: {
19
+ bg: 'oklch(0.92 0.08 250)',
20
+ color: 'oklch(0.45 0.18 250)',
21
+ border: 'oklch(0.85 0.10 250)',
22
+ },
23
+ design: {
24
+ bg: 'oklch(0.92 0.08 310)',
25
+ color: 'oklch(0.45 0.18 310)',
26
+ border: 'oklch(0.85 0.10 310)',
27
+ },
28
+ general: {
29
+ bg: 'oklch(0.94 0.06 85)',
30
+ color: 'oklch(0.45 0.12 85)',
31
+ border: 'oklch(0.88 0.08 85)',
32
+ },
33
+ }
34
+
35
+ interface AnnotationThreadProps {
36
+ annotation: Annotation
37
+ onAddComment: (text: string) => void
38
+ onResolve: () => void
39
+ onDelete: () => void
40
+ onClose: () => void
41
+ }
42
+
43
+ export function AnnotationThread({ annotation, onAddComment, onResolve, onDelete, onClose }: AnnotationThreadProps) {
44
+ const [newComment, setNewComment] = useState('')
45
+ const catStyle = CATEGORY_STYLES[annotation.category]
46
+
47
+ const handleSubmit = () => {
48
+ const text = newComment.trim()
49
+ if (!text) return
50
+ onAddComment(text)
51
+ setNewComment('')
52
+ }
53
+
54
+ const formatTime = (iso: string) => {
55
+ const d = new Date(iso)
56
+ return d.toLocaleString(undefined, {
57
+ month: 'short',
58
+ day: 'numeric',
59
+ hour: '2-digit',
60
+ minute: '2-digit',
61
+ })
62
+ }
63
+
64
+ return (
65
+ <div
66
+ onClick={(e) => e.stopPropagation()}
67
+ style={{
68
+ position: 'absolute',
69
+ left: `${annotation.x}%`,
70
+ top: `${annotation.y}%`,
71
+ transform: 'translate(12px, -12px)',
72
+ width: '280px',
73
+ backgroundColor: 'var(--fd-card)',
74
+ borderRadius: '12px',
75
+ boxShadow: '0 12px 40px -8px rgba(0, 0, 0, 0.2), 0 0 0 1px rgba(0, 0, 0, 0.06)',
76
+ zIndex: 30,
77
+ overflow: 'hidden',
78
+ fontSize: '13px',
79
+ }}
80
+ >
81
+ {/* Header */}
82
+ <div style={{
83
+ padding: '10px 12px',
84
+ display: 'flex',
85
+ alignItems: 'center',
86
+ justifyContent: 'space-between',
87
+ borderBottom: '1px solid var(--fd-border)',
88
+ backgroundColor: 'var(--fd-muted)',
89
+ }}>
90
+ <span style={{
91
+ display: 'inline-flex',
92
+ alignItems: 'center',
93
+ gap: '5px',
94
+ padding: '2px 8px',
95
+ fontSize: '11px',
96
+ fontWeight: 600,
97
+ borderRadius: '6px',
98
+ border: `1px solid ${catStyle.border}`,
99
+ backgroundColor: catStyle.bg,
100
+ color: catStyle.color,
101
+ textTransform: 'uppercase',
102
+ letterSpacing: '0.04em',
103
+ }}>
104
+ <span style={{
105
+ width: '6px',
106
+ height: '6px',
107
+ borderRadius: '50%',
108
+ backgroundColor: catStyle.color,
109
+ }} />
110
+ {CATEGORY_LABELS[annotation.category]}
111
+ </span>
112
+ <button
113
+ onClick={onClose}
114
+ style={{
115
+ background: 'none',
116
+ border: 'none',
117
+ cursor: 'pointer',
118
+ padding: '2px',
119
+ color: 'var(--fd-muted-foreground)',
120
+ display: 'flex',
121
+ alignItems: 'center',
122
+ }}
123
+ title="Close"
124
+ >
125
+ <Icon name="x" size={16} />
126
+ </button>
127
+ </div>
128
+
129
+ {/* Comments */}
130
+ <div style={{
131
+ maxHeight: '240px',
132
+ overflowY: 'auto',
133
+ padding: '8px 0',
134
+ }}>
135
+ {annotation.comments.map(comment => (
136
+ <div key={comment.id} style={{
137
+ padding: '6px 12px',
138
+ borderBottom: '1px solid var(--fd-border)',
139
+ }}>
140
+ <div style={{
141
+ display: 'flex',
142
+ alignItems: 'baseline',
143
+ justifyContent: 'space-between',
144
+ gap: '8px',
145
+ marginBottom: '3px',
146
+ }}>
147
+ <span style={{
148
+ fontSize: '12px',
149
+ fontWeight: 600,
150
+ color: 'var(--fd-foreground)',
151
+ }}>
152
+ {comment.author}
153
+ </span>
154
+ <span style={{
155
+ fontSize: '10px',
156
+ color: 'var(--fd-muted-foreground)',
157
+ whiteSpace: 'nowrap',
158
+ }}>
159
+ {formatTime(comment.createdAt)}
160
+ </span>
161
+ </div>
162
+ <p style={{
163
+ margin: 0,
164
+ fontSize: '13px',
165
+ color: 'var(--fd-foreground)',
166
+ lineHeight: 1.5,
167
+ wordBreak: 'break-word',
168
+ }}>
169
+ {comment.text}
170
+ </p>
171
+ </div>
172
+ ))}
173
+ </div>
174
+
175
+ {/* Add comment */}
176
+ <div style={{
177
+ padding: '8px 12px',
178
+ borderTop: '1px solid var(--fd-border)',
179
+ display: 'flex',
180
+ gap: '6px',
181
+ }}>
182
+ <input
183
+ type="text"
184
+ value={newComment}
185
+ onChange={e => setNewComment(e.target.value)}
186
+ onKeyDown={e => { if (e.key === 'Enter') handleSubmit() }}
187
+ placeholder="Add a comment..."
188
+ style={{
189
+ flex: 1,
190
+ padding: '6px 10px',
191
+ fontSize: '12px',
192
+ border: '1px solid var(--fd-border)',
193
+ borderRadius: '6px',
194
+ backgroundColor: 'var(--fd-background)',
195
+ color: 'var(--fd-foreground)',
196
+ outline: 'none',
197
+ }}
198
+ />
199
+ <button
200
+ onClick={handleSubmit}
201
+ style={{
202
+ padding: '6px 12px',
203
+ fontSize: '12px',
204
+ fontWeight: 600,
205
+ border: 'none',
206
+ borderRadius: '6px',
207
+ backgroundColor: 'var(--fd-primary)',
208
+ color: 'var(--fd-primary-foreground)',
209
+ cursor: 'pointer',
210
+ }}
211
+ >
212
+ Add
213
+ </button>
214
+ </div>
215
+
216
+ {/* Actions */}
217
+ <div style={{
218
+ padding: '8px 12px',
219
+ borderTop: '1px solid var(--fd-border)',
220
+ display: 'flex',
221
+ gap: '6px',
222
+ justifyContent: 'flex-end',
223
+ }}>
224
+ <button
225
+ onClick={onResolve}
226
+ style={{
227
+ padding: '5px 10px',
228
+ fontSize: '11px',
229
+ fontWeight: 500,
230
+ border: '1px solid var(--fd-border)',
231
+ borderRadius: '6px',
232
+ backgroundColor: annotation.resolved ? 'oklch(0.92 0.08 85)' : 'oklch(0.92 0.08 155)',
233
+ color: annotation.resolved ? 'oklch(0.45 0.12 85)' : 'oklch(0.35 0.12 155)',
234
+ cursor: 'pointer',
235
+ }}
236
+ >
237
+ {annotation.resolved ? 'Unresolve' : 'Resolve'}
238
+ </button>
239
+ <button
240
+ onClick={onDelete}
241
+ style={{
242
+ padding: '5px 10px',
243
+ fontSize: '11px',
244
+ fontWeight: 500,
245
+ border: '1px solid oklch(0.85 0.12 25)',
246
+ borderRadius: '6px',
247
+ backgroundColor: 'oklch(0.92 0.08 25)',
248
+ color: 'oklch(0.45 0.15 25)',
249
+ cursor: 'pointer',
250
+ }}
251
+ >
252
+ Delete
253
+ </button>
254
+ </div>
255
+ </div>
256
+ )
257
+ }
@@ -0,0 +1,18 @@
1
+ <!-- c3-generated: c3-401, c3-402, c3-403, c3-404, c3-406 -->
2
+ # Preview Viewers
3
+
4
+ Before modifying this code, read:
5
+ - `.c3/c3-4-previews/c3-401-preview-router.md` - Type dispatch
6
+ - `.c3/c3-4-previews/c3-402-component-viewer.md` - Component previews
7
+ - `.c3/c3-4-previews/c3-403-screen-viewer.md` - Screen previews
8
+ - `.c3/c3-4-previews/c3-404-flow-viewer.md` - Flow previews
9
+ - `.c3/c3-4-previews/c3-406-render-adapter.md` - Renderer adaptation
10
+ - Patterns: `ref-preview-types`
11
+
12
+ Type dispatch in PreviewRouter:
13
+ - `component` → ComponentPreview
14
+ - `screen` → ScreenPreview
15
+ - `flow` → FlowPreview
16
+
17
+ Full refs: `.c3/refs/ref-preview-types.md`
18
+ <!-- end-c3-generated -->