@estiva-app/ui 0.12.5 → 0.12.7

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"}
@@ -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":"Popover.d.ts","sourceRoot":"","sources":["../src/Popover.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAOlF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,YAAY,CAAA;IACtB;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,GAAG,IAAI,CAAA;IACrC;;;;;;;;;OASG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;IACnC;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAA;IACvB;kFAC8E;IAC9E,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IAC1C;kEAC8D;IAC9D,UAAU,CAAC,EAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,IAAI,CAAC;QAAC,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC,CAAA;IACzE;uDACmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,SAAS,CAAA;IACnB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAOD,wBAAgB,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAc,EAAE,IAAe,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,YAAY,+BAsEhL"}
1
+ {"version":3,"file":"Popover.d.ts","sourceRoot":"","sources":["../src/Popover.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAOlF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,YAAY,CAAA;IACtB;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,GAAG,IAAI,CAAA;IACrC;;;;;;;;;OASG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAA;IACnC;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAA;IACvB;kFAC8E;IAC9E,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IAC1C;kEAC8D;IAC9D,UAAU,CAAC,EAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,IAAI,CAAC;QAAC,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC,CAAA;IACzE;uDACmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,SAAS,CAAA;IACnB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;;;;;;;;;;;;;;;;OAmBG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAOD,wBAAgB,OAAO,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAc,EAAE,IAAe,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,YAAY,+BAwEhL"}
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,16 +573,16 @@ 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(
597
580
  BaseMenu.Popup,
598
581
  {
599
582
  "data-interactive": true,
600
- className: cn("min-w-[180px] outline-none", className),
583
+ className: cn("min-w-[180px] outline-none p-0", className),
601
584
  render: /* @__PURE__ */ jsx14(MenuPanel, {}),
602
- children: /* @__PURE__ */ jsx14(ScrollArea, { viewportClassName: "max-h-[calc(var(--available-height)_-_1rem)]", contentClassName: "flex flex-col [&>[role=separator]]:mx-0", children: /* @__PURE__ */ jsx14(MenuContext.Provider, { value: { openOnHover }, children }) })
585
+ children: /* @__PURE__ */ jsx14(ScrollArea, { viewportClassName: "max-h-[var(--available-height)]", contentClassName: "flex flex-col p-2 [&>[role=separator]]:mx-0", children: /* @__PURE__ */ jsx14(MenuContext.Provider, { value: { openOnHover }, children }) })
603
586
  }
604
587
  )
605
588
  }
@@ -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,7 +1137,7 @@ 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(
@@ -1289,14 +1223,14 @@ var Textarea = forwardRef2(function Textarea2({ className, ...props }, ref) {
1289
1223
  import { useState as useState3 } from "react";
1290
1224
 
1291
1225
  // src/DialogShell.tsx
1292
- import { useRef as useRef3 } from "react";
1226
+ import { useRef as useRef2 } from "react";
1293
1227
  import { Dialog } from "@base-ui/react/dialog";
1294
1228
  import { AlertDialog } from "@base-ui/react/alert-dialog";
1295
1229
  import { IconX as IconX3 } from "@tabler/icons-react";
1296
1230
  import { jsx as jsx24, jsxs as jsxs16 } from "react/jsx-runtime";
1297
1231
  function DialogShell({ title, onClose, headerContent, footer, children, bodyClassName, bodyMaxHeight, width = 502, alert = false }) {
1298
1232
  const Parts = alert ? AlertDialog : Dialog;
1299
- const popupRef = useRef3(null);
1233
+ const popupRef = useRef2(null);
1300
1234
  return /* @__PURE__ */ jsx24(
1301
1235
  Parts.Root,
1302
1236
  {
@@ -1372,7 +1306,7 @@ function ConfirmDialog({ title, children, confirmLabel, destructive = false, onC
1372
1306
  }
1373
1307
 
1374
1308
  // src/EditableText.tsx
1375
- import { useEffect as useEffect2, useRef as useRef4, useState as useState4 } from "react";
1309
+ import { useEffect, useRef as useRef3, useState as useState4 } from "react";
1376
1310
  import { Field as BaseField3 } from "@base-ui/react/field";
1377
1311
  import { Input as Input2 } from "@base-ui/react/input";
1378
1312
  import { jsx as jsx26 } from "react/jsx-runtime";
@@ -1380,8 +1314,8 @@ function EditableText({ value, display, displayNode, placeholder, onCommit, mult
1380
1314
  const [editing, setEditing] = useState4(false);
1381
1315
  const [draft, setDraft] = useState4(value);
1382
1316
  const [busy, setBusy] = useState4(false);
1383
- const fieldRef = useRef4(null);
1384
- useEffect2(() => {
1317
+ const fieldRef = useRef3(null);
1318
+ useEffect(() => {
1385
1319
  if (editing) {
1386
1320
  fieldRef.current?.focus();
1387
1321
  fieldRef.current?.select();
@@ -1517,11 +1451,11 @@ function SkeletonList({ rows = 8, className }) {
1517
1451
  }
1518
1452
 
1519
1453
  // src/Breadcrumb.tsx
1520
- import { Fragment as Fragment4, useCallback as useCallback2, useLayoutEffect as useLayoutEffect2, useRef as useRef5, useState as useState5 } from "react";
1454
+ import { Fragment as Fragment4, useCallback as useCallback2, useLayoutEffect, useRef as useRef4, useState as useState5 } from "react";
1521
1455
  import { jsx as jsx29, jsxs as jsxs20 } from "react/jsx-runtime";
1522
1456
  function Breadcrumb({ items, className }) {
1523
- const navRef = useRef5(null);
1524
- const labelRefs = useRef5([]);
1457
+ const navRef = useRef4(null);
1458
+ const labelRefs = useRef4([]);
1525
1459
  const [truncated, setTruncated] = useState5(/* @__PURE__ */ new Set());
1526
1460
  const measure = useCallback2(() => {
1527
1461
  const next = /* @__PURE__ */ new Set();
@@ -1530,7 +1464,7 @@ function Breadcrumb({ items, className }) {
1530
1464
  });
1531
1465
  setTruncated((prev) => prev.size === next.size && [...next].every((i) => prev.has(i)) ? prev : next);
1532
1466
  }, []);
1533
- useLayoutEffect2(() => {
1467
+ useLayoutEffect(() => {
1534
1468
  measure();
1535
1469
  const nav = navRef.current;
1536
1470
  if (!nav || typeof ResizeObserver === "undefined") return;
@@ -1597,7 +1531,7 @@ import { useMemo as useMemo2 } from "react";
1597
1531
  import { Popover as BasePopover } from "@base-ui/react/popover";
1598
1532
  import { jsx as jsx31, jsxs as jsxs22 } from "react/jsx-runtime";
1599
1533
  var GAP5 = 4;
1600
- var VIEWPORT_PAD4 = 8;
1534
+ var VIEWPORT_PAD5 = 8;
1601
1535
  function Popover({ trigger, anchor, align = "left", side = "bottom", open, onOpenChange, finalFocus, actionsRef, ariaLabel, children, className, maxHeight }) {
1602
1536
  const anchorTarget = useMemo2(() => {
1603
1537
  if (!anchor) return void 0;
@@ -1620,7 +1554,7 @@ function Popover({ trigger, anchor, align = "left", side = "bottom", open, onOpe
1620
1554
  side,
1621
1555
  align: align === "right" ? "end" : align === "center" ? "center" : "start",
1622
1556
  sideOffset: GAP5,
1623
- collisionPadding: VIEWPORT_PAD4,
1557
+ collisionPadding: VIEWPORT_PAD5,
1624
1558
  className: "z-50 data-[anchor-hidden]:hidden",
1625
1559
  children: /* @__PURE__ */ jsx31(
1626
1560
  BasePopover.Popup,
@@ -1628,13 +1562,13 @@ function Popover({ trigger, anchor, align = "left", side = "bottom", open, onOpe
1628
1562
  "aria-label": ariaLabel,
1629
1563
  initialFocus: trigger ? void 0 : false,
1630
1564
  finalFocus,
1631
- className: cn("min-w-[180px] outline-none", className),
1565
+ className: cn("min-w-[180px] outline-none p-0", className),
1632
1566
  render: /* @__PURE__ */ jsx31(MenuPanel, {}),
1633
1567
  children: /* @__PURE__ */ jsx31(
1634
1568
  ScrollArea,
1635
1569
  {
1636
- viewportClassName: maxHeight ?? "max-h-[calc(var(--available-height)_-_1rem)]",
1637
- contentClassName: "flex flex-col [&>[role=separator]]:mx-0",
1570
+ viewportClassName: maxHeight ?? "max-h-[var(--available-height)]",
1571
+ contentClassName: "flex flex-col p-2 [&>[role=separator]]:mx-0",
1638
1572
  children
1639
1573
  }
1640
1574
  )
@@ -1719,7 +1653,7 @@ function ReactionPicker({ options, onSelect, "aria-label": ariaLabel = "Reaction
1719
1653
  import { PreviewCard as BasePreviewCard } from "@base-ui/react/preview-card";
1720
1654
  import { jsx as jsx34, jsxs as jsxs23 } from "react/jsx-runtime";
1721
1655
  var GAP6 = 12;
1722
- var VIEWPORT_PAD5 = 8;
1656
+ var VIEWPORT_PAD6 = 8;
1723
1657
  var OPEN_DELAY2 = 350;
1724
1658
  var CLOSE_DELAY = 200;
1725
1659
  function PreviewCard({ content, children, side = "right", delay = OPEN_DELAY2, closeDelay = CLOSE_DELAY, className, wrapperClassName }) {
@@ -1739,7 +1673,7 @@ function PreviewCard({ content, children, side = "right", delay = OPEN_DELAY2, c
1739
1673
  side,
1740
1674
  align: "start",
1741
1675
  sideOffset: GAP6,
1742
- collisionPadding: VIEWPORT_PAD5,
1676
+ collisionPadding: VIEWPORT_PAD6,
1743
1677
  className: "z-50 data-[anchor-hidden]:hidden",
1744
1678
  children: /* @__PURE__ */ jsx34(
1745
1679
  BasePreviewCard.Popup,
@@ -2035,8 +1969,8 @@ function Tabs({ tabs, active, onChange, size = "default", className, ...aria })
2035
1969
  }
2036
1970
 
2037
1971
  // 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";
1972
+ import { createContext as createContext2, useCallback as useCallback3, useContext as useContext2, useEffect as useEffect2, useMemo as useMemo3, useState as useState7 } from "react";
1973
+ import { createPortal } from "react-dom";
2040
1974
  import { IconAlertCircle, IconCircleCheck, IconCircleX } from "@tabler/icons-react";
2041
1975
  import { jsx as jsx44, jsxs as jsxs31 } from "react/jsx-runtime";
2042
1976
  var SURFACE_STYLES = {
@@ -2116,7 +2050,7 @@ function ToastProvider({ children }) {
2116
2050
  const dismissToast = useCallback3(() => {
2117
2051
  setToast(null);
2118
2052
  }, []);
2119
- useEffect3(() => {
2053
+ useEffect2(() => {
2120
2054
  if (!toast) return;
2121
2055
  const duration = toast.durationMs ?? 5e3;
2122
2056
  if (duration <= 0) return;
@@ -2128,7 +2062,7 @@ function ToastProvider({ children }) {
2128
2062
  const value = useMemo3(() => ({ showToast, dismissToast }), [showToast, dismissToast]);
2129
2063
  return /* @__PURE__ */ jsxs31(ToastContext.Provider, { value, children: [
2130
2064
  children,
2131
- toast && createPortal2(
2065
+ toast && createPortal(
2132
2066
  /* @__PURE__ */ jsx44("div", { className: "fixed bottom-4 left-4 z-[100] pointer-events-none", children: /* @__PURE__ */ jsx44(
2133
2067
  Toast,
2134
2068
  {