@tangle-network/sandbox-ui 0.99.1 → 0.100.0
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/{WorkflowGraph-DB5F6ZSF.js → WorkflowGraph-AQLN34R3.js} +3 -1
- package/dist/assets.js +1 -1
- package/dist/chat.js +1 -1
- package/dist/{chunk-GTJ5PSK5.js → chunk-3LIXVEEE.js} +1 -0
- package/dist/{chunk-Y4OTBMZS.js → chunk-3W343PY5.js} +201 -93
- package/dist/chunk-BGVEHENC.js +10 -0
- package/dist/{chunk-G7CFCZQ7.js → chunk-IWTLWBPZ.js} +3 -3
- package/dist/{chunk-XKKV3B24.js → chunk-OI7HEWLZ.js} +91 -63
- package/dist/{chunk-JIZCCGD2.js → chunk-WCUIUBG5.js} +1 -1
- package/dist/connectors.js +1 -1
- package/dist/dashboard.d.ts +23 -4
- package/dist/dashboard.js +2 -1
- package/dist/globals.css +346 -143
- package/dist/index.js +5 -4
- package/dist/integrations.d.ts +44 -1
- package/dist/integrations.js +5 -2
- package/dist/{mention-editor-3Q6MYOIU.js → mention-editor-Q3TKSZDL.js} +1 -1
- package/dist/pages.js +7 -7
- package/dist/styles.css +346 -143
- package/dist/tokens.css +259 -140
- package/dist/workbench.js +3 -2
- package/dist/workflows.js +1 -1
- package/dist/workspace.js +2 -1
- package/package.json +3 -3
|
@@ -5,6 +5,11 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
moonshot_default
|
|
7
7
|
} from "./chunk-RQZRXKMR.js";
|
|
8
|
+
import {
|
|
9
|
+
MOTION_CONTROL,
|
|
10
|
+
MOTION_SURFACE,
|
|
11
|
+
MOTION_TRAVEL
|
|
12
|
+
} from "./chunk-BGVEHENC.js";
|
|
8
13
|
import {
|
|
9
14
|
cn
|
|
10
15
|
} from "./chunk-EI44GEQ5.js";
|
|
@@ -145,7 +150,7 @@ function useSidebar() {
|
|
|
145
150
|
// src/dashboard/rail-tooltip.tsx
|
|
146
151
|
import * as React2 from "react";
|
|
147
152
|
import { createPortal } from "react-dom";
|
|
148
|
-
import {
|
|
153
|
+
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
149
154
|
var RAIL_FLOATING_SURFACE = "rounded-md border border-[var(--md3-outline-variant)] bg-surface-container-highest shadow-[0_8px_30px_rgba(0,0,0,0.45)] ring-1 ring-[#ffffff14]";
|
|
150
155
|
function RailTooltip({ label, children, disabled, className }) {
|
|
151
156
|
const ref = React2.useRef(null);
|
|
@@ -154,8 +159,16 @@ function RailTooltip({ label, children, disabled, className }) {
|
|
|
154
159
|
React2.useEffect(() => () => {
|
|
155
160
|
if (timer.current) clearTimeout(timer.current);
|
|
156
161
|
}, []);
|
|
157
|
-
|
|
162
|
+
React2.useEffect(() => {
|
|
163
|
+
if (!disabled) return;
|
|
164
|
+
if (timer.current) {
|
|
165
|
+
clearTimeout(timer.current);
|
|
166
|
+
timer.current = null;
|
|
167
|
+
}
|
|
168
|
+
setCoords(null);
|
|
169
|
+
}, [disabled]);
|
|
158
170
|
const open = () => {
|
|
171
|
+
if (disabled) return;
|
|
159
172
|
if (timer.current) clearTimeout(timer.current);
|
|
160
173
|
timer.current = setTimeout(() => {
|
|
161
174
|
const el = ref.current;
|
|
@@ -172,25 +185,38 @@ function RailTooltip({ label, children, disabled, className }) {
|
|
|
172
185
|
"span",
|
|
173
186
|
{
|
|
174
187
|
ref,
|
|
175
|
-
className: cn("relative flex", className),
|
|
188
|
+
className: cn("relative flex shrink-0", className),
|
|
176
189
|
onMouseEnter: open,
|
|
177
190
|
onMouseLeave: close,
|
|
178
191
|
onFocusCapture: open,
|
|
179
192
|
onBlurCapture: close,
|
|
180
193
|
children: [
|
|
181
194
|
children,
|
|
182
|
-
coords !== null && typeof document !== "undefined" && createPortal(
|
|
195
|
+
!disabled && coords !== null && typeof document !== "undefined" && createPortal(
|
|
196
|
+
// Two elements, because the centering transform and the entrance
|
|
197
|
+
// transform cannot share one: `.agent-pop-in` fills forwards to
|
|
198
|
+
// `transform: none`, which would eat the `translateY(-50%)` and leave
|
|
199
|
+
// every tooltip half a line low. The outer span owns the position, the
|
|
200
|
+
// inner one owns the motion.
|
|
183
201
|
/* @__PURE__ */ jsx2(
|
|
184
202
|
"span",
|
|
185
203
|
{
|
|
186
|
-
role: "tooltip",
|
|
187
|
-
"aria-hidden": "true",
|
|
188
204
|
style: { position: "fixed", top: coords.top, left: coords.left, transform: "translateY(-50%)" },
|
|
189
|
-
className:
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
205
|
+
className: "pointer-events-none z-[70]",
|
|
206
|
+
children: /* @__PURE__ */ jsx2(
|
|
207
|
+
"span",
|
|
208
|
+
{
|
|
209
|
+
role: "tooltip",
|
|
210
|
+
"aria-hidden": "true",
|
|
211
|
+
className: cn(
|
|
212
|
+
// Appears in place beside the trigger after the open delay, so
|
|
213
|
+
// it scales up rather than travelling — @see .agent-pop-in.
|
|
214
|
+
"agent-pop-in block whitespace-nowrap px-2 py-1 text-xs font-medium text-popover-foreground",
|
|
215
|
+
RAIL_FLOATING_SURFACE
|
|
216
|
+
),
|
|
217
|
+
children: label
|
|
218
|
+
}
|
|
219
|
+
)
|
|
194
220
|
}
|
|
195
221
|
),
|
|
196
222
|
document.body
|
|
@@ -201,7 +227,7 @@ function RailTooltip({ label, children, disabled, className }) {
|
|
|
201
227
|
}
|
|
202
228
|
|
|
203
229
|
// src/dashboard/app-sidebar.tsx
|
|
204
|
-
import { Fragment
|
|
230
|
+
import { Fragment, jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
205
231
|
function DefaultLink({
|
|
206
232
|
href,
|
|
207
233
|
to,
|
|
@@ -258,6 +284,7 @@ function RailThemeToggle({ className }) {
|
|
|
258
284
|
title: isDark ? "Switch to light mode" : "Switch to dark mode",
|
|
259
285
|
className: cn(
|
|
260
286
|
"flex h-9 w-9 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors",
|
|
287
|
+
MOTION_CONTROL,
|
|
261
288
|
"hover:bg-[var(--accent-surface-soft)] hover:text-foreground",
|
|
262
289
|
"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
263
290
|
className
|
|
@@ -290,6 +317,7 @@ function RailCollapseToggle({ collapsed, showLabel, onToggle, className }) {
|
|
|
290
317
|
"aria-pressed": collapsed,
|
|
291
318
|
className: cn(
|
|
292
319
|
"flex shrink-0 items-center rounded-md text-muted-foreground transition-colors",
|
|
320
|
+
MOTION_CONTROL,
|
|
293
321
|
showLabel ? "h-9 w-full justify-start gap-2.5 px-2.5" : "h-9 w-9 justify-center",
|
|
294
322
|
"hover:bg-[var(--accent-surface-soft)] hover:text-foreground",
|
|
295
323
|
"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
@@ -314,6 +342,7 @@ function PanelToggleButton({ collapsed, onToggle, className }) {
|
|
|
314
342
|
title: label,
|
|
315
343
|
className: cn(
|
|
316
344
|
"flex h-8 w-8 shrink-0 items-center justify-center rounded-md text-muted-foreground transition-colors",
|
|
345
|
+
MOTION_CONTROL,
|
|
317
346
|
"hover:bg-[var(--accent-surface-soft)] hover:text-foreground",
|
|
318
347
|
"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
319
348
|
className
|
|
@@ -330,7 +359,7 @@ function RailHeader({ brand, brandHref, children, collapsed, onToggle, collapsib
|
|
|
330
359
|
href: brandHref,
|
|
331
360
|
to: brandHref,
|
|
332
361
|
"aria-label": "Home",
|
|
333
|
-
className: "flex items-center justify-center rounded-md p-1 transition-colors hover:bg-[var(--accent-surface-soft)]",
|
|
362
|
+
className: cn("flex items-center justify-center rounded-md p-1 transition-colors hover:bg-[var(--accent-surface-soft)]", MOTION_CONTROL),
|
|
334
363
|
children: brand
|
|
335
364
|
}
|
|
336
365
|
) : /* @__PURE__ */ jsx3("span", { className: "flex items-center justify-center p-1", children: brand });
|
|
@@ -349,13 +378,13 @@ function RailHeader({ brand, brandHref, children, collapsed, onToggle, collapsib
|
|
|
349
378
|
onClick: onToggle,
|
|
350
379
|
"aria-label": "Expand sidebar",
|
|
351
380
|
"aria-pressed": true,
|
|
352
|
-
className: "group/brand relative flex h-9 w-9 items-center justify-center rounded-md transition-colors hover:bg-[var(--accent-surface-soft)] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
381
|
+
className: cn("group/brand relative flex h-9 w-9 items-center justify-center rounded-md transition-colors hover:bg-[var(--accent-surface-soft)] focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", MOTION_CONTROL),
|
|
353
382
|
children: [
|
|
354
|
-
/* @__PURE__ */ jsx3("span", { className: "flex items-center justify-center transition-opacity
|
|
355
|
-
/* @__PURE__ */ jsx3("span", { className: "pointer-events-none absolute inset-0 flex items-center justify-center text-foreground opacity-0 transition-opacity
|
|
383
|
+
/* @__PURE__ */ jsx3("span", { className: cn("flex items-center justify-center transition-opacity group-hover/brand:opacity-0", MOTION_CONTROL), children: brand }),
|
|
384
|
+
/* @__PURE__ */ jsx3("span", { className: cn("pointer-events-none absolute inset-0 flex items-center justify-center text-foreground opacity-0 transition-opacity group-hover/brand:opacity-100", MOTION_CONTROL), children: /* @__PURE__ */ jsx3(PanelLeft, { className: "h-[18px] w-[18px]" }) })
|
|
356
385
|
]
|
|
357
386
|
}
|
|
358
|
-
) }) : brandNode : /* @__PURE__ */ jsxs2(
|
|
387
|
+
) }) : brandNode : /* @__PURE__ */ jsxs2(Fragment, { children: [
|
|
359
388
|
brand !== void 0 && brandNode,
|
|
360
389
|
/* @__PURE__ */ jsx3("div", { className: "min-w-0 flex-1", children }),
|
|
361
390
|
collapsible && /* @__PURE__ */ jsx3(PanelToggleButton, { collapsed, onToggle })
|
|
@@ -370,7 +399,11 @@ function Sidebar({ children, className, style }) {
|
|
|
370
399
|
{
|
|
371
400
|
"data-sidebar": "true",
|
|
372
401
|
className: cn(
|
|
373
|
-
"fixed inset-y-0 left-0 z-40 flex bg-surface-container-low border-r border-[var(--md3-outline-variant)] transition-[transform,width]
|
|
402
|
+
"fixed inset-y-0 left-0 z-40 flex bg-surface-container-low border-r border-[var(--md3-outline-variant)] transition-[transform,width]",
|
|
403
|
+
// The rail is a full-height surface travelling — the slow tier. It and
|
|
404
|
+
// SidebarContent's margin MUST read the same token or the page content
|
|
405
|
+
// visibly lags the edge it is supposed to be attached to.
|
|
406
|
+
MOTION_TRAVEL,
|
|
374
407
|
hidden && "-translate-x-full",
|
|
375
408
|
className
|
|
376
409
|
),
|
|
@@ -406,9 +439,10 @@ function SidebarRailFooter({ children, className }) {
|
|
|
406
439
|
function RailSeparator({ className }) {
|
|
407
440
|
return /* @__PURE__ */ jsx3("div", { className: cn("my-2 h-px w-10 bg-[var(--md3-outline-variant)]", className) });
|
|
408
441
|
}
|
|
409
|
-
function RailButton({ icon: Icon2, label, isActive, badge, onClick, className, showLabel, asChild, children, variant = "normal" }) {
|
|
442
|
+
function RailButton({ icon: Icon2, label, isActive, badge, onClick, className, showLabel, asChild, children, variant = "normal", style }) {
|
|
410
443
|
const classes = cn(
|
|
411
|
-
"relative flex shrink-0 items-center justify-center rounded-md transition-colors
|
|
444
|
+
"relative flex shrink-0 items-center justify-center rounded-md transition-colors",
|
|
445
|
+
MOTION_CONTROL,
|
|
412
446
|
showLabel ? "w-full justify-start px-2.5 h-9 gap-2.5" : "w-9 h-9 justify-center",
|
|
413
447
|
// Quiet press feedback via color only — no scale on the full-width row.
|
|
414
448
|
"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
@@ -422,7 +456,7 @@ function RailButton({ icon: Icon2, label, isActive, badge, onClick, className, s
|
|
|
422
456
|
/* @__PURE__ */ jsx3(Icon2, { className: "h-[17px] w-[17px] shrink-0" }),
|
|
423
457
|
badge !== void 0 && badge > 0 && /* @__PURE__ */ jsx3("span", { className: "absolute -top-1.5 -right-1.5 flex h-4 min-w-4 items-center justify-center rounded-full bg-primary text-[9px] font-bold text-[var(--md3-on-primary)] px-1", children: badge > 99 ? "99+" : badge })
|
|
424
458
|
] });
|
|
425
|
-
const content = /* @__PURE__ */ jsxs2(
|
|
459
|
+
const content = /* @__PURE__ */ jsxs2(Fragment, { children: [
|
|
426
460
|
iconWithBadge,
|
|
427
461
|
showLabel && /* @__PURE__ */ jsx3("span", { className: "text-[13.5px] font-medium", children: label })
|
|
428
462
|
] });
|
|
@@ -430,12 +464,21 @@ function RailButton({ icon: Icon2, label, isActive, badge, onClick, className, s
|
|
|
430
464
|
const child = children;
|
|
431
465
|
const merged = React3.cloneElement(
|
|
432
466
|
child,
|
|
433
|
-
{
|
|
467
|
+
{
|
|
468
|
+
className: cn(classes, child.props.className),
|
|
469
|
+
"aria-label": child.props["aria-label"] ?? label,
|
|
470
|
+
// The layout's `style` wins the merge, not the child's. It is where
|
|
471
|
+
// `--stagger-index` arrives, and a child that happened to carry a
|
|
472
|
+
// `style` of its own would otherwise drop the variable silently and
|
|
473
|
+
// collapse the whole rail's entrance to one flash — a defect with no
|
|
474
|
+
// error and no visible cause.
|
|
475
|
+
style: { ...child.props.style, ...style }
|
|
476
|
+
},
|
|
434
477
|
content
|
|
435
478
|
);
|
|
436
479
|
return /* @__PURE__ */ jsx3(RailTooltip, { label, disabled: showLabel, className: showLabel ? "w-full" : void 0, children: merged });
|
|
437
480
|
}
|
|
438
|
-
return /* @__PURE__ */ jsx3(RailTooltip, { label, disabled: showLabel, className: showLabel ? "w-full" : void 0, children: /* @__PURE__ */ jsx3("button", { type: "button", onClick, "aria-label": label, className: classes, children: content }) });
|
|
481
|
+
return /* @__PURE__ */ jsx3(RailTooltip, { label, disabled: showLabel, className: showLabel ? "w-full" : void 0, children: /* @__PURE__ */ jsx3("button", { type: "button", onClick, "aria-label": label, className: classes, style, children: content }) });
|
|
439
482
|
}
|
|
440
483
|
function RailFlyout({
|
|
441
484
|
icon: Icon2,
|
|
@@ -444,7 +487,8 @@ function RailFlyout({
|
|
|
444
487
|
showLabel,
|
|
445
488
|
title,
|
|
446
489
|
children,
|
|
447
|
-
className
|
|
490
|
+
className,
|
|
491
|
+
style
|
|
448
492
|
}) {
|
|
449
493
|
const [open, setOpen] = React3.useState(false);
|
|
450
494
|
const ref = React3.useRef(null);
|
|
@@ -465,13 +509,14 @@ function RailFlyout({
|
|
|
465
509
|
}, [open]);
|
|
466
510
|
const active = isActive || open;
|
|
467
511
|
const triggerClasses = cn(
|
|
468
|
-
"relative flex shrink-0 items-center rounded-md transition-colors
|
|
512
|
+
"relative flex shrink-0 items-center rounded-md transition-colors",
|
|
513
|
+
MOTION_CONTROL,
|
|
469
514
|
showLabel ? "w-full justify-start px-2.5 h-9 gap-2.5" : "w-9 h-9 justify-center",
|
|
470
515
|
"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
471
516
|
active ? "bg-[var(--accent-surface-strong)] text-[var(--accent-text)]" : "text-muted-foreground hover:bg-[var(--accent-surface-soft)] hover:text-foreground",
|
|
472
517
|
className
|
|
473
518
|
);
|
|
474
|
-
return /* @__PURE__ */ jsxs2("div", { ref, className: cn("relative", showLabel && "w-full"), children: [
|
|
519
|
+
return /* @__PURE__ */ jsxs2("div", { ref, className: cn("relative", showLabel && "w-full"), style, children: [
|
|
475
520
|
/* @__PURE__ */ jsx3(RailTooltip, { label, disabled: showLabel || open, className: showLabel ? "w-full" : void 0, children: /* @__PURE__ */ jsxs2(
|
|
476
521
|
"button",
|
|
477
522
|
{
|
|
@@ -488,7 +533,8 @@ function RailFlyout({
|
|
|
488
533
|
ChevronRightIcon,
|
|
489
534
|
{
|
|
490
535
|
className: cn(
|
|
491
|
-
"ml-auto h-4 w-4 shrink-0 text-muted-foreground/60 transition-transform
|
|
536
|
+
"ml-auto h-4 w-4 shrink-0 text-muted-foreground/60 transition-transform",
|
|
537
|
+
MOTION_CONTROL,
|
|
492
538
|
open && "rotate-180"
|
|
493
539
|
)
|
|
494
540
|
}
|
|
@@ -509,6 +555,9 @@ function RailFlyout({
|
|
|
509
555
|
},
|
|
510
556
|
className: cn(
|
|
511
557
|
"absolute left-full top-0 z-50 ml-2 min-w-[12rem] p-1.5",
|
|
558
|
+
// A flyout appears in place beside its trigger; it did not travel
|
|
559
|
+
// from anywhere, so it scales up rather than sliding.
|
|
560
|
+
"agent-pop-in",
|
|
512
561
|
RAIL_FLOATING_SURFACE
|
|
513
562
|
),
|
|
514
563
|
children: [
|
|
@@ -570,7 +619,8 @@ function RailExpandable({
|
|
|
570
619
|
defaultOpen,
|
|
571
620
|
onNavigate,
|
|
572
621
|
LinkComponent,
|
|
573
|
-
className
|
|
622
|
+
className,
|
|
623
|
+
style
|
|
574
624
|
}) {
|
|
575
625
|
const Link = LinkComponent ?? DefaultLink;
|
|
576
626
|
const [open, setOpen] = React3.useState(defaultOpen ?? false);
|
|
@@ -578,6 +628,15 @@ function RailExpandable({
|
|
|
578
628
|
React3.useEffect(() => {
|
|
579
629
|
if (defaultOpen) ensureLoaded();
|
|
580
630
|
}, [defaultOpen, ensureLoaded]);
|
|
631
|
+
const [everOpened, setEverOpened] = React3.useState(defaultOpen ?? false);
|
|
632
|
+
const discloseRef = React3.useRef(null);
|
|
633
|
+
const discloseId = React3.useId();
|
|
634
|
+
React3.useEffect(() => {
|
|
635
|
+
const el = discloseRef.current;
|
|
636
|
+
if (!el) return;
|
|
637
|
+
if (open) el.removeAttribute("inert");
|
|
638
|
+
else el.setAttribute("inert", "");
|
|
639
|
+
}, [open]);
|
|
581
640
|
const activeSet = React3.useMemo(() => new Set(activeSubIds ?? []), [activeSubIds]);
|
|
582
641
|
const triggerRef = React3.useRef(null);
|
|
583
642
|
const closeTimer = React3.useRef(null);
|
|
@@ -597,6 +656,7 @@ function RailExpandable({
|
|
|
597
656
|
...item.prefetch !== void 0 ? { prefetch: item.prefetch } : {},
|
|
598
657
|
className: cn(
|
|
599
658
|
"flex min-w-0 flex-1 items-center gap-2 rounded-md px-2.5 text-[12px] transition-colors",
|
|
659
|
+
MOTION_CONTROL,
|
|
600
660
|
active ? "h-7 bg-[var(--accent-surface-strong)] font-medium text-[var(--accent-text)]" : item.emphasis ? "py-2 font-medium text-[var(--accent-text)] hover:underline" : "h-7 text-muted-foreground hover:bg-[var(--accent-surface-soft)] hover:text-foreground"
|
|
601
661
|
),
|
|
602
662
|
children: [
|
|
@@ -607,10 +667,17 @@ function RailExpandable({
|
|
|
607
667
|
{
|
|
608
668
|
className: cn(
|
|
609
669
|
"min-w-0 flex-1 truncate",
|
|
610
|
-
item.isLoading && "shimmer
|
|
670
|
+
item.isLoading && "agent-shimmer",
|
|
611
671
|
item.unread && !active && "font-medium text-foreground"
|
|
612
672
|
),
|
|
613
|
-
...item.isLoading ? {
|
|
673
|
+
...item.isLoading ? {
|
|
674
|
+
role: "status",
|
|
675
|
+
"aria-label": "Agent responding",
|
|
676
|
+
// The sweep through the glyphs is the ONLY thing separating "this
|
|
677
|
+
// agent is still working" from "this row is stale", so it opts out
|
|
678
|
+
// of the reduced-motion floor. Decorative motion must not.
|
|
679
|
+
"data-motion": "essential"
|
|
680
|
+
} : {},
|
|
614
681
|
children: item.label
|
|
615
682
|
}
|
|
616
683
|
)
|
|
@@ -627,7 +694,10 @@ function RailExpandable({
|
|
|
627
694
|
{
|
|
628
695
|
type: "button",
|
|
629
696
|
"aria-label": "Chat actions",
|
|
630
|
-
className:
|
|
697
|
+
className: cn(
|
|
698
|
+
"absolute right-1 flex h-6 w-6 shrink-0 items-center justify-center rounded-md bg-[var(--accent-surface-soft)] text-muted-foreground opacity-0 transition hover:text-foreground focus-visible:opacity-100 group-hover/sub:opacity-100 data-[state=open]:bg-[var(--accent-surface-strong)] data-[state=open]:opacity-100",
|
|
699
|
+
MOTION_CONTROL
|
|
700
|
+
),
|
|
631
701
|
children: /* @__PURE__ */ jsx3(MoreHorizontal, { className: "h-3.5 w-3.5" })
|
|
632
702
|
}
|
|
633
703
|
) }),
|
|
@@ -652,7 +722,8 @@ function RailExpandable({
|
|
|
652
722
|
const list = loading ? /* @__PURE__ */ jsx3(SubItemsSkeleton, {}) : items && items.length > 0 ? items.map(subLink) : /* @__PURE__ */ jsx3("p", { className: "px-2.5 py-1.5 text-xs text-muted-foreground", children: emptyLabel });
|
|
653
723
|
if (!showLabel) {
|
|
654
724
|
const triggerClasses = cn(
|
|
655
|
-
"relative flex h-9 w-9 items-center justify-center rounded-md transition-colors
|
|
725
|
+
"relative flex h-9 w-9 items-center justify-center rounded-md transition-colors",
|
|
726
|
+
MOTION_CONTROL,
|
|
656
727
|
"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
657
728
|
isActive || open ? "bg-[var(--accent-surface-strong)] text-[var(--accent-text)] font-medium ring-1 ring-inset ring-[var(--border-accent)]" : "text-muted-foreground hover:bg-[var(--accent-surface-soft)] hover:text-foreground"
|
|
658
729
|
);
|
|
@@ -690,6 +761,7 @@ function RailExpandable({
|
|
|
690
761
|
{
|
|
691
762
|
ref: triggerRef,
|
|
692
763
|
className: cn("relative", className),
|
|
764
|
+
style,
|
|
693
765
|
onMouseEnter: openFlyout,
|
|
694
766
|
onMouseLeave: scheduleClose,
|
|
695
767
|
onFocusCapture: openFlyout,
|
|
@@ -715,7 +787,7 @@ function RailExpandable({
|
|
|
715
787
|
onClickCapture: (e) => {
|
|
716
788
|
if (e.target.closest("a")) setOpen(false);
|
|
717
789
|
},
|
|
718
|
-
className: cn("z-[70] flex w-60 flex-col overflow-hidden p-1.5", RAIL_FLOATING_SURFACE),
|
|
790
|
+
className: cn("agent-pop-in z-[70] flex w-60 flex-col overflow-hidden p-1.5", RAIL_FLOATING_SURFACE),
|
|
719
791
|
children: [
|
|
720
792
|
/* @__PURE__ */ jsx3("p", { className: "shrink-0 px-2 pb-1 pt-1 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground/70 select-none", children: label }),
|
|
721
793
|
/* @__PURE__ */ jsx3("div", { className: "flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto", children: list })
|
|
@@ -731,16 +803,20 @@ function RailExpandable({
|
|
|
731
803
|
const toggle = () => {
|
|
732
804
|
setOpen((v) => {
|
|
733
805
|
const next = !v;
|
|
734
|
-
if (next)
|
|
806
|
+
if (next) {
|
|
807
|
+
ensureLoaded();
|
|
808
|
+
setEverOpened(true);
|
|
809
|
+
}
|
|
735
810
|
return next;
|
|
736
811
|
});
|
|
737
812
|
};
|
|
738
|
-
return /* @__PURE__ */ jsxs2("div", { className: cn("w-full", className), children: [
|
|
813
|
+
return /* @__PURE__ */ jsxs2("div", { className: cn("w-full", className), style, children: [
|
|
739
814
|
/* @__PURE__ */ jsxs2(
|
|
740
815
|
"div",
|
|
741
816
|
{
|
|
742
817
|
className: cn(
|
|
743
|
-
"group/exp relative flex h-9 w-full items-center rounded-md transition-colors
|
|
818
|
+
"group/exp relative flex h-9 w-full items-center rounded-md transition-colors",
|
|
819
|
+
MOTION_CONTROL,
|
|
744
820
|
isActive ? "bg-[var(--accent-surface-strong)] text-[var(--accent-text)] font-medium ring-1 ring-inset ring-[var(--border-accent)]" : "text-muted-foreground hover:bg-[var(--accent-surface-soft)] hover:text-foreground"
|
|
745
821
|
),
|
|
746
822
|
children: [
|
|
@@ -750,20 +826,22 @@ function RailExpandable({
|
|
|
750
826
|
type: "button",
|
|
751
827
|
onClick: toggle,
|
|
752
828
|
"aria-expanded": open,
|
|
829
|
+
"aria-controls": discloseId,
|
|
753
830
|
"aria-label": open ? `Collapse ${label}` : `Expand ${label}`,
|
|
754
831
|
className: "relative flex h-9 w-9 shrink-0 items-center justify-center rounded-md focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
755
832
|
children: [
|
|
756
833
|
/* @__PURE__ */ jsx3(
|
|
757
834
|
Icon2,
|
|
758
835
|
{
|
|
759
|
-
className: "h-[17px] w-[17px] shrink-0 opacity-100 transition-opacity
|
|
836
|
+
className: cn("h-[17px] w-[17px] shrink-0 opacity-100 transition-opacity group-hover/exp:opacity-0", MOTION_CONTROL)
|
|
760
837
|
}
|
|
761
838
|
),
|
|
762
839
|
/* @__PURE__ */ jsx3(
|
|
763
840
|
ChevronRightIcon,
|
|
764
841
|
{
|
|
765
842
|
className: cn(
|
|
766
|
-
"absolute h-4 w-4 opacity-0 transition-all
|
|
843
|
+
"absolute h-4 w-4 opacity-0 transition-all group-hover/exp:opacity-100",
|
|
844
|
+
MOTION_CONTROL,
|
|
767
845
|
open && "rotate-90"
|
|
768
846
|
)
|
|
769
847
|
}
|
|
@@ -792,10 +870,10 @@ function RailExpandable({
|
|
|
792
870
|
]
|
|
793
871
|
}
|
|
794
872
|
),
|
|
795
|
-
open
|
|
873
|
+
/* @__PURE__ */ jsx3("div", { ref: discloseRef, id: discloseId, className: "agent-disclose", "data-open": open ? "true" : "false", children: /* @__PURE__ */ jsx3("div", { children: /* @__PURE__ */ jsx3("div", { className: "flex flex-col gap-0.5 pl-3 pt-0.5", children: everOpened ? list : null }) }) })
|
|
796
874
|
] });
|
|
797
875
|
}
|
|
798
|
-
function RailModeButton({ mode, icon, label, badge, className, showLabel }) {
|
|
876
|
+
function RailModeButton({ mode, icon, label, badge, className, showLabel, style }) {
|
|
799
877
|
const { panelOpen, mode: currentMode, switchMode } = useSidebar();
|
|
800
878
|
return /* @__PURE__ */ jsx3(
|
|
801
879
|
RailButton,
|
|
@@ -806,7 +884,8 @@ function RailModeButton({ mode, icon, label, badge, className, showLabel }) {
|
|
|
806
884
|
badge,
|
|
807
885
|
onClick: () => switchMode(mode),
|
|
808
886
|
className,
|
|
809
|
-
showLabel
|
|
887
|
+
showLabel,
|
|
888
|
+
style
|
|
810
889
|
}
|
|
811
890
|
);
|
|
812
891
|
}
|
|
@@ -816,7 +895,8 @@ function SidebarPanel({ children, className }) {
|
|
|
816
895
|
"div",
|
|
817
896
|
{
|
|
818
897
|
className: cn(
|
|
819
|
-
"transition-[opacity]
|
|
898
|
+
"transition-[opacity] h-full overflow-hidden border-l border-[var(--md3-outline-variant)] bg-surface-container-low",
|
|
899
|
+
MOTION_SURFACE,
|
|
820
900
|
panelOpen ? "w-[268px] opacity-100" : "w-0 opacity-0 pointer-events-none",
|
|
821
901
|
className
|
|
822
902
|
),
|
|
@@ -836,7 +916,9 @@ function SidebarContent({ children, className }) {
|
|
|
836
916
|
"main",
|
|
837
917
|
{
|
|
838
918
|
className: cn(
|
|
839
|
-
"min-h-screen transition-[margin-left]
|
|
919
|
+
"min-h-screen transition-[margin-left] lg:ml-[var(--sb-content-margin,0px)]",
|
|
920
|
+
// Same tier as the rail it is keeping pace with — @see Sidebar.
|
|
921
|
+
MOTION_TRAVEL,
|
|
840
922
|
className
|
|
841
923
|
),
|
|
842
924
|
style: { "--sb-content-margin": `${contentMargin}px` },
|
|
@@ -863,7 +945,7 @@ function AppearanceMenuSection({ appearance, divider = true }) {
|
|
|
863
945
|
const resolved = appearance.value === "system" ? systemDark ? "dark" : "light" : appearance.value;
|
|
864
946
|
const TriggerIcon = resolved === "dark" ? MoonIcon : SunIcon;
|
|
865
947
|
const caption = appearance.value === "system" ? `System (${resolved === "dark" ? "Dark" : "Light"})` : APPEARANCE_META[appearance.value].label;
|
|
866
|
-
return /* @__PURE__ */ jsxs2(
|
|
948
|
+
return /* @__PURE__ */ jsxs2(Fragment, { children: [
|
|
867
949
|
divider && /* @__PURE__ */ jsx3(DropdownMenuSeparator, {}),
|
|
868
950
|
/* @__PURE__ */ jsxs2(DropdownMenuSub, { children: [
|
|
869
951
|
/* @__PURE__ */ jsxs2(DropdownMenuSubTrigger, { children: [
|
|
@@ -916,6 +998,7 @@ function ProfileAvatar({
|
|
|
916
998
|
type: "button",
|
|
917
999
|
className: cn(
|
|
918
1000
|
"flex items-center rounded-lg transition-colors hover:bg-[var(--accent-surface-soft)]",
|
|
1001
|
+
MOTION_CONTROL,
|
|
919
1002
|
"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring",
|
|
920
1003
|
showDetails ? "w-full gap-2.5 px-3 py-2 text-left" : "justify-center w-12 h-12",
|
|
921
1004
|
className
|
|
@@ -936,10 +1019,10 @@ function ProfileAvatar({
|
|
|
936
1019
|
user?.avatarUrl && /* @__PURE__ */ jsx3(AvatarImage, { src: user.avatarUrl, alt: "" }),
|
|
937
1020
|
/* @__PURE__ */ jsx3(AvatarFallback, { className: "text-sm bg-[var(--surface-violet-bg)] text-[var(--surface-violet-text)]", children: getInitials(user?.name, user?.email) })
|
|
938
1021
|
] }),
|
|
939
|
-
/* @__PURE__ */ jsx3("div", { className: "min-w-0 flex-1", children: isLoading ? /* @__PURE__ */ jsxs2(
|
|
1022
|
+
/* @__PURE__ */ jsx3("div", { className: "min-w-0 flex-1", children: isLoading ? /* @__PURE__ */ jsxs2(Fragment, { children: [
|
|
940
1023
|
/* @__PURE__ */ jsx3(Skeleton, { className: "h-4 w-24 mb-1" }),
|
|
941
1024
|
/* @__PURE__ */ jsx3(Skeleton, { className: "h-3 w-32" })
|
|
942
|
-
] }) : /* @__PURE__ */ jsxs2(
|
|
1025
|
+
] }) : /* @__PURE__ */ jsxs2(Fragment, { children: [
|
|
943
1026
|
/* @__PURE__ */ jsx3("p", { className: "text-sm font-semibold truncate", children: user?.name ?? user?.email ?? "Not logged in" }),
|
|
944
1027
|
user?.email && user?.name && /* @__PURE__ */ jsx3("p", { className: "text-xs text-muted-foreground truncate", children: user.email }),
|
|
945
1028
|
user?.tier && /* @__PURE__ */ jsxs2("p", { className: "text-xs text-muted-foreground capitalize", children: [
|
|
@@ -958,7 +1041,7 @@ function ProfileAvatar({
|
|
|
958
1041
|
/* @__PURE__ */ jsx3(SettingsIcon, { className: "mr-2 h-4 w-4", "aria-hidden": "true" }),
|
|
959
1042
|
"Settings"
|
|
960
1043
|
] }) }),
|
|
961
|
-
onLogout && /* @__PURE__ */ jsxs2(
|
|
1044
|
+
onLogout && /* @__PURE__ */ jsxs2(Fragment, { children: [
|
|
962
1045
|
/* @__PURE__ */ jsx3(DropdownMenuSeparator, {}),
|
|
963
1046
|
/* @__PURE__ */ jsxs2(DropdownMenuItem, { className: "text-[var(--surface-danger-text)]", onClick: onLogout, children: [
|
|
964
1047
|
/* @__PURE__ */ jsx3(LogOutIcon, { className: "mr-2 h-4 w-4", "aria-hidden": "true" }),
|
|
@@ -1110,7 +1193,7 @@ function OutOfCreditsModal({
|
|
|
1110
1193
|
|
|
1111
1194
|
// src/dashboard/cluster-status-bar.tsx
|
|
1112
1195
|
import * as React5 from "react";
|
|
1113
|
-
import { Fragment as
|
|
1196
|
+
import { Fragment as Fragment3, jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
1114
1197
|
function ClusterStatusBar({ items, latency, className }) {
|
|
1115
1198
|
if (!items?.length) return null;
|
|
1116
1199
|
return /* @__PURE__ */ jsx6("div", { className: cn("fixed bottom-6 left-1/2 -translate-x-1/2 z-40 w-max max-w-[90vw] animate-in slide-in-from-bottom flex justify-center", className), children: /* @__PURE__ */ jsxs5("div", { className: "flex items-center gap-4 overflow-x-auto rounded-full border border-[var(--md3-outline-variant)] bg-surface-container px-5 py-2.5 shadow-sm", children: [
|
|
@@ -1124,11 +1207,11 @@ function ClusterStatusBar({ items, latency, className }) {
|
|
|
1124
1207
|
] })
|
|
1125
1208
|
] })
|
|
1126
1209
|
] }, i)),
|
|
1127
|
-
latency && /* @__PURE__ */ jsxs5(
|
|
1210
|
+
latency && /* @__PURE__ */ jsxs5(Fragment3, { children: [
|
|
1128
1211
|
/* @__PURE__ */ jsx6("span", { "aria-hidden": true, className: "h-5 w-px shrink-0 bg-border" }),
|
|
1129
1212
|
/* @__PURE__ */ jsxs5("div", { className: "flex shrink-0 items-center gap-2", children: [
|
|
1130
1213
|
/* @__PURE__ */ jsxs5("span", { className: "relative flex h-2.5 w-2.5 items-center justify-center", children: [
|
|
1131
|
-
/* @__PURE__ */ jsx6("span", { className: "absolute inline-flex h-full w-full animate-ping rounded-full bg-green-400 opacity-75" }),
|
|
1214
|
+
/* @__PURE__ */ jsx6("span", { className: "absolute inline-flex h-full w-full animate-ping rounded-full bg-green-400 opacity-75", "data-motion": "essential" }),
|
|
1132
1215
|
/* @__PURE__ */ jsx6("span", { className: "relative inline-flex h-2 w-2 rounded-full bg-green-500" })
|
|
1133
1216
|
] }),
|
|
1134
1217
|
/* @__PURE__ */ jsx6("span", { className: "font-mono text-xs font-bold text-green-400", children: latency })
|
|
@@ -1274,7 +1357,7 @@ import {
|
|
|
1274
1357
|
HardDrive,
|
|
1275
1358
|
Box
|
|
1276
1359
|
} from "lucide-react";
|
|
1277
|
-
import { Fragment as
|
|
1360
|
+
import { Fragment as Fragment4, jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
1278
1361
|
function canAdminSandbox(sandbox) {
|
|
1279
1362
|
if (!sandbox.team) return true;
|
|
1280
1363
|
return sandbox.team.role === "owner" || sandbox.team.role === "admin";
|
|
@@ -1374,7 +1457,7 @@ function SandboxCard({
|
|
|
1374
1457
|
}
|
|
1375
1458
|
) }),
|
|
1376
1459
|
/* @__PURE__ */ jsxs9(DropdownMenuContent2, { align: "end", className: "min-w-[180px]", children: [
|
|
1377
|
-
isRunning && /* @__PURE__ */ jsxs9(
|
|
1460
|
+
isRunning && /* @__PURE__ */ jsxs9(Fragment4, { children: [
|
|
1378
1461
|
onStop && /* @__PURE__ */ jsxs9(DropdownMenuItem2, { onClick: () => onStop(sandbox.id), children: [
|
|
1379
1462
|
/* @__PURE__ */ jsx10(PowerOff, { className: "mr-2 h-4 w-4" }),
|
|
1380
1463
|
" Stop Sandbox"
|
|
@@ -1393,7 +1476,7 @@ function SandboxCard({
|
|
|
1393
1476
|
" Health Check"
|
|
1394
1477
|
] }),
|
|
1395
1478
|
(onUsage || onHealth) && /* @__PURE__ */ jsx10(DropdownMenuSeparator2, {}),
|
|
1396
|
-
onFork && /* @__PURE__ */ jsxs9(
|
|
1479
|
+
onFork && /* @__PURE__ */ jsxs9(Fragment4, { children: [
|
|
1397
1480
|
/* @__PURE__ */ jsxs9(DropdownMenuItem2, { onClick: () => onFork(sandbox.id), children: [
|
|
1398
1481
|
/* @__PURE__ */ jsx10(Copy, { className: "mr-2 h-4 w-4" }),
|
|
1399
1482
|
" Fork Sandbox"
|
|
@@ -1401,7 +1484,7 @@ function SandboxCard({
|
|
|
1401
1484
|
/* @__PURE__ */ jsx10(DropdownMenuSeparator2, {})
|
|
1402
1485
|
] })
|
|
1403
1486
|
] }),
|
|
1404
|
-
isStopped && /* @__PURE__ */ jsxs9(
|
|
1487
|
+
isStopped && /* @__PURE__ */ jsxs9(Fragment4, { children: [
|
|
1405
1488
|
resumeHandler && /* @__PURE__ */ jsxs9(DropdownMenuItem2, { onClick: () => resumeHandler(sandbox.id), children: [
|
|
1406
1489
|
/* @__PURE__ */ jsx10(Power, { className: "mr-2 h-4 w-4" }),
|
|
1407
1490
|
" ",
|
|
@@ -1424,11 +1507,15 @@ function SandboxCard({
|
|
|
1424
1507
|
/* @__PURE__ */ jsxs9("div", { className: "flex items-center justify-between", children: [
|
|
1425
1508
|
/* @__PURE__ */ jsxs9("span", { className: "inline-flex items-center gap-1.5 rounded-full border border-[var(--md3-outline-variant)] bg-surface-container-high px-2 py-0.5 text-[11px] font-medium text-foreground", children: [
|
|
1426
1509
|
/* @__PURE__ */ jsxs9("span", { className: "relative flex h-1.5 w-1.5", children: [
|
|
1427
|
-
isRunning &&
|
|
1510
|
+
isRunning && // The ping renders only while the sandbox IS running, so it is
|
|
1511
|
+
// live state, not decoration — the same call SandboxTable makes
|
|
1512
|
+
// for its running/provisioning dot.
|
|
1513
|
+
/* @__PURE__ */ jsx10(
|
|
1428
1514
|
"span",
|
|
1429
1515
|
{
|
|
1430
1516
|
className: "absolute inline-flex h-full w-full animate-ping rounded-full opacity-75",
|
|
1431
|
-
style: { backgroundColor: status.color }
|
|
1517
|
+
style: { backgroundColor: status.color },
|
|
1518
|
+
"data-motion": "essential"
|
|
1432
1519
|
}
|
|
1433
1520
|
),
|
|
1434
1521
|
/* @__PURE__ */ jsx10("span", { className: "relative inline-flex h-1.5 w-1.5 rounded-full", style: { backgroundColor: status.color } })
|
|
@@ -1560,7 +1647,7 @@ import {
|
|
|
1560
1647
|
DropdownMenuSeparator as DropdownMenuSeparator3,
|
|
1561
1648
|
DropdownMenuTrigger as DropdownMenuTrigger3
|
|
1562
1649
|
} from "@tangle-network/ui/primitives";
|
|
1563
|
-
import { Fragment as
|
|
1650
|
+
import { Fragment as Fragment6, jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
|
|
1564
1651
|
var statusColors = {
|
|
1565
1652
|
running: { dot: "bg-[var(--code-success)] animate-pulse", text: "text-[var(--code-success)]", bar: "bg-[var(--code-success)]" },
|
|
1566
1653
|
hibernating: { dot: "bg-muted-foreground", text: "text-muted-foreground", bar: "bg-muted-foreground" },
|
|
@@ -1663,7 +1750,13 @@ function SandboxTable({
|
|
|
1663
1750
|
onClick: onRowClick,
|
|
1664
1751
|
children: [
|
|
1665
1752
|
/* @__PURE__ */ jsx11("td", { className: "px-6 py-5 whitespace-nowrap", children: /* @__PURE__ */ jsxs10("div", { className: "flex items-center gap-2", children: [
|
|
1666
|
-
/* @__PURE__ */ jsx11(
|
|
1753
|
+
/* @__PURE__ */ jsx11(
|
|
1754
|
+
"span",
|
|
1755
|
+
{
|
|
1756
|
+
className: cn("flex h-2.5 w-2.5 rounded-full", sc.dot),
|
|
1757
|
+
...sc.dot.includes("animate-") ? { "data-motion": "essential" } : {}
|
|
1758
|
+
}
|
|
1759
|
+
),
|
|
1667
1760
|
/* @__PURE__ */ jsx11("span", { className: cn("text-xs font-bold uppercase tracking-wide", sc.text), children: sb.status.charAt(0).toUpperCase() + sb.status.slice(1) })
|
|
1668
1761
|
] }) }),
|
|
1669
1762
|
/* @__PURE__ */ jsx11("td", { className: "px-6 py-5", children: /* @__PURE__ */ jsxs10("div", { className: "flex flex-col", children: [
|
|
@@ -1703,14 +1796,14 @@ function SandboxTable({
|
|
|
1703
1796
|
/* @__PURE__ */ jsx11(MiniMeter, { label: "CPU", percent: sb.cpuPercent ?? 0 }),
|
|
1704
1797
|
/* @__PURE__ */ jsx11(MiniMeter, { label: "RAM", percent: sb.ramTotal ? Math.round((sb.ramUsed ?? 0) / sb.ramTotal * 100) : 0 })
|
|
1705
1798
|
] }) : isProvisioning ? /* @__PURE__ */ jsxs10("div", { className: "flex items-center gap-2 text-primary italic text-[10px] font-bold", children: [
|
|
1706
|
-
/* @__PURE__ */ jsx11(RefreshCw, { className: "h-3.5 w-3.5 animate-spin" }),
|
|
1799
|
+
/* @__PURE__ */ jsx11(RefreshCw, { className: "h-3.5 w-3.5 animate-spin", "data-motion": "essential" }),
|
|
1707
1800
|
sb.provisioningMessage ?? "Allocating nodes..."
|
|
1708
1801
|
] }) : isHibernating ? /* @__PURE__ */ jsxs10("div", { className: "space-y-3 w-48 opacity-30", children: [
|
|
1709
1802
|
/* @__PURE__ */ jsx11(MiniMeter, { label: "CPU", percent: 0 }),
|
|
1710
1803
|
/* @__PURE__ */ jsx11(MiniMeter, { label: "RAM", percent: 0 })
|
|
1711
1804
|
] }) : null }),
|
|
1712
1805
|
/* @__PURE__ */ jsx11("td", { className: "px-6 py-5 text-right", children: /* @__PURE__ */ jsxs10("div", { className: "flex items-center justify-end gap-1", children: [
|
|
1713
|
-
isActive && /* @__PURE__ */ jsxs10(
|
|
1806
|
+
isActive && /* @__PURE__ */ jsxs10(Fragment6, { children: [
|
|
1714
1807
|
/* @__PURE__ */ jsx11("button", { type: "button", onClick: (e) => {
|
|
1715
1808
|
stopRowClick(e);
|
|
1716
1809
|
onOpenIDE?.(sb.id);
|
|
@@ -2245,7 +2338,7 @@ function useBrandThemeSync() {
|
|
|
2245
2338
|
}
|
|
2246
2339
|
|
|
2247
2340
|
// src/dashboard/dashboard-layout.tsx
|
|
2248
|
-
import { Fragment as
|
|
2341
|
+
import { Fragment as Fragment8, jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
2249
2342
|
function MenuIcon({ className }) {
|
|
2250
2343
|
return /* @__PURE__ */ jsxs14("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className, children: [
|
|
2251
2344
|
/* @__PURE__ */ jsx17("title", { children: "Menu icon" }),
|
|
@@ -2332,7 +2425,7 @@ function DashboardLayoutInner({
|
|
|
2332
2425
|
);
|
|
2333
2426
|
const activePanel = panels.find((p) => p.mode === mode);
|
|
2334
2427
|
const buildSidebarContent = React9.useCallback(
|
|
2335
|
-
(showLabels, allowCollapse) => /* @__PURE__ */ jsxs14(
|
|
2428
|
+
(showLabels, allowCollapse) => /* @__PURE__ */ jsxs14(Fragment8, { children: [
|
|
2336
2429
|
/* @__PURE__ */ jsxs14(SidebarRail, { wide: showLabels, children: [
|
|
2337
2430
|
/* @__PURE__ */ jsx17(
|
|
2338
2431
|
RailHeader,
|
|
@@ -2356,6 +2449,7 @@ function DashboardLayoutInner({
|
|
|
2356
2449
|
const isMode = modeSet.has(item.id);
|
|
2357
2450
|
const prevIsMode = i > 0 && modeSet.has(navItems[i - 1].id);
|
|
2358
2451
|
const showSep = i > 0 && isMode && !prevIsMode;
|
|
2452
|
+
const arrival = { className: "agent-arrive", style: { "--stagger-index": i } };
|
|
2359
2453
|
return /* @__PURE__ */ jsxs14(React9.Fragment, { children: [
|
|
2360
2454
|
showSep && /* @__PURE__ */ jsx17(
|
|
2361
2455
|
RailSeparator,
|
|
@@ -2370,7 +2464,8 @@ function DashboardLayoutInner({
|
|
|
2370
2464
|
icon: item.icon,
|
|
2371
2465
|
label: item.label,
|
|
2372
2466
|
badge: item.badge,
|
|
2373
|
-
showLabel: showLabels
|
|
2467
|
+
showLabel: showLabels,
|
|
2468
|
+
...arrival
|
|
2374
2469
|
}
|
|
2375
2470
|
) : /* @__PURE__ */ jsx17(
|
|
2376
2471
|
RailButton,
|
|
@@ -2380,6 +2475,7 @@ function DashboardLayoutInner({
|
|
|
2380
2475
|
isActive: activeNavId === item.id,
|
|
2381
2476
|
showLabel: showLabels,
|
|
2382
2477
|
asChild: true,
|
|
2478
|
+
...arrival,
|
|
2383
2479
|
children: /* @__PURE__ */ jsx17(Link, { href: item.href, to: item.href })
|
|
2384
2480
|
}
|
|
2385
2481
|
)
|
|
@@ -2473,14 +2569,17 @@ function DashboardLayoutInner({
|
|
|
2473
2569
|
/* @__PURE__ */ jsxs14(
|
|
2474
2570
|
"nav",
|
|
2475
2571
|
{
|
|
2476
|
-
className:
|
|
2572
|
+
className: cn(
|
|
2573
|
+
"fixed top-0 z-50 bg-surface-container-low border-b border-[var(--md3-outline-variant)] flex justify-between items-center px-8 h-14 font-sans text-[13px] tracking-tight transition-[left,width]",
|
|
2574
|
+
MOTION_TRAVEL
|
|
2575
|
+
),
|
|
2477
2576
|
style: {
|
|
2478
2577
|
left: hidden ? 0 : contentMargin,
|
|
2479
2578
|
width: hidden ? "100%" : `calc(100% - ${contentMargin}px)`
|
|
2480
2579
|
},
|
|
2481
2580
|
children: [
|
|
2482
2581
|
/* @__PURE__ */ jsxs14("div", { className: "flex items-center gap-8", children: [
|
|
2483
|
-
/* @__PURE__ */ jsx17(Link, { href: logoHref, to: logoHref, className: "lg:hidden flex items-center p-1 rounded-md hover:bg-surface-container-high transition-colors", children: /* @__PURE__ */ jsx17(Logo, { variant, size: "sm", iconOnly: true }) }),
|
|
2582
|
+
/* @__PURE__ */ jsx17(Link, { href: logoHref, to: logoHref, className: cn("lg:hidden flex items-center p-1 rounded-md hover:bg-surface-container-high transition-colors", MOTION_CONTROL), children: /* @__PURE__ */ jsx17(Logo, { variant, size: "sm", iconOnly: true }) }),
|
|
2484
2583
|
topBarLeading,
|
|
2485
2584
|
topNavLinks && topNavLinks.length > 0 && /* @__PURE__ */ jsx17("div", { className: "hidden md:flex gap-6", children: topNavLinks.map((link) => /* @__PURE__ */ jsx17(
|
|
2486
2585
|
Link,
|
|
@@ -2488,7 +2587,8 @@ function DashboardLayoutInner({
|
|
|
2488
2587
|
href: link.href,
|
|
2489
2588
|
to: link.href,
|
|
2490
2589
|
className: cn(
|
|
2491
|
-
"transition-all
|
|
2590
|
+
"transition-all px-2 py-1 rounded",
|
|
2591
|
+
MOTION_CONTROL,
|
|
2492
2592
|
activeTopNavHref === link.href ? "text-foreground border-b-2 border-primary pb-1" : "text-muted-foreground hover:text-foreground hover:bg-surface-container-high"
|
|
2493
2593
|
),
|
|
2494
2594
|
children: link.label
|
|
@@ -2502,7 +2602,7 @@ function DashboardLayoutInner({
|
|
|
2502
2602
|
{
|
|
2503
2603
|
type: "button",
|
|
2504
2604
|
onClick: onNewSandbox,
|
|
2505
|
-
className: "hidden md:flex items-center gap-2 bg-[var(--btn-primary-bg)] border border-[var(--border-accent)] text-[var(--btn-primary-text)] px-4 py-2 rounded-lg font-bold hover:bg-[var(--btn-primary-hover)] transition-all active:scale-95 text-xs",
|
|
2605
|
+
className: cn("hidden md:flex items-center gap-2 bg-[var(--btn-primary-bg)] border border-[var(--border-accent)] text-[var(--btn-primary-text)] px-4 py-2 rounded-lg font-bold hover:bg-[var(--btn-primary-hover)] transition-all active:scale-95 text-xs", MOTION_CONTROL),
|
|
2506
2606
|
children: [
|
|
2507
2607
|
/* @__PURE__ */ jsx17(Plus2, { className: "h-3.5 w-3.5" }),
|
|
2508
2608
|
"New Sandbox"
|
|
@@ -2514,7 +2614,7 @@ function DashboardLayoutInner({
|
|
|
2514
2614
|
"button",
|
|
2515
2615
|
{
|
|
2516
2616
|
type: "button",
|
|
2517
|
-
className: "relative text-muted-foreground hover:text-foreground transition-colors p-2 rounded-lg hover:bg-surface-container-high",
|
|
2617
|
+
className: cn("relative text-muted-foreground hover:text-foreground transition-colors p-2 rounded-lg hover:bg-surface-container-high", MOTION_CONTROL),
|
|
2518
2618
|
onClick: () => setNotificationsOpen(!notificationsOpen),
|
|
2519
2619
|
"aria-label": "Notifications",
|
|
2520
2620
|
"aria-expanded": notificationsOpen,
|
|
@@ -2549,6 +2649,7 @@ function DashboardLayoutInner({
|
|
|
2549
2649
|
type: "button",
|
|
2550
2650
|
className: cn(
|
|
2551
2651
|
"w-full text-left px-4 py-3 border-b border-[var(--md3-outline-variant)] last:border-0 transition-colors",
|
|
2652
|
+
MOTION_CONTROL,
|
|
2552
2653
|
n.read ? "cursor-default" : "bg-primary/5 hover:bg-white/5"
|
|
2553
2654
|
),
|
|
2554
2655
|
onClick: () => {
|
|
@@ -2584,7 +2685,8 @@ function DashboardLayoutInner({
|
|
|
2584
2685
|
"aside",
|
|
2585
2686
|
{
|
|
2586
2687
|
className: cn(
|
|
2587
|
-
"fixed top-14 bottom-0 left-0 z-30 flex bg-surface-container-low transition-transform
|
|
2688
|
+
"fixed top-14 bottom-0 left-0 z-30 flex bg-surface-container-low transition-transform lg:hidden",
|
|
2689
|
+
MOTION_TRAVEL,
|
|
2588
2690
|
mobileMenuOpen ? "translate-x-0" : "-translate-x-full"
|
|
2589
2691
|
),
|
|
2590
2692
|
style: {
|
|
@@ -2604,7 +2706,7 @@ function DashboardLayout({ defaultPanelOpen, defaultMode, labeledRail, defaultRa
|
|
|
2604
2706
|
|
|
2605
2707
|
// src/dashboard/sidebar-layout.tsx
|
|
2606
2708
|
import * as React10 from "react";
|
|
2607
|
-
import { Fragment as
|
|
2709
|
+
import { Fragment as Fragment9, jsx as jsx18, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
2608
2710
|
var HIDE_BELOW_CLASS = {
|
|
2609
2711
|
md: "max-md:hidden",
|
|
2610
2712
|
lg: "max-lg:hidden"
|
|
@@ -2667,7 +2769,8 @@ function SidebarLayoutInner({
|
|
|
2667
2769
|
showLabels: showLabels2,
|
|
2668
2770
|
onNavigate
|
|
2669
2771
|
}) {
|
|
2670
|
-
return navItems.map((item) => {
|
|
2772
|
+
return navItems.map((item, index) => {
|
|
2773
|
+
const arrival = { className: "agent-arrive", style: { "--stagger-index": index } };
|
|
2671
2774
|
if (item.expandable) {
|
|
2672
2775
|
return /* @__PURE__ */ jsx18(
|
|
2673
2776
|
RailExpandable,
|
|
@@ -2683,7 +2786,8 @@ function SidebarLayoutInner({
|
|
|
2683
2786
|
emptyLabel: item.emptyLabel,
|
|
2684
2787
|
defaultOpen: item.defaultOpen,
|
|
2685
2788
|
onNavigate,
|
|
2686
|
-
LinkComponent
|
|
2789
|
+
LinkComponent,
|
|
2790
|
+
...arrival
|
|
2687
2791
|
},
|
|
2688
2792
|
item.id
|
|
2689
2793
|
);
|
|
@@ -2698,6 +2802,7 @@ function SidebarLayoutInner({
|
|
|
2698
2802
|
title: item.label,
|
|
2699
2803
|
showLabel: showLabels2,
|
|
2700
2804
|
isActive: activeId === item.id || item.flyoutItems.some((f) => activeSet.has(f.id)),
|
|
2805
|
+
...arrival,
|
|
2701
2806
|
children: item.flyoutItems.map((f) => {
|
|
2702
2807
|
const FIcon = f.icon;
|
|
2703
2808
|
const active = activeSet.has(f.id);
|
|
@@ -2710,6 +2815,7 @@ function SidebarLayoutInner({
|
|
|
2710
2815
|
...f.prefetch !== void 0 ? { prefetch: f.prefetch } : {},
|
|
2711
2816
|
className: cn(
|
|
2712
2817
|
"flex h-9 items-center gap-2.5 rounded-lg px-2.5 text-sm transition-colors",
|
|
2818
|
+
MOTION_CONTROL,
|
|
2713
2819
|
active ? "bg-[var(--accent-surface-strong)] font-medium text-[var(--accent-text)]" : "text-muted-foreground hover:bg-[var(--accent-surface-soft)] hover:text-[var(--accent-text)]"
|
|
2714
2820
|
),
|
|
2715
2821
|
children: [
|
|
@@ -2735,10 +2841,11 @@ function SidebarLayoutInner({
|
|
|
2735
2841
|
togglePanel();
|
|
2736
2842
|
onNavigate?.();
|
|
2737
2843
|
},
|
|
2738
|
-
showLabel: showLabels2
|
|
2844
|
+
showLabel: showLabels2,
|
|
2845
|
+
...arrival
|
|
2739
2846
|
},
|
|
2740
2847
|
item.id
|
|
2741
|
-
) : /* @__PURE__ */ jsx18(RailButton, { icon: item.icon, label: item.label, badge: item.badge, isActive: activeId === item.id, showLabel: showLabels2, variant: item.variant, asChild: true, children: /* @__PURE__ */ jsx18(
|
|
2848
|
+
) : /* @__PURE__ */ jsx18(RailButton, { icon: item.icon, label: item.label, badge: item.badge, isActive: activeId === item.id, showLabel: showLabels2, variant: item.variant, asChild: true, ...arrival, children: /* @__PURE__ */ jsx18(
|
|
2742
2849
|
Link,
|
|
2743
2850
|
{
|
|
2744
2851
|
href: item.href,
|
|
@@ -2803,7 +2910,7 @@ function SidebarLayoutInner({
|
|
|
2803
2910
|
"aria-controls": "sidebar-mobile-nav",
|
|
2804
2911
|
"aria-haspopup": "dialog",
|
|
2805
2912
|
onClick: () => setMobileNavOpen(true),
|
|
2806
|
-
className: "flex size-10 shrink-0 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-[var(--accent-surface-soft)] hover:text-foreground",
|
|
2913
|
+
className: cn("flex size-10 shrink-0 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-[var(--accent-surface-soft)] hover:text-foreground", MOTION_CONTROL),
|
|
2807
2914
|
children: /* @__PURE__ */ jsx18(MenuIcon2, { className: "size-5" })
|
|
2808
2915
|
}
|
|
2809
2916
|
),
|
|
@@ -2832,7 +2939,7 @@ function SidebarLayoutInner({
|
|
|
2832
2939
|
breakpoint: hideBelow,
|
|
2833
2940
|
onClose: closeMobileNav,
|
|
2834
2941
|
header: railHeaderContent ?? logo,
|
|
2835
|
-
footer: railFooter !== void 0 || hasProfile ? /* @__PURE__ */ jsxs15(
|
|
2942
|
+
footer: railFooter !== void 0 || hasProfile ? /* @__PURE__ */ jsxs15(Fragment9, { children: [
|
|
2836
2943
|
railFooter,
|
|
2837
2944
|
hasProfile && /* @__PURE__ */ jsx18(
|
|
2838
2945
|
ProfileAvatar,
|
|
@@ -2927,7 +3034,7 @@ function MobileNavDrawer({
|
|
|
2927
3034
|
"aria-modal": "true",
|
|
2928
3035
|
"aria-label": "Navigation",
|
|
2929
3036
|
style: { width: SIDEBAR_MOBILE_WIDTH },
|
|
2930
|
-
className: "absolute inset-y-0 left-0 flex max-w-[85vw] flex-col border-r border-[var(--md3-outline-variant)] bg-surface-container-low shadow-xl",
|
|
3037
|
+
className: "agent-arrive absolute inset-y-0 left-0 flex max-w-[85vw] flex-col border-r border-[var(--md3-outline-variant)] bg-surface-container-low shadow-xl",
|
|
2931
3038
|
children: [
|
|
2932
3039
|
/* @__PURE__ */ jsxs15("div", { className: "flex h-14 shrink-0 items-center gap-1 border-b border-[var(--md3-outline-variant)] px-2", children: [
|
|
2933
3040
|
/* @__PURE__ */ jsx18("div", { className: "flex min-w-0 flex-1 items-center", children: header }),
|
|
@@ -2937,7 +3044,7 @@ function MobileNavDrawer({
|
|
|
2937
3044
|
type: "button",
|
|
2938
3045
|
"aria-label": "Close navigation",
|
|
2939
3046
|
onClick: onClose,
|
|
2940
|
-
className: "flex size-9 shrink-0 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-[var(--accent-surface-soft)] hover:text-foreground",
|
|
3047
|
+
className: cn("flex size-9 shrink-0 items-center justify-center rounded-lg text-muted-foreground transition-colors hover:bg-[var(--accent-surface-soft)] hover:text-foreground", MOTION_CONTROL),
|
|
2941
3048
|
children: /* @__PURE__ */ jsx18(CloseIcon, { className: "size-5" })
|
|
2942
3049
|
}
|
|
2943
3050
|
)
|
|
@@ -2989,7 +3096,7 @@ import {
|
|
|
2989
3096
|
DropdownMenuSeparator as DropdownMenuSeparator4,
|
|
2990
3097
|
DropdownMenuTrigger as DropdownMenuTrigger4
|
|
2991
3098
|
} from "@tangle-network/ui/primitives";
|
|
2992
|
-
import { Fragment as
|
|
3099
|
+
import { Fragment as Fragment10, jsx as jsx19, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
2993
3100
|
function ProfileSelector({
|
|
2994
3101
|
profiles,
|
|
2995
3102
|
selectedId,
|
|
@@ -3023,7 +3130,7 @@ function ProfileSelector({
|
|
|
3023
3130
|
]
|
|
3024
3131
|
}
|
|
3025
3132
|
),
|
|
3026
|
-
builtinProfiles.length > 0 && /* @__PURE__ */ jsxs16(
|
|
3133
|
+
builtinProfiles.length > 0 && /* @__PURE__ */ jsxs16(Fragment10, { children: [
|
|
3027
3134
|
/* @__PURE__ */ jsx19(DropdownMenuSeparator4, {}),
|
|
3028
3135
|
/* @__PURE__ */ jsx19(DropdownMenuLabel2, { children: "Built-in Profiles" }),
|
|
3029
3136
|
builtinProfiles.map((profile) => /* @__PURE__ */ jsxs16(
|
|
@@ -3048,7 +3155,7 @@ function ProfileSelector({
|
|
|
3048
3155
|
profile.id
|
|
3049
3156
|
))
|
|
3050
3157
|
] }),
|
|
3051
|
-
customProfiles.length > 0 && /* @__PURE__ */ jsxs16(
|
|
3158
|
+
customProfiles.length > 0 && /* @__PURE__ */ jsxs16(Fragment10, { children: [
|
|
3052
3159
|
/* @__PURE__ */ jsx19(DropdownMenuSeparator4, {}),
|
|
3053
3160
|
/* @__PURE__ */ jsx19(DropdownMenuLabel2, { children: "Custom Profiles" }),
|
|
3054
3161
|
customProfiles.map((profile) => /* @__PURE__ */ jsxs16(
|
|
@@ -3085,7 +3192,7 @@ function ProfileSelector({
|
|
|
3085
3192
|
profile.id
|
|
3086
3193
|
))
|
|
3087
3194
|
] }),
|
|
3088
|
-
(onCreateClick || onManageClick) && /* @__PURE__ */ jsxs16(
|
|
3195
|
+
(onCreateClick || onManageClick) && /* @__PURE__ */ jsxs16(Fragment10, { children: [
|
|
3089
3196
|
/* @__PURE__ */ jsx19(DropdownMenuSeparator4, {}),
|
|
3090
3197
|
onCreateClick && /* @__PURE__ */ jsxs16(
|
|
3091
3198
|
DropdownMenuItem4,
|
|
@@ -3327,7 +3434,7 @@ import {
|
|
|
3327
3434
|
} from "lucide-react";
|
|
3328
3435
|
import { Button as Button3 } from "@tangle-network/ui/primitives";
|
|
3329
3436
|
import { Badge as Badge2 } from "@tangle-network/ui/primitives";
|
|
3330
|
-
import { Fragment as
|
|
3437
|
+
import { Fragment as Fragment12, jsx as jsx21, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
3331
3438
|
var statusConfig = {
|
|
3332
3439
|
pending: {
|
|
3333
3440
|
icon: Clock3,
|
|
@@ -3426,7 +3533,8 @@ function VariantList({
|
|
|
3426
3533
|
/* @__PURE__ */ jsx21(
|
|
3427
3534
|
StatusIcon,
|
|
3428
3535
|
{
|
|
3429
|
-
className: `mr-1 h-3 w-3 ${status.animate ? "animate-spin" : ""}
|
|
3536
|
+
className: `mr-1 h-3 w-3 ${status.animate ? "animate-spin" : ""}`,
|
|
3537
|
+
...status.animate ? { "data-motion": "essential" } : {}
|
|
3430
3538
|
}
|
|
3431
3539
|
),
|
|
3432
3540
|
status.label
|
|
@@ -3450,7 +3558,7 @@ function VariantList({
|
|
|
3450
3558
|
children: outcomeConfig[variant.outcome].label
|
|
3451
3559
|
}
|
|
3452
3560
|
),
|
|
3453
|
-
variant.status === "completed" && variant.outcome === "pending_review" && onAccept && onReject && /* @__PURE__ */ jsxs18(
|
|
3561
|
+
variant.status === "completed" && variant.outcome === "pending_review" && onAccept && onReject && /* @__PURE__ */ jsxs18(Fragment12, { children: [
|
|
3454
3562
|
/* @__PURE__ */ jsxs18(
|
|
3455
3563
|
Button3,
|
|
3456
3564
|
{
|
|
@@ -3885,7 +3993,7 @@ function ProcessList({ processes, onSpawn, onKill, loading = false, className })
|
|
|
3885
3993
|
};
|
|
3886
3994
|
return /* @__PURE__ */ jsxs23("div", { className: cn("space-y-4", className), children: [
|
|
3887
3995
|
loading ? /* @__PURE__ */ jsxs23("div", { className: "rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container p-6 text-center", children: [
|
|
3888
|
-
/* @__PURE__ */ jsx26(Activity3, { className: "mx-auto h-6 w-6 text-muted-foreground animate-spin mb-2" }),
|
|
3996
|
+
/* @__PURE__ */ jsx26(Activity3, { className: "mx-auto h-6 w-6 text-muted-foreground animate-spin mb-2", "data-motion": "essential" }),
|
|
3889
3997
|
/* @__PURE__ */ jsx26("p", { className: "text-sm text-muted-foreground", children: "Loading processes..." })
|
|
3890
3998
|
] }) : processes.length > 0 ? /* @__PURE__ */ jsx26("div", { className: "rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container overflow-hidden", children: /* @__PURE__ */ jsxs23("table", { className: "w-full text-sm", children: [
|
|
3891
3999
|
/* @__PURE__ */ jsx26("thead", { className: "bg-surface-container-high border-b border-[var(--md3-outline-variant)]", children: /* @__PURE__ */ jsxs23("tr", { children: [
|
|
@@ -3974,7 +4082,7 @@ function NetworkConfig({ config, onUpdate, loading = false, className }) {
|
|
|
3974
4082
|
};
|
|
3975
4083
|
if (loading || !config) {
|
|
3976
4084
|
return /* @__PURE__ */ jsxs24("div", { className: cn("rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container p-6 text-center", className), children: [
|
|
3977
|
-
/* @__PURE__ */ jsx27(Network2, { className: "mx-auto h-6 w-6 text-muted-foreground animate-pulse mb-2" }),
|
|
4085
|
+
/* @__PURE__ */ jsx27(Network2, { className: "mx-auto h-6 w-6 text-muted-foreground animate-pulse mb-2", "data-motion": "essential" }),
|
|
3978
4086
|
/* @__PURE__ */ jsx27("p", { className: "text-sm text-muted-foreground", children: "Loading network configuration..." })
|
|
3979
4087
|
] });
|
|
3980
4088
|
}
|
|
@@ -4058,7 +4166,7 @@ function NetworkConfig({ config, onUpdate, loading = false, className }) {
|
|
|
4058
4166
|
// src/dashboard/backend-config.tsx
|
|
4059
4167
|
import * as React16 from "react";
|
|
4060
4168
|
import { Bot as Bot2, Plus as Plus7, Trash2 as Trash25, Server, Wrench } from "lucide-react";
|
|
4061
|
-
import { Fragment as
|
|
4169
|
+
import { Fragment as Fragment13, jsx as jsx28, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
4062
4170
|
function BackendConfig({
|
|
4063
4171
|
status,
|
|
4064
4172
|
mcpServers,
|
|
@@ -4089,7 +4197,7 @@ function BackendConfig({
|
|
|
4089
4197
|
};
|
|
4090
4198
|
if (loading || !status) {
|
|
4091
4199
|
return /* @__PURE__ */ jsxs25("div", { className: cn("rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container p-6 text-center", className), children: [
|
|
4092
|
-
/* @__PURE__ */ jsx28(Bot2, { className: "mx-auto h-6 w-6 text-muted-foreground animate-pulse mb-2" }),
|
|
4200
|
+
/* @__PURE__ */ jsx28(Bot2, { className: "mx-auto h-6 w-6 text-muted-foreground animate-pulse mb-2", "data-motion": "essential" }),
|
|
4093
4201
|
/* @__PURE__ */ jsx28("p", { className: "text-sm text-muted-foreground", children: "Loading backend status..." })
|
|
4094
4202
|
] });
|
|
4095
4203
|
}
|
|
@@ -4115,7 +4223,7 @@ function BackendConfig({
|
|
|
4115
4223
|
), children: status.running ? "Running" : "Stopped" }) }),
|
|
4116
4224
|
/* @__PURE__ */ jsx28("dt", { className: "text-muted-foreground", children: "Model" }),
|
|
4117
4225
|
/* @__PURE__ */ jsx28("dd", { className: "font-mono text-xs", children: status.model ?? "Default" }),
|
|
4118
|
-
status.provider && /* @__PURE__ */ jsxs25(
|
|
4226
|
+
status.provider && /* @__PURE__ */ jsxs25(Fragment13, { children: [
|
|
4119
4227
|
/* @__PURE__ */ jsx28("dt", { className: "text-muted-foreground", children: "Provider" }),
|
|
4120
4228
|
/* @__PURE__ */ jsx28("dd", { className: "font-mono text-xs", children: status.provider })
|
|
4121
4229
|
] })
|
|
@@ -4305,7 +4413,7 @@ function SnapshotList({ snapshots, onCreate, onRestore, onSaveAsTemplate, loadin
|
|
|
4305
4413
|
] })
|
|
4306
4414
|
] }),
|
|
4307
4415
|
loading ? /* @__PURE__ */ jsxs26("div", { className: "rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container p-6 text-center", children: [
|
|
4308
|
-
/* @__PURE__ */ jsx29(Camera, { className: "mx-auto h-6 w-6 text-muted-foreground animate-pulse mb-2" }),
|
|
4416
|
+
/* @__PURE__ */ jsx29(Camera, { className: "mx-auto h-6 w-6 text-muted-foreground animate-pulse mb-2", "data-motion": "essential" }),
|
|
4309
4417
|
/* @__PURE__ */ jsx29("p", { className: "text-sm text-muted-foreground", children: "Loading snapshots..." })
|
|
4310
4418
|
] }) : snapshots.length > 0 ? /* @__PURE__ */ jsx29("div", { className: "rounded-lg border border-[var(--md3-outline-variant)] bg-surface-container overflow-hidden", children: /* @__PURE__ */ jsxs26("table", { className: "w-full text-sm", children: [
|
|
4311
4419
|
/* @__PURE__ */ jsx29("thead", { className: "bg-surface-container-high border-b border-[var(--md3-outline-variant)]", children: /* @__PURE__ */ jsxs26("tr", { children: [
|
|
@@ -4361,7 +4469,7 @@ function SnapshotList({ snapshots, onCreate, onRestore, onSaveAsTemplate, loadin
|
|
|
4361
4469
|
}
|
|
4362
4470
|
|
|
4363
4471
|
// src/dashboard/promo-banner.tsx
|
|
4364
|
-
import { Fragment as
|
|
4472
|
+
import { Fragment as Fragment14, jsx as jsx30, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
4365
4473
|
function PromoBanner({
|
|
4366
4474
|
title,
|
|
4367
4475
|
description,
|
|
@@ -4376,7 +4484,7 @@ function PromoBanner({
|
|
|
4376
4484
|
"mt-6 inline-flex items-center gap-2 rounded-md border border-white/20 bg-[var(--btn-primary-bg)] px-4 py-2 text-sm font-medium text-[var(--btn-primary-text)] transition-colors",
|
|
4377
4485
|
disabled ? "opacity-50 cursor-not-allowed" : "hover:bg-[var(--btn-primary-hover)]"
|
|
4378
4486
|
);
|
|
4379
|
-
const buttonContent = /* @__PURE__ */ jsxs27(
|
|
4487
|
+
const buttonContent = /* @__PURE__ */ jsxs27(Fragment14, { children: [
|
|
4380
4488
|
buttonLabel,
|
|
4381
4489
|
/* @__PURE__ */ jsxs27("svg", { "aria-hidden": "true", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", className: "h-4 w-4", children: [
|
|
4382
4490
|
/* @__PURE__ */ jsx30("path", { d: "M5 12h14" }),
|