@tangle-network/sandbox-ui 0.27.1 → 0.28.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.
@@ -246,6 +246,94 @@ function RailButton({ icon: Icon, label, isActive, badge, onClick, className, sh
246
246
  }
247
247
  return /* @__PURE__ */ jsx2("button", { type: "button", onClick, title: label, className: classes, children: content });
248
248
  }
249
+ function RailFlyout({
250
+ icon: Icon,
251
+ label,
252
+ isActive,
253
+ showLabel,
254
+ title,
255
+ children,
256
+ className
257
+ }) {
258
+ const [open, setOpen] = React2.useState(false);
259
+ const ref = React2.useRef(null);
260
+ React2.useEffect(() => {
261
+ if (!open) return;
262
+ const onPointer = (e) => {
263
+ if (ref.current && !ref.current.contains(e.target)) setOpen(false);
264
+ };
265
+ const onKey = (e) => {
266
+ if (e.key === "Escape") setOpen(false);
267
+ };
268
+ document.addEventListener("mousedown", onPointer);
269
+ document.addEventListener("keydown", onKey);
270
+ return () => {
271
+ document.removeEventListener("mousedown", onPointer);
272
+ document.removeEventListener("keydown", onKey);
273
+ };
274
+ }, [open]);
275
+ const triggerClasses = cn(
276
+ "group relative flex shrink-0 items-center rounded-xl transition-all duration-200",
277
+ showLabel ? "w-full justify-start px-3 h-11 gap-3" : "w-11 h-11 justify-center",
278
+ "hover:bg-[var(--accent-surface-soft)] hover:text-[var(--accent-text)]",
279
+ "active:scale-95 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary",
280
+ isActive || open ? "bg-[var(--accent-surface-strong)] text-[var(--accent-text)]" : "text-muted-foreground",
281
+ className
282
+ );
283
+ return /* @__PURE__ */ jsxs("div", { ref, className: cn("relative", showLabel && "w-full"), children: [
284
+ /* @__PURE__ */ jsxs(
285
+ "button",
286
+ {
287
+ type: "button",
288
+ title: label,
289
+ "aria-haspopup": "menu",
290
+ "aria-expanded": open,
291
+ onClick: () => setOpen((v) => !v),
292
+ className: triggerClasses,
293
+ children: [
294
+ /* @__PURE__ */ jsx2(Icon, { className: "h-5 w-5 shrink-0" }),
295
+ showLabel && /* @__PURE__ */ jsx2("span", { className: "text-sm font-medium", children: label }),
296
+ showLabel && /* @__PURE__ */ jsx2(
297
+ ChevronRightIcon,
298
+ {
299
+ className: cn(
300
+ "ml-auto h-4 w-4 shrink-0 text-muted-foreground/60 transition-transform duration-200",
301
+ open && "rotate-180"
302
+ )
303
+ }
304
+ )
305
+ ]
306
+ }
307
+ ),
308
+ open && // Anchored to the right edge of the rail item; full-height-independent
309
+ // floating card. `onClickCapture` closes after a child link/button fires
310
+ // so selecting a sub-surface dismisses the flyout.
311
+ /* @__PURE__ */ jsxs(
312
+ "div",
313
+ {
314
+ role: "menu",
315
+ onClickCapture: (e) => {
316
+ const el = e.target;
317
+ if (el.closest("a,button")) setOpen(false);
318
+ },
319
+ className: cn(
320
+ "absolute top-0 z-50 min-w-[12rem] rounded-xl border border-border bg-card p-1.5 shadow-lg",
321
+ showLabel ? "left-full ml-2" : "left-full ml-2"
322
+ ),
323
+ children: [
324
+ /* @__PURE__ */ jsx2("p", { className: "px-2 pb-1 pt-1 text-[10px] font-semibold uppercase tracking-wider text-muted-foreground/70 select-none", children: title ?? label }),
325
+ children
326
+ ]
327
+ }
328
+ )
329
+ ] });
330
+ }
331
+ function ChevronRightIcon({ className }) {
332
+ return /* @__PURE__ */ jsxs("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: [
333
+ /* @__PURE__ */ jsx2("title", { children: "Expand" }),
334
+ /* @__PURE__ */ jsx2("path", { d: "m9 18 6-6-6-6" })
335
+ ] });
336
+ }
249
337
  function RailModeButton({ mode, icon, label, badge, className, showLabel }) {
250
338
  const { panelOpen, mode: currentMode, switchMode } = useSidebar();
251
339
  return /* @__PURE__ */ jsx2(
@@ -1585,6 +1673,7 @@ function SidebarLayoutInner({
1585
1673
  panel,
1586
1674
  logo,
1587
1675
  logoHref,
1676
+ railHeaderContent,
1588
1677
  user,
1589
1678
  isLoading = false,
1590
1679
  onLogout,
@@ -1608,7 +1697,7 @@ function SidebarLayoutInner({
1608
1697
  return /* @__PURE__ */ jsxs13("div", { className: cn("min-h-screen bg-background text-foreground", className), children: [
1609
1698
  /* @__PURE__ */ jsx14("div", { className: cn(hideBelow && HIDE_BELOW_CLASS[hideBelow]), children: /* @__PURE__ */ jsxs13(Sidebar, { className: sidebarClassName, children: [
1610
1699
  /* @__PURE__ */ jsxs13(SidebarRail, { children: [
1611
- logo !== void 0 && /* @__PURE__ */ jsx14(SidebarRailHeader, { className: railLabels ? "justify-start px-4" : void 0, children: /* @__PURE__ */ jsx14(
1700
+ (railHeaderContent !== void 0 || logo !== void 0) && /* @__PURE__ */ jsx14(SidebarRailHeader, { className: cn(railLabels && (railHeaderContent !== void 0 ? "px-2" : "justify-start px-4")), children: railHeaderContent !== void 0 ? railHeaderContent : /* @__PURE__ */ jsx14(
1612
1701
  Link,
1613
1702
  {
1614
1703
  href: logoHref,
@@ -1617,8 +1706,44 @@ function SidebarLayoutInner({
1617
1706
  children: logo
1618
1707
  }
1619
1708
  ) }),
1620
- /* @__PURE__ */ jsx14(SidebarRailNav, { className: railLabels ? "px-2" : void 0, children: navItems.map(
1621
- (item) => item.togglesPanel ? /* @__PURE__ */ jsx14(
1709
+ /* @__PURE__ */ jsx14(SidebarRailNav, { className: railLabels ? "px-2" : void 0, children: navItems.map((item) => {
1710
+ if (item.flyoutItems && item.flyoutItems.length > 0) {
1711
+ const activeSet = new Set(item.flyoutActiveIds ?? []);
1712
+ return /* @__PURE__ */ jsx14(
1713
+ RailFlyout,
1714
+ {
1715
+ icon: item.icon,
1716
+ label: item.label,
1717
+ title: item.label,
1718
+ showLabel: railLabels,
1719
+ isActive: activeId === item.id || item.flyoutItems.some((f) => activeSet.has(f.id)),
1720
+ children: item.flyoutItems.map((f) => {
1721
+ const FIcon = f.icon;
1722
+ const active = activeSet.has(f.id);
1723
+ return /* @__PURE__ */ jsxs13(
1724
+ Link,
1725
+ {
1726
+ href: f.href,
1727
+ to: f.href,
1728
+ onClick: handleNavClick,
1729
+ ...f.prefetch !== void 0 ? { prefetch: f.prefetch } : {},
1730
+ className: cn(
1731
+ "flex h-9 items-center gap-2.5 rounded-lg px-2.5 text-sm transition-colors",
1732
+ 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)]"
1733
+ ),
1734
+ children: [
1735
+ /* @__PURE__ */ jsx14(FIcon, { className: "h-4 w-4 shrink-0" }),
1736
+ /* @__PURE__ */ jsx14("span", { className: "truncate", children: f.label })
1737
+ ]
1738
+ },
1739
+ f.id
1740
+ );
1741
+ })
1742
+ },
1743
+ item.id
1744
+ );
1745
+ }
1746
+ return item.togglesPanel ? /* @__PURE__ */ jsx14(
1622
1747
  RailButton,
1623
1748
  {
1624
1749
  icon: item.icon,
@@ -1637,8 +1762,8 @@ function SidebarLayoutInner({
1637
1762
  onClick: handleNavClick,
1638
1763
  ...item.prefetch !== void 0 ? { prefetch: item.prefetch } : {}
1639
1764
  }
1640
- ) }, item.id)
1641
- ) }),
1765
+ ) }, item.id);
1766
+ }) }),
1642
1767
  (railFooter !== void 0 || hasProfile) && /* @__PURE__ */ jsxs13(SidebarRailFooter, { className: cn("border-t border-border pt-2", railLabels && "items-stretch px-2"), children: [
1643
1768
  railFooter,
1644
1769
  hasProfile && (() => {
@@ -2225,13 +2350,13 @@ function VariantList({
2225
2350
 
2226
2351
  // src/dashboard/system-logs.tsx
2227
2352
  import { Terminal as Terminal3 } from "lucide-react";
2228
- import { useEffect as useEffect3, useRef as useRef2, useState as useState5 } from "react";
2353
+ import { useEffect as useEffect3, useRef as useRef3, useState as useState5 } from "react";
2229
2354
  import { jsx as jsx18, jsxs as jsxs17 } from "react/jsx-runtime";
2230
2355
  function SystemLogsViewer({ apiUrl, token, className }) {
2231
2356
  const [logs, setLogs] = useState5([]);
2232
2357
  const [error, setError] = useState5(null);
2233
2358
  const [isFollowing, setIsFollowing] = useState5(true);
2234
- const scrollRef = useRef2(null);
2359
+ const scrollRef = useRef3(null);
2235
2360
  useEffect3(() => {
2236
2361
  let timeoutId;
2237
2362
  let backoff = 2e3;
@@ -3107,6 +3232,7 @@ export {
3107
3232
  SidebarRailFooter,
3108
3233
  RailSeparator,
3109
3234
  RailButton,
3235
+ RailFlyout,
3110
3236
  RailModeButton,
3111
3237
  SidebarPanel,
3112
3238
  SidebarPanelHeader,
@@ -69,6 +69,29 @@ interface RailButtonProps {
69
69
  children?: React.ReactNode;
70
70
  }
71
71
  declare function RailButton({ icon: Icon, label, isActive, badge, onClick, className, showLabel, asChild, children }: RailButtonProps): react_jsx_runtime.JSX.Element;
72
+ interface RailFlyoutProps {
73
+ icon: React.ComponentType<{
74
+ className?: string;
75
+ }>;
76
+ label: string;
77
+ /** Highlight the trigger (e.g. when a child route is active). */
78
+ isActive?: boolean;
79
+ /** Show the label text beside the icon (labeled rail) vs. icon-only. */
80
+ showLabel?: boolean;
81
+ /** Heading rendered at the top of the open flyout. Defaults to `label`. */
82
+ title?: string;
83
+ /** Flyout body — the sub-surfaces revealed when the item is opened. */
84
+ children: React.ReactNode;
85
+ className?: string;
86
+ }
87
+ /**
88
+ * A rail entry that reveals its sub-surfaces in a small panel anchored to the
89
+ * RIGHT of the rail item, rather than pushing the rail open with an inline
90
+ * accordion. Opens on click, closes on outside-click, Escape, or selecting an
91
+ * item inside it. Use for a single "door" (e.g. Studio) that fronts several
92
+ * related destinations without permanently spending rail height on them.
93
+ */
94
+ declare function RailFlyout({ icon: Icon, label, isActive, showLabel, title, children, className, }: RailFlyoutProps): react_jsx_runtime.JSX.Element;
72
95
  interface RailModeButtonProps {
73
96
  mode: string;
74
97
  icon: React.ComponentType<{
@@ -533,16 +556,34 @@ interface DashboardLayoutProps {
533
556
  }
534
557
  declare function DashboardLayout({ defaultPanelOpen, defaultMode, ...props }: DashboardLayoutProps): react_jsx_runtime.JSX.Element;
535
558
 
559
+ /** A sub-destination revealed inside a nav item's right-flyout. */
560
+ interface SidebarLayoutFlyoutItem {
561
+ id: string;
562
+ label: string;
563
+ icon: React.ComponentType<{
564
+ className?: string;
565
+ }>;
566
+ href: string;
567
+ prefetch?: "none" | "intent" | "render" | "viewport";
568
+ }
536
569
  interface SidebarLayoutNavItem {
537
570
  id: string;
538
571
  label: string;
539
572
  icon: React.ComponentType<{
540
573
  className?: string;
541
574
  }>;
542
- /** Destination for link items. Omit when `togglesPanel` is set. */
575
+ /** Destination for link items. Omit when `togglesPanel` or `flyoutItems` is set. */
543
576
  href?: string;
544
577
  /** Render this item as the panel toggle instead of a link. */
545
578
  togglesPanel?: boolean;
579
+ /**
580
+ * Render this item as a right-flyout "door" fronting these sub-destinations
581
+ * instead of a link. The flyout opens to the right of the rail item. Takes
582
+ * precedence over `href`/`togglesPanel`.
583
+ */
584
+ flyoutItems?: SidebarLayoutFlyoutItem[];
585
+ /** Ids of `flyoutItems` whose route is currently active (drives the door highlight). */
586
+ flyoutActiveIds?: string[];
546
587
  badge?: number;
547
588
  /**
548
589
  * React Router prefetch behavior for this link, forwarded to the underlying
@@ -563,6 +604,13 @@ interface SidebarLayoutProps {
563
604
  logo?: React.ReactNode;
564
605
  /** Destination for the logo link. */
565
606
  logoHref?: string;
607
+ /**
608
+ * Content rendered in the rail header in place of the logo link — e.g. a
609
+ * project/workspace switcher. Spans the header so the app's primary
610
+ * orientation control sits at the top of the rail. When set, `logo`/`logoHref`
611
+ * are ignored. The header keeps its `h-14` height for cross-view alignment.
612
+ */
613
+ railHeaderContent?: React.ReactNode;
566
614
  user?: SidebarUser | null;
567
615
  isLoading?: boolean;
568
616
  onLogout?: () => void;
@@ -850,4 +898,4 @@ interface InfoPanelProps {
850
898
  }
851
899
  declare function InfoPanel({ label, title, description, className }: InfoPanelProps): react_jsx_runtime.JSX.Element;
852
900
 
853
- export { ActivityFeed, type ActivityFeedProps, type ActivityItem, BackendConfig, type BackendConfigProps, type BackendStatusData, ClusterStatusBar, type ClusterStatusBarProps, type ClusterStatusItem, CreditBalance, type CreditBalanceProps, DashboardLayout, type DashboardLayoutProps, type Profile as DashboardProfile, type SnapshotInfo as DashboardSnapshotInfo, type DashboardUser, type ExposedPort, type GitCommitData, GitPanel, type GitPanelProps, type GitStatusData, HARNESS_BRAND, type HarnessBrand, HarnessLogo, type HarnessLogoProps, HarnessType, INSUFFICIENT_BALANCE_CODE, InfoPanel, type InfoPanelProps, type InsufficientBalance, type Invoice, InvoiceTable, type InvoiceTableProps, type McpServer, MetricAreaChart, type MetricAreaChartProps, type MetricChartPoint, type MetricChartTone, type NavItem, NetworkConfig, type NetworkConfigData, type NetworkConfigProps, NewSandboxCard, type NewSandboxCardProps, OutOfCreditsModal, type OutOfCreditsModalProps, type PlanCardData, PlanCards, type PlanCardsProps, type PlanFeature, PortsList, type PortsListProps, type ProcessInfo, ProcessList, type ProcessListProps, type ProductVariant, ProfileAvatar, type ProfileAvatarProps, ProfileComparison, type ProfileComparisonProps, ProfileSelector, type ProfileSelectorProps, PromoBanner, type PromoBannerProps, RailButton, type RailButtonProps, RailModeButton, type RailModeButtonProps, RailSeparator, type RailSeparatorProps, ResourceMeter, type ResourceMeterProps, ResourceSnapshot, type ResourceSnapshotItem, type ResourceSnapshotProps, SIDEBAR_MOBILE_WIDTH, SIDEBAR_PANEL_WIDTH, SIDEBAR_RAIL_WIDTH, SIDEBAR_TOTAL_WIDTH, SandboxCard, type SandboxCardData, type SandboxCardProps, type SandboxStatus, SandboxTable, type SandboxTableProps, Sidebar, SidebarContent, type SidebarContentProps, SidebarLayout, type SidebarLayoutNavItem, type SidebarLayoutProps, SidebarPanel, SidebarPanelContent, type SidebarPanelContentProps, SidebarPanelHeader, type SidebarPanelHeaderProps, type SidebarPanelProps, type SidebarProps, SidebarProvider, type SidebarProviderProps, SidebarRail, SidebarRailFooter, type SidebarRailFooterProps, SidebarRailHeader, type SidebarRailHeaderProps, SidebarRailNav, type SidebarRailNavProps, type SidebarRailProps, type SidebarUser, SnapshotList, type SnapshotListProps, SystemLogsViewer, type SystemLogsViewerProps, type TeamRole, UsageSummary, type UsageSummaryData, type UsageSummaryProps, type Variant, VariantList, type VariantListProps, type VariantOutcome, type VariantStatus, canAdminSandbox, parseInsufficientBalance, useSidebar };
901
+ export { ActivityFeed, type ActivityFeedProps, type ActivityItem, BackendConfig, type BackendConfigProps, type BackendStatusData, ClusterStatusBar, type ClusterStatusBarProps, type ClusterStatusItem, CreditBalance, type CreditBalanceProps, DashboardLayout, type DashboardLayoutProps, type Profile as DashboardProfile, type SnapshotInfo as DashboardSnapshotInfo, type DashboardUser, type ExposedPort, type GitCommitData, GitPanel, type GitPanelProps, type GitStatusData, HARNESS_BRAND, type HarnessBrand, HarnessLogo, type HarnessLogoProps, HarnessType, INSUFFICIENT_BALANCE_CODE, InfoPanel, type InfoPanelProps, type InsufficientBalance, type Invoice, InvoiceTable, type InvoiceTableProps, type McpServer, MetricAreaChart, type MetricAreaChartProps, type MetricChartPoint, type MetricChartTone, type NavItem, NetworkConfig, type NetworkConfigData, type NetworkConfigProps, NewSandboxCard, type NewSandboxCardProps, OutOfCreditsModal, type OutOfCreditsModalProps, type PlanCardData, PlanCards, type PlanCardsProps, type PlanFeature, PortsList, type PortsListProps, type ProcessInfo, ProcessList, type ProcessListProps, type ProductVariant, ProfileAvatar, type ProfileAvatarProps, ProfileComparison, type ProfileComparisonProps, ProfileSelector, type ProfileSelectorProps, PromoBanner, type PromoBannerProps, RailButton, type RailButtonProps, RailFlyout, type RailFlyoutProps, RailModeButton, type RailModeButtonProps, RailSeparator, type RailSeparatorProps, ResourceMeter, type ResourceMeterProps, ResourceSnapshot, type ResourceSnapshotItem, type ResourceSnapshotProps, SIDEBAR_MOBILE_WIDTH, SIDEBAR_PANEL_WIDTH, SIDEBAR_RAIL_WIDTH, SIDEBAR_TOTAL_WIDTH, SandboxCard, type SandboxCardData, type SandboxCardProps, type SandboxStatus, SandboxTable, type SandboxTableProps, Sidebar, SidebarContent, type SidebarContentProps, SidebarLayout, type SidebarLayoutFlyoutItem, type SidebarLayoutNavItem, type SidebarLayoutProps, SidebarPanel, SidebarPanelContent, type SidebarPanelContentProps, SidebarPanelHeader, type SidebarPanelHeaderProps, type SidebarPanelProps, type SidebarProps, SidebarProvider, type SidebarProviderProps, SidebarRail, SidebarRailFooter, type SidebarRailFooterProps, SidebarRailHeader, type SidebarRailHeaderProps, SidebarRailNav, type SidebarRailNavProps, type SidebarRailProps, type SidebarUser, SnapshotList, type SnapshotListProps, SystemLogsViewer, type SystemLogsViewerProps, type TeamRole, UsageSummary, type UsageSummaryData, type UsageSummaryProps, type Variant, VariantList, type VariantListProps, type VariantOutcome, type VariantStatus, canAdminSandbox, parseInsufficientBalance, useSidebar };
package/dist/dashboard.js CHANGED
@@ -19,6 +19,7 @@ import {
19
19
  ProfileSelector,
20
20
  PromoBanner,
21
21
  RailButton,
22
+ RailFlyout,
22
23
  RailModeButton,
23
24
  RailSeparator,
24
25
  ResourceMeter,
@@ -47,7 +48,7 @@ import {
47
48
  canAdminSandbox,
48
49
  parseInsufficientBalance,
49
50
  useSidebar
50
- } from "./chunk-LGCOOUIX.js";
51
+ } from "./chunk-F2M5MN7K.js";
51
52
  import {
52
53
  BillingDashboard,
53
54
  InfoPanel,
@@ -106,6 +107,7 @@ export {
106
107
  ProfileSelector,
107
108
  PromoBanner,
108
109
  RailButton,
110
+ RailFlyout,
109
111
  RailModeButton,
110
112
  RailSeparator,
111
113
  ResourceMeter,
package/dist/globals.css CHANGED
@@ -406,6 +406,9 @@
406
406
  .left-\[50\%\] {
407
407
  left: 50%;
408
408
  }
409
+ .left-full {
410
+ left: 100%;
411
+ }
409
412
  .z-0 {
410
413
  z-index: 0;
411
414
  }
@@ -1102,6 +1105,9 @@
1102
1105
  .min-w-\[8rem\] {
1103
1106
  min-width: 8rem;
1104
1107
  }
1108
+ .min-w-\[12rem\] {
1109
+ min-width: 12rem;
1110
+ }
1105
1111
  .min-w-\[20px\] {
1106
1112
  min-width: 20px;
1107
1113
  }
package/dist/index.d.ts CHANGED
@@ -8,7 +8,7 @@ export { AgentSessionControls, AgentSessionControlsProps, AgentSessionHarnessCon
8
8
  export { ExpandedToolDetail, ExpandedToolDetailProps, InlineThinkingItem, InlineThinkingItemProps, InlineToolItem, InlineToolItemProps, LiveDuration, RunGroup, RunGroupProps } from '@tangle-network/ui/run';
9
9
  export { CommandPreview, DiffPreview, GlobResultsPreview, GrepResultsPreview, QuestionPreview, WebSearchPreview, WriteFilePreview } from '@tangle-network/ui/tool-previews';
10
10
  export { FileArtifactPane, FileArtifactPaneProps, FileNode, FilePreview, FilePreviewProps, FileTabData, FileTabs, FileTabsProps, FileTree, FileTreeProps, FileTreeVisibilityOptions, RichFileTree, RichFileTreeGitEntry, RichFileTreeGitStatus, RichFileTreeProps, RichFileTreeThemeVars, filterFileTree } from '@tangle-network/ui/files';
11
- export { ActivityFeed, ActivityFeedProps, ActivityItem, BackendConfig, BackendConfigProps, BackendStatusData, ClusterStatusBar, ClusterStatusBarProps, ClusterStatusItem, CreditBalance, CreditBalanceProps, DashboardLayout, DashboardLayoutProps, DashboardProfile, DashboardSnapshotInfo, DashboardUser, ExposedPort, GitCommitData, GitPanel, GitPanelProps, GitStatusData, HARNESS_BRAND, HarnessBrand, HarnessLogo, HarnessLogoProps, INSUFFICIENT_BALANCE_CODE, InfoPanel, InfoPanelProps, InsufficientBalance, Invoice, InvoiceTable, InvoiceTableProps, McpServer, MetricAreaChart, MetricAreaChartProps, MetricChartPoint, MetricChartTone, NavItem, NetworkConfig, NetworkConfigData, NetworkConfigProps, NewSandboxCard, NewSandboxCardProps, OutOfCreditsModal, OutOfCreditsModalProps, PlanCardData, PlanCards, PlanCardsProps, PlanFeature, PortsList, PortsListProps, ProcessInfo, ProcessList, ProcessListProps, ProductVariant, ProfileAvatar, ProfileAvatarProps, ProfileComparison, ProfileComparisonProps, ProfileSelector, ProfileSelectorProps, PromoBanner, PromoBannerProps, RailButton, RailButtonProps, RailModeButton, RailModeButtonProps, RailSeparator, RailSeparatorProps, ResourceMeter, ResourceMeterProps, ResourceSnapshot, ResourceSnapshotItem, ResourceSnapshotProps, SIDEBAR_MOBILE_WIDTH, SIDEBAR_PANEL_WIDTH, SIDEBAR_RAIL_WIDTH, SIDEBAR_TOTAL_WIDTH, SandboxCard, SandboxCardData, SandboxCardProps, SandboxStatus, SandboxTable, SandboxTableProps, Sidebar, SidebarContent, SidebarContentProps, SidebarLayout, SidebarLayoutNavItem, SidebarLayoutProps, SidebarPanel, SidebarPanelContent, SidebarPanelContentProps, SidebarPanelHeader, SidebarPanelHeaderProps, SidebarPanelProps, SidebarProps, SidebarProvider, SidebarProviderProps, SidebarRail, SidebarRailFooter, SidebarRailFooterProps, SidebarRailHeader, SidebarRailHeaderProps, SidebarRailNav, SidebarRailNavProps, SidebarRailProps, SidebarUser, SnapshotList, SnapshotListProps, SystemLogsViewer, SystemLogsViewerProps, TeamRole, UsageSummary, UsageSummaryData, UsageSummaryProps, Variant, VariantList, VariantListProps, VariantOutcome, VariantStatus, canAdminSandbox, parseInsufficientBalance, useSidebar } from './dashboard.js';
11
+ export { ActivityFeed, ActivityFeedProps, ActivityItem, BackendConfig, BackendConfigProps, BackendStatusData, ClusterStatusBar, ClusterStatusBarProps, ClusterStatusItem, CreditBalance, CreditBalanceProps, DashboardLayout, DashboardLayoutProps, DashboardProfile, DashboardSnapshotInfo, DashboardUser, ExposedPort, GitCommitData, GitPanel, GitPanelProps, GitStatusData, HARNESS_BRAND, HarnessBrand, HarnessLogo, HarnessLogoProps, INSUFFICIENT_BALANCE_CODE, InfoPanel, InfoPanelProps, InsufficientBalance, Invoice, InvoiceTable, InvoiceTableProps, McpServer, MetricAreaChart, MetricAreaChartProps, MetricChartPoint, MetricChartTone, NavItem, NetworkConfig, NetworkConfigData, NetworkConfigProps, NewSandboxCard, NewSandboxCardProps, OutOfCreditsModal, OutOfCreditsModalProps, PlanCardData, PlanCards, PlanCardsProps, PlanFeature, PortsList, PortsListProps, ProcessInfo, ProcessList, ProcessListProps, ProductVariant, ProfileAvatar, ProfileAvatarProps, ProfileComparison, ProfileComparisonProps, ProfileSelector, ProfileSelectorProps, PromoBanner, PromoBannerProps, RailButton, RailButtonProps, RailFlyout, RailFlyoutProps, RailModeButton, RailModeButtonProps, RailSeparator, RailSeparatorProps, ResourceMeter, ResourceMeterProps, ResourceSnapshot, ResourceSnapshotItem, ResourceSnapshotProps, SIDEBAR_MOBILE_WIDTH, SIDEBAR_PANEL_WIDTH, SIDEBAR_RAIL_WIDTH, SIDEBAR_TOTAL_WIDTH, SandboxCard, SandboxCardData, SandboxCardProps, SandboxStatus, SandboxTable, SandboxTableProps, Sidebar, SidebarContent, SidebarContentProps, SidebarLayout, SidebarLayoutFlyoutItem, SidebarLayoutNavItem, SidebarLayoutProps, SidebarPanel, SidebarPanelContent, SidebarPanelContentProps, SidebarPanelHeader, SidebarPanelHeaderProps, SidebarPanelProps, SidebarProps, SidebarProvider, SidebarProviderProps, SidebarRail, SidebarRailFooter, SidebarRailFooterProps, SidebarRailHeader, SidebarRailHeaderProps, SidebarRailNav, SidebarRailNavProps, SidebarRailProps, SidebarUser, SnapshotList, SnapshotListProps, SystemLogsViewer, SystemLogsViewerProps, TeamRole, UsageSummary, UsageSummaryData, UsageSummaryProps, Variant, VariantList, VariantListProps, VariantOutcome, VariantStatus, canAdminSandbox, parseInsufficientBalance, useSidebar } from './dashboard.js';
12
12
  export { B as Backend, a as BackendSelector, b as BackendSelectorProps, H as HARNESS_OPTIONS, c as HarnessPicker, d as HarnessPickerProps, e as HarnessType, f as chatCapableHarnesses } from './harness-picker-lyeEncN4.js';
13
13
  export { D as DEFAULT_FEATURED_MODEL_IDS, M as ModelInfo, a as ModelPicker, b as ModelPickerProps, c as ModelPickerVariant, d as canonicalModelId, e as dedupeModels, f as formatContext, g as formatPricing, m as modelDedupKey } from './model-picker-Cmisf9Y8.js';
14
14
  export { B as BillingBalance, a as BillingDashboard, b as BillingDashboardProps, c as BillingSubscription, d as BillingUsage, P as PricingPage, e as PricingPageProps, f as PricingTier, T as TemplateCard, g as TemplateCardData, h as TemplateCardProps, U as UsageChart, i as UsageChartProps, j as UsageDataPoint, k as formatPrice } from './template-card-UhV3pmRC.js';
package/dist/index.js CHANGED
@@ -161,6 +161,7 @@ import {
161
161
  ProfileSelector,
162
162
  PromoBanner,
163
163
  RailButton,
164
+ RailFlyout,
164
165
  RailModeButton,
165
166
  RailSeparator,
166
167
  ResourceMeter,
@@ -189,7 +190,7 @@ import {
189
190
  canAdminSandbox,
190
191
  parseInsufficientBalance,
191
192
  useSidebar
192
- } from "./chunk-LGCOOUIX.js";
193
+ } from "./chunk-F2M5MN7K.js";
193
194
  import {
194
195
  BillingDashboard,
195
196
  InfoPanel,
@@ -431,6 +432,7 @@ export {
431
432
  PromoBanner,
432
433
  QuestionPreview,
433
434
  RailButton,
435
+ RailFlyout,
434
436
  RailModeButton,
435
437
  RailSeparator,
436
438
  RealtimeSessionRegistry,
package/dist/styles.css CHANGED
@@ -406,6 +406,9 @@
406
406
  .left-\[50\%\] {
407
407
  left: 50%;
408
408
  }
409
+ .left-full {
410
+ left: 100%;
411
+ }
409
412
  .z-0 {
410
413
  z-index: 0;
411
414
  }
@@ -1102,6 +1105,9 @@
1102
1105
  .min-w-\[8rem\] {
1103
1106
  min-width: 8rem;
1104
1107
  }
1108
+ .min-w-\[12rem\] {
1109
+ min-width: 12rem;
1110
+ }
1105
1111
  .min-w-\[20px\] {
1106
1112
  min-width: 20px;
1107
1113
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/sandbox-ui",
3
- "version": "0.27.1",
3
+ "version": "0.28.0",
4
4
  "description": "Unified UI component library for Tangle Sandbox — primitives, chat, dashboard, terminal, editor, and workspace components",
5
5
  "repository": {
6
6
  "type": "git",