@solibo/solibo-ui 1.0.13 → 1.0.15
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/assets/index.css +1 -1
- package/dist/assets/index12.css +1 -1
- package/dist/assets/index15.css +1 -1
- package/dist/assets/index16.css +1 -1
- package/dist/assets/index17.css +1 -1
- package/dist/assets/index18.css +1 -1
- package/dist/assets/index19.css +0 -1
- package/dist/assets/index20.css +1 -1
- package/dist/assets/index21.css +1 -0
- package/dist/assets/index22.css +1 -1
- package/dist/assets/index23.css +1 -1
- package/dist/assets/index24.css +1 -1
- package/dist/assets/index25.css +1 -1
- package/dist/assets/index26.css +1 -1
- package/dist/assets/index27.css +1 -1
- package/dist/assets/index28.css +1 -1
- package/dist/assets/index29.css +1 -1
- package/dist/assets/index30.css +1 -1
- package/dist/assets/index31.css +1 -1
- package/dist/assets/index32.css +1 -1
- package/dist/assets/index33.css +1 -1
- package/dist/assets/index34.css +1 -1
- package/dist/assets/index35.css +1 -1
- package/dist/assets/index36.css +1 -1
- package/dist/assets/index37.css +1 -1
- package/dist/assets/index38.css +1 -1
- package/dist/assets/index39.css +1 -1
- package/dist/assets/index40.css +1 -1
- package/dist/assets/index41.css +1 -1
- package/dist/assets/index42.css +1 -1
- package/dist/assets/index43.css +1 -1
- package/dist/assets/index44.css +1 -1
- package/dist/assets/index45.css +1 -1
- package/dist/assets/index46.css +1 -1
- package/dist/assets/index47.css +1 -1
- package/dist/assets/index48.css +1 -1
- package/dist/assets/index49.css +1 -1
- package/dist/assets/index50.css +1 -1
- package/dist/assets/index51.css +1 -1
- package/dist/assets/index6.css +1 -1
- package/dist/assets/menu-popover.css +1 -0
- package/dist/components/app-link/index.cjs +1 -1
- package/dist/components/app-link/index.js +1 -1
- package/dist/components/aside/index.cjs +1 -1
- package/dist/components/aside/index.js +1 -1
- package/dist/components/avatar/index.cjs +1 -1
- package/dist/components/avatar/index.js +1 -1
- package/dist/components/badge/index.cjs +1 -1
- package/dist/components/badge/index.js +1 -1
- package/dist/components/banner/index.cjs +1 -1
- package/dist/components/banner/index.js +1 -1
- package/dist/components/branding/index.cjs +1 -1
- package/dist/components/branding/index.js +1 -1
- package/dist/components/button/index.cjs +1 -1
- package/dist/components/button/index.js +1 -1
- package/dist/components/card/index.cjs +1 -1
- package/dist/components/card/index.js +1 -1
- package/dist/components/checkbox/index.cjs +1 -1
- package/dist/components/checkbox/index.js +2 -2
- package/dist/components/chip/index.cjs +1 -1
- package/dist/components/chip/index.cjs.map +1 -1
- package/dist/components/chip/index.js +29 -21
- package/dist/components/chip/index.js.map +1 -1
- package/dist/components/collapsible/index.cjs +1 -1
- package/dist/components/collapsible/index.js +1 -1
- package/dist/components/controls/index.cjs +1 -1
- package/dist/components/controls/index.cjs.map +1 -1
- package/dist/components/controls/index.js +108 -36
- package/dist/components/controls/index.js.map +1 -1
- package/dist/components/croppable/index.cjs +1 -1
- package/dist/components/croppable/index.js +1 -1
- package/dist/components/dialog/index.cjs +1 -1
- package/dist/components/dialog/index.js +1 -1
- package/dist/components/dropdown/index.cjs +1 -1
- package/dist/components/dropdown/index.cjs.map +1 -1
- package/dist/components/dropdown/index.js +92 -89
- package/dist/components/dropdown/index.js.map +1 -1
- package/dist/components/dropzone/index.cjs +1 -1
- package/dist/components/dropzone/index.js +1 -1
- package/dist/components/editor/index.cjs +1 -1
- package/dist/components/editor/index.js +2 -2
- package/dist/components/empty-state/index.cjs +1 -1
- package/dist/components/empty-state/index.js +1 -1
- package/dist/components/fieldset/index.cjs +1 -1
- package/dist/components/fieldset/index.js +1 -1
- package/dist/components/figure/index.cjs +1 -1
- package/dist/components/figure/index.js +1 -1
- package/dist/components/file/index.cjs +1 -1
- package/dist/components/file/index.cjs.map +1 -1
- package/dist/components/file/index.js +38 -34
- package/dist/components/file/index.js.map +1 -1
- package/dist/components/footer/index.cjs +1 -1
- package/dist/components/footer/index.js +1 -1
- package/dist/components/form/index.cjs +1 -1
- package/dist/components/form/index.js +1 -1
- package/dist/components/graph/index.cjs +1 -1
- package/dist/components/graph/index.js +1 -1
- package/dist/components/group/index.cjs +1 -1
- package/dist/components/group/index.js +1 -1
- package/dist/components/header/index.cjs +1 -1
- package/dist/components/header/index.js +12 -12
- package/dist/components/icon/index.cjs +1 -1
- package/dist/components/icon/index.js +2 -2
- package/dist/components/iframe/index.cjs +1 -1
- package/dist/components/iframe/index.js +1 -1
- package/dist/components/image/index.cjs +1 -1
- package/dist/components/image/index.js +1 -1
- package/dist/components/input/index.cjs +1 -1
- package/dist/components/input/index.js +3 -3
- package/dist/components/link/index.cjs +1 -1
- package/dist/components/link/index.js +1 -1
- package/dist/components/list/index.cjs +1 -1
- package/dist/components/list/index.cjs.map +1 -1
- package/dist/components/list/index.js +39 -36
- package/dist/components/list/index.js.map +1 -1
- package/dist/components/loading/index.cjs +1 -1
- package/dist/components/loading/index.js +1 -1
- package/dist/components/menu/index.cjs +1 -1
- package/dist/components/menu/index.cjs.map +1 -1
- package/dist/components/menu/index.js +37 -87
- package/dist/components/menu/index.js.map +1 -1
- package/dist/components/message/index.cjs +1 -1
- package/dist/components/message/index.cjs.map +1 -1
- package/dist/components/message/index.js +25 -25
- package/dist/components/nav/index.cjs +1 -1
- package/dist/components/nav/index.js +21 -21
- package/dist/components/popover/index.cjs +1 -1
- package/dist/components/popover/index.cjs.map +1 -1
- package/dist/components/popover/index.js +46 -50
- package/dist/components/popover/index.js.map +1 -1
- package/dist/components/search/index.cjs +1 -1
- package/dist/components/search/index.cjs.map +1 -1
- package/dist/components/search/index.js +48 -50
- package/dist/components/search/index.js.map +1 -1
- package/dist/components/select/index.cjs +1 -1
- package/dist/components/select/index.js +3 -3
- package/dist/components/textarea/index.cjs +1 -1
- package/dist/components/textarea/index.cjs.map +1 -1
- package/dist/components/textarea/index.js +25 -21
- package/dist/components/textarea/index.js.map +1 -1
- package/dist/components/toolbar/index.cjs +1 -1
- package/dist/components/toolbar/index.js +1 -1
- package/dist/icons-DaZGJzI0.cjs +2 -0
- package/dist/icons-DaZGJzI0.cjs.map +1 -0
- package/dist/{icons-Bq3diTRm.js → icons-Dj0vEOCB.js} +2 -1
- package/dist/icons-Dj0vEOCB.js.map +1 -0
- package/dist/{index-DwzLUapm.js → index-CgA0NUMD.js} +35 -33
- package/dist/index-CgA0NUMD.js.map +1 -0
- package/dist/index-DE2nzqL5.js +76 -0
- package/dist/index-DE2nzqL5.js.map +1 -0
- package/dist/index-DF8JisYI.cjs +2 -0
- package/dist/index-DF8JisYI.cjs.map +1 -0
- package/dist/index-Dn1v0qm6.cjs +2 -0
- package/dist/index-Dn1v0qm6.cjs.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +30 -9
- package/dist/index.js +2 -2
- package/dist/menu-popover-SiOOwab-.js +74 -0
- package/dist/menu-popover-SiOOwab-.js.map +1 -0
- package/dist/menu-popover-jTTxzTGZ.cjs +2 -0
- package/dist/menu-popover-jTTxzTGZ.cjs.map +1 -0
- package/dist/tokens.json +1 -1
- package/dist/use-touched-B999bBr8.js +20 -0
- package/dist/use-touched-B999bBr8.js.map +1 -0
- package/dist/use-touched-Bq5Gjbpz.cjs +2 -0
- package/dist/use-touched-Bq5Gjbpz.cjs.map +1 -0
- package/package.json +1 -1
- package/dist/assets/index52.css +0 -1
- package/dist/icons-Bq3diTRm.js.map +0 -1
- package/dist/icons-ovA21Oao.cjs +0 -2
- package/dist/icons-ovA21Oao.cjs.map +0 -1
- package/dist/index-BcY9DZZ8.cjs +0 -2
- package/dist/index-BcY9DZZ8.cjs.map +0 -1
- package/dist/index-CjI8oRpS.cjs +0 -2
- package/dist/index-CjI8oRpS.cjs.map +0 -1
- package/dist/index-ClZkChEh.js +0 -73
- package/dist/index-ClZkChEh.js.map +0 -1
- package/dist/index-DwzLUapm.js.map +0 -1
- package/dist/use-touched-DXIJVVzz.js +0 -14
- package/dist/use-touched-DXIJVVzz.js.map +0 -1
- package/dist/use-touched-D_TJ8wDc.cjs +0 -2
- package/dist/use-touched-D_TJ8wDc.cjs.map +0 -1
|
@@ -1,48 +1,120 @@
|
|
|
1
|
-
import { jsxs as
|
|
2
|
-
import { t as
|
|
3
|
-
import { Children as
|
|
4
|
-
import { Button as
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import { jsxs as O, jsx as m } from "react/jsx-runtime";
|
|
2
|
+
import { t as K } from "../../classix-DG18itHa.js";
|
|
3
|
+
import { Children as Q, isValidElement as T, cloneElement as j, useRef as W, useState as U, useCallback as X, useLayoutEffect as Y } from "react";
|
|
4
|
+
import { Button as Z } from "../button/index.js";
|
|
5
|
+
import { a as q, M as ee } from "../../menu-popover-SiOOwab-.js";
|
|
6
|
+
import '../../assets/index34.css';const te = "_controls_awevz_13", ne = "_inline_awevz_43", ie = "_fixed_awevz_48", re = "_measurement_awevz_68", oe = "_adaptive_awevz_93", l = {
|
|
7
|
+
controls: te,
|
|
8
|
+
default: "_default_awevz_28",
|
|
9
|
+
inline: ne,
|
|
10
|
+
fixed: ie,
|
|
11
|
+
measurement: re,
|
|
12
|
+
"non-button-content": "_non-button-content_awevz_79",
|
|
13
|
+
adaptive: oe,
|
|
14
|
+
"overflow-trigger": "_overflow-trigger_awevz_114"
|
|
15
|
+
}, se = {
|
|
11
16
|
primary: 3,
|
|
12
17
|
danger: 2,
|
|
13
18
|
secondary: 1,
|
|
14
19
|
tertiary: 0,
|
|
15
20
|
simple: 0
|
|
16
|
-
},
|
|
17
|
-
default:
|
|
18
|
-
fixed:
|
|
19
|
-
inline:
|
|
20
|
-
},
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
}, ae = {
|
|
22
|
+
default: l.default,
|
|
23
|
+
fixed: l.fixed,
|
|
24
|
+
inline: l.inline
|
|
25
|
+
}, ce = (r) => se[r.props.variant ?? "secondary"];
|
|
26
|
+
function le({
|
|
27
|
+
buttons: r,
|
|
28
|
+
menuAccessibleLabel: f,
|
|
29
|
+
triggerAccessibleLabel: d
|
|
30
|
+
}) {
|
|
31
|
+
const p = r.map((i) => ({
|
|
32
|
+
button: i,
|
|
33
|
+
isDanger: i.props.variant === "danger",
|
|
34
|
+
value: i
|
|
35
|
+
}));
|
|
36
|
+
return /* @__PURE__ */ m(q, { triggerAccessibleLabel: d, "data-component": "overflowmenu", children: ({
|
|
37
|
+
close: i,
|
|
38
|
+
initialFocus: y
|
|
39
|
+
}) => /* @__PURE__ */ m(ee, { actions: p, initialFocus: y, menuAccessibleLabel: f, onSelect: () => i(), usesMenuSemantics: !0 }) });
|
|
40
|
+
}
|
|
41
|
+
const _ = (r, f) => {
|
|
42
|
+
const d = Number.parseFloat(String(r[f]));
|
|
43
|
+
return Number.isFinite(d) ? d : 0;
|
|
44
|
+
}, he = ({
|
|
45
|
+
children: r,
|
|
46
|
+
className: f,
|
|
47
|
+
overflow: d,
|
|
48
|
+
overflowAccessibleLabel: p = "More actions",
|
|
49
|
+
variant: i = "default",
|
|
50
|
+
...y
|
|
25
51
|
}) => {
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
52
|
+
const B = Q.toArray(r), E = [], x = [];
|
|
53
|
+
B.forEach((e) => {
|
|
54
|
+
T(e) && e.type === Z ? E.push(e) : x.push(e);
|
|
29
55
|
});
|
|
30
|
-
const
|
|
31
|
-
button:
|
|
32
|
-
index:
|
|
33
|
-
rank:
|
|
34
|
-
})).sort((
|
|
35
|
-
button:
|
|
36
|
-
index:
|
|
37
|
-
}) =>
|
|
38
|
-
key:
|
|
39
|
-
}))
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
56
|
+
const o = E.map((e, n) => ({
|
|
57
|
+
button: e,
|
|
58
|
+
index: n,
|
|
59
|
+
rank: ce(e)
|
|
60
|
+
})).sort((e, n) => e.rank - n.rank || e.index - n.index).map(({
|
|
61
|
+
button: e,
|
|
62
|
+
index: n
|
|
63
|
+
}) => j(e, {
|
|
64
|
+
key: e.key ?? n
|
|
65
|
+
})), s = i === "fixed" && d === "menu", u = W(null), R = W(null), w = W(null), [k, b] = U(0), a = X(() => {
|
|
66
|
+
var V, A, F;
|
|
67
|
+
if (!s) {
|
|
68
|
+
b(0);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const e = u.current, n = R.current;
|
|
72
|
+
if (!e || !n) return;
|
|
73
|
+
const h = Array.from(n.querySelectorAll('[data-component="button"]')), v = h.at(-1);
|
|
74
|
+
if (!v) return;
|
|
75
|
+
const c = h.slice(0, o.length).map((t) => t.getBoundingClientRect().width);
|
|
76
|
+
if (c.length !== o.length) return;
|
|
77
|
+
const g = getComputedStyle(e), I = _(g, "paddingLeft") + _(g, "paddingRight") + _(g, "borderLeftWidth") + _(g, "borderRightWidth"), P = Number.parseFloat(g.maxWidth), $ = ((V = e.parentElement) == null ? void 0 : V.clientWidth) ?? 0, G = ((A = window.visualViewport) == null ? void 0 : A.width) ?? document.documentElement.clientWidth, L = Math.min(...[P, $, G].filter((t) => Number.isFinite(t) && t > 0));
|
|
78
|
+
if (!Number.isFinite(L)) return;
|
|
79
|
+
const M = Math.max(0, L - I), N = ((F = w.current) == null ? void 0 : F.getBoundingClientRect().width) ?? 0, H = c.reduce((t, J) => t + J, 0);
|
|
80
|
+
if (N + H <= M) {
|
|
81
|
+
b((t) => t === 0 ? t : 0);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
let S = N + v.getBoundingClientRect().width, z = o.length;
|
|
85
|
+
for (let t = c.length - 1; t >= 0 && !(S + c[t] > M); t -= 1)
|
|
86
|
+
S += c[t], z = t;
|
|
87
|
+
b((t) => t === z ? t : z);
|
|
88
|
+
}, [s, o.length]);
|
|
89
|
+
if (Y(() => {
|
|
90
|
+
var n, h, v;
|
|
91
|
+
if (a(), !s) return;
|
|
92
|
+
const e = typeof ResizeObserver > "u" ? void 0 : new ResizeObserver(a);
|
|
93
|
+
return u.current && (e == null || e.observe(u.current)), (n = u.current) != null && n.parentElement && (e == null || e.observe(u.current.parentElement)), w.current && (e == null || e.observe(w.current)), window.addEventListener("resize", a), (h = window.visualViewport) == null || h.addEventListener("resize", a), (v = document.fonts) == null || v.ready.then(a), () => {
|
|
94
|
+
var c;
|
|
95
|
+
e == null || e.disconnect(), window.removeEventListener("resize", a), (c = window.visualViewport) == null || c.removeEventListener("resize", a);
|
|
96
|
+
};
|
|
97
|
+
}, [s, r, a]), B.length === 0)
|
|
98
|
+
return null;
|
|
99
|
+
const C = s ? o.slice(0, k) : [], D = s ? o.slice(k) : o;
|
|
100
|
+
return /* @__PURE__ */ O("div", { "data-dynamic-position": i === "fixed" ? !0 : void 0, className: K(l.controls, ae[i], s && l.adaptive, f), ref: u, ...y, "data-component": "controls", children: [
|
|
101
|
+
s && /* @__PURE__ */ O("div", { "aria-hidden": "true", className: l.measurement, ref: R, children: [
|
|
102
|
+
o.map((e, n) => j(e, {
|
|
103
|
+
"aria-hidden": !0,
|
|
104
|
+
id: void 0,
|
|
105
|
+
key: `measure-${String(e.key ?? n)}`,
|
|
106
|
+
onClick: void 0,
|
|
107
|
+
ref: void 0,
|
|
108
|
+
tabIndex: -1
|
|
109
|
+
})),
|
|
110
|
+
/* @__PURE__ */ m(q, { triggerAccessibleLabel: p, children: null })
|
|
111
|
+
] }),
|
|
112
|
+
x.length > 0 && /* @__PURE__ */ m("span", { className: l["non-button-content"], ref: w, children: x }),
|
|
113
|
+
D,
|
|
114
|
+
C.length > 0 && /* @__PURE__ */ m("span", { className: l["overflow-trigger"], children: /* @__PURE__ */ m(le, { buttons: C, menuAccessibleLabel: p, triggerAccessibleLabel: p }) })
|
|
43
115
|
] });
|
|
44
116
|
};
|
|
45
117
|
export {
|
|
46
|
-
|
|
118
|
+
he as Controls
|
|
47
119
|
};
|
|
48
120
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/components/controls/index.tsx"],"sourcesContent":["import cx from 'classix';\nimport { Children, cloneElement, isValidElement } from 'react';\n\nimport { Button, type ButtonProps } from '../button';\nimport styles from './styles.module.css';\n\nconst buttonVariantOrder = {\n primary: 3,\n danger: 2,\n secondary: 1,\n tertiary: 0,\n simple: 0,\n} satisfies Record<NonNullable<ButtonProps['variant']>, number>;\n\nconst variants = {\n default: styles.default,\n fixed: styles.fixed,\n inline: styles.inline,\n};\n\nexport type ControlsProps = React.HTMLAttributes<HTMLDivElement> & {\n children?: React.ReactNode;\n variant?: keyof typeof variants;\n};\n\nconst getButtonRank = (button: React.ReactElement<ButtonProps>) =>\n buttonVariantOrder[button.props.variant ?? 'secondary'];\n\nexport const Controls = ({ children, className, variant = 'default', ...props }: ControlsProps) => {\n const childArray = Children.toArray(children);\n const buttons: React.ReactElement<ButtonProps>[] = [];\n const nonButtons: React.ReactNode[] = [];\n\n childArray.forEach((child) => {\n if (isValidElement<ButtonProps>(child) && child.type === Button) {\n buttons.push(child);\n } else {\n nonButtons.push(child);\n }\n });\n\n const sortedButtons = buttons\n .map((button, index) => ({ button, index, rank: getButtonRank(button) }))\n .sort((a, b) => a.rank - b.rank || a.index - b.index)\n .map(({ button, index }) =>\n cloneElement(button, {\n key: button.key ?? index,\n })\n );\n\n if (childArray.length === 0) {\n return null;\n }\n\n return (\n <div\n data-dynamic-position={variant === 'fixed' ? true : undefined}\n className={cx(styles.controls, variants[variant], className)}\n {...props}\n >\n {nonButtons && <span>{nonButtons}</span>}\n {sortedButtons}\n </div>\n );\n};\n"],"names":["buttonVariantOrder","primary","danger","secondary","tertiary","simple","variants","default","styles","fixed","inline","getButtonRank","button","props","variant","Controls","children","className","childArray","Children","toArray","buttons","nonButtons","forEach","child","isValidElement","type","Button","push","sortedButtons","map","index","rank","sort","a","b","cloneElement","key","length","undefined","cx","controls","jsx"],"mappings":";;;;;;;;;GAMMA,IAAqB;AAAA,EACzBC,SAAS;AAAA,EACTC,QAAQ;AAAA,EACRC,WAAW;AAAA,EACXC,UAAU;AAAA,EACVC,QAAQ;AACV,GAEMC,IAAW;AAAA,EACfC,SAASC,EAAOD;AAAAA,EAChBE,OAAOD,EAAOC;AAAAA,EACdC,QAAQF,EAAOE;AACjB,GAOMC,IAAgBA,CAACC,MACrBZ,EAAmBY,EAAOC,MAAMC,WAAW,WAAW,GAE3CC,IAAWA,CAAC;AAAA,EAAEC,UAAAA;AAAAA,EAAUC,WAAAA;AAAAA,EAAWH,SAAAA,IAAU;AAAA,EAAW,GAAGD;AAAqB,MAAM;AACjG,QAAMK,IAAaC,EAASC,QAAQJ,CAAQ,GACtCK,IAA6C,CAAA,GAC7CC,IAAgC,CAAA;AAEtCJ,EAAAA,EAAWK,QAASC,CAAAA,MAAU;AAC5B,IAAIC,EAA4BD,CAAK,KAAKA,EAAME,SAASC,IACvDN,EAAQO,KAAKJ,CAAK,IAElBF,EAAWM,KAAKJ,CAAK;AAAA,EAEzB,CAAC;AAED,QAAMK,IAAgBR,EACnBS,IAAI,CAAClB,GAAQmB,OAAW;AAAA,IAAEnB,QAAAA;AAAAA,IAAQmB,OAAAA;AAAAA,IAAOC,MAAMrB,EAAcC,CAAM;AAAA,EAAA,EAAI,EACvEqB,KAAK,CAACC,GAAGC,MAAMD,EAAEF,OAAOG,EAAEH,QAAQE,EAAEH,QAAQI,EAAEJ,KAAK,EACnDD,IAAI,CAAC;AAAA,IAAElB,QAAAA;AAAAA,IAAQmB,OAAAA;AAAAA,EAAAA,MACdK,EAAaxB,GAAQ;AAAA,IACnByB,KAAKzB,EAAOyB,OAAON;AAAAA,EAAAA,CACpB,CACH;AAEF,SAAIb,EAAWoB,WAAW,IACjB,yBAIN,OAAA,EACC,yBAAuBxB,MAAY,UAAU,KAAOyB,QACpD,WAAWC,EAAGhC,EAAOiC,UAAUnC,EAASQ,CAAO,GAAGG,CAAS,GAC3D,GAAIJ,GAAM,kBAAA,YAETS,UAAAA;AAAAA,IAAAA,KAAc,gBAAAoB,EAAC,UAAMpB,UAAAA,EAAAA,CAAW;AAAA,IAChCO;AAAAA,EAAAA,GACH;AAEJ;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/components/controls/index.tsx"],"sourcesContent":["import cx from 'classix';\nimport {\n Children,\n cloneElement,\n isValidElement,\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\n\nimport { Button, type ButtonProps } from '../button';\nimport { type MenuAction, MenuActionList } from '../menu/action-list';\nimport { MenuPopover } from '../menu/menu-popover';\nimport styles from './styles.module.css';\n\nconst buttonVariantOrder = {\n primary: 3,\n danger: 2,\n secondary: 1,\n tertiary: 0,\n simple: 0,\n} satisfies Record<NonNullable<ButtonProps['variant']>, number>;\n\nconst variants = {\n default: styles.default,\n fixed: styles.fixed,\n inline: styles.inline,\n};\n\nexport type ControlsProps = React.HTMLAttributes<HTMLDivElement> & {\n children?: React.ReactNode;\n overflow?: 'menu';\n overflowAccessibleLabel?: string;\n variant?: keyof typeof variants;\n};\n\nconst getButtonRank = (button: React.ReactElement<ButtonProps>) =>\n buttonVariantOrder[button.props.variant ?? 'secondary'];\n\nfunction OverflowMenu({\n buttons,\n menuAccessibleLabel,\n triggerAccessibleLabel,\n}: {\n buttons: React.ReactElement<ButtonProps>[];\n menuAccessibleLabel: string;\n triggerAccessibleLabel: string;\n}) {\n const actions: MenuAction<React.ReactElement<ButtonProps>>[] = buttons.map((button) => ({\n button,\n isDanger: button.props.variant === 'danger',\n value: button,\n }));\n\n return (\n <MenuPopover triggerAccessibleLabel={triggerAccessibleLabel}>\n {({ close, initialFocus }) => (\n <MenuActionList\n actions={actions}\n initialFocus={initialFocus}\n menuAccessibleLabel={menuAccessibleLabel}\n onSelect={() => close()}\n usesMenuSemantics\n />\n )}\n </MenuPopover>\n );\n}\n\nconst numericStyle = (style: CSSStyleDeclaration, property: keyof CSSStyleDeclaration) => {\n const value = Number.parseFloat(String(style[property]));\n return Number.isFinite(value) ? value : 0;\n};\n\nexport const Controls = ({\n children,\n className,\n overflow,\n overflowAccessibleLabel = 'More actions',\n variant = 'default',\n ...props\n}: ControlsProps) => {\n const childArray = Children.toArray(children);\n const buttons: React.ReactElement<ButtonProps>[] = [];\n const nonButtons: React.ReactNode[] = [];\n\n childArray.forEach((child) => {\n if (isValidElement<ButtonProps>(child) && child.type === Button) {\n buttons.push(child);\n } else {\n nonButtons.push(child);\n }\n });\n\n const sortedButtons = buttons\n .map((button, index) => ({ button, index, rank: getButtonRank(button) }))\n .sort((a, b) => a.rank - b.rank || a.index - b.index)\n .map(({ button, index }) =>\n cloneElement(button, {\n key: button.key ?? index,\n })\n );\n\n const adaptive = variant === 'fixed' && overflow === 'menu';\n const controlsRef = useRef<HTMLDivElement>(null);\n const measurementRef = useRef<HTMLDivElement>(null);\n const nonButtonsRef = useRef<HTMLSpanElement>(null);\n const [firstVisibleButton, setFirstVisibleButton] = useState(0);\n\n const updateOverflow = useCallback(() => {\n if (!adaptive) {\n setFirstVisibleButton(0);\n return;\n }\n\n const controls = controlsRef.current;\n const measurement = measurementRef.current;\n if (!controls || !measurement) return;\n\n const measurementButtons = Array.from(\n measurement.querySelectorAll<HTMLElement>('[data-component=\"button\"]')\n );\n const trigger = measurementButtons.at(-1);\n if (!trigger) return;\n\n const buttonWidths = measurementButtons\n .slice(0, sortedButtons.length)\n .map((button) => button.getBoundingClientRect().width);\n if (buttonWidths.length !== sortedButtons.length) return;\n\n const style = getComputedStyle(controls);\n const horizontalChrome =\n numericStyle(style, 'paddingLeft') +\n numericStyle(style, 'paddingRight') +\n numericStyle(style, 'borderLeftWidth') +\n numericStyle(style, 'borderRightWidth');\n const configuredMaxWidth = Number.parseFloat(style.maxWidth);\n const parentWidth = controls.parentElement?.clientWidth ?? 0;\n const viewportWidth = window.visualViewport?.width ?? document.documentElement.clientWidth;\n const outerAvailableWidth = Math.min(\n ...[configuredMaxWidth, parentWidth, viewportWidth].filter(\n (width) => Number.isFinite(width) && width > 0\n )\n );\n if (!Number.isFinite(outerAvailableWidth)) return;\n\n const availableWidth = Math.max(0, outerAvailableWidth - horizontalChrome);\n const prefixWidth = nonButtonsRef.current?.getBoundingClientRect().width ?? 0;\n const actionWidth = buttonWidths.reduce((total, width) => total + width, 0);\n\n if (prefixWidth + actionWidth <= availableWidth) {\n setFirstVisibleButton((current) => (current === 0 ? current : 0));\n return;\n }\n\n let usedWidth = prefixWidth + trigger.getBoundingClientRect().width;\n let nextFirstVisible = sortedButtons.length;\n for (let index = buttonWidths.length - 1; index >= 0; index -= 1) {\n if (usedWidth + buttonWidths[index] > availableWidth) break;\n usedWidth += buttonWidths[index];\n nextFirstVisible = index;\n }\n\n setFirstVisibleButton((current) =>\n current === nextFirstVisible ? current : nextFirstVisible\n );\n }, [adaptive, sortedButtons.length]);\n\n useLayoutEffect(() => {\n updateOverflow();\n\n if (!adaptive) return undefined;\n\n const observer =\n typeof ResizeObserver === 'undefined' ? undefined : new ResizeObserver(updateOverflow);\n if (controlsRef.current) observer?.observe(controlsRef.current);\n if (controlsRef.current?.parentElement) observer?.observe(controlsRef.current.parentElement);\n if (nonButtonsRef.current) observer?.observe(nonButtonsRef.current);\n\n window.addEventListener('resize', updateOverflow);\n window.visualViewport?.addEventListener('resize', updateOverflow);\n void document.fonts?.ready.then(updateOverflow);\n\n return () => {\n observer?.disconnect();\n window.removeEventListener('resize', updateOverflow);\n window.visualViewport?.removeEventListener('resize', updateOverflow);\n };\n }, [adaptive, children, updateOverflow]);\n\n if (childArray.length === 0) {\n return null;\n }\n\n const overflowedButtons = adaptive ? sortedButtons.slice(0, firstVisibleButton) : [];\n const visibleButtons = adaptive ? sortedButtons.slice(firstVisibleButton) : sortedButtons;\n\n return (\n <div\n data-dynamic-position={variant === 'fixed' ? true : undefined}\n className={cx(styles.controls, variants[variant], adaptive && styles.adaptive, className)}\n ref={controlsRef}\n {...props}\n >\n {adaptive && (\n <div\n aria-hidden='true'\n className={styles.measurement}\n ref={measurementRef}\n >\n {sortedButtons.map((button, index) =>\n cloneElement(button, {\n 'aria-hidden': true,\n id: undefined,\n key: `measure-${String(button.key ?? index)}`,\n onClick: undefined,\n ref: undefined,\n tabIndex: -1,\n })\n )}\n <MenuPopover triggerAccessibleLabel={overflowAccessibleLabel}>{null}</MenuPopover>\n </div>\n )}\n {nonButtons.length > 0 && (\n <span\n className={styles['non-button-content']}\n ref={nonButtonsRef}\n >\n {nonButtons}\n </span>\n )}\n {visibleButtons}\n {overflowedButtons.length > 0 && (\n <span className={styles['overflow-trigger']}>\n <OverflowMenu\n buttons={overflowedButtons}\n menuAccessibleLabel={overflowAccessibleLabel}\n triggerAccessibleLabel={overflowAccessibleLabel}\n />\n </span>\n )}\n </div>\n );\n};\n"],"names":["buttonVariantOrder","primary","danger","secondary","tertiary","simple","variants","default","styles","fixed","inline","getButtonRank","button","props","variant","OverflowMenu","buttons","menuAccessibleLabel","triggerAccessibleLabel","actions","map","isDanger","value","jsx","MenuPopover","close","initialFocus","MenuActionList","numericStyle","style","property","Number","parseFloat","String","isFinite","Controls","children","className","overflow","overflowAccessibleLabel","childArray","Children","toArray","nonButtons","forEach","child","isValidElement","type","Button","push","sortedButtons","index","rank","sort","a","b","cloneElement","key","adaptive","controlsRef","useRef","measurementRef","nonButtonsRef","firstVisibleButton","setFirstVisibleButton","useState","updateOverflow","useCallback","controls","current","measurement","measurementButtons","Array","from","querySelectorAll","trigger","at","buttonWidths","slice","length","getBoundingClientRect","width","getComputedStyle","horizontalChrome","configuredMaxWidth","maxWidth","parentWidth","parentElement","clientWidth","viewportWidth","window","visualViewport","document","documentElement","outerAvailableWidth","Math","min","filter","availableWidth","max","prefixWidth","actionWidth","reduce","total","usedWidth","nextFirstVisible","useLayoutEffect","observer","ResizeObserver","undefined","observe","addEventListener","fonts","ready","then","disconnect","removeEventListener","overflowedButtons","visibleButtons","jsxs","cx","id","onClick","ref","tabIndex"],"mappings":";;;;;;;;;;;;;;GAgBMA,KAAqB;AAAA,EACzBC,SAAS;AAAA,EACTC,QAAQ;AAAA,EACRC,WAAW;AAAA,EACXC,UAAU;AAAA,EACVC,QAAQ;AACV,GAEMC,KAAW;AAAA,EACfC,SAASC,EAAOD;AAAAA,EAChBE,OAAOD,EAAOC;AAAAA,EACdC,QAAQF,EAAOE;AACjB,GASMC,KAAgBA,CAACC,MACrBZ,GAAmBY,EAAOC,MAAMC,WAAW,WAAW;AAExD,SAASC,GAAa;AAAA,EACpBC,SAAAA;AAAAA,EACAC,qBAAAA;AAAAA,EACAC,wBAAAA;AAKF,GAAG;AACD,QAAMC,IAAyDH,EAAQI,IAAKR,CAAAA,OAAY;AAAA,IACtFA,QAAAA;AAAAA,IACAS,UAAUT,EAAOC,MAAMC,YAAY;AAAA,IACnCQ,OAAOV;AAAAA,EAAAA,EACP;AAEF,SACE,gBAAAW,EAACC,GAAA,EAAY,wBAAAN,GAA+C,kBAAA,gBACzD,UAAA,CAAC;AAAA,IAAEO,OAAAA;AAAAA,IAAOC,cAAAA;AAAAA,EAAAA,MACT,gBAAAH,EAACI,IAAA,EACC,SAAAR,GACA,cAAAO,GACA,qBAAAT,GACA,UAAU,MAAMQ,EAAAA,GAChB,mBAAiB,GAAA,CAAA,EAAA,CAGvB;AAEJ;AAEA,MAAMG,IAAeA,CAACC,GAA4BC,MAAwC;AACxF,QAAMR,IAAQS,OAAOC,WAAWC,OAAOJ,EAAMC,CAAQ,CAAC,CAAC;AACvD,SAAOC,OAAOG,SAASZ,CAAK,IAAIA,IAAQ;AAC1C,GAEaa,KAAWA,CAAC;AAAA,EACvBC,UAAAA;AAAAA,EACAC,WAAAA;AAAAA,EACAC,UAAAA;AAAAA,EACAC,yBAAAA,IAA0B;AAAA,EAC1BzB,SAAAA,IAAU;AAAA,EACV,GAAGD;AACU,MAAM;AACnB,QAAM2B,IAAaC,EAASC,QAAQN,CAAQ,GACtCpB,IAA6C,CAAA,GAC7C2B,IAAgC,CAAA;AAEtCH,EAAAA,EAAWI,QAASC,CAAAA,MAAU;AAC5B,IAAIC,EAA4BD,CAAK,KAAKA,EAAME,SAASC,IACvDhC,EAAQiC,KAAKJ,CAAK,IAElBF,EAAWM,KAAKJ,CAAK;AAAA,EAEzB,CAAC;AAED,QAAMK,IAAgBlC,EACnBI,IAAI,CAACR,GAAQuC,OAAW;AAAA,IAAEvC,QAAAA;AAAAA,IAAQuC,OAAAA;AAAAA,IAAOC,MAAMzC,GAAcC,CAAM;AAAA,EAAA,EAAI,EACvEyC,KAAK,CAACC,GAAGC,MAAMD,EAAEF,OAAOG,EAAEH,QAAQE,EAAEH,QAAQI,EAAEJ,KAAK,EACnD/B,IAAI,CAAC;AAAA,IAAER,QAAAA;AAAAA,IAAQuC,OAAAA;AAAAA,EAAAA,MACdK,EAAa5C,GAAQ;AAAA,IACnB6C,KAAK7C,EAAO6C,OAAON;AAAAA,EAAAA,CACpB,CACH,GAEIO,IAAW5C,MAAY,WAAWwB,MAAa,QAC/CqB,IAAcC,EAAuB,IAAI,GACzCC,IAAiBD,EAAuB,IAAI,GAC5CE,IAAgBF,EAAwB,IAAI,GAC5C,CAACG,GAAoBC,CAAqB,IAAIC,EAAS,CAAC,GAExDC,IAAiBC,EAAY,MAAM;;AACvC,QAAI,CAACT,GAAU;AACbM,MAAAA,EAAsB,CAAC;AACvB;AAAA,IACF;AAEA,UAAMI,IAAWT,EAAYU,SACvBC,IAAcT,EAAeQ;AACnC,QAAI,CAACD,KAAY,CAACE,EAAa;AAE/B,UAAMC,IAAqBC,MAAMC,KAC/BH,EAAYI,iBAA8B,2BAA2B,CACvE,GACMC,IAAUJ,EAAmBK,GAAG,EAAE;AACxC,QAAI,CAACD,EAAS;AAEd,UAAME,IAAeN,EAClBO,MAAM,GAAG5B,EAAc6B,MAAM,EAC7B3D,IAAKR,CAAAA,MAAWA,EAAOoE,sBAAAA,EAAwBC,KAAK;AACvD,QAAIJ,EAAaE,WAAW7B,EAAc6B,OAAQ;AAElD,UAAMlD,IAAQqD,iBAAiBd,CAAQ,GACjCe,IACJvD,EAAaC,GAAO,aAAa,IACjCD,EAAaC,GAAO,cAAc,IAClCD,EAAaC,GAAO,iBAAiB,IACrCD,EAAaC,GAAO,kBAAkB,GAClCuD,IAAqBrD,OAAOC,WAAWH,EAAMwD,QAAQ,GACrDC,MAAclB,IAAAA,EAASmB,kBAATnB,gBAAAA,EAAwBoB,gBAAe,GACrDC,MAAgBC,IAAAA,OAAOC,mBAAPD,gBAAAA,EAAuBT,UAASW,SAASC,gBAAgBL,aACzEM,IAAsBC,KAAKC,IAC/B,GAAG,CAACZ,GAAoBE,GAAaG,CAAa,EAAEQ,OACjDhB,OAAUlD,OAAOG,SAAS+C,CAAK,KAAKA,IAAQ,CAC/C,CACF;AACA,QAAI,CAAClD,OAAOG,SAAS4D,CAAmB,EAAG;AAE3C,UAAMI,IAAiBH,KAAKI,IAAI,GAAGL,IAAsBX,CAAgB,GACnEiB,MAActC,IAAAA,EAAcO,YAAdP,gBAAAA,EAAuBkB,wBAAwBC,UAAS,GACtEoB,IAAcxB,EAAayB,OAAO,CAACC,GAAOtB,MAAUsB,IAAQtB,GAAO,CAAC;AAE1E,QAAImB,IAAcC,KAAeH,GAAgB;AAC/ClC,MAAAA,EAAuBK,CAAAA,MAAaA,MAAY,IAAIA,IAAU,CAAE;AAChE;AAAA,IACF;AAEA,QAAImC,IAAYJ,IAAczB,EAAQK,sBAAAA,EAAwBC,OAC1DwB,IAAmBvD,EAAc6B;AACrC,aAAS5B,IAAQ0B,EAAaE,SAAS,GAAG5B,KAAS,KAC7CqD,EAAAA,IAAY3B,EAAa1B,CAAK,IAAI+C,IADc/C,KAAS;AAE7DqD,MAAAA,KAAa3B,EAAa1B,CAAK,GAC/BsD,IAAmBtD;AAGrBa,IAAAA,EAAuBK,CAAAA,MACrBA,MAAYoC,IAAmBpC,IAAUoC,CAC3C;AAAA,EACF,GAAG,CAAC/C,GAAUR,EAAc6B,MAAM,CAAC;AAwBnC,MAtBA2B,EAAgB,MAAM;;AAGpB,QAFAxC,EAAAA,GAEI,CAACR,EAAU;AAEf,UAAMiD,IACJ,OAAOC,iBAAmB,MAAcC,SAAY,IAAID,eAAe1C,CAAc;AACvF,WAAIP,EAAYU,YAASsC,KAAAA,QAAAA,EAAUG,QAAQnD,EAAYU,YACnDV,IAAAA,EAAYU,YAAZV,QAAAA,EAAqB4B,iCAAyBuB,QAAQnD,EAAYU,QAAQkB,iBAC1EzB,EAAcO,YAASsC,KAAAA,QAAAA,EAAUG,QAAQhD,EAAcO,WAE3DqB,OAAOqB,iBAAiB,UAAU7C,CAAc,IAChDwB,IAAAA,OAAOC,mBAAPD,QAAAA,EAAuBqB,iBAAiB,UAAU7C,KAC7C0B,IAAAA,SAASoB,UAATpB,QAAAA,EAAgBqB,MAAMC,KAAKhD,IAEzB,MAAM;;AACXyC,MAAAA,KAAAA,QAAAA,EAAUQ,cACVzB,OAAO0B,oBAAoB,UAAUlD,CAAc,IACnDwB,IAAAA,OAAOC,mBAAPD,QAAAA,EAAuB0B,oBAAoB,UAAUlD;AAAAA,IACvD;AAAA,EACF,GAAG,CAACR,GAAUtB,GAAU8B,CAAc,CAAC,GAEnC1B,EAAWuC,WAAW;AACxB,WAAO;AAGT,QAAMsC,IAAoB3D,IAAWR,EAAc4B,MAAM,GAAGf,CAAkB,IAAI,CAAA,GAC5EuD,IAAiB5D,IAAWR,EAAc4B,MAAMf,CAAkB,IAAIb;AAE5E,SACE,gBAAAqE,EAAC,OAAA,EACC,yBAAuBzG,MAAY,UAAU,KAAO+F,QACpD,WAAWW,EAAGhH,EAAO4D,UAAU9D,GAASQ,CAAO,GAAG4C,KAAYlD,EAAOkD,UAAUrB,CAAS,GACxF,KAAKsB,GACL,GAAI9C,GAAM,kBAAA,YAET6C,UAAAA;AAAAA,IAAAA,KACC,gBAAA6D,EAAC,SACC,eAAY,QACZ,WAAW/G,EAAO8D,aAClB,KAAKT,GAEJX,UAAAA;AAAAA,MAAAA,EAAc9B,IAAI,CAACR,GAAQuC,MAC1BK,EAAa5C,GAAQ;AAAA,QACnB,eAAe;AAAA,QACf6G,IAAIZ;AAAAA,QACJpD,KAAK,WAAWxB,OAAOrB,EAAO6C,OAAON,CAAK,CAAC;AAAA,QAC3CuE,SAASb;AAAAA,QACTc,KAAKd;AAAAA,QACLe,UAAU;AAAA,MAAA,CACX,CACH;AAAA,MACA,gBAAArG,EAACC,GAAA,EAAY,wBAAwBe,GAA0B,UAAA,KAAA,CAAK;AAAA,IAAA,GACtE;AAAA,IAEDI,EAAWoC,SAAS,KACnB,gBAAAxD,EAAC,QAAA,EACC,WAAWf,EAAO,oBAAoB,GACtC,KAAKsD,GAEJnB,UAAAA,EAAAA,CACH;AAAA,IAED2E;AAAAA,IACAD,EAAkBtC,SAAS,KAC1B,gBAAAxD,EAAC,QAAA,EAAK,WAAWf,EAAO,kBAAkB,GACxC,UAAA,gBAAAe,EAACR,MACC,SAASsG,GACT,qBAAqB9E,GACrB,wBAAwBA,GAAwB,EAAA,CAEpD;AAAA,EAAA,GAEJ;AAEJ;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../../assets/
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../../assets/index35.css');const d=require("react/jsx-runtime"),tt=require("../../classix-5H4IWnMA.cjs"),c=require("react"),mt=require("../button/index.cjs"),pt=require("../figure/index.cjs"),gt=require("../icon/index.cjs"),S=10,W=.1,Ot=.92,m=(h,x,R)=>Math.min(R,Math.max(x,h)),St=h=>new Promise((x,R)=>{const f=URL.createObjectURL(h),a=new globalThis.Image;a.onload=()=>{URL.revokeObjectURL(f),x(a)},a.onerror=()=>{URL.revokeObjectURL(f),R(new Error("croppable-image-load-failed"))},a.src=f}),Ut=async({file:h,fill:x,transform:R,viewport:f})=>{const a=await St(h),U=f.width/a.naturalWidth,M=f.height/a.naturalHeight,y=Math.max(U,M),H=a.naturalWidth*y,E=a.naturalHeight*y,Q=x==="width"?Math.max(W,U/y):x==="height"?Math.max(W,M/y):W,j=m(R.zoom,Q,S),w=y*j,b=H*j,N=E*j,p=(f.width-b)/2+R.offset.x,L=(f.height-N)/2+R.offset.y,I=m(-p/w,0,a.naturalWidth),T=m(-L/w,0,a.naturalHeight),v=m(f.width/w,1,Math.max(1,a.naturalWidth-I)),s=m(f.height/w,1,Math.max(1,a.naturalHeight-T)),_=document.createElement("canvas"),u=_.getContext("2d");if(!u)throw new Error("croppable-image-context-missing");_.width=Math.max(1,Math.round(v)),_.height=Math.max(1,Math.round(s)),u.drawImage(a,I,T,v,s,0,0,_.width,_.height);const P=h.type.startsWith("image/")?h.type:"image/jpeg",Y=await new Promise(q=>{_.toBlob(q,P,Ot)});if(!Y)throw new Error("croppable-image-export-failed");return new globalThis.File([Y],h.name,{lastModified:Date.now(),type:Y.type||P})},It="_croppable_1rdsr_1",Pt="_empty_1rdsr_14",Yt="_media_1rdsr_22",Xt="_overlay_1rdsr_33",At="_viewport_1rdsr_41",Dt="_draggable_1rdsr_53",Wt="_dragging_1rdsr_57",Ht="_inner_1rdsr_61",Zt="_standalone_1rdsr_77",z={croppable:It,empty:Pt,media:Yt,overlay:Xt,viewport:At,draggable:Dt,dragging:Wt,inner:Ht,standalone:Zt},kt=192,B={offset:{x:0,y:0},zoom:1},xt="Select image",Bt=({children:h,fill:x="none",height:R,image:f,label:a,onCroppableChange:U,onFileChange:M,onImageChange:y,onTransformChange:H,transform:E,standalone:Q})=>{const j=c.useRef(null),w=c.useRef(null),b=c.useRef(null),N=c.useRef(null),p=c.useRef(y),L=c.useRef(null),I=c.useRef(null),T=c.useRef(null),v=c.useRef(new Map),s=c.useRef(B),_=c.useRef(null),[u,P]=c.useState(null),[Y,q]=c.useState(null),[et,V]=c.useState(!1),[wt,nt]=c.useState(B),[F,rt]=c.useState(null),[g,yt]=c.useState({width:0,height:0}),Z=(()=>{const t=g.width,n=g.height;if(!t||!n)return{width:0,height:0,minZoom:W};if(!u)return{width:t,height:n,minZoom:W};const r=t/u.width,e=n/u.height,o=Math.max(r,e),i=x==="width"?r/o:x==="height"?e/o:0;return{width:u.width*o,height:u.height*o,minZoom:Math.max(W,i)}})(),X=Z.minZoom,k=E??wt,A=m(k.zoom,X,S),$=Y??f??null,ot=!h&&!!f&&!Y&&!F,G=!ot,ct=h??($?d.jsx("img",{alt:"",draggable:!1,onLoad:t=>{const n=t.currentTarget;n.naturalWidth&&n.naturalHeight&&P({width:n.naturalWidth,height:n.naturalHeight})},src:$}):null),D=ct==null,J=(t,n)=>{const{maxX:r,maxY:e}=it(n);return{x:m(t.x,-r,r),y:m(t.y,-e,e)}},st=(t,n)=>{const r=_.current;if(!r)return null;const e=r.getBoundingClientRect(),o=t-e.left-e.width/2,i=n-e.top-e.height/2;return{x:o,y:i}},bt=(t,n,r,e)=>{const o=m(n,X,S),i=m(r,X,S);if(o===0)return t;const l=i/o;return{x:(1-l)*e.x+l*t.x,y:(1-l)*e.y+l*t.y}},_t=(t,n,r)=>{const e=s.current.zoom,o=m(t,X,S),i=s.current.offset,l=r?bt(i,e,o,r):n,O=J(l,o);s.current={zoom:o,offset:O},E||nt({zoom:o,offset:O}),H==null||H({zoom:o,offset:O})},K=(t,n,r)=>{I.current={zoom:t,offset:n,anchor:r??null},w.current==null&&(w.current=window.requestAnimationFrame(()=>{w.current=null;const e=I.current;I.current=null;const o=(e==null?void 0:e.zoom)??s.current.zoom,i=(e==null?void 0:e.offset)??s.current.offset,l=(e==null?void 0:e.anchor)??null;_t(o,i,l)}))},zt=t=>{if(D||!G)return;const n=t.ctrlKey?.001:25e-5,r=s.current.zoom*Math.exp(-t.deltaY*n),e=st(t.clientX,t.clientY);K(r,s.current.offset,e)},it=t=>{const n=g.width,r=g.height;if(!n||!r)return{maxX:0,maxY:0};const e=m(t,X,S),o=Z.width*e,i=Z.height*e,l=Math.max(0,(o-n)/2),O=Math.max(0,(i-r)/2);return{maxX:l,maxY:O}},Rt=t=>{var o;const n=t.target,r=((o=n.files)==null?void 0:o[0])??null;if(L.current&&(URL.revokeObjectURL(L.current),L.current=null),!r){q(null),rt(null),M==null||M(null),n.value="";return}const e=URL.createObjectURL(r);L.current=e,q(e),P(null),rt(r),K(B.zoom,B.offset),s.current=B,M==null||M(r),n.value=""},Mt=t=>{if(!(D||!G||t.pointerType==="mouse"&&t.button!==0)){if(t.currentTarget.setPointerCapture(t.pointerId),t.pointerType==="touch"){const n=v.current;if(n.set(t.pointerId,{x:t.clientX,y:t.clientY}),n.size===2){b.current=null,j.current=null,V(!1);const[r,e]=Array.from(n.values());T.current=Math.hypot(r.x-e.x,r.y-e.y);return}}j.current=t.pointerId,b.current={x:t.clientX,y:t.clientY,originX:s.current.offset.x,originY:s.current.offset.y}}},Et=t=>{if(D||!G)return;if(t.pointerType==="touch"){const o=v.current;if(!o.has(t.pointerId))return;if(o.set(t.pointerId,{x:t.clientX,y:t.clientY}),o.size===2){const[i,l]=Array.from(o.values()),O=i.x-l.x,jt=i.y-l.y,ht=Math.hypot(O,jt),ft={x:(i.x+l.x)/2,y:(i.y+l.y)/2};if(T.current){const Lt=ht/T.current,Tt=s.current.zoom*Lt,vt=st(ft.x,ft.y);K(Tt,s.current.offset,vt)}T.current=ht;return}}if(j.current!==t.pointerId||!b.current||!C)return;const n=t.clientX-b.current.x,r=t.clientY-b.current.y,e=Math.abs(n)+Math.abs(r);!et&&e>2&&V(!0),!(e<=1)&&K(s.current.zoom,{x:b.current.originX+n,y:b.current.originY+r})},at=t=>{t.pointerType==="touch"&&(v.current.delete(t.pointerId),v.current.size<2&&(T.current=null)),j.current===t.pointerId&&(j.current=null,b.current=null,V(!1))};c.useEffect(()=>{if(!E)return;const t=m(E.zoom,X,S);s.current={zoom:t,offset:J(E.offset,t)}},[E,g.width,g.height,u==null?void 0:u.width,u==null?void 0:u.height]),c.useEffect(()=>()=>{L.current&&URL.revokeObjectURL(L.current)},[]),c.useEffect(()=>{const t=_.current;if(!t)return;const n=()=>{const o=t.getBoundingClientRect();yt(i=>i.width===o.width&&i.height===o.height?i:{width:o.width,height:o.height}),U&&U(o)};n();const r=()=>n();if(window.addEventListener("scroll",r,!0),typeof ResizeObserver>"u"){const o=()=>n();return window.addEventListener("resize",o),()=>{window.removeEventListener("resize",o),window.removeEventListener("scroll",r,!0)}}const e=new ResizeObserver(()=>n());return e.observe(t),()=>{e.disconnect(),window.removeEventListener("scroll",r,!0)}},[U]),c.useEffect(()=>{if(E)return;const t=s.current.offset,n=J(t,A);t.x===n.x&&t.y===n.y||(s.current={zoom:s.current.zoom,offset:n},nt(r=>({...r,offset:n})))},[A,u,g.width,g.height]),c.useEffect(()=>{$||P(null)},[$]),c.useEffect(()=>{p.current=y},[y]),c.useEffect(()=>{var r;if(!y)return;if(!F||!g.width||!g.height||h){(r=p.current)==null||r.call(p,null);return}let t=!0;const n=window.setTimeout(()=>{Ut({file:F,fill:x,transform:{zoom:A,offset:k.offset},viewport:g}).then(e=>{var o;t&&((o=p.current)==null||o.call(p,e))}).catch(()=>{var e;t&&((e=p.current)==null||e.call(p,null))})},75);return()=>{t=!1,window.clearTimeout(n)}},[h,A,k.offset,x,F,g]),c.useEffect(()=>()=>{w.current!=null&&(window.cancelAnimationFrame(w.current),w.current=null)},[]);const ut=it(A),C=!D&&G&&(ut.maxX>0||ut.maxY>0),lt=()=>{var t;return(t=N.current)==null?void 0:t.click()},dt=t=>{t.preventDefault(),t.stopPropagation(),lt()};return d.jsxs("div",{className:tt.t(z.croppable,Q&&z.standalone),onClick:()=>{D&<()},"data-component":"croppable",children:[d.jsx("input",{accept:"image/*",onChange:Rt,ref:N,type:"file"}),d.jsx("div",{className:z.viewport,ref:_,onDragStart:t=>t.preventDefault(),onPointerDown:Mt,onPointerMove:Et,onPointerUp:at,onPointerCancel:at,onWheel:zt,style:{"--croppable-height":`${R??kt}px`,"--croppable-zoom":A,"--croppable-x":`${k.offset.x}px`,"--croppable-y":`${k.offset.y}px`,...u?{"--croppable-image-width":`${Z.width}px`,"--croppable-image-height":`${Z.height}px`}:null},children:D?d.jsxs("div",{className:z.empty,children:[d.jsx(pt.Figure,{children:d.jsx(gt.Icon,{name:"image",size:"large"})}),d.jsx(mt.Button,{onClick:dt,children:a??xt})]}):d.jsxs("div",{className:tt.t(z.media,C&&z.draggable,C&&et&&z.dragging),children:[d.jsx("div",{className:tt.t(z.inner),children:ct}),ot&&d.jsx("div",{className:z.overlay,children:d.jsxs("div",{className:z.empty,children:[d.jsx(pt.Figure,{children:d.jsx(gt.Icon,{name:"image",size:"large"})}),d.jsx(mt.Button,{onClick:dt,children:a??xt})]})})]})})]})};exports.Croppable=Bt;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -4,7 +4,7 @@ import { useRef as x, useState as Z, useEffect as U } from "react";
|
|
|
4
4
|
import { Button as wt } from "../button/index.js";
|
|
5
5
|
import { Figure as xt } from "../figure/index.js";
|
|
6
6
|
import { Icon as yt } from "../icon/index.js";
|
|
7
|
-
import '../../assets/
|
|
7
|
+
import '../../assets/index35.css';const P = 10, j = 0.1, Yt = 0.92, h = (u, p, _) => Math.min(_, Math.max(p, u)), Xt = (u) => new Promise((p, _) => {
|
|
8
8
|
const d = URL.createObjectURL(u), i = new globalThis.Image();
|
|
9
9
|
i.onload = () => {
|
|
10
10
|
URL.revokeObjectURL(d), p(i);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../../assets/
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../../assets/index36.css');const e=require("react/jsx-runtime"),p=require("../../classix-5H4IWnMA.cjs"),a=require("react"),h=require("../button/index.cjs"),P=require("../icon/index.cjs"),T="_dialog_1ojxw_3",E="_close_1ojxw_24",F="_structured_1ojxw_32",M="_header_1ojxw_38",S="_content_1ojxw_49",X="_controls_1ojxw_57",Y="_fullscreen_1ojxw_77",s={dialog:T,close:E,structured:F,header:M,content:S,controls:X,fullscreen:Y},w=c=>a.Children.toArray(c).some(o=>a.isValidElement(o)?o.type===h.Button&&o.props.variant==="danger"?!0:w(o.props.children):!1),A=({children:c,className:o,controls:l,fullscreen:f=!1,header:_,onCancel:i,onClick:u,onClose:d,open:n=!1,setOpen:r,...B})=>{const g=a.useRef(null),x=w(l),j=f||_!=null||l!=null;a.useEffect(()=>{const t=g.current;t&&(n&&!t.open?t.showModal():!n&&t.open&&t.close())},[n]);const b=t=>{i==null||i(t),!(t.defaultPrevented||!r)&&(t.preventDefault(),r(!1))},q=t=>{if(u==null||u(t),x||t.defaultPrevented||t.target!==t.currentTarget||!r)return;const{bottom:N,left:R,right:D,top:k}=t.currentTarget.getBoundingClientRect();(t.clientX<R||t.clientX>D||t.clientY<k||t.clientY>N)&&r(!1)},y=t=>{d==null||d(t),n&&(r==null||r(!1))},m=r&&!x?e.jsx(h.Button,{"aria-label":"Close dialog",className:s.close,onClick:()=>r(!1),variant:"simple",children:e.jsx(P.Icon,{name:"x"})}):null;return e.jsx("dialog",{className:p.t(s.dialog,j&&s.structured,f&&s.fullscreen,o),onCancel:b,onClick:q,onClose:y,ref:g,...B,"data-component":"dialog",children:j?e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:s.header,children:[_,m]}),e.jsx("div",{className:s.content,children:c}),l!=null&&e.jsx("div",{className:s.controls,children:l})]}):e.jsxs(e.Fragment,{children:[m,c]})})};exports.Dialog=A;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -3,7 +3,7 @@ import { t as T } from "../../classix-DG18itHa.js";
|
|
|
3
3
|
import w, { useRef as X, useEffect as Y } from "react";
|
|
4
4
|
import { Button as p } from "../button/index.js";
|
|
5
5
|
import { Icon as A } from "../icon/index.js";
|
|
6
|
-
import '../../assets/
|
|
6
|
+
import '../../assets/index36.css';const F = "_dialog_1ojxw_3", I = "_close_1ojxw_24", M = "_structured_1ojxw_32", V = "_header_1ojxw_38", q = "_content_1ojxw_49", z = "_controls_1ojxw_57", G = "_fullscreen_1ojxw_77", l = {
|
|
7
7
|
dialog: F,
|
|
8
8
|
close: I,
|
|
9
9
|
structured: M,
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../../assets/
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../../assets/index37.css');const l=require("react/jsx-runtime"),g=require("../../classix-5H4IWnMA.cjs"),a=require("react"),F=require("../button/index.cjs"),de=require("../../icons-DaZGJzI0.cjs"),X=require("../../index-DF8JisYI.cjs"),pe=require("../list/index.cjs"),E=require("../../index-Dn1v0qm6.cjs");function V(t){return typeof t=="string"||typeof t=="number"?String(t):Array.isArray(t)?t.map(V).join(" "):a.isValidElement(t)?V(t.props.children):""}function fe(t){return a.isValidElement(t)&&t.type==="option"}function me(t){return a.isValidElement(t)&&t.type==="optgroup"}function be(t){return a.isValidElement(t)&&t.type===a.Fragment}function _e(t){return a.isValidElement(t)&&t.type===E.Select}function W(t,i,r=!1){const s=[];return a.Children.forEach(t,n=>{if(be(n))s.push(...W(n.props.children,i,r));else if(fe(n)){const c=V(n.props.children).trim(),f=n.props.value!=null?String(n.props.value):c;s.push({disabled:r||!!n.props.disabled,groupLabel:i,hidden:!!n.props.hidden,isPlaceholder:!!(n.props.hidden&&f===""),label:n.props.children,selected:!!n.props.selected,text:c,value:f})}else me(n)&&s.push(...W(n.props.children,n.props.label,r||!!n.props.disabled))}),s}function he(t){const i=t.trim();if(!i)return null;const s=[.../[*?]/.test(i)?i:`*${i}*`].map(n=>n==="*"?".*":n==="?"?".":n.replace(/[|\\{}()[\]^$+.,]/g,"\\$&")).join("");return new RegExp(`^${s}$`,"i")}function ye(t,i){const r=he(i),s=t.filter(n=>!n.hidden&&!n.isPlaceholder);return r?s.filter(n=>r.test([n.groupLabel,n.text,n.value].filter(Boolean).join(" "))):s}function xe(t,i){return t.find(r=>r.value===i)??t.find(r=>r.isPlaceholder)??t[0]}function ge(t,i,r){var s,n;return i!=null?String(i):r!=null?String(r):((s=t.find(c=>c.selected))==null?void 0:s.value)??((n=t[0])==null?void 0:n.value)??""}function ve(t){if(_e(t)){const{children:i,placeholder:r,...s}=t.props;return{children:l.jsxs(l.Fragment,{children:[r&&l.jsx("option",{hidden:!0,value:"",children:r}),i]}),props:s}}return{children:t.props.children,props:t.props}}const je="_combobox_1bqyf_3",qe="_dropdown_1bqyf_27",we="_empty_1bqyf_30",Se="_group_1bqyf_31",Ne="_placeholder_1bqyf_32",Ce="_filter_1bqyf_40",Ee="_native_1bqyf_52",Ve="_option_1bqyf_62",Le="_options_1bqyf_84",Re="_panel_1bqyf_108",$e="_selected_1bqyf_132",Be="_text_1bqyf_136",Ie="_trigger_1bqyf_144",Pe="_minimal_1bqyf_180",De="_inline_1bqyf_235",ke="_label_1bqyf_267",o={combobox:je,"combobox-input":"_combobox-input_1bqyf_12",dropdown:qe,empty:we,group:Se,placeholder:Ne,filter:Ce,native:Ee,option:Ve,options:Le,panel:Re,selected:$e,text:Be,trigger:Ie,minimal:Pe,inline:De,label:ke,"inline-field":"_inline-field_1bqyf_273"};function Y(t,i){return{"--icon-svg":de.iconSVG(t).replace("currentColor",i)}}const Fe=({children:t,className:i,combobox:r=!1,createOption:s,emptyLabel:n="No matches found",label:c,renderOption:f,searchPlaceholder:L="Filter",selectedItems:Z,variant:h="default",...ee})=>{const R=ve(t),{defaultValue:te,onChange:$,value:B,...ne}=R.props,v=E.sanitizeSelectProps(ne),{className:re,...se}=v,M=a.useRef(null),Q=a.useRef(null),j=a.useId(),z=a.useRef(null),m=a.useRef(null),y=W(R.children),x=B!=null,I=ge(y,B,te),[P,D]=a.useState(()=>I),[u,p]=a.useState(!1),[q,w]=a.useState(""),S=x?String(B):P,O={default:E.resolveColor("--colors-semantic-content-secondary"),white:E.resolveColor("--color-white","white")},T=h==="minimal"?O.white:O.default,N=xe(y,S),le=Y("chevron",T),oe=Y("search",T),A=ye(y,q),b=q.trim(),C=!!(r&&s&&b&&s.isValid(b)),ie=c&&h==="inline"?X.formatInlineLabel(c):c,G=e=>e?(f==null?void 0:f({groupLabel:e.groupLabel,isSelected:e.value===S,label:e.label,text:e.text,value:e.value}))??e.label:"Select an option";a.useEffect(()=>{!x&&!y.some(e=>e.value===P)&&D(I)},[I,P,x,y]),a.useEffect(()=>{var e;if(!u){w("");return}(e=m.current)==null||e.focus()},[u]),a.useEffect(()=>{if(!u)return;const e=d=>{var _;(_=Q.current)!=null&&_.contains(d.target)||p(!1)};return document.addEventListener("mousedown",e),()=>{document.removeEventListener("mousedown",e)}},[u]);const ae=e=>{x||D(e.target.value),$==null||$(e)},k=()=>{var e;p(!1),r||(e=M.current)==null||e.focus()},K=()=>{var e;w(""),p(!0),(e=m.current)==null||e.focus()},H=()=>{!s||!C||(s.onCreate(b),K())},ce=e=>{var U;x||D(e);const d=z.current;if(!d){k();return}const _=(U=Object.getOwnPropertyDescriptor(HTMLSelectElement.prototype,"value"))==null?void 0:U.set;_==null||_.call(d,e),d.dispatchEvent(new Event("change",{bubbles:!0})),r?K():k()},ue=e=>{e.key==="Escape"&&k(),e.key==="Enter"&&e.target===m.current&&C&&(e.preventDefault(),H())},J=l.jsxs("div",{className:g.t(o.dropdown,h==="inline"&&o.inline,h==="minimal"&&o.minimal,i),onKeyDown:ue,ref:Q,...ee,children:[l.jsx("select",{...se,"aria-hidden":"true",className:g.t(o.native,re),onChange:ae,ref:z,tabIndex:-1,value:S,children:R.children}),r?l.jsxs("div",{className:o.combobox,onClick:()=>{var e;return(e=m.current)==null?void 0:e.focus()},children:[Z,l.jsx("input",{"aria-autocomplete":"list","aria-expanded":u,"aria-label":v["aria-label"]??c??L,className:o["combobox-input"],disabled:v.disabled,onChange:e=>{w(e.target.value),p(!0)},onClick:()=>p(!0),onFocus:()=>p(!0),placeholder:L||void 0,ref:m,role:"combobox",type:"text",value:q})]}):l.jsx(F.Button,{"aria-expanded":u,"aria-haspopup":"dialog","aria-labelledby":c?`${j} ${j}-value`:void 0,className:g.t(o.trigger,(N==null?void 0:N.isPlaceholder)&&o.placeholder),"data-open":u?"true":void 0,disabled:v.disabled,onClick:()=>p(e=>!e),ref:M,style:le,variant:"tertiary",children:l.jsx("span",{className:o.text,id:`${j}-value`,children:G(N)})}),u&&l.jsxs("div",{className:o.panel,children:[!r&&l.jsx(X.Input,{"aria-label":"Filter",className:o.filter,icon:"search",onChange:e=>w(e.target.value),placeholder:L,ref:m,style:oe,type:"search",value:q}),l.jsxs(pe.List,{"aria-label":"Dropdown",className:o.options,children:[A.map(e=>{const d=e.value===S;return l.jsx("li",{"data-component":"dropdown",children:l.jsxs(F.Button,{"aria-label":d?`${e.text}, selected`:e.text,className:g.t(o.option,d&&o.selected),disabled:e.disabled,onClick:()=>ce(e.value),variant:"tertiary",children:[l.jsx("span",{className:o.text,children:G(e)}),e.groupLabel&&l.jsx("small",{className:o.group,children:e.groupLabel})]})},`${e.groupLabel??"root"}-${e.value}`)}),C&&s&&l.jsx("li",{children:l.jsx(F.Button,{"aria-label":V(s.render(b))||b,className:o.option,onClick:H,variant:"tertiary",children:l.jsx("span",{className:o.text,children:s.render(b)})})}),A.length===0&&!C&&l.jsx("li",{className:o.empty,children:n})]})]})]});return c?l.jsxs("div",{className:g.t(o.label,h==="inline"&&o["inline-field"]),"data-component":"dropdown",children:[l.jsx("span",{id:j,children:ie}),J]}):J};exports.Dropdown=Fe;
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/components/dropdown/options.tsx","../../../src/components/dropdown/index.tsx"],"sourcesContent":["import React, { Children, isValidElement } from 'react';\n\nimport { Select, type SelectProps } from '@/components/select';\n\ntype NativeSelectProps = Omit<React.ComponentPropsWithoutRef<'select'>, 'children' | 'multiple'> & {\n children: React.ReactNode;\n multiple?: false;\n};\n\ntype NativeSelectElement = React.ReactElement<NativeSelectProps, 'select'>;\ntype WrappedSelectElement = React.ReactElement<SelectProps, typeof Select>;\n\nexport type DropdownSelectElement = NativeSelectElement | WrappedSelectElement;\n\nexport type DropdownOption = {\n disabled: boolean;\n groupLabel?: string;\n hidden: boolean;\n isPlaceholder: boolean;\n label: React.ReactNode;\n selected: boolean;\n text: string;\n value: string;\n};\n\nexport type DropdownRenderOption = Pick<\n DropdownOption,\n 'groupLabel' | 'label' | 'text' | 'value'\n> & {\n isSelected: boolean;\n};\n\nexport function getNodeText(node: React.ReactNode): string {\n if (typeof node === 'string' || typeof node === 'number') return String(node);\n if (Array.isArray(node)) return node.map(getNodeText).join(' ');\n if (isValidElement<{ children?: React.ReactNode }>(node)) return getNodeText(node.props.children);\n return '';\n}\n\nfunction isOptionElement(\n node: React.ReactNode\n): node is React.ReactElement<React.ComponentPropsWithoutRef<'option'>, 'option'> {\n return isValidElement(node) && node.type === 'option';\n}\n\nfunction isOptGroupElement(\n node: React.ReactNode\n): node is React.ReactElement<React.ComponentPropsWithoutRef<'optgroup'>, 'optgroup'> {\n return isValidElement(node) && node.type === 'optgroup';\n}\n\nfunction isFragmentElement(\n node: React.ReactNode\n): node is React.ReactElement<{ children?: React.ReactNode }, typeof React.Fragment> {\n return isValidElement(node) && node.type === React.Fragment;\n}\n\nfunction isWrappedSelectElement(node: React.ReactNode): node is WrappedSelectElement {\n return isValidElement(node) && node.type === Select;\n}\n\nexport function extractOptions(\n children: React.ReactNode,\n groupLabel?: string,\n groupDisabled = false\n): DropdownOption[] {\n const options: DropdownOption[] = [];\n\n Children.forEach(children, (child) => {\n if (isFragmentElement(child)) {\n options.push(...extractOptions(child.props.children, groupLabel, groupDisabled));\n } else if (isOptionElement(child)) {\n const text = getNodeText(child.props.children).trim();\n const value = child.props.value != null ? String(child.props.value) : text;\n options.push({\n disabled: groupDisabled || Boolean(child.props.disabled),\n groupLabel,\n hidden: Boolean(child.props.hidden),\n isPlaceholder: Boolean(child.props.hidden && value === ''),\n label: child.props.children,\n selected: Boolean(child.props.selected),\n text,\n value,\n });\n } else if (isOptGroupElement(child)) {\n options.push(\n ...extractOptions(\n child.props.children,\n child.props.label,\n groupDisabled || Boolean(child.props.disabled)\n )\n );\n }\n });\n\n return options;\n}\n\nfunction buildWildcardMatcher(query: string) {\n const trimmedQuery = query.trim();\n if (!trimmedQuery) return null;\n\n const wildcardQuery = /[*?]/.test(trimmedQuery) ? trimmedQuery : `*${trimmedQuery}*`;\n const expression = [...wildcardQuery]\n .map((character) => {\n if (character === '*') return '.*';\n if (character === '?') return '.';\n return character.replace(/[|\\\\{}()[\\]^$+.,]/g, '\\\\$&');\n })\n .join('');\n\n return new RegExp(`^${expression}$`, 'i');\n}\n\nexport function filterOptions(options: DropdownOption[], query: string) {\n const matcher = buildWildcardMatcher(query);\n const selectableOptions = options.filter((option) => !option.hidden && !option.isPlaceholder);\n return matcher\n ? selectableOptions.filter((option) =>\n matcher.test([option.groupLabel, option.text, option.value].filter(Boolean).join(' '))\n )\n : selectableOptions;\n}\n\nexport function getDisplayOption(options: DropdownOption[], selectedValue: string) {\n return (\n options.find((option) => option.value === selectedValue) ??\n options.find((option) => option.isPlaceholder) ??\n options[0]\n );\n}\n\nexport function getInitialValue(\n options: DropdownOption[],\n value?: NativeSelectProps['value'],\n defaultValue?: NativeSelectProps['defaultValue']\n) {\n if (value != null) return String(value);\n if (defaultValue != null) return String(defaultValue);\n return options.find((option) => option.selected)?.value ?? options[0]?.value ?? '';\n}\n\nexport function normalizeSelectElement(selectElement: DropdownSelectElement) {\n if (isWrappedSelectElement(selectElement)) {\n const { children, placeholder, ...props } = selectElement.props;\n return {\n children: (\n <>\n {placeholder && (\n <option\n hidden\n value=''\n >\n {placeholder}\n </option>\n )}\n {children}\n </>\n ),\n props,\n };\n }\n\n return { children: selectElement.props.children, props: selectElement.props };\n}\n","import cx from 'classix';\nimport React, { useEffect, useId, useRef, useState } from 'react';\n\nimport { Button } from '@/components/button';\nimport { type IconName, iconSVG } from '@/components/icon/icons';\nimport { Input } from '@/components/input';\nimport { List } from '@/components/list';\nimport { sanitizeSelectProps } from '@/components/select/sanitize-select-props';\nimport { resolveColor } from '@/lib/color';\nimport { formatInlineLabel } from '@/lib/text';\n\nimport {\n type DropdownOption,\n type DropdownRenderOption,\n type DropdownSelectElement,\n extractOptions,\n filterOptions,\n getDisplayOption,\n getInitialValue,\n getNodeText,\n normalizeSelectElement,\n} from './options';\nimport styles from './styles.module.css';\n\nexport type { DropdownRenderOption } from './options';\n\nexport type DropdownCreateOption = {\n isValid: (value: string) => boolean;\n onCreate: (value: string) => void;\n render: (value: string) => React.ReactNode;\n};\n\nexport type DropdownProps = Omit<React.ComponentPropsWithoutRef<'div'>, 'children'> & {\n children: DropdownSelectElement;\n combobox?: boolean;\n createOption?: DropdownCreateOption;\n emptyLabel?: string;\n label?: string;\n renderOption?: (option: DropdownRenderOption) => React.ReactNode;\n searchPlaceholder?: string;\n selectedItems?: React.ReactNode;\n variant?: 'default' | 'inline' | 'minimal';\n};\n\ntype withVars = React.CSSProperties & {\n '--icon-svg'?: string;\n};\n\nfunction getIconWithVars(icon: IconName, color: string): withVars {\n return {\n '--icon-svg': iconSVG(icon).replace('currentColor', color),\n };\n}\n\nexport const Dropdown = ({\n children: selectElement,\n className,\n combobox = false,\n createOption,\n emptyLabel = 'No matches found',\n label,\n renderOption,\n searchPlaceholder = 'Filter',\n selectedItems,\n variant = 'default',\n ...props\n}: DropdownProps) => {\n const normalizedSelect = normalizeSelectElement(selectElement);\n const { defaultValue, onChange, value, ...restSelectProps } = normalizedSelect.props;\n const selectProps = sanitizeSelectProps(restSelectProps);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const labelId = useId();\n const nativeSelectRef = useRef<HTMLSelectElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n const options = extractOptions(normalizedSelect.children);\n const isControlled = value != null;\n const initialValue = getInitialValue(options, value, defaultValue);\n const [internalValue, setInternalValue] = useState(() => initialValue);\n const [isOpen, setIsOpen] = useState(false);\n const [query, setQuery] = useState('');\n const selectedValue = isControlled ? String(value) : internalValue;\n const iconColors = {\n default: resolveColor('--colors-semantic-content-secondary'),\n white: resolveColor('--color-white', 'white'),\n };\n const dropdownIconColor = variant === 'minimal' ? iconColors.white : iconColors.default;\n const displayOption = getDisplayOption(options, selectedValue);\n const triggerWithVars = getIconWithVars('chevron', dropdownIconColor);\n const filterWithVars = getIconWithVars('search', dropdownIconColor);\n const filteredOptions = filterOptions(options, query);\n const customValue = query.trim();\n const canCreateOption = Boolean(\n combobox && createOption && customValue && createOption.isValid(customValue)\n );\n const displayLabel = label && variant === 'inline' ? formatInlineLabel(label) : label;\n const renderDropdownOption = (option: DropdownOption | undefined) => {\n if (!option) return 'Select an option';\n\n return (\n renderOption?.({\n groupLabel: option.groupLabel,\n isSelected: option.value === selectedValue,\n label: option.label,\n text: option.text,\n value: option.value,\n }) ?? option.label\n );\n };\n\n useEffect(() => {\n if (!isControlled && !options.some((option) => option.value === internalValue)) {\n setInternalValue(initialValue);\n }\n }, [initialValue, internalValue, isControlled, options]);\n\n useEffect(() => {\n if (!isOpen) {\n setQuery('');\n return;\n }\n\n searchRef.current?.focus();\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const handlePointerDown = (event: MouseEvent) => {\n if (!containerRef.current?.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handlePointerDown);\n\n return () => {\n document.removeEventListener('mousedown', handlePointerDown);\n };\n }, [isOpen]);\n\n const handleNativeChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n if (!isControlled) {\n setInternalValue(event.target.value);\n }\n\n onChange?.(event);\n };\n\n const closeMenu = () => {\n setIsOpen(false);\n if (!combobox) {\n buttonRef.current?.focus();\n }\n };\n\n const continueComboboxSelection = () => {\n setQuery('');\n setIsOpen(true);\n searchRef.current?.focus();\n };\n\n const commitCustomValue = () => {\n if (!createOption || !canCreateOption) return;\n\n createOption.onCreate(customValue);\n continueComboboxSelection();\n };\n\n const commitValue = (nextValue: string) => {\n if (!isControlled) {\n setInternalValue(nextValue);\n }\n\n const nativeSelect = nativeSelectRef.current;\n\n if (!nativeSelect) {\n closeMenu();\n return;\n }\n\n const valueSetter = Object.getOwnPropertyDescriptor(HTMLSelectElement.prototype, 'value')?.set;\n\n valueSetter?.call(nativeSelect, nextValue);\n nativeSelect.dispatchEvent(new Event('change', { bubbles: true }));\n if (combobox) {\n continueComboboxSelection();\n } else {\n closeMenu();\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape') {\n closeMenu();\n }\n\n if (event.key === 'Enter' && event.target === searchRef.current && canCreateOption) {\n event.preventDefault();\n commitCustomValue();\n }\n };\n\n const dropdown = (\n <div\n className={cx(\n styles.dropdown,\n variant === 'inline' && styles.inline,\n variant === 'minimal' && styles.minimal,\n className\n )}\n onKeyDown={handleKeyDown}\n ref={containerRef}\n {...props}\n >\n <select\n {...selectProps}\n aria-hidden='true'\n className={styles.native}\n onChange={handleNativeChange}\n ref={nativeSelectRef}\n tabIndex={-1}\n value={selectedValue}\n >\n {normalizedSelect.children}\n </select>\n {combobox ? (\n <div\n className={styles.combobox}\n onClick={() => searchRef.current?.focus()}\n >\n {selectedItems}\n <input\n aria-autocomplete='list'\n aria-expanded={isOpen}\n aria-label={selectProps['aria-label'] ?? label ?? searchPlaceholder}\n className={styles['combobox-input']}\n disabled={selectProps.disabled}\n onChange={(event) => {\n setQuery(event.target.value);\n setIsOpen(true);\n }}\n onClick={() => setIsOpen(true)}\n onFocus={() => setIsOpen(true)}\n placeholder={searchPlaceholder || undefined}\n ref={searchRef}\n role='combobox'\n type='text'\n value={query}\n />\n </div>\n ) : (\n <Button\n aria-expanded={isOpen}\n aria-haspopup='dialog'\n aria-labelledby={label ? `${labelId} ${labelId}-value` : undefined}\n className={cx(styles.trigger, displayOption?.isPlaceholder && styles.placeholder)}\n data-open={isOpen ? 'true' : undefined}\n disabled={selectProps.disabled}\n onClick={() => setIsOpen((currentValue) => !currentValue)}\n ref={buttonRef}\n style={triggerWithVars}\n variant='tertiary'\n >\n <span\n className={styles.text}\n id={`${labelId}-value`}\n >\n {renderDropdownOption(displayOption)}\n </span>\n </Button>\n )}\n {isOpen && (\n <div className={styles.panel}>\n {!combobox && (\n <Input\n aria-label='Filter'\n className={styles.filter}\n icon='search'\n onChange={(event) => setQuery(event.target.value)}\n placeholder={searchPlaceholder}\n ref={searchRef}\n style={filterWithVars}\n type='search'\n value={query}\n />\n )}\n <List\n aria-label='Dropdown'\n className={styles.options}\n >\n {filteredOptions.map((option) => {\n const isSelected = option.value === selectedValue;\n\n return (\n <li key={`${option.groupLabel ?? 'root'}-${option.value}`}>\n <Button\n aria-label={isSelected ? `${option.text}, selected` : option.text}\n className={cx(styles.option, isSelected && styles.selected)}\n disabled={option.disabled}\n onClick={() => commitValue(option.value)}\n variant='tertiary'\n >\n <span className={styles.text}>{renderDropdownOption(option)}</span>\n {option.groupLabel && (\n <small className={styles.group}>{option.groupLabel}</small>\n )}\n </Button>\n </li>\n );\n })}\n {canCreateOption && createOption && (\n <li>\n <Button\n aria-label={getNodeText(createOption.render(customValue)) || customValue}\n className={styles.option}\n onClick={commitCustomValue}\n variant='tertiary'\n >\n <span className={styles.text}>{createOption.render(customValue)}</span>\n </Button>\n </li>\n )}\n {filteredOptions.length === 0 && !canCreateOption && (\n <li className={styles.empty}>{emptyLabel}</li>\n )}\n </List>\n </div>\n )}\n </div>\n );\n\n return label ? (\n <div className={cx(styles.label, variant === 'inline' && styles['inline-field'])}>\n <span id={labelId}>{displayLabel}</span>\n {dropdown}\n </div>\n ) : (\n dropdown\n );\n};\n"],"names":["getNodeText","node","String","Array","isArray","map","join","isValidElement","props","children","isOptionElement","type","isOptGroupElement","isFragmentElement","React","Fragment","isWrappedSelectElement","Select","extractOptions","groupLabel","groupDisabled","options","Children","forEach","child","push","text","trim","value","disabled","Boolean","hidden","isPlaceholder","label","selected","buildWildcardMatcher","query","trimmedQuery","expression","test","character","replace","RegExp","filterOptions","matcher","selectableOptions","filter","option","getDisplayOption","selectedValue","find","getInitialValue","defaultValue","normalizeSelectElement","selectElement","placeholder","jsxs","getIconWithVars","icon","color","iconSVG","Dropdown","className","combobox","createOption","emptyLabel","renderOption","searchPlaceholder","selectedItems","variant","normalizedSelect","onChange","restSelectProps","selectProps","sanitizeSelectProps","buttonRef","useRef","containerRef","labelId","useId","nativeSelectRef","searchRef","isControlled","initialValue","internalValue","setInternalValue","useState","isOpen","setIsOpen","setQuery","iconColors","default","resolveColor","white","dropdownIconColor","displayOption","triggerWithVars","filterWithVars","filteredOptions","customValue","canCreateOption","isValid","displayLabel","formatInlineLabel","renderDropdownOption","isSelected","useEffect","some","current","focus","handlePointerDown","event","contains","target","document","addEventListener","removeEventListener","handleNativeChange","closeMenu","continueComboboxSelection","commitCustomValue","onCreate","commitValue","nextValue","nativeSelect","valueSetter","Object","getOwnPropertyDescriptor","HTMLSelectElement","prototype","set","call","dispatchEvent","Event","bubbles","handleKeyDown","key","preventDefault","dropdown","cx","styles","inline","minimal","jsx","native","undefined","Button","trigger","currentValue","panel","Input","List","group","render","length","empty"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/components/dropdown/options.tsx","../../../src/components/dropdown/index.tsx"],"sourcesContent":["import React, { Children, isValidElement } from 'react';\n\nimport { Select, type SelectProps } from '@/components/select';\n\ntype NativeSelectProps = Omit<React.ComponentPropsWithoutRef<'select'>, 'children' | 'multiple'> & {\n children: React.ReactNode;\n multiple?: false;\n};\n\ntype NativeSelectElement = React.ReactElement<NativeSelectProps, 'select'>;\ntype WrappedSelectElement = React.ReactElement<SelectProps, typeof Select>;\n\nexport type DropdownSelectElement = NativeSelectElement | WrappedSelectElement;\n\nexport type DropdownOption = {\n disabled: boolean;\n groupLabel?: string;\n hidden: boolean;\n isPlaceholder: boolean;\n label: React.ReactNode;\n selected: boolean;\n text: string;\n value: string;\n};\n\nexport type DropdownRenderOption = Pick<\n DropdownOption,\n 'groupLabel' | 'label' | 'text' | 'value'\n> & {\n isSelected: boolean;\n};\n\nexport function getNodeText(node: React.ReactNode): string {\n if (typeof node === 'string' || typeof node === 'number') return String(node);\n if (Array.isArray(node)) return node.map(getNodeText).join(' ');\n if (isValidElement<{ children?: React.ReactNode }>(node)) return getNodeText(node.props.children);\n return '';\n}\n\nfunction isOptionElement(\n node: React.ReactNode\n): node is React.ReactElement<React.ComponentPropsWithoutRef<'option'>, 'option'> {\n return isValidElement(node) && node.type === 'option';\n}\n\nfunction isOptGroupElement(\n node: React.ReactNode\n): node is React.ReactElement<React.ComponentPropsWithoutRef<'optgroup'>, 'optgroup'> {\n return isValidElement(node) && node.type === 'optgroup';\n}\n\nfunction isFragmentElement(\n node: React.ReactNode\n): node is React.ReactElement<{ children?: React.ReactNode }, typeof React.Fragment> {\n return isValidElement(node) && node.type === React.Fragment;\n}\n\nfunction isWrappedSelectElement(node: React.ReactNode): node is WrappedSelectElement {\n return isValidElement(node) && node.type === Select;\n}\n\nexport function extractOptions(\n children: React.ReactNode,\n groupLabel?: string,\n groupDisabled = false\n): DropdownOption[] {\n const options: DropdownOption[] = [];\n\n Children.forEach(children, (child) => {\n if (isFragmentElement(child)) {\n options.push(...extractOptions(child.props.children, groupLabel, groupDisabled));\n } else if (isOptionElement(child)) {\n const text = getNodeText(child.props.children).trim();\n const value = child.props.value != null ? String(child.props.value) : text;\n options.push({\n disabled: groupDisabled || Boolean(child.props.disabled),\n groupLabel,\n hidden: Boolean(child.props.hidden),\n isPlaceholder: Boolean(child.props.hidden && value === ''),\n label: child.props.children,\n selected: Boolean(child.props.selected),\n text,\n value,\n });\n } else if (isOptGroupElement(child)) {\n options.push(\n ...extractOptions(\n child.props.children,\n child.props.label,\n groupDisabled || Boolean(child.props.disabled)\n )\n );\n }\n });\n\n return options;\n}\n\nfunction buildWildcardMatcher(query: string) {\n const trimmedQuery = query.trim();\n if (!trimmedQuery) return null;\n\n const wildcardQuery = /[*?]/.test(trimmedQuery) ? trimmedQuery : `*${trimmedQuery}*`;\n const expression = [...wildcardQuery]\n .map((character) => {\n if (character === '*') return '.*';\n if (character === '?') return '.';\n return character.replace(/[|\\\\{}()[\\]^$+.,]/g, '\\\\$&');\n })\n .join('');\n\n return new RegExp(`^${expression}$`, 'i');\n}\n\nexport function filterOptions(options: DropdownOption[], query: string) {\n const matcher = buildWildcardMatcher(query);\n const selectableOptions = options.filter((option) => !option.hidden && !option.isPlaceholder);\n return matcher\n ? selectableOptions.filter((option) =>\n matcher.test([option.groupLabel, option.text, option.value].filter(Boolean).join(' '))\n )\n : selectableOptions;\n}\n\nexport function getDisplayOption(options: DropdownOption[], selectedValue: string) {\n return (\n options.find((option) => option.value === selectedValue) ??\n options.find((option) => option.isPlaceholder) ??\n options[0]\n );\n}\n\nexport function getInitialValue(\n options: DropdownOption[],\n value?: NativeSelectProps['value'],\n defaultValue?: NativeSelectProps['defaultValue']\n) {\n if (value != null) return String(value);\n if (defaultValue != null) return String(defaultValue);\n return options.find((option) => option.selected)?.value ?? options[0]?.value ?? '';\n}\n\nexport function normalizeSelectElement(selectElement: DropdownSelectElement) {\n if (isWrappedSelectElement(selectElement)) {\n const { children, placeholder, ...props } = selectElement.props;\n return {\n children: (\n <>\n {placeholder && (\n <option\n hidden\n value=''\n >\n {placeholder}\n </option>\n )}\n {children}\n </>\n ),\n props,\n };\n }\n\n return { children: selectElement.props.children, props: selectElement.props };\n}\n","import cx from 'classix';\nimport React, { useEffect, useId, useRef, useState } from 'react';\n\nimport { Button } from '@/components/button';\nimport { type IconName, iconSVG } from '@/components/icon/icons';\nimport { Input } from '@/components/input';\nimport { List } from '@/components/list';\nimport { sanitizeSelectProps } from '@/components/select/sanitize-select-props';\nimport { resolveColor } from '@/lib/color';\nimport { formatInlineLabel } from '@/lib/text';\n\nimport {\n type DropdownOption,\n type DropdownRenderOption,\n type DropdownSelectElement,\n extractOptions,\n filterOptions,\n getDisplayOption,\n getInitialValue,\n getNodeText,\n normalizeSelectElement,\n} from './options';\nimport styles from './styles.module.css';\n\nexport type { DropdownRenderOption } from './options';\n\nexport type DropdownCreateOption = {\n isValid: (value: string) => boolean;\n onCreate: (value: string) => void;\n render: (value: string) => React.ReactNode;\n};\n\nexport type DropdownProps = Omit<React.ComponentPropsWithoutRef<'div'>, 'children'> & {\n children: DropdownSelectElement;\n combobox?: boolean;\n createOption?: DropdownCreateOption;\n emptyLabel?: string;\n label?: string;\n renderOption?: (option: DropdownRenderOption) => React.ReactNode;\n searchPlaceholder?: string;\n selectedItems?: React.ReactNode;\n variant?: 'default' | 'inline' | 'minimal';\n};\n\ntype withVars = React.CSSProperties & {\n '--icon-svg'?: string;\n};\n\nfunction getIconWithVars(icon: IconName, color: string): withVars {\n return {\n '--icon-svg': iconSVG(icon).replace('currentColor', color),\n };\n}\n\nexport const Dropdown = ({\n children: selectElement,\n className,\n combobox = false,\n createOption,\n emptyLabel = 'No matches found',\n label,\n renderOption,\n searchPlaceholder = 'Filter',\n selectedItems,\n variant = 'default',\n ...props\n}: DropdownProps) => {\n const normalizedSelect = normalizeSelectElement(selectElement);\n const { defaultValue, onChange, value, ...restSelectProps } = normalizedSelect.props;\n const selectProps = sanitizeSelectProps(restSelectProps);\n const { className: selectClassName, ...nativeSelectProps } = selectProps;\n const buttonRef = useRef<HTMLButtonElement>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const labelId = useId();\n const nativeSelectRef = useRef<HTMLSelectElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n const options = extractOptions(normalizedSelect.children);\n const isControlled = value != null;\n const initialValue = getInitialValue(options, value, defaultValue);\n const [internalValue, setInternalValue] = useState(() => initialValue);\n const [isOpen, setIsOpen] = useState(false);\n const [query, setQuery] = useState('');\n const selectedValue = isControlled ? String(value) : internalValue;\n const iconColors = {\n default: resolveColor('--colors-semantic-content-secondary'),\n white: resolveColor('--color-white', 'white'),\n };\n const dropdownIconColor = variant === 'minimal' ? iconColors.white : iconColors.default;\n const displayOption = getDisplayOption(options, selectedValue);\n const triggerWithVars = getIconWithVars('chevron', dropdownIconColor);\n const filterWithVars = getIconWithVars('search', dropdownIconColor);\n const filteredOptions = filterOptions(options, query);\n const customValue = query.trim();\n const canCreateOption = Boolean(\n combobox && createOption && customValue && createOption.isValid(customValue)\n );\n const displayLabel = label && variant === 'inline' ? formatInlineLabel(label) : label;\n const renderDropdownOption = (option: DropdownOption | undefined) => {\n if (!option) return 'Select an option';\n\n return (\n renderOption?.({\n groupLabel: option.groupLabel,\n isSelected: option.value === selectedValue,\n label: option.label,\n text: option.text,\n value: option.value,\n }) ?? option.label\n );\n };\n\n useEffect(() => {\n if (!isControlled && !options.some((option) => option.value === internalValue)) {\n setInternalValue(initialValue);\n }\n }, [initialValue, internalValue, isControlled, options]);\n\n useEffect(() => {\n if (!isOpen) {\n setQuery('');\n return;\n }\n\n searchRef.current?.focus();\n }, [isOpen]);\n\n useEffect(() => {\n if (!isOpen) {\n return;\n }\n\n const handlePointerDown = (event: MouseEvent) => {\n if (!containerRef.current?.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handlePointerDown);\n\n return () => {\n document.removeEventListener('mousedown', handlePointerDown);\n };\n }, [isOpen]);\n\n const handleNativeChange = (event: React.ChangeEvent<HTMLSelectElement>) => {\n if (!isControlled) {\n setInternalValue(event.target.value);\n }\n\n onChange?.(event);\n };\n\n const closeMenu = () => {\n setIsOpen(false);\n if (!combobox) {\n buttonRef.current?.focus();\n }\n };\n\n const continueComboboxSelection = () => {\n setQuery('');\n setIsOpen(true);\n searchRef.current?.focus();\n };\n\n const commitCustomValue = () => {\n if (!createOption || !canCreateOption) return;\n\n createOption.onCreate(customValue);\n continueComboboxSelection();\n };\n\n const commitValue = (nextValue: string) => {\n if (!isControlled) {\n setInternalValue(nextValue);\n }\n\n const nativeSelect = nativeSelectRef.current;\n\n if (!nativeSelect) {\n closeMenu();\n return;\n }\n\n const valueSetter = Object.getOwnPropertyDescriptor(HTMLSelectElement.prototype, 'value')?.set;\n\n valueSetter?.call(nativeSelect, nextValue);\n nativeSelect.dispatchEvent(new Event('change', { bubbles: true }));\n if (combobox) {\n continueComboboxSelection();\n } else {\n closeMenu();\n }\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Escape') {\n closeMenu();\n }\n\n if (event.key === 'Enter' && event.target === searchRef.current && canCreateOption) {\n event.preventDefault();\n commitCustomValue();\n }\n };\n\n const dropdown = (\n <div\n className={cx(\n styles.dropdown,\n variant === 'inline' && styles.inline,\n variant === 'minimal' && styles.minimal,\n className\n )}\n onKeyDown={handleKeyDown}\n ref={containerRef}\n {...props}\n >\n <select\n {...nativeSelectProps}\n aria-hidden='true'\n className={cx(styles.native, selectClassName)}\n onChange={handleNativeChange}\n ref={nativeSelectRef}\n tabIndex={-1}\n value={selectedValue}\n >\n {normalizedSelect.children}\n </select>\n {combobox ? (\n <div\n className={styles.combobox}\n onClick={() => searchRef.current?.focus()}\n >\n {selectedItems}\n <input\n aria-autocomplete='list'\n aria-expanded={isOpen}\n aria-label={selectProps['aria-label'] ?? label ?? searchPlaceholder}\n className={styles['combobox-input']}\n disabled={selectProps.disabled}\n onChange={(event) => {\n setQuery(event.target.value);\n setIsOpen(true);\n }}\n onClick={() => setIsOpen(true)}\n onFocus={() => setIsOpen(true)}\n placeholder={searchPlaceholder || undefined}\n ref={searchRef}\n role='combobox'\n type='text'\n value={query}\n />\n </div>\n ) : (\n <Button\n aria-expanded={isOpen}\n aria-haspopup='dialog'\n aria-labelledby={label ? `${labelId} ${labelId}-value` : undefined}\n className={cx(styles.trigger, displayOption?.isPlaceholder && styles.placeholder)}\n data-open={isOpen ? 'true' : undefined}\n disabled={selectProps.disabled}\n onClick={() => setIsOpen((currentValue) => !currentValue)}\n ref={buttonRef}\n style={triggerWithVars}\n variant='tertiary'\n >\n <span\n className={styles.text}\n id={`${labelId}-value`}\n >\n {renderDropdownOption(displayOption)}\n </span>\n </Button>\n )}\n {isOpen && (\n <div className={styles.panel}>\n {!combobox && (\n <Input\n aria-label='Filter'\n className={styles.filter}\n icon='search'\n onChange={(event) => setQuery(event.target.value)}\n placeholder={searchPlaceholder}\n ref={searchRef}\n style={filterWithVars}\n type='search'\n value={query}\n />\n )}\n <List\n aria-label='Dropdown'\n className={styles.options}\n >\n {filteredOptions.map((option) => {\n const isSelected = option.value === selectedValue;\n\n return (\n <li key={`${option.groupLabel ?? 'root'}-${option.value}`}>\n <Button\n aria-label={isSelected ? `${option.text}, selected` : option.text}\n className={cx(styles.option, isSelected && styles.selected)}\n disabled={option.disabled}\n onClick={() => commitValue(option.value)}\n variant='tertiary'\n >\n <span className={styles.text}>{renderDropdownOption(option)}</span>\n {option.groupLabel && (\n <small className={styles.group}>{option.groupLabel}</small>\n )}\n </Button>\n </li>\n );\n })}\n {canCreateOption && createOption && (\n <li>\n <Button\n aria-label={getNodeText(createOption.render(customValue)) || customValue}\n className={styles.option}\n onClick={commitCustomValue}\n variant='tertiary'\n >\n <span className={styles.text}>{createOption.render(customValue)}</span>\n </Button>\n </li>\n )}\n {filteredOptions.length === 0 && !canCreateOption && (\n <li className={styles.empty}>{emptyLabel}</li>\n )}\n </List>\n </div>\n )}\n </div>\n );\n\n return label ? (\n <div className={cx(styles.label, variant === 'inline' && styles['inline-field'])}>\n <span id={labelId}>{displayLabel}</span>\n {dropdown}\n </div>\n ) : (\n dropdown\n );\n};\n"],"names":["getNodeText","node","String","Array","isArray","map","join","isValidElement","props","children","isOptionElement","type","isOptGroupElement","isFragmentElement","React","Fragment","isWrappedSelectElement","Select","extractOptions","groupLabel","groupDisabled","options","Children","forEach","child","push","text","trim","value","disabled","Boolean","hidden","isPlaceholder","label","selected","buildWildcardMatcher","query","trimmedQuery","expression","test","character","replace","RegExp","filterOptions","matcher","selectableOptions","filter","option","getDisplayOption","selectedValue","find","getInitialValue","defaultValue","normalizeSelectElement","selectElement","placeholder","jsxs","getIconWithVars","icon","color","iconSVG","Dropdown","className","combobox","createOption","emptyLabel","renderOption","searchPlaceholder","selectedItems","variant","normalizedSelect","onChange","restSelectProps","selectProps","sanitizeSelectProps","selectClassName","nativeSelectProps","buttonRef","useRef","containerRef","labelId","useId","nativeSelectRef","searchRef","isControlled","initialValue","internalValue","setInternalValue","useState","isOpen","setIsOpen","setQuery","iconColors","default","resolveColor","white","dropdownIconColor","displayOption","triggerWithVars","filterWithVars","filteredOptions","customValue","canCreateOption","isValid","displayLabel","formatInlineLabel","renderDropdownOption","isSelected","useEffect","some","current","focus","handlePointerDown","event","contains","target","document","addEventListener","removeEventListener","handleNativeChange","closeMenu","continueComboboxSelection","commitCustomValue","onCreate","commitValue","nextValue","nativeSelect","valueSetter","Object","getOwnPropertyDescriptor","HTMLSelectElement","prototype","set","call","dispatchEvent","Event","bubbles","handleKeyDown","key","preventDefault","dropdown","cx","styles","inline","minimal","jsx","native","undefined","Button","trigger","currentValue","panel","Input","List","group","render","length","empty"],"mappings":"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"}
|