@tangle-network/sandbox-ui 0.99.2 → 0.100.1

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.
@@ -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 { Fragment, jsx as jsx2, jsxs } from "react/jsx-runtime";
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
- if (disabled) return /* @__PURE__ */ jsx2(Fragment, { children });
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: cn(
190
- "pointer-events-none z-[70] whitespace-nowrap px-2 py-1 text-xs font-medium text-popover-foreground",
191
- RAIL_FLOATING_SURFACE
192
- ),
193
- children: label
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 as Fragment2, jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
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 duration-150 group-hover/brand:opacity-0", children: brand }),
355
- /* @__PURE__ */ jsx3("span", { className: "pointer-events-none absolute inset-0 flex items-center justify-center text-foreground opacity-0 transition-opacity duration-150 group-hover/brand:opacity-100", children: /* @__PURE__ */ jsx3(PanelLeft, { className: "h-[18px] w-[18px]" }) })
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(Fragment2, { children: [
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] duration-200 ease-in-out",
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 duration-150",
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(Fragment2, { children: [
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
- { className: cn(classes, child.props.className), "aria-label": child.props["aria-label"] ?? label },
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 duration-150",
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 duration-200",
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-text",
670
+ item.isLoading && "agent-shimmer",
611
671
  item.unread && !active && "font-medium text-foreground"
612
672
  ),
613
- ...item.isLoading ? { role: "status", "aria-label": "Agent responding" } : {},
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: "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",
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 duration-150",
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) ensureLoaded();
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 duration-150",
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 duration-150 group-hover/exp:opacity-0"
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 duration-150 group-hover/exp:opacity-100",
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 && /* @__PURE__ */ jsx3("div", { className: "mt-0.5 flex flex-col gap-0.5 pl-3", children: list })
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] duration-150 h-full overflow-hidden border-l border-[var(--md3-outline-variant)] bg-surface-container-low",
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] duration-200 ease-in-out lg:ml-[var(--sb-content-margin,0px)]",
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(Fragment2, { children: [
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(Fragment2, { children: [
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(Fragment2, { children: [
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(Fragment2, { children: [
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 Fragment4, jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
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(Fragment4, { children: [
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 Fragment5, jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
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(Fragment5, { children: [
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(Fragment5, { children: [
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(Fragment5, { children: [
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 && /* @__PURE__ */ jsx10(
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 Fragment7, jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
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("span", { className: cn("flex h-2.5 w-2.5 rounded-full", sc.dot) }),
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(Fragment7, { children: [
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 Fragment9, jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
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(Fragment9, { children: [
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: "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] duration-200 ease-in-out",
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 duration-300 px-2 py-1 rounded",
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 duration-200 lg:hidden",
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 Fragment10, jsx as jsx18, jsxs as jsxs15 } from "react/jsx-runtime";
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(Fragment10, { children: [
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 Fragment11, jsx as jsx19, jsxs as jsxs16 } from "react/jsx-runtime";
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(Fragment11, { children: [
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(Fragment11, { children: [
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(Fragment11, { children: [
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 Fragment13, jsx as jsx21, jsxs as jsxs18 } from "react/jsx-runtime";
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(Fragment13, { children: [
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 Fragment14, jsx as jsx28, jsxs as jsxs25 } from "react/jsx-runtime";
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(Fragment14, { children: [
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 Fragment15, jsx as jsx30, jsxs as jsxs27 } from "react/jsx-runtime";
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(Fragment15, { children: [
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" }),