@toolr/ui-design 0.1.5 → 0.1.6
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.
- package/agent-rules.json +91 -0
- package/ai-manifest.json +190 -0
- package/components/content/info-panel-primitives.tsx +14 -14
- package/components/lib/ai-tools.tsx +1 -1
- package/components/sections/ai-tools-paths/tools-paths-panel.tsx +7 -7
- package/components/sections/captured-issues/captured-issues-panel.tsx +11 -11
- package/components/sections/golden-snapshots/file-diff-viewer.tsx +13 -13
- package/components/sections/golden-snapshots/golden-sync-panel.tsx +5 -5
- package/components/sections/golden-snapshots/snapshot-manager.tsx +11 -11
- package/components/sections/golden-snapshots/status-overview.tsx +20 -20
- package/components/sections/golden-snapshots/version-manager.tsx +8 -8
- package/components/sections/prompt-editor/file-type-tabbed-prompt-editor.tsx +4 -4
- package/components/sections/prompt-editor/simulator-prompt-editor.tsx +5 -5
- package/components/sections/prompt-editor/tabbed-prompt-editor.tsx +7 -7
- package/components/sections/report-bug/report-bug-form.tsx +14 -14
- package/components/sections/report-bug/screenshot-uploader.tsx +6 -6
- package/components/sections/snapshot-browser/snapshot-browser-panel.tsx +3 -3
- package/components/sections/snapshot-browser/snapshot-tree.tsx +8 -8
- package/components/sections/snippets-editor/snippets-editor.tsx +81 -22
- package/components/settings/SettingsHeader.tsx +1 -1
- package/components/settings/SettingsTreeNav.tsx +22 -4
- package/components/ui/action-dialog.tsx +5 -5
- package/components/ui/badge.tsx +4 -4
- package/components/ui/bottom-panel-header.tsx +4 -4
- package/components/ui/breadcrumb.tsx +2 -2
- package/components/ui/collapsible-section.tsx +1 -1
- package/components/ui/cookie-consent.tsx +5 -5
- package/components/ui/detail-section.tsx +3 -3
- package/components/ui/editor-placeholder-card.tsx +7 -7
- package/components/ui/editor-toolbar.tsx +12 -0
- package/components/ui/execution-details-panel.tsx +6 -6
- package/components/ui/extension-list-card.tsx +3 -3
- package/components/ui/file-structure-section.tsx +17 -17
- package/components/ui/file-tree.tsx +3 -1
- package/components/ui/files-panel.tsx +27 -9
- package/components/ui/filter-dropdown.tsx +5 -5
- package/components/ui/form-actions.tsx +1 -1
- package/components/ui/frontmatter-form-header.tsx +4 -4
- package/components/ui/icon-button.tsx +1 -1
- package/components/ui/input.tsx +5 -5
- package/components/ui/label.tsx +4 -4
- package/components/ui/layout-tab-bar.tsx +4 -4
- package/components/ui/modal.tsx +2 -2
- package/components/ui/nav-card.tsx +3 -3
- package/components/ui/navigation-bar.tsx +5 -5
- package/components/ui/number-input.tsx +4 -4
- package/components/ui/registry-browser.tsx +4 -4
- package/components/ui/registry-card.tsx +13 -13
- package/components/ui/registry-detail.tsx +6 -6
- package/components/ui/segmented-toggle.tsx +4 -4
- package/components/ui/select.tsx +5 -5
- package/components/ui/selection-grid.tsx +4 -4
- package/components/ui/setting-row.tsx +1 -1
- package/components/ui/settings-card.tsx +3 -3
- package/components/ui/settings-info-box.tsx +1 -1
- package/components/ui/settings-section-title.tsx +1 -1
- package/components/ui/snapshot-card.tsx +7 -7
- package/components/ui/snippets-panel.tsx +10 -10
- package/components/ui/sort-dropdown.tsx +2 -2
- package/components/ui/status-card.tsx +4 -4
- package/components/ui/tab-bar.tsx +2 -2
- package/components/ui/tooltip.tsx +3 -3
- package/dist/content.js +14 -14
- package/dist/index.d.ts +11 -4
- package/dist/index.js +428 -336
- package/dist/tokens/primitives.css +9 -2
- package/package.json +13 -3
- package/tokens/primitives.css +9 -2
|
@@ -86,14 +86,14 @@ function DiffFileItem({ file, isSelected, onSelect, onReset, resettingFile, anyR
|
|
|
86
86
|
>
|
|
87
87
|
<button
|
|
88
88
|
onClick={() => onSelect(file)}
|
|
89
|
-
className={`flex-1 flex items-center gap-2 px-3 py-1 text-
|
|
89
|
+
className={`flex-1 flex items-center gap-2 px-3 py-1 text-sm ${
|
|
90
90
|
isSelected ? 'text-neutral-300' : 'text-neutral-400'
|
|
91
91
|
}`}
|
|
92
92
|
>
|
|
93
93
|
{icon}
|
|
94
94
|
<span className="truncate">{filename}</span>
|
|
95
95
|
{statusLabel && (
|
|
96
|
-
<span className={`text-
|
|
96
|
+
<span className={`text-xs font-medium ml-auto flex-shrink-0 ${statusColor}`}>
|
|
97
97
|
{statusLabel}
|
|
98
98
|
</span>
|
|
99
99
|
)}
|
|
@@ -165,13 +165,13 @@ function DiffFileTreePanel({ sync, componentLabels, renderFileIcon }: DiffFileTr
|
|
|
165
165
|
|
|
166
166
|
// Root-level nodes get colored styling, nested folders get muted styling
|
|
167
167
|
const headerClasses = isRoot
|
|
168
|
-
? `${color.text} ${color.hoverBg} border-l-2 ${color.border} ${color.bg} px-3 py-2 text-
|
|
168
|
+
? `${color.text} ${color.hoverBg} border-l-2 ${color.border} ${color.bg} px-3 py-2 text-md font-medium`
|
|
169
169
|
: 'text-neutral-500 hover:bg-neutral-850 px-3 py-1.5'
|
|
170
170
|
|
|
171
171
|
const chevronSize = isRoot ? 'w-4 h-4' : 'w-3 h-3'
|
|
172
172
|
|
|
173
173
|
const countElement = isRoot ? (
|
|
174
|
-
<span className={`ml-auto px-1.5 py-0.5 rounded-full text-
|
|
174
|
+
<span className={`ml-auto px-1.5 py-0.5 rounded-full text-xs font-medium ${color.pillBg} ${color.text}`}>
|
|
175
175
|
{fileCount}
|
|
176
176
|
</span>
|
|
177
177
|
) : (
|
|
@@ -222,7 +222,7 @@ function DiffFileTreePanel({ sync, componentLabels, renderFileIcon }: DiffFileTr
|
|
|
222
222
|
<div className="w-72 flex-shrink-0 bg-neutral-900 rounded-lg border border-neutral-700 overflow-hidden flex flex-col">
|
|
223
223
|
{/* Summary Header */}
|
|
224
224
|
<div className="p-3 border-b border-neutral-700 flex-shrink-0">
|
|
225
|
-
<div className="flex gap-3 text-
|
|
225
|
+
<div className="flex gap-3 text-sm">
|
|
226
226
|
<span className="text-green-400">+{diff!.summary.added}</span>
|
|
227
227
|
<span className="text-red-400">-{diff!.summary.removed}</span>
|
|
228
228
|
<span className="text-yellow-400">~{diff!.summary.modified}</span>
|
|
@@ -237,7 +237,7 @@ function DiffFileTreePanel({ sync, componentLabels, renderFileIcon }: DiffFileTr
|
|
|
237
237
|
<button
|
|
238
238
|
key={filter}
|
|
239
239
|
onClick={() => setDiffFilter(filter)}
|
|
240
|
-
className={`px-2 py-1 rounded text-
|
|
240
|
+
className={`px-2 py-1 rounded text-sm transition-colors cursor-pointer ${
|
|
241
241
|
diffFilter === filter
|
|
242
242
|
? 'bg-neutral-700 text-neutral-300'
|
|
243
243
|
: 'text-neutral-500 hover:text-neutral-400'
|
|
@@ -295,7 +295,7 @@ function DiffEditorPanel({ sync, componentLabels, monacoTheme }: DiffEditorPanel
|
|
|
295
295
|
if (!selectedDiffFile) {
|
|
296
296
|
return (
|
|
297
297
|
<div className="flex-1 min-w-0 bg-neutral-900 rounded-lg border border-neutral-700 overflow-hidden flex flex-col">
|
|
298
|
-
<div className="flex items-center justify-center h-full text-
|
|
298
|
+
<div className="flex items-center justify-center h-full text-md text-neutral-500">
|
|
299
299
|
Select a file from the tree to view differences
|
|
300
300
|
</div>
|
|
301
301
|
</div>
|
|
@@ -310,16 +310,16 @@ function DiffEditorPanel({ sync, componentLabels, monacoTheme }: DiffEditorPanel
|
|
|
310
310
|
<div className="flex items-center justify-between px-4 py-2 border-b border-neutral-700 flex-shrink-0">
|
|
311
311
|
<div className="flex items-center gap-2">
|
|
312
312
|
<FileCode className="w-4 h-4 flex-shrink-0 text-blue-400/50" />
|
|
313
|
-
<span className="text-
|
|
313
|
+
<span className="text-md text-neutral-300 font-medium">
|
|
314
314
|
{selectedDiffFile.component}/{selectedDiffFile.path}
|
|
315
315
|
</span>
|
|
316
316
|
{devtools && hasUnsavedChanges && (
|
|
317
|
-
<span className="px-2 py-0.5 bg-amber-500/20 text-amber-400 text-
|
|
317
|
+
<span className="px-2 py-0.5 bg-amber-500/20 text-amber-400 text-sm rounded">
|
|
318
318
|
Modified
|
|
319
319
|
</span>
|
|
320
320
|
)}
|
|
321
321
|
</div>
|
|
322
|
-
<span className="text-
|
|
322
|
+
<span className="text-sm text-neutral-500">{compLabel}</span>
|
|
323
323
|
</div>
|
|
324
324
|
|
|
325
325
|
{/* Diff Editor */}
|
|
@@ -355,7 +355,7 @@ function DiffEditorPanel({ sync, componentLabels, monacoTheme }: DiffEditorPanel
|
|
|
355
355
|
}}
|
|
356
356
|
/>
|
|
357
357
|
) : (
|
|
358
|
-
<div className="flex items-center justify-center h-full text-
|
|
358
|
+
<div className="flex items-center justify-center h-full text-md text-neutral-500">
|
|
359
359
|
Loading file content...
|
|
360
360
|
</div>
|
|
361
361
|
)}
|
|
@@ -404,14 +404,14 @@ export function FileDiffViewer({ sync, componentLabels, monacoTheme, renderFileI
|
|
|
404
404
|
</div>
|
|
405
405
|
|
|
406
406
|
{diffLoading ? (
|
|
407
|
-
<div className="text-
|
|
407
|
+
<div className="text-md text-neutral-500 text-center py-8">Loading diff...</div>
|
|
408
408
|
) : diff ? (
|
|
409
409
|
<div className="flex gap-4 flex-1 min-h-[400px]">
|
|
410
410
|
<DiffFileTreePanel sync={sync} componentLabels={componentLabels} renderFileIcon={renderFileIcon} />
|
|
411
411
|
<DiffEditorPanel sync={sync} componentLabels={componentLabels} monacoTheme={monacoTheme} />
|
|
412
412
|
</div>
|
|
413
413
|
) : (
|
|
414
|
-
<div className="text-
|
|
414
|
+
<div className="text-md text-neutral-500 text-center py-8">
|
|
415
415
|
No diff data available. Click refresh to load.
|
|
416
416
|
</div>
|
|
417
417
|
)}
|
|
@@ -118,7 +118,7 @@ export function GoldenSyncPanel({
|
|
|
118
118
|
<h3 className="text-base font-semibold text-neutral-300">
|
|
119
119
|
{TAB_DESCRIPTIONS[activeTab].title}
|
|
120
120
|
</h3>
|
|
121
|
-
<p className="text-
|
|
121
|
+
<p className="text-md text-neutral-400">
|
|
122
122
|
{TAB_DESCRIPTIONS[activeTab].description}
|
|
123
123
|
</p>
|
|
124
124
|
</div>
|
|
@@ -138,7 +138,7 @@ export function GoldenSyncPanel({
|
|
|
138
138
|
<button
|
|
139
139
|
key={tab.id}
|
|
140
140
|
onClick={() => handleTabChange(tab.id)}
|
|
141
|
-
className={`h-[41px] flex items-center gap-2 px-4 text-
|
|
141
|
+
className={`h-[41px] flex items-center gap-2 px-4 text-md border-b-2 transition-colors cursor-pointer ${
|
|
142
142
|
activeTab === tab.id
|
|
143
143
|
? `${tab.color} border-current bg-neutral-800/50`
|
|
144
144
|
: 'border-transparent text-neutral-500 hover:text-neutral-300 hover:bg-neutral-800/30'
|
|
@@ -155,7 +155,7 @@ export function GoldenSyncPanel({
|
|
|
155
155
|
<div className="bg-red-500/10 border border-red-500/30 rounded-lg p-4 mt-4">
|
|
156
156
|
<div className="flex items-center gap-3">
|
|
157
157
|
<AlertCircle className="w-5 h-5 text-red-400 flex-shrink-0" />
|
|
158
|
-
<p className="text-red-400 text-
|
|
158
|
+
<p className="text-red-400 text-md">{error}</p>
|
|
159
159
|
</div>
|
|
160
160
|
</div>
|
|
161
161
|
)}
|
|
@@ -165,7 +165,7 @@ export function GoldenSyncPanel({
|
|
|
165
165
|
<div className="bg-green-500/10 border border-green-500/30 rounded-lg p-4 mt-4">
|
|
166
166
|
<div className="flex items-center gap-3">
|
|
167
167
|
<Check className="w-5 h-5 text-green-400 flex-shrink-0" />
|
|
168
|
-
<p className="text-green-400 text-
|
|
168
|
+
<p className="text-green-400 text-md">{lastAction}</p>
|
|
169
169
|
</div>
|
|
170
170
|
</div>
|
|
171
171
|
)}
|
|
@@ -174,7 +174,7 @@ export function GoldenSyncPanel({
|
|
|
174
174
|
{/* Content */}
|
|
175
175
|
<div className={activeTab === 'diff' ? 'flex-1 min-h-0 mt-4' : 'space-y-6 mt-4'}>
|
|
176
176
|
{loading && activeTab === 'status' ? (
|
|
177
|
-
<div className="text-
|
|
177
|
+
<div className="text-md text-neutral-500 text-center py-8">Loading...</div>
|
|
178
178
|
) : activeTab === 'status' ? (
|
|
179
179
|
<StatusOverview
|
|
180
180
|
status={status}
|
|
@@ -45,7 +45,7 @@ export function SnapshotManager({ sync }: SnapshotManagerProps) {
|
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
if (manifestLoading && !manifest) {
|
|
48
|
-
return <div className="text-
|
|
48
|
+
return <div className="text-md text-neutral-500 text-center py-8">Loading snapshots...</div>
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
return (
|
|
@@ -54,9 +54,9 @@ export function SnapshotManager({ sync }: SnapshotManagerProps) {
|
|
|
54
54
|
<div className="bg-neutral-900 rounded-lg p-4 border border-neutral-700">
|
|
55
55
|
<div className="flex items-center gap-3 mb-3">
|
|
56
56
|
<Plus className="w-5 h-5 text-green-400" />
|
|
57
|
-
<h4 className="text-
|
|
57
|
+
<h4 className="text-md text-neutral-300 font-medium">Create Snapshot</h4>
|
|
58
58
|
</div>
|
|
59
|
-
<p className="text-
|
|
59
|
+
<p className="text-sm text-neutral-600 mb-3">
|
|
60
60
|
Archives the current live state. If components differ from golden, their patch version is auto-bumped.
|
|
61
61
|
</p>
|
|
62
62
|
<div className="flex gap-2">
|
|
@@ -85,8 +85,8 @@ export function SnapshotManager({ sync }: SnapshotManagerProps) {
|
|
|
85
85
|
<div className="flex items-center justify-between px-4 py-3 border-b border-neutral-700">
|
|
86
86
|
<div className="flex items-center gap-2">
|
|
87
87
|
<Archive className="w-4 h-4 text-neutral-500" />
|
|
88
|
-
<h4 className="text-
|
|
89
|
-
<span className="text-
|
|
88
|
+
<h4 className="text-md text-neutral-300 font-medium">Snapshots</h4>
|
|
89
|
+
<span className="text-sm text-neutral-500">({manifest?.snapshots.length ?? 0})</span>
|
|
90
90
|
</div>
|
|
91
91
|
<IconButton
|
|
92
92
|
icon={manifestLoading ? <Loader2 className="animate-spin" /> : <RotateCcw />}
|
|
@@ -99,7 +99,7 @@ export function SnapshotManager({ sync }: SnapshotManagerProps) {
|
|
|
99
99
|
</div>
|
|
100
100
|
|
|
101
101
|
{!manifest || manifest.snapshots.length === 0 ? (
|
|
102
|
-
<div className="text-
|
|
102
|
+
<div className="text-md text-neutral-500 text-center py-8">No snapshots yet</div>
|
|
103
103
|
) : (
|
|
104
104
|
<div className="divide-y divide-neutral-700">
|
|
105
105
|
{[...manifest.snapshots].reverse().map((snap) => (
|
|
@@ -112,9 +112,9 @@ export function SnapshotManager({ sync }: SnapshotManagerProps) {
|
|
|
112
112
|
{/* Version + info */}
|
|
113
113
|
<div className="flex-1 min-w-0">
|
|
114
114
|
<div className="flex items-center gap-2">
|
|
115
|
-
<span className="text-
|
|
115
|
+
<span className="text-md font-mono text-neutral-300">v{snap.version}</span>
|
|
116
116
|
{snap.version === manifest.activeVersion && (
|
|
117
|
-
<span className="px-1.5 py-0.5 bg-green-500/20 text-green-400 text-
|
|
117
|
+
<span className="px-1.5 py-0.5 bg-green-500/20 text-green-400 text-xs rounded font-medium">
|
|
118
118
|
active
|
|
119
119
|
</span>
|
|
120
120
|
)}
|
|
@@ -122,13 +122,13 @@ export function SnapshotManager({ sync }: SnapshotManagerProps) {
|
|
|
122
122
|
<Pin className="w-3 h-3 text-amber-400" />
|
|
123
123
|
)}
|
|
124
124
|
{snap.metaVersion && (
|
|
125
|
-
<span className="text-
|
|
125
|
+
<span className="text-sm text-neutral-600 font-mono">{snap.metaVersion}</span>
|
|
126
126
|
)}
|
|
127
127
|
</div>
|
|
128
128
|
<div className="flex items-center gap-2 mt-0.5">
|
|
129
|
-
<span className="text-
|
|
129
|
+
<span className="text-sm text-neutral-600">{formatDate(snap.createdAt)}</span>
|
|
130
130
|
{snap.description && (
|
|
131
|
-
<span className="text-
|
|
131
|
+
<span className="text-sm text-neutral-500 truncate">{snap.description}</span>
|
|
132
132
|
)}
|
|
133
133
|
</div>
|
|
134
134
|
</div>
|
|
@@ -26,7 +26,7 @@ function getComponentVersion(meta: GoldenMeta | undefined, component: string): s
|
|
|
26
26
|
function renderVersionBadge(meta: GoldenMeta | undefined, color: string) {
|
|
27
27
|
if (!meta) return null
|
|
28
28
|
return (
|
|
29
|
-
<span className={`px-2 py-0.5 ${color} text-
|
|
29
|
+
<span className={`px-2 py-0.5 ${color} text-sm rounded font-mono`}>
|
|
30
30
|
{meta.version}
|
|
31
31
|
</span>
|
|
32
32
|
)
|
|
@@ -35,7 +35,7 @@ function renderVersionBadge(meta: GoldenMeta | undefined, color: string) {
|
|
|
35
35
|
function VersionStatus({ exists, version, mismatch, defaultColor = 'text-green-400/70' }: { exists: boolean; version?: string; mismatch: boolean; defaultColor?: string }) {
|
|
36
36
|
if (!exists) return <span className="text-red-400">Missing</span>
|
|
37
37
|
if (!version) return <span className="text-green-400">Found</span>
|
|
38
|
-
return <span className={`text-
|
|
38
|
+
return <span className={`text-sm font-mono ${mismatch ? 'text-yellow-400' : defaultColor}`}>v{version}</span>
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
function SyncStatusBanner({ goldenMeta, liveMeta, components }: { goldenMeta: GoldenMeta; liveMeta: GoldenMeta; components: string[] }) {
|
|
@@ -48,12 +48,12 @@ function SyncStatusBanner({ goldenMeta, liveMeta, components }: { goldenMeta: Go
|
|
|
48
48
|
return mismatches === 0 ? (
|
|
49
49
|
<div className="flex items-center gap-2 px-3 py-2 rounded-lg bg-green-500/5 border border-green-500/20">
|
|
50
50
|
<Check className="w-4 h-4 text-green-400" />
|
|
51
|
-
<span className="text-
|
|
51
|
+
<span className="text-md text-green-400">Golden and Live versions are in sync</span>
|
|
52
52
|
</div>
|
|
53
53
|
) : (
|
|
54
54
|
<div className="flex items-center gap-2 px-3 py-2 rounded-lg bg-yellow-500/5 border border-yellow-500/20">
|
|
55
55
|
<AlertTriangle className="w-4 h-4 text-yellow-400" />
|
|
56
|
-
<span className="text-
|
|
56
|
+
<span className="text-md text-yellow-400">Version mismatch — {mismatches} component{mismatches > 1 ? 's' : ''} differ</span>
|
|
57
57
|
</div>
|
|
58
58
|
)
|
|
59
59
|
}
|
|
@@ -84,10 +84,10 @@ export function StatusOverview({
|
|
|
84
84
|
<div className="bg-neutral-900 rounded-lg p-4 border border-amber-500/30">
|
|
85
85
|
<div className="flex items-center gap-3 mb-3">
|
|
86
86
|
<Archive className="w-5 h-5 text-amber-400" />
|
|
87
|
-
<h3 className="text-
|
|
87
|
+
<h3 className="text-md text-neutral-300 font-medium">Bundled Seed (App Distribution)</h3>
|
|
88
88
|
{status?.seed.meta && renderVersionBadge(status.seed.meta, 'bg-amber-500/20 text-amber-400')}
|
|
89
89
|
</div>
|
|
90
|
-
<div className="grid grid-cols-2 gap-4 text-
|
|
90
|
+
<div className="grid grid-cols-2 gap-4 text-md">
|
|
91
91
|
<div>
|
|
92
92
|
<p className="text-neutral-500">Status</p>
|
|
93
93
|
<p className={status?.seed.exists ? 'text-green-400' : 'text-red-400'}>
|
|
@@ -104,7 +104,7 @@ export function StatusOverview({
|
|
|
104
104
|
</div>
|
|
105
105
|
</div>
|
|
106
106
|
{!devtools && (
|
|
107
|
-
<p className="text-
|
|
107
|
+
<p className="text-sm text-neutral-600 mt-3">
|
|
108
108
|
A compressed archive shipped with every release containing default configuration and templates. On first launch, the seed is extracted to initialize your local files.
|
|
109
109
|
</p>
|
|
110
110
|
)}
|
|
@@ -121,10 +121,10 @@ export function StatusOverview({
|
|
|
121
121
|
<div className="bg-neutral-900 rounded-lg p-4 border border-blue-500/30">
|
|
122
122
|
<div className="flex items-center gap-2 mb-3">
|
|
123
123
|
<div className="w-3 h-3 rounded-full bg-blue-400" />
|
|
124
|
-
<h4 className="text-
|
|
124
|
+
<h4 className="text-md text-neutral-300 font-medium">Golden (Reference)</h4>
|
|
125
125
|
{renderVersionBadge(status?.goldenMeta, 'bg-blue-500/20 text-blue-400')}
|
|
126
126
|
</div>
|
|
127
|
-
<div className="space-y-2 text-
|
|
127
|
+
<div className="space-y-2 text-md">
|
|
128
128
|
{components.map((comp) => {
|
|
129
129
|
const version = getComponentVersion(status?.goldenMeta, comp)
|
|
130
130
|
const dirKey = `${comp}Golden`
|
|
@@ -143,7 +143,7 @@ export function StatusOverview({
|
|
|
143
143
|
})}
|
|
144
144
|
</div>
|
|
145
145
|
{!devtools && (
|
|
146
|
-
<p className="text-
|
|
146
|
+
<p className="text-sm text-neutral-600 mt-3">
|
|
147
147
|
Reference copy extracted from the bundled seed. Always overwritten during app updates to match the latest release. Do not edit directly.
|
|
148
148
|
</p>
|
|
149
149
|
)}
|
|
@@ -153,7 +153,7 @@ export function StatusOverview({
|
|
|
153
153
|
<div className="bg-neutral-900 rounded-lg p-4 border border-green-500/30">
|
|
154
154
|
<div className="flex items-center gap-2 mb-3">
|
|
155
155
|
<div className="w-3 h-3 rounded-full bg-green-400" />
|
|
156
|
-
<h4 className="text-
|
|
156
|
+
<h4 className="text-md text-neutral-300 font-medium">Live (Working Copy)</h4>
|
|
157
157
|
{renderVersionBadge(status?.liveMeta, 'bg-green-500/20 text-green-400')}
|
|
158
158
|
<div className="ml-auto relative" ref={resetMenuRef}>
|
|
159
159
|
<IconButton
|
|
@@ -168,7 +168,7 @@ export function StatusOverview({
|
|
|
168
168
|
<div ref={resetMenuDropdownRef} className="absolute right-0 top-full mt-1 w-56 bg-neutral-850 border border-neutral-700 rounded-lg shadow-xl z-50 py-1 overflow-hidden">
|
|
169
169
|
<button
|
|
170
170
|
onClick={() => { onResetAll(); setShowResetMenu(false) }}
|
|
171
|
-
className="w-full text-left px-3 py-2 text-
|
|
171
|
+
className="w-full text-left px-3 py-2 text-md text-neutral-300 hover:bg-neutral-700 transition-colors"
|
|
172
172
|
>
|
|
173
173
|
Reset All to Golden
|
|
174
174
|
</button>
|
|
@@ -177,7 +177,7 @@ export function StatusOverview({
|
|
|
177
177
|
<button
|
|
178
178
|
key={comp}
|
|
179
179
|
onClick={() => { onResetComponent(comp); setShowResetMenu(false) }}
|
|
180
|
-
className="w-full text-left px-3 py-2 text-
|
|
180
|
+
className="w-full text-left px-3 py-2 text-md text-neutral-400 hover:bg-neutral-700 transition-colors"
|
|
181
181
|
>
|
|
182
182
|
Reset {getLabel(comp)}
|
|
183
183
|
</button>
|
|
@@ -186,7 +186,7 @@ export function StatusOverview({
|
|
|
186
186
|
)}
|
|
187
187
|
</div>
|
|
188
188
|
</div>
|
|
189
|
-
<div className="space-y-2 text-
|
|
189
|
+
<div className="space-y-2 text-md">
|
|
190
190
|
{components.map((comp) => {
|
|
191
191
|
const liveV = getComponentVersion(status?.liveMeta, comp)
|
|
192
192
|
const goldenV = getComponentVersion(status?.goldenMeta, comp)
|
|
@@ -212,7 +212,7 @@ export function StatusOverview({
|
|
|
212
212
|
})}
|
|
213
213
|
</div>
|
|
214
214
|
{!devtools && (
|
|
215
|
-
<p className="text-
|
|
215
|
+
<p className="text-sm text-neutral-600 mt-3">
|
|
216
216
|
Your active working copy — what the app uses at runtime. Customizations are made here and preserved across app updates.
|
|
217
217
|
</p>
|
|
218
218
|
)}
|
|
@@ -222,10 +222,10 @@ export function StatusOverview({
|
|
|
222
222
|
{/* Update Flow — settings only */}
|
|
223
223
|
{!devtools && (
|
|
224
224
|
<div className="bg-neutral-900/50 border border-neutral-700 rounded-lg p-4">
|
|
225
|
-
<p className="text-
|
|
225
|
+
<p className="text-sm font-medium text-neutral-400 mb-4">
|
|
226
226
|
How updates work <span className="font-normal text-neutral-600">— checked per component ({components.map(getLabel).join(', ')})</span>
|
|
227
227
|
</p>
|
|
228
|
-
<div className="grid grid-cols-[auto_auto_auto_auto_auto_auto_auto] items-center gap-x-2 text-
|
|
228
|
+
<div className="grid grid-cols-[auto_auto_auto_auto_auto_auto_auto] items-center gap-x-2 text-sm">
|
|
229
229
|
{/* Row 1: top branch outcome */}
|
|
230
230
|
<span /><span /><span /><span /><span />
|
|
231
231
|
<span className="text-neutral-600 text-base justify-self-center self-end mb-[-4px]">↗</span>
|
|
@@ -279,7 +279,7 @@ export function StatusOverview({
|
|
|
279
279
|
<span className="text-neutral-600 mt-0.5">has changes</span>
|
|
280
280
|
</div>
|
|
281
281
|
</div>
|
|
282
|
-
<p className="text-
|
|
282
|
+
<p className="text-sm text-neutral-600 mt-3">
|
|
283
283
|
When a component has no local changes, it is automatically updated to match the new golden version. Components with customizations are left untouched to preserve your edits — use the File Diff tab to review differences and selectively apply changes. You can reset any component to its golden version at any time using the reset buttons above.
|
|
284
284
|
</p>
|
|
285
285
|
</div>
|
|
@@ -290,9 +290,9 @@ export function StatusOverview({
|
|
|
290
290
|
<div className="bg-neutral-900 rounded-lg p-4 border border-neutral-700">
|
|
291
291
|
<div className="flex items-center gap-2 mb-3">
|
|
292
292
|
<Archive className="w-4 h-4 text-neutral-500" />
|
|
293
|
-
<h4 className="text-
|
|
293
|
+
<h4 className="text-md text-neutral-300 font-medium">Local Snapshots</h4>
|
|
294
294
|
</div>
|
|
295
|
-
<div className="flex gap-6 text-
|
|
295
|
+
<div className="flex gap-6 text-md">
|
|
296
296
|
<div>
|
|
297
297
|
<span className="text-neutral-500">Count: </span>
|
|
298
298
|
<span className="text-neutral-300">{manifest.snapshots.length}</span>
|
|
@@ -56,14 +56,14 @@ export function VersionManager({ sync, components, componentLabels }: VersionMan
|
|
|
56
56
|
<div className="bg-neutral-900 rounded-lg p-4 border border-teal-500/30">
|
|
57
57
|
<div className="flex items-center gap-3 mb-3">
|
|
58
58
|
<Tag className="w-5 h-5 text-teal-400" />
|
|
59
|
-
<h4 className="text-
|
|
59
|
+
<h4 className="text-md text-neutral-300 font-medium">Golden Version</h4>
|
|
60
60
|
{status?.goldenMeta && (
|
|
61
|
-
<span className="px-2 py-0.5 bg-teal-500/20 text-teal-400 text-
|
|
61
|
+
<span className="px-2 py-0.5 bg-teal-500/20 text-teal-400 text-sm rounded font-mono">
|
|
62
62
|
{status.goldenMeta.version}
|
|
63
63
|
</span>
|
|
64
64
|
)}
|
|
65
65
|
</div>
|
|
66
|
-
<p className="text-
|
|
66
|
+
<p className="text-sm text-neutral-600 mb-3">
|
|
67
67
|
Bump the overall golden version number. This updates the top-level version in meta.json.
|
|
68
68
|
</p>
|
|
69
69
|
<div className="flex gap-2">
|
|
@@ -100,8 +100,8 @@ export function VersionManager({ sync, components, componentLabels }: VersionMan
|
|
|
100
100
|
{/* Component Versions */}
|
|
101
101
|
<div className="bg-neutral-900 rounded-lg border border-neutral-700 overflow-hidden">
|
|
102
102
|
<div className="px-4 py-3 border-b border-neutral-700">
|
|
103
|
-
<h4 className="text-
|
|
104
|
-
<p className="text-
|
|
103
|
+
<h4 className="text-md text-neutral-300 font-medium">Component Versions</h4>
|
|
104
|
+
<p className="text-sm text-neutral-600 mt-1">
|
|
105
105
|
Update individual component versions. Click a component to edit.
|
|
106
106
|
</p>
|
|
107
107
|
</div>
|
|
@@ -117,12 +117,12 @@ export function VersionManager({ sync, components, componentLabels }: VersionMan
|
|
|
117
117
|
<div key={comp} className="px-4 py-3">
|
|
118
118
|
<div className="flex items-center justify-between">
|
|
119
119
|
<div className="flex items-center gap-2">
|
|
120
|
-
<span className="text-
|
|
120
|
+
<span className="text-md text-neutral-300">{getLabel(comp)}</span>
|
|
121
121
|
{currentVersion && (
|
|
122
|
-
<span className="text-
|
|
122
|
+
<span className="text-sm font-mono text-neutral-500">v{currentVersion}</span>
|
|
123
123
|
)}
|
|
124
124
|
{mismatch && (
|
|
125
|
-
<span className="text-
|
|
125
|
+
<span className="text-xs text-yellow-400">
|
|
126
126
|
(live: v{liveVersion})
|
|
127
127
|
</span>
|
|
128
128
|
)}
|
|
@@ -145,8 +145,8 @@ export function FileTypeTabbedPromptEditor({
|
|
|
145
145
|
<div className="flex items-center gap-2">
|
|
146
146
|
<Crosshair className="w-4 h-4 text-neutral-500 shrink-0" />
|
|
147
147
|
<div className="min-w-0">
|
|
148
|
-
<div className="text-
|
|
149
|
-
<div className="text-
|
|
148
|
+
<div className="text-sm font-medium text-neutral-400">{selectorLabel}</div>
|
|
149
|
+
<div className="text-sm text-neutral-600">{selectorSublabel}</div>
|
|
150
150
|
</div>
|
|
151
151
|
</div>
|
|
152
152
|
</div>
|
|
@@ -169,11 +169,11 @@ export function FileTypeTabbedPromptEditor({
|
|
|
169
169
|
{ft.icon ?? <FileCode className="w-4 h-4" />}
|
|
170
170
|
</div>
|
|
171
171
|
<div className="min-w-0 flex-1">
|
|
172
|
-
<div className={`text-
|
|
172
|
+
<div className={`text-md font-medium truncate ${isSelected ? 'text-neutral-300' : 'text-neutral-400'}`}>
|
|
173
173
|
{ft.name}
|
|
174
174
|
</div>
|
|
175
175
|
{ft.description && (
|
|
176
|
-
<div className="text-
|
|
176
|
+
<div className="text-sm text-neutral-500 mt-0.5 leading-relaxed">
|
|
177
177
|
{ft.description}
|
|
178
178
|
</div>
|
|
179
179
|
)}
|
|
@@ -178,8 +178,8 @@ export function SimulatorPromptEditor({
|
|
|
178
178
|
<div className="flex items-center gap-2">
|
|
179
179
|
<Crosshair className="w-4 h-4 text-neutral-500 shrink-0" />
|
|
180
180
|
<div className="min-w-0">
|
|
181
|
-
<div className="text-
|
|
182
|
-
<div className="text-
|
|
181
|
+
<div className="text-sm font-medium text-neutral-400">Scenario</div>
|
|
182
|
+
<div className="text-sm text-neutral-600">Select scenario and step</div>
|
|
183
183
|
</div>
|
|
184
184
|
</div>
|
|
185
185
|
</div>
|
|
@@ -207,11 +207,11 @@ export function SimulatorPromptEditor({
|
|
|
207
207
|
)}
|
|
208
208
|
</div>
|
|
209
209
|
<div className="min-w-0 flex-1">
|
|
210
|
-
<div className={`text-
|
|
210
|
+
<div className={`text-md font-medium ${isScenarioActive ? 'text-neutral-300' : 'text-neutral-400'}`}>
|
|
211
211
|
{scenario.name}
|
|
212
212
|
</div>
|
|
213
213
|
{scenario.description && (
|
|
214
|
-
<div className="text-
|
|
214
|
+
<div className="text-sm text-neutral-500 mt-0.5 leading-relaxed">
|
|
215
215
|
{scenario.description}
|
|
216
216
|
</div>
|
|
217
217
|
)}
|
|
@@ -236,7 +236,7 @@ export function SimulatorPromptEditor({
|
|
|
236
236
|
<div className={`w-1.5 h-1.5 rounded-full flex-shrink-0 ${
|
|
237
237
|
isStepSelected ? 'bg-blue-400' : 'bg-neutral-600'
|
|
238
238
|
}`} />
|
|
239
|
-
<span className={`text-
|
|
239
|
+
<span className={`text-sm ${isStepSelected ? 'text-neutral-300' : 'text-neutral-400'}`}>
|
|
240
240
|
{step.name}
|
|
241
241
|
</span>
|
|
242
242
|
</button>
|
|
@@ -350,7 +350,7 @@ export function TabbedPromptEditor({
|
|
|
350
350
|
<button
|
|
351
351
|
key={tool.id}
|
|
352
352
|
onClick={() => setActiveTab(tool.id)}
|
|
353
|
-
className={`flex-1 flex items-center justify-center gap-1.5 px-2 text-
|
|
353
|
+
className={`flex-1 flex items-center justify-center gap-1.5 px-2 text-sm font-medium border-b-2 transition-colors ${
|
|
354
354
|
isActive
|
|
355
355
|
? `border-current ${activeColor} bg-neutral-850`
|
|
356
356
|
: 'border-neutral-700 text-neutral-500 hover:text-neutral-400 hover:bg-neutral-850/50'
|
|
@@ -368,7 +368,7 @@ export function TabbedPromptEditor({
|
|
|
368
368
|
{checklistMissing && (
|
|
369
369
|
<div className="flex items-start gap-2 px-3 py-2 bg-red-400/10 border-b border-red-400/30 shrink-0">
|
|
370
370
|
<AlertTriangle className="w-4 h-4 text-red-400 shrink-0 mt-0.5" />
|
|
371
|
-
<div className="text-
|
|
371
|
+
<div className="text-sm text-red-400">
|
|
372
372
|
<span className="font-medium">Missing "# Verification Checklist" section.</span>
|
|
373
373
|
{' '}When verification is enabled, only content under this heading will be sent to the AI for output validation.
|
|
374
374
|
</div>
|
|
@@ -444,11 +444,11 @@ export function TabbedPromptEditor({
|
|
|
444
444
|
<div className="flex items-center gap-2">
|
|
445
445
|
<Variable className="w-4 h-4 text-neutral-500 shrink-0" />
|
|
446
446
|
<div className="min-w-0">
|
|
447
|
-
<div className="text-
|
|
448
|
-
<div className="text-
|
|
447
|
+
<div className="text-sm font-medium text-neutral-400">Placeholders</div>
|
|
448
|
+
<div className="text-sm text-neutral-600 truncate">Available placeholders</div>
|
|
449
449
|
</div>
|
|
450
450
|
</div>
|
|
451
|
-
<span className="px-1.5 py-0.5 bg-violet-400/20 text-violet-400 rounded text-
|
|
451
|
+
<span className="px-1.5 py-0.5 bg-violet-400/20 text-violet-400 rounded text-sm">
|
|
452
452
|
{variableSearch.trim() ? `${filteredVariables.length}/${variables!.length}` : variables!.length}
|
|
453
453
|
</span>
|
|
454
454
|
</div>
|
|
@@ -479,7 +479,7 @@ export function TabbedPromptEditor({
|
|
|
479
479
|
|
|
480
480
|
{/* Autocomplete tip */}
|
|
481
481
|
<div className="px-3 py-2 border-b border-neutral-700 shrink-0">
|
|
482
|
-
<div className="flex items-center gap-1.5 text-
|
|
482
|
+
<div className="flex items-center gap-1.5 text-sm text-neutral-500">
|
|
483
483
|
<Info className="w-3 h-3 flex-shrink-0" />
|
|
484
484
|
<span>Type <code className="text-violet-400">{'{{'}</code> in editor for autocomplete</span>
|
|
485
485
|
</div>
|
|
@@ -502,7 +502,7 @@ export function TabbedPromptEditor({
|
|
|
502
502
|
</div>
|
|
503
503
|
))
|
|
504
504
|
) : variableSearch.trim() ? (
|
|
505
|
-
<div className="text-center py-4 text-
|
|
505
|
+
<div className="text-center py-4 text-sm text-neutral-500">
|
|
506
506
|
No placeholders match "{variableSearch}"
|
|
507
507
|
</div>
|
|
508
508
|
) : null}
|