@tangle-network/sandbox-ui 0.35.0 → 0.37.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.
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  Button,
3
3
  Logo
4
- } from "./chunk-7ZA5SEK3.js";
4
+ } from "./chunk-4ZZUMXPX.js";
5
5
  import {
6
6
  cn
7
7
  } from "./chunk-EI44GEQ5.js";
@@ -1496,6 +1496,10 @@ function DashboardLayoutInner({
1496
1496
  topNavLinks,
1497
1497
  activeTopNavHref,
1498
1498
  LinkComponent = DefaultLink2,
1499
+ logoHref = "/",
1500
+ onLogoClick,
1501
+ logoAriaLabel = "Toggle navigation",
1502
+ labeledRail = false,
1499
1503
  footer,
1500
1504
  railFooter,
1501
1505
  profileMenuItems,
@@ -1522,7 +1526,7 @@ function DashboardLayoutInner({
1522
1526
  document.removeEventListener("keydown", keyHandler);
1523
1527
  };
1524
1528
  }, [notificationsOpen]);
1525
- const { contentMargin, hidden, mode, hasPanels, panelOpen } = useSidebar();
1529
+ const { contentMargin, hidden, mode, hasPanels, panelOpen, toggleRail, railCollapsed } = useSidebar();
1526
1530
  const modeSet = React6.useMemo(() => new Set(modeItems), [modeItems]);
1527
1531
  const sidebarUser = React6.useMemo(
1528
1532
  () => user ? { email: user.email, name: user.name, tier: user.tier, avatarUrl: user.avatarUrl } : void 0,
@@ -1532,7 +1536,34 @@ function DashboardLayoutInner({
1532
1536
  const buildSidebarContent = React6.useCallback(
1533
1537
  (showLabels) => /* @__PURE__ */ jsxs13(Fragment8, { children: [
1534
1538
  /* @__PURE__ */ jsxs13(SidebarRail, { wide: showLabels, children: [
1535
- /* @__PURE__ */ jsx14(SidebarRailHeader, { children: /* @__PURE__ */ jsx14(Link, { href: "/", to: "/", className: "p-1 rounded-md transition-colors hover:bg-muted/50", children: /* @__PURE__ */ jsx14(Logo, { variant, size: "sm", iconOnly: true }) }) }),
1539
+ /* @__PURE__ */ jsx14(SidebarRailHeader, { children: onLogoClick ? /* @__PURE__ */ jsx14(
1540
+ "button",
1541
+ {
1542
+ type: "button",
1543
+ onClick: onLogoClick,
1544
+ "aria-label": logoAriaLabel,
1545
+ className: "p-1 rounded-md transition-colors hover:bg-muted/50",
1546
+ children: /* @__PURE__ */ jsx14(Logo, { variant, size: "sm", iconOnly: true })
1547
+ }
1548
+ ) : labeledRail ? /* @__PURE__ */ jsx14(
1549
+ "button",
1550
+ {
1551
+ type: "button",
1552
+ onClick: toggleRail,
1553
+ "aria-label": railCollapsed ? "Expand navigation" : "Collapse navigation",
1554
+ "aria-expanded": !railCollapsed,
1555
+ className: "p-1 rounded-md transition-colors hover:bg-muted/50",
1556
+ children: /* @__PURE__ */ jsx14(Logo, { variant, size: "sm", iconOnly: true })
1557
+ }
1558
+ ) : /* @__PURE__ */ jsx14(
1559
+ Link,
1560
+ {
1561
+ href: logoHref,
1562
+ to: logoHref,
1563
+ className: "p-1 rounded-md transition-colors hover:bg-muted/50",
1564
+ children: /* @__PURE__ */ jsx14(Logo, { variant, size: "sm", iconOnly: true })
1565
+ }
1566
+ ) }),
1536
1567
  /* @__PURE__ */ jsx14(SidebarRailNav, { children: navItems.map((item, i) => {
1537
1568
  const isMode = modeSet.has(item.id);
1538
1569
  const prevIsMode = i > 0 && modeSet.has(navItems[i - 1].id);
@@ -1586,6 +1617,12 @@ function DashboardLayoutInner({
1586
1617
  [
1587
1618
  Link,
1588
1619
  variant,
1620
+ onLogoClick,
1621
+ logoAriaLabel,
1622
+ logoHref,
1623
+ labeledRail,
1624
+ toggleRail,
1625
+ railCollapsed,
1589
1626
  navItems,
1590
1627
  modeSet,
1591
1628
  activeNavId,
@@ -1602,7 +1639,10 @@ function DashboardLayoutInner({
1602
1639
  mode
1603
1640
  ]
1604
1641
  );
1605
- const sidebarContent = React6.useMemo(() => buildSidebarContent(false), [buildSidebarContent]);
1642
+ const sidebarContent = React6.useMemo(
1643
+ () => buildSidebarContent(labeledRail && !railCollapsed),
1644
+ [buildSidebarContent, labeledRail, railCollapsed]
1645
+ );
1606
1646
  const mobileSidebarContent = React6.useMemo(() => buildSidebarContent(true), [buildSidebarContent]);
1607
1647
  return /* @__PURE__ */ jsxs13("div", { className: cn("min-h-screen bg-background text-foreground", className), children: [
1608
1648
  /* @__PURE__ */ jsxs13(
@@ -1615,7 +1655,7 @@ function DashboardLayoutInner({
1615
1655
  },
1616
1656
  children: [
1617
1657
  /* @__PURE__ */ jsxs13("div", { className: "flex items-center gap-8", children: [
1618
- /* @__PURE__ */ jsx14(Link, { href: "/", to: "/", className: "lg:hidden flex items-center p-1 rounded-md hover:bg-muted/50 transition-colors", children: /* @__PURE__ */ jsx14(Logo, { variant, size: "sm", iconOnly: true }) }),
1658
+ /* @__PURE__ */ jsx14(Link, { href: logoHref, to: logoHref, className: "lg:hidden flex items-center p-1 rounded-md hover:bg-muted/50 transition-colors", children: /* @__PURE__ */ jsx14(Logo, { variant, size: "sm", iconOnly: true }) }),
1619
1659
  topNavLinks && topNavLinks.length > 0 && /* @__PURE__ */ jsx14("div", { className: "hidden md:flex gap-6", children: topNavLinks.map((link) => /* @__PURE__ */ jsx14(
1620
1660
  Link,
1621
1661
  {
@@ -1732,8 +1772,8 @@ function DashboardLayoutInner({
1732
1772
  footer
1733
1773
  ] });
1734
1774
  }
1735
- function DashboardLayout({ defaultPanelOpen, defaultMode, ...props }) {
1736
- return /* @__PURE__ */ jsx14(SidebarProvider, { defaultPanelOpen, defaultMode, hasPanels: (props.panels?.length ?? 0) > 0, children: /* @__PURE__ */ jsx14(DashboardLayoutInner, { defaultPanelOpen, defaultMode, ...props }) });
1775
+ function DashboardLayout({ defaultPanelOpen, defaultMode, labeledRail, ...props }) {
1776
+ return /* @__PURE__ */ jsx14(SidebarProvider, { defaultPanelOpen, defaultMode, labeledRail, hasPanels: (props.panels?.length ?? 0) > 0, children: /* @__PURE__ */ jsx14(DashboardLayoutInner, { defaultPanelOpen, defaultMode, labeledRail, ...props }) });
1737
1777
  }
1738
1778
 
1739
1779
  // src/dashboard/sidebar-layout.tsx
@@ -147,9 +147,103 @@ function Logo({ variant = "sandbox", size = "md", className, iconOnly = false })
147
147
  }
148
148
  Logo.displayName = "Logo";
149
149
 
150
+ // src/primitives/heading.tsx
151
+ import {
152
+ forwardRef
153
+ } from "react";
154
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
155
+ var VARIANT_CLASS = {
156
+ display: "font-display font-bold text-foreground text-[length:var(--font-size-display,3rem)] leading-[var(--line-height-display,1.05)] tracking-[var(--tracking-tight,-0.02em)]",
157
+ hero: "font-display font-bold text-foreground text-[length:var(--font-size-hero,2.5rem)] leading-[1.1] tracking-[var(--tracking-tight,-0.02em)]",
158
+ page: "font-display font-semibold text-foreground text-[length:var(--font-size-3xl,1.875rem)] leading-[var(--line-height-heading,1.15)] tracking-[var(--tracking-tight,-0.02em)]",
159
+ section: "font-display font-semibold text-foreground text-[length:var(--font-size-xl,1.25rem)] leading-[1.3] tracking-[var(--tracking-snug,-0.01em)]",
160
+ subsection: "font-semibold text-foreground text-[length:var(--font-size-lg,1rem)] leading-[1.4]",
161
+ eyebrow: "font-semibold uppercase text-muted-foreground text-[length:var(--font-size-sm,0.75rem)] leading-none tracking-[var(--tracking-wide,0.08em)]"
162
+ };
163
+ var DEFAULT_TAG = {
164
+ display: "h1",
165
+ hero: "h2",
166
+ page: "h1",
167
+ section: "h2",
168
+ subsection: "h3",
169
+ eyebrow: "p"
170
+ };
171
+ var Heading = forwardRef(function Heading2({ role, as, className, children, ...rest }, ref) {
172
+ const Tag = as ?? DEFAULT_TAG[role];
173
+ return /* @__PURE__ */ jsx2(Tag, { ref, className: cn(VARIANT_CLASS[role], className), ...rest, children });
174
+ });
175
+ function PageHeader({
176
+ title,
177
+ description,
178
+ eyebrow,
179
+ action,
180
+ className,
181
+ titleAs
182
+ }) {
183
+ return /* @__PURE__ */ jsxs2(
184
+ "div",
185
+ {
186
+ className: cn(
187
+ "flex flex-col gap-3 sm:flex-row sm:items-start sm:justify-between",
188
+ className
189
+ ),
190
+ children: [
191
+ /* @__PURE__ */ jsxs2("div", { className: "space-y-1.5", children: [
192
+ eyebrow ? /* @__PURE__ */ jsx2(Heading, { role: "eyebrow", children: eyebrow }) : null,
193
+ /* @__PURE__ */ jsx2(Heading, { role: "page", as: titleAs, children: title }),
194
+ description ? /* @__PURE__ */ jsx2("p", { className: "max-w-2xl text-[length:var(--font-size-base,0.9375rem)] text-muted-foreground leading-relaxed", children: description }) : null
195
+ ] }),
196
+ action ? /* @__PURE__ */ jsx2("div", { className: "flex shrink-0 items-center gap-2", children: action }) : null
197
+ ]
198
+ }
199
+ );
200
+ }
201
+ function SectionTitle({
202
+ title,
203
+ description,
204
+ action,
205
+ className
206
+ }) {
207
+ return /* @__PURE__ */ jsxs2(
208
+ "div",
209
+ {
210
+ className: cn(
211
+ "flex flex-col gap-1 sm:flex-row sm:items-start sm:justify-between",
212
+ className
213
+ ),
214
+ children: [
215
+ /* @__PURE__ */ jsxs2("div", { className: "space-y-1", children: [
216
+ /* @__PURE__ */ jsx2(Heading, { role: "section", children: title }),
217
+ description ? /* @__PURE__ */ jsx2("p", { className: "max-w-xl text-[length:var(--font-size-sm,0.75rem)] text-muted-foreground", children: description }) : null
218
+ ] }),
219
+ action ? /* @__PURE__ */ jsx2("div", { className: "shrink-0", children: action }) : null
220
+ ]
221
+ }
222
+ );
223
+ }
224
+
225
+ // src/primitives/page-shell.tsx
226
+ import { jsx as jsx3 } from "react/jsx-runtime";
227
+ function PageShell({ children, className }) {
228
+ return /* @__PURE__ */ jsx3(
229
+ "div",
230
+ {
231
+ className: cn(
232
+ "mx-auto w-full max-w-6xl space-y-8 px-6 py-8 lg:px-8",
233
+ className
234
+ ),
235
+ children
236
+ }
237
+ );
238
+ }
239
+
150
240
  export {
151
241
  TangleKnot,
152
242
  Logo,
243
+ Heading,
244
+ PageHeader,
245
+ SectionTitle,
246
+ PageShell,
153
247
  Avatar,
154
248
  AvatarFallback,
155
249
  AvatarImage,
@@ -654,6 +654,28 @@ interface DashboardLayoutProps {
654
654
  topNavLinks?: TopNavLink[];
655
655
  activeTopNavHref?: string;
656
656
  LinkComponent?: React.ComponentType<any>;
657
+ /**
658
+ * Where the in-app logo links. Defaults to "/" (backward compatible);
659
+ * pass an in-app path (e.g. "/dashboard") so the logo never bounces an
660
+ * authenticated user back out to the public marketing homepage.
661
+ */
662
+ logoHref?: string;
663
+ /**
664
+ * If provided, the rail logo becomes a button calling this instead of
665
+ * navigating — e.g. to toggle the sidebar. Takes precedence over logoHref.
666
+ */
667
+ onLogoClick?: () => void;
668
+ /**
669
+ * Accessible label for the logo button when onLogoClick is set. Defaults to
670
+ * "Toggle navigation"; set it to match what onLogoClick actually does (e.g.
671
+ * "Open command palette") so screen readers don't announce a stale action.
672
+ */
673
+ logoAriaLabel?: string;
674
+ /**
675
+ * Let the icon rail expand to a labeled rail. When true, the rail logo
676
+ * toggles between icon-only and labeled instead of navigating.
677
+ */
678
+ labeledRail?: boolean;
657
679
  footer?: React.ReactNode;
658
680
  defaultPanelOpen?: boolean;
659
681
  defaultMode?: string;
@@ -675,7 +697,7 @@ interface DashboardLayoutProps {
675
697
  onMarkAllRead?: () => void;
676
698
  };
677
699
  }
678
- declare function DashboardLayout({ defaultPanelOpen, defaultMode, ...props }: DashboardLayoutProps): react_jsx_runtime.JSX.Element;
700
+ declare function DashboardLayout({ defaultPanelOpen, defaultMode, labeledRail, ...props }: DashboardLayoutProps): react_jsx_runtime.JSX.Element;
679
701
 
680
702
  /** A sub-destination revealed inside a nav item's right-flyout. */
681
703
  interface SidebarLayoutFlyoutItem {
package/dist/dashboard.js CHANGED
@@ -52,7 +52,7 @@ import {
52
52
  canAdminSandbox,
53
53
  parseInsufficientBalance,
54
54
  useSidebar
55
- } from "./chunk-75Z5H43I.js";
55
+ } from "./chunk-4PCDRCDA.js";
56
56
  import {
57
57
  BillingDashboard,
58
58
  InfoPanel,
@@ -61,7 +61,7 @@ import {
61
61
  UsageChart,
62
62
  formatPrice
63
63
  } from "./chunk-2XNT74ZX.js";
64
- import "./chunk-7ZA5SEK3.js";
64
+ import "./chunk-4ZZUMXPX.js";
65
65
  import {
66
66
  BackendSelector,
67
67
  HARNESS_BRAND,
package/dist/globals.css CHANGED
@@ -39,12 +39,12 @@
39
39
  --container-sm: 24rem;
40
40
  --container-md: 28rem;
41
41
  --container-lg: 32rem;
42
+ --container-xl: 36rem;
42
43
  --container-2xl: 42rem;
43
44
  --container-3xl: 48rem;
44
45
  --container-4xl: 56rem;
45
46
  --container-5xl: 64rem;
46
47
  --container-6xl: 72rem;
47
- --container-7xl: 80rem;
48
48
  --text-xs: 0.75rem;
49
49
  --text-xs--line-height: calc(1 / 0.75);
50
50
  --text-sm: 0.875rem;
@@ -1033,9 +1033,6 @@
1033
1033
  .max-w-6xl {
1034
1034
  max-width: var(--container-6xl);
1035
1035
  }
1036
- .max-w-7xl {
1037
- max-width: var(--container-7xl);
1038
- }
1039
1036
  .max-w-\[14rem\] {
1040
1037
  max-width: 14rem;
1041
1038
  }
@@ -1093,6 +1090,9 @@
1093
1090
  .max-w-sm {
1094
1091
  max-width: var(--container-sm);
1095
1092
  }
1093
+ .max-w-xl {
1094
+ max-width: var(--container-xl);
1095
+ }
1096
1096
  .min-w-0 {
1097
1097
  min-width: calc(var(--spacing) * 0);
1098
1098
  }
@@ -2475,6 +2475,27 @@
2475
2475
  .text-\[calc\(var\(--font-size-xs\)-1px\)\] {
2476
2476
  font-size: calc(var(--font-size-xs) - 1px);
2477
2477
  }
2478
+ .text-\[length\:var\(--font-size-3xl\,1\.875rem\)\] {
2479
+ font-size: var(--font-size-3xl,1.875rem);
2480
+ }
2481
+ .text-\[length\:var\(--font-size-base\,0\.9375rem\)\] {
2482
+ font-size: var(--font-size-base,0.9375rem);
2483
+ }
2484
+ .text-\[length\:var\(--font-size-display\,3rem\)\] {
2485
+ font-size: var(--font-size-display,3rem);
2486
+ }
2487
+ .text-\[length\:var\(--font-size-hero\,2\.5rem\)\] {
2488
+ font-size: var(--font-size-hero,2.5rem);
2489
+ }
2490
+ .text-\[length\:var\(--font-size-lg\,1rem\)\] {
2491
+ font-size: var(--font-size-lg,1rem);
2492
+ }
2493
+ .text-\[length\:var\(--font-size-sm\,0\.75rem\)\] {
2494
+ font-size: var(--font-size-sm,0.75rem);
2495
+ }
2496
+ .text-\[length\:var\(--font-size-xl\,1\.25rem\)\] {
2497
+ font-size: var(--font-size-xl,1.25rem);
2498
+ }
2478
2499
  .leading-6 {
2479
2500
  --tw-leading: calc(var(--spacing) * 6);
2480
2501
  line-height: calc(var(--spacing) * 6);
@@ -2487,6 +2508,18 @@
2487
2508
  --tw-leading: calc(var(--spacing) * 7);
2488
2509
  line-height: calc(var(--spacing) * 7);
2489
2510
  }
2511
+ .leading-\[1\.1\] {
2512
+ --tw-leading: 1.1;
2513
+ line-height: 1.1;
2514
+ }
2515
+ .leading-\[1\.3\] {
2516
+ --tw-leading: 1.3;
2517
+ line-height: 1.3;
2518
+ }
2519
+ .leading-\[1\.4\] {
2520
+ --tw-leading: 1.4;
2521
+ line-height: 1.4;
2522
+ }
2490
2523
  .leading-\[1\.6\] {
2491
2524
  --tw-leading: 1.6;
2492
2525
  line-height: 1.6;
@@ -2499,6 +2532,14 @@
2499
2532
  --tw-leading: var(--line-height-base);
2500
2533
  line-height: var(--line-height-base);
2501
2534
  }
2535
+ .leading-\[var\(--line-height-display\,1\.05\)\] {
2536
+ --tw-leading: var(--line-height-display,1.05);
2537
+ line-height: var(--line-height-display,1.05);
2538
+ }
2539
+ .leading-\[var\(--line-height-heading\,1\.15\)\] {
2540
+ --tw-leading: var(--line-height-heading,1.15);
2541
+ line-height: var(--line-height-heading,1.15);
2542
+ }
2502
2543
  .leading-none {
2503
2544
  --tw-leading: 1;
2504
2545
  line-height: 1;
@@ -2583,6 +2624,18 @@
2583
2624
  --tw-tracking: var(--chat-label-tracking,0.16em);
2584
2625
  letter-spacing: var(--chat-label-tracking,0.16em);
2585
2626
  }
2627
+ .tracking-\[var\(--tracking-snug\,-0\.01em\)\] {
2628
+ --tw-tracking: var(--tracking-snug,-0.01em);
2629
+ letter-spacing: var(--tracking-snug,-0.01em);
2630
+ }
2631
+ .tracking-\[var\(--tracking-tight\,-0\.02em\)\] {
2632
+ --tw-tracking: var(--tracking-tight,-0.02em);
2633
+ letter-spacing: var(--tracking-tight,-0.02em);
2634
+ }
2635
+ .tracking-\[var\(--tracking-wide\,0\.08em\)\] {
2636
+ --tw-tracking: var(--tracking-wide,0.08em);
2637
+ letter-spacing: var(--tracking-wide,0.08em);
2638
+ }
2586
2639
  .tracking-normal {
2587
2640
  --tw-tracking: var(--tracking-normal);
2588
2641
  letter-spacing: var(--tracking-normal);
@@ -3762,6 +3815,11 @@
3762
3815
  align-items: center;
3763
3816
  }
3764
3817
  }
3818
+ .sm\:items-start {
3819
+ @media (width >= 40rem) {
3820
+ align-items: flex-start;
3821
+ }
3822
+ }
3765
3823
  .sm\:justify-between {
3766
3824
  @media (width >= 40rem) {
3767
3825
  justify-content: space-between;
@@ -3863,11 +3921,6 @@
3863
3921
  align-items: center;
3864
3922
  }
3865
3923
  }
3866
- .md\:items-end {
3867
- @media (width >= 48rem) {
3868
- align-items: flex-end;
3869
- }
3870
- }
3871
3924
  .md\:justify-between {
3872
3925
  @media (width >= 48rem) {
3873
3926
  justify-content: space-between;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { ArtifactPane, ArtifactPaneProps, Avatar, AvatarFallback, AvatarImage, Badge, BadgeProps, Button, ButtonProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CodeBlock, CodeBlockProps, CopyButton, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropZone, DropZoneProps, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EmptyStateProps, InlineCode, InlineCodeProps, Input, InputProps, Label, Progress, SegmentedControl, SegmentedControlOption, SegmentedControlProps, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SidebarDropZone, SidebarDropZoneProps, Skeleton, SkeletonCard, SkeletonTable, StatCard, StatCardProps, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TerminalDisplay, TerminalCursor as TerminalDisplayCursor, TerminalInput as TerminalDisplayInput, TerminalLine as TerminalDisplayLine, Textarea, TextareaProps, ThemeToggle, Toast, ToastContainer, ToastProvider, UploadFile, UploadProgress, UploadProgressProps, badgeVariants, buttonVariants, useTheme, useToast } from '@tangle-network/ui/primitives';
2
- export { Logo, LogoProps, TangleKnot } from './primitives.js';
2
+ export { L as Logo, a as LogoProps, T as TangleKnot } from './logo-CZ6moVvw.js';
3
3
  export { CodeBlock as CodeBlockDisplay, Markdown, MarkdownProps } from '@tangle-network/ui/markdown';
4
4
  export { AgentWorkbench, ApprovalConfidenceStat, ApprovalItem, ApprovalQueue, ApprovalQueueProps, AuditCheck, AuditResults, AuditResultsProps, BannerType, CalendarEvent, CalendarView, CalendarViewProps, ContextBadge, DirectoryPane, DirectoryPaneProps, FormAudit, RuntimePane, RuntimePaneProps, SESSION_CREATED_EVENT, SandboxWorkbench, SandboxWorkbenchArtifact, SandboxWorkbenchCustomArtifact, SandboxWorkbenchFileArtifact, SandboxWorkbenchLayoutOptions, SandboxWorkbenchMarkdownArtifact, SandboxWorkbenchOpenUIArtifact, SandboxWorkbenchProps, SandboxWorkbenchSessionProps, SessionActivityMonitor, SessionActivityMonitorProps, SessionCreatedDetail, SessionOptimisticController, SessionSidebar, SessionSidebarBadge, SessionSidebarFilter, SessionSidebarItem, SessionSidebarLink, SessionSidebarProps, ShellShouldRevalidateArgs, ShellShouldRevalidateOptions, StatusBanner, StatusBannerProps, StatusBar, StatusBarProps, TaskBoard, TaskBoardColumn, TaskBoardItem, TaskBoardProps, TerminalLine, TerminalPanel, TerminalProps, UseOptimisticSessionItemsOptions, WorkspaceLayout, WorkspaceLayoutProps, createShellShouldRevalidate, dispatchSessionCreated, shellShouldRevalidate, useOptimisticSessionItems } from './workspace.js';
5
5
  export { OpenUIAction, OpenUIActionsNode, OpenUIArtifactRenderer, OpenUIArtifactRendererProps, OpenUIBadgeNode, OpenUICardNode, OpenUICodeNode, OpenUIComponentNode, OpenUIGridNode, OpenUIHeadingNode, OpenUIKeyValueNode, OpenUIMarkdownNode, OpenUIPrimitive, OpenUISeparatorNode, OpenUIStackNode, OpenUIStatNode, OpenUITableNode, OpenUITextNode } from '@tangle-network/ui/openui';
package/dist/index.js CHANGED
@@ -199,7 +199,7 @@ import {
199
199
  canAdminSandbox,
200
200
  parseInsufficientBalance,
201
201
  useSidebar
202
- } from "./chunk-75Z5H43I.js";
202
+ } from "./chunk-4PCDRCDA.js";
203
203
  import {
204
204
  BillingDashboard,
205
205
  InfoPanel,
@@ -294,7 +294,7 @@ import {
294
294
  buttonVariants,
295
295
  useTheme,
296
296
  useToast
297
- } from "./chunk-7ZA5SEK3.js";
297
+ } from "./chunk-4ZZUMXPX.js";
298
298
  import {
299
299
  BackendSelector,
300
300
  HARNESS_BRAND,
@@ -0,0 +1,18 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ interface LogoProps {
4
+ variant?: "sandbox";
5
+ size?: "sm" | "md" | "lg" | "xl";
6
+ className?: string;
7
+ iconOnly?: boolean;
8
+ }
9
+ declare function TangleKnot({ size, className }: {
10
+ size: number;
11
+ className?: string;
12
+ }): react_jsx_runtime.JSX.Element;
13
+ declare function Logo({ variant, size, className, iconOnly }: LogoProps): react_jsx_runtime.JSX.Element;
14
+ declare namespace Logo {
15
+ var displayName: string;
16
+ }
17
+
18
+ export { Logo as L, TangleKnot as T, type LogoProps as a };
package/dist/pages.js CHANGED
@@ -15,6 +15,7 @@ import {
15
15
  DialogHeader,
16
16
  DialogTitle,
17
17
  Input,
18
+ PageHeader,
18
19
  Select,
19
20
  SelectContent,
20
21
  SelectItem,
@@ -22,7 +23,7 @@ import {
22
23
  SelectValue,
23
24
  Switch,
24
25
  Textarea
25
- } from "./chunk-7ZA5SEK3.js";
26
+ } from "./chunk-4ZZUMXPX.js";
26
27
  import "./chunk-NMR2CTGP.js";
27
28
  import {
28
29
  cn
@@ -2547,7 +2548,7 @@ function parseEnvText(text) {
2547
2548
  }
2548
2549
 
2549
2550
  // src/pages/secrets-page.tsx
2550
- import { jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
2551
+ import { Fragment as Fragment2, jsx as jsx7, jsxs as jsxs7 } from "react/jsx-runtime";
2551
2552
  var MAX_IMPORT_FILE_BYTES = 256 * 1024;
2552
2553
  function SecretsPage({ apiClient, className, teamSecretsHint }) {
2553
2554
  const [secrets, setSecrets] = React6.useState([]);
@@ -2724,39 +2725,40 @@ function SecretsPage({ apiClient, className, teamSecretsHint }) {
2724
2725
  return dateStr;
2725
2726
  }
2726
2727
  };
2727
- return /* @__PURE__ */ jsxs7("div", { className: cn("mx-auto w-full max-w-7xl space-y-8", className), children: [
2728
- /* @__PURE__ */ jsxs7("div", { className: "flex flex-col gap-4 md:flex-row md:items-end md:justify-between", children: [
2729
- /* @__PURE__ */ jsxs7("div", { children: [
2730
- /* @__PURE__ */ jsx7("h1", { className: "font-display text-3xl font-extrabold tracking-tight text-foreground", children: "Environment Secrets" }),
2731
- /* @__PURE__ */ jsx7("p", { className: "mt-1 text-sm text-muted-foreground", children: "Secrets are securely stored and automatically exposed as environment variables across all your sandboxes." })
2732
- ] }),
2733
- /* @__PURE__ */ jsxs7("div", { className: "flex items-center gap-3", children: [
2734
- /* @__PURE__ */ jsxs7(
2735
- "button",
2736
- {
2737
- type: "button",
2738
- onClick: () => setIsImportOpen(true),
2739
- className: "inline-flex items-center gap-2 rounded-lg border border-border bg-card px-4 py-2.5 text-sm font-semibold text-foreground hover:bg-muted transition-colors active:scale-[0.97]",
2740
- children: [
2741
- /* @__PURE__ */ jsx7(Upload, { className: "h-4 w-4" }),
2742
- "Import .env"
2743
- ]
2744
- }
2745
- ),
2746
- /* @__PURE__ */ jsxs7(
2747
- "button",
2748
- {
2749
- type: "button",
2750
- onClick: () => setIsCreateOpen(true),
2751
- className: "inline-flex items-center gap-2 rounded-lg bg-[var(--btn-primary-bg)] border border-[var(--border-accent,transparent)] px-5 py-2.5 text-sm font-semibold text-[var(--btn-primary-text)] hover:bg-[var(--btn-primary-hover)] transition-colors active:scale-[0.97]",
2752
- children: [
2753
- /* @__PURE__ */ jsx7(Plus3, { className: "h-4 w-4" }),
2754
- "New Secret"
2755
- ]
2756
- }
2757
- )
2758
- ] })
2759
- ] }),
2728
+ return /* @__PURE__ */ jsxs7("div", { className: cn("mx-auto w-full max-w-6xl space-y-8", className), children: [
2729
+ /* @__PURE__ */ jsx7(
2730
+ PageHeader,
2731
+ {
2732
+ title: "Environment Secrets",
2733
+ description: "Secrets are securely stored and automatically exposed as environment variables across all your sandboxes.",
2734
+ action: /* @__PURE__ */ jsxs7(Fragment2, { children: [
2735
+ /* @__PURE__ */ jsxs7(
2736
+ "button",
2737
+ {
2738
+ type: "button",
2739
+ onClick: () => setIsImportOpen(true),
2740
+ className: "inline-flex items-center gap-2 rounded-lg border border-border bg-card px-4 py-2.5 text-sm font-semibold text-foreground hover:bg-muted transition-colors active:scale-[0.97]",
2741
+ children: [
2742
+ /* @__PURE__ */ jsx7(Upload, { className: "h-4 w-4" }),
2743
+ "Import .env"
2744
+ ]
2745
+ }
2746
+ ),
2747
+ /* @__PURE__ */ jsxs7(
2748
+ "button",
2749
+ {
2750
+ type: "button",
2751
+ onClick: () => setIsCreateOpen(true),
2752
+ className: "inline-flex items-center gap-2 rounded-lg bg-[var(--btn-primary-bg)] border border-[var(--border-accent,transparent)] px-5 py-2.5 text-sm font-semibold text-[var(--btn-primary-text)] hover:bg-[var(--btn-primary-hover)] transition-colors active:scale-[0.97]",
2753
+ children: [
2754
+ /* @__PURE__ */ jsx7(Plus3, { className: "h-4 w-4" }),
2755
+ "New Secret"
2756
+ ]
2757
+ }
2758
+ )
2759
+ ] })
2760
+ }
2761
+ ),
2760
2762
  teamSecretsHint && /* @__PURE__ */ jsxs7("div", { className: "flex items-center gap-3 rounded-lg border border-border bg-[var(--accent-surface-soft)]/40 px-4 py-3", children: [
2761
2763
  /* @__PURE__ */ jsx7(Users, { className: "h-5 w-5 shrink-0 text-[var(--accent-text)]", "aria-hidden": "true" }),
2762
2764
  /* @__PURE__ */ jsxs7("div", { className: "flex-1 text-sm", children: [
@@ -3571,25 +3573,26 @@ function StartupScriptsPage({ apiClient, className }) {
3571
3573
  }));
3572
3574
  };
3573
3575
  const activeCount = scripts.filter((s) => s.enabled).length;
3574
- return /* @__PURE__ */ jsxs9("div", { className: cn("mx-auto w-full max-w-7xl space-y-6", className), children: [
3575
- /* @__PURE__ */ jsxs9("div", { className: "flex flex-col gap-4 md:flex-row md:items-end md:justify-between", children: [
3576
- /* @__PURE__ */ jsxs9("div", { children: [
3577
- /* @__PURE__ */ jsx9("h1", { className: "font-display text-3xl font-extrabold tracking-tight text-foreground", children: "Startup Scripts" }),
3578
- /* @__PURE__ */ jsx9("p", { className: "mt-1 text-sm text-muted-foreground", children: "Define scripts that run automatically when your sandboxes start. Scripts can access your encrypted secrets." })
3579
- ] }),
3580
- /* @__PURE__ */ jsxs9(
3581
- "button",
3582
- {
3583
- type: "button",
3584
- onClick: openCreate,
3585
- className: "inline-flex items-center gap-2 rounded-lg bg-[var(--btn-primary-bg)] px-4 py-2.5 text-sm font-bold text-[var(--btn-primary-text)] shadow-sm transition-colors hover:bg-[var(--btn-primary-hover)]",
3586
- children: [
3587
- /* @__PURE__ */ jsx9(Plus4, { className: "h-4 w-4" }),
3588
- "New Script"
3589
- ]
3590
- }
3591
- )
3592
- ] }),
3576
+ return /* @__PURE__ */ jsxs9("div", { className: cn("mx-auto w-full max-w-6xl space-y-8", className), children: [
3577
+ /* @__PURE__ */ jsx9(
3578
+ PageHeader,
3579
+ {
3580
+ title: "Startup Scripts",
3581
+ description: "Define scripts that run automatically when your sandboxes start. Scripts can access your encrypted secrets.",
3582
+ action: /* @__PURE__ */ jsxs9(
3583
+ "button",
3584
+ {
3585
+ type: "button",
3586
+ onClick: openCreate,
3587
+ className: "inline-flex items-center gap-2 rounded-lg bg-[var(--btn-primary-bg)] px-4 py-2.5 text-sm font-bold text-[var(--btn-primary-text)] shadow-sm transition-colors hover:bg-[var(--btn-primary-hover)]",
3588
+ children: [
3589
+ /* @__PURE__ */ jsx9(Plus4, { className: "h-4 w-4" }),
3590
+ "New Script"
3591
+ ]
3592
+ }
3593
+ )
3594
+ }
3595
+ ),
3593
3596
  /* @__PURE__ */ jsxs9("div", { className: "grid grid-cols-1 gap-6 md:grid-cols-4", children: [
3594
3597
  /* @__PURE__ */ jsxs9("div", { className: "rounded-lg border border-border bg-card p-5 shadow-[var(--shadow-card)]", children: [
3595
3598
  /* @__PURE__ */ jsx9("p", { className: "text-[10px] font-bold uppercase tracking-widest text-muted-foreground", children: "Total Scripts" }),
@@ -1,19 +1,76 @@
1
1
  export { Avatar, AvatarFallback, AvatarImage, Badge, BadgeProps, Button, ButtonProps, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CodeBlock, CodeBlockProps, CopyButton, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DropZone, DropZoneProps, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EmptyStateProps, InlineCode, InlineCodeProps, Input, InputProps, Label, Progress, SegmentedControl, SegmentedControlOption, SegmentedControlProps, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SidebarDropZone, SidebarDropZoneProps, Skeleton, SkeletonCard, SkeletonTable, StatCard, StatCardProps, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TerminalCursor, TerminalDisplay, TerminalInput, TerminalLine, Textarea, TextareaProps, ThemeToggle, Toast, ToastContainer, ToastProvider, UploadFile, UploadProgress, UploadProgressProps, badgeVariants, buttonVariants, useTheme, useToast } from '@tangle-network/ui/primitives';
2
+ export { L as Logo, a as LogoProps, T as TangleKnot } from './logo-CZ6moVvw.js';
2
3
  import * as react_jsx_runtime from 'react/jsx-runtime';
4
+ import * as React from 'react';
5
+ import { HTMLAttributes, ElementType, ReactNode } from 'react';
3
6
 
4
- interface LogoProps {
5
- variant?: "sandbox";
6
- size?: "sm" | "md" | "lg" | "xl";
7
+ /**
8
+ * Canonical type roles for the Tangle design system. Every title in every
9
+ * product app should be a Heading (or a PageHeader / SectionTitle composite
10
+ * built on it) so size, weight, tracking, and leading stay identical across
11
+ * surfaces. Sizes/leadings/tracking resolve from @tangle-network/brand tokens
12
+ * (with literal fallbacks so the component still renders if brand styles are
13
+ * absent, e.g. in isolation tests or Storybook).
14
+ *
15
+ * Weights are deliberately quiet (Tangle Quiet): heroes at 700, titles at 600
16
+ * — never extrabold.
17
+ *
18
+ * Semantic-tag invariant: both `display` and `page` default to <h1>. Use at
19
+ * most one of them per page (the marketing hero OR the dashboard page title);
20
+ * if a page needs both, override the secondary one with `as` to keep a single
21
+ * <h1> for accessibility and SEO.
22
+ */
23
+ type HeadingVariant = "display" | "hero" | "page" | "section" | "subsection" | "eyebrow";
24
+ /** @deprecated Renamed to {@link HeadingVariant}; kept as an alias. */
25
+ type HeadingRole = HeadingVariant;
26
+ interface HeadingProps extends Omit<HTMLAttributes<HTMLElement>, "role"> {
27
+ /** Type role from the design system (size + weight + tracking + leading). */
28
+ role: HeadingVariant;
29
+ /** Override the rendered element (defaults to the semantic tag for the role). */
30
+ as?: ElementType;
31
+ children: ReactNode;
32
+ }
33
+ /**
34
+ * Role-based heading. Forwards a ref to the underlying element and passes
35
+ * through standard HTML/ARIA/data-* attributes so it drops into tests,
36
+ * scroll-spy, and a11y tooling without friction.
37
+ */
38
+ declare const Heading: React.ForwardRefExoticComponent<HeadingProps & React.RefAttributes<HTMLElement>>;
39
+ interface PageHeaderProps {
40
+ title: ReactNode;
41
+ description?: ReactNode;
42
+ /** Uppercase label rendered above the title. */
43
+ eyebrow?: ReactNode;
44
+ /** Primary action(s), right-aligned on wide viewports. */
45
+ action?: ReactNode;
46
+ className?: string;
47
+ /** Override the title element (default h1). */
48
+ titleAs?: ElementType;
49
+ }
50
+ /**
51
+ * Standard page header: one title size, one description style, one action
52
+ * slot — used by every page so titles never drift between surfaces.
53
+ */
54
+ declare function PageHeader({ title, description, eyebrow, action, className, titleAs, }: PageHeaderProps): react_jsx_runtime.JSX.Element;
55
+ interface SectionTitleProps {
56
+ title: ReactNode;
57
+ description?: ReactNode;
58
+ action?: ReactNode;
7
59
  className?: string;
8
- iconOnly?: boolean;
9
60
  }
10
- declare function TangleKnot({ size, className }: {
11
- size: number;
61
+ /** Section heading inside a page — smaller than PageHeader, same rhythm. */
62
+ declare function SectionTitle({ title, description, action, className, }: SectionTitleProps): react_jsx_runtime.JSX.Element;
63
+
64
+ interface PageShellProps {
65
+ children: ReactNode;
12
66
  className?: string;
13
- }): react_jsx_runtime.JSX.Element;
14
- declare function Logo({ variant, size, className, iconOnly }: LogoProps): react_jsx_runtime.JSX.Element;
15
- declare namespace Logo {
16
- var displayName: string;
17
67
  }
68
+ /**
69
+ * Canonical page container — one max-width, one gutter, one vertical rhythm
70
+ * so every page sits on the same grid. Gutter widens on large viewports.
71
+ * Layout primitive (not a heading); kept in its own module so consumers
72
+ * looking for page layout don't have to reach into the typography file.
73
+ */
74
+ declare function PageShell({ children, className }: PageShellProps): react_jsx_runtime.JSX.Element;
18
75
 
19
- export { Logo, type LogoProps, TangleKnot };
76
+ export { Heading, type HeadingProps, type HeadingRole, type HeadingVariant, PageHeader, type PageHeaderProps, PageShell, type PageShellProps, SectionTitle, type SectionTitleProps };
@@ -39,11 +39,15 @@ import {
39
39
  DropdownMenuSubTrigger,
40
40
  DropdownMenuTrigger,
41
41
  EmptyState,
42
+ Heading,
42
43
  InlineCode,
43
44
  Input,
44
45
  Label,
45
46
  Logo,
47
+ PageHeader,
48
+ PageShell,
46
49
  Progress,
50
+ SectionTitle,
47
51
  SegmentedControl,
48
52
  Select,
49
53
  SelectContent,
@@ -87,7 +91,7 @@ import {
87
91
  buttonVariants,
88
92
  useTheme,
89
93
  useToast
90
- } from "./chunk-7ZA5SEK3.js";
94
+ } from "./chunk-4ZZUMXPX.js";
91
95
  import "./chunk-EI44GEQ5.js";
92
96
  export {
93
97
  Avatar,
@@ -130,11 +134,15 @@ export {
130
134
  DropdownMenuSubTrigger,
131
135
  DropdownMenuTrigger,
132
136
  EmptyState,
137
+ Heading,
133
138
  InlineCode,
134
139
  Input,
135
140
  Label,
136
141
  Logo,
142
+ PageHeader,
143
+ PageShell,
137
144
  Progress,
145
+ SectionTitle,
138
146
  SegmentedControl,
139
147
  Select,
140
148
  SelectContent,
package/dist/styles.css CHANGED
@@ -39,12 +39,12 @@
39
39
  --container-sm: 24rem;
40
40
  --container-md: 28rem;
41
41
  --container-lg: 32rem;
42
+ --container-xl: 36rem;
42
43
  --container-2xl: 42rem;
43
44
  --container-3xl: 48rem;
44
45
  --container-4xl: 56rem;
45
46
  --container-5xl: 64rem;
46
47
  --container-6xl: 72rem;
47
- --container-7xl: 80rem;
48
48
  --text-xs: 0.75rem;
49
49
  --text-xs--line-height: calc(1 / 0.75);
50
50
  --text-sm: 0.875rem;
@@ -1033,9 +1033,6 @@
1033
1033
  .max-w-6xl {
1034
1034
  max-width: var(--container-6xl);
1035
1035
  }
1036
- .max-w-7xl {
1037
- max-width: var(--container-7xl);
1038
- }
1039
1036
  .max-w-\[14rem\] {
1040
1037
  max-width: 14rem;
1041
1038
  }
@@ -1093,6 +1090,9 @@
1093
1090
  .max-w-sm {
1094
1091
  max-width: var(--container-sm);
1095
1092
  }
1093
+ .max-w-xl {
1094
+ max-width: var(--container-xl);
1095
+ }
1096
1096
  .min-w-0 {
1097
1097
  min-width: calc(var(--spacing) * 0);
1098
1098
  }
@@ -2475,6 +2475,27 @@
2475
2475
  .text-\[calc\(var\(--font-size-xs\)-1px\)\] {
2476
2476
  font-size: calc(var(--font-size-xs) - 1px);
2477
2477
  }
2478
+ .text-\[length\:var\(--font-size-3xl\,1\.875rem\)\] {
2479
+ font-size: var(--font-size-3xl,1.875rem);
2480
+ }
2481
+ .text-\[length\:var\(--font-size-base\,0\.9375rem\)\] {
2482
+ font-size: var(--font-size-base,0.9375rem);
2483
+ }
2484
+ .text-\[length\:var\(--font-size-display\,3rem\)\] {
2485
+ font-size: var(--font-size-display,3rem);
2486
+ }
2487
+ .text-\[length\:var\(--font-size-hero\,2\.5rem\)\] {
2488
+ font-size: var(--font-size-hero,2.5rem);
2489
+ }
2490
+ .text-\[length\:var\(--font-size-lg\,1rem\)\] {
2491
+ font-size: var(--font-size-lg,1rem);
2492
+ }
2493
+ .text-\[length\:var\(--font-size-sm\,0\.75rem\)\] {
2494
+ font-size: var(--font-size-sm,0.75rem);
2495
+ }
2496
+ .text-\[length\:var\(--font-size-xl\,1\.25rem\)\] {
2497
+ font-size: var(--font-size-xl,1.25rem);
2498
+ }
2478
2499
  .leading-6 {
2479
2500
  --tw-leading: calc(var(--spacing) * 6);
2480
2501
  line-height: calc(var(--spacing) * 6);
@@ -2487,6 +2508,18 @@
2487
2508
  --tw-leading: calc(var(--spacing) * 7);
2488
2509
  line-height: calc(var(--spacing) * 7);
2489
2510
  }
2511
+ .leading-\[1\.1\] {
2512
+ --tw-leading: 1.1;
2513
+ line-height: 1.1;
2514
+ }
2515
+ .leading-\[1\.3\] {
2516
+ --tw-leading: 1.3;
2517
+ line-height: 1.3;
2518
+ }
2519
+ .leading-\[1\.4\] {
2520
+ --tw-leading: 1.4;
2521
+ line-height: 1.4;
2522
+ }
2490
2523
  .leading-\[1\.6\] {
2491
2524
  --tw-leading: 1.6;
2492
2525
  line-height: 1.6;
@@ -2499,6 +2532,14 @@
2499
2532
  --tw-leading: var(--line-height-base);
2500
2533
  line-height: var(--line-height-base);
2501
2534
  }
2535
+ .leading-\[var\(--line-height-display\,1\.05\)\] {
2536
+ --tw-leading: var(--line-height-display,1.05);
2537
+ line-height: var(--line-height-display,1.05);
2538
+ }
2539
+ .leading-\[var\(--line-height-heading\,1\.15\)\] {
2540
+ --tw-leading: var(--line-height-heading,1.15);
2541
+ line-height: var(--line-height-heading,1.15);
2542
+ }
2502
2543
  .leading-none {
2503
2544
  --tw-leading: 1;
2504
2545
  line-height: 1;
@@ -2583,6 +2624,18 @@
2583
2624
  --tw-tracking: var(--chat-label-tracking,0.16em);
2584
2625
  letter-spacing: var(--chat-label-tracking,0.16em);
2585
2626
  }
2627
+ .tracking-\[var\(--tracking-snug\,-0\.01em\)\] {
2628
+ --tw-tracking: var(--tracking-snug,-0.01em);
2629
+ letter-spacing: var(--tracking-snug,-0.01em);
2630
+ }
2631
+ .tracking-\[var\(--tracking-tight\,-0\.02em\)\] {
2632
+ --tw-tracking: var(--tracking-tight,-0.02em);
2633
+ letter-spacing: var(--tracking-tight,-0.02em);
2634
+ }
2635
+ .tracking-\[var\(--tracking-wide\,0\.08em\)\] {
2636
+ --tw-tracking: var(--tracking-wide,0.08em);
2637
+ letter-spacing: var(--tracking-wide,0.08em);
2638
+ }
2586
2639
  .tracking-normal {
2587
2640
  --tw-tracking: var(--tracking-normal);
2588
2641
  letter-spacing: var(--tracking-normal);
@@ -3762,6 +3815,11 @@
3762
3815
  align-items: center;
3763
3816
  }
3764
3817
  }
3818
+ .sm\:items-start {
3819
+ @media (width >= 40rem) {
3820
+ align-items: flex-start;
3821
+ }
3822
+ }
3765
3823
  .sm\:justify-between {
3766
3824
  @media (width >= 40rem) {
3767
3825
  justify-content: space-between;
@@ -3863,11 +3921,6 @@
3863
3921
  align-items: center;
3864
3922
  }
3865
3923
  }
3866
- .md\:items-end {
3867
- @media (width >= 48rem) {
3868
- align-items: flex-end;
3869
- }
3870
- }
3871
3924
  .md\:justify-between {
3872
3925
  @media (width >= 48rem) {
3873
3926
  justify-content: space-between;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tangle-network/sandbox-ui",
3
- "version": "0.35.0",
3
+ "version": "0.37.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",