@estiva-app/ui 0.24.0 → 0.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/ListColumn.d.ts +41 -0
  2. package/dist/ListColumn.d.ts.map +1 -0
  3. package/dist/Select.d.ts +1 -0
  4. package/dist/Select.d.ts.map +1 -1
  5. package/dist/Toolbar.d.ts +18 -0
  6. package/dist/Toolbar.d.ts.map +1 -1
  7. package/dist/index.d.ts +2 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +65 -38
  10. package/dist/index.js.map +4 -4
  11. package/package.json +1 -1
  12. package/registry.json +164 -4
  13. package/src/AppShell.mdx +8 -1
  14. package/src/AttachmentCard.mdx +3 -1
  15. package/src/Avatar.mdx +7 -2
  16. package/src/Banner.mdx +4 -5
  17. package/src/Breadcrumb.mdx +2 -0
  18. package/src/Button.mdx +3 -2
  19. package/src/Button.tsx +2 -2
  20. package/src/Card.mdx +5 -1
  21. package/src/Checkbox.mdx +1 -0
  22. package/src/ChipInput.mdx +1 -1
  23. package/src/CollapsibleSection.mdx +3 -3
  24. package/src/ConfirmDialog.mdx +2 -2
  25. package/src/ContainerHeader.mdx +12 -3
  26. package/src/DialogShell.mdx +1 -1
  27. package/src/Divider.mdx +3 -0
  28. package/src/EditableText.mdx +6 -1
  29. package/src/EmptyState.mdx +2 -2
  30. package/src/Field.mdx +3 -4
  31. package/src/Form.mdx +1 -1
  32. package/src/IconButton.mdx +1 -1
  33. package/src/IdentityMenu.mdx +1 -1
  34. package/src/InlineChip.mdx +3 -0
  35. package/src/Kbd.mdx +2 -2
  36. package/src/Link.mdx +3 -1
  37. package/src/ListColumn.mdx +87 -0
  38. package/src/ListColumn.stories.tsx +136 -0
  39. package/src/ListColumn.test.tsx +50 -0
  40. package/src/ListColumn.tsx +63 -0
  41. package/src/Menu.mdx +2 -0
  42. package/src/MenuItem.mdx +3 -0
  43. package/src/NavItem.mdx +4 -0
  44. package/src/Person.mdx +3 -0
  45. package/src/PersonTrigger.mdx +2 -1
  46. package/src/PersonTrigger.tsx +1 -1
  47. package/src/Popover.mdx +2 -0
  48. package/src/Rail.mdx +3 -0
  49. package/src/RailItem.mdx +4 -0
  50. package/src/RailItem.tsx +1 -1
  51. package/src/Reaction.mdx +1 -0
  52. package/src/Reaction.tsx +1 -1
  53. package/src/ScrollArea.mdx +3 -0
  54. package/src/SectionHeader.mdx +5 -1
  55. package/src/SectionHeader.tsx +1 -1
  56. package/src/SectionLabel.mdx +6 -2
  57. package/src/Select.mdx +3 -2
  58. package/src/Select.test.tsx +12 -0
  59. package/src/Select.tsx +4 -3
  60. package/src/Skeleton.mdx +5 -1
  61. package/src/Skeleton.tsx +1 -1
  62. package/src/TextInput.mdx +1 -0
  63. package/src/TextInput.tsx +1 -1
  64. package/src/Toolbar.mdx +9 -2
  65. package/src/Toolbar.stories.tsx +19 -2
  66. package/src/Toolbar.test.tsx +24 -1
  67. package/src/Toolbar.tsx +22 -0
  68. package/src/Tooltip.mdx +2 -1
  69. package/src/Tooltip.test.tsx +22 -0
  70. package/src/Tooltip.tsx +1 -1
  71. package/src/TopBar.mdx +8 -1
  72. package/src/heights.test.tsx +78 -0
  73. package/src/index.ts +2 -1
  74. package/src/registry/registry.test.ts +16 -8
@@ -0,0 +1,41 @@
1
+ import type { ReactNode } from 'react';
2
+ /**
3
+ * The list column of a page: the column beside the page's main area that lists
4
+ * what it can open — 290px wide, a line on its right, its name in a
5
+ * `ContainerHeader`, and a list under it that scrolls.
6
+ *
7
+ * Moved in from Peek as it looks (UIG-14, N9), where five pages drew it by
8
+ * hand and each carried the same numbers: the frame's 290px and its line, and
9
+ * the list's steps — 16px under the header, 12px above the bottom, rows 12px
10
+ * in from each side. The numbers live here now, once.
11
+ *
12
+ * It scrolls its rows itself. A list column that did not was the first of the
13
+ * eight mistakes on the page that led to UIG-15: the frame's card clips, so a
14
+ * list that grew past the fold was simply cut off, with nothing to scroll.
15
+ *
16
+ * `collapsed` closes it with the rail, as Peek's did: it narrows to nothing
17
+ * and fades, in 300ms. What opens and closes the rail stays the app's.
18
+ */
19
+ export interface ListColumnProps {
20
+ /** The column's name, in its header. A node for a title that is more than words. */
21
+ title: ReactNode;
22
+ /** A chevron after the title, as `ContainerHeader` draws it. */
23
+ chevron?: boolean;
24
+ /** The column's own actions, at the header's right — a `Toolbar` of `ToolbarButton`s, or one `IconButton`. */
25
+ actions?: ReactNode;
26
+ /** A row between the header and the list that stays put while the list scrolls — a field that adds to the list. */
27
+ above?: ReactNode;
28
+ /**
29
+ * The room between rows. `rows` (2px) for a list of one kind of row;
30
+ * `sections` (4px) for groups with labels and dividers of their own.
31
+ */
32
+ spacing?: 'rows' | 'sections';
33
+ /** Closes the column with the rail: it narrows to nothing and fades. */
34
+ collapsed?: boolean;
35
+ /** The rows. */
36
+ children: ReactNode;
37
+ /** Placement only. */
38
+ className?: string;
39
+ }
40
+ export declare function ListColumn({ title, chevron, actions, above, spacing, collapsed, children, className }: ListColumnProps): import("react").JSX.Element;
41
+ //# sourceMappingURL=ListColumn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ListColumn.d.ts","sourceRoot":"","sources":["../src/ListColumn.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAKtC;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,eAAe;IAC9B,oFAAoF;IACpF,KAAK,EAAE,SAAS,CAAA;IAChB,gEAAgE;IAChE,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,8GAA8G;IAC9G,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,mHAAmH;IACnH,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU,CAAA;IAC7B,wEAAwE;IACxE,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,gBAAgB;IAChB,QAAQ,EAAE,SAAS,CAAA;IACnB,sBAAsB;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,OAAe,EAAE,OAAO,EAAE,KAAK,EAAE,OAAgB,EAAE,SAAiB,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,eAAe,+BAkB/I"}
package/dist/Select.d.ts CHANGED
@@ -48,6 +48,7 @@ export interface SelectProps {
48
48
  * looks disabled and will not open, but Tab still reaches it, and the reason
49
49
  * shows as its tooltip — a native disabled button cannot be focused, so it
50
50
  * could never say why. Takes the place of wrapping it in `WithTooltip`.
51
+ * Given with `disabled`, the reason wins, as on `Button`.
51
52
  */
52
53
  disabledReason?: string;
53
54
  className?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"Select.d.ts","sourceRoot":"","sources":["../src/Select.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAMtC;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,yDAAyD;IACzD,OAAO,CAAC,EAAE,SAAS,CAAA;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,0EAA0E;IAC1E,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAA;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAOD,wBAAgB,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAgB,EAAE,SAAS,EAAE,WAAuB,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,WAAW,+BAuInK"}
1
+ {"version":3,"file":"Select.d.ts","sourceRoot":"","sources":["../src/Select.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAMtC;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,yDAAyD;IACzD,OAAO,CAAC,EAAE,SAAS,CAAA;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,0EAA0E;IAC1E,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAA;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAOD,wBAAgB,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAgB,EAAE,SAAS,EAAE,WAAuB,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,WAAW,+BAuInK"}
package/dist/Toolbar.d.ts CHANGED
@@ -76,6 +76,24 @@ export interface ToolbarButtonProps extends IconButtonProps {
76
76
  /** An `IconButton` that is an item of a `Toolbar`: the arrow keys reach it, and
77
77
  * a disabled one stays in the walk so its reason can still be read. */
78
78
  export declare function ToolbarButton({ ref, disabled, disabledReason, ...props }: ToolbarButtonProps): import("react").JSX.Element;
79
+ /**
80
+ * A link in the strip: the strip's own look, and it goes somewhere. It has a
81
+ * real address, so a Ctrl+click or a middle click opens a new tab, which a
82
+ * button that navigates cannot do.
83
+ *
84
+ * It is `IconButton`'s `href` joined to the toolbar's walk: Base UI's
85
+ * `Toolbar.Link`. A `ToolbarButton` cannot be a link — Base UI expects a real
86
+ * button there and warns when it gets an anchor (UIG-14, finding F3).
87
+ *
88
+ * A link is never disabled: a place you cannot go is left out of the strip.
89
+ */
90
+ export interface ToolbarLinkProps extends Omit<IconButtonProps, 'href' | 'disabled' | 'disabledReason' | 'pressed' | 'type' | 'ref'> {
91
+ href: string;
92
+ ref?: Ref<HTMLAnchorElement>;
93
+ }
94
+ /** An `IconButton` that is a link, and an item of a `Toolbar`: the arrow keys
95
+ * reach it like the buttons beside it. */
96
+ export declare function ToolbarLink({ ref, href, ...props }: ToolbarLinkProps): import("react").JSX.Element;
79
97
  /**
80
98
  * A text field inside the strip — the link editor in a selection toolbar.
81
99
  *
@@ -1 +1 @@
1
- {"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../src/Toolbar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAG3C,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,cAAc,CAAA;AAE/D,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,YAAY,EAAE,MAAM,CAAA;IACpB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAA;IACvC,2EAA2E;IAC3E,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,SAAS,CAAA;IACnB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,OAAO,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,WAA0B,EAAE,SAAgB,EAAE,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,YAAY,+BAwBnJ;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IACzD,GAAG,CAAC,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAA;CAC7B;AAED;wEACwE;AACxE,wBAAgB,aAAa,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,KAAK,EAAE,EAAE,kBAAkB,+BAqB5F;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAA;AAE9C;iCACiC;AACjC,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,+BAIjE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,+BASrE"}
1
+ {"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../src/Toolbar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAG3C,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,cAAc,CAAA;AAE/D,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,YAAY,EAAE,MAAM,CAAA;IACpB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAA;IACvC,2EAA2E;IAC3E,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,EAAE,SAAS,CAAA;IACnB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,OAAO,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,WAA0B,EAAE,SAAgB,EAAE,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,YAAY,+BAwBnJ;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,kBAAmB,SAAQ,eAAe;IACzD,GAAG,CAAC,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAA;CAC7B;AAED;wEACwE;AACxE,wBAAgB,aAAa,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,KAAK,EAAE,EAAE,kBAAkB,+BAqB5F;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,eAAe,EAAE,MAAM,GAAG,UAAU,GAAG,gBAAgB,GAAG,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC;IAClI,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,CAAC,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAA;CAC7B;AAED;2CAC2C;AAC3C,wBAAgB,WAAW,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,gBAAgB,+BAEpE;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,iBAAiB,GAAG,cAAc,CAAA;AAE9C;iCACiC;AACjC,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,GAAG,KAAK,EAAE,EAAE,iBAAiB,+BAIjE;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,SAAS,EAAE,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,+BASrE"}
package/dist/index.d.ts CHANGED
@@ -45,7 +45,7 @@ export { NavItem, type NavItemProps } from './NavItem';
45
45
  export { Popover, type PopoverProps } from './Popover';
46
46
  export { ScrollArea, type ScrollAreaProps } from './ScrollArea';
47
47
  export { ReactionPicker, type ReactionOption, type ReactionPickerProps } from './ReactionPicker';
48
- export { Toolbar, ToolbarButton, ToolbarInput, ToolbarSeparator, type ToolbarProps, type ToolbarButtonProps, type ToolbarInputProps } from './Toolbar';
48
+ export { Toolbar, ToolbarButton, ToolbarInput, ToolbarLink, ToolbarSeparator, type ToolbarProps, type ToolbarButtonProps, type ToolbarInputProps, type ToolbarLinkProps } from './Toolbar';
49
49
  export { PreviewCard, type PreviewCardProps } from './PreviewCard';
50
50
  export { Person, type PersonProps } from './Person';
51
51
  export { Rail, type RailProps } from './Rail';
@@ -58,6 +58,7 @@ export { Reaction, type ReactionProps } from './Reaction';
58
58
  export { SearchInput, type SearchInputProps } from './SearchInput';
59
59
  export { SectionHeader, type SectionAction, type SectionHeaderProps } from './SectionHeader';
60
60
  export { ContainerHeader, type ContainerHeaderProps } from './ContainerHeader';
61
+ export { ListColumn, type ListColumnProps } from './ListColumn';
61
62
  export { CollapsibleSection, type CollapsibleSectionProps } from './CollapsibleSection';
62
63
  export { SectionLabel } from './SectionLabel';
63
64
  export { Tabs, type TabDef, type TabsProps } from './Tabs';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -324,7 +324,7 @@ function TooltipSurface({ label, shortcut, placement }) {
324
324
  function WithTooltip({ label, shortcut, placement = "top", wrapperClassName, inline = false, children }) {
325
325
  const Wrapper = inline ? "span" : "div";
326
326
  return /* @__PURE__ */ jsxs4(BaseTooltip.Root, { disableHoverablePopup: true, children: [
327
- /* @__PURE__ */ jsx7(BaseTooltip.Trigger, { delay: OPEN_DELAY, render: /* @__PURE__ */ jsx7(Wrapper, { className: cn("inline-flex shrink-0", wrapperClassName) }), children }),
327
+ /* @__PURE__ */ jsx7(BaseTooltip.Trigger, { delay: OPEN_DELAY, render: /* @__PURE__ */ jsx7(Wrapper, { className: cn("inline-flex shrink-0", inline && "align-top", wrapperClassName) }), children }),
328
328
  /* @__PURE__ */ jsx7(TooltipSurface, { label, shortcut, placement })
329
329
  ] });
330
330
  }
@@ -723,8 +723,8 @@ function Button({
723
723
  // this package's own story frames, each of which asks for the top.
724
724
  // A control does not get to decide where its caller puts it.
725
725
  "inline-flex items-center justify-center gap-1 rounded-md transition-colors font-sans font-medium",
726
- size === "default" && "h-8 text-btn-default",
727
- size === "small" && "h-6 text-btn-small",
726
+ size === "default" && "h-8 min-h-8 text-btn-default",
727
+ size === "small" && "h-6 min-h-6 text-btn-small",
728
728
  // Extra right padding beside a leading icon, for optical balance.
729
729
  size === "default" && (hasLeadingIcon ? "pl-2 pr-3" : "px-2"),
730
730
  size === "small" && (hasLeadingIcon ? "pl-1.5 pr-2" : "px-1.5"),
@@ -1432,7 +1432,7 @@ function SkeletonBar({ className, style }) {
1432
1432
  }
1433
1433
  var ROW_BAR_WIDTHS = [150, 100, 170, 120, 90, 140, 110, 160];
1434
1434
  function SkeletonRow({ barWidth = 130 }) {
1435
- return /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-2 px-2 h-[32px] rounded-lg", children: [
1435
+ return /* @__PURE__ */ jsxs16("div", { className: "flex shrink-0 items-center gap-2 px-2 h-[32px] rounded-lg", children: [
1436
1436
  /* @__PURE__ */ jsx23(SkeletonBar, { className: "w-4 h-4 shrink-0" }),
1437
1437
  /* @__PURE__ */ jsx23(SkeletonBar, { className: "h-3.5", style: { width: barWidth } })
1438
1438
  ] });
@@ -1818,7 +1818,7 @@ function PersonTrigger({ name, picture, fallback, size, open = false, compact =
1818
1818
  "aria-haspopup": "menu",
1819
1819
  "aria-expanded": open,
1820
1820
  className: cn(
1821
- "flex h-8 cursor-pointer items-center gap-1.5 rounded-md pl-1.5 pr-1.5 text-body-2 text-text-primary transition-colors hover:bg-bg-hover",
1821
+ "flex h-8 min-h-8 cursor-pointer items-center gap-1.5 rounded-md pl-1.5 pr-1.5 text-body-2 text-text-primary transition-colors hover:bg-bg-hover",
1822
1822
  open && "bg-bg-hover",
1823
1823
  // Under a `Menu` the open state is Base UI's, not a prop: the trigger
1824
1824
  // carries `data-popup-open` while its menu is up, and sets its own
@@ -1956,7 +1956,7 @@ var GAP4 = 4;
1956
1956
  var VIEWPORT_PAD4 = 8;
1957
1957
  function Select({ value, onChange, options, size = "default", ariaLabel, placeholder = "Select\u2026", disabled, disabledReason, className, ...aria }) {
1958
1958
  const selected = options.find((o) => o.value === value);
1959
- const held = Boolean(disabledReason) && !disabled;
1959
+ const held = Boolean(disabledReason);
1960
1960
  const trigger = /* @__PURE__ */ jsxs22(
1961
1961
  BaseSelect.Trigger,
1962
1962
  {
@@ -1983,7 +1983,7 @@ function Select({ value, onChange, options, size = "default", ariaLabel, placeho
1983
1983
  "focus-visible:border-border-focus aria-expanded:border-border-focus",
1984
1984
  "signal:transition-shadow signal:focus-visible:shadow-focus-ring",
1985
1985
  size === "default" && "px-3 py-2 text-input-value",
1986
- size === "small" && "h-6 px-2 text-caption",
1986
+ size === "small" && "h-6 min-h-6 px-2 text-caption",
1987
1987
  className
1988
1988
  ),
1989
1989
  children: [
@@ -2009,7 +2009,7 @@ function Select({ value, onChange, options, size = "default", ariaLabel, placeho
2009
2009
  },
2010
2010
  ...held ? { open: false, onOpenChange: () => {
2011
2011
  } } : {},
2012
- disabled,
2012
+ disabled: disabled && !held,
2013
2013
  modal: false,
2014
2014
  children: [
2015
2015
  held ? /* @__PURE__ */ jsx30(TooltipTrigger, { label: disabledReason ?? "", children: trigger }) : trigger,
@@ -2073,7 +2073,7 @@ var TextInput = forwardRef2(function TextInput2({ className, type = "text", size
2073
2073
  "bg-bg-inset border border-border-default hover:border-border-strong focus:border-border-focus rounded-lg",
2074
2074
  // The small size is the small Select's trigger, class for class.
2075
2075
  size === "default" && "px-3 py-2 text-input-value",
2076
- size === "small" && "h-6 px-2 text-caption",
2076
+ size === "small" && "h-6 min-h-6 px-2 text-caption",
2077
2077
  "text-text-primary placeholder:text-text-muted",
2078
2078
  "outline-none transition-colors",
2079
2079
  "disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled",
@@ -2493,6 +2493,9 @@ function ToolbarButton({ ref, disabled, disabledReason, ...props }) {
2493
2493
  }
2494
2494
  );
2495
2495
  }
2496
+ function ToolbarLink({ ref, href, ...props }) {
2497
+ return /* @__PURE__ */ jsx40(BaseToolbar.Link, { ref, render: /* @__PURE__ */ jsx40(IconButton, { href, ...props }) });
2498
+ }
2496
2499
  function ToolbarInput({ size, ...props }) {
2497
2500
  return /* @__PURE__ */ jsx40(BaseToolbar.Input, { render: /* @__PURE__ */ jsx40(TextInput, { size }), ...props });
2498
2501
  }
@@ -2586,7 +2589,7 @@ function RailItem({ href, icon, label, active = false, className, ...props }) {
2586
2589
  {
2587
2590
  href,
2588
2591
  "aria-current": active ? "page" : void 0,
2589
- className: cn("group flex w-full shrink-0 flex-col items-center gap-0.5 px-2 py-0.5", className),
2592
+ className: cn("group flex h-12 w-full shrink-0 flex-col items-center gap-0.5 px-2 py-0.5", className),
2590
2593
  ...props,
2591
2594
  children: [
2592
2595
  /* @__PURE__ */ jsx44(
@@ -2659,7 +2662,7 @@ function Reaction({ emoji, count, pressed = false, className, ...props }) {
2659
2662
  className: cn(
2660
2663
  // Chip's pill at a control's height, so a reaction and a status chip
2661
2664
  // read as the same family — 24px matches Button `small`.
2662
- "inline-flex h-6 items-center justify-center gap-1.5 rounded-full px-2",
2665
+ "inline-flex h-6 min-h-6 items-center justify-center gap-1.5 rounded-full px-2",
2663
2666
  "border transition-colors",
2664
2667
  "disabled:cursor-not-allowed disabled:opacity-50",
2665
2668
  pressed ? (
@@ -2741,7 +2744,7 @@ function SectionHeader({ title, chevron = false, isExpanded = true, onToggle, tr
2741
2744
  "div",
2742
2745
  {
2743
2746
  className: cn(
2744
- "group flex h-[32px] items-center gap-1 rounded-lg px-2 transition-colors",
2747
+ "group flex h-[32px] shrink-0 items-center gap-1 rounded-lg px-2 transition-colors",
2745
2748
  // The fill says "this does something": a row with a toggle or actions
2746
2749
  // lights up, a fixed heading over rows does not (2026-09-09, the
2747
2750
  // Sidebar's fixed group).
@@ -2780,10 +2783,32 @@ function ContainerHeader({ title, chevron = false, actions, className }) {
2780
2783
  ] });
2781
2784
  }
2782
2785
 
2786
+ // src/ListColumn.tsx
2787
+ import { jsx as jsx51, jsxs as jsxs35 } from "react/jsx-runtime";
2788
+ function ListColumn({ title, chevron = false, actions, above, spacing = "rows", collapsed = false, children, className }) {
2789
+ return /* @__PURE__ */ jsxs35(
2790
+ "div",
2791
+ {
2792
+ className: cn(
2793
+ // `shrink-0`: the column keeps its 290px beside a main area that grows.
2794
+ "flex shrink-0 flex-col overflow-hidden border-r border-border-subtle transition-[width,opacity] duration-300 ease-in-out",
2795
+ collapsed ? "w-0 border-r-0 opacity-0" : "w-[290px] opacity-100",
2796
+ className
2797
+ ),
2798
+ "data-collapsed": collapsed || void 0,
2799
+ children: [
2800
+ /* @__PURE__ */ jsx51(ContainerHeader, { title, chevron, actions }),
2801
+ above,
2802
+ /* @__PURE__ */ jsx51(ScrollArea, { className: "flex-1", contentClassName: cn("flex flex-col px-3 pt-4 pb-3", spacing === "rows" ? "gap-0.5" : "gap-1"), children })
2803
+ ]
2804
+ }
2805
+ );
2806
+ }
2807
+
2783
2808
  // src/CollapsibleSection.tsx
2784
2809
  import { useState as useState7 } from "react";
2785
2810
  import { Collapsible } from "@base-ui/react/collapsible";
2786
- import { jsx as jsx51, jsxs as jsxs35 } from "react/jsx-runtime";
2811
+ import { jsx as jsx52, jsxs as jsxs36 } from "react/jsx-runtime";
2787
2812
  var OPEN = "open";
2788
2813
  var CLOSED = "closed";
2789
2814
  function readStored(key) {
@@ -2810,14 +2835,14 @@ function CollapsibleSection({ title, defaultOpen = true, open: openProp, onOpenC
2810
2835
  writeStored(storageKey, next);
2811
2836
  onOpenChange?.(next);
2812
2837
  };
2813
- return /* @__PURE__ */ jsxs35(Collapsible.Root, { open, onOpenChange: setOpen, className: cn("flex flex-col", className), children: [
2814
- /* @__PURE__ */ jsx51(SectionHeader, { title, chevron: true, isExpanded: open, trailing, actions, showActions, className: "shrink-0", render: /* @__PURE__ */ jsx51(Collapsible.Trigger, {}) }),
2815
- /* @__PURE__ */ jsx51(
2838
+ return /* @__PURE__ */ jsxs36(Collapsible.Root, { open, onOpenChange: setOpen, className: cn("flex flex-col", className), children: [
2839
+ /* @__PURE__ */ jsx52(SectionHeader, { title, chevron: true, isExpanded: open, trailing, actions, showActions, className: "shrink-0", render: /* @__PURE__ */ jsx52(Collapsible.Trigger, {}) }),
2840
+ /* @__PURE__ */ jsx52(
2816
2841
  Collapsible.Panel,
2817
2842
  {
2818
2843
  hiddenUntilFound: true,
2819
2844
  className: "h-[var(--collapsible-panel-height)] overflow-hidden transition-[height] duration-150 ease-out motion-reduce:transition-none data-[starting-style]:h-0 data-[ending-style]:h-0",
2820
- children: /* @__PURE__ */ jsx51("div", { className: cn("flex flex-col", contentClassName), children })
2845
+ children: /* @__PURE__ */ jsx52("div", { className: cn("flex flex-col", contentClassName), children })
2821
2846
  }
2822
2847
  )
2823
2848
  ] });
@@ -2825,9 +2850,9 @@ function CollapsibleSection({ title, defaultOpen = true, open: openProp, onOpenC
2825
2850
 
2826
2851
  // src/Tabs.tsx
2827
2852
  import { Tabs as BaseTabs } from "@base-ui/react/tabs";
2828
- import { jsx as jsx52, jsxs as jsxs36 } from "react/jsx-runtime";
2853
+ import { jsx as jsx53, jsxs as jsxs37 } from "react/jsx-runtime";
2829
2854
  function Tabs({ tabs, active, onChange, size = "default", className, ...aria }) {
2830
- return /* @__PURE__ */ jsx52(
2855
+ return /* @__PURE__ */ jsx53(
2831
2856
  BaseTabs.Root,
2832
2857
  {
2833
2858
  value: active,
@@ -2835,14 +2860,14 @@ function Tabs({ tabs, active, onChange, size = "default", className, ...aria })
2835
2860
  if (details.reason === "none") onChange(value);
2836
2861
  },
2837
2862
  className,
2838
- children: /* @__PURE__ */ jsx52(
2863
+ children: /* @__PURE__ */ jsx53(
2839
2864
  BaseTabs.List,
2840
2865
  {
2841
2866
  activateOnFocus: true,
2842
2867
  "aria-label": aria["aria-label"],
2843
2868
  "aria-labelledby": aria["aria-labelledby"],
2844
2869
  className: "flex items-center gap-2",
2845
- children: tabs.map((tab) => /* @__PURE__ */ jsxs36(
2870
+ children: tabs.map((tab) => /* @__PURE__ */ jsxs37(
2846
2871
  BaseTabs.Tab,
2847
2872
  {
2848
2873
  value: tab.id,
@@ -2855,9 +2880,9 @@ function Tabs({ tabs, active, onChange, size = "default", className, ...aria })
2855
2880
  ),
2856
2881
  children: [
2857
2882
  tab.icon,
2858
- /* @__PURE__ */ jsxs36("span", { className: "flex items-baseline", children: [
2883
+ /* @__PURE__ */ jsxs37("span", { className: "flex items-baseline", children: [
2859
2884
  tab.label,
2860
- tab.count !== void 0 ? /* @__PURE__ */ jsx52("span", { className: "ml-2.5 font-mono text-caption tabular-nums text-text-secondary", children: tab.count }) : null
2885
+ tab.count !== void 0 ? /* @__PURE__ */ jsx53("span", { className: "ml-2.5 font-mono text-caption tabular-nums text-text-secondary", children: tab.count }) : null
2861
2886
  ] })
2862
2887
  ]
2863
2888
  },
@@ -2873,7 +2898,7 @@ function Tabs({ tabs, active, onChange, size = "default", className, ...aria })
2873
2898
  import { createContext as createContext5, useContext as useContext5, useMemo as useMemo4 } from "react";
2874
2899
  import { Toast as BaseToast } from "@base-ui/react/toast";
2875
2900
  import { IconAlertCircle as IconAlertCircle2, IconCircleCheck, IconCircleX } from "@tabler/icons-react";
2876
- import { jsx as jsx53, jsxs as jsxs37 } from "react/jsx-runtime";
2901
+ import { jsx as jsx54, jsxs as jsxs38 } from "react/jsx-runtime";
2877
2902
  var SURFACE_STYLES = {
2878
2903
  success: "bg-success-muted signal:bg-bg-inset signal:border signal:border-border-default signal:shadow-md",
2879
2904
  brand: "bg-accent-muted signal:bg-bg-inset signal:border signal:border-border-default signal:shadow-md",
@@ -2909,16 +2934,16 @@ var pillClassName = (type, hasAction, className) => cn(
2909
2934
  );
2910
2935
  function LeadingIcon({ type }) {
2911
2936
  const Icon = ICONS[type];
2912
- return /* @__PURE__ */ jsx53(Icon, { size: 16, stroke: 1.5, className: cn("text-text-primary shrink-0", ICON_STYLES[type]) });
2937
+ return /* @__PURE__ */ jsx54(Icon, { size: 16, stroke: 1.5, className: cn("text-text-primary shrink-0", ICON_STYLES[type]) });
2913
2938
  }
2914
2939
  function Toast({ label, type = "neutral", leadingIcon = true, actionLabel, onAction, className }) {
2915
2940
  const hasAction = !!(actionLabel && onAction);
2916
- return /* @__PURE__ */ jsxs37("div", { className: pillClassName(type, hasAction, className), children: [
2917
- /* @__PURE__ */ jsxs37("div", { className: "flex items-center gap-2 shrink-0", children: [
2918
- leadingIcon && /* @__PURE__ */ jsx53(LeadingIcon, { type }),
2919
- /* @__PURE__ */ jsx53("span", { className: LABEL_CLASSES, children: label })
2941
+ return /* @__PURE__ */ jsxs38("div", { className: pillClassName(type, hasAction, className), children: [
2942
+ /* @__PURE__ */ jsxs38("div", { className: "flex items-center gap-2 shrink-0", children: [
2943
+ leadingIcon && /* @__PURE__ */ jsx54(LeadingIcon, { type }),
2944
+ /* @__PURE__ */ jsx54("span", { className: LABEL_CLASSES, children: label })
2920
2945
  ] }),
2921
- hasAction && /* @__PURE__ */ jsx53(Button, { variant: "outlined", size: "small", onClick: onAction, children: actionLabel })
2946
+ hasAction && /* @__PURE__ */ jsx54(Button, { variant: "outlined", size: "small", onClick: onAction, children: actionLabel })
2922
2947
  ] });
2923
2948
  }
2924
2949
  var ToastContext = createContext5(null);
@@ -2939,9 +2964,9 @@ function ToastProvider({ children }) {
2939
2964
  }),
2940
2965
  [manager]
2941
2966
  );
2942
- return /* @__PURE__ */ jsx53(ToastContext.Provider, { value, children: /* @__PURE__ */ jsxs37(BaseToast.Provider, { toastManager: manager, limit: VISIBLE_TOASTS, children: [
2967
+ return /* @__PURE__ */ jsx54(ToastContext.Provider, { value, children: /* @__PURE__ */ jsxs38(BaseToast.Provider, { toastManager: manager, limit: VISIBLE_TOASTS, children: [
2943
2968
  children,
2944
- /* @__PURE__ */ jsx53(BaseToast.Portal, { children: /* @__PURE__ */ jsx53(BaseToast.Viewport, { className: "fixed bottom-4 left-4 z-[100] flex flex-col-reverse items-start gap-2 pointer-events-none", children: /* @__PURE__ */ jsx53(ToastList, {}) }) })
2969
+ /* @__PURE__ */ jsx54(BaseToast.Portal, { children: /* @__PURE__ */ jsx54(BaseToast.Viewport, { className: "fixed bottom-4 left-4 z-[100] flex flex-col-reverse items-start gap-2 pointer-events-none", children: /* @__PURE__ */ jsx54(ToastList, {}) }) })
2945
2970
  ] }) });
2946
2971
  }
2947
2972
  function ToastList() {
@@ -2949,25 +2974,25 @@ function ToastList() {
2949
2974
  return toasts.map((toast) => {
2950
2975
  const type = toast.type ?? "neutral";
2951
2976
  const { leadingIcon = true, actionLabel, onAction } = toast.data ?? {};
2952
- return /* @__PURE__ */ jsxs37(
2977
+ return /* @__PURE__ */ jsxs38(
2953
2978
  BaseToast.Root,
2954
2979
  {
2955
2980
  toast,
2956
2981
  swipeDirection: ["left", "down"],
2957
2982
  className: pillClassName(type, !!actionLabel, "pointer-events-auto data-[limited]:hidden"),
2958
2983
  children: [
2959
- /* @__PURE__ */ jsxs37("div", { className: "flex items-center gap-2 shrink-0", children: [
2960
- leadingIcon && /* @__PURE__ */ jsx53(LeadingIcon, { type }),
2961
- /* @__PURE__ */ jsx53(BaseToast.Title, { render: /* @__PURE__ */ jsx53("span", {}), className: LABEL_CLASSES })
2984
+ /* @__PURE__ */ jsxs38("div", { className: "flex items-center gap-2 shrink-0", children: [
2985
+ leadingIcon && /* @__PURE__ */ jsx54(LeadingIcon, { type }),
2986
+ /* @__PURE__ */ jsx54(BaseToast.Title, { render: /* @__PURE__ */ jsx54("span", {}), className: LABEL_CLASSES })
2962
2987
  ] }),
2963
- actionLabel && /* @__PURE__ */ jsx53(
2988
+ actionLabel && /* @__PURE__ */ jsx54(
2964
2989
  BaseToast.Action,
2965
2990
  {
2966
2991
  onClick: () => {
2967
2992
  onAction?.();
2968
2993
  close(toast.id);
2969
2994
  },
2970
- render: /* @__PURE__ */ jsx53(Button, { variant: "outlined", size: "small", children: actionLabel })
2995
+ render: /* @__PURE__ */ jsx54(Button, { variant: "outlined", size: "small", children: actionLabel })
2971
2996
  }
2972
2997
  )
2973
2998
  ]
@@ -3020,6 +3045,7 @@ export {
3020
3045
  InputChip,
3021
3046
  Kbd,
3022
3047
  Link,
3048
+ ListColumn,
3023
3049
  Menu,
3024
3050
  MenuItem,
3025
3051
  MenuPanel,
@@ -3054,6 +3080,7 @@ export {
3054
3080
  Toolbar,
3055
3081
  ToolbarButton,
3056
3082
  ToolbarInput,
3083
+ ToolbarLink,
3057
3084
  ToolbarSeparator,
3058
3085
  Tooltip,
3059
3086
  TooltipProvider,