@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.
- package/dist/client/assets/index-DPWHjBbB.js +34 -0
- package/dist/client/assets/index-qsLTYpc9.css +2 -0
- package/dist/client/clef.svg +2 -0
- package/dist/client/index.html +3 -31
- package/dist/client-lib/components/Button.d.ts +1 -1
- package/dist/client-lib/components/Button.d.ts.map +1 -1
- package/dist/client-lib/components/CopyButton.d.ts.map +1 -1
- package/dist/client-lib/components/EnvBadge.d.ts.map +1 -1
- package/dist/client-lib/components/MatrixGrid.d.ts.map +1 -1
- package/dist/client-lib/components/Sidebar.d.ts +1 -1
- package/dist/client-lib/components/Sidebar.d.ts.map +1 -1
- package/dist/client-lib/components/StatusDot.d.ts.map +1 -1
- package/dist/client-lib/components/SyncPanel.d.ts.map +1 -1
- package/dist/client-lib/components/TopBar.d.ts +6 -0
- package/dist/client-lib/components/TopBar.d.ts.map +1 -1
- package/dist/client-lib/primitives/Badge.d.ts +11 -0
- package/dist/client-lib/primitives/Badge.d.ts.map +1 -0
- package/dist/client-lib/primitives/Card.d.ts +28 -0
- package/dist/client-lib/primitives/Card.d.ts.map +1 -0
- package/dist/client-lib/primitives/Dialog.d.ts +30 -0
- package/dist/client-lib/primitives/Dialog.d.ts.map +1 -0
- package/dist/client-lib/primitives/EmptyState.d.ts +10 -0
- package/dist/client-lib/primitives/EmptyState.d.ts.map +1 -0
- package/dist/client-lib/primitives/Field.d.ts +36 -0
- package/dist/client-lib/primitives/Field.d.ts.map +1 -0
- package/dist/client-lib/primitives/Input.d.ts +6 -0
- package/dist/client-lib/primitives/Input.d.ts.map +1 -0
- package/dist/client-lib/primitives/Stat.d.ts +11 -0
- package/dist/client-lib/primitives/Stat.d.ts.map +1 -0
- package/dist/client-lib/primitives/Table.d.ts +37 -0
- package/dist/client-lib/primitives/Table.d.ts.map +1 -0
- package/dist/client-lib/primitives/Tabs.d.ts +29 -0
- package/dist/client-lib/primitives/Tabs.d.ts.map +1 -0
- package/dist/client-lib/primitives/Toast.d.ts +16 -0
- package/dist/client-lib/primitives/Toast.d.ts.map +1 -0
- package/dist/client-lib/primitives/Toolbar.d.ts +29 -0
- package/dist/client-lib/primitives/Toolbar.d.ts.map +1 -0
- package/dist/client-lib/primitives/index.d.ts +23 -0
- package/dist/client-lib/primitives/index.d.ts.map +1 -0
- package/dist/client-lib/theme.d.ts +18 -41
- package/dist/client-lib/theme.d.ts.map +1 -1
- package/dist/server/api.d.ts.map +1 -1
- package/dist/server/api.js +215 -0
- package/dist/server/api.js.map +1 -1
- package/dist/server/envelope.d.ts +15 -0
- package/dist/server/envelope.d.ts.map +1 -0
- package/dist/server/envelope.js +310 -0
- package/dist/server/envelope.js.map +1 -0
- package/package.json +7 -2
- package/src/client/App.tsx +16 -41
- package/src/client/components/Button.tsx +13 -22
- package/src/client/components/CopyButton.tsx +5 -12
- package/src/client/components/EnvBadge.tsx +30 -15
- package/src/client/components/MatrixGrid.tsx +108 -252
- package/src/client/components/Sidebar.tsx +123 -199
- package/src/client/components/StatusDot.tsx +10 -15
- package/src/client/components/SyncPanel.tsx +14 -62
- package/src/client/components/TopBar.tsx +11 -36
- package/src/client/index.html +1 -30
- package/src/client/main.tsx +1 -0
- package/src/client/primitives/Badge.test.tsx +47 -0
- package/src/client/primitives/Badge.tsx +64 -0
- package/src/client/primitives/Card.test.tsx +50 -0
- package/src/client/primitives/Card.tsx +85 -0
- package/src/client/primitives/Dialog.test.tsx +55 -0
- package/src/client/primitives/Dialog.tsx +96 -0
- package/src/client/primitives/EmptyState.test.tsx +25 -0
- package/src/client/primitives/EmptyState.tsx +38 -0
- package/src/client/primitives/Field.test.tsx +46 -0
- package/src/client/primitives/Field.tsx +95 -0
- package/src/client/primitives/Input.tsx +26 -0
- package/src/client/primitives/Stat.test.tsx +32 -0
- package/src/client/primitives/Stat.tsx +52 -0
- package/src/client/primitives/Table.test.tsx +58 -0
- package/src/client/primitives/Table.tsx +113 -0
- package/src/client/primitives/Tabs.test.tsx +44 -0
- package/src/client/primitives/Tabs.tsx +100 -0
- package/src/client/primitives/Toast.test.tsx +77 -0
- package/src/client/primitives/Toast.tsx +89 -0
- package/src/client/primitives/Toolbar.test.tsx +50 -0
- package/src/client/primitives/Toolbar.tsx +86 -0
- package/src/client/primitives/index.ts +43 -0
- package/src/client/public/clef.svg +2 -0
- package/src/client/screens/BackendScreen.tsx +104 -363
- package/src/client/screens/DiffView.tsx +187 -378
- package/src/client/screens/EnvelopeScreen.test.tsx +542 -0
- package/src/client/screens/EnvelopeScreen.tsx +948 -0
- package/src/client/screens/GitLogView.tsx +48 -106
- package/src/client/screens/ImportScreen.tsx +105 -308
- package/src/client/screens/LintView.tsx +184 -379
- package/src/client/screens/ManifestScreen.tsx +283 -445
- package/src/client/screens/MatrixView.tsx +75 -91
- package/src/client/screens/NamespaceEditor.tsx +234 -609
- package/src/client/screens/PolicyView.tsx +183 -453
- package/src/client/screens/RecipientsScreen.tsx +71 -350
- package/src/client/screens/ResetScreen.tsx +67 -237
- package/src/client/screens/ScanScreen.tsx +85 -249
- package/src/client/screens/SchemaEditor.test.tsx +237 -0
- package/src/client/screens/SchemaEditor.tsx +435 -0
- package/src/client/screens/ServiceIdentitiesScreen.tsx +251 -788
- package/src/client/styles.css +77 -0
- package/src/client/theme.ts +27 -48
- 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
|
|
155
|
-
<
|
|
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
|
|
158
|
-
<div
|
|
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
|
-
|
|
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
|
|
179
|
+
<div className="mb-5">
|
|
180
180
|
<Label>Scope</Label>
|
|
181
|
-
<div
|
|
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
|
-
|
|
186
|
-
|
|
187
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
293
|
+
<div className="flex flex-col gap-1.5">
|
|
318
294
|
{ALL_BACKENDS.map((b) => (
|
|
319
295
|
<label
|
|
320
296
|
key={b}
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
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
|
-
|
|
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
|
|
348
|
-
<
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
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
|
|
334
|
+
<div className="mb-5">
|
|
365
335
|
<Label>Explicit Keys (optional)</Label>
|
|
366
|
-
<
|
|
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
|
-
|
|
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
|
|
355
|
+
<div className="mb-5">
|
|
406
356
|
<Label>
|
|
407
|
-
Type <code
|
|
408
|
-
confirm
|
|
357
|
+
Type <code className="text-bone">{scopeLabel || "<scope>"}</code> to confirm
|
|
409
358
|
</Label>
|
|
410
|
-
<
|
|
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="
|
|
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
|
-
|
|
435
|
-
|
|
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
|
-
|
|
470
|
-
|
|
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
|
|
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
|
-
};
|