@clef-sh/ui 0.1.20 → 0.1.21

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 (103) hide show
  1. package/dist/client/assets/index-DPWHjBbB.js +34 -0
  2. package/dist/client/assets/index-qsLTYpc9.css +2 -0
  3. package/dist/client/clef.svg +2 -0
  4. package/dist/client/index.html +3 -31
  5. package/dist/client-lib/components/Button.d.ts +1 -1
  6. package/dist/client-lib/components/Button.d.ts.map +1 -1
  7. package/dist/client-lib/components/CopyButton.d.ts.map +1 -1
  8. package/dist/client-lib/components/EnvBadge.d.ts.map +1 -1
  9. package/dist/client-lib/components/MatrixGrid.d.ts.map +1 -1
  10. package/dist/client-lib/components/Sidebar.d.ts +1 -1
  11. package/dist/client-lib/components/Sidebar.d.ts.map +1 -1
  12. package/dist/client-lib/components/StatusDot.d.ts.map +1 -1
  13. package/dist/client-lib/components/SyncPanel.d.ts.map +1 -1
  14. package/dist/client-lib/components/TopBar.d.ts +6 -0
  15. package/dist/client-lib/components/TopBar.d.ts.map +1 -1
  16. package/dist/client-lib/primitives/Badge.d.ts +11 -0
  17. package/dist/client-lib/primitives/Badge.d.ts.map +1 -0
  18. package/dist/client-lib/primitives/Card.d.ts +28 -0
  19. package/dist/client-lib/primitives/Card.d.ts.map +1 -0
  20. package/dist/client-lib/primitives/Dialog.d.ts +30 -0
  21. package/dist/client-lib/primitives/Dialog.d.ts.map +1 -0
  22. package/dist/client-lib/primitives/EmptyState.d.ts +10 -0
  23. package/dist/client-lib/primitives/EmptyState.d.ts.map +1 -0
  24. package/dist/client-lib/primitives/Field.d.ts +36 -0
  25. package/dist/client-lib/primitives/Field.d.ts.map +1 -0
  26. package/dist/client-lib/primitives/Input.d.ts +6 -0
  27. package/dist/client-lib/primitives/Input.d.ts.map +1 -0
  28. package/dist/client-lib/primitives/Stat.d.ts +11 -0
  29. package/dist/client-lib/primitives/Stat.d.ts.map +1 -0
  30. package/dist/client-lib/primitives/Table.d.ts +37 -0
  31. package/dist/client-lib/primitives/Table.d.ts.map +1 -0
  32. package/dist/client-lib/primitives/Tabs.d.ts +29 -0
  33. package/dist/client-lib/primitives/Tabs.d.ts.map +1 -0
  34. package/dist/client-lib/primitives/Toast.d.ts +16 -0
  35. package/dist/client-lib/primitives/Toast.d.ts.map +1 -0
  36. package/dist/client-lib/primitives/Toolbar.d.ts +29 -0
  37. package/dist/client-lib/primitives/Toolbar.d.ts.map +1 -0
  38. package/dist/client-lib/primitives/index.d.ts +23 -0
  39. package/dist/client-lib/primitives/index.d.ts.map +1 -0
  40. package/dist/client-lib/theme.d.ts +18 -41
  41. package/dist/client-lib/theme.d.ts.map +1 -1
  42. package/dist/server/api.d.ts.map +1 -1
  43. package/dist/server/api.js +215 -0
  44. package/dist/server/api.js.map +1 -1
  45. package/dist/server/envelope.d.ts +15 -0
  46. package/dist/server/envelope.d.ts.map +1 -0
  47. package/dist/server/envelope.js +310 -0
  48. package/dist/server/envelope.js.map +1 -0
  49. package/package.json +7 -2
  50. package/src/client/App.tsx +16 -41
  51. package/src/client/components/Button.tsx +13 -22
  52. package/src/client/components/CopyButton.tsx +5 -12
  53. package/src/client/components/EnvBadge.tsx +30 -15
  54. package/src/client/components/MatrixGrid.tsx +108 -252
  55. package/src/client/components/Sidebar.tsx +123 -199
  56. package/src/client/components/StatusDot.tsx +10 -15
  57. package/src/client/components/SyncPanel.tsx +14 -62
  58. package/src/client/components/TopBar.tsx +11 -36
  59. package/src/client/index.html +1 -30
  60. package/src/client/main.tsx +1 -0
  61. package/src/client/primitives/Badge.test.tsx +47 -0
  62. package/src/client/primitives/Badge.tsx +64 -0
  63. package/src/client/primitives/Card.test.tsx +50 -0
  64. package/src/client/primitives/Card.tsx +85 -0
  65. package/src/client/primitives/Dialog.test.tsx +55 -0
  66. package/src/client/primitives/Dialog.tsx +96 -0
  67. package/src/client/primitives/EmptyState.test.tsx +25 -0
  68. package/src/client/primitives/EmptyState.tsx +38 -0
  69. package/src/client/primitives/Field.test.tsx +46 -0
  70. package/src/client/primitives/Field.tsx +95 -0
  71. package/src/client/primitives/Input.tsx +26 -0
  72. package/src/client/primitives/Stat.test.tsx +32 -0
  73. package/src/client/primitives/Stat.tsx +52 -0
  74. package/src/client/primitives/Table.test.tsx +58 -0
  75. package/src/client/primitives/Table.tsx +113 -0
  76. package/src/client/primitives/Tabs.test.tsx +44 -0
  77. package/src/client/primitives/Tabs.tsx +100 -0
  78. package/src/client/primitives/Toast.test.tsx +77 -0
  79. package/src/client/primitives/Toast.tsx +89 -0
  80. package/src/client/primitives/Toolbar.test.tsx +50 -0
  81. package/src/client/primitives/Toolbar.tsx +86 -0
  82. package/src/client/primitives/index.ts +43 -0
  83. package/src/client/public/clef.svg +2 -0
  84. package/src/client/screens/BackendScreen.tsx +104 -363
  85. package/src/client/screens/DiffView.tsx +187 -378
  86. package/src/client/screens/EnvelopeScreen.test.tsx +542 -0
  87. package/src/client/screens/EnvelopeScreen.tsx +948 -0
  88. package/src/client/screens/GitLogView.tsx +48 -106
  89. package/src/client/screens/ImportScreen.tsx +105 -308
  90. package/src/client/screens/LintView.tsx +184 -379
  91. package/src/client/screens/ManifestScreen.tsx +283 -445
  92. package/src/client/screens/MatrixView.tsx +75 -91
  93. package/src/client/screens/NamespaceEditor.tsx +234 -609
  94. package/src/client/screens/PolicyView.tsx +183 -453
  95. package/src/client/screens/RecipientsScreen.tsx +71 -350
  96. package/src/client/screens/ResetScreen.tsx +67 -237
  97. package/src/client/screens/ScanScreen.tsx +85 -249
  98. package/src/client/screens/SchemaEditor.test.tsx +237 -0
  99. package/src/client/screens/SchemaEditor.tsx +435 -0
  100. package/src/client/screens/ServiceIdentitiesScreen.tsx +251 -788
  101. package/src/client/styles.css +77 -0
  102. package/src/client/theme.ts +27 -48
  103. package/dist/client/assets/index-Db6WgHgY.js +0 -38
@@ -1,8 +1,7 @@
1
1
  import React, { useState } from "react";
2
- import { theme } from "../theme";
3
2
  import { apiFetch } from "../api";
4
- import { TopBar } from "../components/TopBar";
5
3
  import { Button } from "../components/Button";
4
+ import { Toolbar, Field, Input } from "../primitives";
6
5
  import type { BackendType, ClefManifest, ResetResult, ResetScope } from "@clef-sh/core";
7
6
  import type { ViewName } from "../components/Sidebar";
8
7
 
@@ -38,6 +37,9 @@ const KEY_PLACEHOLDERS: Record<string, string> = {
38
37
  type ScopeKind = "env" | "namespace" | "cell";
39
38
  type Phase = "idle" | "running" | "done";
40
39
 
40
+ const SELECT_CLASSES =
41
+ "w-full bg-ink-850 border border-edge rounded-md px-2.5 py-1.5 font-sans text-[13px] text-bone outline-none cursor-pointer focus-visible:border-gold-500";
42
+
41
43
  export function ResetScreen({ manifest, setView, reloadManifest }: ResetScreenProps) {
42
44
  const environments = manifest?.environments ?? [];
43
45
  const namespaces = manifest?.namespaces ?? [];
@@ -151,24 +153,22 @@ export function ResetScreen({ manifest, setView, reloadManifest }: ResetScreenPr
151
153
  };
152
154
 
153
155
  return (
154
- <div style={{ flex: 1, display: "flex", flexDirection: "column", overflow: "hidden" }}>
155
- <TopBar title="Reset" subtitle="clef reset — destructively scaffold fresh placeholders" />
156
+ <div className="flex flex-1 flex-col overflow-hidden">
157
+ <Toolbar>
158
+ <div>
159
+ <Toolbar.Title>Reset</Toolbar.Title>
160
+ <Toolbar.Subtitle>
161
+ clef reset — destructively scaffold fresh placeholders
162
+ </Toolbar.Subtitle>
163
+ </div>
164
+ </Toolbar>
156
165
 
157
- <div style={{ flex: 1, overflow: "auto", padding: 24 }}>
158
- <div style={{ maxWidth: 620, margin: "0 auto" }}>
166
+ <div className="flex-1 overflow-auto p-6">
167
+ <div className="max-w-[620px] mx-auto">
159
168
  {error && (
160
169
  <div
161
170
  data-testid="reset-error"
162
- style={{
163
- background: theme.redDim,
164
- border: `1px solid ${theme.red}44`,
165
- borderRadius: 8,
166
- padding: "12px 16px",
167
- marginBottom: 16,
168
- fontFamily: theme.sans,
169
- fontSize: 13,
170
- color: theme.red,
171
- }}
171
+ className="bg-stop-500/10 border border-stop-500/40 rounded-lg px-4 py-3 mb-4 font-sans text-[13px] text-stop-500"
172
172
  >
173
173
  {error}
174
174
  </div>
@@ -176,21 +176,15 @@ export function ResetScreen({ manifest, setView, reloadManifest }: ResetScreenPr
176
176
 
177
177
  {phase === "idle" && (
178
178
  <div>
179
- <div style={{ marginBottom: 20 }}>
179
+ <div className="mb-5">
180
180
  <Label>Scope</Label>
181
- <div style={{ display: "flex", gap: 16, marginBottom: 10 }}>
181
+ <div className="flex gap-4 mb-2.5">
182
182
  {(["env", "namespace", "cell"] as const).map((k) => (
183
183
  <label
184
184
  key={k}
185
- style={{
186
- display: "flex",
187
- alignItems: "center",
188
- gap: 6,
189
- cursor: "pointer",
190
- fontFamily: theme.sans,
191
- fontSize: 13,
192
- color: scopeKind === k ? theme.text : theme.textMuted,
193
- }}
185
+ className={`flex items-center gap-1.5 cursor-pointer font-sans text-[13px] ${
186
+ scopeKind === k ? "text-bone" : "text-ash"
187
+ }`}
194
188
  >
195
189
  <input
196
190
  type="radio"
@@ -201,7 +195,7 @@ export function ResetScreen({ manifest, setView, reloadManifest }: ResetScreenPr
201
195
  setTypedConfirm("");
202
196
  }}
203
197
  data-testid={`reset-scope-${k}`}
204
- style={{ accentColor: theme.accent }}
198
+ className="accent-gold-500"
205
199
  />
206
200
  {k === "env" ? "Environment" : k === "namespace" ? "Namespace" : "Cell"}
207
201
  </label>
@@ -216,7 +210,7 @@ export function ResetScreen({ manifest, setView, reloadManifest }: ResetScreenPr
216
210
  setTypedConfirm("");
217
211
  }}
218
212
  data-testid="reset-env-select"
219
- style={selectStyle}
213
+ className={SELECT_CLASSES}
220
214
  >
221
215
  {environments.map((env) => (
222
216
  <option key={env.name} value={env.name}>
@@ -235,7 +229,7 @@ export function ResetScreen({ manifest, setView, reloadManifest }: ResetScreenPr
235
229
  setTypedConfirm("");
236
230
  }}
237
231
  data-testid="reset-namespace-select"
238
- style={selectStyle}
232
+ className={SELECT_CLASSES}
239
233
  >
240
234
  {namespaces.map((ns) => (
241
235
  <option key={ns.name} value={ns.name}>
@@ -246,7 +240,7 @@ export function ResetScreen({ manifest, setView, reloadManifest }: ResetScreenPr
246
240
  )}
247
241
 
248
242
  {scopeKind === "cell" && (
249
- <div style={{ display: "flex", gap: 8 }}>
243
+ <div className="flex gap-2">
250
244
  <select
251
245
  value={cellNs}
252
246
  onChange={(e) => {
@@ -254,7 +248,7 @@ export function ResetScreen({ manifest, setView, reloadManifest }: ResetScreenPr
254
248
  setTypedConfirm("");
255
249
  }}
256
250
  data-testid="reset-cell-namespace-select"
257
- style={{ ...selectStyle, flex: 1 }}
251
+ className={`${SELECT_CLASSES} flex-1`}
258
252
  >
259
253
  {namespaces.map((ns) => (
260
254
  <option key={ns.name} value={ns.name}>
@@ -269,7 +263,7 @@ export function ResetScreen({ manifest, setView, reloadManifest }: ResetScreenPr
269
263
  setTypedConfirm("");
270
264
  }}
271
265
  data-testid="reset-cell-env-select"
272
- style={{ ...selectStyle, flex: 1 }}
266
+ className={`${SELECT_CLASSES} flex-1`}
273
267
  >
274
268
  {environments.map((env) => (
275
269
  <option key={env.name} value={env.name}>
@@ -282,51 +276,27 @@ export function ResetScreen({ manifest, setView, reloadManifest }: ResetScreenPr
282
276
  )}
283
277
  </div>
284
278
 
285
- <div style={{ marginBottom: 20 }}>
286
- <label
287
- style={{
288
- display: "flex",
289
- alignItems: "center",
290
- gap: 8,
291
- cursor: "pointer",
292
- fontFamily: theme.sans,
293
- fontSize: 13,
294
- color: theme.text,
295
- }}
296
- >
279
+ <div className="mb-5">
280
+ <label className="flex items-center gap-2 cursor-pointer font-sans text-[13px] text-bone">
297
281
  <input
298
282
  type="checkbox"
299
283
  checked={switchBackend}
300
284
  onChange={(e) => setSwitchBackend(e.target.checked)}
301
285
  data-testid="reset-switch-backend"
302
- style={{ accentColor: theme.accent }}
286
+ className="accent-gold-500"
303
287
  />
304
288
  Switch backend as part of reset
305
289
  </label>
306
290
  {switchBackend && (
307
- <div
308
- style={{
309
- marginTop: 12,
310
- padding: 14,
311
- background: theme.surface,
312
- border: `1px solid ${theme.border}`,
313
- borderRadius: 8,
314
- }}
315
- >
291
+ <div className="mt-3 p-3.5 bg-ink-850 border border-edge rounded-lg">
316
292
  <Label>Target Backend</Label>
317
- <div style={{ display: "flex", flexDirection: "column", gap: 6 }}>
293
+ <div className="flex flex-col gap-1.5">
318
294
  {ALL_BACKENDS.map((b) => (
319
295
  <label
320
296
  key={b}
321
- style={{
322
- display: "flex",
323
- alignItems: "center",
324
- gap: 8,
325
- cursor: "pointer",
326
- fontFamily: theme.sans,
327
- fontSize: 13,
328
- color: targetBackend === b ? theme.text : theme.textMuted,
329
- }}
297
+ className={`flex items-center gap-2 cursor-pointer font-sans text-[13px] ${
298
+ targetBackend === b ? "text-bone" : "text-ash"
299
+ }`}
330
300
  >
331
301
  <input
332
302
  type="radio"
@@ -337,23 +307,23 @@ export function ResetScreen({ manifest, setView, reloadManifest }: ResetScreenPr
337
307
  setTargetKey("");
338
308
  }}
339
309
  data-testid={`reset-backend-radio-${b}`}
340
- style={{ accentColor: theme.accent }}
310
+ className="accent-gold-500"
341
311
  />
342
312
  {BACKEND_LABELS[b]}
343
313
  </label>
344
314
  ))}
345
315
  </div>
346
316
  {targetBackend !== "age" && (
347
- <div style={{ marginTop: 12 }}>
348
- <Label>Key Identifier</Label>
349
- <input
350
- type="text"
351
- value={targetKey}
352
- onChange={(e) => setTargetKey(e.target.value)}
353
- placeholder={KEY_PLACEHOLDERS[targetBackend]}
354
- data-testid="reset-backend-key-input"
355
- style={textInputStyle}
356
- />
317
+ <div className="mt-3">
318
+ <Field label="Key Identifier">
319
+ <Input
320
+ type="text"
321
+ value={targetKey}
322
+ onChange={(e) => setTargetKey(e.target.value)}
323
+ placeholder={KEY_PLACEHOLDERS[targetBackend]}
324
+ data-testid="reset-backend-key-input"
325
+ />
326
+ </Field>
357
327
  </div>
358
328
  )}
359
329
  </div>
@@ -361,65 +331,43 @@ export function ResetScreen({ manifest, setView, reloadManifest }: ResetScreenPr
361
331
  </div>
362
332
 
363
333
  {/* Optional explicit keys */}
364
- <div style={{ marginBottom: 20 }}>
334
+ <div className="mb-5">
365
335
  <Label>Explicit Keys (optional)</Label>
366
- <input
336
+ <Input
367
337
  type="text"
368
338
  value={explicitKeys}
369
339
  onChange={(e) => setExplicitKeys(e.target.value)}
370
340
  placeholder="DB_URL, DB_PASSWORD"
371
341
  data-testid="reset-keys-input"
372
- style={textInputStyle}
373
342
  />
374
- <div
375
- style={{
376
- fontFamily: theme.sans,
377
- fontSize: 11,
378
- color: theme.textMuted,
379
- marginTop: 6,
380
- }}
381
- >
343
+ <div className="font-sans text-[11px] text-ash mt-1.5">
382
344
  Comma-separated. Ignored when the namespace has a schema — schema keys are
383
345
  authoritative.
384
346
  </div>
385
347
  </div>
386
348
 
387
- <div
388
- style={{
389
- background: theme.redDim,
390
- border: `1px solid ${theme.red}44`,
391
- borderRadius: 8,
392
- padding: "14px 16px",
393
- marginBottom: 16,
394
- fontFamily: theme.sans,
395
- fontSize: 13,
396
- color: theme.red,
397
- lineHeight: 1.5,
398
- }}
399
- >
400
- {"\u26A0"} This will <strong>ABANDON</strong> the current encrypted contents of the
349
+ <div className="bg-stop-500/10 border border-stop-500/40 rounded-lg px-4 py-3.5 mb-4 font-sans text-[13px] text-stop-500 leading-relaxed">
350
+ {"⚠"} This will <strong>ABANDON</strong> the current encrypted contents of the
401
351
  affected cells. Decryption will <strong>NOT</strong> be attempted. This cannot be
402
352
  undone except via <code>git revert</code>.
403
353
  </div>
404
354
 
405
- <div style={{ marginBottom: 20 }}>
355
+ <div className="mb-5">
406
356
  <Label>
407
- Type <code style={{ color: theme.text }}>{scopeLabel || "<scope>"}</code> to
408
- confirm
357
+ Type <code className="text-bone">{scopeLabel || "<scope>"}</code> to confirm
409
358
  </Label>
410
- <input
359
+ <Input
411
360
  type="text"
412
361
  value={typedConfirm}
413
362
  onChange={(e) => setTypedConfirm(e.target.value)}
414
363
  placeholder={scopeLabel}
415
364
  data-testid="reset-confirm-input"
416
365
  disabled={!scope}
417
- style={textInputStyle}
418
366
  />
419
367
  </div>
420
368
 
421
369
  <Button
422
- variant="primary"
370
+ variant="danger"
423
371
  onClick={handleReset}
424
372
  disabled={!canSubmit}
425
373
  data-testid="reset-submit"
@@ -430,85 +378,22 @@ export function ResetScreen({ manifest, setView, reloadManifest }: ResetScreenPr
430
378
  )}
431
379
 
432
380
  {phase === "running" && (
433
- <div
434
- style={{
435
- display: "flex",
436
- flexDirection: "column",
437
- alignItems: "center",
438
- paddingTop: 40,
439
- }}
440
- data-testid="reset-running"
441
- >
442
- <div
443
- style={{
444
- width: 40,
445
- height: 40,
446
- border: `3px solid ${theme.border}`,
447
- borderTopColor: theme.accent,
448
- borderRadius: "50%",
449
- animation: "spin 1s linear infinite",
450
- marginBottom: 16,
451
- }}
452
- />
453
- <div
454
- style={{
455
- fontFamily: theme.sans,
456
- fontSize: 14,
457
- color: theme.textMuted,
458
- }}
459
- >
460
- Resetting {scopeLabel}...
461
- </div>
462
- <style>{`@keyframes spin { to { transform: rotate(360deg); } }`}</style>
381
+ <div className="flex flex-col items-center pt-10" data-testid="reset-running">
382
+ <div className="w-10 h-10 border-[3px] border-edge border-t-gold-500 rounded-full mb-4 animate-spin" />
383
+ <div className="font-sans text-[14px] text-ash">Resetting {scopeLabel}...</div>
463
384
  </div>
464
385
  )}
465
386
 
466
387
  {phase === "done" && result && (
467
388
  <div data-testid="reset-done">
468
- <div
469
- style={{
470
- display: "flex",
471
- flexDirection: "column",
472
- alignItems: "center",
473
- paddingTop: 20,
474
- paddingBottom: 24,
475
- }}
476
- >
477
- <div
478
- style={{
479
- width: 56,
480
- height: 56,
481
- borderRadius: "50%",
482
- background: theme.greenDim,
483
- border: `1px solid ${theme.green}44`,
484
- display: "flex",
485
- alignItems: "center",
486
- justifyContent: "center",
487
- fontSize: 24,
488
- color: theme.green,
489
- marginBottom: 16,
490
- }}
491
- >
492
- {"\u2713"}
389
+ <div className="flex flex-col items-center pt-5 pb-6">
390
+ <div className="w-14 h-14 rounded-full bg-go-500/15 border border-go-500/40 flex items-center justify-center text-[24px] text-go-500 mb-4">
391
+ {""}
493
392
  </div>
494
- <div
495
- style={{
496
- fontFamily: theme.sans,
497
- fontWeight: 600,
498
- fontSize: 16,
499
- color: theme.green,
500
- marginBottom: 8,
501
- }}
502
- >
393
+ <div className="font-sans font-semibold text-[16px] text-go-500 mb-2">
503
394
  Reset complete
504
395
  </div>
505
- <div
506
- style={{
507
- fontFamily: theme.mono,
508
- fontSize: 12,
509
- color: theme.textMuted,
510
- }}
511
- >
396
+ <div className="font-mono text-[12px] text-ash">
512
397
  {result.scaffoldedCells.length} cell
513
398
  {result.scaffoldedCells.length === 1 ? "" : "s"} scaffolded
514
399
  {pendingCount > 0
@@ -518,38 +403,19 @@ export function ResetScreen({ manifest, setView, reloadManifest }: ResetScreenPr
518
403
  </div>
519
404
 
520
405
  {result.backendChanged && (
521
- <div
522
- style={{
523
- background: theme.surface,
524
- border: `1px solid ${theme.border}`,
525
- borderRadius: 6,
526
- padding: "10px 14px",
527
- marginBottom: 16,
528
- fontFamily: theme.mono,
529
- fontSize: 11,
530
- color: theme.textMuted,
531
- }}
532
- >
406
+ <div className="bg-ink-850 border border-edge rounded-md px-3.5 py-2.5 mb-4 font-mono text-[11px] text-ash">
533
407
  Backend override written for: {result.affectedEnvironments.join(", ")}
534
408
  </div>
535
409
  )}
536
410
 
537
411
  {pendingCount > 0 && (
538
- <div
539
- style={{
540
- fontFamily: theme.sans,
541
- fontSize: 12,
542
- color: theme.textMuted,
543
- marginBottom: 16,
544
- lineHeight: 1.5,
545
- }}
546
- >
412
+ <div className="font-sans text-[12px] text-ash mb-4 leading-relaxed">
547
413
  Run <code>clef set</code> (or use the namespace editor) to replace placeholders
548
414
  with real values.
549
415
  </div>
550
416
  )}
551
417
 
552
- <div style={{ display: "flex", gap: 10 }}>
418
+ <div className="flex gap-2.5">
553
419
  <Button
554
420
  variant="primary"
555
421
  onClick={() => setView("matrix")}
@@ -571,44 +437,8 @@ export function ResetScreen({ manifest, setView, reloadManifest }: ResetScreenPr
571
437
 
572
438
  function Label({ children }: { children: React.ReactNode }) {
573
439
  return (
574
- <div
575
- style={{
576
- fontFamily: theme.sans,
577
- fontSize: 12,
578
- fontWeight: 600,
579
- color: theme.textMuted,
580
- marginBottom: 8,
581
- letterSpacing: "0.05em",
582
- textTransform: "uppercase",
583
- }}
584
- >
440
+ <div className="font-sans text-[12px] font-semibold text-ash mb-2 uppercase tracking-[0.05em]">
585
441
  {children}
586
442
  </div>
587
443
  );
588
444
  }
589
-
590
- const selectStyle: React.CSSProperties = {
591
- width: "100%",
592
- background: theme.surface,
593
- border: `1px solid ${theme.border}`,
594
- borderRadius: 6,
595
- padding: "7px 10px",
596
- fontFamily: theme.sans,
597
- fontSize: 13,
598
- color: theme.text,
599
- outline: "none",
600
- cursor: "pointer",
601
- };
602
-
603
- const textInputStyle: React.CSSProperties = {
604
- width: "100%",
605
- background: theme.surface,
606
- border: `1px solid ${theme.border}`,
607
- borderRadius: 6,
608
- padding: "8px 12px",
609
- fontFamily: theme.mono,
610
- fontSize: 12,
611
- color: theme.text,
612
- outline: "none",
613
- boxSizing: "border-box",
614
- };