@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.
- package/dist/ChipInput.d.ts +25 -11
- package/dist/ChipInput.d.ts.map +1 -1
- package/dist/Menu.d.ts +17 -0
- package/dist/Menu.d.ts.map +1 -1
- package/dist/Select.d.ts.map +1 -1
- package/dist/index.js +139 -204
- package/dist/index.js.map +4 -4
- package/package.json +1 -1
- package/src/ChipInput.mdx +6 -0
- package/src/ChipInput.test.tsx +142 -0
- package/src/ChipInput.tsx +156 -158
- package/src/Menu.tsx +5 -1
- package/src/Select.tsx +28 -6
- package/dist/fit.d.ts +0 -33
- package/dist/fit.d.ts.map +0 -1
- package/src/fit.test.ts +0 -101
- package/src/fit.ts +0 -50
package/dist/ChipInput.d.ts
CHANGED
|
@@ -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
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
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
|
-
*
|
|
28
|
-
*
|
|
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.
|
package/dist/ChipInput.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChipInput.d.ts","sourceRoot":"","sources":["../src/ChipInput.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
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
|
package/dist/Menu.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../src/Menu.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,qBAAqB,EAAE,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AA+DhI;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,cAAe,SAAQ,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IACpF;;gBAEY;IACZ,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAED,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,+BAwB1E;AAED,MAAM,WAAW,SAAS;IACxB;;;;;;;;OAQG;IACH,OAAO,EAAE,YAAY,CAAA;IACrB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACxB;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB;gDAC4C;IAC5C,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC;;kFAE8E;IAC9E,UAAU,CAAC,EAAE,SAAS,CAAC;QAAE,KAAK,EAAE,MAAM,IAAI,CAAC;QAAC,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC,CAAA;IACzE,QAAQ,EAAE,SAAS,CAAA;IACnB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAmBD,wBAAgB,IAAI,CAAC,EAAE,OAAO,EAAE,KAAc,EAAE,WAAmB,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,SAAS,+BA0EpI;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,YAAY;IAC3B,+BAA+B;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,0BAA0B;IAC1B,QAAQ,EAAE,SAAS,CAAA;IACnB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,YAAY,+BAkDtF;AAED,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtF,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;8EAC0E;IAC1E,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB;;wCAEoC;IACpC,IAAI,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;IACzB,wFAAwF;IACxF,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,mGAAmG;IACnG,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,yFAAyF;IACzF,QAAQ,CAAC,EAAE,SAAS,CAAA;IACpB;;;;;;;;;;;;;;;OAeG;IACH,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;
|
|
1
|
+
{"version":3,"file":"Menu.d.ts","sourceRoot":"","sources":["../src/Menu.tsx"],"names":[],"mappings":"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"}
|
package/dist/Select.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
|
490
|
-
import {
|
|
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
|
|
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:
|
|
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:
|
|
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
|
-
"
|
|
752
|
-
{
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
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 [
|
|
798
|
-
const
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
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
|
|
839
|
-
if (
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
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 (
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
}
|
|
797
|
+
if (event.key === "Escape" && query !== "") {
|
|
798
|
+
event.preventDefault();
|
|
799
|
+
event.stopPropagation();
|
|
800
|
+
setQuery("");
|
|
865
801
|
}
|
|
866
802
|
}
|
|
867
|
-
return /* @__PURE__ */ jsxs9(
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
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
|
-
|
|
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
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
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
|
|
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 =
|
|
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
|
|
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:
|
|
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
|
-
|
|
1213
|
-
|
|
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:
|
|
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
|
|
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 =
|
|
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
|
|
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 =
|
|
1384
|
-
|
|
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
|
|
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 =
|
|
1524
|
-
const labelRefs =
|
|
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
|
-
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
2039
|
-
import { createPortal
|
|
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
|
-
|
|
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 &&
|
|
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
|
{
|