@estiva-app/ui 0.12.6 → 0.12.8

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.
@@ -5,6 +5,10 @@ import { type ReactNode } from 'react';
5
5
  * Exported on its own (Katerina, 2026-09-01) under a name that promises
6
6
  * nothing about people — a chip like this may one day hold a label, a file,
7
7
  * a filter.
8
+ *
9
+ * Inside a `ChipInput` the chip is Base UI's `Combobox.Chip` wearing these
10
+ * same classes, because there it has to answer the arrow keys and Backspace
11
+ * along with the input. This component is for a chip standing alone.
8
12
  */
9
13
  export interface InputChipProps {
10
14
  label: string;
@@ -17,18 +21,28 @@ export interface InputChipProps {
17
21
  export declare function InputChip({ label, leading, onRemove, className }: InputChipProps): import("react").JSX.Element;
18
22
  /**
19
23
  * A multi-select input: chips for the chosen, a typeahead for the rest —
20
- * Peek's PersonChipInput (2026-09-01), generalised on the way in. Peek's
21
- * version knew it was picking people: it read the directory from Peek's own
22
- * data layer and drew every face itself. Here the caller hands in `options`,
23
- * and when the entries have faces or icons the two leading slots: 16px
24
- * in a chip, 32px in a suggestion row. Nothing in this file knows what is
25
- * being picked.
24
+ * Peek's PersonChipInput (2026-09-01), generalised on the way in, and on Base
25
+ * UI's `Combobox` since stage 5 of the migration (2026-09-13).
26
+ *
27
+ * **What the part brought, and what it took away from this file.** The list is
28
+ * a real listbox now: the input keeps focus and says which row is highlighted
29
+ * through `aria-activedescendant`, where before the rows were plain buttons in
30
+ * a `<div>` and nothing was announced. With it went the highlight index, the
31
+ * arrow keys, Enter, the filter loop, the blur timeout that kept a click on a
32
+ * row from closing the list under the pointer, the `createPortal`, the
33
+ * measured anchor rect, the resize and scroll listeners that re-measured it,
34
+ * and `fit.ts` — the flip-up-when-low arithmetic this package carried for one
35
+ * caller (PLAN Finding 22). Base UI's positioner does the flipping, and it
36
+ * does it against the element rather than against a rect read a frame ago.
37
+ *
38
+ * **What this file still decides**, because none of it is the part's business:
39
+ * which options are on offer (the chosen and the excluded are not), that a
40
+ * match is on the label *or* the description, that suggestions appear only
41
+ * once you type — focusing must not drop the whole directory over the surface
42
+ * below — and that Backspace on an empty query takes the last chip.
26
43
  *
27
- * Suggestions appear only once the user types focusing (or auto-focus on
28
- * dialog open) must not drop the full directory over the surface below.
29
- * Backspace on an empty query removes the last chip; Escape clears the query
30
- * when there is one and bubbles when there is not, so the surface around it
31
- * (dialog, launcher) can act.
44
+ * Escape clears the query when there is one and bubbles when there is not, so
45
+ * the surface around it (dialog, launcher) can act.
32
46
  *
33
47
  * Generic over the option type: the objects handed back through `onChange`
34
48
  * are the caller's own, extra fields and all — no re-mapping on the way out.
@@ -1 +1 @@
1
- {"version":3,"file":"ChipInput.d.ts","sourceRoot":"","sources":["../src/ChipInput.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6E,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAOjH;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,mDAAmD;IACnD,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,cAAc,+BAiChF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe;IACzE,KAAK,EAAE,CAAC,EAAE,CAAA;IACV,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,IAAI,CAAA;IAC7B,4CAA4C;IAC5C,OAAO,EAAE,CAAC,EAAE,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,qDAAqD;IACrD,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,SAAS,CAAA;IACtC,6CAA6C;IAC7C,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,SAAS,CAAA;IACrC,0EAA0E;IAC1E,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAA;CAC7C;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,EAAE,EACrE,KAAK,EACL,QAAQ,EACR,OAAO,EACP,WAAuB,EACvB,SAAS,EACT,UAAe,EACf,WAAW,EACX,UAAU,EACV,GAAG,IAAI,EACR,EAAE,cAAc,CAAC,CAAC,CAAC,+BAwJnB"}
1
+ {"version":3,"file":"ChipInput.d.ts","sourceRoot":"","sources":["../src/ChipInput.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAyC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAsB7E;;;;;;;;;;GAUG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,mDAAmD;IACnD,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,cAAc,+BAoBhF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe;IACzE,KAAK,EAAE,CAAC,EAAE,CAAA;IACV,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,IAAI,CAAA;IAC7B,4CAA4C;IAC5C,OAAO,EAAE,CAAC,EAAE,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,qDAAqD;IACrD,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,SAAS,CAAA;IACtC,6CAA6C;IAC7C,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,SAAS,CAAA;IACrC,0EAA0E;IAC1E,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAA;CAC7C;AAED,wBAAgB,SAAS,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,EAAE,EACrE,KAAK,EACL,QAAQ,EACR,OAAO,EACP,WAAuB,EACvB,SAAS,EACT,UAAe,EACf,WAAW,EACX,UAAU,EACV,GAAG,IAAI,EACR,EAAE,cAAc,CAAC,CAAC,CAAC,+BAkInB"}
package/dist/Menu.d.ts CHANGED
@@ -124,6 +124,23 @@ export interface MenuItemProps extends Omit<ComponentPropsWithRef<'button'>, 'ch
124
124
  /** The row the menu currently points at (a submenu's chosen value). */
125
125
  selected?: boolean;
126
126
  }
127
+ /**
128
+ * The row's class list, written once because `MenuSub`'s trigger row is the
129
+ * same row.
130
+ *
131
+ * `data-highlighted` joins `:hover` here, and that is the whole visible
132
+ * consequence of the port: the fill that followed the pointer now also
133
+ * follows the arrow keys, because Base UI sets one attribute for both.
134
+ */
135
+ /** The row's look, shared inside the package: `MenuItem` draws it, and
136
+ * `Select` puts it on Base UI's `Select.Item`, whose parts (`ItemText`,
137
+ * `ItemIndicator`) have to stay the element's own. One row, two parts. Not
138
+ * exported from the package's index. */
139
+ export declare function menuItemClassName({ size, selected, className }: {
140
+ size: 'default' | 'tall';
141
+ selected?: boolean;
142
+ className?: string;
143
+ }): string;
127
144
  export declare function MenuItem({ label, children, size, description, leading, trailing, hint, shortcut, submenu, destructive, selected, className, ...props }: MenuItemProps): import("react").JSX.Element;
128
145
  /**
129
146
  * The keyboard hint a picker row shows while highlighted — hand-rolled in
@@ -1 +1 @@
1
- {"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../src/Menu.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../src/Menu.tsx"],"names":[],"mappings":"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"}
@@ -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;AAItC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;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,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,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,WAAW,+BAsGnJ"}
1
+ {"version":3,"file":"Select.d.ts","sourceRoot":"","sources":["../src/Select.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAKtC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;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,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,SAAS,EAAE,GAAG,IAAI,EAAE,EAAE,WAAW,+BA2HnJ"}
package/dist/index.js CHANGED
@@ -486,27 +486,10 @@ function Chip({ type = "neutral", label, leadingIcon, trailingIcon, className })
486
486
  }
487
487
 
488
488
  // src/ChipInput.tsx
489
- import { useState as useState2, useRef, useMemo, useEffect, useLayoutEffect } from "react";
490
- import { createPortal } from "react-dom";
489
+ import { useMemo, useState as useState2 } from "react";
490
+ import { Combobox } from "@base-ui/react/combobox";
491
491
  import { IconX as IconX2 } from "@tabler/icons-react";
492
492
 
493
- // src/fit.ts
494
- var MARGIN = 8;
495
- var GAP2 = 4;
496
- function fitMenu({
497
- anchor,
498
- menu,
499
- viewport,
500
- cap = Number.POSITIVE_INFINITY
501
- }) {
502
- const left = Math.max(MARGIN, Math.min(anchor.left, viewport.width - menu.width - MARGIN));
503
- const below = viewport.height - anchor.bottom - GAP2 - MARGIN;
504
- const above = anchor.top - GAP2 - MARGIN;
505
- const openUp = below < Math.min(menu.contentHeight, cap) && above > below;
506
- const maxHeight = Math.max(Math.min(cap, openUp ? above : below), 120);
507
- return openUp ? { left, bottom: viewport.height - anchor.top + GAP2, maxHeight } : { left, top: anchor.bottom + GAP2, maxHeight };
508
- }
509
-
510
493
  // src/Menu.tsx
511
494
  import { createContext, useContext } from "react";
512
495
  import { IconChevronRight } from "@tabler/icons-react";
@@ -562,7 +545,7 @@ function MenuPanel({ children, className, ...props }) {
562
545
  );
563
546
  }
564
547
  var isProduction = () => globalThis.process?.env?.NODE_ENV === "production";
565
- var GAP3 = 4;
548
+ var GAP2 = 4;
566
549
  var VIEWPORT_PAD2 = 8;
567
550
  var HOVER_OPEN_DELAY = 0;
568
551
  var HOVER_CLOSE_DELAY = 150;
@@ -590,7 +573,7 @@ function Menu({ trigger, align = "left", openOnHover = false, open, onOpenChange
590
573
  {
591
574
  side: "bottom",
592
575
  align: align === "right" ? "end" : "start",
593
- sideOffset: GAP3,
576
+ sideOffset: GAP2,
594
577
  collisionPadding: VIEWPORT_PAD2,
595
578
  className: "z-50 data-[anchor-hidden]:hidden",
596
579
  children: /* @__PURE__ */ jsx14(
@@ -633,7 +616,7 @@ function MenuSub({ label, leading, selected, children, className }) {
633
616
  {
634
617
  side: "inline-end",
635
618
  align: "start",
636
- sideOffset: GAP3,
619
+ sideOffset: GAP2,
637
620
  collisionPadding: VIEWPORT_PAD2,
638
621
  className: "z-50 data-[anchor-hidden]:hidden",
639
622
  children: /* @__PURE__ */ jsx14(BaseMenu.Popup, { className: cn("w-[160px]", className), "data-interactive": true, render: /* @__PURE__ */ jsx14(MenuPanel, {}), children })
@@ -746,41 +729,33 @@ function MenuRow({ children, className }) {
746
729
 
747
730
  // src/ChipInput.tsx
748
731
  import { jsx as jsx15, jsxs as jsxs9 } from "react/jsx-runtime";
732
+ var CHIP_BOX = (
733
+ // Curved, not a pill (Katerina, 2026-09-01): the Avatar keeps its own
734
+ // rounded-sm corners — never a forced circle — and the chip's corner
735
+ // follows concentrically: 4px face + 2px inset = rounded-md.
736
+ "inline-flex items-center gap-1.5 bg-bg-elevated border border-border-subtle rounded-md py-0.5 max-h-[24px]"
737
+ );
738
+ var CHIP_LABEL = "text-caption font-medium text-text-primary";
739
+ var CHIP_REMOVE = "size-4 flex items-center justify-center rounded-full hover:bg-bg-hover text-text-secondary";
740
+ var chipPadding = (leading, removable) => cn(leading ? "pl-[2px]" : "pl-2", removable ? "pr-1" : "pr-2");
749
741
  function InputChip({ label, leading, onRemove, className }) {
750
- return /* @__PURE__ */ jsxs9(
751
- "div",
752
- {
753
- className: cn(
754
- // Curved, not a pill (Katerina, 2026-09-01): the Avatar keeps its own
755
- // rounded-sm corners — never a forced circle — and the chip's corner
756
- // follows concentrically: 4px face + 2px inset = rounded-md.
757
- "inline-flex items-center gap-1.5 bg-bg-elevated border border-border-subtle rounded-md py-0.5 max-h-[24px]",
758
- // The padding follows the contents (Katerina, 2026-09-01): a face
759
- // sits 2px from the edge, a bare label needs 8px of air; the ✕
760
- // brings its own box, so 4px behind it — 8px when there isn't one.
761
- leading ? "pl-[2px]" : "pl-2",
762
- onRemove ? "pr-1" : "pr-2",
763
- className
764
- ),
765
- children: [
766
- leading && /* @__PURE__ */ jsx15("span", { className: "flex shrink-0 items-center", children: leading }),
767
- /* @__PURE__ */ jsx15("span", { className: "text-caption font-medium text-text-primary", children: label }),
768
- onRemove && /* @__PURE__ */ jsx15(
769
- "button",
770
- {
771
- type: "button",
772
- onClick: (e) => {
773
- e.stopPropagation();
774
- onRemove();
775
- },
776
- className: "size-4 flex items-center justify-center rounded-full hover:bg-bg-hover text-text-secondary",
777
- "aria-label": `Remove ${label}`,
778
- children: /* @__PURE__ */ jsx15(IconX2, { size: 10, stroke: 1.5 })
779
- }
780
- )
781
- ]
782
- }
783
- );
742
+ return /* @__PURE__ */ jsxs9("div", { className: cn(CHIP_BOX, chipPadding(!!leading, !!onRemove), className), children: [
743
+ leading && /* @__PURE__ */ jsx15("span", { className: "flex shrink-0 items-center", children: leading }),
744
+ /* @__PURE__ */ jsx15("span", { className: CHIP_LABEL, children: label }),
745
+ onRemove && /* @__PURE__ */ jsx15(
746
+ "button",
747
+ {
748
+ type: "button",
749
+ onClick: (e) => {
750
+ e.stopPropagation();
751
+ onRemove();
752
+ },
753
+ className: CHIP_REMOVE,
754
+ "aria-label": `Remove ${label}`,
755
+ children: /* @__PURE__ */ jsx15(IconX2, { size: 10, stroke: 1.5 })
756
+ }
757
+ )
758
+ ] });
784
759
  }
785
760
  function ChipInput({
786
761
  value,
@@ -794,146 +769,105 @@ function ChipInput({
794
769
  ...aria
795
770
  }) {
796
771
  const [query, setQuery] = useState2("");
797
- const [highlight, setHighlight] = useState2(0);
798
- const [isFocused, setIsFocused] = useState2(false);
799
- const [anchorRect, setAnchorRect] = useState2(null);
800
- const wrapperRef = useRef(null);
801
- const inputRef = useRef(null);
802
- const matches = useMemo(() => {
803
- const selectedIds = new Set(value.map((o) => o.id));
804
- const excludedIds = new Set(excludeIds);
805
- const q = query.trim().toLowerCase();
806
- return options.filter((o) => {
807
- if (selectedIds.has(o.id)) return false;
808
- if (excludedIds.has(o.id)) return false;
809
- if (!q) return true;
810
- return o.label.toLowerCase().includes(q) || (o.description ?? "").toLowerCase().includes(q);
811
- });
812
- }, [query, value, excludeIds, options]);
813
- useEffect(() => {
814
- setHighlight(0);
815
- }, [query, matches.length]);
816
- const showDropdown = isFocused && query.trim().length > 0 && matches.length > 0;
817
- useLayoutEffect(() => {
818
- if (!showDropdown) return;
819
- const update = () => {
820
- if (wrapperRef.current) setAnchorRect(wrapperRef.current.getBoundingClientRect());
821
- };
822
- update();
823
- window.addEventListener("resize", update);
824
- window.addEventListener("scroll", update, true);
825
- return () => {
826
- window.removeEventListener("resize", update);
827
- window.removeEventListener("scroll", update, true);
828
- };
829
- }, [showDropdown, value.length]);
830
- function addOption(option) {
831
- onChange([...value, option]);
832
- setQuery("");
833
- inputRef.current?.focus();
834
- }
835
- function removeOption(id) {
836
- onChange(value.filter((o) => o.id !== id));
772
+ const [box, setBox] = useState2(null);
773
+ const available = useMemo(() => {
774
+ const chosen = new Set(value.map((o) => o.id));
775
+ const excluded = new Set(excludeIds);
776
+ return options.filter((o) => !chosen.has(o.id) && !excluded.has(o.id));
777
+ }, [options, value, excludeIds]);
778
+ const filter = useMemo(
779
+ () => (item, q) => {
780
+ const needle = q.trim().toLowerCase();
781
+ if (!needle) return true;
782
+ return item.label.toLowerCase().includes(needle) || (item.description ?? "").toLowerCase().includes(needle);
783
+ },
784
+ []
785
+ );
786
+ const open = query.trim().length > 0;
787
+ function removeLast() {
788
+ if (value.length > 0) onChange(value.slice(0, -1));
837
789
  }
838
- function handleKeyDown(e) {
839
- if (e.key === "Backspace" && query === "" && value.length > 0) {
840
- e.preventDefault();
841
- removeOption(value[value.length - 1].id);
842
- return;
843
- }
844
- if (e.key === "ArrowDown") {
845
- e.preventDefault();
846
- setHighlight((h) => Math.min(h + 1, Math.max(0, matches.length - 1)));
847
- return;
848
- }
849
- if (e.key === "ArrowUp") {
850
- e.preventDefault();
851
- setHighlight((h) => Math.max(h - 1, 0));
852
- return;
853
- }
854
- if (e.key === "Enter") {
855
- e.preventDefault();
856
- const target = matches[highlight];
857
- if (target) addOption(target);
790
+ function onInputKeyDown(event) {
791
+ if (event.key === "Backspace" && query === "" && value.length > 0) {
792
+ event.preventDefault();
793
+ event.stopPropagation();
794
+ removeLast();
858
795
  return;
859
796
  }
860
- if (e.key === "Escape") {
861
- if (query !== "") {
862
- e.preventDefault();
863
- setQuery("");
864
- }
797
+ if (event.key === "Escape" && query !== "") {
798
+ event.preventDefault();
799
+ event.stopPropagation();
800
+ setQuery("");
865
801
  }
866
802
  }
867
- return /* @__PURE__ */ jsxs9("div", { className: "relative", children: [
868
- /* @__PURE__ */ jsxs9(
869
- "div",
870
- {
871
- ref: wrapperRef,
872
- className: "bg-bg-inset border border-border-default hover:border-border-strong focus-within:border-border-focus focus-within:hover:border-border-focus rounded-lg px-3 py-1.5 flex flex-wrap items-center gap-1.5 transition-colors min-h-[38px] cursor-text signal:transition-shadow signal:focus-within:shadow-focus-ring",
873
- onClick: () => inputRef.current?.focus(),
874
- children: [
875
- value.map((o) => /* @__PURE__ */ jsx15(InputChip, { label: o.label, leading: chipLeading?.(o), onRemove: () => removeOption(o.id) }, o.id)),
803
+ return /* @__PURE__ */ jsxs9(
804
+ Combobox.Root,
805
+ {
806
+ multiple: true,
807
+ items: available,
808
+ value,
809
+ onValueChange: (next) => {
810
+ onChange(next);
811
+ setQuery("");
812
+ },
813
+ inputValue: query,
814
+ onInputValueChange: setQuery,
815
+ open,
816
+ openOnInputClick: false,
817
+ filter,
818
+ itemToStringLabel: (option) => option.label,
819
+ children: [
820
+ /* @__PURE__ */ jsxs9(Combobox.Chips, { ref: setBox, className: "bg-bg-inset border border-border-default hover:border-border-strong focus-within:border-border-focus focus-within:hover:border-border-focus rounded-lg px-3 py-1.5 flex flex-wrap items-center gap-1.5 transition-colors min-h-[38px] cursor-text signal:transition-shadow signal:focus-within:shadow-focus-ring", children: [
821
+ value.map((option) => /* @__PURE__ */ jsxs9(Combobox.Chip, { className: cn(CHIP_BOX, chipPadding(!!chipLeading, true)), children: [
822
+ chipLeading && /* @__PURE__ */ jsx15("span", { className: "flex shrink-0 items-center", children: chipLeading(option) }),
823
+ /* @__PURE__ */ jsx15("span", { className: CHIP_LABEL, children: option.label }),
824
+ /* @__PURE__ */ jsx15(Combobox.ChipRemove, { className: CHIP_REMOVE, "aria-label": `Remove ${option.label}`, children: /* @__PURE__ */ jsx15(IconX2, { size: 10, stroke: 1.5 }) })
825
+ ] }, option.id)),
876
826
  /* @__PURE__ */ jsx15(
877
- "input",
827
+ Combobox.Input,
878
828
  {
879
- ref: inputRef,
880
829
  autoFocus,
881
- type: "text",
882
- value: query,
883
- onChange: (e) => setQuery(e.target.value),
884
- onKeyDown: handleKeyDown,
885
- onFocus: () => setIsFocused(true),
886
- onBlur: () => {
887
- setTimeout(() => setIsFocused(false), 150);
888
- },
889
830
  placeholder: value.length === 0 ? placeholder : "",
890
831
  "aria-required": aria["aria-required"],
832
+ onKeyDown: onInputKeyDown,
891
833
  className: "flex-1 min-w-[120px] bg-transparent text-body-2 text-text-primary placeholder:text-text-muted outline-none border-none"
892
834
  }
893
835
  )
894
- ]
895
- }
896
- ),
897
- showDropdown && anchorRect && createPortal(
898
- /* @__PURE__ */ jsx15(
899
- "div",
900
- {
901
- className: "fixed z-[60] overflow-y-auto bg-bg-elevated border border-border-default rounded-lg shadow-lg",
902
- style: {
903
- ...fitMenu({
904
- anchor: { left: anchorRect.left, top: anchorRect.top, bottom: anchorRect.bottom },
905
- menu: { width: anchorRect.width, contentHeight: matches.length * 48 },
906
- viewport: { width: window.innerWidth, height: window.innerHeight },
907
- cap: 240
908
- }),
909
- width: anchorRect.width
910
- },
911
- children: matches.map((o, i) => /* @__PURE__ */ jsx15(
912
- MenuItem,
913
- {
914
- size: "tall",
915
- className: "h-12 rounded-none",
916
- leading: rowLeading?.(o),
917
- label: o.label,
918
- description: o.description,
919
- selected: i === highlight,
920
- onMouseEnter: () => setHighlight(i),
921
- onMouseDown: (e) => {
922
- e.preventDefault();
923
- addOption(o);
924
- }
925
- },
926
- o.id
927
- ))
928
- }
929
- ),
930
- document.body
931
- )
932
- ] });
836
+ ] }),
837
+ /* @__PURE__ */ jsx15(Combobox.Portal, { children: /* @__PURE__ */ jsx15(
838
+ Combobox.Positioner,
839
+ {
840
+ anchor: box,
841
+ sideOffset: GAP3,
842
+ collisionPadding: VIEWPORT_PAD3,
843
+ className: "z-50 data-[anchor-hidden]:hidden",
844
+ children: /* @__PURE__ */ jsx15(Combobox.Popup, { className: "w-[var(--anchor-width)] p-0", render: /* @__PURE__ */ jsx15(MenuPanel, {}), children: /* @__PURE__ */ jsx15(ScrollArea, { viewportClassName: "max-h-[240px]", contentClassName: "flex flex-col p-2", children: /* @__PURE__ */ jsx15(Combobox.List, { children: (option) => /* @__PURE__ */ jsx15(
845
+ Combobox.Item,
846
+ {
847
+ value: option,
848
+ render: /* @__PURE__ */ jsx15(
849
+ MenuItem,
850
+ {
851
+ size: "tall",
852
+ leading: rowLeading?.(option),
853
+ label: option.label,
854
+ description: option.description
855
+ }
856
+ )
857
+ },
858
+ option.id
859
+ ) }) }) })
860
+ }
861
+ ) })
862
+ ]
863
+ }
864
+ );
933
865
  }
866
+ var GAP3 = 4;
867
+ var VIEWPORT_PAD3 = 8;
934
868
 
935
869
  // src/IdentityMenu.tsx
936
- import { useCallback, useRef as useRef2 } from "react";
870
+ import { useCallback, useRef } from "react";
937
871
 
938
872
  // src/Divider.tsx
939
873
  import { jsx as jsx16, jsxs as jsxs10 } from "react/jsx-runtime";
@@ -1068,7 +1002,7 @@ function IdentityRows({ me, signedIn, relayUrl, idBase, onCopyKey, onSignOut, on
1068
1002
  ] });
1069
1003
  }
1070
1004
  function IdentityMenu({ me, signedIn, relayUrl, idBase, onCopyKey, onSignOut, compact = false, className, children }) {
1071
- const actions = useRef2(null);
1005
+ const actions = useRef(null);
1072
1006
  const close = useCallback(() => actions.current?.close(), []);
1073
1007
  return (
1074
1008
  /* The wrapper carries the caller's `className` and nothing else. It used
@@ -1146,7 +1080,7 @@ import { IconCheck as IconCheck2, IconChevronDown as IconChevronDown2 } from "@t
1146
1080
  import { Select as BaseSelect } from "@base-ui/react/select";
1147
1081
  import { jsx as jsx21, jsxs as jsxs15 } from "react/jsx-runtime";
1148
1082
  var GAP4 = 4;
1149
- var VIEWPORT_PAD3 = 8;
1083
+ var VIEWPORT_PAD4 = 8;
1150
1084
  function Select({ value, onChange, options, size = "default", ariaLabel, placeholder = "Select\u2026", disabled, className, ...aria }) {
1151
1085
  const selected = options.find((o) => o.value === value);
1152
1086
  return /* @__PURE__ */ jsxs15(
@@ -1203,22 +1137,23 @@ function Select({ value, onChange, options, size = "default", ariaLabel, placeho
1203
1137
  side: "bottom",
1204
1138
  align: "start",
1205
1139
  sideOffset: GAP4,
1206
- collisionPadding: VIEWPORT_PAD3,
1140
+ collisionPadding: VIEWPORT_PAD4,
1207
1141
  alignItemWithTrigger: false,
1208
1142
  className: "z-50 data-[anchor-hidden]:hidden",
1209
1143
  children: /* @__PURE__ */ jsx21(
1210
1144
  BaseSelect.Popup,
1211
1145
  {
1212
- className: "min-w-[var(--anchor-width)] rounded-lg border border-border-default bg-bg-elevated p-1 shadow-lg",
1213
- children: /* @__PURE__ */ jsx21(ScrollArea, { viewportClassName: "max-h-[calc(min(288px,var(--available-height))_-_0.5rem)]", contentClassName: "flex flex-col", children: options.map((option) => /* @__PURE__ */ jsxs15(
1146
+ render: /* @__PURE__ */ jsx21(MenuPanel, {}),
1147
+ className: "min-w-[var(--anchor-width)] p-0",
1148
+ children: /* @__PURE__ */ jsx21(ScrollArea, { viewportClassName: "max-h-[min(288px,var(--available-height))]", contentClassName: "flex flex-col p-2", children: options.map((option) => /* @__PURE__ */ jsxs15(
1214
1149
  BaseSelect.Item,
1215
1150
  {
1216
1151
  value: option.value,
1217
- className: "flex h-9 cursor-pointer items-center justify-between gap-2 rounded-lg px-3 text-[14px] font-normal leading-[1.4] text-text-primary transition-colors data-[highlighted]:bg-bg-hover data-[selected]:font-medium",
1152
+ className: cn(menuItemClassName({ size: "default" }), "justify-between data-[selected]:font-medium"),
1218
1153
  children: [
1219
1154
  /* @__PURE__ */ jsxs15("span", { className: "flex min-w-0 items-center gap-2", children: [
1220
1155
  option.leading && /* @__PURE__ */ jsx21("span", { className: "flex shrink-0 items-center", children: option.leading }),
1221
- /* @__PURE__ */ jsx21(BaseSelect.ItemText, { className: "truncate", children: option.label })
1156
+ /* @__PURE__ */ jsx21(BaseSelect.ItemText, { className: "truncate text-[14px] leading-[140%] text-text-primary", children: option.label })
1222
1157
  ] }),
1223
1158
  /* @__PURE__ */ jsx21(
1224
1159
  BaseSelect.ItemIndicator,
@@ -1289,14 +1224,14 @@ var Textarea = forwardRef2(function Textarea2({ className, ...props }, ref) {
1289
1224
  import { useState as useState3 } from "react";
1290
1225
 
1291
1226
  // src/DialogShell.tsx
1292
- import { useRef as useRef3 } from "react";
1227
+ import { useRef as useRef2 } from "react";
1293
1228
  import { Dialog } from "@base-ui/react/dialog";
1294
1229
  import { AlertDialog } from "@base-ui/react/alert-dialog";
1295
1230
  import { IconX as IconX3 } from "@tabler/icons-react";
1296
1231
  import { jsx as jsx24, jsxs as jsxs16 } from "react/jsx-runtime";
1297
1232
  function DialogShell({ title, onClose, headerContent, footer, children, bodyClassName, bodyMaxHeight, width = 502, alert = false }) {
1298
1233
  const Parts = alert ? AlertDialog : Dialog;
1299
- const popupRef = useRef3(null);
1234
+ const popupRef = useRef2(null);
1300
1235
  return /* @__PURE__ */ jsx24(
1301
1236
  Parts.Root,
1302
1237
  {
@@ -1372,7 +1307,7 @@ function ConfirmDialog({ title, children, confirmLabel, destructive = false, onC
1372
1307
  }
1373
1308
 
1374
1309
  // src/EditableText.tsx
1375
- import { useEffect as useEffect2, useRef as useRef4, useState as useState4 } from "react";
1310
+ import { useEffect, useRef as useRef3, useState as useState4 } from "react";
1376
1311
  import { Field as BaseField3 } from "@base-ui/react/field";
1377
1312
  import { Input as Input2 } from "@base-ui/react/input";
1378
1313
  import { jsx as jsx26 } from "react/jsx-runtime";
@@ -1380,8 +1315,8 @@ function EditableText({ value, display, displayNode, placeholder, onCommit, mult
1380
1315
  const [editing, setEditing] = useState4(false);
1381
1316
  const [draft, setDraft] = useState4(value);
1382
1317
  const [busy, setBusy] = useState4(false);
1383
- const fieldRef = useRef4(null);
1384
- useEffect2(() => {
1318
+ const fieldRef = useRef3(null);
1319
+ useEffect(() => {
1385
1320
  if (editing) {
1386
1321
  fieldRef.current?.focus();
1387
1322
  fieldRef.current?.select();
@@ -1517,11 +1452,11 @@ function SkeletonList({ rows = 8, className }) {
1517
1452
  }
1518
1453
 
1519
1454
  // src/Breadcrumb.tsx
1520
- import { Fragment as Fragment4, useCallback as useCallback2, useLayoutEffect as useLayoutEffect2, useRef as useRef5, useState as useState5 } from "react";
1455
+ import { Fragment as Fragment4, useCallback as useCallback2, useLayoutEffect, useRef as useRef4, useState as useState5 } from "react";
1521
1456
  import { jsx as jsx29, jsxs as jsxs20 } from "react/jsx-runtime";
1522
1457
  function Breadcrumb({ items, className }) {
1523
- const navRef = useRef5(null);
1524
- const labelRefs = useRef5([]);
1458
+ const navRef = useRef4(null);
1459
+ const labelRefs = useRef4([]);
1525
1460
  const [truncated, setTruncated] = useState5(/* @__PURE__ */ new Set());
1526
1461
  const measure = useCallback2(() => {
1527
1462
  const next = /* @__PURE__ */ new Set();
@@ -1530,7 +1465,7 @@ function Breadcrumb({ items, className }) {
1530
1465
  });
1531
1466
  setTruncated((prev) => prev.size === next.size && [...next].every((i) => prev.has(i)) ? prev : next);
1532
1467
  }, []);
1533
- useLayoutEffect2(() => {
1468
+ useLayoutEffect(() => {
1534
1469
  measure();
1535
1470
  const nav = navRef.current;
1536
1471
  if (!nav || typeof ResizeObserver === "undefined") return;
@@ -1597,7 +1532,7 @@ import { useMemo as useMemo2 } from "react";
1597
1532
  import { Popover as BasePopover } from "@base-ui/react/popover";
1598
1533
  import { jsx as jsx31, jsxs as jsxs22 } from "react/jsx-runtime";
1599
1534
  var GAP5 = 4;
1600
- var VIEWPORT_PAD4 = 8;
1535
+ var VIEWPORT_PAD5 = 8;
1601
1536
  function Popover({ trigger, anchor, align = "left", side = "bottom", open, onOpenChange, finalFocus, actionsRef, ariaLabel, children, className, maxHeight }) {
1602
1537
  const anchorTarget = useMemo2(() => {
1603
1538
  if (!anchor) return void 0;
@@ -1620,7 +1555,7 @@ function Popover({ trigger, anchor, align = "left", side = "bottom", open, onOpe
1620
1555
  side,
1621
1556
  align: align === "right" ? "end" : align === "center" ? "center" : "start",
1622
1557
  sideOffset: GAP5,
1623
- collisionPadding: VIEWPORT_PAD4,
1558
+ collisionPadding: VIEWPORT_PAD5,
1624
1559
  className: "z-50 data-[anchor-hidden]:hidden",
1625
1560
  children: /* @__PURE__ */ jsx31(
1626
1561
  BasePopover.Popup,
@@ -1719,7 +1654,7 @@ function ReactionPicker({ options, onSelect, "aria-label": ariaLabel = "Reaction
1719
1654
  import { PreviewCard as BasePreviewCard } from "@base-ui/react/preview-card";
1720
1655
  import { jsx as jsx34, jsxs as jsxs23 } from "react/jsx-runtime";
1721
1656
  var GAP6 = 12;
1722
- var VIEWPORT_PAD5 = 8;
1657
+ var VIEWPORT_PAD6 = 8;
1723
1658
  var OPEN_DELAY2 = 350;
1724
1659
  var CLOSE_DELAY = 200;
1725
1660
  function PreviewCard({ content, children, side = "right", delay = OPEN_DELAY2, closeDelay = CLOSE_DELAY, className, wrapperClassName }) {
@@ -1739,7 +1674,7 @@ function PreviewCard({ content, children, side = "right", delay = OPEN_DELAY2, c
1739
1674
  side,
1740
1675
  align: "start",
1741
1676
  sideOffset: GAP6,
1742
- collisionPadding: VIEWPORT_PAD5,
1677
+ collisionPadding: VIEWPORT_PAD6,
1743
1678
  className: "z-50 data-[anchor-hidden]:hidden",
1744
1679
  children: /* @__PURE__ */ jsx34(
1745
1680
  BasePreviewCard.Popup,
@@ -2035,8 +1970,8 @@ function Tabs({ tabs, active, onChange, size = "default", className, ...aria })
2035
1970
  }
2036
1971
 
2037
1972
  // src/Toast.tsx
2038
- import { createContext as createContext2, useCallback as useCallback3, useContext as useContext2, useEffect as useEffect3, useMemo as useMemo3, useState as useState7 } from "react";
2039
- import { createPortal as createPortal2 } from "react-dom";
1973
+ import { createContext as createContext2, useCallback as useCallback3, useContext as useContext2, useEffect as useEffect2, useMemo as useMemo3, useState as useState7 } from "react";
1974
+ import { createPortal } from "react-dom";
2040
1975
  import { IconAlertCircle, IconCircleCheck, IconCircleX } from "@tabler/icons-react";
2041
1976
  import { jsx as jsx44, jsxs as jsxs31 } from "react/jsx-runtime";
2042
1977
  var SURFACE_STYLES = {
@@ -2116,7 +2051,7 @@ function ToastProvider({ children }) {
2116
2051
  const dismissToast = useCallback3(() => {
2117
2052
  setToast(null);
2118
2053
  }, []);
2119
- useEffect3(() => {
2054
+ useEffect2(() => {
2120
2055
  if (!toast) return;
2121
2056
  const duration = toast.durationMs ?? 5e3;
2122
2057
  if (duration <= 0) return;
@@ -2128,7 +2063,7 @@ function ToastProvider({ children }) {
2128
2063
  const value = useMemo3(() => ({ showToast, dismissToast }), [showToast, dismissToast]);
2129
2064
  return /* @__PURE__ */ jsxs31(ToastContext.Provider, { value, children: [
2130
2065
  children,
2131
- toast && createPortal2(
2066
+ toast && createPortal(
2132
2067
  /* @__PURE__ */ jsx44("div", { className: "fixed bottom-4 left-4 z-[100] pointer-events-none", children: /* @__PURE__ */ jsx44(
2133
2068
  Toast,
2134
2069
  {