@tangle-network/sandbox-ui 0.91.2 → 0.91.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/{chunk-RPOPLGW7.js → chunk-XKKV3B24.js} +244 -223
- package/dist/globals.css +6 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3 -1
- package/dist/integrations.js +51 -1
- package/dist/styles.css +6 -0
- package/dist/workspace.d.ts +9 -2
- package/dist/workspace.js +3 -1
- package/package.json +1 -1
|
@@ -18,7 +18,27 @@ import {
|
|
|
18
18
|
PanelRightOpen,
|
|
19
19
|
X
|
|
20
20
|
} from "lucide-react";
|
|
21
|
-
|
|
21
|
+
|
|
22
|
+
// src/workspace/workspace-pane-header.tsx
|
|
23
|
+
import { jsx } from "react/jsx-runtime";
|
|
24
|
+
function WorkspacePaneHeader({
|
|
25
|
+
className,
|
|
26
|
+
...props
|
|
27
|
+
}) {
|
|
28
|
+
return /* @__PURE__ */ jsx(
|
|
29
|
+
"div",
|
|
30
|
+
{
|
|
31
|
+
className: cn(
|
|
32
|
+
"flex h-14 shrink-0 items-center border-b border-[var(--md3-outline-variant)] bg-surface-container-high px-3",
|
|
33
|
+
className
|
|
34
|
+
),
|
|
35
|
+
...props
|
|
36
|
+
}
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// src/workspace/workspace-layout.tsx
|
|
41
|
+
import { Fragment, jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
22
42
|
var DESKTOP_BREAKPOINT = "(min-width: 1024px)";
|
|
23
43
|
function clamp(value, min, max) {
|
|
24
44
|
return Math.min(Math.max(value, min), max);
|
|
@@ -82,8 +102,8 @@ function ResizeHandle({ label, onDragStart, onStep, className }) {
|
|
|
82
102
|
className
|
|
83
103
|
),
|
|
84
104
|
children: [
|
|
85
|
-
/* @__PURE__ */
|
|
86
|
-
/* @__PURE__ */
|
|
105
|
+
/* @__PURE__ */ jsx2("span", { className: "absolute inset-y-0 left-1/2 w-px -translate-x-1/2 bg-[var(--md3-outline-variant)] transition-colors" }),
|
|
106
|
+
/* @__PURE__ */ jsx2("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" })
|
|
87
107
|
]
|
|
88
108
|
}
|
|
89
109
|
);
|
|
@@ -119,15 +139,15 @@ function HorizontalResizeHandle({ label, onDragStart, onStep, className }) {
|
|
|
119
139
|
className
|
|
120
140
|
),
|
|
121
141
|
children: [
|
|
122
|
-
/* @__PURE__ */
|
|
123
|
-
/* @__PURE__ */
|
|
142
|
+
/* @__PURE__ */ jsx2("span", { className: "absolute inset-x-0 top-1/2 h-px -translate-y-1/2 bg-[var(--md3-outline-variant)] transition-colors" }),
|
|
143
|
+
/* @__PURE__ */ jsx2("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" })
|
|
124
144
|
]
|
|
125
145
|
}
|
|
126
146
|
);
|
|
127
147
|
}
|
|
128
148
|
function MobileDrawer({ side, title, header, onClose, children }) {
|
|
129
149
|
return /* @__PURE__ */ jsxs("div", { className: "fixed inset-0 z-50 flex lg:hidden", "aria-modal": "true", role: "dialog", "aria-label": title, children: [
|
|
130
|
-
/* @__PURE__ */
|
|
150
|
+
/* @__PURE__ */ jsx2(
|
|
131
151
|
"button",
|
|
132
152
|
{
|
|
133
153
|
type: "button",
|
|
@@ -144,20 +164,20 @@ function MobileDrawer({ side, title, header, onClose, children }) {
|
|
|
144
164
|
side === "left" ? "border-r" : "ml-auto border-l"
|
|
145
165
|
),
|
|
146
166
|
children: [
|
|
147
|
-
/* @__PURE__ */ jsxs(
|
|
148
|
-
/* @__PURE__ */
|
|
149
|
-
/* @__PURE__ */
|
|
167
|
+
/* @__PURE__ */ jsxs(WorkspacePaneHeader, { className: "justify-between gap-3", children: [
|
|
168
|
+
/* @__PURE__ */ jsx2("div", { className: "min-w-0 flex-1", children: header ?? /* @__PURE__ */ jsx2("span", { className: "text-[13px] font-medium text-foreground", children: title }) }),
|
|
169
|
+
/* @__PURE__ */ jsx2(
|
|
150
170
|
"button",
|
|
151
171
|
{
|
|
152
172
|
type: "button",
|
|
153
173
|
"aria-label": `Close ${title}`,
|
|
154
174
|
onClick: onClose,
|
|
155
175
|
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",
|
|
156
|
-
children: /* @__PURE__ */
|
|
176
|
+
children: /* @__PURE__ */ jsx2(X, { className: "h-4 w-4" })
|
|
157
177
|
}
|
|
158
178
|
)
|
|
159
179
|
] }),
|
|
160
|
-
/* @__PURE__ */
|
|
180
|
+
/* @__PURE__ */ jsx2("div", { className: "flex-1 overflow-auto", children })
|
|
161
181
|
]
|
|
162
182
|
}
|
|
163
183
|
)
|
|
@@ -300,24 +320,24 @@ function WorkspaceLayout({
|
|
|
300
320
|
style: leftStyle,
|
|
301
321
|
className: "hidden shrink-0 border-r border-[var(--md3-outline-variant)] bg-surface-container-low lg:flex lg:flex-col",
|
|
302
322
|
children: [
|
|
303
|
-
leftHeader && /* @__PURE__ */ jsxs(
|
|
304
|
-
/* @__PURE__ */
|
|
305
|
-
/* @__PURE__ */
|
|
323
|
+
leftHeader && /* @__PURE__ */ jsxs(WorkspacePaneHeader, { className: "justify-between gap-2", children: [
|
|
324
|
+
/* @__PURE__ */ jsx2("div", { className: "min-w-0 flex-1", children: leftHeader }),
|
|
325
|
+
/* @__PURE__ */ jsx2(
|
|
306
326
|
"button",
|
|
307
327
|
{
|
|
308
328
|
type: "button",
|
|
309
329
|
"aria-label": "Collapse left panel",
|
|
310
330
|
onClick: () => setLeftOpen(false),
|
|
311
331
|
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",
|
|
312
|
-
children: /* @__PURE__ */
|
|
332
|
+
children: /* @__PURE__ */ jsx2(PanelLeftClose, { className: "h-4 w-4" })
|
|
313
333
|
}
|
|
314
334
|
)
|
|
315
335
|
] }),
|
|
316
|
-
/* @__PURE__ */
|
|
336
|
+
/* @__PURE__ */ jsx2("div", { className: "min-h-0 flex-1 overflow-auto py-1", children: left })
|
|
317
337
|
]
|
|
318
338
|
}
|
|
319
339
|
),
|
|
320
|
-
resizable && /* @__PURE__ */
|
|
340
|
+
resizable && /* @__PURE__ */ jsx2(
|
|
321
341
|
ResizeHandle,
|
|
322
342
|
{
|
|
323
343
|
label: "Resize left panel",
|
|
@@ -327,42 +347,42 @@ function WorkspaceLayout({
|
|
|
327
347
|
)
|
|
328
348
|
] }),
|
|
329
349
|
/* @__PURE__ */ jsxs("main", { className: "flex min-w-0 flex-1 flex-col", children: [
|
|
330
|
-
(centerHeader || left || right || bottom) && /* @__PURE__ */ jsxs(
|
|
331
|
-
left && !leftOpen && /* @__PURE__ */
|
|
350
|
+
(centerHeader || left || right || bottom) && /* @__PURE__ */ jsxs(WorkspacePaneHeader, { className: "gap-2", children: [
|
|
351
|
+
left && !leftOpen && /* @__PURE__ */ jsx2(
|
|
332
352
|
"button",
|
|
333
353
|
{
|
|
334
354
|
type: "button",
|
|
335
355
|
"aria-label": "Open left panel",
|
|
336
356
|
onClick: () => setLeftOpen(true),
|
|
337
357
|
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",
|
|
338
|
-
children: /* @__PURE__ */
|
|
358
|
+
children: /* @__PURE__ */ jsx2(PanelLeftOpen, { className: "h-4 w-4" })
|
|
339
359
|
}
|
|
340
360
|
),
|
|
341
|
-
/* @__PURE__ */
|
|
342
|
-
bottom && !bottomOpen && /* @__PURE__ */
|
|
361
|
+
/* @__PURE__ */ jsx2("div", { className: "min-w-0 flex-1", children: centerHeader }),
|
|
362
|
+
bottom && !bottomOpen && /* @__PURE__ */ jsx2(
|
|
343
363
|
"button",
|
|
344
364
|
{
|
|
345
365
|
type: "button",
|
|
346
366
|
"aria-label": "Open bottom panel",
|
|
347
367
|
onClick: () => setBottomOpen(true),
|
|
348
368
|
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",
|
|
349
|
-
children: /* @__PURE__ */
|
|
369
|
+
children: /* @__PURE__ */ jsx2(PanelBottomOpen, { className: "h-4 w-4" })
|
|
350
370
|
}
|
|
351
371
|
),
|
|
352
|
-
right && !rightOpen && /* @__PURE__ */
|
|
372
|
+
right && !rightOpen && /* @__PURE__ */ jsx2(
|
|
353
373
|
"button",
|
|
354
374
|
{
|
|
355
375
|
type: "button",
|
|
356
376
|
"aria-label": "Open right panel",
|
|
357
377
|
onClick: () => setRightOpen(true),
|
|
358
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",
|
|
359
|
-
children: /* @__PURE__ */
|
|
379
|
+
children: /* @__PURE__ */ jsx2(PanelRightOpen, { className: "h-4 w-4" })
|
|
360
380
|
}
|
|
361
381
|
)
|
|
362
382
|
] }),
|
|
363
|
-
/* @__PURE__ */
|
|
383
|
+
/* @__PURE__ */ jsx2("div", { className: "min-h-0 flex-1 overflow-auto", children: center }),
|
|
364
384
|
bottom && bottomOpen && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
365
|
-
resizable && /* @__PURE__ */
|
|
385
|
+
resizable && /* @__PURE__ */ jsx2(
|
|
366
386
|
HorizontalResizeHandle,
|
|
367
387
|
{
|
|
368
388
|
label: "Resize bottom panel",
|
|
@@ -370,7 +390,7 @@ function WorkspaceLayout({
|
|
|
370
390
|
onStep: stepBottomHeight
|
|
371
391
|
}
|
|
372
392
|
),
|
|
373
|
-
/* @__PURE__ */
|
|
393
|
+
/* @__PURE__ */ jsx2(
|
|
374
394
|
"section",
|
|
375
395
|
{
|
|
376
396
|
"aria-label": bottomLabel,
|
|
@@ -378,27 +398,27 @@ function WorkspaceLayout({
|
|
|
378
398
|
style: { height: `${bottomHeight}px` },
|
|
379
399
|
children: /* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col", children: [
|
|
380
400
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2 border-b border-[var(--md3-outline-variant)] px-3 py-1.5 bg-surface-container-high shrink-0", children: [
|
|
381
|
-
/* @__PURE__ */
|
|
382
|
-
/* @__PURE__ */
|
|
401
|
+
/* @__PURE__ */ jsx2("div", { className: "min-w-0 flex-1", children: bottomHeader ?? /* @__PURE__ */ jsx2("span", { className: "text-[11px] font-semibold uppercase tracking-wider text-muted-foreground", children: "Runtime" }) }),
|
|
402
|
+
/* @__PURE__ */ jsx2(
|
|
383
403
|
"button",
|
|
384
404
|
{
|
|
385
405
|
type: "button",
|
|
386
406
|
"aria-label": "Collapse bottom panel",
|
|
387
407
|
onClick: () => setBottomOpen(false),
|
|
388
408
|
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",
|
|
389
|
-
children: /* @__PURE__ */
|
|
409
|
+
children: /* @__PURE__ */ jsx2(PanelBottomClose, { className: "h-4 w-4" })
|
|
390
410
|
}
|
|
391
411
|
)
|
|
392
412
|
] }),
|
|
393
|
-
/* @__PURE__ */
|
|
413
|
+
/* @__PURE__ */ jsx2("div", { className: "min-h-0 flex-1 overflow-auto", children: bottom })
|
|
394
414
|
] })
|
|
395
415
|
}
|
|
396
416
|
)
|
|
397
417
|
] }),
|
|
398
|
-
centerFooter && /* @__PURE__ */
|
|
418
|
+
centerFooter && /* @__PURE__ */ jsx2("div", { className: "shrink-0 border-t border-[var(--md3-outline-variant)] bg-surface-container-low", children: centerFooter })
|
|
399
419
|
] }),
|
|
400
420
|
desktop && right && rightOpen && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
401
|
-
resizable && /* @__PURE__ */
|
|
421
|
+
resizable && /* @__PURE__ */ jsx2(
|
|
402
422
|
ResizeHandle,
|
|
403
423
|
{
|
|
404
424
|
label: "Resize right panel",
|
|
@@ -413,26 +433,26 @@ function WorkspaceLayout({
|
|
|
413
433
|
style: rightStyle,
|
|
414
434
|
className: "hidden shrink-0 border-l border-[var(--md3-outline-variant)] bg-surface-container-low lg:flex lg:flex-col",
|
|
415
435
|
children: [
|
|
416
|
-
/* @__PURE__ */ jsxs(
|
|
417
|
-
/* @__PURE__ */
|
|
418
|
-
/* @__PURE__ */
|
|
436
|
+
/* @__PURE__ */ jsxs(WorkspacePaneHeader, { className: "justify-between gap-2", children: [
|
|
437
|
+
/* @__PURE__ */ jsx2("div", { className: "min-w-0 flex-1", children: rightHeader ?? /* @__PURE__ */ jsx2("span", { className: "text-[13px] font-medium text-foreground", children: "Artifacts" }) }),
|
|
438
|
+
/* @__PURE__ */ jsx2(
|
|
419
439
|
"button",
|
|
420
440
|
{
|
|
421
441
|
type: "button",
|
|
422
442
|
"aria-label": "Collapse right panel",
|
|
423
443
|
onClick: () => setRightOpen(false),
|
|
424
444
|
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",
|
|
425
|
-
children: /* @__PURE__ */
|
|
445
|
+
children: /* @__PURE__ */ jsx2(PanelRightClose, { className: "h-4 w-4" })
|
|
426
446
|
}
|
|
427
447
|
)
|
|
428
448
|
] }),
|
|
429
|
-
/* @__PURE__ */
|
|
449
|
+
/* @__PURE__ */ jsx2("div", { className: "min-h-0 flex-1 overflow-auto", children: right })
|
|
430
450
|
]
|
|
431
451
|
}
|
|
432
452
|
)
|
|
433
453
|
] })
|
|
434
454
|
] }),
|
|
435
|
-
!desktop && left && leftOpen && /* @__PURE__ */
|
|
455
|
+
!desktop && left && leftOpen && /* @__PURE__ */ jsx2(
|
|
436
456
|
MobileDrawer,
|
|
437
457
|
{
|
|
438
458
|
side: "left",
|
|
@@ -442,7 +462,7 @@ function WorkspaceLayout({
|
|
|
442
462
|
children: left
|
|
443
463
|
}
|
|
444
464
|
),
|
|
445
|
-
!desktop && right && rightOpen && /* @__PURE__ */
|
|
465
|
+
!desktop && right && rightOpen && /* @__PURE__ */ jsx2(
|
|
446
466
|
MobileDrawer,
|
|
447
467
|
{
|
|
448
468
|
side: "right",
|
|
@@ -470,7 +490,7 @@ import {
|
|
|
470
490
|
} from "@tangle-network/ui/files";
|
|
471
491
|
import { EmptyState } from "@tangle-network/ui/primitives";
|
|
472
492
|
import { Input } from "@tangle-network/ui/primitives";
|
|
473
|
-
import { jsx as
|
|
493
|
+
import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
474
494
|
function countNodes(node) {
|
|
475
495
|
if (node.type === "file") {
|
|
476
496
|
return { files: 1, directories: 0 };
|
|
@@ -522,7 +542,7 @@ function DirectoryPane({
|
|
|
522
542
|
[query, visibleRoot]
|
|
523
543
|
);
|
|
524
544
|
const counts = useMemo2(() => visibleRoot ? countNodes(visibleRoot) : { files: 0, directories: 0 }, [visibleRoot]);
|
|
525
|
-
return /* @__PURE__ */
|
|
545
|
+
return /* @__PURE__ */ jsx3(
|
|
526
546
|
ArtifactPane,
|
|
527
547
|
{
|
|
528
548
|
eyebrow: "Workspace",
|
|
@@ -530,7 +550,7 @@ function DirectoryPane({
|
|
|
530
550
|
subtitle: subtitle ?? root.path,
|
|
531
551
|
className,
|
|
532
552
|
toolbar: /* @__PURE__ */ jsxs2("div", { className: "flex items-center gap-2", children: [
|
|
533
|
-
/* @__PURE__ */
|
|
553
|
+
/* @__PURE__ */ jsx3("div", { className: "flex-1", children: /* @__PURE__ */ jsx3(
|
|
534
554
|
Input,
|
|
535
555
|
{
|
|
536
556
|
value: query,
|
|
@@ -539,24 +559,24 @@ function DirectoryPane({
|
|
|
539
559
|
className: "h-7 text-xs rounded-[2px]"
|
|
540
560
|
}
|
|
541
561
|
) }),
|
|
542
|
-
onRefresh && /* @__PURE__ */
|
|
562
|
+
onRefresh && /* @__PURE__ */ jsx3(
|
|
543
563
|
"button",
|
|
544
564
|
{
|
|
545
565
|
type: "button",
|
|
546
566
|
"aria-label": "Refresh directory",
|
|
547
567
|
onClick: onRefresh,
|
|
548
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",
|
|
549
|
-
children: /* @__PURE__ */
|
|
569
|
+
children: /* @__PURE__ */ jsx3(RefreshCw, { className: "h-4 w-4" })
|
|
550
570
|
}
|
|
551
571
|
),
|
|
552
|
-
onUpload && /* @__PURE__ */
|
|
572
|
+
onUpload && /* @__PURE__ */ jsx3(
|
|
553
573
|
"button",
|
|
554
574
|
{
|
|
555
575
|
type: "button",
|
|
556
576
|
"aria-label": "Upload files",
|
|
557
577
|
onClick: onUpload,
|
|
558
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",
|
|
559
|
-
children: /* @__PURE__ */
|
|
579
|
+
children: /* @__PURE__ */ jsx3(Upload, { className: "h-4 w-4" })
|
|
560
580
|
}
|
|
561
581
|
)
|
|
562
582
|
] }),
|
|
@@ -570,15 +590,15 @@ function DirectoryPane({
|
|
|
570
590
|
" folders"
|
|
571
591
|
] })
|
|
572
592
|
] }),
|
|
573
|
-
emptyState: /* @__PURE__ */
|
|
593
|
+
emptyState: /* @__PURE__ */ jsx3(
|
|
574
594
|
EmptyState,
|
|
575
595
|
{
|
|
576
|
-
icon: /* @__PURE__ */
|
|
596
|
+
icon: /* @__PURE__ */ jsx3(Search, { className: "h-8 w-8" }),
|
|
577
597
|
title: "No matching files",
|
|
578
598
|
description: "Try a different search or clear the current filter."
|
|
579
599
|
}
|
|
580
600
|
),
|
|
581
|
-
children: filteredRoot ? /* @__PURE__ */
|
|
601
|
+
children: filteredRoot ? /* @__PURE__ */ jsx3("div", { className: "py-2", children: /* @__PURE__ */ jsx3(
|
|
582
602
|
FileTree,
|
|
583
603
|
{
|
|
584
604
|
root: filteredRoot,
|
|
@@ -597,7 +617,7 @@ import { Binary, ShieldCheck, TerminalSquare } from "lucide-react";
|
|
|
597
617
|
|
|
598
618
|
// src/workspace/status-banner.tsx
|
|
599
619
|
import { Loader2, AlertCircle, CheckCircle, Wifi } from "lucide-react";
|
|
600
|
-
import { jsx as
|
|
620
|
+
import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
601
621
|
var BANNER_STYLES = {
|
|
602
622
|
provisioning: { bg: "bg-primary/5", border: "border-primary/20", text: "text-primary", icon: Loader2 },
|
|
603
623
|
connecting: { bg: "bg-[var(--code-number)]/5", border: "border-[var(--code-number)]/20", text: "text-[var(--code-number)]", icon: Wifi },
|
|
@@ -619,10 +639,10 @@ function StatusBanner({ type, message, detail, onDismiss, className }) {
|
|
|
619
639
|
className
|
|
620
640
|
),
|
|
621
641
|
children: [
|
|
622
|
-
/* @__PURE__ */
|
|
623
|
-
/* @__PURE__ */
|
|
624
|
-
detail && /* @__PURE__ */
|
|
625
|
-
onDismiss && /* @__PURE__ */
|
|
642
|
+
/* @__PURE__ */ jsx4(Icon, { className: cn("h-4 w-4 shrink-0", style.text, isAnimated && "animate-spin") }),
|
|
643
|
+
/* @__PURE__ */ jsx4("span", { className: "font-medium text-foreground", children: message }),
|
|
644
|
+
detail && /* @__PURE__ */ jsx4("span", { className: "font-mono text-xs text-muted-foreground tabular-nums", children: detail }),
|
|
645
|
+
onDismiss && /* @__PURE__ */ jsx4(
|
|
626
646
|
"button",
|
|
627
647
|
{
|
|
628
648
|
onClick: onDismiss,
|
|
@@ -637,7 +657,7 @@ function StatusBanner({ type, message, detail, onDismiss, className }) {
|
|
|
637
657
|
|
|
638
658
|
// src/workspace/status-bar.tsx
|
|
639
659
|
import { Zap, FileText, X as X2 } from "lucide-react";
|
|
640
|
-
import { jsx as
|
|
660
|
+
import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
641
661
|
var STATUS_LABELS = {
|
|
642
662
|
connected: { label: "Connected", color: "bg-[var(--code-success)]" },
|
|
643
663
|
connecting: { label: "Connecting\u2026", color: "bg-[var(--code-number)]" },
|
|
@@ -661,7 +681,7 @@ function StatusBar({
|
|
|
661
681
|
),
|
|
662
682
|
children: [
|
|
663
683
|
/* @__PURE__ */ jsxs4("span", { className: "inline-flex items-center gap-1.5 text-muted-foreground", children: [
|
|
664
|
-
/* @__PURE__ */
|
|
684
|
+
/* @__PURE__ */ jsx5("span", { className: cn("w-1.5 h-1.5 rounded-full", statusInfo.color) }),
|
|
665
685
|
statusInfo.label
|
|
666
686
|
] }),
|
|
667
687
|
contextBadges.map((badge) => /* @__PURE__ */ jsxs4(
|
|
@@ -669,26 +689,26 @@ function StatusBar({
|
|
|
669
689
|
{
|
|
670
690
|
className: "inline-flex items-center gap-1 px-2 py-0.5 rounded-[2px] border border-[var(--md3-outline-variant)] text-foreground bg-[var(--border-accent)]/5",
|
|
671
691
|
children: [
|
|
672
|
-
/* @__PURE__ */
|
|
692
|
+
/* @__PURE__ */ jsx5(FileText, { className: "h-3 w-3" }),
|
|
673
693
|
badge.label,
|
|
674
|
-
badge.count !== void 0 && /* @__PURE__ */
|
|
675
|
-
onRemoveBadge && /* @__PURE__ */
|
|
694
|
+
badge.count !== void 0 && /* @__PURE__ */ jsx5("span", { className: "text-muted-foreground", children: badge.count }),
|
|
695
|
+
onRemoveBadge && /* @__PURE__ */ jsx5(
|
|
676
696
|
"button",
|
|
677
697
|
{
|
|
678
698
|
onClick: () => onRemoveBadge(badge.id),
|
|
679
699
|
className: "hover:text-foreground transition-colors",
|
|
680
|
-
children: /* @__PURE__ */
|
|
700
|
+
children: /* @__PURE__ */ jsx5(X2, { className: "h-2.5 w-2.5" })
|
|
681
701
|
}
|
|
682
702
|
)
|
|
683
703
|
]
|
|
684
704
|
},
|
|
685
705
|
badge.id
|
|
686
706
|
)),
|
|
687
|
-
/* @__PURE__ */
|
|
707
|
+
/* @__PURE__ */ jsx5("div", { className: "flex-1" }),
|
|
688
708
|
credits !== void 0 && /* @__PURE__ */ jsxs4("span", { className: "inline-flex items-center gap-1 text-muted-foreground", children: [
|
|
689
|
-
/* @__PURE__ */
|
|
690
|
-
/* @__PURE__ */
|
|
691
|
-
/* @__PURE__ */
|
|
709
|
+
/* @__PURE__ */ jsx5(Zap, { className: "h-3 w-3 shrink-0" }),
|
|
710
|
+
/* @__PURE__ */ jsx5("span", { className: "font-mono tabular-nums", children: credits.toLocaleString() }),
|
|
711
|
+
/* @__PURE__ */ jsx5("span", { children: "credits" })
|
|
692
712
|
] })
|
|
693
713
|
]
|
|
694
714
|
}
|
|
@@ -698,7 +718,7 @@ function StatusBar({
|
|
|
698
718
|
// src/workspace/terminal-panel.tsx
|
|
699
719
|
import { useRef as useRef2, useEffect as useEffect2 } from "react";
|
|
700
720
|
import { Terminal as TerminalIcon, ChevronDown, ChevronUp, X as X3 } from "lucide-react";
|
|
701
|
-
import { jsx as
|
|
721
|
+
import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
702
722
|
var LINE_COLORS = {
|
|
703
723
|
command: "text-[var(--code-function)]",
|
|
704
724
|
stdout: "text-foreground",
|
|
@@ -733,15 +753,15 @@ function TerminalPanel({
|
|
|
733
753
|
onClick: onToggle,
|
|
734
754
|
className: "flex items-center gap-2 w-full px-3 py-1.5 text-xs text-muted-foreground hover:text-foreground transition-colors",
|
|
735
755
|
children: [
|
|
736
|
-
/* @__PURE__ */
|
|
737
|
-
/* @__PURE__ */
|
|
738
|
-
lines.length > 0 && /* @__PURE__ */
|
|
739
|
-
/* @__PURE__ */
|
|
740
|
-
onClose && /* @__PURE__ */
|
|
756
|
+
/* @__PURE__ */ jsx6(TerminalIcon, { className: "h-3.5 w-3.5" }),
|
|
757
|
+
/* @__PURE__ */ jsx6("span", { className: "font-medium", children: title }),
|
|
758
|
+
lines.length > 0 && /* @__PURE__ */ jsx6("span", { className: "px-1.5 py-0.5 rounded-full bg-surface-container-high text-[10px] tabular-nums", children: lines.length }),
|
|
759
|
+
/* @__PURE__ */ jsx6("div", { className: "flex-1" }),
|
|
760
|
+
onClose && /* @__PURE__ */ jsx6(X3, { className: "h-3 w-3 hover:text-foreground", onClick: (e) => {
|
|
741
761
|
e.stopPropagation();
|
|
742
762
|
onClose();
|
|
743
763
|
} }),
|
|
744
|
-
isCollapsed ? /* @__PURE__ */
|
|
764
|
+
isCollapsed ? /* @__PURE__ */ jsx6(ChevronUp, { className: "h-3 w-3" }) : /* @__PURE__ */ jsx6(ChevronDown, { className: "h-3 w-3" })
|
|
745
765
|
]
|
|
746
766
|
}
|
|
747
767
|
),
|
|
@@ -753,10 +773,10 @@ function TerminalPanel({
|
|
|
753
773
|
style: { maxHeight },
|
|
754
774
|
children: [
|
|
755
775
|
lines.map((line) => /* @__PURE__ */ jsxs5("div", { className: cn("whitespace-pre-wrap", LINE_COLORS[line.type]), children: [
|
|
756
|
-
/* @__PURE__ */
|
|
776
|
+
/* @__PURE__ */ jsx6("span", { className: "text-muted-foreground select-none", children: LINE_PREFIXES[line.type] }),
|
|
757
777
|
line.text
|
|
758
778
|
] }, line.id)),
|
|
759
|
-
lines.length === 0 && /* @__PURE__ */
|
|
779
|
+
lines.length === 0 && /* @__PURE__ */ jsx6("div", { className: "text-muted-foreground py-2", children: "No output yet" })
|
|
760
780
|
]
|
|
761
781
|
}
|
|
762
782
|
)
|
|
@@ -764,7 +784,7 @@ function TerminalPanel({
|
|
|
764
784
|
}
|
|
765
785
|
|
|
766
786
|
// src/workspace/runtime-pane.tsx
|
|
767
|
-
import { jsx as
|
|
787
|
+
import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
768
788
|
function RuntimePane({
|
|
769
789
|
title = "Runtime",
|
|
770
790
|
subtitle = "Session state, execution output, and inspection surfaces",
|
|
@@ -786,35 +806,35 @@ function RuntimePane({
|
|
|
786
806
|
),
|
|
787
807
|
children: [
|
|
788
808
|
/* @__PURE__ */ jsxs6("header", { className: "border-b border-[var(--md3-outline-variant)] bg-surface-container-high bg-[linear-gradient(180deg,rgba(255,255,255,0.03),transparent)] px-4 py-3", children: [
|
|
789
|
-
/* @__PURE__ */
|
|
790
|
-
/* @__PURE__ */
|
|
791
|
-
/* @__PURE__ */
|
|
809
|
+
/* @__PURE__ */ jsx7("div", { className: "mb-1 text-[10px] font-semibold uppercase tracking-[0.16em] text-muted-foreground", children: "Sandbox" }),
|
|
810
|
+
/* @__PURE__ */ jsx7("div", { className: "text-sm font-semibold text-foreground", children: title }),
|
|
811
|
+
/* @__PURE__ */ jsx7("div", { className: "mt-1 text-xs text-muted-foreground", children: subtitle })
|
|
792
812
|
] }),
|
|
793
|
-
statusBanner && /* @__PURE__ */
|
|
794
|
-
statusBar && /* @__PURE__ */
|
|
795
|
-
content ? /* @__PURE__ */
|
|
796
|
-
/* @__PURE__ */
|
|
813
|
+
statusBanner && /* @__PURE__ */ jsx7(StatusBanner, { ...statusBanner }),
|
|
814
|
+
statusBar && /* @__PURE__ */ jsx7(StatusBar, { ...statusBar }),
|
|
815
|
+
content ? /* @__PURE__ */ jsx7("div", { className: "min-h-0 flex-1 overflow-hidden", children: content }) : /* @__PURE__ */ jsxs6("div", { className: "grid min-h-0 flex-1 gap-px bg-[var(--md3-outline-variant)] lg:grid-cols-[minmax(0,1.35fr)_minmax(20rem,0.9fr)]", children: [
|
|
816
|
+
/* @__PURE__ */ jsx7("div", { className: "min-h-0 overflow-auto bg-surface-container", children: terminal ? /* @__PURE__ */ jsx7(
|
|
797
817
|
TerminalPanel,
|
|
798
818
|
{
|
|
799
819
|
...terminal,
|
|
800
820
|
className: cn("border-t-0 bg-transparent", terminal.className)
|
|
801
821
|
}
|
|
802
|
-
) : /* @__PURE__ */
|
|
803
|
-
/* @__PURE__ */
|
|
822
|
+
) : /* @__PURE__ */ jsx7("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
|
+
/* @__PURE__ */ jsx7(TerminalSquare, { className: "h-4 w-4" }),
|
|
804
824
|
"No terminal activity yet"
|
|
805
825
|
] }) }) }),
|
|
806
826
|
/* @__PURE__ */ jsxs6("div", { className: "grid min-h-0 gap-px bg-[var(--md3-outline-variant)]", children: [
|
|
807
|
-
/* @__PURE__ */
|
|
808
|
-
/* @__PURE__ */
|
|
827
|
+
/* @__PURE__ */ jsx7("div", { className: "min-h-0 overflow-auto bg-surface-container", children: audit ? audit : /* @__PURE__ */ jsx7("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: [
|
|
828
|
+
/* @__PURE__ */ jsx7(ShieldCheck, { className: "h-4 w-4" }),
|
|
809
829
|
"No audit data available"
|
|
810
830
|
] }) }) }),
|
|
811
|
-
/* @__PURE__ */
|
|
812
|
-
/* @__PURE__ */
|
|
831
|
+
/* @__PURE__ */ jsx7("div", { className: "min-h-0 overflow-auto bg-surface-container", children: inspector ? inspector : /* @__PURE__ */ jsx7("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: [
|
|
832
|
+
/* @__PURE__ */ jsx7(Binary, { className: "h-4 w-4" }),
|
|
813
833
|
"No runtime inspector attached"
|
|
814
834
|
] }) }) })
|
|
815
835
|
] })
|
|
816
836
|
] }),
|
|
817
|
-
footer && /* @__PURE__ */
|
|
837
|
+
footer && /* @__PURE__ */ jsx7("footer", { className: "shrink-0 border-t border-[var(--md3-outline-variant)] bg-surface-container-high px-3 py-2", children: footer })
|
|
818
838
|
]
|
|
819
839
|
}
|
|
820
840
|
);
|
|
@@ -873,7 +893,7 @@ function useOptimisticSessionItems(items, options = {}) {
|
|
|
873
893
|
}
|
|
874
894
|
|
|
875
895
|
// src/workspace/session-sidebar.tsx
|
|
876
|
-
import { jsx as
|
|
896
|
+
import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
877
897
|
var NO_CONTROLLER = {
|
|
878
898
|
add: () => {
|
|
879
899
|
},
|
|
@@ -1056,32 +1076,32 @@ function SessionSidebar({
|
|
|
1056
1076
|
className: cn("relative flex shrink-0 flex-col border-r border-[var(--md3-outline-variant)] bg-surface-container-low", className),
|
|
1057
1077
|
style: { width: resizable ? resize.width : defaultWidth },
|
|
1058
1078
|
children: [
|
|
1059
|
-
/* @__PURE__ */
|
|
1079
|
+
/* @__PURE__ */ jsx8(WorkspacePaneHeader, { children: /* @__PURE__ */ jsxs7("div", { className: "flex w-full items-center justify-between gap-2", children: [
|
|
1060
1080
|
/* @__PURE__ */ jsxs7("div", { className: "flex min-w-0 items-center gap-2", children: [
|
|
1061
|
-
/* @__PURE__ */
|
|
1081
|
+
/* @__PURE__ */ jsx8("div", { className: "flex h-7 w-7 shrink-0 items-center justify-center rounded-[var(--radius-sm)] border border-[var(--border-accent)] bg-[var(--accent-surface-soft)] text-primary", children: /* @__PURE__ */ jsx8(MessageSquareText, { className: "h-3.5 w-3.5" }) }),
|
|
1062
1082
|
/* @__PURE__ */ jsxs7("div", { className: "min-w-0", children: [
|
|
1063
|
-
/* @__PURE__ */
|
|
1064
|
-
subtitle && /* @__PURE__ */
|
|
1083
|
+
/* @__PURE__ */ jsx8("div", { className: "truncate text-sm font-semibold text-foreground", children: title }),
|
|
1084
|
+
subtitle && /* @__PURE__ */ jsx8("div", { className: "truncate text-xs text-muted-foreground", children: subtitle })
|
|
1065
1085
|
] })
|
|
1066
1086
|
] }),
|
|
1067
1087
|
/* @__PURE__ */ jsxs7("div", { className: "flex shrink-0 items-center gap-1.5", children: [
|
|
1068
|
-
runningCount > 0 && /* @__PURE__ */
|
|
1069
|
-
onCreate && /* @__PURE__ */
|
|
1088
|
+
runningCount > 0 && /* @__PURE__ */ jsx8("span", { className: "rounded-full border border-[var(--border-accent)] bg-[var(--accent-surface-soft)] px-1.5 py-px text-xs font-medium text-primary", children: runningCount }),
|
|
1089
|
+
onCreate && /* @__PURE__ */ jsx8(
|
|
1070
1090
|
"button",
|
|
1071
1091
|
{
|
|
1072
1092
|
type: "button",
|
|
1073
1093
|
onClick: onCreate,
|
|
1074
1094
|
title: createLabel,
|
|
1075
1095
|
className: "flex h-7 w-7 items-center justify-center rounded-[var(--radius-sm)] border border-[var(--md3-outline-variant)] text-muted-foreground transition-colors hover:bg-[var(--accent-surface-soft)] hover:text-foreground",
|
|
1076
|
-
children: /* @__PURE__ */
|
|
1096
|
+
children: /* @__PURE__ */ jsx8(Plus, { className: "h-3.5 w-3.5" })
|
|
1077
1097
|
}
|
|
1078
1098
|
)
|
|
1079
1099
|
] })
|
|
1080
1100
|
] }) }),
|
|
1081
1101
|
(enableSearch && items.length > 0 || filters.length > 0) && /* @__PURE__ */ jsxs7("div", { className: "shrink-0 border-b border-[var(--md3-outline-variant)] px-3 py-2.5", children: [
|
|
1082
1102
|
enableSearch && effectiveItems.length > 0 && /* @__PURE__ */ jsxs7("div", { className: "relative", children: [
|
|
1083
|
-
/* @__PURE__ */
|
|
1084
|
-
/* @__PURE__ */
|
|
1103
|
+
/* @__PURE__ */ jsx8(Search2, { className: "pointer-events-none absolute left-2 top-1/2 h-3.5 w-3.5 -translate-y-1/2 text-muted-foreground" }),
|
|
1104
|
+
/* @__PURE__ */ jsx8(
|
|
1085
1105
|
"input",
|
|
1086
1106
|
{
|
|
1087
1107
|
value: query,
|
|
@@ -1092,7 +1112,7 @@ function SessionSidebar({
|
|
|
1092
1112
|
}
|
|
1093
1113
|
)
|
|
1094
1114
|
] }),
|
|
1095
|
-
filters.length > 0 && /* @__PURE__ */
|
|
1115
|
+
filters.length > 0 && /* @__PURE__ */ jsx8("div", { className: cn("flex flex-wrap gap-1", enableSearch && items.length > 0 && "mt-2"), children: filters.map((filter) => {
|
|
1096
1116
|
const isSelected = activeFilterId === filter.id;
|
|
1097
1117
|
return /* @__PURE__ */ jsxs7(
|
|
1098
1118
|
"button",
|
|
@@ -1104,18 +1124,18 @@ function SessionSidebar({
|
|
|
1104
1124
|
isSelected ? "border-[var(--border-accent)] bg-[var(--accent-surface-soft)] text-primary" : "border-[var(--md3-outline-variant)] text-muted-foreground hover:text-foreground"
|
|
1105
1125
|
),
|
|
1106
1126
|
children: [
|
|
1107
|
-
/* @__PURE__ */
|
|
1108
|
-
/* @__PURE__ */
|
|
1127
|
+
/* @__PURE__ */ jsx8("span", { children: filter.label }),
|
|
1128
|
+
/* @__PURE__ */ jsx8("span", { className: "text-[11px] opacity-60", children: filterCounts[filter.id] ?? 0 })
|
|
1109
1129
|
]
|
|
1110
1130
|
},
|
|
1111
1131
|
filter.id
|
|
1112
1132
|
);
|
|
1113
1133
|
}) })
|
|
1114
1134
|
] }),
|
|
1115
|
-
/* @__PURE__ */
|
|
1116
|
-
/* @__PURE__ */
|
|
1117
|
-
/* @__PURE__ */
|
|
1118
|
-
] }) : /* @__PURE__ */
|
|
1135
|
+
/* @__PURE__ */ jsx8("nav", { "aria-label": "Sessions", className: "flex-1 overflow-y-auto px-1.5 py-1.5", children: visibleItems.length === 0 ? /* @__PURE__ */ jsxs7("div", { className: "flex flex-col items-center justify-center gap-2 px-4 py-10 text-center text-sm text-muted-foreground", children: [
|
|
1136
|
+
/* @__PURE__ */ jsx8(MessageSquareText, { className: "h-5 w-5 opacity-50", "aria-hidden": "true" }),
|
|
1137
|
+
/* @__PURE__ */ jsx8("p", { children: query.trim() ? `No sessions match "${query.trim()}".` : emptyMessage })
|
|
1138
|
+
] }) : /* @__PURE__ */ jsx8("ul", { className: "space-y-px", children: visibleItems.map((item) => {
|
|
1119
1139
|
const session = sessionsById.get(item.id) ?? null;
|
|
1120
1140
|
const isActive = currentItemId === item.id;
|
|
1121
1141
|
const status = session?.status ?? item.status;
|
|
@@ -1123,7 +1143,7 @@ function SessionSidebar({
|
|
|
1123
1143
|
...item.isPinned ? [{ id: `${item.id}-pinned`, label: "Pinned", tone: "neutral" }] : [],
|
|
1124
1144
|
...item.badges ?? []
|
|
1125
1145
|
];
|
|
1126
|
-
return /* @__PURE__ */
|
|
1146
|
+
return /* @__PURE__ */ jsx8("li", { className: "animate-row-in", children: /* @__PURE__ */ jsxs7(
|
|
1127
1147
|
"div",
|
|
1128
1148
|
{
|
|
1129
1149
|
className: cn(
|
|
@@ -1145,19 +1165,19 @@ function SessionSidebar({
|
|
|
1145
1165
|
"aria-current": isActive ? "page" : void 0,
|
|
1146
1166
|
className: "min-w-0 flex flex-1 items-center gap-2 text-left",
|
|
1147
1167
|
children: [
|
|
1148
|
-
/* @__PURE__ */
|
|
1168
|
+
/* @__PURE__ */ jsx8("span", { className: cn("h-1.5 w-1.5 shrink-0 rounded-full", statusDot(status)) }),
|
|
1149
1169
|
/* @__PURE__ */ jsxs7("div", { className: "min-w-0 flex-1", children: [
|
|
1150
|
-
/* @__PURE__ */
|
|
1170
|
+
/* @__PURE__ */ jsx8("div", { className: cn(
|
|
1151
1171
|
"truncate text-sm font-medium",
|
|
1152
1172
|
isActive && "text-foreground"
|
|
1153
1173
|
), children: item.title }),
|
|
1154
|
-
item.subtitle && /* @__PURE__ */
|
|
1174
|
+
item.subtitle && /* @__PURE__ */ jsx8("div", { className: "truncate text-xs leading-tight text-muted-foreground", children: item.subtitle })
|
|
1155
1175
|
] })
|
|
1156
1176
|
]
|
|
1157
1177
|
}
|
|
1158
1178
|
),
|
|
1159
1179
|
/* @__PURE__ */ jsxs7("div", { className: "flex shrink-0 items-center gap-1", children: [
|
|
1160
|
-
visibleBadges.length > 0 && visibleBadges.slice(0, 1).map((badge) => /* @__PURE__ */
|
|
1180
|
+
visibleBadges.length > 0 && visibleBadges.slice(0, 1).map((badge) => /* @__PURE__ */ jsx8(
|
|
1161
1181
|
"span",
|
|
1162
1182
|
{
|
|
1163
1183
|
className: cn(
|
|
@@ -1168,8 +1188,8 @@ function SessionSidebar({
|
|
|
1168
1188
|
},
|
|
1169
1189
|
badge.id
|
|
1170
1190
|
)),
|
|
1171
|
-
session?.isForeground && /* @__PURE__ */
|
|
1172
|
-
renderItemActions ? /* @__PURE__ */
|
|
1191
|
+
session?.isForeground && /* @__PURE__ */ jsx8("span", { className: "h-1.5 w-1.5 rounded-full bg-[var(--status-running)]", title: "Live" }),
|
|
1192
|
+
renderItemActions ? /* @__PURE__ */ jsx8(
|
|
1173
1193
|
"div",
|
|
1174
1194
|
{
|
|
1175
1195
|
className: "opacity-0 transition-opacity group-hover:opacity-100",
|
|
@@ -1182,8 +1202,8 @@ function SessionSidebar({
|
|
|
1182
1202
|
}
|
|
1183
1203
|
) }, item.id);
|
|
1184
1204
|
}) }) }),
|
|
1185
|
-
activityMonitor && /* @__PURE__ */
|
|
1186
|
-
links.length > 0 && /* @__PURE__ */
|
|
1205
|
+
activityMonitor && /* @__PURE__ */ jsx8("div", { className: "border-t border-[var(--md3-outline-variant)] px-2 py-1.5", children: activityMonitor }),
|
|
1206
|
+
links.length > 0 && /* @__PURE__ */ jsx8("nav", { "aria-label": "Workspace sections", className: "border-t border-[var(--md3-outline-variant)] px-1.5 py-1.5", children: /* @__PURE__ */ jsx8("div", { className: "space-y-px", children: links.map((link) => {
|
|
1187
1207
|
const Icon = iconForLink(link.icon);
|
|
1188
1208
|
return /* @__PURE__ */ jsxs7(
|
|
1189
1209
|
"button",
|
|
@@ -1198,14 +1218,14 @@ function SessionSidebar({
|
|
|
1198
1218
|
},
|
|
1199
1219
|
className: "flex w-full items-center gap-2 rounded-[var(--radius-sm)] px-3 py-2 text-left text-sm text-muted-foreground transition-colors hover:bg-accent/30 hover:text-foreground",
|
|
1200
1220
|
children: [
|
|
1201
|
-
/* @__PURE__ */
|
|
1202
|
-
/* @__PURE__ */
|
|
1221
|
+
/* @__PURE__ */ jsx8(Icon, { className: "h-4 w-4 shrink-0" }),
|
|
1222
|
+
/* @__PURE__ */ jsx8("span", { className: "truncate", children: link.label })
|
|
1203
1223
|
]
|
|
1204
1224
|
},
|
|
1205
1225
|
link.id
|
|
1206
1226
|
);
|
|
1207
1227
|
}) }) }),
|
|
1208
|
-
resizable && /* @__PURE__ */
|
|
1228
|
+
resizable && /* @__PURE__ */ jsx8(
|
|
1209
1229
|
"div",
|
|
1210
1230
|
{
|
|
1211
1231
|
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",
|
|
@@ -1241,18 +1261,18 @@ import {
|
|
|
1241
1261
|
useProjectActivity,
|
|
1242
1262
|
useTotalRunningSessions
|
|
1243
1263
|
} from "@tangle-network/ui/stores";
|
|
1244
|
-
import { jsx as
|
|
1264
|
+
import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
1245
1265
|
function SessionStatusDot({ session }) {
|
|
1246
1266
|
if (session.status === "error") {
|
|
1247
|
-
return /* @__PURE__ */
|
|
1267
|
+
return /* @__PURE__ */ jsx9(AlertCircle2, { className: "h-3 w-3 text-[var(--surface-danger-text)]" });
|
|
1248
1268
|
}
|
|
1249
1269
|
if (session.status === "running") {
|
|
1250
|
-
return /* @__PURE__ */
|
|
1270
|
+
return /* @__PURE__ */ jsx9(LoaderCircle, { className: "h-3 w-3 animate-spin text-primary" });
|
|
1251
1271
|
}
|
|
1252
1272
|
if (session.status === "attention-needed") {
|
|
1253
|
-
return /* @__PURE__ */
|
|
1273
|
+
return /* @__PURE__ */ jsx9(Activity, { className: "h-3 w-3 text-[var(--surface-warning-text)]" });
|
|
1254
1274
|
}
|
|
1255
|
-
return /* @__PURE__ */
|
|
1275
|
+
return /* @__PURE__ */ jsx9("span", { className: "h-1.5 w-1.5 rounded-full bg-muted-foreground/40" });
|
|
1256
1276
|
}
|
|
1257
1277
|
function navigateToSession(session) {
|
|
1258
1278
|
if (!session.href || typeof window === "undefined") return;
|
|
@@ -1272,17 +1292,17 @@ function SessionActivityMonitor({
|
|
|
1272
1292
|
const sessionLookup = Object.keys(sessionsById).length > 0 ? sessionsById : Object.fromEntries(trackedSessions.map((session) => [session.sessionId, session]));
|
|
1273
1293
|
if (projectActivity.length === 0) {
|
|
1274
1294
|
if (compact) return null;
|
|
1275
|
-
return /* @__PURE__ */
|
|
1295
|
+
return /* @__PURE__ */ jsx9("div", { className: cn("rounded-[var(--radius-lg)] border border-[var(--md3-outline-variant)] bg-surface-container-high px-3 py-2.5 text-xs text-muted-foreground", className), children: emptyMessage });
|
|
1276
1296
|
}
|
|
1277
1297
|
return /* @__PURE__ */ jsxs8("div", { className: cn("space-y-1.5", className), children: [
|
|
1278
1298
|
/* @__PURE__ */ jsxs8("div", { className: "flex items-center justify-between", children: [
|
|
1279
1299
|
/* @__PURE__ */ jsxs8("span", { className: "flex items-center gap-1.5 text-[10px] font-medium uppercase tracking-wider text-muted-foreground", children: [
|
|
1280
|
-
/* @__PURE__ */
|
|
1300
|
+
/* @__PURE__ */ jsx9(Activity, { className: "h-3 w-3" }),
|
|
1281
1301
|
"Active"
|
|
1282
1302
|
] }),
|
|
1283
|
-
totalRunning > 0 && /* @__PURE__ */
|
|
1303
|
+
totalRunning > 0 && /* @__PURE__ */ jsx9("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 })
|
|
1284
1304
|
] }),
|
|
1285
|
-
/* @__PURE__ */
|
|
1305
|
+
/* @__PURE__ */ jsx9("div", { className: "space-y-1", children: projectActivity.map((project) => {
|
|
1286
1306
|
const label = resolveProjectLabel?.(project.projectId, project.projectLabel) ?? project.projectLabel ?? String(project.projectId);
|
|
1287
1307
|
return /* @__PURE__ */ jsxs8(
|
|
1288
1308
|
"div",
|
|
@@ -1291,7 +1311,7 @@ function SessionActivityMonitor({
|
|
|
1291
1311
|
children: [
|
|
1292
1312
|
/* @__PURE__ */ jsxs8("div", { className: "flex items-center justify-between gap-2 px-2.5 py-1.5", children: [
|
|
1293
1313
|
/* @__PURE__ */ jsxs8("div", { className: "min-w-0", children: [
|
|
1294
|
-
/* @__PURE__ */
|
|
1314
|
+
/* @__PURE__ */ jsx9("div", { className: "truncate text-xs font-medium text-foreground", children: label }),
|
|
1295
1315
|
/* @__PURE__ */ jsxs8("div", { className: "text-[10px] text-muted-foreground", children: [
|
|
1296
1316
|
project.activeSessionCount,
|
|
1297
1317
|
" session",
|
|
@@ -1303,7 +1323,7 @@ function SessionActivityMonitor({
|
|
|
1303
1323
|
" live"
|
|
1304
1324
|
] })
|
|
1305
1325
|
] }),
|
|
1306
|
-
!compact && project.runningSessionIds.length > 0 && /* @__PURE__ */
|
|
1326
|
+
!compact && project.runningSessionIds.length > 0 && /* @__PURE__ */ jsx9("div", { className: "border-t border-[var(--md3-outline-variant)] bg-surface-container-high px-1 py-0.5", children: project.runningSessionIds.map((sessionId) => {
|
|
1307
1327
|
const session = sessionLookup[sessionId];
|
|
1308
1328
|
if (!session) return null;
|
|
1309
1329
|
return /* @__PURE__ */ jsxs8(
|
|
@@ -1319,9 +1339,9 @@ function SessionActivityMonitor({
|
|
|
1319
1339
|
},
|
|
1320
1340
|
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)]",
|
|
1321
1341
|
children: [
|
|
1322
|
-
/* @__PURE__ */
|
|
1323
|
-
/* @__PURE__ */
|
|
1324
|
-
/* @__PURE__ */
|
|
1342
|
+
/* @__PURE__ */ jsx9(SessionStatusDot, { session }),
|
|
1343
|
+
/* @__PURE__ */ jsx9("span", { className: "min-w-0 truncate text-xs text-muted-foreground", children: session.title ?? "Untitled" }),
|
|
1344
|
+
/* @__PURE__ */ jsx9(MessageSquareText2, { className: "ml-auto h-3 w-3 shrink-0 text-muted-foreground" })
|
|
1325
1345
|
]
|
|
1326
1346
|
},
|
|
1327
1347
|
sessionId
|
|
@@ -1353,7 +1373,7 @@ import { ChatContainer } from "@tangle-network/ui/chat";
|
|
|
1353
1373
|
import { FileArtifactPane } from "@tangle-network/ui/files";
|
|
1354
1374
|
import { OpenUIArtifactRenderer } from "@tangle-network/ui/openui";
|
|
1355
1375
|
import { ArtifactPane as ArtifactPane2 } from "@tangle-network/ui/primitives";
|
|
1356
|
-
import { jsx as
|
|
1376
|
+
import { jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
1357
1377
|
function getArtifactTabIcon(kind) {
|
|
1358
1378
|
switch (kind) {
|
|
1359
1379
|
case "file":
|
|
@@ -1378,7 +1398,7 @@ function ArtifactTabs({
|
|
|
1378
1398
|
onClose
|
|
1379
1399
|
}) {
|
|
1380
1400
|
if (artifacts.length === 0) return null;
|
|
1381
|
-
return /* @__PURE__ */
|
|
1401
|
+
return /* @__PURE__ */ jsx10("div", { className: "flex items-center overflow-x-auto border-b border-[var(--md3-outline-variant)] bg-surface-container-high", children: artifacts.map((artifact) => {
|
|
1382
1402
|
const Icon = getArtifactTabIcon(artifact.kind);
|
|
1383
1403
|
const isActive = artifact.id === activeArtifactId;
|
|
1384
1404
|
return /* @__PURE__ */ jsxs9(
|
|
@@ -1396,19 +1416,19 @@ function ArtifactTabs({
|
|
|
1396
1416
|
onClick: () => onSelect(artifact.id),
|
|
1397
1417
|
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",
|
|
1398
1418
|
children: [
|
|
1399
|
-
/* @__PURE__ */
|
|
1400
|
-
/* @__PURE__ */
|
|
1419
|
+
/* @__PURE__ */ jsx10(Icon, { className: "h-3.5 w-3.5 shrink-0" }),
|
|
1420
|
+
/* @__PURE__ */ jsx10("span", { className: "max-w-[14rem] truncate", children: artifactTabLabel(artifact) })
|
|
1401
1421
|
]
|
|
1402
1422
|
}
|
|
1403
1423
|
),
|
|
1404
|
-
onClose && /* @__PURE__ */
|
|
1424
|
+
onClose && /* @__PURE__ */ jsx10(
|
|
1405
1425
|
"button",
|
|
1406
1426
|
{
|
|
1407
1427
|
type: "button",
|
|
1408
1428
|
"aria-label": `Close ${artifactTabLabel(artifact)}`,
|
|
1409
1429
|
onClick: () => onClose(artifact.id),
|
|
1410
1430
|
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",
|
|
1411
|
-
children: /* @__PURE__ */
|
|
1431
|
+
children: /* @__PURE__ */ jsx10(X4, { className: "h-3 w-3" })
|
|
1412
1432
|
}
|
|
1413
1433
|
)
|
|
1414
1434
|
]
|
|
@@ -1420,7 +1440,7 @@ function ArtifactTabs({
|
|
|
1420
1440
|
function renderArtifact(artifact) {
|
|
1421
1441
|
switch (artifact.kind) {
|
|
1422
1442
|
case "file":
|
|
1423
|
-
return /* @__PURE__ */
|
|
1443
|
+
return /* @__PURE__ */ jsx10(
|
|
1424
1444
|
FileArtifactPane,
|
|
1425
1445
|
{
|
|
1426
1446
|
path: artifact.path,
|
|
@@ -1440,7 +1460,7 @@ function renderArtifact(artifact) {
|
|
|
1440
1460
|
}
|
|
1441
1461
|
);
|
|
1442
1462
|
case "markdown":
|
|
1443
|
-
return /* @__PURE__ */
|
|
1463
|
+
return /* @__PURE__ */ jsx10(
|
|
1444
1464
|
ArtifactPane2,
|
|
1445
1465
|
{
|
|
1446
1466
|
eyebrow: artifact.eyebrow ?? "Document",
|
|
@@ -1450,11 +1470,11 @@ function renderArtifact(artifact) {
|
|
|
1450
1470
|
headerActions: artifact.headerActions,
|
|
1451
1471
|
toolbar: artifact.toolbar,
|
|
1452
1472
|
footer: artifact.footer,
|
|
1453
|
-
children: /* @__PURE__ */
|
|
1473
|
+
children: /* @__PURE__ */ jsx10("div", { className: "p-5", children: /* @__PURE__ */ jsx10(Markdown, { className: "prose-sm max-w-none", children: artifact.content }) })
|
|
1454
1474
|
}
|
|
1455
1475
|
);
|
|
1456
1476
|
case "openui":
|
|
1457
|
-
return /* @__PURE__ */
|
|
1477
|
+
return /* @__PURE__ */ jsx10(
|
|
1458
1478
|
ArtifactPane2,
|
|
1459
1479
|
{
|
|
1460
1480
|
eyebrow: artifact.eyebrow ?? "Structured Artifact",
|
|
@@ -1464,11 +1484,11 @@ function renderArtifact(artifact) {
|
|
|
1464
1484
|
headerActions: artifact.headerActions,
|
|
1465
1485
|
toolbar: artifact.toolbar,
|
|
1466
1486
|
footer: artifact.footer,
|
|
1467
|
-
children: /* @__PURE__ */
|
|
1487
|
+
children: /* @__PURE__ */ jsx10(OpenUIArtifactRenderer, { schema: artifact.schema, onAction: artifact.onAction })
|
|
1468
1488
|
}
|
|
1469
1489
|
);
|
|
1470
1490
|
case "custom":
|
|
1471
|
-
return /* @__PURE__ */
|
|
1491
|
+
return /* @__PURE__ */ jsx10(
|
|
1472
1492
|
ArtifactPane2,
|
|
1473
1493
|
{
|
|
1474
1494
|
eyebrow: artifact.eyebrow ?? "Artifact",
|
|
@@ -1490,17 +1510,17 @@ function regionHeader(sections, fallback) {
|
|
|
1490
1510
|
switch (sections[0]?.key) {
|
|
1491
1511
|
case "directory":
|
|
1492
1512
|
return /* @__PURE__ */ jsxs9("div", { className: "flex items-center gap-2 text-xs font-semibold uppercase tracking-[0.12em] text-muted-foreground", children: [
|
|
1493
|
-
/* @__PURE__ */
|
|
1513
|
+
/* @__PURE__ */ jsx10(FolderTree2, { className: "h-3.5 w-3.5" }),
|
|
1494
1514
|
"Directory"
|
|
1495
1515
|
] });
|
|
1496
1516
|
case "artifacts":
|
|
1497
1517
|
return /* @__PURE__ */ jsxs9("div", { className: "flex items-center gap-2 text-xs font-semibold uppercase tracking-[0.12em] text-muted-foreground", children: [
|
|
1498
|
-
/* @__PURE__ */
|
|
1518
|
+
/* @__PURE__ */ jsx10(LayoutPanelTop, { className: "h-3.5 w-3.5" }),
|
|
1499
1519
|
"Artifacts"
|
|
1500
1520
|
] });
|
|
1501
1521
|
case "runtime":
|
|
1502
1522
|
return /* @__PURE__ */ jsxs9("div", { className: "flex items-center gap-2 text-xs font-semibold uppercase tracking-[0.12em] text-muted-foreground", children: [
|
|
1503
|
-
/* @__PURE__ */
|
|
1523
|
+
/* @__PURE__ */ jsx10(Bot, { className: "h-3.5 w-3.5" }),
|
|
1504
1524
|
"Runtime"
|
|
1505
1525
|
] });
|
|
1506
1526
|
default:
|
|
@@ -1510,14 +1530,14 @@ function regionHeader(sections, fallback) {
|
|
|
1510
1530
|
function renderRegion(sections, region) {
|
|
1511
1531
|
if (sections.length === 0) return void 0;
|
|
1512
1532
|
if (sections.length === 1) return sections[0]?.content;
|
|
1513
|
-
return /* @__PURE__ */
|
|
1533
|
+
return /* @__PURE__ */ jsx10(
|
|
1514
1534
|
"div",
|
|
1515
1535
|
{
|
|
1516
1536
|
className: cn(
|
|
1517
1537
|
"flex min-h-0 h-full gap-3 p-3",
|
|
1518
1538
|
region === "bottom" ? "flex-col" : "flex-col"
|
|
1519
1539
|
),
|
|
1520
|
-
children: sections.map((section) => /* @__PURE__ */
|
|
1540
|
+
children: sections.map((section) => /* @__PURE__ */ jsx10("div", { className: "min-h-0 flex-1 overflow-hidden", children: section.content }, section.key))
|
|
1521
1541
|
}
|
|
1522
1542
|
);
|
|
1523
1543
|
}
|
|
@@ -1560,9 +1580,9 @@ function SandboxWorkbench({
|
|
|
1560
1580
|
};
|
|
1561
1581
|
const centerHeader = /* @__PURE__ */ jsxs9("div", { className: "flex min-w-0 items-start justify-between gap-4 rounded-[var(--radius-xl)] border border-[var(--md3-outline-variant)] bg-surface-container px-4 py-3.5", children: [
|
|
1562
1582
|
/* @__PURE__ */ jsxs9("div", { className: "min-w-0", children: [
|
|
1563
|
-
/* @__PURE__ */
|
|
1564
|
-
/* @__PURE__ */
|
|
1565
|
-
subtitle && /* @__PURE__ */
|
|
1583
|
+
/* @__PURE__ */ jsx10("div", { className: "text-[10px] font-semibold uppercase tracking-[0.18em] text-primary", children: "Tangle Sandbox" }),
|
|
1584
|
+
/* @__PURE__ */ jsx10("div", { className: "truncate text-[17px] font-semibold tracking-[0.01em] text-foreground", children: title }),
|
|
1585
|
+
subtitle && /* @__PURE__ */ jsx10("div", { className: "truncate text-sm text-muted-foreground", children: subtitle })
|
|
1566
1586
|
] }),
|
|
1567
1587
|
/* @__PURE__ */ jsxs9("div", { className: "flex shrink-0 flex-wrap items-center justify-end gap-2", children: [
|
|
1568
1588
|
status,
|
|
@@ -1573,7 +1593,7 @@ function SandboxWorkbench({
|
|
|
1573
1593
|
] })
|
|
1574
1594
|
] });
|
|
1575
1595
|
const { composerControls, ...chatSession } = session;
|
|
1576
|
-
const center = /* @__PURE__ */
|
|
1596
|
+
const center = /* @__PURE__ */ jsx10(
|
|
1577
1597
|
ArtifactPane2,
|
|
1578
1598
|
{
|
|
1579
1599
|
eyebrow: session.eyebrow ?? "Agent Session",
|
|
@@ -1584,7 +1604,7 @@ function SandboxWorkbench({
|
|
|
1584
1604
|
className: "h-full",
|
|
1585
1605
|
contentClassName: "bg-surface-container",
|
|
1586
1606
|
children: /* @__PURE__ */ jsxs9("div", { className: "flex h-full min-h-0 flex-col", children: [
|
|
1587
|
-
/* @__PURE__ */
|
|
1607
|
+
/* @__PURE__ */ jsx10(
|
|
1588
1608
|
ChatContainer,
|
|
1589
1609
|
{
|
|
1590
1610
|
...chatSession,
|
|
@@ -1592,12 +1612,12 @@ function SandboxWorkbench({
|
|
|
1592
1612
|
presentation: session.presentation ?? "timeline"
|
|
1593
1613
|
}
|
|
1594
1614
|
),
|
|
1595
|
-
composerControls && /* @__PURE__ */
|
|
1615
|
+
composerControls && /* @__PURE__ */ jsx10("div", { className: "shrink-0 border-t border-[var(--md3-outline-variant)] bg-surface-container-high px-3 py-2", children: composerControls })
|
|
1596
1616
|
] })
|
|
1597
1617
|
}
|
|
1598
1618
|
);
|
|
1599
1619
|
const artifactPanel = artifacts.length > 0 ? /* @__PURE__ */ jsxs9("section", { className: "flex h-full min-h-0 flex-col bg-surface-container", children: [
|
|
1600
|
-
/* @__PURE__ */
|
|
1620
|
+
/* @__PURE__ */ jsx10(
|
|
1601
1621
|
ArtifactTabs,
|
|
1602
1622
|
{
|
|
1603
1623
|
artifacts,
|
|
@@ -1606,10 +1626,10 @@ function SandboxWorkbench({
|
|
|
1606
1626
|
onClose: onArtifactClose
|
|
1607
1627
|
}
|
|
1608
1628
|
),
|
|
1609
|
-
/* @__PURE__ */
|
|
1629
|
+
/* @__PURE__ */ jsx10("div", { className: "min-h-0 flex-1 overflow-auto bg-surface-container", children: activeArtifact ? renderArtifact(activeArtifact) : /* @__PURE__ */ jsx10("div", { className: "flex h-full items-center justify-center p-6", children: emptyArtifactState ?? /* @__PURE__ */ jsx10(
|
|
1610
1630
|
EmptyState2,
|
|
1611
1631
|
{
|
|
1612
|
-
icon: /* @__PURE__ */
|
|
1632
|
+
icon: /* @__PURE__ */ jsx10(Boxes, { className: "h-8 w-8" }),
|
|
1613
1633
|
title: "No artifact selected",
|
|
1614
1634
|
description: "Select a generated artifact, file preview, or OpenUI panel to inspect it here."
|
|
1615
1635
|
}
|
|
@@ -1626,7 +1646,7 @@ function SandboxWorkbench({
|
|
|
1626
1646
|
if (directory && directoryPlacement !== "hidden") {
|
|
1627
1647
|
regionSections[directoryPlacement].push({
|
|
1628
1648
|
key: "directory",
|
|
1629
|
-
content: /* @__PURE__ */
|
|
1649
|
+
content: /* @__PURE__ */ jsx10(DirectoryPane, { ...directory, className: "h-full" })
|
|
1630
1650
|
});
|
|
1631
1651
|
}
|
|
1632
1652
|
if (artifactPanel && artifactPlacement !== "hidden") {
|
|
@@ -1638,14 +1658,14 @@ function SandboxWorkbench({
|
|
|
1638
1658
|
if (runtime && runtimePlacement !== "hidden") {
|
|
1639
1659
|
regionSections[runtimePlacement].push({
|
|
1640
1660
|
key: "runtime",
|
|
1641
|
-
content: /* @__PURE__ */
|
|
1661
|
+
content: /* @__PURE__ */ jsx10(RuntimePane, { ...runtime, className: "h-full" })
|
|
1642
1662
|
});
|
|
1643
1663
|
}
|
|
1644
1664
|
const left = renderRegion(regionSections.left, "left");
|
|
1645
1665
|
const right = renderRegion(regionSections.right, "right");
|
|
1646
1666
|
const bottom = renderRegion(regionSections.bottom, "bottom");
|
|
1647
|
-
const genericPanelsHeader = /* @__PURE__ */
|
|
1648
|
-
return /* @__PURE__ */
|
|
1667
|
+
const genericPanelsHeader = /* @__PURE__ */ jsx10("span", { className: "text-xs font-semibold uppercase tracking-[0.12em] text-muted-foreground", children: "Workspace Panels" });
|
|
1668
|
+
return /* @__PURE__ */ jsx10(
|
|
1649
1669
|
WorkspaceLayout,
|
|
1650
1670
|
{
|
|
1651
1671
|
left,
|
|
@@ -1674,7 +1694,7 @@ function SandboxWorkbench({
|
|
|
1674
1694
|
);
|
|
1675
1695
|
}
|
|
1676
1696
|
function AgentWorkbench(props) {
|
|
1677
|
-
return /* @__PURE__ */
|
|
1697
|
+
return /* @__PURE__ */ jsx10(
|
|
1678
1698
|
SandboxWorkbench,
|
|
1679
1699
|
{
|
|
1680
1700
|
...props,
|
|
@@ -1682,7 +1702,7 @@ function AgentWorkbench(props) {
|
|
|
1682
1702
|
...props.session,
|
|
1683
1703
|
eyebrow: props.session.eyebrow ?? "Agent Session",
|
|
1684
1704
|
title: props.session.title ?? /* @__PURE__ */ jsxs9("span", { className: "inline-flex items-center gap-2", children: [
|
|
1685
|
-
/* @__PURE__ */
|
|
1705
|
+
/* @__PURE__ */ jsx10(Bot, { className: "h-4 w-4 text-primary" }),
|
|
1686
1706
|
"Execution timeline"
|
|
1687
1707
|
] })
|
|
1688
1708
|
}
|
|
@@ -1693,13 +1713,13 @@ function AgentWorkbench(props) {
|
|
|
1693
1713
|
// src/workspace/audit-results.tsx
|
|
1694
1714
|
import { useState as useState6 } from "react";
|
|
1695
1715
|
import { CheckCircle as CheckCircle2, XCircle, ChevronRight, Shield } from "lucide-react";
|
|
1696
|
-
import { jsx as
|
|
1716
|
+
import { jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
1697
1717
|
function AuditResults({ forms, crossFormChecks = [], overallScore, className }) {
|
|
1698
1718
|
const totalPassed = forms.reduce((s, f) => s + f.passed, 0);
|
|
1699
1719
|
const totalChecks = forms.reduce((s, f) => s + f.passed + f.failed, 0);
|
|
1700
1720
|
return /* @__PURE__ */ jsxs10("div", { className: cn("space-y-3 p-3", className), children: [
|
|
1701
1721
|
/* @__PURE__ */ jsxs10("div", { className: "flex items-center gap-3 px-3 py-2 rounded-[var(--radius-md)] bg-surface-container-high border border-[var(--md3-outline-variant)]", children: [
|
|
1702
|
-
/* @__PURE__ */
|
|
1722
|
+
/* @__PURE__ */ jsx11(Shield, { className: cn("h-5 w-5", totalChecks === totalPassed ? "text-[var(--code-success)]" : "text-[var(--code-number)]") }),
|
|
1703
1723
|
/* @__PURE__ */ jsxs10("div", { children: [
|
|
1704
1724
|
/* @__PURE__ */ jsxs10("div", { className: "text-sm font-semibold text-foreground", children: [
|
|
1705
1725
|
totalPassed,
|
|
@@ -1714,10 +1734,10 @@ function AuditResults({ forms, crossFormChecks = [], overallScore, className })
|
|
|
1714
1734
|
] })
|
|
1715
1735
|
] })
|
|
1716
1736
|
] }),
|
|
1717
|
-
forms.map((form) => /* @__PURE__ */
|
|
1737
|
+
forms.map((form) => /* @__PURE__ */ jsx11(FormAuditCard, { form }, form.formId)),
|
|
1718
1738
|
crossFormChecks.length > 0 && /* @__PURE__ */ jsxs10("div", { children: [
|
|
1719
|
-
/* @__PURE__ */
|
|
1720
|
-
crossFormChecks.map((check, i) => /* @__PURE__ */
|
|
1739
|
+
/* @__PURE__ */ jsx11("div", { className: "text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-1", children: "Cross-Form Checks" }),
|
|
1740
|
+
crossFormChecks.map((check, i) => /* @__PURE__ */ jsx11(CheckRow, { check }, i))
|
|
1721
1741
|
] })
|
|
1722
1742
|
] });
|
|
1723
1743
|
}
|
|
@@ -1731,25 +1751,25 @@ function FormAuditCard({ form }) {
|
|
|
1731
1751
|
onClick: () => setExpanded(!expanded),
|
|
1732
1752
|
className: "flex items-center gap-2 w-full px-3 py-2 text-left hover:bg-accent transition-colors",
|
|
1733
1753
|
children: [
|
|
1734
|
-
allPassed ? /* @__PURE__ */
|
|
1735
|
-
/* @__PURE__ */
|
|
1754
|
+
allPassed ? /* @__PURE__ */ jsx11(CheckCircle2, { className: "h-4 w-4 text-[var(--code-success)] shrink-0" }) : !form.found ? /* @__PURE__ */ jsx11(XCircle, { className: "h-4 w-4 text-[var(--code-error)] shrink-0" }) : /* @__PURE__ */ jsx11(XCircle, { className: "h-4 w-4 text-[var(--code-number)] shrink-0" }),
|
|
1755
|
+
/* @__PURE__ */ jsx11("span", { className: "text-sm font-medium text-foreground flex-1", children: form.formName || form.formId }),
|
|
1736
1756
|
/* @__PURE__ */ jsxs10("span", { className: cn("text-xs tabular-nums", allPassed ? "text-[var(--code-success)]" : "text-muted-foreground"), children: [
|
|
1737
1757
|
form.passed,
|
|
1738
1758
|
"/",
|
|
1739
1759
|
form.passed + form.failed
|
|
1740
1760
|
] }),
|
|
1741
|
-
/* @__PURE__ */
|
|
1761
|
+
/* @__PURE__ */ jsx11(ChevronRight, { className: cn("h-3 w-3 text-muted-foreground transition-transform", expanded && "rotate-90") })
|
|
1742
1762
|
]
|
|
1743
1763
|
}
|
|
1744
1764
|
),
|
|
1745
|
-
expanded && /* @__PURE__ */
|
|
1765
|
+
expanded && /* @__PURE__ */ jsx11("div", { className: "border-t border-[var(--md3-outline-variant)] px-3 py-1.5 space-y-0.5", children: form.checks.map((check, i) => /* @__PURE__ */ jsx11(CheckRow, { check }, i)) })
|
|
1746
1766
|
] });
|
|
1747
1767
|
}
|
|
1748
1768
|
function CheckRow({ check }) {
|
|
1749
1769
|
return /* @__PURE__ */ jsxs10("div", { className: "flex items-center gap-2 py-1 text-xs", children: [
|
|
1750
|
-
check.passed ? /* @__PURE__ */
|
|
1751
|
-
/* @__PURE__ */
|
|
1752
|
-
/* @__PURE__ */
|
|
1770
|
+
check.passed ? /* @__PURE__ */ jsx11(CheckCircle2, { className: "h-3 w-3 text-[var(--code-success)] shrink-0" }) : /* @__PURE__ */ jsx11(XCircle, { className: "h-3 w-3 text-[var(--code-error)] shrink-0" }),
|
|
1771
|
+
/* @__PURE__ */ jsx11("span", { className: "text-foreground flex-1 truncate", children: check.label }),
|
|
1772
|
+
/* @__PURE__ */ jsx11("span", { className: "text-muted-foreground tabular-nums shrink-0", children: check.passed ? String(check.actual ?? check.expected) : `${check.actual ?? "missing"} \u2260 ${check.expected}` })
|
|
1753
1773
|
] });
|
|
1754
1774
|
}
|
|
1755
1775
|
|
|
@@ -1757,7 +1777,7 @@ function CheckRow({ check }) {
|
|
|
1757
1777
|
import {
|
|
1758
1778
|
useMemo as useMemo5
|
|
1759
1779
|
} from "react";
|
|
1760
|
-
import { Fragment as Fragment2, jsx as
|
|
1780
|
+
import { Fragment as Fragment2, jsx as jsx12, jsxs as jsxs11 } from "react/jsx-runtime";
|
|
1761
1781
|
var INTERACTIVE_SELECTOR = 'button, a, input, textarea, select, [role="button"], [role="link"]';
|
|
1762
1782
|
function TaskBoard({
|
|
1763
1783
|
items,
|
|
@@ -1785,7 +1805,7 @@ function TaskBoard({
|
|
|
1785
1805
|
}, [items, columns]);
|
|
1786
1806
|
return /* @__PURE__ */ jsxs11("div", { className: cn("flex flex-1 flex-col overflow-hidden", className), children: [
|
|
1787
1807
|
header,
|
|
1788
|
-
/* @__PURE__ */
|
|
1808
|
+
/* @__PURE__ */ jsx12("div", { className: "flex flex-1 gap-3 overflow-x-auto p-4", children: columns.map((col) => {
|
|
1789
1809
|
const colItems = grouped.get(col.id) ?? [];
|
|
1790
1810
|
const itemCards = /* @__PURE__ */ jsxs11(Fragment2, { children: [
|
|
1791
1811
|
colItems.length === 0 && columnEmptyState,
|
|
@@ -1811,12 +1831,12 @@ function TaskBoard({
|
|
|
1811
1831
|
},
|
|
1812
1832
|
className: "group w-full rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container-high p-3 text-left transition-colors hover:border-accent/50",
|
|
1813
1833
|
children: [
|
|
1814
|
-
/* @__PURE__ */
|
|
1815
|
-
item.description && /* @__PURE__ */
|
|
1834
|
+
/* @__PURE__ */ jsx12("p", { className: "text-sm font-medium text-foreground", children: item.title }),
|
|
1835
|
+
item.description && /* @__PURE__ */ jsx12("p", { className: "mt-1 text-xs text-muted-foreground line-clamp-2", children: item.description }),
|
|
1816
1836
|
(item.priority || item.tags?.length) && /* @__PURE__ */ jsxs11("div", { className: "mt-2 flex flex-wrap gap-1.5", children: [
|
|
1817
|
-
item.priority && (renderBadge ? renderBadge(item.priority, "priority") : /* @__PURE__ */
|
|
1837
|
+
item.priority && (renderBadge ? renderBadge(item.priority, "priority") : /* @__PURE__ */ jsx12("span", { className: "rounded-full border border-[var(--md3-outline-variant)] px-2 py-0.5 text-[10px] font-medium text-muted-foreground", children: item.priority })),
|
|
1818
1838
|
item.tags?.map(
|
|
1819
|
-
(tag) => renderBadge ? /* @__PURE__ */
|
|
1839
|
+
(tag) => renderBadge ? /* @__PURE__ */ jsx12("span", { children: renderBadge(tag, "tag") }, tag) : /* @__PURE__ */ jsx12(
|
|
1820
1840
|
"span",
|
|
1821
1841
|
{
|
|
1822
1842
|
className: "rounded-full border border-[var(--md3-outline-variant)] px-2 py-0.5 text-[10px] text-muted-foreground",
|
|
@@ -1831,10 +1851,10 @@ function TaskBoard({
|
|
|
1831
1851
|
},
|
|
1832
1852
|
item.id
|
|
1833
1853
|
);
|
|
1834
|
-
return renderItemWrapper ? /* @__PURE__ */
|
|
1854
|
+
return renderItemWrapper ? /* @__PURE__ */ jsx12("span", { children: renderItemWrapper(item, index, card) }, item.id) : card;
|
|
1835
1855
|
})
|
|
1836
1856
|
] });
|
|
1837
|
-
const columnBody = /* @__PURE__ */
|
|
1857
|
+
const columnBody = /* @__PURE__ */ jsx12("div", { className: "flex flex-1 flex-col gap-2 overflow-y-auto px-2 pb-2 min-h-[80px]", children: renderColumnBody ? renderColumnBody(col.id, itemCards, colItems) : itemCards });
|
|
1838
1858
|
return /* @__PURE__ */ jsxs11(
|
|
1839
1859
|
"div",
|
|
1840
1860
|
{
|
|
@@ -1845,8 +1865,8 @@ function TaskBoard({
|
|
|
1845
1865
|
children: [
|
|
1846
1866
|
/* @__PURE__ */ jsxs11("div", { className: "flex items-center justify-between px-4 py-3", children: [
|
|
1847
1867
|
/* @__PURE__ */ jsxs11("div", { className: "flex items-center gap-2", children: [
|
|
1848
|
-
/* @__PURE__ */
|
|
1849
|
-
/* @__PURE__ */
|
|
1868
|
+
/* @__PURE__ */ jsx12("h3", { className: "text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: col.label }),
|
|
1869
|
+
/* @__PURE__ */ jsx12("span", { className: "inline-flex h-5 min-w-[20px] items-center justify-center rounded-full border border-[var(--md3-outline-variant)] px-1.5 text-[10px] font-medium text-muted-foreground", children: colItems.length })
|
|
1850
1870
|
] }),
|
|
1851
1871
|
renderColumnAction?.(col)
|
|
1852
1872
|
] }),
|
|
@@ -1861,7 +1881,7 @@ function TaskBoard({
|
|
|
1861
1881
|
|
|
1862
1882
|
// src/workspace/calendar-view.tsx
|
|
1863
1883
|
import { useState as useState7, useMemo as useMemo6 } from "react";
|
|
1864
|
-
import { Fragment as Fragment3, jsx as
|
|
1884
|
+
import { Fragment as Fragment3, jsx as jsx13, jsxs as jsxs12 } from "react/jsx-runtime";
|
|
1865
1885
|
function toDateKey(d) {
|
|
1866
1886
|
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
|
|
1867
1887
|
}
|
|
@@ -1955,26 +1975,26 @@ function CalendarView({
|
|
|
1955
1975
|
/* @__PURE__ */ jsxs12("div", { className: "flex items-center justify-between border-b border-[var(--md3-outline-variant)] px-4 py-2.5 shrink-0", children: [
|
|
1956
1976
|
/* @__PURE__ */ jsxs12("div", { className: "flex items-center gap-2", children: [
|
|
1957
1977
|
headerLeft,
|
|
1958
|
-
/* @__PURE__ */
|
|
1978
|
+
/* @__PURE__ */ jsx13(
|
|
1959
1979
|
"button",
|
|
1960
1980
|
{
|
|
1961
1981
|
type: "button",
|
|
1962
1982
|
onClick: prevMonth,
|
|
1963
1983
|
className: "h-7 w-7 rounded-md hover:bg-surface-container-high flex items-center justify-center text-muted-foreground",
|
|
1964
|
-
children: /* @__PURE__ */
|
|
1984
|
+
children: /* @__PURE__ */ jsx13("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: /* @__PURE__ */ jsx13("path", { d: "m15 18-6-6 6-6" }) })
|
|
1965
1985
|
}
|
|
1966
1986
|
),
|
|
1967
|
-
/* @__PURE__ */
|
|
1968
|
-
/* @__PURE__ */
|
|
1987
|
+
/* @__PURE__ */ jsx13("span", { className: "text-sm font-semibold text-foreground min-w-[160px] text-center", children: monthLabel }),
|
|
1988
|
+
/* @__PURE__ */ jsx13(
|
|
1969
1989
|
"button",
|
|
1970
1990
|
{
|
|
1971
1991
|
type: "button",
|
|
1972
1992
|
onClick: nextMonth,
|
|
1973
1993
|
className: "h-7 w-7 rounded-md hover:bg-surface-container-high flex items-center justify-center text-muted-foreground",
|
|
1974
|
-
children: /* @__PURE__ */
|
|
1994
|
+
children: /* @__PURE__ */ jsx13("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", children: /* @__PURE__ */ jsx13("path", { d: "m9 18 6-6-6-6" }) })
|
|
1975
1995
|
}
|
|
1976
1996
|
),
|
|
1977
|
-
/* @__PURE__ */
|
|
1997
|
+
/* @__PURE__ */ jsx13(
|
|
1978
1998
|
"button",
|
|
1979
1999
|
{
|
|
1980
2000
|
type: "button",
|
|
@@ -1989,7 +2009,7 @@ function CalendarView({
|
|
|
1989
2009
|
] }),
|
|
1990
2010
|
headerRight
|
|
1991
2011
|
] }),
|
|
1992
|
-
/* @__PURE__ */
|
|
2012
|
+
/* @__PURE__ */ jsx13("div", { className: "grid grid-cols-7 border-b border-[var(--md3-outline-variant)] shrink-0", children: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"].map((d) => /* @__PURE__ */ jsx13(
|
|
1993
2013
|
"div",
|
|
1994
2014
|
{
|
|
1995
2015
|
className: "px-2 py-1.5 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground text-center",
|
|
@@ -1997,7 +2017,7 @@ function CalendarView({
|
|
|
1997
2017
|
},
|
|
1998
2018
|
d
|
|
1999
2019
|
)) }),
|
|
2000
|
-
/* @__PURE__ */
|
|
2020
|
+
/* @__PURE__ */ jsx13("div", { className: "flex-1 grid grid-cols-7 auto-rows-fr overflow-y-auto", children: monthDays.map(({ date, key, inMonth }) => {
|
|
2001
2021
|
const dayEvents = eventsByDate[key] ?? [];
|
|
2002
2022
|
const isToday = key === todayKey;
|
|
2003
2023
|
const isSelected = key === selectedDay;
|
|
@@ -2014,7 +2034,7 @@ function CalendarView({
|
|
|
2014
2034
|
!isSelected && "hover:bg-surface-container-high"
|
|
2015
2035
|
),
|
|
2016
2036
|
children: [
|
|
2017
|
-
/* @__PURE__ */
|
|
2037
|
+
/* @__PURE__ */ jsx13(
|
|
2018
2038
|
"span",
|
|
2019
2039
|
{
|
|
2020
2040
|
className: cn(
|
|
@@ -2028,7 +2048,7 @@ function CalendarView({
|
|
|
2028
2048
|
),
|
|
2029
2049
|
/* @__PURE__ */ jsxs12("div", { className: "flex flex-col gap-0.5 w-full min-w-0", children: [
|
|
2030
2050
|
dayEvents.slice(0, 3).map(
|
|
2031
|
-
(evt) => renderEventChip ? /* @__PURE__ */
|
|
2051
|
+
(evt) => renderEventChip ? /* @__PURE__ */ jsx13("div", { className: "w-full min-w-0", children: renderEventChip(evt) }, evt.id) : /* @__PURE__ */ jsx13(
|
|
2032
2052
|
"div",
|
|
2033
2053
|
{
|
|
2034
2054
|
className: "w-full truncate text-[9px] px-1 py-0.5 rounded bg-primary/10 text-primary",
|
|
@@ -2050,9 +2070,9 @@ function CalendarView({
|
|
|
2050
2070
|
);
|
|
2051
2071
|
}) })
|
|
2052
2072
|
] }),
|
|
2053
|
-
showDayPanel && /* @__PURE__ */
|
|
2073
|
+
showDayPanel && /* @__PURE__ */ jsx13("div", { className: "w-80 shrink-0 flex flex-col overflow-hidden", children: renderDayDetail ? renderDayDetail(selectedDay ?? todayKey, selectedDayEvents) : /* @__PURE__ */ jsxs12(Fragment3, { children: [
|
|
2054
2074
|
/* @__PURE__ */ jsxs12("div", { className: "px-4 py-3 border-b border-[var(--md3-outline-variant)] shrink-0", children: [
|
|
2055
|
-
/* @__PURE__ */
|
|
2075
|
+
/* @__PURE__ */ jsx13("h3", { className: "text-sm font-semibold text-foreground", children: selectedDay === todayKey ? "Today" : selectedDay ? (/* @__PURE__ */ new Date(selectedDay + "T00:00:00")).toLocaleDateString(
|
|
2056
2076
|
"en-US",
|
|
2057
2077
|
{ weekday: "long", month: "long", day: "numeric" }
|
|
2058
2078
|
) : "Select a day" }),
|
|
@@ -2063,14 +2083,14 @@ function CalendarView({
|
|
|
2063
2083
|
] })
|
|
2064
2084
|
] }),
|
|
2065
2085
|
/* @__PURE__ */ jsxs12("div", { className: "flex-1 overflow-y-auto p-2 space-y-2", children: [
|
|
2066
|
-
selectedDayEvents.length === 0 && /* @__PURE__ */
|
|
2086
|
+
selectedDayEvents.length === 0 && /* @__PURE__ */ jsx13("div", { className: "px-2 py-8 text-center", children: /* @__PURE__ */ jsx13("p", { className: "text-xs text-muted-foreground", children: "No events this day" }) }),
|
|
2067
2087
|
selectedDayEvents.map((evt) => /* @__PURE__ */ jsxs12(
|
|
2068
2088
|
"div",
|
|
2069
2089
|
{
|
|
2070
2090
|
className: "rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container p-3",
|
|
2071
2091
|
children: [
|
|
2072
|
-
/* @__PURE__ */
|
|
2073
|
-
evt.type && /* @__PURE__ */
|
|
2092
|
+
/* @__PURE__ */ jsx13("p", { className: "text-sm font-medium text-foreground", children: evt.title }),
|
|
2093
|
+
evt.type && /* @__PURE__ */ jsx13("span", { className: "mt-1 inline-block rounded-full border border-[var(--md3-outline-variant)] px-2 py-0.5 text-[10px] text-muted-foreground", children: evt.type })
|
|
2074
2094
|
]
|
|
2075
2095
|
},
|
|
2076
2096
|
evt.id
|
|
@@ -2082,7 +2102,7 @@ function CalendarView({
|
|
|
2082
2102
|
|
|
2083
2103
|
// src/workspace/approval-queue.tsx
|
|
2084
2104
|
import { useState as useState8, useMemo as useMemo7 } from "react";
|
|
2085
|
-
import { jsx as
|
|
2105
|
+
import { jsx as jsx14, jsxs as jsxs13 } from "react/jsx-runtime";
|
|
2086
2106
|
function ApprovalQueue({
|
|
2087
2107
|
items,
|
|
2088
2108
|
className,
|
|
@@ -2123,17 +2143,17 @@ function ApprovalQueue({
|
|
|
2123
2143
|
return Object.values(map);
|
|
2124
2144
|
}, [items]);
|
|
2125
2145
|
if (items.length === 0) {
|
|
2126
|
-
return /* @__PURE__ */
|
|
2146
|
+
return /* @__PURE__ */ jsx14("div", { className: cn("flex-1 flex items-center justify-center", className), children: emptyState ?? /* @__PURE__ */ jsx14("div", { className: "text-center py-20", children: /* @__PURE__ */ jsx14("p", { className: "text-sm text-muted-foreground", children: "No proposals yet" }) }) });
|
|
2127
2147
|
}
|
|
2128
|
-
return /* @__PURE__ */
|
|
2148
|
+
return /* @__PURE__ */ jsx14("div", { className: cn("flex-1 overflow-y-auto", className), children: /* @__PURE__ */ jsxs13("div", { className: "max-w-3xl mx-auto p-6", children: [
|
|
2129
2149
|
header,
|
|
2130
|
-
stats.length > 0 && /* @__PURE__ */
|
|
2150
|
+
stats.length > 0 && /* @__PURE__ */ jsx14("div", { className: "flex gap-3 mb-6 flex-wrap", children: renderStats ? renderStats(stats) : stats.map((s) => /* @__PURE__ */ jsxs13(
|
|
2131
2151
|
"div",
|
|
2132
2152
|
{
|
|
2133
2153
|
className: "flex-1 min-w-[120px] rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container p-3",
|
|
2134
2154
|
children: [
|
|
2135
|
-
/* @__PURE__ */
|
|
2136
|
-
/* @__PURE__ */
|
|
2155
|
+
/* @__PURE__ */ jsx14("div", { className: "flex items-center gap-2 mb-1", children: renderTypeBadge ? renderTypeBadge(s.type) : /* @__PURE__ */ jsx14("span", { className: "rounded-full border border-[var(--md3-outline-variant)] px-2 py-0.5 text-[10px] font-medium text-muted-foreground", children: s.type }) }),
|
|
2156
|
+
/* @__PURE__ */ jsx14("div", { className: "flex items-baseline gap-1", children: /* @__PURE__ */ jsxs13("span", { className: "text-xl font-semibold text-foreground", children: [
|
|
2137
2157
|
s.rate,
|
|
2138
2158
|
"%"
|
|
2139
2159
|
] }) }),
|
|
@@ -2153,7 +2173,7 @@ function ApprovalQueue({
|
|
|
2153
2173
|
pending.length,
|
|
2154
2174
|
")"
|
|
2155
2175
|
] }),
|
|
2156
|
-
/* @__PURE__ */
|
|
2176
|
+
/* @__PURE__ */ jsx14("div", { className: "space-y-3", children: pending.map((item) => /* @__PURE__ */ jsxs13(
|
|
2157
2177
|
"div",
|
|
2158
2178
|
{
|
|
2159
2179
|
className: "rounded-lg border border-primary/20 bg-surface-container p-4",
|
|
@@ -2161,14 +2181,14 @@ function ApprovalQueue({
|
|
|
2161
2181
|
/* @__PURE__ */ jsxs13("div", { className: "flex items-start gap-3", children: [
|
|
2162
2182
|
/* @__PURE__ */ jsxs13("div", { className: "flex-1 min-w-0", children: [
|
|
2163
2183
|
/* @__PURE__ */ jsxs13("div", { className: "flex items-center gap-2 mb-1", children: [
|
|
2164
|
-
/* @__PURE__ */
|
|
2165
|
-
renderTypeBadge ? renderTypeBadge(item.type) : /* @__PURE__ */
|
|
2184
|
+
/* @__PURE__ */ jsx14("h4", { className: "text-sm font-medium text-foreground", children: item.title }),
|
|
2185
|
+
renderTypeBadge ? renderTypeBadge(item.type) : /* @__PURE__ */ jsx14("span", { className: "rounded-full border border-[var(--md3-outline-variant)] px-2 py-0.5 text-[10px] text-muted-foreground", children: item.type })
|
|
2166
2186
|
] }),
|
|
2167
|
-
item.description && /* @__PURE__ */
|
|
2187
|
+
item.description && /* @__PURE__ */ jsx14("p", { className: "text-xs text-muted-foreground line-clamp-2", children: item.description }),
|
|
2168
2188
|
renderItemDetail?.(item)
|
|
2169
2189
|
] }),
|
|
2170
2190
|
canResolve && /* @__PURE__ */ jsxs13("div", { className: "flex gap-1.5 shrink-0", children: [
|
|
2171
|
-
/* @__PURE__ */
|
|
2191
|
+
/* @__PURE__ */ jsx14(
|
|
2172
2192
|
"button",
|
|
2173
2193
|
{
|
|
2174
2194
|
type: "button",
|
|
@@ -2177,7 +2197,7 @@ function ApprovalQueue({
|
|
|
2177
2197
|
children: "Approve"
|
|
2178
2198
|
}
|
|
2179
2199
|
),
|
|
2180
|
-
/* @__PURE__ */
|
|
2200
|
+
/* @__PURE__ */ jsx14(
|
|
2181
2201
|
"button",
|
|
2182
2202
|
{
|
|
2183
2203
|
type: "button",
|
|
@@ -2194,7 +2214,7 @@ function ApprovalQueue({
|
|
|
2194
2214
|
] })
|
|
2195
2215
|
] }),
|
|
2196
2216
|
rejectingId === item.id && /* @__PURE__ */ jsxs13("div", { className: "mt-3 border-t border-[var(--md3-outline-variant)] pt-3", children: [
|
|
2197
|
-
/* @__PURE__ */
|
|
2217
|
+
/* @__PURE__ */ jsx14(
|
|
2198
2218
|
"textarea",
|
|
2199
2219
|
{
|
|
2200
2220
|
placeholder: "Why are you rejecting this?",
|
|
@@ -2205,7 +2225,7 @@ function ApprovalQueue({
|
|
|
2205
2225
|
}
|
|
2206
2226
|
),
|
|
2207
2227
|
/* @__PURE__ */ jsxs13("div", { className: "flex gap-2 justify-end", children: [
|
|
2208
|
-
/* @__PURE__ */
|
|
2228
|
+
/* @__PURE__ */ jsx14(
|
|
2209
2229
|
"button",
|
|
2210
2230
|
{
|
|
2211
2231
|
type: "button",
|
|
@@ -2217,7 +2237,7 @@ function ApprovalQueue({
|
|
|
2217
2237
|
children: "Cancel"
|
|
2218
2238
|
}
|
|
2219
2239
|
),
|
|
2220
|
-
/* @__PURE__ */
|
|
2240
|
+
/* @__PURE__ */ jsx14(
|
|
2221
2241
|
"button",
|
|
2222
2242
|
{
|
|
2223
2243
|
type: "button",
|
|
@@ -2245,7 +2265,7 @@ function ApprovalQueue({
|
|
|
2245
2265
|
onClick: () => setShowResolved(!showResolved),
|
|
2246
2266
|
className: "flex items-center gap-2 text-xs font-medium text-muted-foreground uppercase tracking-wider mb-3 hover:text-foreground transition-colors",
|
|
2247
2267
|
children: [
|
|
2248
|
-
/* @__PURE__ */
|
|
2268
|
+
/* @__PURE__ */ jsx14(
|
|
2249
2269
|
"svg",
|
|
2250
2270
|
{
|
|
2251
2271
|
width: "12",
|
|
@@ -2258,7 +2278,7 @@ function ApprovalQueue({
|
|
|
2258
2278
|
"transition-transform",
|
|
2259
2279
|
showResolved && "rotate-180"
|
|
2260
2280
|
),
|
|
2261
|
-
children: /* @__PURE__ */
|
|
2281
|
+
children: /* @__PURE__ */ jsx14("path", { d: "m6 9 6 6 6-6" })
|
|
2262
2282
|
}
|
|
2263
2283
|
),
|
|
2264
2284
|
"Resolved (",
|
|
@@ -2267,15 +2287,15 @@ function ApprovalQueue({
|
|
|
2267
2287
|
]
|
|
2268
2288
|
}
|
|
2269
2289
|
),
|
|
2270
|
-
showResolved && /* @__PURE__ */
|
|
2290
|
+
showResolved && /* @__PURE__ */ jsx14("div", { className: "space-y-2", children: resolved.map((item) => /* @__PURE__ */ jsxs13(
|
|
2271
2291
|
"div",
|
|
2272
2292
|
{
|
|
2273
2293
|
className: "rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container p-4 opacity-60",
|
|
2274
2294
|
children: [
|
|
2275
2295
|
/* @__PURE__ */ jsxs13("div", { className: "flex items-center gap-2 mb-1", children: [
|
|
2276
|
-
/* @__PURE__ */
|
|
2296
|
+
/* @__PURE__ */ jsx14("h4", { className: "text-sm font-medium text-foreground", children: item.title }),
|
|
2277
2297
|
renderTypeBadge?.(item.type),
|
|
2278
|
-
/* @__PURE__ */
|
|
2298
|
+
/* @__PURE__ */ jsx14(
|
|
2279
2299
|
"span",
|
|
2280
2300
|
{
|
|
2281
2301
|
className: cn(
|
|
@@ -2301,6 +2321,7 @@ function ApprovalQueue({
|
|
|
2301
2321
|
}
|
|
2302
2322
|
|
|
2303
2323
|
export {
|
|
2324
|
+
WorkspacePaneHeader,
|
|
2304
2325
|
WorkspaceLayout,
|
|
2305
2326
|
DirectoryPane,
|
|
2306
2327
|
StatusBanner,
|