@tangle-network/sandbox-ui 0.6.1 → 0.8.4
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/auth.d.ts +10 -6
- package/dist/auth.js +3 -3
- package/dist/{chat-container-Cg-GwyiK.d.ts → chat-container-f4yEs6KN.d.ts} +9 -1
- package/dist/chat.d.ts +12 -2
- package/dist/chat.js +10 -10
- package/dist/{chunk-TSE423UF.js → chunk-2QZ6G7NM.js} +6 -6
- package/dist/{chunk-WBQ7VULC.js → chunk-34A66VBG.js} +7 -7
- package/dist/{chunk-JP725R4W.js → chunk-34I7UFSX.js} +2 -2
- package/dist/{chunk-YS66Q3RC.js → chunk-3CJ2SOEI.js} +2 -2
- package/dist/{chunk-CNWVHQFY.js → chunk-54SQQMMM.js} +6 -24
- package/dist/{chunk-DLCFZDGX.js → chunk-5UM2XMEJ.js} +39 -14
- package/dist/{chunk-YYGECNZZ.js → chunk-66EZOYZR.js} +3 -3
- package/dist/chunk-7U2Z23NE.js +49 -0
- package/dist/{chunk-RKXIRRKQ.js → chunk-BUOQTBTO.js} +70 -66
- package/dist/{chunk-DCPYTL4W.js → chunk-D4CZWJCD.js} +72 -148
- package/dist/{chunk-MXRQ4MJE.js → chunk-DXMIEK4K.js} +34 -23
- package/dist/{chunk-ZMWWE5RF.js → chunk-EXSOPXIY.js} +141 -123
- package/dist/{chunk-GW4GRAWJ.js → chunk-GSZA3TSY.js} +18 -12
- package/dist/{chunk-W4LM3QYZ.js → chunk-HB5Y37YU.js} +8 -8
- package/dist/{chunk-E2XT3G52.js → chunk-HFMAXUHV.js} +136 -137
- package/dist/{chunk-BRBTD7RH.js → chunk-MA7YKRUP.js} +28 -18
- package/dist/{chunk-MJUDMVRU.js → chunk-MT5FJ3ZT.js} +17 -17
- package/dist/chunk-OKLQVY3Y.js +139 -0
- package/dist/{chunk-KH5UDAJ2.js → chunk-QDH5GEGY.js} +58 -54
- package/dist/{chunk-33W2TLUL.js → chunk-QID2OOMG.js} +12 -3
- package/dist/{chunk-FJSVPBKY.js → chunk-S7OXQTST.js} +17 -3
- package/dist/chunk-T7HMZEVO.js +216 -0
- package/dist/{chunk-FNYJFCGU.js → chunk-U6QTHMY6.js} +145 -256
- package/dist/{chunk-565V6JTN.js → chunk-UXQMIR3D.js} +60 -99
- package/dist/{chunk-XTPAWK7L.js → chunk-VOUV7GGB.js} +25 -47
- package/dist/{chunk-OVNLOE3Y.js → chunk-WXK43R62.js} +41 -41
- package/dist/{chunk-6V4XVKFY.js → chunk-XXDFEF72.js} +340 -335
- package/dist/{chunk-TDYQBLL5.js → chunk-ZMNSRDMH.js} +6 -6
- package/dist/dashboard.d.ts +135 -3
- package/dist/dashboard.js +848 -8
- package/dist/{document-editor-pane-DWWUTTTZ.js → document-editor-pane-TLPVRBBU.js} +3 -3
- package/dist/editor.d.ts +9 -8
- package/dist/editor.js +3 -3
- package/dist/files.js +3 -3
- package/dist/globals.css +5304 -68
- package/dist/hooks.d.ts +1 -1
- package/dist/hooks.js +7 -7
- package/dist/index.d.ts +4 -4
- package/dist/index.js +28 -28
- package/dist/markdown.js +1 -1
- package/dist/openui.js +5 -5
- package/dist/pages.d.ts +47 -3
- package/dist/pages.js +911 -357
- package/dist/primitives.d.ts +5 -2
- package/dist/primitives.js +10 -10
- package/dist/run.js +4 -4
- package/dist/sdk-hooks.d.ts +2 -3
- package/dist/sdk-hooks.js +5 -5
- package/dist/styles.css +5304 -68
- package/dist/template-card-BAtvcAkU.d.ts +18 -0
- package/dist/terminal.d.ts +3 -1
- package/dist/terminal.js +66 -32
- package/dist/tokens.css +701 -40
- package/dist/{usage-chart-XCoB_7Xu.d.ts → usage-chart-SSiOgeQI.d.ts} +3 -1
- package/dist/{use-pty-session-COzVkhtc.d.ts → use-pty-session-0AOuwXgq.d.ts} +2 -0
- package/dist/{index-BT_-ecpc.d.ts → variant-list-C8wx2TqF.d.ts} +17 -8
- package/dist/workspace.d.ts +1 -1
- package/dist/workspace.js +13 -13
- package/package.json +3 -1
- package/tailwind.config.cjs +3 -2
- package/dist/chunk-3HW53XTH.js +0 -228
- package/dist/chunk-OKCIKTXQ.js +0 -63
|
@@ -7,27 +7,27 @@ import {
|
|
|
7
7
|
import {
|
|
8
8
|
EmptyState,
|
|
9
9
|
Input
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-MA7YKRUP.js";
|
|
11
11
|
import {
|
|
12
12
|
ChatContainer
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-BUOQTBTO.js";
|
|
14
14
|
import {
|
|
15
15
|
OpenUIArtifactRenderer
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-WXK43R62.js";
|
|
17
17
|
import {
|
|
18
18
|
FileArtifactPane,
|
|
19
19
|
FileTree,
|
|
20
20
|
filterFileTree
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-QDH5GEGY.js";
|
|
22
22
|
import {
|
|
23
23
|
ArtifactPane
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-HB5Y37YU.js";
|
|
25
25
|
import {
|
|
26
26
|
Markdown
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-T7HMZEVO.js";
|
|
28
28
|
import {
|
|
29
29
|
Badge
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-ZMNSRDMH.js";
|
|
31
31
|
import {
|
|
32
32
|
cn
|
|
33
33
|
} from "./chunk-RQHJBTEU.js";
|
|
@@ -108,12 +108,12 @@ function ResizeHandle({ label, onDragStart, onStep, className }) {
|
|
|
108
108
|
className: cn(
|
|
109
109
|
"relative hidden w-3 shrink-0 cursor-col-resize lg:flex",
|
|
110
110
|
"items-stretch justify-center bg-transparent touch-none",
|
|
111
|
-
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-
|
|
111
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/60",
|
|
112
112
|
className
|
|
113
113
|
),
|
|
114
114
|
children: [
|
|
115
|
-
/* @__PURE__ */ jsx("span", { className: "absolute inset-y-0 left-1/2 w-px -translate-x-1/2 bg-
|
|
116
|
-
/* @__PURE__ */ jsx("span", { className: "absolute inset-y-0 left-1/2 w-[3px] -translate-x-1/2 rounded-full bg-transparent hover:bg-
|
|
115
|
+
/* @__PURE__ */ jsx("span", { className: "absolute inset-y-0 left-1/2 w-px -translate-x-1/2 bg-border transition-colors" }),
|
|
116
|
+
/* @__PURE__ */ jsx("span", { className: "absolute inset-y-0 left-1/2 w-[3px] -translate-x-1/2 rounded-full bg-transparent hover:bg-primary/30 focus-visible:bg-primary/40" })
|
|
117
117
|
]
|
|
118
118
|
}
|
|
119
119
|
);
|
|
@@ -145,12 +145,12 @@ function HorizontalResizeHandle({ label, onDragStart, onStep, className }) {
|
|
|
145
145
|
className: cn(
|
|
146
146
|
"relative hidden h-3 shrink-0 cursor-row-resize lg:flex",
|
|
147
147
|
"items-center justify-center bg-transparent touch-none w-full",
|
|
148
|
-
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-
|
|
148
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/60",
|
|
149
149
|
className
|
|
150
150
|
),
|
|
151
151
|
children: [
|
|
152
|
-
/* @__PURE__ */ jsx("span", { className: "absolute inset-x-0 top-1/2 h-px -translate-y-1/2 bg-
|
|
153
|
-
/* @__PURE__ */ jsx("span", { className: "absolute inset-x-0 top-1/2 h-[3px] -translate-y-1/2 rounded-full bg-transparent hover:bg-
|
|
152
|
+
/* @__PURE__ */ jsx("span", { className: "absolute inset-x-0 top-1/2 h-px -translate-y-1/2 bg-border transition-colors" }),
|
|
153
|
+
/* @__PURE__ */ jsx("span", { className: "absolute inset-x-0 top-1/2 h-[3px] -translate-y-1/2 rounded-full bg-transparent hover:bg-primary/30 focus-visible:bg-primary/40" })
|
|
154
154
|
]
|
|
155
155
|
}
|
|
156
156
|
);
|
|
@@ -163,26 +163,26 @@ function MobileDrawer({ side, title, header, onClose, children }) {
|
|
|
163
163
|
type: "button",
|
|
164
164
|
"aria-label": `Close ${title}`,
|
|
165
165
|
onClick: onClose,
|
|
166
|
-
className: "absolute inset-0 bg-black/
|
|
166
|
+
className: "absolute inset-0 bg-black/80 backdrop-blur-sm"
|
|
167
167
|
}
|
|
168
168
|
),
|
|
169
169
|
/* @__PURE__ */ jsxs(
|
|
170
170
|
"aside",
|
|
171
171
|
{
|
|
172
172
|
className: cn(
|
|
173
|
-
"relative flex h-full w-[min(88vw,24rem)] flex-col border-
|
|
173
|
+
"relative flex h-full w-[min(88vw,24rem)] flex-col border-border bg-background shadow-[var(--shadow-dropdown)]",
|
|
174
174
|
side === "left" ? "border-r" : "ml-auto border-l"
|
|
175
175
|
),
|
|
176
176
|
children: [
|
|
177
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3 border-b border-
|
|
178
|
-
/* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1", children: header ?? /* @__PURE__ */ jsx("span", { className: "text-
|
|
177
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-3 border-b border-border px-3 py-2", children: [
|
|
178
|
+
/* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1", children: header ?? /* @__PURE__ */ jsx("span", { className: "text-[13px] font-medium text-foreground", children: title }) }),
|
|
179
179
|
/* @__PURE__ */ jsx(
|
|
180
180
|
"button",
|
|
181
181
|
{
|
|
182
182
|
type: "button",
|
|
183
183
|
"aria-label": `Close ${title}`,
|
|
184
184
|
onClick: onClose,
|
|
185
|
-
className: "rounded-[
|
|
185
|
+
className: "rounded-[2px] p-1 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary/60",
|
|
186
186
|
children: /* @__PURE__ */ jsx(X, { className: "h-4 w-4" })
|
|
187
187
|
}
|
|
188
188
|
)
|
|
@@ -217,7 +217,7 @@ function WorkspaceLayout({
|
|
|
217
217
|
maxBottomHeight = 500,
|
|
218
218
|
persistenceKey,
|
|
219
219
|
resizable = true,
|
|
220
|
-
theme
|
|
220
|
+
theme,
|
|
221
221
|
density = "comfortable",
|
|
222
222
|
leftLabel = "Left workspace panel",
|
|
223
223
|
rightLabel = "Right workspace panel",
|
|
@@ -314,11 +314,10 @@ function WorkspaceLayout({
|
|
|
314
314
|
return /* @__PURE__ */ jsxs(
|
|
315
315
|
"div",
|
|
316
316
|
{
|
|
317
|
-
"data-sandbox-ui": "true",
|
|
318
|
-
"data-sandbox-theme": theme,
|
|
317
|
+
...theme ? { "data-sandbox-ui": "true", "data-sandbox-theme": theme } : {},
|
|
319
318
|
"data-density": density,
|
|
320
319
|
className: cn(
|
|
321
|
-
"flex h-screen flex-col overflow-hidden bg-[var(--bg-root)] text-
|
|
320
|
+
"flex h-screen flex-col overflow-hidden bg-[var(--bg-root)] text-foreground font-sans",
|
|
322
321
|
className
|
|
323
322
|
),
|
|
324
323
|
children: [
|
|
@@ -329,9 +328,9 @@ function WorkspaceLayout({
|
|
|
329
328
|
{
|
|
330
329
|
"aria-label": leftLabel,
|
|
331
330
|
style: leftStyle,
|
|
332
|
-
className: "hidden shrink-0 border-r border-
|
|
331
|
+
className: "hidden shrink-0 border-r border-border bg-background lg:flex lg:flex-col",
|
|
333
332
|
children: [
|
|
334
|
-
leftHeader && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2 border-b border-
|
|
333
|
+
leftHeader && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2 border-b border-border px-3 py-1.5 bg-muted/20", children: [
|
|
335
334
|
/* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1", children: leftHeader }),
|
|
336
335
|
/* @__PURE__ */ jsx(
|
|
337
336
|
"button",
|
|
@@ -339,7 +338,7 @@ function WorkspaceLayout({
|
|
|
339
338
|
type: "button",
|
|
340
339
|
"aria-label": "Collapse left panel",
|
|
341
340
|
onClick: () => setLeftOpen(false),
|
|
342
|
-
className: "rounded-[
|
|
341
|
+
className: "rounded-[2px] p-1 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary/60",
|
|
343
342
|
children: /* @__PURE__ */ jsx(PanelLeftClose, { className: "h-4 w-4" })
|
|
344
343
|
}
|
|
345
344
|
)
|
|
@@ -358,14 +357,14 @@ function WorkspaceLayout({
|
|
|
358
357
|
)
|
|
359
358
|
] }),
|
|
360
359
|
/* @__PURE__ */ jsxs("main", { className: "flex min-w-0 flex-1 flex-col", children: [
|
|
361
|
-
(centerHeader || left || right || bottom) && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 border-b border-
|
|
360
|
+
(centerHeader || left || right || bottom) && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 border-b border-border bg-muted/20 px-3 py-1.5", children: [
|
|
362
361
|
left && !leftOpen && /* @__PURE__ */ jsx(
|
|
363
362
|
"button",
|
|
364
363
|
{
|
|
365
364
|
type: "button",
|
|
366
365
|
"aria-label": "Open left panel",
|
|
367
366
|
onClick: () => setLeftOpen(true),
|
|
368
|
-
className: "rounded-[
|
|
367
|
+
className: "rounded-[2px] p-1 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary/60",
|
|
369
368
|
children: /* @__PURE__ */ jsx(PanelLeftOpen, { className: "h-4 w-4" })
|
|
370
369
|
}
|
|
371
370
|
),
|
|
@@ -376,7 +375,7 @@ function WorkspaceLayout({
|
|
|
376
375
|
type: "button",
|
|
377
376
|
"aria-label": "Open bottom panel",
|
|
378
377
|
onClick: () => setBottomOpen(true),
|
|
379
|
-
className: "rounded-[
|
|
378
|
+
className: "rounded-[2px] p-1 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary/60",
|
|
380
379
|
children: /* @__PURE__ */ jsx(PanelBottomOpen, { className: "h-4 w-4" })
|
|
381
380
|
}
|
|
382
381
|
),
|
|
@@ -386,7 +385,7 @@ function WorkspaceLayout({
|
|
|
386
385
|
type: "button",
|
|
387
386
|
"aria-label": "Open right panel",
|
|
388
387
|
onClick: () => setRightOpen(true),
|
|
389
|
-
className: "rounded-[
|
|
388
|
+
className: "rounded-[2px] p-1 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary/60",
|
|
390
389
|
children: /* @__PURE__ */ jsx(PanelRightOpen, { className: "h-4 w-4" })
|
|
391
390
|
}
|
|
392
391
|
)
|
|
@@ -405,18 +404,18 @@ function WorkspaceLayout({
|
|
|
405
404
|
"section",
|
|
406
405
|
{
|
|
407
406
|
"aria-label": bottomLabel,
|
|
408
|
-
className: "border-t border-
|
|
407
|
+
className: "border-t border-border bg-card shrink-0",
|
|
409
408
|
style: { height: `${bottomHeight}px` },
|
|
410
409
|
children: /* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col", children: [
|
|
411
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2 border-b border-
|
|
412
|
-
/* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1", children: bottomHeader ?? /* @__PURE__ */ jsx("span", { className: "text-
|
|
410
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2 border-b border-border px-3 py-1.5 bg-muted/20 shrink-0", children: [
|
|
411
|
+
/* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1", children: bottomHeader ?? /* @__PURE__ */ jsx("span", { className: "text-[11px] font-semibold uppercase tracking-wider text-muted-foreground", children: "Runtime" }) }),
|
|
413
412
|
/* @__PURE__ */ jsx(
|
|
414
413
|
"button",
|
|
415
414
|
{
|
|
416
415
|
type: "button",
|
|
417
416
|
"aria-label": "Collapse bottom panel",
|
|
418
417
|
onClick: () => setBottomOpen(false),
|
|
419
|
-
className: "rounded-[
|
|
418
|
+
className: "rounded-[2px] p-1 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary/60",
|
|
420
419
|
children: /* @__PURE__ */ jsx(PanelBottomClose, { className: "h-4 w-4" })
|
|
421
420
|
}
|
|
422
421
|
)
|
|
@@ -426,7 +425,7 @@ function WorkspaceLayout({
|
|
|
426
425
|
}
|
|
427
426
|
)
|
|
428
427
|
] }),
|
|
429
|
-
centerFooter && /* @__PURE__ */ jsx("div", { className: "shrink-0 border-t border-
|
|
428
|
+
centerFooter && /* @__PURE__ */ jsx("div", { className: "shrink-0 border-t border-border bg-background", children: centerFooter })
|
|
430
429
|
] }),
|
|
431
430
|
desktop && right && rightOpen && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
432
431
|
resizable && /* @__PURE__ */ jsx(
|
|
@@ -442,17 +441,17 @@ function WorkspaceLayout({
|
|
|
442
441
|
{
|
|
443
442
|
"aria-label": rightLabel,
|
|
444
443
|
style: rightStyle,
|
|
445
|
-
className: "hidden shrink-0 border-l border-
|
|
444
|
+
className: "hidden shrink-0 border-l border-border bg-background lg:flex lg:flex-col",
|
|
446
445
|
children: [
|
|
447
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2 border-b border-
|
|
448
|
-
/* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1", children: rightHeader ?? /* @__PURE__ */ jsx("span", { className: "text-
|
|
446
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2 border-b border-border px-3 py-1.5 bg-muted/20", children: [
|
|
447
|
+
/* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1", children: rightHeader ?? /* @__PURE__ */ jsx("span", { className: "text-[13px] font-medium text-foreground", children: "Artifacts" }) }),
|
|
449
448
|
/* @__PURE__ */ jsx(
|
|
450
449
|
"button",
|
|
451
450
|
{
|
|
452
451
|
type: "button",
|
|
453
452
|
"aria-label": "Collapse right panel",
|
|
454
453
|
onClick: () => setRightOpen(false),
|
|
455
|
-
className: "rounded-[
|
|
454
|
+
className: "rounded-[2px] p-1 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary/60",
|
|
456
455
|
children: /* @__PURE__ */ jsx(PanelRightClose, { className: "h-4 w-4" })
|
|
457
456
|
}
|
|
458
457
|
)
|
|
@@ -557,7 +556,7 @@ function DirectoryPane({
|
|
|
557
556
|
value: query,
|
|
558
557
|
onChange: (event) => setQuery(event.target.value),
|
|
559
558
|
placeholder: searchPlaceholder,
|
|
560
|
-
className: "h-
|
|
559
|
+
className: "h-7 text-xs rounded-[2px]"
|
|
561
560
|
}
|
|
562
561
|
) }),
|
|
563
562
|
onRefresh && /* @__PURE__ */ jsx2(
|
|
@@ -566,7 +565,7 @@ function DirectoryPane({
|
|
|
566
565
|
type: "button",
|
|
567
566
|
"aria-label": "Refresh directory",
|
|
568
567
|
onClick: onRefresh,
|
|
569
|
-
className: "rounded-[
|
|
568
|
+
className: "rounded-[2px] p-1.5 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary/60",
|
|
570
569
|
children: /* @__PURE__ */ jsx2(RefreshCw, { className: "h-4 w-4" })
|
|
571
570
|
}
|
|
572
571
|
),
|
|
@@ -576,12 +575,12 @@ function DirectoryPane({
|
|
|
576
575
|
type: "button",
|
|
577
576
|
"aria-label": "Upload files",
|
|
578
577
|
onClick: onUpload,
|
|
579
|
-
className: "rounded-[
|
|
578
|
+
className: "rounded-[2px] p-1.5 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary/60",
|
|
580
579
|
children: /* @__PURE__ */ jsx2(Upload, { className: "h-4 w-4" })
|
|
581
580
|
}
|
|
582
581
|
)
|
|
583
582
|
] }),
|
|
584
|
-
footer: /* @__PURE__ */ jsxs2("div", { className: "flex items-center justify-between text-xs text-
|
|
583
|
+
footer: /* @__PURE__ */ jsxs2("div", { className: "flex items-center justify-between text-xs text-muted-foreground", children: [
|
|
585
584
|
/* @__PURE__ */ jsxs2("span", { children: [
|
|
586
585
|
counts.files,
|
|
587
586
|
" files"
|
|
@@ -599,7 +598,7 @@ function DirectoryPane({
|
|
|
599
598
|
description: "Try a different search or clear the current filter."
|
|
600
599
|
}
|
|
601
600
|
),
|
|
602
|
-
children: filteredRoot ? /* @__PURE__ */ jsx2("div", { className: "
|
|
601
|
+
children: filteredRoot ? /* @__PURE__ */ jsx2("div", { className: "py-2", children: /* @__PURE__ */ jsx2(
|
|
603
602
|
FileTree,
|
|
604
603
|
{
|
|
605
604
|
root: filteredRoot,
|
|
@@ -617,11 +616,11 @@ function DirectoryPane({
|
|
|
617
616
|
import { Loader2, AlertCircle, CheckCircle, Wifi } from "lucide-react";
|
|
618
617
|
import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
619
618
|
var BANNER_STYLES = {
|
|
620
|
-
provisioning: { bg: "bg-
|
|
619
|
+
provisioning: { bg: "bg-primary/5", border: "border-primary/20", icon: Loader2 },
|
|
621
620
|
connecting: { bg: "bg-[var(--code-number)]/5", border: "border-[var(--code-number)]/20", icon: Wifi },
|
|
622
621
|
error: { bg: "bg-[var(--code-error)]/5", border: "border-[var(--code-error)]/20", icon: AlertCircle },
|
|
623
622
|
success: { bg: "bg-[var(--code-success)]/5", border: "border-[var(--code-success)]/20", icon: CheckCircle },
|
|
624
|
-
info: { bg: "bg-
|
|
623
|
+
info: { bg: "bg-muted/50", border: "border-border", icon: AlertCircle }
|
|
625
624
|
};
|
|
626
625
|
function StatusBanner({ type, message, detail, onDismiss, className }) {
|
|
627
626
|
const style = BANNER_STYLES[type];
|
|
@@ -629,9 +628,9 @@ function StatusBanner({ type, message, detail, onDismiss, className }) {
|
|
|
629
628
|
const isAnimated = type === "provisioning" || type === "connecting";
|
|
630
629
|
return /* @__PURE__ */ jsxs3("div", { className: cn("flex items-center gap-3 px-4 py-2 border-b text-sm", style.bg, style.border, className), children: [
|
|
631
630
|
/* @__PURE__ */ jsx3(Icon, { className: cn("h-4 w-4 shrink-0", isAnimated && "animate-spin") }),
|
|
632
|
-
/* @__PURE__ */ jsx3("span", { className: "text-
|
|
633
|
-
detail && /* @__PURE__ */ jsx3("span", { className: "text-
|
|
634
|
-
onDismiss && /* @__PURE__ */ jsx3("button", { onClick: onDismiss, className: "ml-auto text-
|
|
631
|
+
/* @__PURE__ */ jsx3("span", { className: "text-foreground", children: message }),
|
|
632
|
+
detail && /* @__PURE__ */ jsx3("span", { className: "text-muted-foreground text-xs", children: detail }),
|
|
633
|
+
onDismiss && /* @__PURE__ */ jsx3("button", { onClick: onDismiss, className: "ml-auto text-muted-foreground hover:text-foreground text-xs", children: "Dismiss" })
|
|
635
634
|
] });
|
|
636
635
|
}
|
|
637
636
|
|
|
@@ -658,7 +657,7 @@ function StatusBar({
|
|
|
658
657
|
"div",
|
|
659
658
|
{
|
|
660
659
|
className: cn(
|
|
661
|
-
"flex items-center gap-3 px-
|
|
660
|
+
"flex items-center gap-3 px-3 py-1 border-t border-border bg-muted/20 text-[12px]",
|
|
662
661
|
className
|
|
663
662
|
),
|
|
664
663
|
children: [
|
|
@@ -666,27 +665,27 @@ function StatusBar({
|
|
|
666
665
|
"button",
|
|
667
666
|
{
|
|
668
667
|
onClick: onModelClick,
|
|
669
|
-
className: "inline-flex items-center gap-1.5 px-2 py-0.5 rounded-[
|
|
668
|
+
className: "inline-flex items-center gap-1.5 px-2 py-0.5 rounded-[2px] border border-border text-muted-foreground hover:border-primary/20 hover:text-foreground transition-colors",
|
|
670
669
|
children: [
|
|
671
670
|
/* @__PURE__ */ jsx4("span", { className: cn("w-1.5 h-1.5 rounded-full", statusInfo.color) }),
|
|
672
671
|
modelLabel
|
|
673
672
|
]
|
|
674
673
|
}
|
|
675
674
|
),
|
|
676
|
-
statusInfo.label && /* @__PURE__ */ jsx4("span", { className: "text-
|
|
675
|
+
statusInfo.label && /* @__PURE__ */ jsx4("span", { className: "text-muted-foreground", children: statusInfo.label }),
|
|
677
676
|
contextBadges.map((badge) => /* @__PURE__ */ jsxs4(
|
|
678
677
|
"span",
|
|
679
678
|
{
|
|
680
|
-
className: "inline-flex items-center gap-1 px-2 py-0.5 rounded-[
|
|
679
|
+
className: "inline-flex items-center gap-1 px-2 py-0.5 rounded-[2px] border border-border text-foreground bg-[var(--border-accent)]/5",
|
|
681
680
|
children: [
|
|
682
681
|
/* @__PURE__ */ jsx4(FileText, { className: "h-3 w-3" }),
|
|
683
682
|
badge.label,
|
|
684
|
-
badge.count !== void 0 && /* @__PURE__ */ jsx4("span", { className: "text-
|
|
683
|
+
badge.count !== void 0 && /* @__PURE__ */ jsx4("span", { className: "text-muted-foreground", children: badge.count }),
|
|
685
684
|
onRemoveBadge && /* @__PURE__ */ jsx4(
|
|
686
685
|
"button",
|
|
687
686
|
{
|
|
688
687
|
onClick: () => onRemoveBadge(badge.id),
|
|
689
|
-
className: "hover:text-
|
|
688
|
+
className: "hover:text-foreground transition-colors",
|
|
690
689
|
children: /* @__PURE__ */ jsx4(X2, { className: "h-2.5 w-2.5" })
|
|
691
690
|
}
|
|
692
691
|
)
|
|
@@ -695,7 +694,7 @@ function StatusBar({
|
|
|
695
694
|
badge.id
|
|
696
695
|
)),
|
|
697
696
|
/* @__PURE__ */ jsx4("div", { className: "flex-1" }),
|
|
698
|
-
credits !== void 0 && /* @__PURE__ */ jsxs4("span", { className: "inline-flex items-center gap-1 text-
|
|
697
|
+
credits !== void 0 && /* @__PURE__ */ jsxs4("span", { className: "inline-flex items-center gap-1 text-muted-foreground", children: [
|
|
699
698
|
/* @__PURE__ */ jsx4(Zap, { className: "h-3 w-3" }),
|
|
700
699
|
credits.toLocaleString(),
|
|
701
700
|
" credits"
|
|
@@ -711,9 +710,9 @@ import { Terminal as TerminalIcon, ChevronDown, ChevronUp, X as X3 } from "lucid
|
|
|
711
710
|
import { jsx as jsx5, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
712
711
|
var LINE_COLORS = {
|
|
713
712
|
command: "text-[var(--code-function)]",
|
|
714
|
-
stdout: "text-
|
|
713
|
+
stdout: "text-foreground",
|
|
715
714
|
stderr: "text-[var(--code-error)]",
|
|
716
|
-
system: "text-
|
|
715
|
+
system: "text-muted-foreground"
|
|
717
716
|
};
|
|
718
717
|
var LINE_PREFIXES = {
|
|
719
718
|
command: "$ ",
|
|
@@ -736,18 +735,18 @@ function TerminalPanel({
|
|
|
736
735
|
scrollRef.current.scrollTop = scrollRef.current.scrollHeight;
|
|
737
736
|
}
|
|
738
737
|
}, [lines, isCollapsed]);
|
|
739
|
-
return /* @__PURE__ */ jsxs5("div", { className: cn("border-t border-
|
|
738
|
+
return /* @__PURE__ */ jsxs5("div", { className: cn("border-t border-border bg-card", className), children: [
|
|
740
739
|
/* @__PURE__ */ jsxs5(
|
|
741
740
|
"button",
|
|
742
741
|
{
|
|
743
742
|
onClick: onToggle,
|
|
744
|
-
className: "flex items-center gap-2 w-full px-3 py-1.5 text-xs text-
|
|
743
|
+
className: "flex items-center gap-2 w-full px-3 py-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors",
|
|
745
744
|
children: [
|
|
746
745
|
/* @__PURE__ */ jsx5(TerminalIcon, { className: "h-3.5 w-3.5" }),
|
|
747
746
|
/* @__PURE__ */ jsx5("span", { className: "font-medium", children: title }),
|
|
748
|
-
lines.length > 0 && /* @__PURE__ */ jsx5("span", { className: "px-1.5 py-0.5 rounded-
|
|
747
|
+
lines.length > 0 && /* @__PURE__ */ jsx5("span", { className: "px-1.5 py-0.5 rounded-full bg-muted text-[10px] tabular-nums", children: lines.length }),
|
|
749
748
|
/* @__PURE__ */ jsx5("div", { className: "flex-1" }),
|
|
750
|
-
onClose && /* @__PURE__ */ jsx5(X3, { className: "h-3 w-3 hover:text-
|
|
749
|
+
onClose && /* @__PURE__ */ jsx5(X3, { className: "h-3 w-3 hover:text-foreground", onClick: (e) => {
|
|
751
750
|
e.stopPropagation();
|
|
752
751
|
onClose();
|
|
753
752
|
} }),
|
|
@@ -759,14 +758,14 @@ function TerminalPanel({
|
|
|
759
758
|
"div",
|
|
760
759
|
{
|
|
761
760
|
ref: scrollRef,
|
|
762
|
-
className: "overflow-auto px-3 pb-2 font-
|
|
761
|
+
className: "overflow-auto px-3 pb-2 font-mono text-xs leading-[1.6]",
|
|
763
762
|
style: { maxHeight },
|
|
764
763
|
children: [
|
|
765
764
|
lines.map((line) => /* @__PURE__ */ jsxs5("div", { className: cn("whitespace-pre-wrap", LINE_COLORS[line.type]), children: [
|
|
766
|
-
/* @__PURE__ */ jsx5("span", { className: "text-
|
|
765
|
+
/* @__PURE__ */ jsx5("span", { className: "text-muted-foreground select-none", children: LINE_PREFIXES[line.type] }),
|
|
767
766
|
line.text
|
|
768
767
|
] }, line.id)),
|
|
769
|
-
lines.length === 0 && /* @__PURE__ */ jsx5("div", { className: "text-
|
|
768
|
+
lines.length === 0 && /* @__PURE__ */ jsx5("div", { className: "text-muted-foreground py-2", children: "No output yet" })
|
|
770
769
|
]
|
|
771
770
|
}
|
|
772
771
|
)
|
|
@@ -792,47 +791,47 @@ function RuntimePane({
|
|
|
792
791
|
"section",
|
|
793
792
|
{
|
|
794
793
|
className: cn(
|
|
795
|
-
"flex h-full min-h-0 flex-col overflow-hidden bg-
|
|
794
|
+
"flex h-full min-h-0 flex-col overflow-hidden bg-background text-foreground",
|
|
796
795
|
className
|
|
797
796
|
),
|
|
798
797
|
children: [
|
|
799
|
-
/* @__PURE__ */ jsxs6("header", { className: "border-b border-
|
|
800
|
-
/* @__PURE__ */ jsx6("div", { className: "mb-1 text-[10px] font-semibold uppercase tracking-[0.16em] text-
|
|
801
|
-
/* @__PURE__ */ jsx6("div", { className: "text-sm font-semibold text-
|
|
802
|
-
/* @__PURE__ */ jsx6("div", { className: "mt-1 text-xs text-
|
|
798
|
+
/* @__PURE__ */ jsxs6("header", { className: "border-b border-border bg-[linear-gradient(180deg,rgba(255,255,255,0.03),transparent)] px-4 py-3", children: [
|
|
799
|
+
/* @__PURE__ */ jsx6("div", { className: "mb-1 text-[10px] font-semibold uppercase tracking-[0.16em] text-muted-foreground", children: "Sandbox" }),
|
|
800
|
+
/* @__PURE__ */ jsx6("div", { className: "text-sm font-semibold text-foreground", children: title }),
|
|
801
|
+
/* @__PURE__ */ jsx6("div", { className: "mt-1 text-xs text-muted-foreground", children: subtitle })
|
|
803
802
|
] }),
|
|
804
803
|
statusBanner && /* @__PURE__ */ jsx6(StatusBanner, { ...statusBanner }),
|
|
805
804
|
statusBar && /* @__PURE__ */ jsx6(StatusBar, { ...statusBar }),
|
|
806
|
-
content ? /* @__PURE__ */ jsx6("div", { className: "min-h-0 flex-1 overflow-hidden", children: content }) : /* @__PURE__ */ jsxs6("div", { className: "grid min-h-0 flex-1 gap-px bg-
|
|
807
|
-
/* @__PURE__ */ jsx6("div", { className: "min-h-0 overflow-auto bg-
|
|
805
|
+
content ? /* @__PURE__ */ jsx6("div", { className: "min-h-0 flex-1 overflow-hidden", children: content }) : /* @__PURE__ */ jsxs6("div", { className: "grid min-h-0 flex-1 gap-px bg-border lg:grid-cols-[minmax(0,1.35fr)_minmax(20rem,0.9fr)]", children: [
|
|
806
|
+
/* @__PURE__ */ jsx6("div", { className: "min-h-0 overflow-auto bg-card", children: terminal ? /* @__PURE__ */ jsx6(
|
|
808
807
|
TerminalPanel,
|
|
809
808
|
{
|
|
810
809
|
...terminal,
|
|
811
810
|
className: cn("border-t-0 bg-transparent", terminal.className)
|
|
812
811
|
}
|
|
813
|
-
) : /* @__PURE__ */ jsx6("div", { className: "flex h-full items-center justify-center p-6 text-sm text-
|
|
812
|
+
) : /* @__PURE__ */ jsx6("div", { className: "flex h-full items-center justify-center p-6 text-sm text-muted-foreground", children: /* @__PURE__ */ jsxs6("div", { className: "flex items-center gap-2", children: [
|
|
814
813
|
/* @__PURE__ */ jsx6(TerminalSquare, { className: "h-4 w-4" }),
|
|
815
814
|
"No terminal activity yet"
|
|
816
815
|
] }) }) }),
|
|
817
|
-
/* @__PURE__ */ jsxs6("div", { className: "grid min-h-0 gap-px bg-
|
|
818
|
-
/* @__PURE__ */ jsx6("div", { className: "min-h-0 overflow-auto bg-
|
|
816
|
+
/* @__PURE__ */ jsxs6("div", { className: "grid min-h-0 gap-px bg-border", children: [
|
|
817
|
+
/* @__PURE__ */ jsx6("div", { className: "min-h-0 overflow-auto bg-card", children: audit ? audit : /* @__PURE__ */ jsx6("div", { className: "flex h-full items-center justify-center p-6 text-sm text-muted-foreground", children: /* @__PURE__ */ jsxs6("div", { className: "flex items-center gap-2", children: [
|
|
819
818
|
/* @__PURE__ */ jsx6(ShieldCheck, { className: "h-4 w-4" }),
|
|
820
819
|
"No audit data available"
|
|
821
820
|
] }) }) }),
|
|
822
|
-
/* @__PURE__ */ jsx6("div", { className: "min-h-0 overflow-auto bg-
|
|
821
|
+
/* @__PURE__ */ jsx6("div", { className: "min-h-0 overflow-auto bg-card", children: inspector ? inspector : /* @__PURE__ */ jsx6("div", { className: "flex h-full items-center justify-center p-6 text-sm text-muted-foreground", children: /* @__PURE__ */ jsxs6("div", { className: "flex items-center gap-2", children: [
|
|
823
822
|
/* @__PURE__ */ jsx6(Binary, { className: "h-4 w-4" }),
|
|
824
823
|
"No runtime inspector attached"
|
|
825
824
|
] }) }) })
|
|
826
825
|
] })
|
|
827
826
|
] }),
|
|
828
|
-
footer && /* @__PURE__ */ jsx6("footer", { className: "shrink-0 border-t border-
|
|
827
|
+
footer && /* @__PURE__ */ jsx6("footer", { className: "shrink-0 border-t border-border bg-card px-3 py-2", children: footer })
|
|
829
828
|
]
|
|
830
829
|
}
|
|
831
830
|
);
|
|
832
831
|
}
|
|
833
832
|
|
|
834
833
|
// src/workspace/session-sidebar.tsx
|
|
835
|
-
import { useCallback, useMemo as useMemo3, useRef as useRef3, useState as
|
|
834
|
+
import { useCallback, useMemo as useMemo3, useRef as useRef3, useState as useState3 } from "react";
|
|
836
835
|
import { ArrowLeft, FolderTree, MessageSquareText, Plus, Search as Search2, Settings, Sparkles } from "lucide-react";
|
|
837
836
|
import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
838
837
|
function statusDot(status) {
|
|
@@ -890,13 +889,13 @@ function sortItems(items, sessionStatusById) {
|
|
|
890
889
|
function badgeTone(tone = "neutral") {
|
|
891
890
|
switch (tone) {
|
|
892
891
|
case "accent":
|
|
893
|
-
return "border-
|
|
892
|
+
return "border-[var(--border-accent)] bg-[var(--accent-surface-soft)] text-primary";
|
|
894
893
|
case "success":
|
|
895
|
-
return "border-success
|
|
894
|
+
return "border-[var(--surface-success-border)] bg-[var(--surface-success-bg)] text-[var(--surface-success-text)]";
|
|
896
895
|
case "warning":
|
|
897
|
-
return "border-warning
|
|
896
|
+
return "border-[var(--surface-warning-border)] bg-[var(--surface-warning-bg)] text-[var(--surface-warning-text)]";
|
|
898
897
|
case "danger":
|
|
899
|
-
return "border-
|
|
898
|
+
return "border-[var(--surface-danger-border)] bg-[var(--surface-danger-bg)] text-[var(--surface-danger-text)]";
|
|
900
899
|
default:
|
|
901
900
|
return "border-border bg-muted text-muted-foreground";
|
|
902
901
|
}
|
|
@@ -906,7 +905,7 @@ function navigateToHref(href) {
|
|
|
906
905
|
window.location.assign(href);
|
|
907
906
|
}
|
|
908
907
|
function useResizable(defaultWidth, min, max, onChange) {
|
|
909
|
-
const [width, setWidth] =
|
|
908
|
+
const [width, setWidth] = useState3(defaultWidth);
|
|
910
909
|
const dragging = useRef3(false);
|
|
911
910
|
const startX = useRef3(0);
|
|
912
911
|
const startW = useRef3(0);
|
|
@@ -953,8 +952,8 @@ function SessionSidebar({
|
|
|
953
952
|
onWidthChange,
|
|
954
953
|
renderItemActions
|
|
955
954
|
}) {
|
|
956
|
-
const [query, setQuery] =
|
|
957
|
-
const [activeFilterId, setActiveFilterId] =
|
|
955
|
+
const [query, setQuery] = useState3("");
|
|
956
|
+
const [activeFilterId, setActiveFilterId] = useState3(defaultFilterId ?? filters[0]?.id ?? "all");
|
|
958
957
|
const activeSessions = useNavbarSessions(projectId);
|
|
959
958
|
const sessionsById = useMemo3(
|
|
960
959
|
() => new Map(activeSessions.map((session) => [session.sessionId, session])),
|
|
@@ -996,21 +995,21 @@ function SessionSidebar({
|
|
|
996
995
|
/* @__PURE__ */ jsxs7("div", { className: "border-b border-border px-3 py-2.5", children: [
|
|
997
996
|
/* @__PURE__ */ jsxs7("div", { className: "flex items-center justify-between gap-2", children: [
|
|
998
997
|
/* @__PURE__ */ jsxs7("div", { className: "flex items-center gap-2 min-w-0", children: [
|
|
999
|
-
/* @__PURE__ */ jsx7("div", { className: "flex h-6 w-6 shrink-0 items-center justify-center rounded-
|
|
998
|
+
/* @__PURE__ */ jsx7("div", { className: "flex h-6 w-6 shrink-0 items-center justify-center rounded-[var(--radius-sm)] border border-[var(--border-accent)] bg-[var(--accent-surface-soft)] text-primary", children: /* @__PURE__ */ jsx7(MessageSquareText, { className: "h-3 w-3" }) }),
|
|
1000
999
|
/* @__PURE__ */ jsxs7("div", { className: "min-w-0", children: [
|
|
1001
1000
|
/* @__PURE__ */ jsx7("div", { className: "truncate text-xs font-semibold text-foreground", children: title }),
|
|
1002
1001
|
subtitle && /* @__PURE__ */ jsx7("div", { className: "truncate text-[10px] text-muted-foreground", children: subtitle })
|
|
1003
1002
|
] })
|
|
1004
1003
|
] }),
|
|
1005
1004
|
/* @__PURE__ */ jsxs7("div", { className: "flex items-center gap-1.5 shrink-0", children: [
|
|
1006
|
-
runningCount > 0 && /* @__PURE__ */ jsx7("span", { className: "rounded-full bg-
|
|
1005
|
+
runningCount > 0 && /* @__PURE__ */ jsx7("span", { className: "rounded-full border border-[var(--border-accent)] bg-[var(--accent-surface-soft)] px-1.5 py-px text-[10px] font-medium text-primary", children: runningCount }),
|
|
1007
1006
|
onCreate && /* @__PURE__ */ jsx7(
|
|
1008
1007
|
"button",
|
|
1009
1008
|
{
|
|
1010
1009
|
type: "button",
|
|
1011
1010
|
onClick: onCreate,
|
|
1012
1011
|
title: createLabel,
|
|
1013
|
-
className: "flex h-6 w-6 items-center justify-center rounded-
|
|
1012
|
+
className: "flex h-6 w-6 items-center justify-center rounded-[var(--radius-sm)] border border-border text-muted-foreground transition-colors hover:bg-[var(--accent-surface-soft)] hover:text-foreground",
|
|
1014
1013
|
children: /* @__PURE__ */ jsx7(Plus, { className: "h-3 w-3" })
|
|
1015
1014
|
}
|
|
1016
1015
|
)
|
|
@@ -1025,7 +1024,7 @@ function SessionSidebar({
|
|
|
1025
1024
|
onChange: (event) => setQuery(event.target.value),
|
|
1026
1025
|
placeholder: searchPlaceholder,
|
|
1027
1026
|
"aria-label": searchPlaceholder,
|
|
1028
|
-
className: "h-7 w-full rounded-
|
|
1027
|
+
className: "h-7 w-full rounded-[var(--radius-sm)] border border-border bg-muted pl-7 pr-2 text-xs text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-[var(--border-accent)]"
|
|
1029
1028
|
}
|
|
1030
1029
|
)
|
|
1031
1030
|
] }),
|
|
@@ -1038,7 +1037,7 @@ function SessionSidebar({
|
|
|
1038
1037
|
onClick: () => setActiveFilterId(filter.id),
|
|
1039
1038
|
className: cn(
|
|
1040
1039
|
"inline-flex items-center gap-1 rounded-full border px-2 py-px text-[10px] font-medium transition-colors",
|
|
1041
|
-
isSelected ? "border-
|
|
1040
|
+
isSelected ? "border-[var(--border-accent)] bg-[var(--accent-surface-soft)] text-primary" : "border-border text-muted-foreground hover:text-foreground"
|
|
1042
1041
|
),
|
|
1043
1042
|
children: [
|
|
1044
1043
|
/* @__PURE__ */ jsx7("span", { children: filter.label }),
|
|
@@ -1049,7 +1048,7 @@ function SessionSidebar({
|
|
|
1049
1048
|
);
|
|
1050
1049
|
}) })
|
|
1051
1050
|
] }),
|
|
1052
|
-
/* @__PURE__ */ jsx7("nav", { "aria-label": "Sessions", className: "flex-1 overflow-y-auto px-1.5 py-1.5", children: visibleItems.length === 0 ? /* @__PURE__ */ jsx7("div", { className: "rounded-
|
|
1051
|
+
/* @__PURE__ */ jsx7("nav", { "aria-label": "Sessions", className: "flex-1 overflow-y-auto px-1.5 py-1.5", children: visibleItems.length === 0 ? /* @__PURE__ */ jsx7("div", { className: "rounded-[var(--radius-lg)] border border-dashed border-border px-3 py-3 text-xs text-muted-foreground", children: query.trim() ? `No sessions match "${query.trim()}".` : emptyMessage }) : /* @__PURE__ */ jsx7("ul", { className: "space-y-px", children: visibleItems.map((item) => {
|
|
1053
1052
|
const session = sessionsById.get(item.id) ?? null;
|
|
1054
1053
|
const isActive = currentItemId === item.id;
|
|
1055
1054
|
const status = session?.status ?? item.status;
|
|
@@ -1061,8 +1060,8 @@ function SessionSidebar({
|
|
|
1061
1060
|
"div",
|
|
1062
1061
|
{
|
|
1063
1062
|
className: cn(
|
|
1064
|
-
"group relative flex items-center gap-2 rounded-
|
|
1065
|
-
isActive ? "bg-accent text-
|
|
1063
|
+
"group relative flex items-center gap-2 rounded-[var(--radius-sm)] px-2 py-1.5 transition-colors",
|
|
1064
|
+
isActive ? "bg-[var(--accent-surface-soft)] text-foreground shadow-[inset_2px_0_0_hsl(var(--primary))]" : "text-muted-foreground hover:bg-muted"
|
|
1066
1065
|
),
|
|
1067
1066
|
children: [
|
|
1068
1067
|
/* @__PURE__ */ jsxs7(
|
|
@@ -1083,7 +1082,7 @@ function SessionSidebar({
|
|
|
1083
1082
|
/* @__PURE__ */ jsxs7("div", { className: "min-w-0 flex-1", children: [
|
|
1084
1083
|
/* @__PURE__ */ jsx7("div", { className: cn(
|
|
1085
1084
|
"truncate text-xs",
|
|
1086
|
-
isActive ? "font-semibold" : "font-medium"
|
|
1085
|
+
isActive ? "font-semibold text-foreground" : "font-medium"
|
|
1087
1086
|
), children: item.title }),
|
|
1088
1087
|
item.subtitle && /* @__PURE__ */ jsx7("div", { className: "truncate text-[10px] leading-tight text-muted-foreground", children: item.subtitle })
|
|
1089
1088
|
] })
|
|
@@ -1130,7 +1129,7 @@ function SessionSidebar({
|
|
|
1130
1129
|
}
|
|
1131
1130
|
navigateToHref(link.href);
|
|
1132
1131
|
},
|
|
1133
|
-
className: "flex w-full items-center gap-2 rounded-
|
|
1132
|
+
className: "flex w-full items-center gap-2 rounded-[var(--radius-sm)] px-2 py-1.5 text-left text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground",
|
|
1134
1133
|
children: [
|
|
1135
1134
|
/* @__PURE__ */ jsx7(Icon, { className: "h-3.5 w-3.5 shrink-0" }),
|
|
1136
1135
|
/* @__PURE__ */ jsx7("span", { className: "truncate", children: link.label })
|
|
@@ -1142,7 +1141,7 @@ function SessionSidebar({
|
|
|
1142
1141
|
resizable && /* @__PURE__ */ jsx7(
|
|
1143
1142
|
"div",
|
|
1144
1143
|
{
|
|
1145
|
-
className: "absolute top-0 right-0 bottom-0 w-1 cursor-col-resize hover:bg-
|
|
1144
|
+
className: "absolute top-0 right-0 bottom-0 w-1 cursor-col-resize hover:bg-[var(--accent-surface-soft)] active:bg-[var(--border-accent)] transition-colors",
|
|
1146
1145
|
onPointerDown: resize.onPointerDown,
|
|
1147
1146
|
onPointerMove: resize.onPointerMove,
|
|
1148
1147
|
onPointerUp: resize.onPointerUp,
|
|
@@ -1159,13 +1158,13 @@ import { Activity, AlertCircle as AlertCircle2, LoaderCircle, MessageSquareText
|
|
|
1159
1158
|
import { jsx as jsx8, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
1160
1159
|
function SessionStatusDot({ session }) {
|
|
1161
1160
|
if (session.status === "error") {
|
|
1162
|
-
return /* @__PURE__ */ jsx8(AlertCircle2, { className: "h-3 w-3 text-
|
|
1161
|
+
return /* @__PURE__ */ jsx8(AlertCircle2, { className: "h-3 w-3 text-[var(--surface-danger-text)]" });
|
|
1163
1162
|
}
|
|
1164
1163
|
if (session.status === "running") {
|
|
1165
1164
|
return /* @__PURE__ */ jsx8(LoaderCircle, { className: "h-3 w-3 animate-spin text-primary" });
|
|
1166
1165
|
}
|
|
1167
1166
|
if (session.status === "attention-needed") {
|
|
1168
|
-
return /* @__PURE__ */ jsx8(Activity, { className: "h-3 w-3 text-warning" });
|
|
1167
|
+
return /* @__PURE__ */ jsx8(Activity, { className: "h-3 w-3 text-[var(--surface-warning-text)]" });
|
|
1169
1168
|
}
|
|
1170
1169
|
return /* @__PURE__ */ jsx8("span", { className: "h-1.5 w-1.5 rounded-full bg-muted-foreground/40" });
|
|
1171
1170
|
}
|
|
@@ -1187,7 +1186,7 @@ function SessionActivityMonitor({
|
|
|
1187
1186
|
const sessionLookup = Object.keys(sessionsById).length > 0 ? sessionsById : Object.fromEntries(trackedSessions.map((session) => [session.sessionId, session]));
|
|
1188
1187
|
if (projectActivity.length === 0) {
|
|
1189
1188
|
if (compact) return null;
|
|
1190
|
-
return /* @__PURE__ */ jsx8("div", { className: cn("rounded-
|
|
1189
|
+
return /* @__PURE__ */ jsx8("div", { className: cn("rounded-[var(--radius-lg)] border border-border bg-muted px-3 py-2.5 text-xs text-muted-foreground", className), children: emptyMessage });
|
|
1191
1190
|
}
|
|
1192
1191
|
return /* @__PURE__ */ jsxs8("div", { className: cn("space-y-1.5", className), children: [
|
|
1193
1192
|
/* @__PURE__ */ jsxs8("div", { className: "flex items-center justify-between", children: [
|
|
@@ -1195,14 +1194,14 @@ function SessionActivityMonitor({
|
|
|
1195
1194
|
/* @__PURE__ */ jsx8(Activity, { className: "h-3 w-3" }),
|
|
1196
1195
|
"Active"
|
|
1197
1196
|
] }),
|
|
1198
|
-
totalRunning > 0 && /* @__PURE__ */ jsx8("span", { className: "rounded-full
|
|
1197
|
+
totalRunning > 0 && /* @__PURE__ */ jsx8("span", { className: "rounded-full border border-primary/30 bg-[var(--accent-surface-soft)] px-1.5 py-px text-[10px] font-medium text-primary", children: totalRunning })
|
|
1199
1198
|
] }),
|
|
1200
1199
|
/* @__PURE__ */ jsx8("div", { className: "space-y-1", children: projectActivity.map((project) => {
|
|
1201
1200
|
const label = resolveProjectLabel?.(project.projectId, project.projectLabel) ?? project.projectLabel ?? String(project.projectId);
|
|
1202
1201
|
return /* @__PURE__ */ jsxs8(
|
|
1203
1202
|
"div",
|
|
1204
1203
|
{
|
|
1205
|
-
className: "rounded-
|
|
1204
|
+
className: "overflow-hidden rounded-[var(--radius-lg)] border border-border bg-card",
|
|
1206
1205
|
children: [
|
|
1207
1206
|
/* @__PURE__ */ jsxs8("div", { className: "flex items-center justify-between gap-2 px-2.5 py-1.5", children: [
|
|
1208
1207
|
/* @__PURE__ */ jsxs8("div", { className: "min-w-0", children: [
|
|
@@ -1218,7 +1217,7 @@ function SessionActivityMonitor({
|
|
|
1218
1217
|
" live"
|
|
1219
1218
|
] })
|
|
1220
1219
|
] }),
|
|
1221
|
-
!compact && project.runningSessionIds.length > 0 && /* @__PURE__ */ jsx8("div", { className: "border-t border-border px-1 py-0.5", children: project.runningSessionIds.map((sessionId) => {
|
|
1220
|
+
!compact && project.runningSessionIds.length > 0 && /* @__PURE__ */ jsx8("div", { className: "border-t border-border bg-muted px-1 py-0.5", children: project.runningSessionIds.map((sessionId) => {
|
|
1222
1221
|
const session = sessionLookup[sessionId];
|
|
1223
1222
|
if (!session) return null;
|
|
1224
1223
|
return /* @__PURE__ */ jsxs8(
|
|
@@ -1232,10 +1231,10 @@ function SessionActivityMonitor({
|
|
|
1232
1231
|
}
|
|
1233
1232
|
navigateToSession(session);
|
|
1234
1233
|
},
|
|
1235
|
-
className: "flex w-full items-center gap-2 rounded-sm px-2 py-1 text-left transition-colors hover:bg-accent",
|
|
1234
|
+
className: "flex w-full items-center gap-2 rounded-[var(--radius-sm)] px-2 py-1 text-left transition-colors hover:bg-[var(--accent-surface-soft)]",
|
|
1236
1235
|
children: [
|
|
1237
1236
|
/* @__PURE__ */ jsx8(SessionStatusDot, { session }),
|
|
1238
|
-
/* @__PURE__ */ jsx8("span", { className: "min-w-0 truncate text-xs text-foreground", children: session.title ?? "Untitled" }),
|
|
1237
|
+
/* @__PURE__ */ jsx8("span", { className: "min-w-0 truncate text-xs text-muted-foreground", children: session.title ?? "Untitled" }),
|
|
1239
1238
|
/* @__PURE__ */ jsx8(MessageSquareText2, { className: "ml-auto h-3 w-3 shrink-0 text-muted-foreground" })
|
|
1240
1239
|
]
|
|
1241
1240
|
},
|
|
@@ -1251,7 +1250,7 @@ function SessionActivityMonitor({
|
|
|
1251
1250
|
}
|
|
1252
1251
|
|
|
1253
1252
|
// src/workspace/sandbox-workbench.tsx
|
|
1254
|
-
import { useEffect as useEffect3, useMemo as useMemo4, useState as
|
|
1253
|
+
import { useEffect as useEffect3, useMemo as useMemo4, useState as useState4 } from "react";
|
|
1255
1254
|
import {
|
|
1256
1255
|
Bot,
|
|
1257
1256
|
Boxes,
|
|
@@ -1286,15 +1285,15 @@ function ArtifactTabs({
|
|
|
1286
1285
|
onClose
|
|
1287
1286
|
}) {
|
|
1288
1287
|
if (artifacts.length === 0) return null;
|
|
1289
|
-
return /* @__PURE__ */ jsx9("div", { className: "flex items-center overflow-x-auto border-b border-
|
|
1288
|
+
return /* @__PURE__ */ jsx9("div", { className: "flex items-center overflow-x-auto border-b border-border bg-muted/20", children: artifacts.map((artifact) => {
|
|
1290
1289
|
const Icon = getArtifactTabIcon(artifact.kind);
|
|
1291
1290
|
const isActive = artifact.id === activeArtifactId;
|
|
1292
1291
|
return /* @__PURE__ */ jsxs9(
|
|
1293
1292
|
"div",
|
|
1294
1293
|
{
|
|
1295
1294
|
className: cn(
|
|
1296
|
-
"group flex shrink-0 items-center border-r border-
|
|
1297
|
-
isActive ? "
|
|
1295
|
+
"group flex shrink-0 items-center border-r border-border bg-background relative",
|
|
1296
|
+
isActive ? "text-foreground after:absolute after:top-0 after:left-0 after:right-0 after:h-[2px] after:bg-primary" : "text-muted-foreground hover:bg-muted/50 cursor-pointer"
|
|
1298
1297
|
),
|
|
1299
1298
|
children: [
|
|
1300
1299
|
/* @__PURE__ */ jsxs9(
|
|
@@ -1302,7 +1301,7 @@ function ArtifactTabs({
|
|
|
1302
1301
|
{
|
|
1303
1302
|
type: "button",
|
|
1304
1303
|
onClick: () => onSelect(artifact.id),
|
|
1305
|
-
className: "flex min-w-0 items-center gap-2 px-3 py-2 text-
|
|
1304
|
+
className: "flex min-w-0 items-center gap-2 px-3 py-2 text-[12px] uppercase tracking-wider font-medium transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-primary/60",
|
|
1306
1305
|
children: [
|
|
1307
1306
|
/* @__PURE__ */ jsx9(Icon, { className: "h-3.5 w-3.5 shrink-0" }),
|
|
1308
1307
|
/* @__PURE__ */ jsx9("span", { className: "max-w-[14rem] truncate", children: artifactTabLabel(artifact) })
|
|
@@ -1315,7 +1314,7 @@ function ArtifactTabs({
|
|
|
1315
1314
|
type: "button",
|
|
1316
1315
|
"aria-label": `Close ${artifactTabLabel(artifact)}`,
|
|
1317
1316
|
onClick: () => onClose(artifact.id),
|
|
1318
|
-
className: "mr-1 rounded p-1 opacity-0 transition-opacity hover:bg-
|
|
1317
|
+
className: "mr-1 rounded-[2px] p-1 opacity-0 transition-opacity hover:bg-accent hover:text-foreground focus-visible:opacity-100 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-primary/60 group-hover:opacity-100",
|
|
1319
1318
|
children: /* @__PURE__ */ jsx9(X4, { className: "h-3 w-3" })
|
|
1320
1319
|
}
|
|
1321
1320
|
)
|
|
@@ -1397,17 +1396,17 @@ function regionHeader(sections, fallback) {
|
|
|
1397
1396
|
}
|
|
1398
1397
|
switch (sections[0]?.key) {
|
|
1399
1398
|
case "directory":
|
|
1400
|
-
return /* @__PURE__ */ jsxs9("div", { className: "flex items-center gap-2 text-xs font-semibold uppercase tracking-[0.12em] text-
|
|
1399
|
+
return /* @__PURE__ */ jsxs9("div", { className: "flex items-center gap-2 text-xs font-semibold uppercase tracking-[0.12em] text-muted-foreground", children: [
|
|
1401
1400
|
/* @__PURE__ */ jsx9(FolderTree2, { className: "h-3.5 w-3.5" }),
|
|
1402
1401
|
"Directory"
|
|
1403
1402
|
] });
|
|
1404
1403
|
case "artifacts":
|
|
1405
|
-
return /* @__PURE__ */ jsxs9("div", { className: "flex items-center gap-2 text-xs font-semibold uppercase tracking-[0.12em] text-
|
|
1404
|
+
return /* @__PURE__ */ jsxs9("div", { className: "flex items-center gap-2 text-xs font-semibold uppercase tracking-[0.12em] text-muted-foreground", children: [
|
|
1406
1405
|
/* @__PURE__ */ jsx9(LayoutPanelTop, { className: "h-3.5 w-3.5" }),
|
|
1407
1406
|
"Artifacts"
|
|
1408
1407
|
] });
|
|
1409
1408
|
case "runtime":
|
|
1410
|
-
return /* @__PURE__ */ jsxs9("div", { className: "flex items-center gap-2 text-xs font-semibold uppercase tracking-[0.12em] text-
|
|
1409
|
+
return /* @__PURE__ */ jsxs9("div", { className: "flex items-center gap-2 text-xs font-semibold uppercase tracking-[0.12em] text-muted-foreground", children: [
|
|
1411
1410
|
/* @__PURE__ */ jsx9(Bot, { className: "h-3.5 w-3.5" }),
|
|
1412
1411
|
"Runtime"
|
|
1413
1412
|
] });
|
|
@@ -1444,7 +1443,7 @@ function SandboxWorkbench({
|
|
|
1444
1443
|
emptyArtifactState,
|
|
1445
1444
|
className
|
|
1446
1445
|
}) {
|
|
1447
|
-
const [uncontrolledArtifactId, setUncontrolledArtifactId] =
|
|
1446
|
+
const [uncontrolledArtifactId, setUncontrolledArtifactId] = useState4(
|
|
1448
1447
|
activeArtifactId ?? artifacts[0]?.id
|
|
1449
1448
|
);
|
|
1450
1449
|
useEffect3(() => {
|
|
@@ -1466,11 +1465,11 @@ function SandboxWorkbench({
|
|
|
1466
1465
|
}
|
|
1467
1466
|
onArtifactChange?.(artifactId);
|
|
1468
1467
|
};
|
|
1469
|
-
const centerHeader = /* @__PURE__ */ jsxs9("div", { className: "flex min-w-0 items-start justify-between gap-4 rounded-[var(--radius-xl)] border border-
|
|
1468
|
+
const centerHeader = /* @__PURE__ */ jsxs9("div", { className: "flex min-w-0 items-start justify-between gap-4 rounded-[var(--radius-xl)] border border-border bg-muted/50 px-4 py-3.5", children: [
|
|
1470
1469
|
/* @__PURE__ */ jsxs9("div", { className: "min-w-0", children: [
|
|
1471
|
-
/* @__PURE__ */ jsx9("div", { className: "text-[10px] font-semibold uppercase tracking-[0.18em] text-
|
|
1472
|
-
/* @__PURE__ */ jsx9("div", { className: "truncate text-[17px] font-semibold tracking-[0.01em] text-
|
|
1473
|
-
subtitle && /* @__PURE__ */ jsx9("div", { className: "truncate text-sm text-
|
|
1470
|
+
/* @__PURE__ */ jsx9("div", { className: "text-[10px] font-semibold uppercase tracking-[0.18em] text-primary", children: "Tangle Sandbox" }),
|
|
1471
|
+
/* @__PURE__ */ jsx9("div", { className: "truncate text-[17px] font-semibold tracking-[0.01em] text-foreground", children: title }),
|
|
1472
|
+
subtitle && /* @__PURE__ */ jsx9("div", { className: "truncate text-sm text-muted-foreground", children: subtitle })
|
|
1474
1473
|
] }),
|
|
1475
1474
|
/* @__PURE__ */ jsxs9("div", { className: "flex shrink-0 flex-wrap items-center justify-end gap-2", children: [
|
|
1476
1475
|
status,
|
|
@@ -1489,7 +1488,7 @@ function SandboxWorkbench({
|
|
|
1489
1488
|
meta: session.meta,
|
|
1490
1489
|
headerActions: session.headerActions,
|
|
1491
1490
|
className: "h-full",
|
|
1492
|
-
contentClassName: "bg-
|
|
1491
|
+
contentClassName: "bg-background",
|
|
1493
1492
|
children: /* @__PURE__ */ jsx9(
|
|
1494
1493
|
ChatContainer,
|
|
1495
1494
|
{
|
|
@@ -1500,7 +1499,7 @@ function SandboxWorkbench({
|
|
|
1500
1499
|
)
|
|
1501
1500
|
}
|
|
1502
1501
|
);
|
|
1503
|
-
const artifactPanel = artifacts.length > 0 ? /* @__PURE__ */ jsxs9("section", { className: "flex h-full min-h-0 flex-col bg-
|
|
1502
|
+
const artifactPanel = artifacts.length > 0 ? /* @__PURE__ */ jsxs9("section", { className: "flex h-full min-h-0 flex-col bg-background", children: [
|
|
1504
1503
|
/* @__PURE__ */ jsx9(
|
|
1505
1504
|
ArtifactTabs,
|
|
1506
1505
|
{
|
|
@@ -1510,7 +1509,7 @@ function SandboxWorkbench({
|
|
|
1510
1509
|
onClose: onArtifactClose
|
|
1511
1510
|
}
|
|
1512
1511
|
),
|
|
1513
|
-
/* @__PURE__ */ jsx9("div", { className: "min-h-0 flex-1 overflow-auto bg-
|
|
1512
|
+
/* @__PURE__ */ jsx9("div", { className: "min-h-0 flex-1 overflow-auto bg-background", children: activeArtifact ? renderArtifact(activeArtifact) : /* @__PURE__ */ jsx9("div", { className: "flex h-full items-center justify-center p-6", children: emptyArtifactState ?? /* @__PURE__ */ jsx9(
|
|
1514
1513
|
EmptyState,
|
|
1515
1514
|
{
|
|
1516
1515
|
icon: /* @__PURE__ */ jsx9(Boxes, { className: "h-8 w-8" }),
|
|
@@ -1548,7 +1547,7 @@ function SandboxWorkbench({
|
|
|
1548
1547
|
const left = renderRegion(regionSections.left, "left");
|
|
1549
1548
|
const right = renderRegion(regionSections.right, "right");
|
|
1550
1549
|
const bottom = renderRegion(regionSections.bottom, "bottom");
|
|
1551
|
-
const genericPanelsHeader = /* @__PURE__ */ jsx9("span", { className: "text-xs font-semibold uppercase tracking-[0.12em] text-
|
|
1550
|
+
const genericPanelsHeader = /* @__PURE__ */ jsx9("span", { className: "text-xs font-semibold uppercase tracking-[0.12em] text-muted-foreground", children: "Workspace Panels" });
|
|
1552
1551
|
return /* @__PURE__ */ jsx9(
|
|
1553
1552
|
WorkspaceLayout,
|
|
1554
1553
|
{
|
|
@@ -1560,7 +1559,7 @@ function SandboxWorkbench({
|
|
|
1560
1559
|
rightHeader: right ? regionHeader(regionSections.right, genericPanelsHeader) : void 0,
|
|
1561
1560
|
bottom,
|
|
1562
1561
|
bottomHeader: bottom ? regionHeader(regionSections.bottom, genericPanelsHeader) : void 0,
|
|
1563
|
-
theme: layout?.theme
|
|
1562
|
+
theme: layout?.theme,
|
|
1564
1563
|
density: layout?.density ?? "comfortable",
|
|
1565
1564
|
persistenceKey: layout?.persistenceKey,
|
|
1566
1565
|
defaultLeftOpen: layout?.defaultLeftOpen ?? Boolean(left),
|
|
@@ -1586,7 +1585,7 @@ function AgentWorkbench(props) {
|
|
|
1586
1585
|
...props.session,
|
|
1587
1586
|
eyebrow: props.session.eyebrow ?? "Agent Session",
|
|
1588
1587
|
title: props.session.title ?? /* @__PURE__ */ jsxs9("span", { className: "inline-flex items-center gap-2", children: [
|
|
1589
|
-
/* @__PURE__ */ jsx9(Bot, { className: "h-4 w-4 text-
|
|
1588
|
+
/* @__PURE__ */ jsx9(Bot, { className: "h-4 w-4 text-primary" }),
|
|
1590
1589
|
"Execution timeline"
|
|
1591
1590
|
] })
|
|
1592
1591
|
}
|
|
@@ -1595,23 +1594,23 @@ function AgentWorkbench(props) {
|
|
|
1595
1594
|
}
|
|
1596
1595
|
|
|
1597
1596
|
// src/workspace/audit-results.tsx
|
|
1598
|
-
import { useState as
|
|
1597
|
+
import { useState as useState5 } from "react";
|
|
1599
1598
|
import { CheckCircle as CheckCircle2, XCircle, ChevronRight, Shield } from "lucide-react";
|
|
1600
1599
|
import { jsx as jsx10, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
1601
1600
|
function AuditResults({ forms, crossFormChecks = [], overallScore, className }) {
|
|
1602
1601
|
const totalPassed = forms.reduce((s, f) => s + f.passed, 0);
|
|
1603
1602
|
const totalChecks = forms.reduce((s, f) => s + f.passed + f.failed, 0);
|
|
1604
1603
|
return /* @__PURE__ */ jsxs10("div", { className: cn("space-y-3 p-3", className), children: [
|
|
1605
|
-
/* @__PURE__ */ jsxs10("div", { className: "flex items-center gap-3 px-3 py-2 rounded-[var(--radius-md)] bg-
|
|
1604
|
+
/* @__PURE__ */ jsxs10("div", { className: "flex items-center gap-3 px-3 py-2 rounded-[var(--radius-md)] bg-background border border-border", children: [
|
|
1606
1605
|
/* @__PURE__ */ jsx10(Shield, { className: cn("h-5 w-5", totalChecks === totalPassed ? "text-[var(--code-success)]" : "text-[var(--code-number)]") }),
|
|
1607
1606
|
/* @__PURE__ */ jsxs10("div", { children: [
|
|
1608
|
-
/* @__PURE__ */ jsxs10("div", { className: "text-sm font-semibold text-
|
|
1607
|
+
/* @__PURE__ */ jsxs10("div", { className: "text-sm font-semibold text-foreground", children: [
|
|
1609
1608
|
totalPassed,
|
|
1610
1609
|
"/",
|
|
1611
1610
|
totalChecks,
|
|
1612
1611
|
" checks passed"
|
|
1613
1612
|
] }),
|
|
1614
|
-
overallScore !== void 0 && /* @__PURE__ */ jsxs10("div", { className: "text-xs text-
|
|
1613
|
+
overallScore !== void 0 && /* @__PURE__ */ jsxs10("div", { className: "text-xs text-muted-foreground", children: [
|
|
1615
1614
|
"Score: ",
|
|
1616
1615
|
overallScore,
|
|
1617
1616
|
"/100"
|
|
@@ -1620,40 +1619,40 @@ function AuditResults({ forms, crossFormChecks = [], overallScore, className })
|
|
|
1620
1619
|
] }),
|
|
1621
1620
|
forms.map((form) => /* @__PURE__ */ jsx10(FormAuditCard, { form }, form.formId)),
|
|
1622
1621
|
crossFormChecks.length > 0 && /* @__PURE__ */ jsxs10("div", { children: [
|
|
1623
|
-
/* @__PURE__ */ jsx10("div", { className: "text-xs font-semibold text-
|
|
1622
|
+
/* @__PURE__ */ jsx10("div", { className: "text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-1", children: "Cross-Form Checks" }),
|
|
1624
1623
|
crossFormChecks.map((check, i) => /* @__PURE__ */ jsx10(CheckRow, { check }, i))
|
|
1625
1624
|
] })
|
|
1626
1625
|
] });
|
|
1627
1626
|
}
|
|
1628
1627
|
function FormAuditCard({ form }) {
|
|
1629
|
-
const [expanded, setExpanded] =
|
|
1628
|
+
const [expanded, setExpanded] = useState5(form.failed > 0);
|
|
1630
1629
|
const allPassed = form.failed === 0 && form.found;
|
|
1631
|
-
return /* @__PURE__ */ jsxs10("div", { className: "rounded-[var(--radius-md)] border border-
|
|
1630
|
+
return /* @__PURE__ */ jsxs10("div", { className: "rounded-[var(--radius-md)] border border-border overflow-hidden", children: [
|
|
1632
1631
|
/* @__PURE__ */ jsxs10(
|
|
1633
1632
|
"button",
|
|
1634
1633
|
{
|
|
1635
1634
|
onClick: () => setExpanded(!expanded),
|
|
1636
|
-
className: "flex items-center gap-2 w-full px-3 py-2 text-left hover:bg-
|
|
1635
|
+
className: "flex items-center gap-2 w-full px-3 py-2 text-left hover:bg-accent transition-colors",
|
|
1637
1636
|
children: [
|
|
1638
1637
|
allPassed ? /* @__PURE__ */ jsx10(CheckCircle2, { className: "h-4 w-4 text-[var(--code-success)] shrink-0" }) : !form.found ? /* @__PURE__ */ jsx10(XCircle, { className: "h-4 w-4 text-[var(--code-error)] shrink-0" }) : /* @__PURE__ */ jsx10(XCircle, { className: "h-4 w-4 text-[var(--code-number)] shrink-0" }),
|
|
1639
|
-
/* @__PURE__ */ jsx10("span", { className: "text-sm font-medium text-
|
|
1640
|
-
/* @__PURE__ */ jsxs10("span", { className: cn("text-xs tabular-nums", allPassed ? "text-[var(--code-success)]" : "text-
|
|
1638
|
+
/* @__PURE__ */ jsx10("span", { className: "text-sm font-medium text-foreground flex-1", children: form.formName || form.formId }),
|
|
1639
|
+
/* @__PURE__ */ jsxs10("span", { className: cn("text-xs tabular-nums", allPassed ? "text-[var(--code-success)]" : "text-muted-foreground"), children: [
|
|
1641
1640
|
form.passed,
|
|
1642
1641
|
"/",
|
|
1643
1642
|
form.passed + form.failed
|
|
1644
1643
|
] }),
|
|
1645
|
-
/* @__PURE__ */ jsx10(ChevronRight, { className: cn("h-3 w-3 text-
|
|
1644
|
+
/* @__PURE__ */ jsx10(ChevronRight, { className: cn("h-3 w-3 text-muted-foreground transition-transform", expanded && "rotate-90") })
|
|
1646
1645
|
]
|
|
1647
1646
|
}
|
|
1648
1647
|
),
|
|
1649
|
-
expanded && /* @__PURE__ */ jsx10("div", { className: "border-t border-
|
|
1648
|
+
expanded && /* @__PURE__ */ jsx10("div", { className: "border-t border-border px-3 py-1.5 space-y-0.5", children: form.checks.map((check, i) => /* @__PURE__ */ jsx10(CheckRow, { check }, i)) })
|
|
1650
1649
|
] });
|
|
1651
1650
|
}
|
|
1652
1651
|
function CheckRow({ check }) {
|
|
1653
1652
|
return /* @__PURE__ */ jsxs10("div", { className: "flex items-center gap-2 py-1 text-xs", children: [
|
|
1654
1653
|
check.passed ? /* @__PURE__ */ jsx10(CheckCircle2, { className: "h-3 w-3 text-[var(--code-success)] shrink-0" }) : /* @__PURE__ */ jsx10(XCircle, { className: "h-3 w-3 text-[var(--code-error)] shrink-0" }),
|
|
1655
|
-
/* @__PURE__ */ jsx10("span", { className: "text-
|
|
1656
|
-
/* @__PURE__ */ jsx10("span", { className: "text-
|
|
1654
|
+
/* @__PURE__ */ jsx10("span", { className: "text-foreground flex-1 truncate", children: check.label }),
|
|
1655
|
+
/* @__PURE__ */ jsx10("span", { className: "text-muted-foreground tabular-nums shrink-0", children: check.passed ? String(check.actual ?? check.expected) : `${check.actual ?? "missing"} \u2260 ${check.expected}` })
|
|
1657
1656
|
] });
|
|
1658
1657
|
}
|
|
1659
1658
|
|