@stackone/malachite 2.65.0 → 2.67.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,257 +1,280 @@
1
- import { jsxs as he, Fragment as be, jsx as C } from "react/jsx-runtime";
2
- import Pe, { useContext as Ee, useState as W, useSyncExternalStore as xe, useRef as h, useCallback as ge, useEffect as j, useMemo as we } from "react";
3
- import { createPortal as Te } from "react-dom";
4
- import { ShadowRootWrapper as ye } from "../ShadowRootWrapper.js";
5
- import { PopoverEmpty as Le, PopoverSection as Me, PopoverList as Se, PopoverAction as De, PopoverHeader as _e } from "./PopoverParts.js";
6
- import { getDeepActiveElement as G } from "./activeElement.js";
7
- import { elementRef as Ae, composeRefs as Ce, chainHandler as p } from "./composeRefs.js";
8
- import { pushEscapeLayer as Ie } from "./escapeLayers.js";
9
- import { MENU_VIEWPORT_PADDING_PX as Ne } from "./floatingMenuGeometry.js";
10
- import { firstTabStopIn as Oe } from "./overlayBehaviour.js";
11
- import { usePopupLayer as ke } from "./overlayLayers.js";
12
- import { PopoverTreeContext as V } from "./popoverTree.js";
13
- import { useHoverClose as Ke } from "./useHoverClose.js";
14
- import { useLatestRef as I } from "./useLatestRef.js";
15
- import { usePopoverPosition as Re } from "./usePopoverPosition.js";
16
- import { usePopoverTree as Be } from "./usePopoverTree.js";
17
- const He = "font-sans box-border overflow-auto outline-none rounded-[var(--malachite-radius-xl,12px)] border border-solid border-[var(--malachite-card-border,rgb(232,232,232))] bg-[var(--malachite-card-background,rgb(255,255,255))] text-[var(--malachite-text-primary,rgb(10,10,10))]", $e = {
1
+ import { jsxs as ye, Fragment as Me, jsx as O } from "react/jsx-runtime";
2
+ import Ce, { useContext as Se, useState as Q, useSyncExternalStore as De, useRef as d, useCallback as Z, useEffect as $, useMemo as _e } from "react";
3
+ import { createPortal as Ae } from "react-dom";
4
+ import { ShadowRootWrapper as Ie } from "../ShadowRootWrapper.js";
5
+ import { PopoverEmpty as Ne, PopoverSection as Oe, PopoverList as ke, PopoverAction as Ke, PopoverHeader as Re } from "./PopoverParts.js";
6
+ import { getDeepActiveElement as U } from "./activeElement.js";
7
+ import { elementRef as He, composeRefs as Be, chainHandler as p } from "./composeRefs.js";
8
+ import { pushEscapeLayer as $e } from "./escapeLayers.js";
9
+ import { MENU_VIEWPORT_PADDING_PX as Ue } from "./floatingMenuGeometry.js";
10
+ import { firstTabStopIn as re } from "./overlayBehaviour.js";
11
+ import { usePopupLayer as We } from "./overlayLayers.js";
12
+ import { PopoverTreeContext as ee, PopoverShownContext as je } from "./popoverTree.js";
13
+ import { useHoverClose as Fe } from "./useHoverClose.js";
14
+ import { useLatestRef as k } from "./useLatestRef.js";
15
+ import { usePopoverPosition as Ge } from "./usePopoverPosition.js";
16
+ import { usePopoverTree as Ve } from "./usePopoverTree.js";
17
+ const Xe = "font-sans box-border overflow-auto outline-none rounded-[var(--malachite-radius-xl,12px)] border border-solid border-[var(--malachite-card-border,rgb(232,232,232))] bg-[var(--malachite-card-background,rgb(255,255,255))] text-[var(--malachite-text-primary,rgb(10,10,10))]", Ye = {
18
18
  default: "[box-shadow:0px_4px_10px_0px_var(--malachite-card-shadow,rgba(0,0,0,0.1))]",
19
19
  raised: "[box-shadow:0px_8px_24px_0px_var(--malachite-card-shadow,rgba(0,0,0,0.1))]"
20
- }, Ue = {
20
+ }, qe = {
21
21
  none: "p-0",
22
22
  small: "p-1",
23
23
  medium: "p-2"
24
- }, We = (r, c) => {
25
- for (const b of c)
26
- if (b && r.includes(b))
24
+ }, ze = (r, a) => {
25
+ for (const g of a)
26
+ if (g && r.includes(g))
27
27
  return !0;
28
28
  return !1;
29
- }, je = {
29
+ }, Je = {
30
30
  bottom: "ArrowDown",
31
31
  top: "ArrowUp",
32
32
  right: "ArrowRight",
33
33
  left: "ArrowLeft"
34
- }, Ge = (r) => r instanceof HTMLElement && (r.isContentEditable || ["INPUT", "TEXTAREA", "SELECT"].includes(r.tagName)), Y = (r) => {
34
+ }, Qe = (r) => r instanceof HTMLElement && (r.isContentEditable || ["INPUT", "TEXTAREA", "SELECT"].includes(r.tagName)), te = (r) => {
35
35
  if (!(r instanceof Node))
36
36
  return [];
37
- const c = r.getRootNode();
38
- return [r, ...c instanceof ShadowRoot ? Y(c.host) : []];
39
- }, Ve = () => () => {
40
- }, Xe = () => !0, Ye = () => !1, X = (r, c) => c ?? Oe(r) ?? r, qe = ({
37
+ const a = r.getRootNode();
38
+ return [r, ...a instanceof ShadowRoot ? te(a.host) : []];
39
+ }, Ze = () => () => {
40
+ }, er = () => !0, rr = () => !1, W = (r, a) => a ?? re(r) ?? r, K = (r) => typeof r == "function" ? r() : r == null ? void 0 : r.current, tr = (r, a) => !r || r === document.body || !r.isConnected || r === a, or = ({
41
41
  trigger: r,
42
- children: c,
43
- open: b,
44
- defaultOpen: q = !1,
45
- onOpenChange: z,
46
- placement: N = "bottom-start",
47
- openOn: f = "click",
48
- width: J = "content",
49
- padding: Q = "small",
50
- anchorRef: Z,
51
- offset: F = "small",
52
- elevation: ee = "default",
53
- initialFocusRef: d,
54
- openOnArrowKey: re = !1,
55
- role: O = "dialog",
56
- "aria-label": oe,
57
- "aria-labelledby": te,
58
- className: ne = ""
42
+ children: a,
43
+ open: g,
44
+ defaultOpen: oe = !1,
45
+ onOpenChange: ne,
46
+ placement: j = "bottom-start",
47
+ openOn: m = "click",
48
+ width: se = "content",
49
+ padding: ce = "small",
50
+ anchorRef: ue,
51
+ offset: ae = "small",
52
+ elevation: le = "default",
53
+ initialFocus: F,
54
+ initialFocusRef: v,
55
+ openOnArrowKey: ie = !1,
56
+ role: G = "dialog",
57
+ "aria-label": fe,
58
+ "aria-labelledby": de,
59
+ className: pe = ""
59
60
  }) => {
60
- const se = Ee(V), [ce, ue] = W(q), t = b ?? ce, ae = xe(Ve, Xe, Ye), P = h(null), E = h(null), le = ke("popover", t, E), [u, ie] = W(null), k = h(0), D = h(!1), w = h(!1), T = h(!1), y = I(t), K = I(b), L = I(z), n = ge(
61
+ const me = Se(ee), [ve, he] = Q(oe), c = g ?? ve, be = De(Ze, er, rr), w = d(null), b = d(null), Pe = We("popover", c, b), [t, Ee] = Q(null), V = d(0), R = d(!1), S = d(!1), D = d(!1), x = d(null), T = d(null), _ = k(c), X = k(g), A = k(ne), P = k(F), L = F !== void 0, l = Z(
61
62
  (e) => {
62
- var v;
63
- e !== y.current && (K.current === void 0 && ue(e), (v = L.current) == null || v.call(L, e));
63
+ var u;
64
+ e !== _.current && (X.current === void 0 && he(e), (u = A.current) == null || u.call(A, e));
64
65
  },
65
- [y, K, L]
66
- ), { pointerInside: x, focusInside: g, triggerFocused: R, cancelClose: m, scheduleClose: M } = Ke({
67
- isOpenRef: y,
68
- heldByChildren: k,
69
- setOpen: n
70
- }), { tree: pe, ownedSources: _ } = Be({
71
- parent: se,
72
- isOpen: t,
73
- openOn: f,
74
- isOpenRef: y,
75
- heldByChildren: k,
76
- cancelClose: m,
77
- scheduleClose: M
78
- }), o = Re({
79
- isOpen: t,
80
- panel: u,
81
- hostRef: E,
82
- triggerRef: P,
83
- anchorRef: Z,
84
- placement: N,
85
- width: J,
86
- offset: F
66
+ [_, X, A]
67
+ ), { pointerInside: y, focusInside: M, triggerFocused: Y, cancelClose: h, scheduleClose: I } = Fe({
68
+ isOpenRef: _,
69
+ heldByChildren: V,
70
+ setOpen: l
71
+ }), { tree: ge, ownedSources: H } = Ve({
72
+ parent: me,
73
+ isOpen: c,
74
+ openOn: m,
75
+ isOpenRef: _,
76
+ heldByChildren: V,
77
+ cancelClose: h,
78
+ scheduleClose: I
79
+ }), o = Ge({
80
+ isOpen: c,
81
+ panel: t,
82
+ hostRef: b,
83
+ triggerRef: w,
84
+ anchorRef: ue,
85
+ placement: j,
86
+ width: se,
87
+ offset: ae
87
88
  });
88
- j(() => {
89
- if (!t)
89
+ $(() => {
90
+ if (!c)
90
91
  return;
91
- const e = (l) => {
92
- const i = l.composedPath();
93
- We(i, [
94
- P.current,
95
- E.current,
96
- ...[..._.current].map((ve) => ve())
97
- ]) || n(!1);
92
+ const e = (n) => {
93
+ const s = n.composedPath();
94
+ ze(s, [
95
+ w.current,
96
+ b.current,
97
+ ...[...H.current].map((Le) => Le())
98
+ ]) || l(!1);
98
99
  };
99
100
  document.addEventListener("mousedown", e, !0);
100
- const v = Ie(() => n(!1));
101
+ const u = $e(() => l(!1));
101
102
  return () => {
102
- var i;
103
- document.removeEventListener("mousedown", e, !0), v(), x.current = !1;
104
- const l = G();
105
- g.current && (!l || l === document.body) && (w.current = !0, (i = P.current) == null || i.focus({ preventScroll: !0 }), w.current = !1), g.current = !1;
103
+ var s;
104
+ document.removeEventListener("mousedown", e, !0), u(), y.current = !1;
105
+ const n = U();
106
+ M.current && (!n || n === document.body) && (S.current = !0, (s = w.current) == null || s.focus({ preventScroll: !0 }), S.current = !1), M.current = !1, x.current = null, T.current = null;
106
107
  };
107
- }, [t, n, _, x, g]);
108
- const B = t && u !== null && o !== null;
109
- j(() => {
110
- const e = f === "click" || D.current;
111
- !B || !u || !e || (D.current = !1, X(u, d == null ? void 0 : d.current).focus({ preventScroll: !0 }));
112
- }, [B, u, f, d]);
113
- const A = () => {
114
- if (m(), t && u) {
115
- X(u, d == null ? void 0 : d.current).focus({ preventScroll: !0 });
108
+ }, [c, l, H, y, M]);
109
+ const C = c && t !== null && o !== null, E = Z((e) => {
110
+ x.current = e, e.focus({ preventScroll: !0 });
111
+ }, []);
112
+ $(() => {
113
+ const e = m === "click" || R.current;
114
+ if (!C || !t || !e)
115
+ return;
116
+ R.current = !1;
117
+ const u = L ? K(P.current) : v == null ? void 0 : v.current;
118
+ E(W(t, u));
119
+ }, [C, t, m, L, v, P, E]), $(() => {
120
+ if (!C || !t || !L)
121
+ return;
122
+ const e = () => {
123
+ const n = U();
124
+ if (tr(n, b.current)) {
125
+ T.current && !T.current.isConnected && E(W(t, K(P.current)));
126
+ return;
127
+ }
128
+ if (n !== x.current)
129
+ return;
130
+ const s = K(P.current) ?? (n === t ? re(t) : null);
131
+ s && s !== n && s.isConnected && E(s);
132
+ }, u = new MutationObserver(e);
133
+ return u.observe(t, { childList: !0, subtree: !0 }), () => u.disconnect();
134
+ }, [C, t, L, P, E]);
135
+ const B = () => {
136
+ if (h(), c && t) {
137
+ const e = L ? K(P.current) : v == null ? void 0 : v.current;
138
+ E(W(t, e));
116
139
  return;
117
140
  }
118
- D.current = !0, n(!0);
119
- }, S = (e) => {
120
- const v = [
121
- P.current,
122
- E.current,
123
- u,
124
- ...[..._.current].map((l) => l())
141
+ R.current = !0, l(!0);
142
+ }, N = (e) => {
143
+ const u = [
144
+ w.current,
145
+ b.current,
146
+ t,
147
+ ...[...H.current].map((n) => n())
125
148
  ];
126
- return Y(e).some(
127
- (l) => v.some((i) => i == null ? void 0 : i.contains(l))
149
+ return te(e).some(
150
+ (n) => u.some((s) => s == null ? void 0 : s.contains(n))
128
151
  );
129
- }, H = (e) => {
152
+ }, q = (e) => {
130
153
  e && queueMicrotask(() => {
131
- !S(e) && !S(G()) && n(!1);
154
+ !N(e) && !N(U()) && l(!1);
132
155
  });
133
- }, s = f === "hover" ? {
156
+ }, i = m === "hover" ? {
134
157
  onMouseEnter: () => {
135
- x.current = !0, m(), n(!0);
158
+ y.current = !0, h(), l(!0);
136
159
  },
137
160
  onMouseLeave: () => {
138
- x.current = !1, M();
161
+ y.current = !1, I();
139
162
  },
140
163
  onPanelMouseOver: () => {
141
- x.current = !0, m();
164
+ y.current = !0, h();
142
165
  }
143
- } : null, a = r.props, $ = Ae(r), fe = we(
144
- () => Ce($, P),
145
- [$]
146
- ), U = je[N.split("-")[0]], de = Pe.cloneElement(r, {
147
- ref: fe,
148
- "aria-haspopup": O,
149
- "aria-expanded": t,
166
+ } : null, f = r.props, z = He(r), we = _e(
167
+ () => Be(z, w),
168
+ [z]
169
+ ), J = Je[j.split("-")[0]], xe = Ce.cloneElement(r, {
170
+ ref: we,
171
+ "aria-haspopup": G,
172
+ "aria-expanded": c,
150
173
  onClick: p(
151
- a.onClick,
174
+ f.onClick,
152
175
  (e) => {
153
- if (f !== "hover") {
154
- n(!t);
176
+ if (m !== "hover") {
177
+ l(!c);
155
178
  return;
156
179
  }
157
180
  if (e.detail === 0) {
158
- A();
181
+ B();
159
182
  return;
160
183
  }
161
- m(), n(!0);
184
+ h(), l(!0);
162
185
  }
163
186
  ),
164
- ...s ? {
187
+ ...i ? {
165
188
  onMouseEnter: p(
166
- a.onMouseEnter,
167
- s.onMouseEnter
189
+ f.onMouseEnter,
190
+ i.onMouseEnter
168
191
  ),
169
192
  onMouseLeave: p(
170
- a.onMouseLeave,
171
- s.onMouseLeave
193
+ f.onMouseLeave,
194
+ i.onMouseLeave
172
195
  ),
173
196
  onMouseDown: p(
174
- a.onMouseDown,
197
+ f.onMouseDown,
175
198
  () => {
176
- T.current = !0, setTimeout(() => {
177
- T.current = !1;
199
+ D.current = !0, setTimeout(() => {
200
+ D.current = !1;
178
201
  });
179
202
  }
180
203
  ),
181
- onFocus: p(a.onFocus, () => {
182
- const e = T.current;
183
- T.current = !1, R.current = !e && !w.current, !w.current && (m(), n(!0));
204
+ onFocus: p(f.onFocus, () => {
205
+ const e = D.current;
206
+ D.current = !1, Y.current = !e && !S.current, !S.current && (h(), l(!0));
184
207
  }),
185
208
  onKeyDown: p(
186
- a.onKeyDown,
209
+ f.onKeyDown,
187
210
  (e) => {
188
- e.key === U && (e.preventDefault(), A());
211
+ e.key === J && (e.preventDefault(), B());
189
212
  }
190
213
  )
191
- } : re ? {
214
+ } : ie ? {
192
215
  onKeyDown: p(
193
- a.onKeyDown,
216
+ f.onKeyDown,
194
217
  (e) => {
195
- e.key !== U || Ge(e.target) || (e.preventDefault(), A());
218
+ e.key !== J || Qe(e.target) || (e.preventDefault(), B());
196
219
  }
197
220
  )
198
221
  } : {},
199
222
  onBlur: p(
200
- a.onBlur,
223
+ f.onBlur,
201
224
  (e) => {
202
- if (R.current = !1, !(!t || S(e.relatedTarget))) {
203
- if (f === "hover") {
204
- M();
225
+ if (Y.current = !1, !(!c || N(e.relatedTarget))) {
226
+ if (m === "hover") {
227
+ I();
205
228
  return;
206
229
  }
207
- H(e.relatedTarget);
230
+ q(e.relatedTarget);
208
231
  }
209
232
  }
210
233
  )
211
- }), me = {
234
+ }), Te = {
212
235
  maxHeight: o == null ? void 0 : o.maxHeight,
213
- maxWidth: `calc(100vw - ${Ne * 2}px)`,
236
+ maxWidth: `calc(100vw - ${Ue * 2}px)`,
214
237
  visibility: o ? "visible" : "hidden"
215
238
  };
216
- return /* @__PURE__ */ he(be, { children: [
217
- de,
218
- t && ae && Te(
219
- /* @__PURE__ */ C(V.Provider, { value: pe, children: /* @__PURE__ */ C(
220
- ye,
239
+ return /* @__PURE__ */ ye(Me, { children: [
240
+ xe,
241
+ c && be && Ae(
242
+ /* @__PURE__ */ O(ee.Provider, { value: ge, children: /* @__PURE__ */ O(
243
+ Ie,
221
244
  {
222
- hostRef: E,
223
- hostProps: le,
245
+ hostRef: b,
246
+ hostProps: Pe,
224
247
  hostStyle: {
225
248
  position: "fixed",
226
249
  top: (o == null ? void 0 : o.top) ?? 0,
227
250
  left: (o == null ? void 0 : o.left) ?? 0
228
251
  },
229
- children: /* @__PURE__ */ C(
252
+ children: /* @__PURE__ */ O(
230
253
  "div",
231
254
  {
232
- ref: ie,
233
- role: O,
234
- "aria-label": oe,
235
- "aria-labelledby": te,
255
+ ref: Ee,
256
+ role: G,
257
+ "aria-label": fe,
258
+ "aria-labelledby": de,
236
259
  "data-side": o == null ? void 0 : o.side,
237
260
  tabIndex: -1,
238
- className: `${He} ${$e[ee]} ${Ue[Q]} ${ne}`.trim(),
239
- style: me,
240
- onMouseOver: s == null ? void 0 : s.onPanelMouseOver,
241
- onMouseLeave: s == null ? void 0 : s.onMouseLeave,
242
- onFocus: () => {
243
- g.current = !0, m();
261
+ className: `${Xe} ${Ye[le]} ${qe[ce]} ${pe}`.trim(),
262
+ style: Te,
263
+ onMouseOver: i == null ? void 0 : i.onPanelMouseOver,
264
+ onMouseLeave: i == null ? void 0 : i.onMouseLeave,
265
+ onFocus: (e) => {
266
+ M.current = !0, e.target !== x.current && (x.current = null), e.target instanceof HTMLElement && (t != null && t.contains(e.target)) && (T.current = e.target), h();
244
267
  },
245
268
  onBlur: (e) => {
246
- if (!S(e.relatedTarget)) {
247
- if (g.current = !1, f === "hover") {
248
- M();
269
+ if (!N(e.relatedTarget)) {
270
+ if (e.relatedTarget && (T.current = null), M.current = !1, m === "hover") {
271
+ I();
249
272
  return;
250
273
  }
251
- H(e.relatedTarget);
274
+ q(e.relatedTarget);
252
275
  }
253
276
  },
254
- children: c
277
+ children: /* @__PURE__ */ O(je.Provider, { value: C, children: a })
255
278
  }
256
279
  )
257
280
  }
@@ -259,15 +282,15 @@ const He = "font-sans box-border overflow-auto outline-none rounded-[var(--malac
259
282
  document.body
260
283
  )
261
284
  ] });
262
- }, fr = Object.assign(qe, {
263
- Header: _e,
264
- Action: De,
265
- List: Se,
266
- Section: Me,
267
- Empty: Le
285
+ }, wr = Object.assign(or, {
286
+ Header: Re,
287
+ Action: Ke,
288
+ List: ke,
289
+ Section: Oe,
290
+ Empty: Ne
268
291
  });
269
292
  export {
270
- fr as Popover,
271
- fr as default
293
+ wr as Popover,
294
+ wr as default
272
295
  };
273
296
  //# sourceMappingURL=Popover.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Popover.js","sources":["../../src/components/Popover.tsx"],"sourcesContent":["import React, {\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { ShadowRootWrapper } from '../ShadowRootWrapper';\nimport {\n PopoverAction,\n PopoverEmpty,\n PopoverHeader,\n PopoverList,\n PopoverSection,\n} from './PopoverParts';\nimport { getDeepActiveElement } from './activeElement';\nimport { chainHandler, composeRefs, elementRef } from './composeRefs';\nimport { pushEscapeLayer } from './escapeLayers';\nimport {\n type FloatingOffset,\n type FloatingPlacement,\n MENU_VIEWPORT_PADDING_PX,\n} from './floatingMenuGeometry';\nimport { firstTabStopIn } from './overlayBehaviour';\nimport { usePopupLayer } from './overlayLayers';\nimport { PopoverTreeContext } from './popoverTree';\nimport { useHoverClose } from './useHoverClose';\nimport { useLatestRef } from './useLatestRef';\nimport { usePopoverPosition } from './usePopoverPosition';\nimport { usePopoverTree } from './usePopoverTree';\n\nexport type PopoverPlacement = FloatingPlacement;\n\ninterface PopoverBaseProps {\n trigger: React.ReactElement;\n children?: React.ReactNode;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n placement?: PopoverPlacement;\n openOn?: 'click' | 'hover';\n width?: 'content' | 'trigger';\n padding?: 'none' | 'small' | 'medium';\n anchorRef?: React.RefObject<HTMLElement | null>;\n offset?: FloatingOffset;\n elevation?: 'default' | 'raised';\n initialFocusRef?: React.RefObject<HTMLElement | null>;\n /** A click panel also opens, focus inside, on the arrow key its placement points at. */\n openOnArrowKey?: boolean;\n role?: 'dialog' | 'menu' | 'listbox';\n className?: string;\n}\n\ntype PopoverName =\n | { 'aria-label': string; 'aria-labelledby'?: string }\n | { 'aria-label'?: string; 'aria-labelledby': string };\n\nexport type PopoverProps = PopoverBaseProps & PopoverName;\n\nconst PANEL =\n 'font-sans box-border overflow-auto outline-none rounded-[var(--malachite-radius-xl,12px)] border border-solid border-[var(--malachite-card-border,rgb(232,232,232))] bg-[var(--malachite-card-background,rgb(255,255,255))] text-[var(--malachite-text-primary,rgb(10,10,10))]';\n\nconst ELEVATION: Record<NonNullable<PopoverBaseProps['elevation']>, string> = {\n default: '[box-shadow:0px_4px_10px_0px_var(--malachite-card-shadow,rgba(0,0,0,0.1))]',\n raised: '[box-shadow:0px_8px_24px_0px_var(--malachite-card-shadow,rgba(0,0,0,0.1))]',\n};\n\nconst PADDING: Record<NonNullable<PopoverBaseProps['padding']>, string> = {\n none: 'p-0',\n small: 'p-1',\n medium: 'p-2',\n};\n\nconst pathHits = (path: EventTarget[], nodes: Iterable<Element | null | undefined>): boolean => {\n for (const node of nodes) {\n if (node && path.includes(node)) {\n return true;\n }\n }\n return false;\n};\n\nconst KEYBOARD_OPEN_KEY: Record<string, string> = {\n bottom: 'ArrowDown',\n top: 'ArrowUp',\n right: 'ArrowRight',\n left: 'ArrowLeft',\n};\n\nconst isTextEntry = (target: EventTarget): boolean =>\n target instanceof HTMLElement &&\n (target.isContentEditable || ['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName));\n\nconst composedPathOf = (node: EventTarget | null): Node[] => {\n if (!(node instanceof Node)) {\n return [];\n }\n const root = node.getRootNode();\n return [node, ...(root instanceof ShadowRoot ? composedPathOf(root.host) : [])];\n};\n\nconst subscribeToNothing = () => () => undefined;\nconst onClient = () => true;\nconst onServer = () => false;\n\nconst focusTarget = (panel: HTMLElement, initial: HTMLElement | null | undefined): HTMLElement =>\n initial ?? firstTabStopIn(panel) ?? panel;\n\n/** An anchored, non-modal panel; nested Popovers count as inside their parent. */\nconst PopoverRoot: React.FC<PopoverProps> = ({\n trigger,\n children,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n placement = 'bottom-start',\n openOn = 'click',\n width = 'content',\n padding = 'small',\n anchorRef,\n offset = 'small',\n elevation = 'default',\n initialFocusRef,\n openOnArrowKey = false,\n role = 'dialog',\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n className = '',\n}) => {\n const parent = useContext(PopoverTreeContext);\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const isOpen = controlledOpen ?? uncontrolledOpen;\n const isClient = useSyncExternalStore(subscribeToNothing, onClient, onServer);\n\n const triggerRef = useRef<HTMLElement | null>(null);\n const hostRef = useRef<HTMLDivElement | null>(null);\n const popupIdentity = usePopupLayer('popover', isOpen, hostRef);\n const [panel, setPanel] = useState<HTMLDivElement | null>(null);\n const heldByChildren = useRef(0);\n const focusOnOpen = useRef(false);\n const returningFocus = useRef(false);\n const pointerPressedTrigger = useRef(false);\n\n const isOpenRef = useLatestRef(isOpen);\n const controlledRef = useLatestRef(controlledOpen);\n const onOpenChangeRef = useLatestRef(onOpenChange);\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (next === isOpenRef.current) {\n return;\n }\n if (controlledRef.current === undefined) {\n setUncontrolledOpen(next);\n }\n onOpenChangeRef.current?.(next);\n },\n [isOpenRef, controlledRef, onOpenChangeRef],\n );\n\n const { pointerInside, focusInside, triggerFocused, cancelClose, scheduleClose } =\n useHoverClose({\n isOpenRef,\n heldByChildren,\n setOpen,\n });\n\n const { tree, ownedSources } = usePopoverTree({\n parent,\n isOpen,\n openOn,\n isOpenRef,\n heldByChildren,\n cancelClose,\n scheduleClose,\n });\n\n const geometry = usePopoverPosition({\n isOpen,\n panel,\n hostRef,\n triggerRef,\n anchorRef,\n placement,\n width,\n offset,\n });\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n const closeOnOutsidePress = (event: MouseEvent) => {\n const path = event.composedPath();\n const inside = pathHits(path, [\n triggerRef.current,\n hostRef.current,\n ...[...ownedSources.current].map((source) => source()),\n ]);\n if (!inside) {\n setOpen(false);\n }\n };\n document.addEventListener('mousedown', closeOnOutsidePress, true);\n const popEscapeLayer = pushEscapeLayer(() => setOpen(false));\n return () => {\n document.removeEventListener('mousedown', closeOnOutsidePress, true);\n popEscapeLayer();\n pointerInside.current = false;\n const active = getDeepActiveElement();\n if (focusInside.current && (!active || active === document.body)) {\n returningFocus.current = true;\n triggerRef.current?.focus({ preventScroll: true });\n returningFocus.current = false;\n }\n focusInside.current = false;\n };\n }, [isOpen, setOpen, ownedSources, pointerInside, focusInside]);\n\n const shown = isOpen && panel !== null && geometry !== null;\n\n useEffect(() => {\n const shouldFocus = openOn === 'click' || focusOnOpen.current;\n if (!shown || !panel || !shouldFocus) {\n return;\n }\n focusOnOpen.current = false;\n focusTarget(panel, initialFocusRef?.current).focus({ preventScroll: true });\n }, [shown, panel, openOn, initialFocusRef]);\n\n const openWithFocus = () => {\n cancelClose();\n if (isOpen && panel) {\n focusTarget(panel, initialFocusRef?.current).focus({ preventScroll: true });\n return;\n }\n focusOnOpen.current = true;\n setOpen(true);\n };\n\n const isInside = (node: EventTarget | null): boolean => {\n const containers = [\n triggerRef.current,\n hostRef.current,\n panel,\n ...[...ownedSources.current].map((source) => source()),\n ];\n return composedPathOf(node).some((step) =>\n containers.some((container) => container?.contains(step)),\n );\n };\n\n const closeIfFocusLeft = (next: EventTarget | null) => {\n if (!next) {\n return;\n }\n queueMicrotask(() => {\n if (!isInside(next) && !isInside(getDeepActiveElement())) {\n setOpen(false);\n }\n });\n };\n\n const hoverHandlers =\n openOn === 'hover'\n ? {\n onMouseEnter: () => {\n pointerInside.current = true;\n cancelClose();\n setOpen(true);\n },\n onMouseLeave: () => {\n pointerInside.current = false;\n scheduleClose();\n },\n onPanelMouseOver: () => {\n pointerInside.current = true;\n cancelClose();\n },\n }\n : null;\n\n const triggerProps = trigger.props as Record<string, unknown>;\n type Handler<E extends React.SyntheticEvent> = ((event: E) => void) | undefined;\n\n const ownTriggerRef = elementRef<HTMLElement>(trigger);\n const composedTriggerRef = useMemo(\n () => composeRefs(ownTriggerRef, triggerRef),\n [ownTriggerRef],\n );\n const openKey = KEYBOARD_OPEN_KEY[placement.split('-')[0]];\n\n const clonedTrigger = React.cloneElement(trigger, {\n ref: composedTriggerRef,\n 'aria-haspopup': role,\n 'aria-expanded': isOpen,\n onClick: chainHandler(\n triggerProps.onClick as Handler<React.MouseEvent>,\n (event: React.MouseEvent) => {\n if (openOn !== 'hover') {\n setOpen(!isOpen);\n return;\n }\n const fromKeyboard = event.detail === 0;\n if (fromKeyboard) {\n openWithFocus();\n return;\n }\n cancelClose();\n setOpen(true);\n },\n ),\n ...(hoverHandlers\n ? {\n onMouseEnter: chainHandler(\n triggerProps.onMouseEnter as Handler<React.MouseEvent>,\n hoverHandlers.onMouseEnter,\n ),\n onMouseLeave: chainHandler(\n triggerProps.onMouseLeave as Handler<React.MouseEvent>,\n hoverHandlers.onMouseLeave,\n ),\n onMouseDown: chainHandler(\n triggerProps.onMouseDown as Handler<React.MouseEvent>,\n () => {\n pointerPressedTrigger.current = true;\n setTimeout(() => {\n pointerPressedTrigger.current = false;\n });\n },\n ),\n onFocus: chainHandler(triggerProps.onFocus as Handler<React.FocusEvent>, () => {\n const fromPointer = pointerPressedTrigger.current;\n pointerPressedTrigger.current = false;\n triggerFocused.current = !fromPointer && !returningFocus.current;\n if (returningFocus.current) {\n return;\n }\n cancelClose();\n setOpen(true);\n }),\n onKeyDown: chainHandler(\n triggerProps.onKeyDown as Handler<React.KeyboardEvent>,\n (event: React.KeyboardEvent) => {\n if (event.key !== openKey) {\n return;\n }\n event.preventDefault();\n openWithFocus();\n },\n ),\n }\n : openOnArrowKey\n ? {\n onKeyDown: chainHandler(\n triggerProps.onKeyDown as Handler<React.KeyboardEvent>,\n (event: React.KeyboardEvent) => {\n if (event.key !== openKey || isTextEntry(event.target)) {\n return;\n }\n event.preventDefault();\n openWithFocus();\n },\n ),\n }\n : {}),\n onBlur: chainHandler(\n triggerProps.onBlur as Handler<React.FocusEvent>,\n (event: React.FocusEvent) => {\n triggerFocused.current = false;\n if (!isOpen || isInside(event.relatedTarget)) {\n return;\n }\n if (openOn === 'hover') {\n scheduleClose();\n return;\n }\n closeIfFocusLeft(event.relatedTarget);\n },\n ),\n } as Record<string, unknown>);\n\n const panelStyle: React.CSSProperties = {\n maxHeight: geometry?.maxHeight,\n maxWidth: `calc(100vw - ${MENU_VIEWPORT_PADDING_PX * 2}px)`,\n visibility: geometry ? 'visible' : 'hidden',\n };\n\n return (\n <>\n {clonedTrigger}\n {isOpen &&\n isClient &&\n createPortal(\n <PopoverTreeContext.Provider value={tree}>\n <ShadowRootWrapper\n hostRef={hostRef}\n hostProps={popupIdentity}\n hostStyle={{\n position: 'fixed',\n top: geometry?.top ?? 0,\n left: geometry?.left ?? 0,\n }}\n >\n <div\n ref={setPanel}\n role={role}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n data-side={geometry?.side}\n tabIndex={-1}\n className={`${PANEL} ${ELEVATION[elevation]} ${PADDING[padding]} ${className}`.trim()}\n style={panelStyle}\n // React's mouseenter stops at the shadow host, so the panel listens for mouseover.\n onMouseOver={hoverHandlers?.onPanelMouseOver}\n onMouseLeave={hoverHandlers?.onMouseLeave}\n onFocus={() => {\n focusInside.current = true;\n cancelClose();\n }}\n onBlur={(event) => {\n if (isInside(event.relatedTarget)) {\n return;\n }\n focusInside.current = false;\n if (openOn === 'hover') {\n scheduleClose();\n return;\n }\n closeIfFocusLeft(event.relatedTarget);\n }}\n >\n {children}\n </div>\n </ShadowRootWrapper>\n </PopoverTreeContext.Provider>,\n document.body,\n )}\n </>\n );\n};\n\nexport const Popover = Object.assign(PopoverRoot, {\n Header: PopoverHeader,\n Action: PopoverAction,\n List: PopoverList,\n Section: PopoverSection,\n Empty: PopoverEmpty,\n});\n\nexport default Popover;\n"],"names":["PANEL","ELEVATION","PADDING","pathHits","path","nodes","node","KEYBOARD_OPEN_KEY","isTextEntry","target","composedPathOf","root","subscribeToNothing","onClient","onServer","focusTarget","panel","initial","firstTabStopIn","PopoverRoot","trigger","children","controlledOpen","defaultOpen","onOpenChange","placement","openOn","width","padding","anchorRef","offset","elevation","initialFocusRef","openOnArrowKey","role","ariaLabel","ariaLabelledBy","className","parent","useContext","PopoverTreeContext","uncontrolledOpen","setUncontrolledOpen","useState","isOpen","isClient","useSyncExternalStore","triggerRef","useRef","hostRef","popupIdentity","usePopupLayer","setPanel","heldByChildren","focusOnOpen","returningFocus","pointerPressedTrigger","isOpenRef","useLatestRef","controlledRef","onOpenChangeRef","setOpen","useCallback","next","_a","pointerInside","focusInside","triggerFocused","cancelClose","scheduleClose","useHoverClose","tree","ownedSources","usePopoverTree","geometry","usePopoverPosition","useEffect","closeOnOutsidePress","event","source","popEscapeLayer","pushEscapeLayer","active","getDeepActiveElement","shown","shouldFocus","openWithFocus","isInside","containers","step","container","closeIfFocusLeft","hoverHandlers","triggerProps","ownTriggerRef","elementRef","composedTriggerRef","useMemo","composeRefs","openKey","clonedTrigger","React","chainHandler","fromPointer","panelStyle","MENU_VIEWPORT_PADDING_PX","jsxs","Fragment","createPortal","jsx","ShadowRootWrapper","Popover","PopoverHeader","PopoverAction","PopoverList","PopoverSection","PopoverEmpty"],"mappings":";;;;;;;;;;;;;;;;AA8DA,MAAMA,KACF,kRAEEC,KAAwE;AAAA,EAC1E,SAAS;AAAA,EACT,QAAQ;AACZ,GAEMC,KAAoE;AAAA,EACtE,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AACZ,GAEMC,KAAW,CAACC,GAAqBC,MAAyD;AAC5F,aAAWC,KAAQD;AACf,QAAIC,KAAQF,EAAK,SAASE,CAAI;AAC1B,aAAO;AAGf,SAAO;AACX,GAEMC,KAA4C;AAAA,EAC9C,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,MAAM;AACV,GAEMC,KAAc,CAACC,MACjBA,aAAkB,gBACjBA,EAAO,qBAAqB,CAAC,SAAS,YAAY,QAAQ,EAAE,SAASA,EAAO,OAAO,IAElFC,IAAiB,CAACJ,MAAqC;AACzD,MAAI,EAAEA,aAAgB;AAClB,WAAO,CAAA;AAEX,QAAMK,IAAOL,EAAK,YAAA;AAClB,SAAO,CAACA,GAAM,GAAIK,aAAgB,aAAaD,EAAeC,EAAK,IAAI,IAAI,EAAG;AAClF,GAEMC,KAAqB,MAAM,MAAA;AAAA,GAC3BC,KAAW,MAAM,IACjBC,KAAW,MAAM,IAEjBC,IAAc,CAACC,GAAoBC,MACrCA,KAAWC,GAAeF,CAAK,KAAKA,GAGlCG,KAAsC,CAAC;AAAA,EACzC,SAAAC;AAAA,EACA,UAAAC;AAAA,EACA,MAAMC;AAAA,EACN,aAAAC,IAAc;AAAA,EACd,cAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,QAAAC,IAAS;AAAA,EACT,OAAAC,IAAQ;AAAA,EACR,SAAAC,IAAU;AAAA,EACV,WAAAC;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,WAAAC,KAAY;AAAA,EACZ,iBAAAC;AAAA,EACA,gBAAAC,KAAiB;AAAA,EACjB,MAAAC,IAAO;AAAA,EACP,cAAcC;AAAA,EACd,mBAAmBC;AAAA,EACnB,WAAAC,KAAY;AAChB,MAAM;AACF,QAAMC,KAASC,GAAWC,CAAkB,GACtC,CAACC,IAAkBC,EAAmB,IAAIC,EAASpB,CAAW,GAC9DqB,IAAStB,KAAkBmB,IAC3BI,KAAWC,GAAqBlC,IAAoBC,IAAUC,EAAQ,GAEtEiC,IAAaC,EAA2B,IAAI,GAC5CC,IAAUD,EAA8B,IAAI,GAC5CE,KAAgBC,GAAc,WAAWP,GAAQK,CAAO,GACxD,CAACjC,GAAOoC,EAAQ,IAAIT,EAAgC,IAAI,GACxDU,IAAiBL,EAAO,CAAC,GACzBM,IAAcN,EAAO,EAAK,GAC1BO,IAAiBP,EAAO,EAAK,GAC7BQ,IAAwBR,EAAO,EAAK,GAEpCS,IAAYC,EAAad,CAAM,GAC/Be,IAAgBD,EAAapC,CAAc,GAC3CsC,IAAkBF,EAAalC,CAAY,GAE3CqC,IAAUC;AAAA,IACZ,CAACC,MAAkB;;AACf,MAAIA,MAASN,EAAU,YAGnBE,EAAc,YAAY,UAC1BjB,GAAoBqB,CAAI,IAE5BC,IAAAJ,EAAgB,YAAhB,QAAAI,EAAA,KAAAJ,GAA0BG;AAAA,IAC9B;AAAA,IACA,CAACN,GAAWE,GAAeC,CAAe;AAAA,EAAA,GAGxC,EAAE,eAAAK,GAAe,aAAAC,GAAa,gBAAAC,GAAgB,aAAAC,GAAa,eAAAC,EAAA,IAC7DC,GAAc;AAAA,IACV,WAAAb;AAAA,IACA,gBAAAJ;AAAA,IACA,SAAAQ;AAAA,EAAA,CACH,GAEC,EAAE,MAAAU,IAAM,cAAAC,EAAA,IAAiBC,GAAe;AAAA,IAC1C,QAAAnC;AAAA,IACA,QAAAM;AAAA,IACA,QAAAlB;AAAA,IACA,WAAA+B;AAAA,IACA,gBAAAJ;AAAA,IACA,aAAAe;AAAA,IACA,eAAAC;AAAA,EAAA,CACH,GAEKK,IAAWC,GAAmB;AAAA,IAChC,QAAA/B;AAAA,IACA,OAAA5B;AAAA,IACA,SAAAiC;AAAA,IACA,YAAAF;AAAA,IACA,WAAAlB;AAAA,IACA,WAAAJ;AAAA,IACA,OAAAE;AAAA,IACA,QAAAG;AAAA,EAAA,CACH;AAED,EAAA8C,EAAU,MAAM;AACZ,QAAI,CAAChC;AACD;AAEJ,UAAMiC,IAAsB,CAACC,MAAsB;AAC/C,YAAM1E,IAAO0E,EAAM,aAAA;AAMnB,MALe3E,GAASC,GAAM;AAAA,QAC1B2C,EAAW;AAAA,QACXE,EAAQ;AAAA,QACR,GAAG,CAAC,GAAGuB,EAAa,OAAO,EAAE,IAAI,CAACO,OAAWA,GAAA,CAAQ;AAAA,MAAA,CACxD,KAEGlB,EAAQ,EAAK;AAAA,IAErB;AACA,aAAS,iBAAiB,aAAagB,GAAqB,EAAI;AAChE,UAAMG,IAAiBC,GAAgB,MAAMpB,EAAQ,EAAK,CAAC;AAC3D,WAAO,MAAM;;AACT,eAAS,oBAAoB,aAAagB,GAAqB,EAAI,GACnEG,EAAA,GACAf,EAAc,UAAU;AACxB,YAAMiB,IAASC,EAAA;AACf,MAAIjB,EAAY,YAAY,CAACgB,KAAUA,MAAW,SAAS,UACvD3B,EAAe,UAAU,KACzBS,IAAAjB,EAAW,YAAX,QAAAiB,EAAoB,MAAM,EAAE,eAAe,OAC3CT,EAAe,UAAU,KAE7BW,EAAY,UAAU;AAAA,IAC1B;AAAA,EACJ,GAAG,CAACtB,GAAQiB,GAASW,GAAcP,GAAeC,CAAW,CAAC;AAE9D,QAAMkB,IAAQxC,KAAU5B,MAAU,QAAQ0D,MAAa;AAEvD,EAAAE,EAAU,MAAM;AACZ,UAAMS,IAAc3D,MAAW,WAAW4B,EAAY;AACtD,IAAI,CAAC8B,KAAS,CAACpE,KAAS,CAACqE,MAGzB/B,EAAY,UAAU,IACtBvC,EAAYC,GAAOgB,KAAA,gBAAAA,EAAiB,OAAO,EAAE,MAAM,EAAE,eAAe,IAAM;AAAA,EAC9E,GAAG,CAACoD,GAAOpE,GAAOU,GAAQM,CAAe,CAAC;AAE1C,QAAMsD,IAAgB,MAAM;AAExB,QADAlB,EAAA,GACIxB,KAAU5B,GAAO;AACjB,MAAAD,EAAYC,GAAOgB,KAAA,gBAAAA,EAAiB,OAAO,EAAE,MAAM,EAAE,eAAe,IAAM;AAC1E;AAAA,IACJ;AACA,IAAAsB,EAAY,UAAU,IACtBO,EAAQ,EAAI;AAAA,EAChB,GAEM0B,IAAW,CAACjF,MAAsC;AACpD,UAAMkF,IAAa;AAAA,MACfzC,EAAW;AAAA,MACXE,EAAQ;AAAA,MACRjC;AAAA,MACA,GAAG,CAAC,GAAGwD,EAAa,OAAO,EAAE,IAAI,CAACO,MAAWA,EAAA,CAAQ;AAAA,IAAA;AAEzD,WAAOrE,EAAeJ,CAAI,EAAE;AAAA,MAAK,CAACmF,MAC9BD,EAAW,KAAK,CAACE,MAAcA,KAAA,gBAAAA,EAAW,SAASD,EAAK;AAAA,IAAA;AAAA,EAEhE,GAEME,IAAmB,CAAC5B,MAA6B;AACnD,IAAKA,KAGL,eAAe,MAAM;AACjB,MAAI,CAACwB,EAASxB,CAAI,KAAK,CAACwB,EAASJ,EAAA,CAAsB,KACnDtB,EAAQ,EAAK;AAAA,IAErB,CAAC;AAAA,EACL,GAEM+B,IACFlE,MAAW,UACL;AAAA,IACI,cAAc,MAAM;AAChB,MAAAuC,EAAc,UAAU,IACxBG,EAAA,GACAP,EAAQ,EAAI;AAAA,IAChB;AAAA,IACA,cAAc,MAAM;AAChB,MAAAI,EAAc,UAAU,IACxBI,EAAA;AAAA,IACJ;AAAA,IACA,kBAAkB,MAAM;AACpB,MAAAJ,EAAc,UAAU,IACxBG,EAAA;AAAA,IACJ;AAAA,EAAA,IAEJ,MAEJyB,IAAezE,EAAQ,OAGvB0E,IAAgBC,GAAwB3E,CAAO,GAC/C4E,KAAqBC;AAAA,IACvB,MAAMC,GAAYJ,GAAe/C,CAAU;AAAA,IAC3C,CAAC+C,CAAa;AAAA,EAAA,GAEZK,IAAU5F,GAAkBkB,EAAU,MAAM,GAAG,EAAE,CAAC,CAAC,GAEnD2E,KAAgBC,GAAM,aAAajF,GAAS;AAAA,IAC9C,KAAK4E;AAAA,IACL,iBAAiB9D;AAAA,IACjB,iBAAiBU;AAAA,IACjB,SAAS0D;AAAA,MACLT,EAAa;AAAA,MACb,CAACf,MAA4B;AACzB,YAAIpD,MAAW,SAAS;AACpB,UAAAmC,EAAQ,CAACjB,CAAM;AACf;AAAA,QACJ;AAEA,YADqBkC,EAAM,WAAW,GACpB;AACd,UAAAQ,EAAA;AACA;AAAA,QACJ;AACA,QAAAlB,EAAA,GACAP,EAAQ,EAAI;AAAA,MAChB;AAAA,IAAA;AAAA,IAEJ,GAAI+B,IACE;AAAA,MACI,cAAcU;AAAA,QACVT,EAAa;AAAA,QACbD,EAAc;AAAA,MAAA;AAAA,MAElB,cAAcU;AAAA,QACVT,EAAa;AAAA,QACbD,EAAc;AAAA,MAAA;AAAA,MAElB,aAAaU;AAAA,QACTT,EAAa;AAAA,QACb,MAAM;AACF,UAAArC,EAAsB,UAAU,IAChC,WAAW,MAAM;AACb,YAAAA,EAAsB,UAAU;AAAA,UACpC,CAAC;AAAA,QACL;AAAA,MAAA;AAAA,MAEJ,SAAS8C,EAAaT,EAAa,SAAsC,MAAM;AAC3E,cAAMU,IAAc/C,EAAsB;AAG1C,QAFAA,EAAsB,UAAU,IAChCW,EAAe,UAAU,CAACoC,KAAe,CAAChD,EAAe,SACrD,CAAAA,EAAe,YAGnBa,EAAA,GACAP,EAAQ,EAAI;AAAA,MAChB,CAAC;AAAA,MACD,WAAWyC;AAAA,QACPT,EAAa;AAAA,QACb,CAACf,MAA+B;AAC5B,UAAIA,EAAM,QAAQqB,MAGlBrB,EAAM,eAAA,GACNQ,EAAA;AAAA,QACJ;AAAA,MAAA;AAAA,IACJ,IAEJrD,KACE;AAAA,MACI,WAAWqE;AAAA,QACPT,EAAa;AAAA,QACb,CAACf,MAA+B;AAC5B,UAAIA,EAAM,QAAQqB,KAAW3F,GAAYsE,EAAM,MAAM,MAGrDA,EAAM,eAAA,GACNQ,EAAA;AAAA,QACJ;AAAA,MAAA;AAAA,IACJ,IAEJ,CAAA;AAAA,IACR,QAAQgB;AAAA,MACJT,EAAa;AAAA,MACb,CAACf,MAA4B;AAEzB,YADAX,EAAe,UAAU,IACrB,GAACvB,KAAU2C,EAAST,EAAM,aAAa,IAG3C;AAAA,cAAIpD,MAAW,SAAS;AACpB,YAAA2C,EAAA;AACA;AAAA,UACJ;AACA,UAAAsB,EAAiBb,EAAM,aAAa;AAAA;AAAA,MACxC;AAAA,IAAA;AAAA,EACJ,CACwB,GAEtB0B,KAAkC;AAAA,IACpC,WAAW9B,KAAA,gBAAAA,EAAU;AAAA,IACrB,UAAU,gBAAgB+B,KAA2B,CAAC;AAAA,IACtD,YAAY/B,IAAW,YAAY;AAAA,EAAA;AAGvC,SACI,gBAAAgC,GAAAC,IAAA,EACK,UAAA;AAAA,IAAAP;AAAA,IACAxD,KACGC,MACA+D;AAAA,MACI,gBAAAC,EAACrE,EAAmB,UAAnB,EAA4B,OAAO+B,IAChC,UAAA,gBAAAsC;AAAA,QAACC;AAAA,QAAA;AAAA,UACG,SAAA7D;AAAA,UACA,WAAWC;AAAA,UACX,WAAW;AAAA,YACP,UAAU;AAAA,YACV,MAAKwB,KAAA,gBAAAA,EAAU,QAAO;AAAA,YACtB,OAAMA,KAAA,gBAAAA,EAAU,SAAQ;AAAA,UAAA;AAAA,UAG5B,UAAA,gBAAAmC;AAAA,YAAC;AAAA,YAAA;AAAA,cACG,KAAKzD;AAAA,cACL,MAAAlB;AAAA,cACA,cAAYC;AAAA,cACZ,mBAAiBC;AAAA,cACjB,aAAWsC,KAAA,gBAAAA,EAAU;AAAA,cACrB,UAAU;AAAA,cACV,WAAW,GAAG1E,EAAK,IAAIC,GAAU8B,EAAS,CAAC,IAAI7B,GAAQ0B,CAAO,CAAC,IAAIS,EAAS,GAAG,KAAA;AAAA,cAC/E,OAAOmE;AAAA,cAEP,aAAaZ,KAAA,gBAAAA,EAAe;AAAA,cAC5B,cAAcA,KAAA,gBAAAA,EAAe;AAAA,cAC7B,SAAS,MAAM;AACX,gBAAA1B,EAAY,UAAU,IACtBE,EAAA;AAAA,cACJ;AAAA,cACA,QAAQ,CAACU,MAAU;AACf,oBAAI,CAAAS,EAAST,EAAM,aAAa,GAIhC;AAAA,sBADAZ,EAAY,UAAU,IAClBxC,MAAW,SAAS;AACpB,oBAAA2C,EAAA;AACA;AAAA,kBACJ;AACA,kBAAAsB,EAAiBb,EAAM,aAAa;AAAA;AAAA,cACxC;AAAA,cAEC,UAAAzD;AAAA,YAAA;AAAA,UAAA;AAAA,QACL;AAAA,MAAA,GAER;AAAA,MACA,SAAS;AAAA,IAAA;AAAA,EACb,GACR;AAER,GAEa0F,KAAU,OAAO,OAAO5F,IAAa;AAAA,EAC9C,QAAQ6F;AAAA,EACR,QAAQC;AAAA,EACR,MAAMC;AAAA,EACN,SAASC;AAAA,EACT,OAAOC;AACX,CAAC;"}
1
+ {"version":3,"file":"Popover.js","sources":["../../src/components/Popover.tsx"],"sourcesContent":["import React, {\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport { ShadowRootWrapper } from '../ShadowRootWrapper';\nimport {\n PopoverAction,\n PopoverEmpty,\n PopoverHeader,\n PopoverList,\n PopoverSection,\n} from './PopoverParts';\nimport { getDeepActiveElement } from './activeElement';\nimport { chainHandler, composeRefs, elementRef } from './composeRefs';\nimport { pushEscapeLayer } from './escapeLayers';\nimport {\n type FloatingOffset,\n type FloatingPlacement,\n MENU_VIEWPORT_PADDING_PX,\n} from './floatingMenuGeometry';\nimport { firstTabStopIn } from './overlayBehaviour';\nimport { usePopupLayer } from './overlayLayers';\nimport { PopoverShownContext, PopoverTreeContext } from './popoverTree';\nimport { useHoverClose } from './useHoverClose';\nimport { useLatestRef } from './useLatestRef';\nimport { usePopoverPosition } from './usePopoverPosition';\nimport { usePopoverTree } from './usePopoverTree';\n\nexport type PopoverPlacement = FloatingPlacement;\n\nexport type PopoverInitialFocus =\n | React.RefObject<HTMLElement | null>\n | (() => HTMLElement | null | undefined);\n\ninterface PopoverBaseProps {\n trigger: React.ReactElement;\n children?: React.ReactNode;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n placement?: PopoverPlacement;\n openOn?: 'click' | 'hover';\n width?: 'content' | 'trigger';\n padding?: 'none' | 'small' | 'medium';\n anchorRef?: React.RefObject<HTMLElement | null>;\n offset?: FloatingOffset;\n elevation?: 'default' | 'raised';\n /** A click panel also opens, focus inside, on the arrow key its placement points at. */\n openOnArrowKey?: boolean;\n role?: 'dialog' | 'menu' | 'listbox';\n className?: string;\n}\n\ntype PopoverName =\n | { 'aria-label': string; 'aria-labelledby'?: string }\n | { 'aria-label'?: string; 'aria-labelledby': string };\n\ntype PopoverFocusSource =\n | {\n /**\n * What takes focus when the panel is shown, in place of its first tab stop. Re-read as the\n * content changes, so focus follows late content but never leaves where the user moved it.\n */\n initialFocus?: PopoverInitialFocus;\n initialFocusRef?: never;\n }\n | {\n initialFocus?: never;\n /** @deprecated Use `initialFocus`, which takes the same ref and also follows late content. */\n initialFocusRef?: React.RefObject<HTMLElement | null>;\n };\n\nexport type PopoverProps = PopoverBaseProps & PopoverName & PopoverFocusSource;\n\nconst PANEL =\n 'font-sans box-border overflow-auto outline-none rounded-[var(--malachite-radius-xl,12px)] border border-solid border-[var(--malachite-card-border,rgb(232,232,232))] bg-[var(--malachite-card-background,rgb(255,255,255))] text-[var(--malachite-text-primary,rgb(10,10,10))]';\n\nconst ELEVATION: Record<NonNullable<PopoverBaseProps['elevation']>, string> = {\n default: '[box-shadow:0px_4px_10px_0px_var(--malachite-card-shadow,rgba(0,0,0,0.1))]',\n raised: '[box-shadow:0px_8px_24px_0px_var(--malachite-card-shadow,rgba(0,0,0,0.1))]',\n};\n\nconst PADDING: Record<NonNullable<PopoverBaseProps['padding']>, string> = {\n none: 'p-0',\n small: 'p-1',\n medium: 'p-2',\n};\n\nconst pathHits = (path: EventTarget[], nodes: Iterable<Element | null | undefined>): boolean => {\n for (const node of nodes) {\n if (node && path.includes(node)) {\n return true;\n }\n }\n return false;\n};\n\nconst KEYBOARD_OPEN_KEY: Record<string, string> = {\n bottom: 'ArrowDown',\n top: 'ArrowUp',\n right: 'ArrowRight',\n left: 'ArrowLeft',\n};\n\nconst isTextEntry = (target: EventTarget): boolean =>\n target instanceof HTMLElement &&\n (target.isContentEditable || ['INPUT', 'TEXTAREA', 'SELECT'].includes(target.tagName));\n\nconst composedPathOf = (node: EventTarget | null): Node[] => {\n if (!(node instanceof Node)) {\n return [];\n }\n const root = node.getRootNode();\n return [node, ...(root instanceof ShadowRoot ? composedPathOf(root.host) : [])];\n};\n\nconst subscribeToNothing = () => () => undefined;\nconst onClient = () => true;\nconst onServer = () => false;\n\nconst focusTarget = (panel: HTMLElement, initial: HTMLElement | null | undefined): HTMLElement =>\n initial ?? firstTabStopIn(panel) ?? panel;\n\nconst resolveFocus = (source: PopoverInitialFocus | undefined): HTMLElement | null | undefined =>\n typeof source === 'function' ? source() : source?.current;\n\n// Some engines keep a removed element as `activeElement`, and a shadow host with nothing\n// focused inside it holds focus for no one.\nconst focusIsLost = (active: HTMLElement | null, host: HTMLElement | null): boolean =>\n !active || active === document.body || !active.isConnected || active === host;\n\n/** An anchored, non-modal panel; nested Popovers count as inside their parent. */\nconst PopoverRoot: React.FC<PopoverProps> = ({\n trigger,\n children,\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange,\n placement = 'bottom-start',\n openOn = 'click',\n width = 'content',\n padding = 'small',\n anchorRef,\n offset = 'small',\n elevation = 'default',\n initialFocus,\n initialFocusRef,\n openOnArrowKey = false,\n role = 'dialog',\n 'aria-label': ariaLabel,\n 'aria-labelledby': ariaLabelledBy,\n className = '',\n}) => {\n const parent = useContext(PopoverTreeContext);\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const isOpen = controlledOpen ?? uncontrolledOpen;\n const isClient = useSyncExternalStore(subscribeToNothing, onClient, onServer);\n\n const triggerRef = useRef<HTMLElement | null>(null);\n const hostRef = useRef<HTMLDivElement | null>(null);\n const popupIdentity = usePopupLayer('popover', isOpen, hostRef);\n const [panel, setPanel] = useState<HTMLDivElement | null>(null);\n const heldByChildren = useRef(0);\n const focusOnOpen = useRef(false);\n const returningFocus = useRef(false);\n const pointerPressedTrigger = useRef(false);\n const placedFocus = useRef<HTMLElement | null>(null);\n const heldFocus = useRef<HTMLElement | null>(null);\n\n const isOpenRef = useLatestRef(isOpen);\n const controlledRef = useLatestRef(controlledOpen);\n const onOpenChangeRef = useLatestRef(onOpenChange);\n const initialFocusSource = useLatestRef(initialFocus);\n const followsContent = initialFocus !== undefined;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (next === isOpenRef.current) {\n return;\n }\n if (controlledRef.current === undefined) {\n setUncontrolledOpen(next);\n }\n onOpenChangeRef.current?.(next);\n },\n [isOpenRef, controlledRef, onOpenChangeRef],\n );\n\n const { pointerInside, focusInside, triggerFocused, cancelClose, scheduleClose } =\n useHoverClose({\n isOpenRef,\n heldByChildren,\n setOpen,\n });\n\n const { tree, ownedSources } = usePopoverTree({\n parent,\n isOpen,\n openOn,\n isOpenRef,\n heldByChildren,\n cancelClose,\n scheduleClose,\n });\n\n const geometry = usePopoverPosition({\n isOpen,\n panel,\n hostRef,\n triggerRef,\n anchorRef,\n placement,\n width,\n offset,\n });\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n const closeOnOutsidePress = (event: MouseEvent) => {\n const path = event.composedPath();\n const inside = pathHits(path, [\n triggerRef.current,\n hostRef.current,\n ...[...ownedSources.current].map((source) => source()),\n ]);\n if (!inside) {\n setOpen(false);\n }\n };\n document.addEventListener('mousedown', closeOnOutsidePress, true);\n const popEscapeLayer = pushEscapeLayer(() => setOpen(false));\n return () => {\n document.removeEventListener('mousedown', closeOnOutsidePress, true);\n popEscapeLayer();\n pointerInside.current = false;\n const active = getDeepActiveElement();\n if (focusInside.current && (!active || active === document.body)) {\n returningFocus.current = true;\n triggerRef.current?.focus({ preventScroll: true });\n returningFocus.current = false;\n }\n focusInside.current = false;\n placedFocus.current = null;\n heldFocus.current = null;\n };\n }, [isOpen, setOpen, ownedSources, pointerInside, focusInside]);\n\n const shown = isOpen && panel !== null && geometry !== null;\n\n const placeFocus = useCallback((target: HTMLElement) => {\n placedFocus.current = target;\n target.focus({ preventScroll: true });\n }, []);\n\n useEffect(() => {\n const shouldFocus = openOn === 'click' || focusOnOpen.current;\n if (!shown || !panel || !shouldFocus) {\n return;\n }\n focusOnOpen.current = false;\n const initial = followsContent\n ? resolveFocus(initialFocusSource.current)\n : initialFocusRef?.current;\n placeFocus(focusTarget(panel, initial));\n }, [shown, panel, openOn, followsContent, initialFocusRef, initialFocusSource, placeFocus]);\n\n useEffect(() => {\n if (!shown || !panel || !followsContent) {\n return;\n }\n const followContent = () => {\n const active = getDeepActiveElement();\n if (focusIsLost(active, hostRef.current)) {\n if (heldFocus.current && !heldFocus.current.isConnected) {\n placeFocus(focusTarget(panel, resolveFocus(initialFocusSource.current)));\n }\n return;\n }\n if (active !== placedFocus.current) {\n return;\n }\n const next =\n resolveFocus(initialFocusSource.current) ??\n (active === panel ? firstTabStopIn(panel) : null);\n if (next && next !== active && next.isConnected) {\n placeFocus(next);\n }\n };\n const observer = new MutationObserver(followContent);\n observer.observe(panel, { childList: true, subtree: true });\n return () => observer.disconnect();\n }, [shown, panel, followsContent, initialFocusSource, placeFocus]);\n\n const openWithFocus = () => {\n cancelClose();\n if (isOpen && panel) {\n const initial = followsContent\n ? resolveFocus(initialFocusSource.current)\n : initialFocusRef?.current;\n placeFocus(focusTarget(panel, initial));\n return;\n }\n focusOnOpen.current = true;\n setOpen(true);\n };\n\n const isInside = (node: EventTarget | null): boolean => {\n const containers = [\n triggerRef.current,\n hostRef.current,\n panel,\n ...[...ownedSources.current].map((source) => source()),\n ];\n return composedPathOf(node).some((step) =>\n containers.some((container) => container?.contains(step)),\n );\n };\n\n const closeIfFocusLeft = (next: EventTarget | null) => {\n if (!next) {\n return;\n }\n queueMicrotask(() => {\n if (!isInside(next) && !isInside(getDeepActiveElement())) {\n setOpen(false);\n }\n });\n };\n\n const hoverHandlers =\n openOn === 'hover'\n ? {\n onMouseEnter: () => {\n pointerInside.current = true;\n cancelClose();\n setOpen(true);\n },\n onMouseLeave: () => {\n pointerInside.current = false;\n scheduleClose();\n },\n onPanelMouseOver: () => {\n pointerInside.current = true;\n cancelClose();\n },\n }\n : null;\n\n const triggerProps = trigger.props as Record<string, unknown>;\n type Handler<E extends React.SyntheticEvent> = ((event: E) => void) | undefined;\n\n const ownTriggerRef = elementRef<HTMLElement>(trigger);\n const composedTriggerRef = useMemo(\n () => composeRefs(ownTriggerRef, triggerRef),\n [ownTriggerRef],\n );\n const openKey = KEYBOARD_OPEN_KEY[placement.split('-')[0]];\n\n const clonedTrigger = React.cloneElement(trigger, {\n ref: composedTriggerRef,\n 'aria-haspopup': role,\n 'aria-expanded': isOpen,\n onClick: chainHandler(\n triggerProps.onClick as Handler<React.MouseEvent>,\n (event: React.MouseEvent) => {\n if (openOn !== 'hover') {\n setOpen(!isOpen);\n return;\n }\n const fromKeyboard = event.detail === 0;\n if (fromKeyboard) {\n openWithFocus();\n return;\n }\n cancelClose();\n setOpen(true);\n },\n ),\n ...(hoverHandlers\n ? {\n onMouseEnter: chainHandler(\n triggerProps.onMouseEnter as Handler<React.MouseEvent>,\n hoverHandlers.onMouseEnter,\n ),\n onMouseLeave: chainHandler(\n triggerProps.onMouseLeave as Handler<React.MouseEvent>,\n hoverHandlers.onMouseLeave,\n ),\n onMouseDown: chainHandler(\n triggerProps.onMouseDown as Handler<React.MouseEvent>,\n () => {\n pointerPressedTrigger.current = true;\n setTimeout(() => {\n pointerPressedTrigger.current = false;\n });\n },\n ),\n onFocus: chainHandler(triggerProps.onFocus as Handler<React.FocusEvent>, () => {\n const fromPointer = pointerPressedTrigger.current;\n pointerPressedTrigger.current = false;\n triggerFocused.current = !fromPointer && !returningFocus.current;\n if (returningFocus.current) {\n return;\n }\n cancelClose();\n setOpen(true);\n }),\n onKeyDown: chainHandler(\n triggerProps.onKeyDown as Handler<React.KeyboardEvent>,\n (event: React.KeyboardEvent) => {\n if (event.key !== openKey) {\n return;\n }\n event.preventDefault();\n openWithFocus();\n },\n ),\n }\n : openOnArrowKey\n ? {\n onKeyDown: chainHandler(\n triggerProps.onKeyDown as Handler<React.KeyboardEvent>,\n (event: React.KeyboardEvent) => {\n if (event.key !== openKey || isTextEntry(event.target)) {\n return;\n }\n event.preventDefault();\n openWithFocus();\n },\n ),\n }\n : {}),\n onBlur: chainHandler(\n triggerProps.onBlur as Handler<React.FocusEvent>,\n (event: React.FocusEvent) => {\n triggerFocused.current = false;\n if (!isOpen || isInside(event.relatedTarget)) {\n return;\n }\n if (openOn === 'hover') {\n scheduleClose();\n return;\n }\n closeIfFocusLeft(event.relatedTarget);\n },\n ),\n } as Record<string, unknown>);\n\n const panelStyle: React.CSSProperties = {\n maxHeight: geometry?.maxHeight,\n maxWidth: `calc(100vw - ${MENU_VIEWPORT_PADDING_PX * 2}px)`,\n visibility: geometry ? 'visible' : 'hidden',\n };\n\n return (\n <>\n {clonedTrigger}\n {isOpen &&\n isClient &&\n createPortal(\n <PopoverTreeContext.Provider value={tree}>\n <ShadowRootWrapper\n hostRef={hostRef}\n hostProps={popupIdentity}\n hostStyle={{\n position: 'fixed',\n top: geometry?.top ?? 0,\n left: geometry?.left ?? 0,\n }}\n >\n <div\n ref={setPanel}\n role={role}\n aria-label={ariaLabel}\n aria-labelledby={ariaLabelledBy}\n data-side={geometry?.side}\n tabIndex={-1}\n className={`${PANEL} ${ELEVATION[elevation]} ${PADDING[padding]} ${className}`.trim()}\n style={panelStyle}\n // React's mouseenter stops at the shadow host, so the panel listens for mouseover.\n onMouseOver={hoverHandlers?.onPanelMouseOver}\n onMouseLeave={hoverHandlers?.onMouseLeave}\n onFocus={(event) => {\n focusInside.current = true;\n if (event.target !== placedFocus.current) {\n placedFocus.current = null;\n }\n if (\n event.target instanceof HTMLElement &&\n panel?.contains(event.target)\n ) {\n heldFocus.current = event.target;\n }\n cancelClose();\n }}\n onBlur={(event) => {\n if (isInside(event.relatedTarget)) {\n return;\n }\n if (event.relatedTarget) {\n heldFocus.current = null;\n }\n focusInside.current = false;\n if (openOn === 'hover') {\n scheduleClose();\n return;\n }\n closeIfFocusLeft(event.relatedTarget);\n }}\n >\n <PopoverShownContext.Provider value={shown}>\n {children}\n </PopoverShownContext.Provider>\n </div>\n </ShadowRootWrapper>\n </PopoverTreeContext.Provider>,\n document.body,\n )}\n </>\n );\n};\n\nexport const Popover = Object.assign(PopoverRoot, {\n Header: PopoverHeader,\n Action: PopoverAction,\n List: PopoverList,\n Section: PopoverSection,\n Empty: PopoverEmpty,\n});\n\nexport default Popover;\n"],"names":["PANEL","ELEVATION","PADDING","pathHits","path","nodes","node","KEYBOARD_OPEN_KEY","isTextEntry","target","composedPathOf","root","subscribeToNothing","onClient","onServer","focusTarget","panel","initial","firstTabStopIn","resolveFocus","source","focusIsLost","active","host","PopoverRoot","trigger","children","controlledOpen","defaultOpen","onOpenChange","placement","openOn","width","padding","anchorRef","offset","elevation","initialFocus","initialFocusRef","openOnArrowKey","role","ariaLabel","ariaLabelledBy","className","parent","useContext","PopoverTreeContext","uncontrolledOpen","setUncontrolledOpen","useState","isOpen","isClient","useSyncExternalStore","triggerRef","useRef","hostRef","popupIdentity","usePopupLayer","setPanel","heldByChildren","focusOnOpen","returningFocus","pointerPressedTrigger","placedFocus","heldFocus","isOpenRef","useLatestRef","controlledRef","onOpenChangeRef","initialFocusSource","followsContent","setOpen","useCallback","next","_a","pointerInside","focusInside","triggerFocused","cancelClose","scheduleClose","useHoverClose","tree","ownedSources","usePopoverTree","geometry","usePopoverPosition","useEffect","closeOnOutsidePress","event","popEscapeLayer","pushEscapeLayer","getDeepActiveElement","shown","placeFocus","shouldFocus","followContent","observer","openWithFocus","isInside","containers","step","container","closeIfFocusLeft","hoverHandlers","triggerProps","ownTriggerRef","elementRef","composedTriggerRef","useMemo","composeRefs","openKey","clonedTrigger","React","chainHandler","fromPointer","panelStyle","MENU_VIEWPORT_PADDING_PX","jsxs","Fragment","createPortal","jsx","ShadowRootWrapper","PopoverShownContext","Popover","PopoverHeader","PopoverAction","PopoverList","PopoverSection","PopoverEmpty"],"mappings":"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"}