@estiva-app/ui 0.30.0 → 0.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -2251,20 +2251,36 @@ import { useRef as useRef6 } from "react";
2251
2251
  import { Dialog as Dialog3 } from "@base-ui/react/dialog";
2252
2252
  import { AlertDialog } from "@base-ui/react/alert-dialog";
2253
2253
  import { IconX as IconX5 } from "@tabler/icons-react";
2254
+
2255
+ // src/ContainerHeader.tsx
2256
+ import { IconChevronDown as IconChevronDown3 } from "@tabler/icons-react";
2254
2257
  import { jsx as jsx34, jsxs as jsxs24 } from "react/jsx-runtime";
2258
+ function ContainerHeader({ title, chevron = false, actions, className }) {
2259
+ const text = typeof title === "string";
2260
+ return /* @__PURE__ */ jsxs24("div", { className: cn("flex h-12 shrink-0 items-center justify-between overflow-hidden border-b border-border-subtle py-2 pr-4 pl-5", className), children: [
2261
+ /* @__PURE__ */ jsx34("div", { className: cn("flex items-center gap-2 overflow-hidden", text ? "shrink-0" : "min-w-0 flex-1"), children: /* @__PURE__ */ jsxs24("div", { className: cn("flex items-center gap-1", text ? "shrink-0" : "min-w-0 flex-1"), children: [
2262
+ text ? /* @__PURE__ */ jsx34("span", { className: "whitespace-nowrap text-body-2-strong text-text-primary", children: title }) : /* @__PURE__ */ jsx34("div", { className: "min-w-0 flex-1", children: title }),
2263
+ chevron && /* @__PURE__ */ jsx34(IconChevronDown3, { size: 12, stroke: 1.5, className: "shrink-0 text-text-secondary" })
2264
+ ] }) }),
2265
+ actions && /* @__PURE__ */ jsx34("div", { className: "flex shrink-0 items-center justify-end gap-3", children: /* @__PURE__ */ jsx34("div", { className: "flex shrink-0 items-center gap-1", children: actions }) })
2266
+ ] });
2267
+ }
2268
+
2269
+ // src/DialogShell.tsx
2270
+ import { jsx as jsx35, jsxs as jsxs25 } from "react/jsx-runtime";
2255
2271
  function DialogShell({ title, onClose, headerContent, footer, children, bodyClassName, bodyMaxHeight, width = 502, alert = false }) {
2256
2272
  const Parts = alert ? AlertDialog : Dialog3;
2257
2273
  const popupRef = useRef6(null);
2258
- return /* @__PURE__ */ jsx34(
2274
+ return /* @__PURE__ */ jsx35(
2259
2275
  Parts.Root,
2260
2276
  {
2261
2277
  open: true,
2262
2278
  onOpenChange: (open) => {
2263
2279
  if (!open) onClose();
2264
2280
  },
2265
- children: /* @__PURE__ */ jsxs24(Parts.Portal, { children: [
2266
- /* @__PURE__ */ jsx34(Parts.Backdrop, { className: "fixed inset-0 z-40 bg-scrim" }),
2267
- /* @__PURE__ */ jsx34("div", { className: "fixed inset-0 z-50 flex items-center justify-center pointer-events-none", children: /* @__PURE__ */ jsxs24(
2281
+ children: /* @__PURE__ */ jsxs25(Parts.Portal, { children: [
2282
+ /* @__PURE__ */ jsx35(Parts.Backdrop, { className: "fixed inset-0 z-40 bg-scrim" }),
2283
+ /* @__PURE__ */ jsx35("div", { className: "fixed inset-0 z-50 flex items-center justify-center pointer-events-none", children: /* @__PURE__ */ jsxs25(
2268
2284
  Parts.Popup,
2269
2285
  {
2270
2286
  ref: popupRef,
@@ -2273,20 +2289,37 @@ function DialogShell({ title, onClose, headerContent, footer, children, bodyClas
2273
2289
  className: "bg-bg-elevated border border-border-subtle rounded-lg shadow-lg pointer-events-auto flex flex-col overflow-hidden outline-none",
2274
2290
  style: { width },
2275
2291
  children: [
2276
- /* @__PURE__ */ jsxs24("div", { className: "h-12 flex items-center justify-between pl-5 pr-4 border-b border-border-subtle shrink-0", children: [
2277
- headerContent ?? /* @__PURE__ */ jsx34(Parts.Title, { className: "text-h4 text-text-primary", render: /* @__PURE__ */ jsx34("span", {}), children: title }),
2278
- /* @__PURE__ */ jsx34(
2279
- Parts.Close,
2280
- {
2281
- render: /* @__PURE__ */ jsx34(IconButton, { tooltip: "Close", "aria-label": "Close", children: /* @__PURE__ */ jsx34(IconX5, { size: 16, stroke: 1.5 }) })
2282
- }
2283
- )
2284
- ] }),
2292
+ /* @__PURE__ */ jsx35(
2293
+ ContainerHeader,
2294
+ {
2295
+ title: headerContent ?? /* @__PURE__ */ jsx35(Parts.Title, { className: "text-h4 text-text-primary", render: /* @__PURE__ */ jsx35("span", {}), children: title }),
2296
+ actions: (
2297
+ /*
2298
+ The ✕ IS the `Close` part now, rather than a button that calls
2299
+ `onClose` beside one (stage 4, 2026-09-07). Stage 3 could not do
2300
+ this: an `IconButton` carrying a `tooltip` returned the tooltip
2301
+ wrapper `<div>` as its root, so the part composed onto the
2302
+ wrapper and not the button. Porting Tooltip removed the wrapper
2303
+ — the trigger is the button itself — and the composition works.
2304
+
2305
+ What it buys: the dialog closes through its own state machine,
2306
+ so the ✕, Escape and the outside press are one path with one
2307
+ reason attached, instead of one of the three going around.
2308
+ */
2309
+ /* @__PURE__ */ jsx35(
2310
+ Parts.Close,
2311
+ {
2312
+ render: /* @__PURE__ */ jsx35(IconButton, { tooltip: "Close", "aria-label": "Close", children: /* @__PURE__ */ jsx35(IconX5, { size: 16, stroke: 1.5 }) })
2313
+ }
2314
+ )
2315
+ )
2316
+ }
2317
+ ),
2285
2318
  bodyMaxHeight ? (
2286
2319
  // The line above the footer on a box of the shell's own, not pushed into ScrollArea (UIG-9).
2287
- /* @__PURE__ */ jsx34("div", { className: cn(footer != null && "border-b border-border-subtle"), children: /* @__PURE__ */ jsx34(ScrollArea, { viewportClassName: bodyMaxHeight, contentClassName: cn("pl-5 pr-4 py-4", bodyClassName), children }) })
2288
- ) : /* @__PURE__ */ jsx34("div", { className: cn("pl-5 pr-4 py-4", footer != null && "border-b border-border-subtle", bodyClassName), children }),
2289
- footer != null && /* @__PURE__ */ jsx34("div", { className: "h-12 flex items-center justify-end gap-2 pl-5 pr-4 shrink-0", children: footer })
2320
+ /* @__PURE__ */ jsx35("div", { className: cn(footer != null && "border-b border-border-subtle"), children: /* @__PURE__ */ jsx35(ScrollArea, { viewportClassName: bodyMaxHeight, contentClassName: cn("pl-5 pr-4 py-4", bodyClassName), children }) })
2321
+ ) : /* @__PURE__ */ jsx35("div", { className: cn("pl-5 pr-4 py-4", footer != null && "border-b border-border-subtle", bodyClassName), children }),
2322
+ footer != null && /* @__PURE__ */ jsx35("div", { className: "h-12 flex items-center justify-end gap-2 pl-5 pr-4 shrink-0", children: footer })
2290
2323
  ]
2291
2324
  }
2292
2325
  ) })
@@ -2296,7 +2329,7 @@ function DialogShell({ title, onClose, headerContent, footer, children, bodyClas
2296
2329
  }
2297
2330
 
2298
2331
  // src/ConfirmDialog.tsx
2299
- import { Fragment as Fragment6, jsx as jsx35, jsxs as jsxs25 } from "react/jsx-runtime";
2332
+ import { Fragment as Fragment6, jsx as jsx36, jsxs as jsxs26 } from "react/jsx-runtime";
2300
2333
  function ConfirmDialog({ title, children, confirmLabel, destructive = false, onConfirm, onClose }) {
2301
2334
  const [busy, setBusy] = useState4(false);
2302
2335
  const confirm = async () => {
@@ -2308,17 +2341,17 @@ function ConfirmDialog({ title, children, confirmLabel, destructive = false, onC
2308
2341
  setBusy(false);
2309
2342
  }
2310
2343
  };
2311
- return /* @__PURE__ */ jsx35(
2344
+ return /* @__PURE__ */ jsx36(
2312
2345
  DialogShell,
2313
2346
  {
2314
2347
  alert: true,
2315
2348
  title,
2316
2349
  onClose,
2317
- footer: /* @__PURE__ */ jsxs25(Fragment6, { children: [
2318
- /* @__PURE__ */ jsx35(Button, { variant: "muted", onClick: onClose, disabled: busy, children: "Cancel" }),
2319
- /* @__PURE__ */ jsx35(Button, { variant: destructive ? "destructive" : "primary", onClick: () => void confirm(), disabled: busy, children: confirmLabel })
2350
+ footer: /* @__PURE__ */ jsxs26(Fragment6, { children: [
2351
+ /* @__PURE__ */ jsx36(Button, { variant: "muted", onClick: onClose, disabled: busy, children: "Cancel" }),
2352
+ /* @__PURE__ */ jsx36(Button, { variant: destructive ? "destructive" : "primary", onClick: () => void confirm(), disabled: busy, children: confirmLabel })
2320
2353
  ] }),
2321
- children: /* @__PURE__ */ jsx35("div", { className: "flex flex-col gap-3 text-body-2 text-text-primary", children })
2354
+ children: /* @__PURE__ */ jsx36("div", { className: "flex flex-col gap-3 text-body-2 text-text-primary", children })
2322
2355
  }
2323
2356
  );
2324
2357
  }
@@ -2327,7 +2360,7 @@ function ConfirmDialog({ title, children, confirmLabel, destructive = false, onC
2327
2360
  import { useEffect as useEffect3, useRef as useRef7, useState as useState5 } from "react";
2328
2361
  import { Field as BaseField4 } from "@base-ui/react/field";
2329
2362
  import { Input as Input2 } from "@base-ui/react/input";
2330
- import { jsx as jsx36 } from "react/jsx-runtime";
2363
+ import { jsx as jsx37 } from "react/jsx-runtime";
2331
2364
  function EditableText({ value, display, displayNode, placeholder, onCommit, multiline = false, className, label, readOnly = false }) {
2332
2365
  const [editing, setEditing] = useState5(false);
2333
2366
  const [draft, setDraft] = useState5(value);
@@ -2385,7 +2418,7 @@ function EditableText({ value, display, displayNode, placeholder, onCommit, mult
2385
2418
  written and never read. Read-only, this is a line of text: whatever
2386
2419
  names the region around it (a `Field`, a `Property`) names this too.
2387
2420
  */
2388
- /* @__PURE__ */ jsx36(
2421
+ /* @__PURE__ */ jsx37(
2389
2422
  "div",
2390
2423
  {
2391
2424
  className: cn("w-full px-2 py-1", multiline && !displayNode && "whitespace-pre-wrap", display ?? value ? "text-text-primary" : "text-text-muted", className),
@@ -2395,11 +2428,11 @@ function EditableText({ value, display, displayNode, placeholder, onCommit, mult
2395
2428
  );
2396
2429
  }
2397
2430
  if (editing) {
2398
- return multiline ? /* @__PURE__ */ jsx36(
2431
+ return multiline ? /* @__PURE__ */ jsx37(
2399
2432
  BaseField4.Control,
2400
2433
  {
2401
2434
  ref: fieldRef,
2402
- render: /* @__PURE__ */ jsx36("textarea", { rows: 4 }),
2435
+ render: /* @__PURE__ */ jsx37("textarea", { rows: 4 }),
2403
2436
  "aria-label": label,
2404
2437
  value: draft,
2405
2438
  disabled: busy,
@@ -2408,7 +2441,7 @@ function EditableText({ value, display, displayNode, placeholder, onCommit, mult
2408
2441
  onBlur: () => void commit(),
2409
2442
  className: fieldClass
2410
2443
  }
2411
- ) : /* @__PURE__ */ jsx36(
2444
+ ) : /* @__PURE__ */ jsx37(
2412
2445
  Input2,
2413
2446
  {
2414
2447
  ref: fieldRef,
@@ -2422,7 +2455,7 @@ function EditableText({ value, display, displayNode, placeholder, onCommit, mult
2422
2455
  }
2423
2456
  );
2424
2457
  }
2425
- return /* @__PURE__ */ jsx36(
2458
+ return /* @__PURE__ */ jsx37(
2426
2459
  "button",
2427
2460
  {
2428
2461
  type: "button",
@@ -2442,7 +2475,7 @@ function EditableText({ value, display, displayNode, placeholder, onCommit, mult
2442
2475
  // src/ErrorBoundary.tsx
2443
2476
  import { Component } from "react";
2444
2477
  import { IconAlertTriangle as IconAlertTriangle2 } from "@tabler/icons-react";
2445
- import { jsx as jsx37 } from "react/jsx-runtime";
2478
+ import { jsx as jsx38 } from "react/jsx-runtime";
2446
2479
  var ErrorBoundary = class extends Component {
2447
2480
  state = { hasError: false };
2448
2481
  static getDerivedStateFromError() {
@@ -2453,22 +2486,22 @@ var ErrorBoundary = class extends Component {
2453
2486
  }
2454
2487
  render() {
2455
2488
  if (!this.state.hasError) return this.props.children;
2456
- const message = /* @__PURE__ */ jsx37(
2489
+ const message = /* @__PURE__ */ jsx38(
2457
2490
  EmptyState,
2458
2491
  {
2459
- icon: /* @__PURE__ */ jsx37(IconAlertTriangle2, { size: 16, stroke: 1.5 }),
2492
+ icon: /* @__PURE__ */ jsx38(IconAlertTriangle2, { size: 16, stroke: 1.5 }),
2460
2493
  message: `Something went wrong${this.props.label ? ` in the ${this.props.label}` : ""}. Your data is safe \u2014 try again.`,
2461
2494
  action: { label: "Try again", onClick: () => this.setState({ hasError: false }) }
2462
2495
  }
2463
2496
  );
2464
2497
  if (this.props.frame) return this.props.frame(message);
2465
- return this.props.fallbackClassName ? /* @__PURE__ */ jsx37("div", { className: this.props.fallbackClassName, children: message }) : message;
2498
+ return this.props.fallbackClassName ? /* @__PURE__ */ jsx38("div", { className: this.props.fallbackClassName, children: message }) : message;
2466
2499
  }
2467
2500
  };
2468
2501
 
2469
2502
  // src/ProgressBar.tsx
2470
2503
  import { Progress } from "@base-ui/react/progress";
2471
- import { jsx as jsx38 } from "react/jsx-runtime";
2504
+ import { jsx as jsx39 } from "react/jsx-runtime";
2472
2505
  var TRACK_CLASSES = {
2473
2506
  default: "h-1.5 w-full overflow-hidden rounded-full bg-bg-inset",
2474
2507
  // 4px, Katerina's ruling of 14 September; Peek's own bar is 3px until it takes this one.
@@ -2481,13 +2514,13 @@ var INDICATOR_CLASSES = {
2481
2514
  function ProgressBar({ value, max, label, variant = "default", className }) {
2482
2515
  return (
2483
2516
  // `max={0}` needs no guard: Base UI reads the 0/0 share as an empty bar.
2484
- /* @__PURE__ */ jsx38(Progress.Root, { value, max, "aria-label": label, className, children: /* @__PURE__ */ jsx38(Progress.Track, { className: TRACK_CLASSES[variant], children: /* @__PURE__ */ jsx38(Progress.Indicator, { className: INDICATOR_CLASSES[variant] }) }) })
2517
+ /* @__PURE__ */ jsx39(Progress.Root, { value, max, "aria-label": label, className, children: /* @__PURE__ */ jsx39(Progress.Track, { className: TRACK_CLASSES[variant], children: /* @__PURE__ */ jsx39(Progress.Indicator, { className: INDICATOR_CLASSES[variant] }) }) })
2485
2518
  );
2486
2519
  }
2487
2520
 
2488
2521
  // src/Breadcrumb.tsx
2489
2522
  import { Fragment as Fragment7, useCallback as useCallback2, useLayoutEffect as useLayoutEffect4, useRef as useRef8, useState as useState6 } from "react";
2490
- import { jsx as jsx39, jsxs as jsxs26 } from "react/jsx-runtime";
2523
+ import { jsx as jsx40, jsxs as jsxs27 } from "react/jsx-runtime";
2491
2524
  function Breadcrumb({ items, className }) {
2492
2525
  const navRef = useRef8(null);
2493
2526
  const labelRefs = useRef8([]);
@@ -2507,7 +2540,7 @@ function Breadcrumb({ items, className }) {
2507
2540
  observer.observe(nav);
2508
2541
  return () => observer.disconnect();
2509
2542
  }, [measure, items]);
2510
- return /* @__PURE__ */ jsx39("nav", { ref: navRef, "aria-label": "Breadcrumb", className: cn("flex min-w-0 items-center gap-1.5 text-body-2", className), children: items.map((item, index) => {
2543
+ return /* @__PURE__ */ jsx40("nav", { ref: navRef, "aria-label": "Breadcrumb", className: cn("flex min-w-0 items-center gap-1.5 text-body-2", className), children: items.map((item, index) => {
2511
2544
  const last = index === items.length - 1;
2512
2545
  const tone = item.muted || last && item.mono ? "text-text-muted" : last ? "text-text-primary" : "text-text-secondary";
2513
2546
  const text = cn(
@@ -2528,25 +2561,25 @@ function Breadcrumb({ items, className }) {
2528
2561
  // on a box around it, which the link takes them from, rather than
2529
2562
  // pushed into it (UIG-9); the link is still the one element that
2530
2563
  // truncates and is measured.
2531
- /* @__PURE__ */ jsx39("span", { className: cn("flex min-w-0", item.mono && "shrink-0 font-mono text-caption", tone, "hover:text-text-primary"), children: /* @__PURE__ */ jsx39(Link, { ref: setLabelRef, variant: "plain", truncate: true, href: item.href, onClick: item.onClick, children: item.label }) })
2532
- ) : /* @__PURE__ */ jsx39("span", { ref: setLabelRef, className: text, "aria-current": last ? "page" : void 0, children: item.label });
2533
- return /* @__PURE__ */ jsxs26(Fragment7, { children: [
2534
- index > 0 && /* @__PURE__ */ jsx39("span", { "aria-hidden": "true", className: "shrink-0 text-text-muted", children: "/" }),
2535
- item.icon && /* @__PURE__ */ jsx39("span", { "aria-hidden": "true", className: cn("flex shrink-0", tone), children: item.icon }),
2564
+ /* @__PURE__ */ jsx40("span", { className: cn("flex min-w-0", item.mono && "shrink-0 font-mono text-caption", tone, "hover:text-text-primary"), children: /* @__PURE__ */ jsx40(Link, { ref: setLabelRef, variant: "plain", truncate: true, href: item.href, onClick: item.onClick, children: item.label }) })
2565
+ ) : /* @__PURE__ */ jsx40("span", { ref: setLabelRef, className: text, "aria-current": last ? "page" : void 0, children: item.label });
2566
+ return /* @__PURE__ */ jsxs27(Fragment7, { children: [
2567
+ index > 0 && /* @__PURE__ */ jsx40("span", { "aria-hidden": "true", className: "shrink-0 text-text-muted", children: "/" }),
2568
+ item.icon && /* @__PURE__ */ jsx40("span", { "aria-hidden": "true", className: cn("flex shrink-0", tone), children: item.icon }),
2536
2569
  truncated.has(index) ? (
2537
2570
  // `min-w-0 shrink` undoes the wrapper's own shrink-0 — the crumb
2538
2571
  // must keep truncating inside it, or wrapping it would widen the
2539
2572
  // trail and the tooltip would never be needed again.
2540
- /* @__PURE__ */ jsx39(WithTooltip, { label: item.label, wrapperClassName: "min-w-0 shrink", children: crumb })
2573
+ /* @__PURE__ */ jsx40(WithTooltip, { label: item.label, wrapperClassName: "min-w-0 shrink", children: crumb })
2541
2574
  ) : crumb
2542
2575
  ] }, `${item.label}-${index}`);
2543
2576
  }) });
2544
2577
  }
2545
2578
 
2546
2579
  // src/NavItem.tsx
2547
- import { jsx as jsx40, jsxs as jsxs27 } from "react/jsx-runtime";
2580
+ import { jsx as jsx41, jsxs as jsxs28 } from "react/jsx-runtime";
2548
2581
  function NavItem({ label, href, count, countLabel, active = false, icon, className, ...props }) {
2549
- return /* @__PURE__ */ jsxs27(
2582
+ return /* @__PURE__ */ jsxs28(
2550
2583
  "a",
2551
2584
  {
2552
2585
  href,
@@ -2561,9 +2594,9 @@ function NavItem({ label, href, count, countLabel, active = false, icon, classNa
2561
2594
  ),
2562
2595
  ...props,
2563
2596
  children: [
2564
- icon && /* @__PURE__ */ jsx40("span", { className: "flex shrink-0 items-center", children: icon }),
2565
- /* @__PURE__ */ jsx40("span", { className: "flex-1 truncate", children: label }),
2566
- count ? /* @__PURE__ */ jsx40(WithTooltip, { label: countLabel ?? `${count} open`, children: /* @__PURE__ */ jsx40("span", { className: "min-w-4 shrink-0 text-center font-mono text-caption tabular-nums text-text-muted", children: count }) }) : null
2597
+ icon && /* @__PURE__ */ jsx41("span", { className: "flex shrink-0 items-center", children: icon }),
2598
+ /* @__PURE__ */ jsx41("span", { className: "flex-1 truncate", children: label }),
2599
+ count ? /* @__PURE__ */ jsx41(WithTooltip, { label: countLabel ?? `${count} open`, children: /* @__PURE__ */ jsx41("span", { className: "min-w-4 shrink-0 text-center font-mono text-caption tabular-nums text-text-muted", children: count }) }) : null
2567
2600
  ]
2568
2601
  }
2569
2602
  );
@@ -2572,7 +2605,7 @@ function NavItem({ label, href, count, countLabel, active = false, icon, classNa
2572
2605
  // src/Popover.tsx
2573
2606
  import { useMemo as useMemo3 } from "react";
2574
2607
  import { Popover as BasePopover } from "@base-ui/react/popover";
2575
- import { jsx as jsx41, jsxs as jsxs28 } from "react/jsx-runtime";
2608
+ import { jsx as jsx42, jsxs as jsxs29 } from "react/jsx-runtime";
2576
2609
  var GAP5 = 4;
2577
2610
  var VIEWPORT_PAD5 = 8;
2578
2611
  function Popover({ trigger, anchor, align = "left", side = "bottom", open, onOpenChange, finalFocus, actionsRef, ariaLabel, children, className, contentClassName, maxHeight }) {
@@ -2581,7 +2614,7 @@ function Popover({ trigger, anchor, align = "left", side = "bottom", open, onOpe
2581
2614
  if (anchor instanceof Element) return anchor;
2582
2615
  return { getBoundingClientRect: () => anchor };
2583
2616
  }, [anchor]);
2584
- return /* @__PURE__ */ jsxs28(
2617
+ return /* @__PURE__ */ jsxs29(
2585
2618
  BasePopover.Root,
2586
2619
  {
2587
2620
  open,
@@ -2589,8 +2622,8 @@ function Popover({ trigger, anchor, align = "left", side = "bottom", open, onOpe
2589
2622
  actionsRef,
2590
2623
  modal: false,
2591
2624
  children: [
2592
- trigger && /* @__PURE__ */ jsx41(BasePopover.Trigger, { render: trigger, disabled: triggerDisabled(trigger) }),
2593
- /* @__PURE__ */ jsx41(BasePopover.Portal, { children: /* @__PURE__ */ jsx41(
2625
+ trigger && /* @__PURE__ */ jsx42(BasePopover.Trigger, { render: trigger, disabled: triggerDisabled(trigger) }),
2626
+ /* @__PURE__ */ jsx42(BasePopover.Portal, { children: /* @__PURE__ */ jsx42(
2594
2627
  BasePopover.Positioner,
2595
2628
  {
2596
2629
  anchor: anchorTarget,
@@ -2599,20 +2632,20 @@ function Popover({ trigger, anchor, align = "left", side = "bottom", open, onOpe
2599
2632
  sideOffset: GAP5,
2600
2633
  collisionPadding: VIEWPORT_PAD5,
2601
2634
  className: "z-50 data-[anchor-hidden]:hidden",
2602
- children: /* @__PURE__ */ jsx41(
2635
+ children: /* @__PURE__ */ jsx42(
2603
2636
  BasePopover.Popup,
2604
2637
  {
2605
2638
  "aria-label": ariaLabel,
2606
2639
  initialFocus: trigger ? void 0 : false,
2607
2640
  finalFocus,
2608
2641
  className: cn("min-w-[180px] outline-none p-0", className),
2609
- render: /* @__PURE__ */ jsx41(MenuPanel, {}),
2610
- children: /* @__PURE__ */ jsx41(
2642
+ render: /* @__PURE__ */ jsx42(MenuPanel, {}),
2643
+ children: /* @__PURE__ */ jsx42(
2611
2644
  ScrollArea,
2612
2645
  {
2613
2646
  viewportClassName: maxHeight ?? "max-h-[var(--available-height)]",
2614
2647
  contentClassName: cn("flex flex-col p-2", contentClassName),
2615
- children: /* @__PURE__ */ jsx41(DividerInPanel.Provider, { value: true, children })
2648
+ children: /* @__PURE__ */ jsx42(DividerInPanel.Provider, { value: true, children })
2616
2649
  }
2617
2650
  )
2618
2651
  }
@@ -2626,9 +2659,9 @@ function Popover({ trigger, anchor, align = "left", side = "bottom", open, onOpe
2626
2659
 
2627
2660
  // src/Toolbar.tsx
2628
2661
  import { Toolbar as BaseToolbar } from "@base-ui/react/toolbar";
2629
- import { jsx as jsx42 } from "react/jsx-runtime";
2662
+ import { jsx as jsx43 } from "react/jsx-runtime";
2630
2663
  function Toolbar({ "aria-label": ariaLabel, orientation = "horizontal", loopFocus = true, surface = true, children, className }) {
2631
- const strip = /* @__PURE__ */ jsx42(
2664
+ const strip = /* @__PURE__ */ jsx43(
2632
2665
  BaseToolbar.Root,
2633
2666
  {
2634
2667
  "aria-label": ariaLabel,
@@ -2639,27 +2672,27 @@ function Toolbar({ "aria-label": ariaLabel, orientation = "horizontal", loopFocu
2639
2672
  }
2640
2673
  );
2641
2674
  if (!surface) return strip;
2642
- return /* @__PURE__ */ jsx42(MenuPanel, { className: "w-fit p-1", children: strip });
2675
+ return /* @__PURE__ */ jsx43(MenuPanel, { className: "w-fit p-1", children: strip });
2643
2676
  }
2644
2677
  function ToolbarButton({ ref, disabled, disabledReason, ...props }) {
2645
- return /* @__PURE__ */ jsx42(
2678
+ return /* @__PURE__ */ jsx43(
2646
2679
  BaseToolbar.Button,
2647
2680
  {
2648
2681
  ref,
2649
2682
  disabled: disabled || !!disabledReason,
2650
2683
  focusableWhenDisabled: true,
2651
- render: /* @__PURE__ */ jsx42(IconButton, { disabled, disabledReason, ...props })
2684
+ render: /* @__PURE__ */ jsx43(IconButton, { disabled, disabledReason, ...props })
2652
2685
  }
2653
2686
  );
2654
2687
  }
2655
2688
  function ToolbarLink({ ref, href, ...props }) {
2656
- return /* @__PURE__ */ jsx42(BaseToolbar.Link, { ref, render: /* @__PURE__ */ jsx42(IconButton, { href, ...props }) });
2689
+ return /* @__PURE__ */ jsx43(BaseToolbar.Link, { ref, render: /* @__PURE__ */ jsx43(IconButton, { href, ...props }) });
2657
2690
  }
2658
2691
  function ToolbarInput({ size, ...props }) {
2659
- return /* @__PURE__ */ jsx42(BaseToolbar.Input, { render: /* @__PURE__ */ jsx42(TextInput, { size }), ...props });
2692
+ return /* @__PURE__ */ jsx43(BaseToolbar.Input, { render: /* @__PURE__ */ jsx43(TextInput, { size }), ...props });
2660
2693
  }
2661
2694
  function ToolbarSeparator({ className }) {
2662
- return /* @__PURE__ */ jsx42(
2695
+ return /* @__PURE__ */ jsx43(
2663
2696
  BaseToolbar.Separator,
2664
2697
  {
2665
2698
  orientation: "vertical",
@@ -2669,9 +2702,9 @@ function ToolbarSeparator({ className }) {
2669
2702
  }
2670
2703
 
2671
2704
  // src/ReactionPicker.tsx
2672
- import { jsx as jsx43 } from "react/jsx-runtime";
2705
+ import { jsx as jsx44 } from "react/jsx-runtime";
2673
2706
  function ReactionPicker({ options, onSelect, "aria-label": ariaLabel = "Reactions", surface = true, className }) {
2674
- return /* @__PURE__ */ jsx43(Toolbar, { "aria-label": ariaLabel, surface, className: cn("gap-0.5", className), children: options.map((option) => (
2707
+ return /* @__PURE__ */ jsx44(Toolbar, { "aria-label": ariaLabel, surface, className: cn("gap-0.5", className), children: options.map((option) => (
2675
2708
  /*
2676
2709
  A `ToolbarButton`, not a button in a tooltip wrapper. The wrapper
2677
2710
  would become the toolbar's item and the button inside it would never
@@ -2681,14 +2714,14 @@ function ReactionPicker({ options, onSelect, "aria-label": ariaLabel = "Reaction
2681
2714
  The tooltip names it for a pointer, `aria-label` for everything else,
2682
2715
  and both say the meaning rather than the glyph.
2683
2716
  */
2684
- /* @__PURE__ */ jsx43(
2717
+ /* @__PURE__ */ jsx44(
2685
2718
  ToolbarButton,
2686
2719
  {
2687
2720
  "aria-label": option.label,
2688
2721
  tooltip: option.label,
2689
2722
  onClick: () => onSelect(option.emoji),
2690
2723
  className: "size-7",
2691
- children: /* @__PURE__ */ jsx43("span", { "aria-hidden": "true", className: "text-h3 leading-none", children: option.emoji })
2724
+ children: /* @__PURE__ */ jsx44("span", { "aria-hidden": "true", className: "text-h3 leading-none", children: option.emoji })
2692
2725
  },
2693
2726
  option.emoji
2694
2727
  )
@@ -2697,23 +2730,23 @@ function ReactionPicker({ options, onSelect, "aria-label": ariaLabel = "Reaction
2697
2730
 
2698
2731
  // src/PreviewCard.tsx
2699
2732
  import { PreviewCard as BasePreviewCard } from "@base-ui/react/preview-card";
2700
- import { jsx as jsx44, jsxs as jsxs29 } from "react/jsx-runtime";
2733
+ import { jsx as jsx45, jsxs as jsxs30 } from "react/jsx-runtime";
2701
2734
  var GAP6 = 12;
2702
2735
  var VIEWPORT_PAD6 = 8;
2703
2736
  var OPEN_DELAY2 = 350;
2704
2737
  var CLOSE_DELAY = 200;
2705
2738
  function PreviewCard({ content, children, side = "right", delay = OPEN_DELAY2, closeDelay = CLOSE_DELAY, className, contentClassName, wrapperClassName }) {
2706
- return /* @__PURE__ */ jsxs29(BasePreviewCard.Root, { children: [
2707
- /* @__PURE__ */ jsx44(
2739
+ return /* @__PURE__ */ jsxs30(BasePreviewCard.Root, { children: [
2740
+ /* @__PURE__ */ jsx45(
2708
2741
  BasePreviewCard.Trigger,
2709
2742
  {
2710
2743
  delay,
2711
2744
  closeDelay,
2712
- render: /* @__PURE__ */ jsx44("span", { className: cn("inline-flex", wrapperClassName) }),
2745
+ render: /* @__PURE__ */ jsx45("span", { className: cn("inline-flex", wrapperClassName) }),
2713
2746
  children
2714
2747
  }
2715
2748
  ),
2716
- /* @__PURE__ */ jsx44(BasePreviewCard.Portal, { children: /* @__PURE__ */ jsx44(
2749
+ /* @__PURE__ */ jsx45(BasePreviewCard.Portal, { children: /* @__PURE__ */ jsx45(
2717
2750
  BasePreviewCard.Positioner,
2718
2751
  {
2719
2752
  side,
@@ -2721,12 +2754,12 @@ function PreviewCard({ content, children, side = "right", delay = OPEN_DELAY2, c
2721
2754
  sideOffset: GAP6,
2722
2755
  collisionPadding: VIEWPORT_PAD6,
2723
2756
  className: "z-50 data-[anchor-hidden]:hidden",
2724
- children: /* @__PURE__ */ jsx44(
2757
+ children: /* @__PURE__ */ jsx45(
2725
2758
  BasePreviewCard.Popup,
2726
2759
  {
2727
2760
  className: cn("w-[360px] p-0 outline-none", className),
2728
- render: /* @__PURE__ */ jsx44(MenuPanel, {}),
2729
- children: /* @__PURE__ */ jsx44(ScrollArea, { viewportClassName: "max-h-[min(300px,var(--available-height))]", contentClassName: cn("flex flex-col gap-3 p-3", contentClassName), children: content })
2761
+ render: /* @__PURE__ */ jsx45(MenuPanel, {}),
2762
+ children: /* @__PURE__ */ jsx45(ScrollArea, { viewportClassName: "max-h-[min(300px,var(--available-height))]", contentClassName: cn("flex flex-col gap-3 p-3", contentClassName), children: content })
2730
2763
  }
2731
2764
  )
2732
2765
  }
@@ -2735,15 +2768,15 @@ function PreviewCard({ content, children, side = "right", delay = OPEN_DELAY2, c
2735
2768
  }
2736
2769
 
2737
2770
  // src/Rail.tsx
2738
- import { jsx as jsx45 } from "react/jsx-runtime";
2771
+ import { jsx as jsx46 } from "react/jsx-runtime";
2739
2772
  function Rail({ "aria-label": ariaLabel = "Navigation", children, className }) {
2740
- return /* @__PURE__ */ jsx45("nav", { "aria-label": ariaLabel, className: cn("flex w-16 shrink-0 flex-col items-start gap-2 px-2 py-3", className), children });
2773
+ return /* @__PURE__ */ jsx46("nav", { "aria-label": ariaLabel, className: cn("flex w-16 shrink-0 flex-col items-start gap-2 px-2 py-3", className), children });
2741
2774
  }
2742
2775
 
2743
2776
  // src/RailItem.tsx
2744
- import { jsx as jsx46, jsxs as jsxs30 } from "react/jsx-runtime";
2777
+ import { jsx as jsx47, jsxs as jsxs31 } from "react/jsx-runtime";
2745
2778
  function RailItem({ href, icon, label, active = false, className, ...props }) {
2746
- return /* @__PURE__ */ jsxs30(
2779
+ return /* @__PURE__ */ jsxs31(
2747
2780
  "a",
2748
2781
  {
2749
2782
  href,
@@ -2751,14 +2784,14 @@ function RailItem({ href, icon, label, active = false, className, ...props }) {
2751
2784
  className: cn("group flex h-12 w-full shrink-0 flex-col items-center gap-0.5 px-2 py-0.5", className),
2752
2785
  ...props,
2753
2786
  children: [
2754
- /* @__PURE__ */ jsx46(
2787
+ /* @__PURE__ */ jsx47(
2755
2788
  "div",
2756
2789
  {
2757
2790
  className: cn(
2758
2791
  "flex items-center justify-center rounded-lg p-2 transition-colors",
2759
2792
  active ? "bg-bg-selected" : "group-hover:bg-bg-hover"
2760
2793
  ),
2761
- children: /* @__PURE__ */ jsx46(
2794
+ children: /* @__PURE__ */ jsx47(
2762
2795
  "span",
2763
2796
  {
2764
2797
  className: cn(
@@ -2770,27 +2803,27 @@ function RailItem({ href, icon, label, active = false, className, ...props }) {
2770
2803
  )
2771
2804
  }
2772
2805
  ),
2773
- /* @__PURE__ */ jsx46("span", { className: cn("text-center text-menu", active ? "text-text-primary" : "text-text-secondary"), children: label })
2806
+ /* @__PURE__ */ jsx47("span", { className: cn("text-center text-menu", active ? "text-text-primary" : "text-text-secondary"), children: label })
2774
2807
  ]
2775
2808
  }
2776
2809
  );
2777
2810
  }
2778
2811
 
2779
2812
  // src/Sidebar.tsx
2780
- import { jsx as jsx47 } from "react/jsx-runtime";
2813
+ import { jsx as jsx48 } from "react/jsx-runtime";
2781
2814
  function Sidebar({ "aria-label": ariaLabel = "Workspace", children, className }) {
2782
- return /* @__PURE__ */ jsx47(
2815
+ return /* @__PURE__ */ jsx48(
2783
2816
  "nav",
2784
2817
  {
2785
2818
  "aria-label": ariaLabel,
2786
2819
  className: cn("flex w-60 shrink-0 flex-col border-r border-border-default bg-bg-surface", className),
2787
- children: /* @__PURE__ */ jsx47(ScrollArea, { className: "min-h-0 flex-1", contentClassName: "flex flex-col gap-px px-2.5 py-3", children })
2820
+ children: /* @__PURE__ */ jsx48(ScrollArea, { className: "min-h-0 flex-1", contentClassName: "flex flex-col gap-px px-2.5 py-3", children })
2788
2821
  }
2789
2822
  );
2790
2823
  }
2791
2824
 
2792
2825
  // src/Property.tsx
2793
- import { jsx as jsx48, jsxs as jsxs31 } from "react/jsx-runtime";
2826
+ import { jsx as jsx49, jsxs as jsxs32 } from "react/jsx-runtime";
2794
2827
  var VALUE_CLASSES = "contents";
2795
2828
  function Property({ label, layout = "row", children, className }) {
2796
2829
  if (layout === "stacked") {
@@ -2798,23 +2831,23 @@ function Property({ label, layout = "row", children, className }) {
2798
2831
  // gap-3 — the one label-above-content distance (Katerina, 2026-09-01):
2799
2832
  // Peek's topic-details sections already sit at 12px, Ship's rail was
2800
2833
  // 6px, and unifying means the bigger, calmer one.
2801
- /* @__PURE__ */ jsxs31("dl", { className: cn("flex flex-col gap-3", className), children: [
2802
- /* @__PURE__ */ jsx48("dt", { className: "text-menu uppercase tracking-widest text-text-secondary", children: label }),
2803
- /* @__PURE__ */ jsx48("dd", { className: VALUE_CLASSES, children })
2834
+ /* @__PURE__ */ jsxs32("dl", { className: cn("flex flex-col gap-3", className), children: [
2835
+ /* @__PURE__ */ jsx49("dt", { className: "text-menu uppercase tracking-widest text-text-secondary", children: label }),
2836
+ /* @__PURE__ */ jsx49("dd", { className: VALUE_CLASSES, children })
2804
2837
  ] })
2805
2838
  );
2806
2839
  }
2807
- return /* @__PURE__ */ jsxs31("dl", { className: cn("flex items-center gap-2", className), children: [
2808
- /* @__PURE__ */ jsx48("dt", { className: "w-[68px] shrink-0 text-caption text-text-secondary", children: label }),
2809
- /* @__PURE__ */ jsx48("dd", { className: VALUE_CLASSES, children })
2840
+ return /* @__PURE__ */ jsxs32("dl", { className: cn("flex items-center gap-2", className), children: [
2841
+ /* @__PURE__ */ jsx49("dt", { className: "w-[68px] shrink-0 text-caption text-text-secondary", children: label }),
2842
+ /* @__PURE__ */ jsx49("dd", { className: VALUE_CLASSES, children })
2810
2843
  ] });
2811
2844
  }
2812
2845
 
2813
2846
  // src/Reaction.tsx
2814
2847
  import { Toggle } from "@base-ui/react/toggle";
2815
- import { jsx as jsx49, jsxs as jsxs32 } from "react/jsx-runtime";
2848
+ import { jsx as jsx50, jsxs as jsxs33 } from "react/jsx-runtime";
2816
2849
  function Reaction({ emoji, count, pressed = false, className, ...props }) {
2817
- return /* @__PURE__ */ jsxs32(
2850
+ return /* @__PURE__ */ jsxs33(
2818
2851
  Toggle,
2819
2852
  {
2820
2853
  pressed,
@@ -2836,8 +2869,8 @@ function Reaction({ emoji, count, pressed = false, className, ...props }) {
2836
2869
  ),
2837
2870
  ...props,
2838
2871
  children: [
2839
- /* @__PURE__ */ jsx49("span", { "aria-hidden": "true", className: "shrink-0 text-body-1 leading-none", children: emoji }),
2840
- /* @__PURE__ */ jsx49("span", { className: "text-chip signal:font-mono signal:text-small signal:font-semibold signal:tabular-nums", children: count })
2872
+ /* @__PURE__ */ jsx50("span", { "aria-hidden": "true", className: "shrink-0 text-body-1 leading-none", children: emoji }),
2873
+ /* @__PURE__ */ jsx50("span", { className: "text-chip signal:font-mono signal:text-small signal:font-semibold signal:tabular-nums", children: count })
2841
2874
  ]
2842
2875
  }
2843
2876
  );
@@ -2846,9 +2879,9 @@ function Reaction({ emoji, count, pressed = false, className, ...props }) {
2846
2879
  // src/SearchInput.tsx
2847
2880
  import "react";
2848
2881
  import { Input as Input3 } from "@base-ui/react/input";
2849
- import { jsx as jsx50, jsxs as jsxs33 } from "react/jsx-runtime";
2882
+ import { jsx as jsx51, jsxs as jsxs34 } from "react/jsx-runtime";
2850
2883
  function SearchInput({ shortcut, className, placeholder = "Search\u2026", ...props }) {
2851
- return /* @__PURE__ */ jsxs33(
2884
+ return /* @__PURE__ */ jsxs34(
2852
2885
  "div",
2853
2886
  {
2854
2887
  className: cn(
@@ -2860,7 +2893,7 @@ function SearchInput({ shortcut, className, placeholder = "Search\u2026", ...pro
2860
2893
  className
2861
2894
  ),
2862
2895
  children: [
2863
- /* @__PURE__ */ jsx50(
2896
+ /* @__PURE__ */ jsx51(
2864
2897
  Input3,
2865
2898
  {
2866
2899
  className: "flex-1 min-w-0 bg-transparent text-input-value text-text-primary placeholder:text-text-muted outline-none",
@@ -2868,7 +2901,7 @@ function SearchInput({ shortcut, className, placeholder = "Search\u2026", ...pro
2868
2901
  ...props
2869
2902
  }
2870
2903
  ),
2871
- shortcut && /* @__PURE__ */ jsx50(Kbd, { children: shortcut })
2904
+ shortcut && /* @__PURE__ */ jsx51(Kbd, { children: shortcut })
2872
2905
  ]
2873
2906
  }
2874
2907
  );
@@ -2877,17 +2910,17 @@ function SearchInput({ shortcut, className, placeholder = "Search\u2026", ...pro
2877
2910
  // src/SectionHeader.tsx
2878
2911
  import { IconChevronRight as IconChevronRight2 } from "@tabler/icons-react";
2879
2912
  import { useRender } from "@base-ui/react/use-render";
2880
- import { Fragment as Fragment8, jsx as jsx51, jsxs as jsxs34 } from "react/jsx-runtime";
2913
+ import { Fragment as Fragment8, jsx as jsx52, jsxs as jsxs35 } from "react/jsx-runtime";
2881
2914
  function SectionHeader({ title, chevron = false, isExpanded = true, onToggle, trailing, actions, showActions = "hover", hover = "fill", render, className }) {
2882
2915
  const titleElement = useRender({
2883
- render: render ?? (chevron ? /* @__PURE__ */ jsx51("button", { type: "button", onClick: onToggle, "aria-expanded": isExpanded }) : /* @__PURE__ */ jsx51("span", {})),
2916
+ render: render ?? (chevron ? /* @__PURE__ */ jsx52("button", { type: "button", onClick: onToggle, "aria-expanded": isExpanded }) : /* @__PURE__ */ jsx52("span", {})),
2884
2917
  props: {
2885
2918
  // `text-left`: a button centres its text. `h-full` and `flex-1`: the
2886
2919
  // whole row up to the actions is the hit target, as it was when the
2887
2920
  // row itself carried the click.
2888
2921
  className: "flex h-full min-w-0 flex-1 items-center gap-1 text-left",
2889
- children: /* @__PURE__ */ jsxs34(Fragment8, { children: [
2890
- chevron && /* @__PURE__ */ jsx51(
2922
+ children: /* @__PURE__ */ jsxs35(Fragment8, { children: [
2923
+ chevron && /* @__PURE__ */ jsx52(
2891
2924
  IconChevronRight2,
2892
2925
  {
2893
2926
  size: 12,
@@ -2895,11 +2928,11 @@ function SectionHeader({ title, chevron = false, isExpanded = true, onToggle, tr
2895
2928
  className: cn("shrink-0 text-text-secondary transition-transform duration-150", isExpanded && "rotate-90")
2896
2929
  }
2897
2930
  ),
2898
- /* @__PURE__ */ jsx51(SectionLabel, { children: title })
2931
+ /* @__PURE__ */ jsx52(SectionLabel, { children: title })
2899
2932
  ] })
2900
2933
  }
2901
2934
  });
2902
- return /* @__PURE__ */ jsxs34(
2935
+ return /* @__PURE__ */ jsxs35(
2903
2936
  "div",
2904
2937
  {
2905
2938
  className: cn(
@@ -2912,15 +2945,15 @@ function SectionHeader({ title, chevron = false, isExpanded = true, onToggle, tr
2912
2945
  ),
2913
2946
  children: [
2914
2947
  titleElement,
2915
- trailing != null && /* @__PURE__ */ jsx51("div", { className: "flex shrink-0 items-center", children: trailing }),
2916
- actions && actions.length > 0 && /* @__PURE__ */ jsx51(
2948
+ trailing != null && /* @__PURE__ */ jsx52("div", { className: "flex shrink-0 items-center", children: trailing }),
2949
+ actions && actions.length > 0 && /* @__PURE__ */ jsx52(
2917
2950
  "div",
2918
2951
  {
2919
2952
  className: cn(
2920
2953
  "-mr-1 flex shrink-0 items-center gap-1",
2921
2954
  showActions === "hover" && "opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100"
2922
2955
  ),
2923
- children: actions.map((action) => /* @__PURE__ */ jsx51(IconButton, { tooltip: action.tooltip, "aria-label": action.tooltip, onClick: action.onClick, children: action.icon }, action.tooltip))
2956
+ children: actions.map((action) => /* @__PURE__ */ jsx52(IconButton, { tooltip: action.tooltip, "aria-label": action.tooltip, onClick: action.onClick, children: action.icon }, action.tooltip))
2924
2957
  }
2925
2958
  )
2926
2959
  ]
@@ -2928,20 +2961,6 @@ function SectionHeader({ title, chevron = false, isExpanded = true, onToggle, tr
2928
2961
  );
2929
2962
  }
2930
2963
 
2931
- // src/ContainerHeader.tsx
2932
- import { IconChevronDown as IconChevronDown3 } from "@tabler/icons-react";
2933
- import { jsx as jsx52, jsxs as jsxs35 } from "react/jsx-runtime";
2934
- function ContainerHeader({ title, chevron = false, actions, className }) {
2935
- const text = typeof title === "string";
2936
- return /* @__PURE__ */ jsxs35("div", { className: cn("flex h-12 shrink-0 items-center justify-between overflow-hidden border-b border-border-subtle py-2 pr-4 pl-5", className), children: [
2937
- /* @__PURE__ */ jsx52("div", { className: cn("flex items-center gap-2 overflow-hidden", text ? "shrink-0" : "min-w-0 flex-1"), children: /* @__PURE__ */ jsxs35("div", { className: cn("flex items-center gap-1", text ? "shrink-0" : "min-w-0 flex-1"), children: [
2938
- text ? /* @__PURE__ */ jsx52("span", { className: "whitespace-nowrap text-body-2-strong text-text-primary", children: title }) : /* @__PURE__ */ jsx52("div", { className: "min-w-0 flex-1", children: title }),
2939
- chevron && /* @__PURE__ */ jsx52(IconChevronDown3, { size: 12, stroke: 1.5, className: "shrink-0 text-text-secondary" })
2940
- ] }) }),
2941
- actions && /* @__PURE__ */ jsx52("div", { className: "flex shrink-0 items-center justify-end gap-3", children: /* @__PURE__ */ jsx52("div", { className: "flex shrink-0 items-center gap-1", children: actions }) })
2942
- ] });
2943
- }
2944
-
2945
2964
  // src/ListColumn.tsx
2946
2965
  import { jsx as jsx53, jsxs as jsxs36 } from "react/jsx-runtime";
2947
2966
  function Column({ title, chevron = false, actions, above, collapsed = false, children, className, broken = false }) {