@toolr/ui-design 0.1.0 → 0.1.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 (41) hide show
  1. package/components/lib/theme-engine.ts +48 -15
  2. package/components/sections/ai-tools-paths/tools-paths-panel.tsx +11 -11
  3. package/components/sections/captured-issues/captured-issues-panel.tsx +20 -20
  4. package/components/sections/golden-snapshots/file-diff-viewer.tsx +19 -19
  5. package/components/sections/golden-snapshots/golden-sync-panel.tsx +3 -3
  6. package/components/sections/golden-snapshots/snapshot-manager.tsx +15 -15
  7. package/components/sections/golden-snapshots/status-overview.tsx +40 -40
  8. package/components/sections/golden-snapshots/version-manager.tsx +10 -10
  9. package/components/sections/prompt-editor/file-type-tabbed-prompt-editor.tsx +11 -11
  10. package/components/sections/prompt-editor/simulator-prompt-editor.tsx +15 -15
  11. package/components/sections/prompt-editor/tabbed-prompt-editor.tsx +19 -19
  12. package/components/sections/snapshot-browser/snapshot-browser-panel.tsx +10 -10
  13. package/components/sections/snapshot-browser/snapshot-tree.tsx +11 -11
  14. package/components/sections/snippets-editor/snippets-editor.tsx +24 -24
  15. package/components/settings/SettingsHeader.tsx +78 -0
  16. package/components/settings/SettingsPanel.tsx +21 -0
  17. package/components/settings/SettingsTreeNav.tsx +256 -0
  18. package/components/settings/index.ts +7 -0
  19. package/components/settings/settings-tree-utils.ts +120 -0
  20. package/components/ui/breadcrumb.tsx +16 -4
  21. package/components/ui/cookie-consent.tsx +82 -0
  22. package/components/ui/file-tree.tsx +5 -5
  23. package/components/ui/filter-dropdown.tsx +4 -4
  24. package/components/ui/form-actions.tsx +1 -1
  25. package/components/ui/label.tsx +31 -3
  26. package/components/ui/resizable-textarea.tsx +2 -2
  27. package/components/ui/segmented-toggle.tsx +17 -4
  28. package/components/ui/select.tsx +3 -3
  29. package/components/ui/sort-dropdown.tsx +2 -2
  30. package/components/ui/status-card.tsx +1 -1
  31. package/components/ui/tooltip.tsx +2 -2
  32. package/dist/index.d.ts +79 -8
  33. package/dist/index.js +1119 -622
  34. package/dist/tokens/{tokens/primitives.css → primitives.css} +10 -8
  35. package/dist/tokens/{tokens/semantic.css → semantic.css} +5 -0
  36. package/index.ts +13 -0
  37. package/package.json +6 -2
  38. package/tokens/primitives.css +10 -8
  39. package/tokens/semantic.css +5 -0
  40. /package/dist/tokens/{tokens/theme.css → theme.css} +0 -0
  41. /package/dist/tokens/{tokens/tokens.json → tokens.json} +0 -0
@@ -81,30 +81,30 @@ export function StatusOverview({
81
81
  return (
82
82
  <div className="space-y-4">
83
83
  {/* Bundled Seed Info */}
84
- <div className="bg-[#181825] rounded-lg p-4 border border-amber-500/30">
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-[#cdd6f4] font-medium">Bundled Seed (App Distribution)</h3>
87
+ <h3 className="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
90
  <div className="grid grid-cols-2 gap-4 text-sm">
91
91
  <div>
92
- <p className="text-[#6c7086]">Status</p>
92
+ <p className="text-neutral-500">Status</p>
93
93
  <p className={status?.seed.exists ? 'text-green-400' : 'text-red-400'}>
94
94
  {status?.seed.exists ? 'Found' : 'Missing'}
95
95
  </p>
96
96
  </div>
97
97
  <div>
98
- <p className="text-[#6c7086]">Size (compressed)</p>
99
- <p className="text-[#cdd6f4]">{formatBytes(status?.seed.sizeBytes ?? 0)}</p>
98
+ <p className="text-neutral-500">Size (compressed)</p>
99
+ <p className="text-neutral-300">{formatBytes(status?.seed.sizeBytes ?? 0)}</p>
100
100
  </div>
101
101
  <div>
102
- <p className="text-[#6c7086]">Modified</p>
103
- <p className="text-[#cdd6f4]">{status?.seed.modifiedAt ? formatDate(status.seed.modifiedAt) : 'N/A'}</p>
102
+ <p className="text-neutral-500">Modified</p>
103
+ <p className="text-neutral-300">{status?.seed.modifiedAt ? formatDate(status.seed.modifiedAt) : 'N/A'}</p>
104
104
  </div>
105
105
  </div>
106
106
  {!devtools && (
107
- <p className="text-xs text-[#585b70] mt-3">
107
+ <p className="text-xs 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
  )}
@@ -118,10 +118,10 @@ export function StatusOverview({
118
118
  {/* Local Directories */}
119
119
  <div className="grid grid-cols-2 gap-4">
120
120
  {/* Golden */}
121
- <div className="bg-[#181825] rounded-lg p-4 border border-blue-500/30">
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-[#cdd6f4] font-medium">Golden (Reference)</h4>
124
+ <h4 className="text-neutral-300 font-medium">Golden (Reference)</h4>
125
125
  {renderVersionBadge(status?.goldenMeta, 'bg-blue-500/20 text-blue-400')}
126
126
  </div>
127
127
  <div className="space-y-2 text-sm">
@@ -131,7 +131,7 @@ export function StatusOverview({
131
131
  const dirExists = status?.directories[dirKey]?.exists ?? false
132
132
  return (
133
133
  <div key={comp} className="flex justify-between items-center">
134
- <span className="text-[#6c7086]">{getLabel(comp)}</span>
134
+ <span className="text-neutral-500">{getLabel(comp)}</span>
135
135
  <VersionStatus
136
136
  exists={dirExists || !!version}
137
137
  version={version}
@@ -143,17 +143,17 @@ export function StatusOverview({
143
143
  })}
144
144
  </div>
145
145
  {!devtools && (
146
- <p className="text-xs text-[#585b70] mt-3">
146
+ <p className="text-xs 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
  )}
150
150
  </div>
151
151
 
152
152
  {/* Live */}
153
- <div className="bg-[#181825] rounded-lg p-4 border border-green-500/30">
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-[#cdd6f4] font-medium">Live (Working Copy)</h4>
156
+ <h4 className="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
@@ -165,19 +165,19 @@ export function StatusOverview({
165
165
  tooltip={{ title: 'Reset options', description: 'Reset live files to golden' }}
166
166
  />
167
167
  {showResetMenu && (
168
- <div ref={resetMenuDropdownRef} className="absolute right-0 top-full mt-1 w-56 bg-[#1e1e2e] border border-[#313244] rounded-lg shadow-xl z-50 py-1 overflow-hidden">
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-sm text-[#cdd6f4] hover:bg-[#313244] transition-colors"
171
+ className="w-full text-left px-3 py-2 text-sm text-neutral-300 hover:bg-neutral-700 transition-colors"
172
172
  >
173
173
  Reset All to Golden
174
174
  </button>
175
- <div className="border-t border-[#313244] my-1" />
175
+ <div className="border-t border-neutral-700 my-1" />
176
176
  {components.map((comp) => (
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-sm text-[#a6adc8] hover:bg-[#313244] transition-colors"
180
+ className="w-full text-left px-3 py-2 text-sm text-neutral-400 hover:bg-neutral-700 transition-colors"
181
181
  >
182
182
  Reset {getLabel(comp)}
183
183
  </button>
@@ -195,7 +195,7 @@ export function StatusOverview({
195
195
  const mismatch = !!(goldenV && liveV && goldenV !== liveV)
196
196
  return (
197
197
  <div key={comp} className="flex justify-between items-center">
198
- <span className="text-[#6c7086]">{getLabel(comp)}</span>
198
+ <span className="text-neutral-500">{getLabel(comp)}</span>
199
199
  <span className="flex items-center gap-2">
200
200
  <VersionStatus exists={dirExists || !!liveV} version={liveV} mismatch={mismatch} />
201
201
  <IconButton
@@ -212,7 +212,7 @@ export function StatusOverview({
212
212
  })}
213
213
  </div>
214
214
  {!devtools && (
215
- <p className="text-xs text-[#585b70] mt-3">
215
+ <p className="text-xs 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
  )}
@@ -221,21 +221,21 @@ export function StatusOverview({
221
221
 
222
222
  {/* Update Flow — settings only */}
223
223
  {!devtools && (
224
- <div className="bg-[#181825]/50 border border-[#313244] rounded-lg p-4">
225
- <p className="text-xs font-medium text-[#a6adc8] mb-4">
226
- How updates work <span className="font-normal text-[#585b70]">— checked per component ({components.map(getLabel).join(', ')})</span>
224
+ <div className="bg-neutral-900/50 border border-neutral-700 rounded-lg p-4">
225
+ <p className="text-xs font-medium text-neutral-400 mb-4">
226
+ How updates work <span className="font-normal text-neutral-600">— checked per component ({components.map(getLabel).join(', ')})</span>
227
227
  </p>
228
228
  <div className="grid grid-cols-[auto_auto_auto_auto_auto_auto_auto] items-center gap-x-2 text-xs">
229
229
  {/* Row 1: top branch outcome */}
230
230
  <span /><span /><span /><span /><span />
231
- <span className="text-[#585b70] text-base justify-self-center self-end mb-[-4px]">↗</span>
231
+ <span className="text-neutral-600 text-base justify-self-center self-end mb-[-4px]">↗</span>
232
232
  <div className="flex flex-col items-center">
233
233
  <Tooltip content={{ title: 'Live updated', description: 'No local customizations were found for this component, so it was automatically updated to match the new golden version.' }} multiline maxWidth={260}>
234
234
  <div className="rounded bg-green-500/10 border border-green-500/20 px-3 py-1.5 whitespace-nowrap w-full text-center cursor-help">
235
235
  <span className="text-green-400 font-medium">Live updated</span>
236
236
  </div>
237
237
  </Tooltip>
238
- <span className="text-[#585b70] mt-0.5">no changes</span>
238
+ <span className="text-neutral-600 mt-0.5">no changes</span>
239
239
  </div>
240
240
 
241
241
  {/* Row 2: linear flow */}
@@ -245,41 +245,41 @@ export function StatusOverview({
245
245
  <span className="text-amber-400 font-medium">App Update</span>
246
246
  </div>
247
247
  </Tooltip>
248
- <span className="text-[#585b70] mt-0.5">ships new seed</span>
248
+ <span className="text-neutral-600 mt-0.5">ships new seed</span>
249
249
  </div>
250
- <span className="text-[#585b70] text-lg self-start justify-self-center px-2">→</span>
250
+ <span className="text-neutral-600 text-lg self-start justify-self-center px-2">→</span>
251
251
  <div className="flex flex-col items-center">
252
252
  <Tooltip content={{ title: 'Golden overwritten', description: 'The golden reference directory is always overwritten with the latest seed. This ensures golden always reflects the newest release.' }} multiline maxWidth={260}>
253
253
  <div className="rounded bg-blue-500/10 border border-blue-500/20 px-3 py-1.5 text-center w-full cursor-help">
254
254
  <span className="text-blue-400 font-medium">Golden</span>
255
255
  </div>
256
256
  </Tooltip>
257
- <span className="text-[#585b70] mt-0.5">overwritten</span>
257
+ <span className="text-neutral-600 mt-0.5">overwritten</span>
258
258
  </div>
259
- <span className="text-[#585b70] text-lg self-start justify-self-center px-2">→</span>
259
+ <span className="text-neutral-600 text-lg self-start justify-self-center px-2">→</span>
260
260
  <div className="flex flex-col items-center">
261
261
  <Tooltip content={{ title: 'Compare per component', description: 'Each component is compared individually. If the live version has local changes, it is left untouched.' }} multiline maxWidth={260}>
262
- <div className="rounded bg-[#313244]/50 border border-[#313244] px-3 py-1.5 text-center w-full cursor-help">
263
- <span className="text-[#a6adc8] font-medium">Compare</span>
262
+ <div className="rounded bg-neutral-700/50 border border-neutral-700 px-3 py-1.5 text-center w-full cursor-help">
263
+ <span className="text-neutral-400 font-medium">Compare</span>
264
264
  </div>
265
265
  </Tooltip>
266
- <span className="text-[#585b70] mt-0.5">per component</span>
266
+ <span className="text-neutral-600 mt-0.5">per component</span>
267
267
  </div>
268
268
  <span /><span />
269
269
 
270
270
  {/* Row 3: bottom branch outcome */}
271
271
  <span /><span /><span /><span /><span />
272
- <span className="text-[#585b70] text-base justify-self-center self-start mt-[-20px]">↘</span>
272
+ <span className="text-neutral-600 text-base justify-self-center self-start mt-[-20px]">↘</span>
273
273
  <div className="flex flex-col items-center">
274
274
  <Tooltip content={{ title: 'Live unchanged', description: 'Local customizations were detected for this component, so it was left untouched. Use the File Diff tab to review differences, or reset it manually.' }} multiline maxWidth={260}>
275
275
  <div className="rounded bg-yellow-500/10 border border-yellow-500/20 px-3 py-1.5 whitespace-nowrap w-full text-center cursor-help">
276
276
  <span className="text-yellow-400 font-medium">Live unchanged</span>
277
277
  </div>
278
278
  </Tooltip>
279
- <span className="text-[#585b70] mt-0.5">has changes</span>
279
+ <span className="text-neutral-600 mt-0.5">has changes</span>
280
280
  </div>
281
281
  </div>
282
- <p className="text-xs text-[#585b70] mt-3">
282
+ <p className="text-xs 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>
@@ -287,15 +287,15 @@ export function StatusOverview({
287
287
 
288
288
  {/* Local Snapshots - devtools only */}
289
289
  {devtools && manifest && (
290
- <div className="bg-[#181825] rounded-lg p-4 border border-[#313244]">
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
- <Archive className="w-4 h-4 text-[#6c7086]" />
293
- <h4 className="text-[#cdd6f4] font-medium">Local Snapshots</h4>
292
+ <Archive className="w-4 h-4 text-neutral-500" />
293
+ <h4 className="text-neutral-300 font-medium">Local Snapshots</h4>
294
294
  </div>
295
295
  <div className="flex gap-6 text-sm">
296
296
  <div>
297
- <span className="text-[#6c7086]">Count: </span>
298
- <span className="text-[#cdd6f4]">{manifest.snapshots.length}</span>
297
+ <span className="text-neutral-500">Count: </span>
298
+ <span className="text-neutral-300">{manifest.snapshots.length}</span>
299
299
  </div>
300
300
  </div>
301
301
  </div>
@@ -53,17 +53,17 @@ export function VersionManager({ sync, components, componentLabels }: VersionMan
53
53
  return (
54
54
  <div className="space-y-4">
55
55
  {/* Global Version Bump */}
56
- <div className="bg-[#181825] rounded-lg p-4 border border-teal-500/30">
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-[#cdd6f4] font-medium">Golden Version</h4>
59
+ <h4 className="text-neutral-300 font-medium">Golden Version</h4>
60
60
  {status?.goldenMeta && (
61
61
  <span className="px-2 py-0.5 bg-teal-500/20 text-teal-400 text-xs rounded font-mono">
62
62
  {status.goldenMeta.version}
63
63
  </span>
64
64
  )}
65
65
  </div>
66
- <p className="text-xs text-[#585b70] mb-3">
66
+ <p className="text-xs 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">
@@ -98,15 +98,15 @@ export function VersionManager({ sync, components, componentLabels }: VersionMan
98
98
  </div>
99
99
 
100
100
  {/* Component Versions */}
101
- <div className="bg-[#181825] rounded-lg border border-[#313244] overflow-hidden">
102
- <div className="px-4 py-3 border-b border-[#313244]">
103
- <h4 className="text-[#cdd6f4] font-medium">Component Versions</h4>
104
- <p className="text-xs text-[#585b70] mt-1">
101
+ <div className="bg-neutral-900 rounded-lg border border-neutral-700 overflow-hidden">
102
+ <div className="px-4 py-3 border-b border-neutral-700">
103
+ <h4 className="text-neutral-300 font-medium">Component Versions</h4>
104
+ <p className="text-xs text-neutral-600 mt-1">
105
105
  Update individual component versions. Click a component to edit.
106
106
  </p>
107
107
  </div>
108
108
 
109
- <div className="divide-y divide-[#313244]">
109
+ <div className="divide-y divide-neutral-700">
110
110
  {components.map((comp) => {
111
111
  const currentVersion = status?.goldenMeta?.components[comp]?.version
112
112
  const liveVersion = status?.liveMeta?.components[comp]?.version
@@ -117,9 +117,9 @@ 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-sm text-[#cdd6f4]">{getLabel(comp)}</span>
120
+ <span className="text-sm text-neutral-300">{getLabel(comp)}</span>
121
121
  {currentVersion && (
122
- <span className="text-xs font-mono text-[#6c7086]">v{currentVersion}</span>
122
+ <span className="text-xs font-mono text-neutral-500">v{currentVersion}</span>
123
123
  )}
124
124
  {mismatch && (
125
125
  <span className="text-[10px] text-yellow-400">
@@ -134,14 +134,14 @@ export function FileTypeTabbedPromptEditor({
134
134
  }, [sidebarWidth])
135
135
 
136
136
  return (
137
- <div className={`flex w-full max-w-full bg-[#181825] border border-[#313244] rounded-lg overflow-hidden ${className}`}>
137
+ <div className={`flex w-full max-w-full bg-neutral-900 border border-neutral-700 rounded-lg overflow-hidden ${className}`}>
138
138
  {/* Left Sidebar — File Type Selector */}
139
139
  <div
140
- className="relative shrink-0 bg-[#11111b] overflow-hidden flex flex-col"
140
+ className="relative shrink-0 bg-neutral-950 overflow-hidden flex flex-col"
141
141
  style={{ width: sidebarWidth, minWidth: MIN_SIDEBAR_WIDTH, maxWidth: MAX_SIDEBAR_WIDTH }}
142
142
  >
143
143
  {/* Header */}
144
- <div className="h-[52px] px-3 flex items-center border-b border-[#313244] shrink-0">
144
+ <div className="h-[52px] px-3 flex items-center border-b border-neutral-700 shrink-0">
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">
@@ -161,19 +161,19 @@ export function FileTypeTabbedPromptEditor({
161
161
  onClick={() => setSelectedFileType(ft.id)}
162
162
  className={`w-full min-h-[44px] py-2 flex items-center gap-2.5 px-3 text-left transition-colors ${
163
163
  isSelected
164
- ? 'bg-[#313244]/50 border-l-2 border-[#89b4fa]'
165
- : 'hover:bg-[#1e1e2e] border-l-2 border-transparent'
164
+ ? 'bg-neutral-700/50 border-l-2 border-blue-400'
165
+ : 'hover:bg-neutral-850 border-l-2 border-transparent'
166
166
  }`}
167
167
  >
168
- <div className={`flex-shrink-0 ${isSelected ? 'text-[#89b4fa]' : 'text-[#6c7086]'}`}>
168
+ <div className={`flex-shrink-0 ${isSelected ? 'text-blue-400' : 'text-neutral-500'}`}>
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-sm font-medium truncate ${isSelected ? 'text-[#cdd6f4]' : 'text-[#a6adc8]'}`}>
172
+ <div className={`text-sm 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-xs text-[#6c7086] mt-0.5 leading-relaxed">
176
+ <div className="text-xs text-neutral-500 mt-0.5 leading-relaxed">
177
177
  {ft.description}
178
178
  </div>
179
179
  )}
@@ -186,14 +186,14 @@ export function FileTypeTabbedPromptEditor({
186
186
  {/* Resize handle on right edge */}
187
187
  <div
188
188
  onPointerDown={handleSidebarPointerDown}
189
- className="absolute right-0 top-0 bottom-0 w-1.5 cursor-col-resize hover:bg-[#89b4fa]/30 transition-colors z-10 flex items-center justify-center group"
189
+ className="absolute right-0 top-0 bottom-0 w-1.5 cursor-col-resize hover:bg-blue-400/30 transition-colors z-10 flex items-center justify-center group"
190
190
  >
191
- <GripVertical className="w-3 h-3 text-[#45475a] group-hover:text-[#6c7086] opacity-0 group-hover:opacity-100 transition-opacity" />
191
+ <GripVertical className="w-3 h-3 text-neutral-600 group-hover:text-neutral-500 opacity-0 group-hover:opacity-100 transition-opacity" />
192
192
  </div>
193
193
  </div>
194
194
 
195
195
  {/* Main Content — TabbedPromptEditor */}
196
- <div className="flex-1 min-w-0 w-0 overflow-hidden border-l border-[#313244]">
196
+ <div className="flex-1 min-w-0 w-0 overflow-hidden border-l border-neutral-700">
197
197
  <TabbedPromptEditor
198
198
  prompts={currentPrompts}
199
199
  onPromptChange={handlePromptChange}
@@ -167,14 +167,14 @@ export function SimulatorPromptEditor({
167
167
  }, [sidebarWidth])
168
168
 
169
169
  return (
170
- <div className={`flex w-full max-w-full bg-[#181825] border border-[#313244] rounded-lg overflow-hidden ${className}`}>
170
+ <div className={`flex w-full max-w-full bg-neutral-900 border border-neutral-700 rounded-lg overflow-hidden ${className}`}>
171
171
  {/* Left Sidebar — Tree Selector */}
172
172
  <div
173
- className="relative shrink-0 bg-[#11111b] overflow-hidden flex flex-col"
173
+ className="relative shrink-0 bg-neutral-950 overflow-hidden flex flex-col"
174
174
  style={{ width: sidebarWidth, minWidth: MIN_SIDEBAR_WIDTH, maxWidth: MAX_SIDEBAR_WIDTH }}
175
175
  >
176
176
  {/* Header */}
177
- <div className="h-[52px] px-3 flex items-center border-b border-[#313244] shrink-0">
177
+ <div className="h-[52px] px-3 flex items-center border-b border-neutral-700 shrink-0">
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">
@@ -195,11 +195,11 @@ export function SimulatorPromptEditor({
195
195
  {/* Scenario Header */}
196
196
  <button
197
197
  onClick={() => toggleScenario(scenario.id)}
198
- className={`w-full min-h-[44px] py-2 flex items-start gap-2 px-3 text-left transition-colors hover:bg-[#1e1e2e] ${
199
- isScenarioActive ? 'bg-[#1e1e2e]/50' : ''
198
+ className={`w-full min-h-[44px] py-2 flex items-start gap-2 px-3 text-left transition-colors hover:bg-neutral-850 ${
199
+ isScenarioActive ? 'bg-neutral-850/50' : ''
200
200
  }`}
201
201
  >
202
- <div className="flex-shrink-0 mt-0.5 text-[#6c7086]">
202
+ <div className="flex-shrink-0 mt-0.5 text-neutral-500">
203
203
  {isExpanded ? (
204
204
  <ChevronDown className="w-4 h-4" />
205
205
  ) : (
@@ -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-sm font-medium ${isScenarioActive ? 'text-[#cdd6f4]' : 'text-[#a6adc8]'}`}>
210
+ <div className={`text-sm font-medium ${isScenarioActive ? 'text-neutral-300' : 'text-neutral-400'}`}>
211
211
  {scenario.name}
212
212
  </div>
213
213
  {scenario.description && (
214
- <div className="text-xs text-[#6c7086] mt-0.5 leading-relaxed">
214
+ <div className="text-xs text-neutral-500 mt-0.5 leading-relaxed">
215
215
  {scenario.description}
216
216
  </div>
217
217
  )}
@@ -229,14 +229,14 @@ export function SimulatorPromptEditor({
229
229
  onClick={() => selectStep(scenario.id, step.id)}
230
230
  className={`w-full h-[32px] flex items-center gap-2 pl-9 pr-3 text-left transition-colors ${
231
231
  isStepSelected
232
- ? 'bg-[#313244]/50 border-l-2 border-[#89b4fa]'
233
- : 'hover:bg-[#1e1e2e] border-l-2 border-transparent'
232
+ ? 'bg-neutral-700/50 border-l-2 border-blue-400'
233
+ : 'hover:bg-neutral-850 border-l-2 border-transparent'
234
234
  }`}
235
235
  >
236
236
  <div className={`w-1.5 h-1.5 rounded-full flex-shrink-0 ${
237
- isStepSelected ? 'bg-[#89b4fa]' : 'bg-[#45475a]'
237
+ isStepSelected ? 'bg-blue-400' : 'bg-neutral-600'
238
238
  }`} />
239
- <span className={`text-xs ${isStepSelected ? 'text-[#cdd6f4]' : 'text-[#a6adc8]'}`}>
239
+ <span className={`text-xs ${isStepSelected ? 'text-neutral-300' : 'text-neutral-400'}`}>
240
240
  {step.name}
241
241
  </span>
242
242
  </button>
@@ -252,14 +252,14 @@ export function SimulatorPromptEditor({
252
252
  {/* Resize handle on right edge */}
253
253
  <div
254
254
  onPointerDown={handleSidebarPointerDown}
255
- className="absolute right-0 top-0 bottom-0 w-1.5 cursor-col-resize hover:bg-[#89b4fa]/30 transition-colors z-10 flex items-center justify-center group"
255
+ className="absolute right-0 top-0 bottom-0 w-1.5 cursor-col-resize hover:bg-blue-400/30 transition-colors z-10 flex items-center justify-center group"
256
256
  >
257
- <GripVertical className="w-3 h-3 text-[#45475a] group-hover:text-[#6c7086] opacity-0 group-hover:opacity-100 transition-opacity" />
257
+ <GripVertical className="w-3 h-3 text-neutral-600 group-hover:text-neutral-500 opacity-0 group-hover:opacity-100 transition-opacity" />
258
258
  </div>
259
259
  </div>
260
260
 
261
261
  {/* Main Content — TabbedPromptEditor */}
262
- <div className="flex-1 min-w-0 w-0 overflow-hidden border-l border-[#313244]">
262
+ <div className="flex-1 min-w-0 w-0 overflow-hidden border-l border-neutral-700">
263
263
  <TabbedPromptEditor
264
264
  prompts={currentPrompts}
265
265
  onPromptChange={handlePromptChange}
@@ -337,14 +337,14 @@ export function TabbedPromptEditor({
337
337
  }, [variables, variableSearch])
338
338
 
339
339
  return (
340
- <div className={`flex w-full h-full bg-[#181825] overflow-hidden ${standalone ? 'border border-[#313244] rounded-lg' : ''} ${className}`}>
340
+ <div className={`flex w-full h-full bg-neutral-900 overflow-hidden ${standalone ? 'border border-neutral-700 rounded-lg' : ''} ${className}`}>
341
341
  {/* Main content area */}
342
342
  <div className="flex-1 min-w-0 w-0 flex flex-col overflow-hidden">
343
343
  {/* Tool Tabs */}
344
- <div className="relative flex h-[26px] bg-[#11111b] shrink-0">
344
+ <div className="relative flex h-[26px] bg-neutral-950 shrink-0">
345
345
  {tools.map((tool) => {
346
346
  const isActive = activeTab === tool.id
347
- const activeColor = tool.activeColor ?? 'text-[#89b4fa]'
347
+ const activeColor = tool.activeColor ?? 'text-blue-400'
348
348
 
349
349
  return (
350
350
  <button
@@ -352,8 +352,8 @@ export function TabbedPromptEditor({
352
352
  onClick={() => setActiveTab(tool.id)}
353
353
  className={`flex-1 flex items-center justify-center gap-1.5 px-2 text-xs font-medium border-b-2 transition-colors ${
354
354
  isActive
355
- ? `border-current ${activeColor} bg-[#1e1e2e]`
356
- : 'border-[#313244] text-[#6c7086] hover:text-[#a6adc8] hover:bg-[#1e1e2e]/50'
355
+ ? `border-current ${activeColor} bg-neutral-850`
356
+ : 'border-neutral-700 text-neutral-500 hover:text-neutral-400 hover:bg-neutral-850/50'
357
357
  }`}
358
358
  title={tool.name}
359
359
  >
@@ -366,9 +366,9 @@ export function TabbedPromptEditor({
366
366
 
367
367
  {/* Checklist validation warning */}
368
368
  {checklistMissing && (
369
- <div className="flex items-start gap-2 px-3 py-2 bg-[#f38ba8]/10 border-b border-[#f38ba8]/30 shrink-0">
370
- <AlertTriangle className="w-4 h-4 text-[#f38ba8] shrink-0 mt-0.5" />
371
- <div className="text-xs text-[#f38ba8]">
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
+ <AlertTriangle className="w-4 h-4 text-red-400 shrink-0 mt-0.5" />
371
+ <div className="text-xs 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>
@@ -430,17 +430,17 @@ export function TabbedPromptEditor({
430
430
  {/* Variables Sidebar */}
431
431
  {hasVariables && (
432
432
  <div
433
- className="relative shrink-0 bg-[#11111b] overflow-hidden flex flex-col border-l border-[#313244]"
433
+ className="relative shrink-0 bg-neutral-950 overflow-hidden flex flex-col border-l border-neutral-700"
434
434
  style={{ width: sidebarWidth, minWidth: MIN_SIDEBAR_WIDTH, maxWidth: MAX_SIDEBAR_WIDTH }}
435
435
  >
436
436
  {/* Resize handle on left edge */}
437
437
  <div
438
438
  onPointerDown={handleSidebarMouseDown}
439
- className="absolute left-0 top-0 bottom-0 w-1 cursor-col-resize hover:bg-[#b4befe]/30 transition-colors z-10"
439
+ className="absolute left-0 top-0 bottom-0 w-1 cursor-col-resize hover:bg-violet-400/30 transition-colors z-10"
440
440
  />
441
441
 
442
442
  {/* Header */}
443
- <div className="h-[52px] px-3 flex items-center justify-between border-b border-[#313244] shrink-0">
443
+ <div className="h-[52px] px-3 flex items-center justify-between border-b border-neutral-700 shrink-0">
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">
@@ -448,15 +448,15 @@ export function TabbedPromptEditor({
448
448
  <div className="text-xs text-neutral-600 truncate">Available placeholders</div>
449
449
  </div>
450
450
  </div>
451
- <span className="px-1.5 py-0.5 bg-[#b4befe]/20 text-[#b4befe] rounded text-xs">
451
+ <span className="px-1.5 py-0.5 bg-violet-400/20 text-violet-400 rounded text-xs">
452
452
  {variableSearch.trim() ? `${filteredVariables.length}/${variables!.length}` : variables!.length}
453
453
  </span>
454
454
  </div>
455
455
 
456
456
  {/* Search */}
457
- <div className="px-2.5 py-2 border-b border-[#313244] shrink-0">
457
+ <div className="px-2.5 py-2 border-b border-neutral-700 shrink-0">
458
458
  <div className="relative">
459
- <Search className="absolute left-2 top-1/2 -translate-y-1/2 w-3 h-3 text-[#6c7086]" />
459
+ <Search className="absolute left-2 top-1/2 -translate-y-1/2 w-3 h-3 text-neutral-500" />
460
460
  <Input
461
461
  value={variableSearch}
462
462
  onChange={setVariableSearch}
@@ -478,10 +478,10 @@ export function TabbedPromptEditor({
478
478
  </div>
479
479
 
480
480
  {/* Autocomplete tip */}
481
- <div className="px-3 py-2 border-b border-[#313244] shrink-0">
482
- <div className="flex items-center gap-1.5 text-xs text-[#6c7086]">
481
+ <div className="px-3 py-2 border-b border-neutral-700 shrink-0">
482
+ <div className="flex items-center gap-1.5 text-xs text-neutral-500">
483
483
  <Info className="w-3 h-3 flex-shrink-0" />
484
- <span>Type <code className="text-[#b4befe]">{'{{'}</code> in editor for autocomplete</span>
484
+ <span>Type <code className="text-violet-400">{'{{'}</code> in editor for autocomplete</span>
485
485
  </div>
486
486
  </div>
487
487
 
@@ -489,7 +489,7 @@ export function TabbedPromptEditor({
489
489
  <div className="flex-1 overflow-y-auto p-2.5 space-y-2">
490
490
  {filteredVariables.length > 0 ? (
491
491
  filteredVariables.map((variable: PromptPlaceholder) => (
492
- <div key={variable.name} className="bg-[#1e1e2e] border border-[#313244] rounded-lg">
492
+ <div key={variable.name} className="bg-neutral-850 border border-neutral-700 rounded-lg">
493
493
  <EditorPlaceholderCard
494
494
  name={variable.name}
495
495
  description={variable.description}
@@ -502,7 +502,7 @@ export function TabbedPromptEditor({
502
502
  </div>
503
503
  ))
504
504
  ) : variableSearch.trim() ? (
505
- <div className="text-center py-4 text-xs text-[#6c7086]">
505
+ <div className="text-center py-4 text-xs text-neutral-500">
506
506
  No placeholders match "{variableSearch}"
507
507
  </div>
508
508
  ) : null}
@@ -71,11 +71,11 @@ export function SnapshotBrowserPanel({
71
71
  return (
72
72
  <div className={cn('space-y-6', className)}>
73
73
  {/* Snapshot Limit */}
74
- <div className="bg-[#181825] border border-[#313244] rounded-lg p-4">
74
+ <div className="bg-neutral-900 border border-neutral-700 rounded-lg p-4">
75
75
  <div className="flex items-center justify-between">
76
76
  <div>
77
- <label className="text-[#cdd6f4]">Snapshot Limit</label>
78
- <p className="text-sm text-[#6c7086]">
77
+ <label className="text-neutral-300">Snapshot Limit</label>
78
+ <p className="text-sm text-neutral-500">
79
79
  Maximum number of snapshots to keep per item (1-50)
80
80
  </p>
81
81
  </div>
@@ -88,11 +88,11 @@ export function SnapshotBrowserPanel({
88
88
  </div>
89
89
 
90
90
  {/* Snapshot Browser */}
91
- <div className="bg-[#181825] border border-[#313244] rounded-lg p-4">
91
+ <div className="bg-neutral-900 border border-neutral-700 rounded-lg p-4">
92
92
  <div className="flex items-center justify-between mb-3">
93
93
  <div>
94
- <label className="text-[#cdd6f4]">Browse Snapshots</label>
95
- <p className="text-sm text-[#6c7086]">
94
+ <label className="text-neutral-300">Browse Snapshots</label>
95
+ <p className="text-sm text-neutral-500">
96
96
  {totalSnapshotCount === 0
97
97
  ? 'No snapshots saved yet'
98
98
  : `${totalSnapshotCount} snapshot${totalSnapshotCount === 1 ? '' : 's'} stored`}
@@ -126,12 +126,12 @@ export function SnapshotBrowserPanel({
126
126
  </div>
127
127
 
128
128
  {/* Help */}
129
- <div className="bg-[#181825]/50 border border-[#313244] rounded-lg p-4">
129
+ <div className="bg-neutral-900/50 border border-neutral-700 rounded-lg p-4">
130
130
  <div className="flex items-start gap-3">
131
- <HelpCircle className="w-4 h-4 text-[#6c7086] mt-0.5 shrink-0" />
132
- <div className="text-sm text-[#6c7086] space-y-2">
131
+ <HelpCircle className="w-4 h-4 text-neutral-500 mt-0.5 shrink-0" />
132
+ <div className="text-sm text-neutral-500 space-y-2">
133
133
  <p>
134
- <strong className="text-[#a6adc8]">How snapshots work:</strong>
134
+ <strong className="text-neutral-400">How snapshots work:</strong>
135
135
  </p>
136
136
  <ul className="list-disc list-inside space-y-1 ml-1">
137
137
  <li>Click &ldquo;Save Snapshot&rdquo; in any editor to save the current version</li>