@tangle-network/sandbox-ui 0.128.2 → 0.128.3

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.
@@ -8,6 +8,7 @@ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
8
  import * as React$1 from "react";
9
9
  import { useEffect, useId, useRef, useState } from "react";
10
10
  import { createPortal } from "react-dom";
11
+ import * as Dialog$1 from "@radix-ui/react-dialog";
11
12
  import { Activity, ArrowRight, BarChart2, Bell, Bot, Box, Camera, Check, ChevronDown, ChevronLeft, ChevronRight, Clock, Code2, Copy, Cpu, DollarSign, ExternalLink, File, FileEdit, FilePlus, GitBranch, GitCommit, Globe, HardDrive, Key, Layers, MemoryStick, MessageSquare, Monitor, MoreHorizontal, MoreVertical, Network, PanelLeft, Play, Plug, Plus, Power, PowerOff, RotateCcw, Skull, Terminal, Trash2, User, Users } from "lucide-react";
12
13
  import { focusField, focusRing, focusRingInset, timeAgo } from "@tangle-network/ui/utils";
13
14
  import * as Select$1 from "@radix-ui/react-select";
@@ -2810,6 +2811,20 @@ function SidebarLayoutInner({ children, navItems, activeId, panel, logo, logoHre
2810
2811
  const showLabels = railLabels && !railCollapsed;
2811
2812
  const [mobileNavOpen, setMobileNavOpen] = React$1.useState(false);
2812
2813
  const closeMobileNav = React$1.useCallback(() => setMobileNavOpen(false), []);
2814
+ React$1.useEffect(() => {
2815
+ if (!mobileNavOpen) return;
2816
+ if (!hideBelow) {
2817
+ setMobileNavOpen(false);
2818
+ return;
2819
+ }
2820
+ const desktop = window.matchMedia(hideBelow === "md" ? "(min-width: 48rem)" : "(min-width: 64rem)");
2821
+ const closeOnDesktop = () => {
2822
+ if (desktop.matches) setMobileNavOpen(false);
2823
+ };
2824
+ closeOnDesktop();
2825
+ desktop.addEventListener("change", closeOnDesktop);
2826
+ return () => desktop.removeEventListener("change", closeOnDesktop);
2827
+ }, [hideBelow, mobileNavOpen]);
2813
2828
  /**
2814
2829
  * One nav list, rendered twice — once in the desktop rail, once in the mobile
2815
2830
  * drawer. Sharing the renderer is the point: a product adds a destination to
@@ -2899,110 +2914,115 @@ function SidebarLayoutInner({ children, navItems, activeId, panel, logo, logoHre
2899
2914
  }, item.id);
2900
2915
  });
2901
2916
  }
2902
- return /* @__PURE__ */ jsxs("div", {
2903
- className: cn$1("min-h-screen bg-surface text-foreground", className),
2904
- children: [
2905
- /* @__PURE__ */ jsx("div", {
2906
- className: cn$1(hideBelow && HIDE_BELOW_CLASS[hideBelow]),
2907
- children: /* @__PURE__ */ jsxs(Sidebar, {
2908
- className: sidebarClassName,
2909
- children: [/* @__PURE__ */ jsxs(SidebarRail, { children: [
2910
- (logo !== void 0 || railHeaderContent !== void 0 || railLabels) && /* @__PURE__ */ jsx(RailHeader, {
2911
- brand: logo,
2912
- brandHref: logoHref,
2913
- collapsed: !showLabels,
2914
- onToggle: toggleRail,
2915
- collapsible: railLabels,
2916
- LinkComponent,
2917
- children: railHeaderContent
2918
- }),
2919
- /* @__PURE__ */ jsx(SidebarRailNav, {
2920
- className: cn$1(showLabels ? "px-2" : void 0, expandOnEmptyClick && "cursor-pointer"),
2921
- onClick: expandOnEmptyClick,
2922
- children: renderNavItems({
2923
- showLabels,
2924
- onNavigate: handleNavClick
2917
+ return /* @__PURE__ */ jsx(Dialog$1.Root, {
2918
+ open: mobileNavOpen,
2919
+ onOpenChange: setMobileNavOpen,
2920
+ children: /* @__PURE__ */ jsxs("div", {
2921
+ className: cn$1("min-h-screen bg-surface text-foreground", className),
2922
+ children: [
2923
+ /* @__PURE__ */ jsx("div", {
2924
+ className: cn$1(hideBelow && HIDE_BELOW_CLASS[hideBelow]),
2925
+ children: /* @__PURE__ */ jsxs(Sidebar, {
2926
+ className: sidebarClassName,
2927
+ children: [/* @__PURE__ */ jsxs(SidebarRail, { children: [
2928
+ (logo !== void 0 || railHeaderContent !== void 0 || railLabels) && /* @__PURE__ */ jsx(RailHeader, {
2929
+ brand: logo,
2930
+ brandHref: logoHref,
2931
+ collapsed: !showLabels,
2932
+ onToggle: toggleRail,
2933
+ collapsible: railLabels,
2934
+ LinkComponent,
2935
+ children: railHeaderContent
2936
+ }),
2937
+ /* @__PURE__ */ jsx(SidebarRailNav, {
2938
+ className: cn$1(showLabels ? "px-2" : void 0, expandOnEmptyClick && "cursor-pointer"),
2939
+ onClick: expandOnEmptyClick,
2940
+ children: renderNavItems({
2941
+ showLabels,
2942
+ onNavigate: handleNavClick
2943
+ })
2944
+ }),
2945
+ (railFooter !== void 0 || hasProfile) && /* @__PURE__ */ jsxs(SidebarRailFooter, {
2946
+ className: cn$1("border-t border-[var(--md3-outline-variant)] pt-2", showLabels && "items-stretch px-2"),
2947
+ children: [railFooter, hasProfile && /* @__PURE__ */ jsx(ProfileAvatar, {
2948
+ user: user ?? void 0,
2949
+ isLoading,
2950
+ onLogout,
2951
+ onSettingsClick,
2952
+ settingsHref,
2953
+ showDetails: showLabels,
2954
+ appearance,
2955
+ LinkComponent: Link,
2956
+ children: profileMenuItems
2957
+ })]
2925
2958
  })
2926
- }),
2927
- (railFooter !== void 0 || hasProfile) && /* @__PURE__ */ jsxs(SidebarRailFooter, {
2928
- className: cn$1("border-t border-[var(--md3-outline-variant)] pt-2", showLabels && "items-stretch px-2"),
2929
- children: [railFooter, hasProfile && /* @__PURE__ */ jsx(ProfileAvatar, {
2959
+ ] }), panel != null && /* @__PURE__ */ jsx(SidebarPanel, { children: panel })]
2960
+ })
2961
+ }),
2962
+ /* @__PURE__ */ jsxs(SidebarContent, {
2963
+ className: contentClassName,
2964
+ children: [hideBelow && /* @__PURE__ */ jsxs("header", {
2965
+ className: cn$1("flex h-14 shrink-0 items-center gap-1 border-b border-[var(--md3-outline-variant)] bg-surface px-2", SHOW_BELOW_CLASS[hideBelow]),
2966
+ children: [
2967
+ /* @__PURE__ */ jsx(Dialog$1.Trigger, {
2968
+ asChild: true,
2969
+ children: /* @__PURE__ */ jsx("button", {
2970
+ type: "button",
2971
+ "aria-label": "Open navigation",
2972
+ "aria-expanded": mobileNavOpen,
2973
+ "aria-controls": "sidebar-mobile-nav",
2974
+ "aria-haspopup": "dialog",
2975
+ className: cn$1("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", "duration-[var(--duration-fast)] ease-[var(--ease-standard)]"),
2976
+ children: /* @__PURE__ */ jsx(MenuIcon, { className: "size-5" })
2977
+ })
2978
+ }),
2979
+ /* @__PURE__ */ jsx("div", {
2980
+ className: "flex min-w-0 flex-1 items-center",
2981
+ children: railHeaderContent ?? (logo !== void 0 ? /* @__PURE__ */ jsx(Link, {
2982
+ href: logoHref,
2983
+ to: logoHref,
2984
+ className: "flex min-w-0 items-center",
2985
+ children: logo
2986
+ }) : null)
2987
+ }),
2988
+ hasProfile && /* @__PURE__ */ jsx(ProfileAvatar, {
2930
2989
  user: user ?? void 0,
2931
2990
  isLoading,
2932
2991
  onLogout,
2933
2992
  onSettingsClick,
2934
2993
  settingsHref,
2935
- showDetails: showLabels,
2936
2994
  appearance,
2937
2995
  LinkComponent: Link,
2938
2996
  children: profileMenuItems
2939
- })]
2940
- })
2941
- ] }), panel != null && /* @__PURE__ */ jsx(SidebarPanel, { children: panel })]
2942
- })
2943
- }),
2944
- /* @__PURE__ */ jsxs(SidebarContent, {
2945
- className: contentClassName,
2946
- children: [hideBelow && /* @__PURE__ */ jsxs("header", {
2947
- className: cn$1("flex h-14 shrink-0 items-center gap-1 border-b border-[var(--md3-outline-variant)] bg-surface px-2", SHOW_BELOW_CLASS[hideBelow]),
2948
- children: [
2949
- /* @__PURE__ */ jsx("button", {
2950
- type: "button",
2951
- "aria-label": "Open navigation",
2952
- "aria-expanded": mobileNavOpen,
2953
- "aria-controls": "sidebar-mobile-nav",
2954
- "aria-haspopup": "dialog",
2955
- onClick: () => setMobileNavOpen(true),
2956
- className: cn$1("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", "duration-[var(--duration-fast)] ease-[var(--ease-standard)]"),
2957
- children: /* @__PURE__ */ jsx(MenuIcon, { className: "size-5" })
2958
- }),
2959
- /* @__PURE__ */ jsx("div", {
2960
- className: "flex min-w-0 flex-1 items-center",
2961
- children: railHeaderContent ?? (logo !== void 0 ? /* @__PURE__ */ jsx(Link, {
2962
- href: logoHref,
2963
- to: logoHref,
2964
- className: "flex min-w-0 items-center",
2965
- children: logo
2966
- }) : null)
2967
- }),
2968
- hasProfile && /* @__PURE__ */ jsx(ProfileAvatar, {
2969
- user: user ?? void 0,
2970
- isLoading,
2971
- onLogout,
2972
- onSettingsClick,
2973
- settingsHref,
2974
- appearance,
2975
- LinkComponent: Link,
2976
- children: profileMenuItems
2977
- })
2978
- ]
2979
- }), children]
2980
- }),
2981
- hideBelow && mobileNavOpen && /* @__PURE__ */ jsx(MobileNavDrawer, {
2982
- breakpoint: hideBelow,
2983
- onClose: closeMobileNav,
2984
- header: railHeaderContent ?? logo,
2985
- footer: railFooter !== void 0 || hasProfile ? /* @__PURE__ */ jsxs(Fragment, { children: [railFooter, hasProfile && /* @__PURE__ */ jsx(ProfileAvatar, {
2986
- user: user ?? void 0,
2987
- isLoading,
2988
- onLogout,
2989
- onSettingsClick,
2990
- settingsHref,
2991
- showDetails: true,
2992
- appearance,
2993
- LinkComponent: Link,
2994
- children: profileMenuItems
2995
- })] }) : null,
2996
- panel,
2997
- children: renderNavItems({
2998
- showLabels: true,
2999
- onNavigate: () => {
3000
- handleNavClick?.();
3001
- closeMobileNav();
3002
- }
2997
+ })
2998
+ ]
2999
+ }), children]
3000
+ }),
3001
+ hideBelow && mobileNavOpen && /* @__PURE__ */ jsx(MobileNavDrawer, {
3002
+ breakpoint: hideBelow,
3003
+ header: railHeaderContent ?? logo,
3004
+ footer: railFooter !== void 0 || hasProfile ? /* @__PURE__ */ jsxs(Fragment, { children: [railFooter, hasProfile && /* @__PURE__ */ jsx(ProfileAvatar, {
3005
+ user: user ?? void 0,
3006
+ isLoading,
3007
+ onLogout,
3008
+ onSettingsClick,
3009
+ settingsHref,
3010
+ showDetails: true,
3011
+ appearance,
3012
+ LinkComponent: Link,
3013
+ children: profileMenuItems
3014
+ })] }) : null,
3015
+ panel,
3016
+ children: renderNavItems({
3017
+ showLabels: true,
3018
+ onNavigate: () => {
3019
+ handleNavClick?.();
3020
+ closeMobileNav();
3021
+ }
3022
+ })
3003
3023
  })
3004
- })
3005
- ]
3024
+ ]
3025
+ })
3006
3026
  });
3007
3027
  }
3008
3028
  /**
@@ -3010,92 +3030,49 @@ function SidebarLayoutInner({ children, navItems, activeId, panel, logo, logoHre
3010
3030
  * slide-out panel's content when the app has one (on a phone there is no room
3011
3031
  * to dock a panel beside a rail, so the two stack in one surface).
3012
3032
  *
3013
- * Deliberately built on plain elements rather than a dialog dependency: the
3014
- * package ships no modal primitive, and a nav drawer needs only a backdrop,
3015
- * Escape, a focus trap and a scroll lock.
3033
+ * Use the same modal layer as the account menu and other shared disclosures:
3034
+ * only the top layer handles Escape, and the trigger owns return focus.
3016
3035
  */
3017
- function MobileNavDrawer({ breakpoint, onClose, header, footer, panel, children }) {
3018
- const panelRef = React$1.useRef(null);
3019
- React$1.useEffect(() => {
3020
- const onKeyDown = (event) => {
3021
- if (event.key === "Escape") {
3022
- event.stopPropagation();
3023
- onClose();
3024
- return;
3025
- }
3026
- if (event.key !== "Tab") return;
3027
- const root = panelRef.current;
3028
- if (!root) return;
3029
- const focusable = root.querySelectorAll("a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])");
3030
- if (focusable.length === 0) return;
3031
- const first = focusable[0];
3032
- const last = focusable[focusable.length - 1];
3033
- if (event.shiftKey && document.activeElement === first) {
3034
- event.preventDefault();
3035
- last.focus();
3036
- } else if (!event.shiftKey && document.activeElement === last) {
3037
- event.preventDefault();
3038
- first.focus();
3039
- }
3040
- };
3041
- document.addEventListener("keydown", onKeyDown, true);
3042
- return () => document.removeEventListener("keydown", onKeyDown, true);
3043
- }, [onClose]);
3044
- React$1.useEffect(() => {
3045
- const previous = document.body.style.overflow;
3046
- document.body.style.overflow = "hidden";
3047
- return () => {
3048
- document.body.style.overflow = previous;
3049
- };
3050
- }, []);
3051
- React$1.useEffect(() => {
3052
- panelRef.current?.querySelector("button,a[href]")?.focus();
3053
- }, []);
3054
- return /* @__PURE__ */ jsxs("div", {
3055
- className: cn$1("fixed inset-0 z-50", SHOW_BELOW_CLASS[breakpoint]),
3056
- children: [/* @__PURE__ */ jsx("button", {
3057
- type: "button",
3058
- "aria-label": "Close navigation",
3059
- tabIndex: -1,
3060
- onClick: onClose,
3061
- className: "absolute inset-0 bg-black/50"
3062
- }), /* @__PURE__ */ jsxs("div", {
3063
- ref: panelRef,
3064
- id: "sidebar-mobile-nav",
3065
- role: "dialog",
3066
- "aria-modal": "true",
3067
- "aria-label": "Navigation",
3068
- style: { width: 256 },
3069
- 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",
3070
- children: [
3071
- /* @__PURE__ */ jsxs("div", {
3072
- className: "flex h-14 shrink-0 items-center gap-1 border-b border-[var(--md3-outline-variant)] px-2",
3073
- children: [/* @__PURE__ */ jsx("div", {
3074
- className: "flex min-w-0 flex-1 items-center",
3075
- children: header
3076
- }), /* @__PURE__ */ jsx("button", {
3036
+ function MobileNavDrawer({ breakpoint, header, footer, panel, children }) {
3037
+ return /* @__PURE__ */ jsxs(Dialog$1.Portal, { children: [/* @__PURE__ */ jsx(Dialog$1.Overlay, { className: cn$1("fixed inset-0 z-50 bg-black/50", SHOW_BELOW_CLASS[breakpoint]) }), /* @__PURE__ */ jsxs(Dialog$1.Content, {
3038
+ id: "sidebar-mobile-nav",
3039
+ "aria-describedby": void 0,
3040
+ style: { width: 256 },
3041
+ className: cn$1("agent-arrive fixed inset-y-0 left-0 z-50 flex max-w-[85vw] flex-col border-r border-[var(--md3-outline-variant)] bg-surface-container-low shadow-xl", SHOW_BELOW_CLASS[breakpoint]),
3042
+ children: [
3043
+ /* @__PURE__ */ jsx(Dialog$1.Title, {
3044
+ className: "sr-only",
3045
+ children: "Navigation"
3046
+ }),
3047
+ /* @__PURE__ */ jsxs("div", {
3048
+ className: "flex h-14 shrink-0 items-center gap-1 border-b border-[var(--md3-outline-variant)] px-2",
3049
+ children: [/* @__PURE__ */ jsx("div", {
3050
+ className: "flex min-w-0 flex-1 items-center",
3051
+ children: header
3052
+ }), /* @__PURE__ */ jsx(Dialog$1.Close, {
3053
+ asChild: true,
3054
+ children: /* @__PURE__ */ jsx("button", {
3077
3055
  type: "button",
3078
3056
  "aria-label": "Close navigation",
3079
- onClick: onClose,
3080
3057
  className: cn$1("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),
3081
3058
  children: /* @__PURE__ */ jsx(CloseIcon, { className: "size-5" })
3082
- })]
3083
- }),
3084
- /* @__PURE__ */ jsxs("nav", {
3085
- "aria-label": "Sections",
3086
- className: "flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto px-2 py-2",
3087
- children: [children, panel != null && /* @__PURE__ */ jsx("div", {
3088
- className: "mt-2 border-t border-[var(--md3-outline-variant)] pt-2",
3089
- children: panel
3090
- })]
3091
- }),
3092
- footer != null && /* @__PURE__ */ jsx("div", {
3093
- className: "shrink-0 border-t border-[var(--md3-outline-variant)] px-2 py-2",
3094
- children: footer
3095
- })
3096
- ]
3097
- })]
3098
- });
3059
+ })
3060
+ })]
3061
+ }),
3062
+ /* @__PURE__ */ jsxs("nav", {
3063
+ "aria-label": "Sections",
3064
+ className: "flex min-h-0 flex-1 flex-col gap-0.5 overflow-y-auto px-2 py-2",
3065
+ children: [children, panel != null && /* @__PURE__ */ jsx("div", {
3066
+ className: "mt-2 border-t border-[var(--md3-outline-variant)] pt-2",
3067
+ children: panel
3068
+ })]
3069
+ }),
3070
+ footer != null && /* @__PURE__ */ jsx("div", {
3071
+ className: "shrink-0 border-t border-[var(--md3-outline-variant)] px-2 py-2",
3072
+ children: footer
3073
+ })
3074
+ ]
3075
+ })] });
3099
3076
  }
3100
3077
  /**
3101
3078
  * App shell built on the sidebar rail + slide-out panel, without a top nav bar.
package/dist/dashboard.js CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as useSidebar, A as parseInsufficientBalance, B as SidebarPanel, C as SandboxStatusPill, D as ResourceMeter, E as ResourceSnapshot, F as RailHeader, G as SidebarRailNav, H as SidebarPanelHeader, I as RailModeButton, J as SIDEBAR_PANEL_WIDTH, K as RailTooltip, L as RailSeparator, M as RailButton, N as RailExpandable, O as INSUFFICIENT_BALANCE_CODE, P as RailFlyout, Q as SidebarProvider, R as Sidebar, S as SANDBOX_STATUS, T as ActivityFeed, U as SidebarRail, V as SidebarPanelContent, W as SidebarRailFooter, X as SIDEBAR_RAIL_WIDTH, Y as SIDEBAR_RAIL_LABELED_WIDTH, Z as SIDEBAR_TOTAL_WIDTH, _ as BackendSelector, a as PortsList, b as SandboxCard, c as SystemLogsViewer, d as DashboardLayout, f as HARNESS_OPTIONS, g as HarnessLogo, h as HARNESS_BRAND, i as TemplateCard, j as ProfileAvatar, k as OutOfCreditsModal, l as MetricAreaChart, m as chatCapableHarnesses, n as SnapshotList, o as GitPanel, p as HarnessPicker, q as SIDEBAR_MOBILE_WIDTH, r as ProcessList, s as UsageSummary, t as PromoBanner, u as SidebarLayout, v as SandboxTable, w as sandboxStatus, x as canAdminSandbox, y as NewSandboxCard, z as SidebarContent } from "./dashboard-CPK5MNhT.js";
1
+ import { $ as useSidebar, A as parseInsufficientBalance, B as SidebarPanel, C as SandboxStatusPill, D as ResourceMeter, E as ResourceSnapshot, F as RailHeader, G as SidebarRailNav, H as SidebarPanelHeader, I as RailModeButton, J as SIDEBAR_PANEL_WIDTH, K as RailTooltip, L as RailSeparator, M as RailButton, N as RailExpandable, O as INSUFFICIENT_BALANCE_CODE, P as RailFlyout, Q as SidebarProvider, R as Sidebar, S as SANDBOX_STATUS, T as ActivityFeed, U as SidebarRail, V as SidebarPanelContent, W as SidebarRailFooter, X as SIDEBAR_RAIL_WIDTH, Y as SIDEBAR_RAIL_LABELED_WIDTH, Z as SIDEBAR_TOTAL_WIDTH, _ as BackendSelector, a as PortsList, b as SandboxCard, c as SystemLogsViewer, d as DashboardLayout, f as HARNESS_OPTIONS, g as HarnessLogo, h as HARNESS_BRAND, i as TemplateCard, j as ProfileAvatar, k as OutOfCreditsModal, l as MetricAreaChart, m as chatCapableHarnesses, n as SnapshotList, o as GitPanel, p as HarnessPicker, q as SIDEBAR_MOBILE_WIDTH, r as ProcessList, s as UsageSummary, t as PromoBanner, u as SidebarLayout, v as SandboxTable, w as sandboxStatus, x as canAdminSandbox, y as NewSandboxCard, z as SidebarContent } from "./dashboard-C25eF1QD.js";
2
2
  import { n as canonicalModelId, r as modelBrandFor, t as ModelBrandStack } from "./model-brand-hMyDTUqB.js";
3
3
  import { a as formatPrice, i as PricingPage, n as SandboxPageShell, o as BillingDashboard, r as UsageChart, t as DashboardPageHeader } from "./page-layout-2IRtfx51.js";
4
4
  export { ActivityFeed, BackendSelector, BillingDashboard, DashboardLayout, DashboardPageHeader, GitPanel, HARNESS_BRAND, HARNESS_OPTIONS, HarnessLogo, HarnessPicker, INSUFFICIENT_BALANCE_CODE, MetricAreaChart, ModelBrandStack, NewSandboxCard, OutOfCreditsModal, PortsList, PricingPage, ProcessList, ProfileAvatar, PromoBanner, RailButton, RailExpandable, RailFlyout, RailHeader, RailModeButton, RailSeparator, RailTooltip, ResourceMeter, ResourceSnapshot, SANDBOX_STATUS, SIDEBAR_MOBILE_WIDTH, SIDEBAR_PANEL_WIDTH, SIDEBAR_RAIL_LABELED_WIDTH, SIDEBAR_RAIL_WIDTH, SIDEBAR_TOTAL_WIDTH, SandboxCard, SandboxPageShell, SandboxStatusPill, SandboxTable, Sidebar, SidebarContent, SidebarLayout, SidebarPanel, SidebarPanelContent, SidebarPanelHeader, SidebarProvider, SidebarRail, SidebarRailFooter, SidebarRailNav, SnapshotList, SystemLogsViewer, TemplateCard, UsageChart, UsageSummary, canAdminSandbox, canonicalModelId, chatCapableHarnesses, formatPrice, modelBrandFor, parseInsufficientBalance, sandboxStatus, useSidebar };
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
- import { a as computeDiffStats, c as BRAND_PRISM_THEME, d as DiffStatsBadge, f as GitStatusBadge, i as buildUnifiedPatch, l as CodeSurface, m as PillTabs, n as SandboxArtifactPane, o as CodeView, p as PanelHeader, r as DiffView, s as FileBreadcrumb, t as ChangesPane, u as resolveLanguage } from "./workbench-CpBG_v-5.js";
1
+ import { a as computeDiffStats, c as BRAND_PRISM_THEME, d as DiffStatsBadge, f as GitStatusBadge, i as buildUnifiedPatch, l as CodeSurface, m as PillTabs, n as SandboxArtifactPane, o as CodeView, p as PanelHeader, r as DiffView, s as FileBreadcrumb, t as ChangesPane, u as resolveLanguage } from "./workbench-BPbVtoRF.js";
2
2
  import { $ as DialogDescription, $n as TangleKnot, $t as SheetClose, A as CodeBlock, At as MetricStrip, B as ContextMenuPortal, Bn as Tooltip, Bt as SegmentedControl, C as CardContent, Cn as TableHeader, Ct as FilterField, D as CardTitle, Dn as TabsList, Dt as Input, E as CardHeader, En as TabsContent, Et as InlineCode, F as ContextMenuCheckboxItem, Fn as Textarea, Ft as PopoverAnchor, G as ContextMenuSub, Gn as badgeVariants, Gt as SelectLabel, H as ContextMenuRadioItem, Hn as TooltipProvider, Ht as SelectContent, I as ContextMenuContent, In as ThemeToggle, It as PopoverClose, J as ContextMenuTrigger, Jn as toneFor, Jt as SelectSeparator, K as ContextMenuSubContent, Kn as buttonVariants, Kt as SelectScrollDownButton, L as ContextMenuGroup, Ln as ToastContainer, Lt as PopoverContent, M as CollapsibleContent, Mt as PageShell, N as CollapsibleTrigger, Nt as Pagination, O as Checkbox, On as TabsTrigger, Ot as Label, P as ContextMenu, Pn as TextShimmer, Pt as Popover, Q as DialogContent, Qn as Logo, Qt as Sheet, R as ContextMenuItem, Rn as ToastProvider, Rt as PopoverTrigger, S as Card, Sn as TableHead, St as EmptyState, T as CardFooter, Tn as Tabs, Tt as IconTile, U as ContextMenuSeparator, Un as TooltipTrigger, Ut as SelectGroup, V as ContextMenuRadioGroup, Vn as TooltipContent, Vt as Select, W as ContextMenuShortcut, Wn as UploadProgress, Wt as SelectItem, X as Dialog, Xn as useToast, Xt as SelectValue, Y as CopyButton, Yn as useTheme, Yt as SelectTrigger, Z as DialogClose, Zn as SectionTitle, Zt as Separator, _ as AvatarFallback, _n as Table, _t as DropdownMenuShortcut, a as AlertDialogCancel, an as SheetPortal, at as DialogTrigger, b as Button, bn as TableCell, bt as DropdownMenuSubTrigger, c as AlertDialogFooter, cn as SidebarDropZone, ct as DropdownMenuCheckboxItem, d as AlertDialogPortal, dn as SkeletonTable, dt as DropdownMenuItem, en as SheetContent, et as DialogFooter, f as AlertDialogTitle, fn as Slider, ft as DropdownMenuLabel, g as Avatar, gn as TONE_CLASSES, gt as DropdownMenuSeparator, hn as Switch, ht as DropdownMenuRadioItem, i as AlertDialogAction, in as SheetOverlay, it as DialogTitle, j as Collapsible, jn as TerminalDisplay, jt as PageHeader, k as Chip, kn as Tag, kt as Metric, l as AlertDialogHeader, ln as Skeleton, lt as DropdownMenuContent, m as AlertTitle, mn as StatusPill, mt as DropdownMenuRadioGroup, n as AlertDescription, nn as SheetFooter, nt as DialogOverlay, o as AlertDialogContent, on as SheetTitle, ot as DropZone, p as AlertDialogTrigger, pn as StatCard, pt as DropdownMenuPortal, q as ContextMenuSubTrigger, qn as initialsOf, qt as SelectScrollUpButton, r as AlertDialog, rn as SheetHeader, rt as DialogPortal, s as AlertDialogDescription, sn as SheetTrigger, st as DropdownMenu, t as Alert, tn as SheetDescription, tt as DialogHeader, u as AlertDialogOverlay, un as SkeletonCard, ut as DropdownMenuGroup, v as AvatarImage, vn as TableBody, vt as DropdownMenuSub, w as CardDescription, wn as TableRow, wt as Heading, x as CATEGORY_TONES, xn as TableFooter, xt as DropdownMenuTrigger, y as Badge, yn as TableCaption, yt as DropdownMenuSubContent, z as ContextMenuLabel, zn as Toolbar, zt as Progress } from "./primitives-DavMYFRD.js";
3
3
  import { t as WorkspacePaneHeader } from "./workspace-pane-header-Bg1cCcHX.js";
4
4
  import { _ as StatusBar, a as TaskBoard, b as WorkspaceLayout, c as createShellShouldRevalidate, d as SESSION_CREATED_EVENT, f as dispatchSessionCreated, g as TerminalPanel, h as RuntimePane, i as CalendarView, l as shellShouldRevalidate, m as formatRelativeAge, n as WorkspaceFilesPane, o as SandboxWorkbench, p as useOptimisticSessionItems, r as ApprovalQueue, s as WorkspaceArtifactView, t as ArtifactPane, u as SessionSidebar, v as StatusBanner, y as DirectoryPane } from "./workspace-C68fk9qa.js";
5
- import { $ as useSidebar, A as parseInsufficientBalance, B as SidebarPanel, C as SandboxStatusPill, D as ResourceMeter, E as ResourceSnapshot, F as RailHeader, G as SidebarRailNav, H as SidebarPanelHeader, I as RailModeButton, J as SIDEBAR_PANEL_WIDTH, K as RailTooltip, L as RailSeparator, M as RailButton, N as RailExpandable, O as INSUFFICIENT_BALANCE_CODE, P as RailFlyout, Q as SidebarProvider, R as Sidebar, S as SANDBOX_STATUS, T as ActivityFeed, U as SidebarRail, V as SidebarPanelContent, W as SidebarRailFooter, X as SIDEBAR_RAIL_WIDTH, Y as SIDEBAR_RAIL_LABELED_WIDTH, Z as SIDEBAR_TOTAL_WIDTH, _ as BackendSelector, a as PortsList, b as SandboxCard, c as SystemLogsViewer, d as DashboardLayout, f as HARNESS_OPTIONS, g as HarnessLogo, h as HARNESS_BRAND, i as TemplateCard, j as ProfileAvatar, k as OutOfCreditsModal, l as MetricAreaChart, m as chatCapableHarnesses, n as SnapshotList, o as GitPanel, p as HarnessPicker, q as SIDEBAR_MOBILE_WIDTH, r as ProcessList, s as UsageSummary, t as PromoBanner, u as SidebarLayout, v as SandboxTable, w as sandboxStatus, x as canAdminSandbox, y as NewSandboxCard, z as SidebarContent } from "./dashboard-CPK5MNhT.js";
5
+ import { $ as useSidebar, A as parseInsufficientBalance, B as SidebarPanel, C as SandboxStatusPill, D as ResourceMeter, E as ResourceSnapshot, F as RailHeader, G as SidebarRailNav, H as SidebarPanelHeader, I as RailModeButton, J as SIDEBAR_PANEL_WIDTH, K as RailTooltip, L as RailSeparator, M as RailButton, N as RailExpandable, O as INSUFFICIENT_BALANCE_CODE, P as RailFlyout, Q as SidebarProvider, R as Sidebar, S as SANDBOX_STATUS, T as ActivityFeed, U as SidebarRail, V as SidebarPanelContent, W as SidebarRailFooter, X as SIDEBAR_RAIL_WIDTH, Y as SIDEBAR_RAIL_LABELED_WIDTH, Z as SIDEBAR_TOTAL_WIDTH, _ as BackendSelector, a as PortsList, b as SandboxCard, c as SystemLogsViewer, d as DashboardLayout, f as HARNESS_OPTIONS, g as HarnessLogo, h as HARNESS_BRAND, i as TemplateCard, j as ProfileAvatar, k as OutOfCreditsModal, l as MetricAreaChart, m as chatCapableHarnesses, n as SnapshotList, o as GitPanel, p as HarnessPicker, q as SIDEBAR_MOBILE_WIDTH, r as ProcessList, s as UsageSummary, t as PromoBanner, u as SidebarLayout, v as SandboxTable, w as sandboxStatus, x as canAdminSandbox, y as NewSandboxCard, z as SidebarContent } from "./dashboard-C25eF1QD.js";
6
6
  import { n as canonicalModelId, r as modelBrandFor, t as ModelBrandStack } from "./model-brand-hMyDTUqB.js";
7
7
  import { a as formatPrice, i as PricingPage, n as SandboxPageShell, o as BillingDashboard, r as UsageChart, t as DashboardPageHeader } from "./page-layout-2IRtfx51.js";
8
8
  import { t as usePtySession } from "./use-pty-session-Bf4hBLXJ.js";
@@ -335,7 +335,7 @@ function IntegrationsCatalog({ rows, query, onQueryChange, categoryFilter = "",
335
335
  }) : null,
336
336
  !compact ? /* @__PURE__ */ jsx("p", {
337
337
  className: cn("min-h-8 text-sm", TONES[connection?.statusTone ?? "neutral"]),
338
- children: row.kind === "app" ? row.installedCount ? `Installed · ${row.installedCount} ${row.installedCount === 1 ? "account" : "accounts"}` : "Not installed" : connection?.statusLabel ?? (active ? `${provider?.connections.length} accounts · select one to manage` : "Not connected")
338
+ children: row.kind === "app" ? row.installedCount ? `Installed · ${row.installedCount} ${row.installedCount === 1 ? "account" : "accounts"}` : "Not installed" : connection?.statusLabel ?? (active ? `${provider?.connections.length} ${provider?.connections.length === 1 ? "account" : "accounts"} · select one to manage` : "Not connected")
339
339
  }) : null,
340
340
  !compact ? /* @__PURE__ */ jsxs("div", {
341
341
  className: "mt-auto flex min-h-9 items-center gap-2 border-t border-border pt-3",
@@ -1,5 +1,5 @@
1
1
  import { t as cn$1 } from "./utils-DzWbktWG.js";
2
- import { a as PortsList } from "./dashboard-CPK5MNhT.js";
2
+ import { a as PortsList } from "./dashboard-C25eF1QD.js";
3
3
  import { n as TerminalView } from "./terminal-DmSUfGha.js";
4
4
  import { RichFileTree } from "./files.js";
5
5
  import { n as PreviewView } from "./embedded-app-view-CMRPEvon.js";
package/dist/workbench.js CHANGED
@@ -1,3 +1,3 @@
1
- import { a as computeDiffStats, c as BRAND_PRISM_THEME, d as DiffStatsBadge, f as GitStatusBadge, i as buildUnifiedPatch, l as CodeSurface, m as PillTabs, n as SandboxArtifactPane, o as CodeView, p as PanelHeader, r as DiffView, s as FileBreadcrumb, t as ChangesPane, u as resolveLanguage } from "./workbench-CpBG_v-5.js";
1
+ import { a as computeDiffStats, c as BRAND_PRISM_THEME, d as DiffStatsBadge, f as GitStatusBadge, i as buildUnifiedPatch, l as CodeSurface, m as PillTabs, n as SandboxArtifactPane, o as CodeView, p as PanelHeader, r as DiffView, s as FileBreadcrumb, t as ChangesPane, u as resolveLanguage } from "./workbench-BPbVtoRF.js";
2
2
  import { n as PreviewView, t as EmbeddedAppView } from "./embedded-app-view-CMRPEvon.js";
3
3
  export { BRAND_PRISM_THEME, ChangesPane, CodeSurface, CodeView, DiffStatsBadge, DiffView, EmbeddedAppView, FileBreadcrumb, GitStatusBadge, PanelHeader, PillTabs, PreviewView, SandboxArtifactPane, buildUnifiedPatch, computeDiffStats, resolveLanguage };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/sandbox-ui",
3
- "version": "0.128.2",
3
+ "version": "0.128.3",
4
4
  "license": "MIT",
5
5
  "description": "Unified UI component library for Tangle Sandbox — primitives, chat, dashboard, terminal, editor, and workspace components",
6
6
  "repository": {
@@ -197,9 +197,9 @@
197
197
  "dependencies": {
198
198
  "@lobehub/icons-static-svg": "^1.95.1",
199
199
  "@pierre/diffs": "^1.5.1",
200
- "@radix-ui/react-dialog": "^1.2.0",
201
- "@radix-ui/react-dropdown-menu": "^2.1.25",
202
- "@radix-ui/react-select": "^2.3.8",
200
+ "@radix-ui/react-dialog": "^1.1.23",
201
+ "@radix-ui/react-dropdown-menu": "^2.1.24",
202
+ "@radix-ui/react-select": "^2.3.7",
203
203
  "diff": "^9.0.0",
204
204
  "eventsource-parser": "4.1.1",
205
205
  "lucide-react": "^1.48.0",