fictoan-react 2.0.0-beta.18 → 2.0.0-beta.19
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/components/Badge/Badge.d.ts.map +1 -1
- package/dist/components/Badge/Badge.js +17 -18
- package/dist/components/Badge/Badge.js.map +1 -1
- package/dist/components/Breadcrumbs/Breadcrumbs.d.ts.map +1 -1
- package/dist/components/Breadcrumbs/Breadcrumbs.js +37 -38
- package/dist/components/Breadcrumbs/Breadcrumbs.js.map +1 -1
- package/dist/components/Callout/Callout.d.ts.map +1 -1
- package/dist/components/Callout/Callout.js +31 -25
- package/dist/components/Callout/Callout.js.map +1 -1
- package/dist/components/Divider/Divider.js +7 -7
- package/dist/components/Divider/Divider.js.map +1 -1
- package/dist/components/Element/Element.d.ts.map +1 -1
- package/dist/components/Element/Element.js +135 -133
- package/dist/components/Element/Element.js.map +1 -1
- package/dist/components/Element/constants.d.ts +21 -21
- package/dist/components/Element/constants.d.ts.map +1 -1
- package/dist/components/Element/constants.js.map +1 -1
- package/dist/components/Form/Checkbox/Switch.d.ts.map +1 -1
- package/dist/components/Form/Checkbox/Switch.js +11 -10
- package/dist/components/Form/Checkbox/Switch.js.map +1 -1
- package/dist/components/Form/FormItemGroup/FormItemGroup.d.ts.map +1 -1
- package/dist/components/Form/FormItemGroup/FormItemGroup.js +17 -17
- package/dist/components/Form/FormItemGroup/FormItemGroup.js.map +1 -1
- package/dist/components/Form/ListBox/ListBox.d.ts +1 -1
- package/dist/components/Form/ListBox/ListBox.d.ts.map +1 -1
- package/dist/components/Form/ListBox/ListBox.js +110 -107
- package/dist/components/Form/ListBox/ListBox.js.map +1 -1
- package/dist/components/Form/RadioButton/RadioTabGroup.d.ts +1 -1
- package/dist/components/Form/RadioButton/RadioTabGroup.js +46 -46
- package/dist/components/Form/RadioButton/RadioTabGroup.js.map +1 -1
- package/dist/components/Form/Select/Select.d.ts +1 -1
- package/dist/components/Form/Select/Select.d.ts.map +1 -1
- package/dist/components/Meter/Meter.d.ts.map +1 -1
- package/dist/components/Meter/Meter.js +54 -59
- package/dist/components/Meter/Meter.js.map +1 -1
- package/dist/components/Modal/Modal.d.ts.map +1 -1
- package/dist/components/Modal/Modal.js +20 -19
- package/dist/components/Modal/Modal.js.map +1 -1
- package/dist/components/Notification/NotificationsProvider/NotificationsProvider.d.ts.map +1 -1
- package/dist/components/Notification/NotificationsProvider/NotificationsProvider.js +44 -44
- package/dist/components/Notification/NotificationsProvider/NotificationsProvider.js.map +1 -1
- package/dist/components/Pagination/Pagination.d.ts +1 -1
- package/dist/components/Pagination/Pagination.d.ts.map +1 -1
- package/dist/components/Pagination/Pagination.js +42 -41
- package/dist/components/Pagination/Pagination.js.map +1 -1
- package/dist/components/Portion/Portion.d.ts +1 -0
- package/dist/components/Portion/Portion.d.ts.map +1 -1
- package/dist/components/Portion/Portion.js +13 -12
- package/dist/components/Portion/Portion.js.map +1 -1
- package/dist/components/ProgressBar/ProgressBar.d.ts.map +1 -1
- package/dist/components/ProgressBar/ProgressBar.js +23 -26
- package/dist/components/ProgressBar/ProgressBar.js.map +1 -1
- package/dist/components/Row/Row.d.ts +1 -0
- package/dist/components/Row/Row.d.ts.map +1 -1
- package/dist/components/Row/Row.js +22 -22
- package/dist/components/Row/Row.js.map +1 -1
- package/dist/components/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/components/Skeleton/Skeleton.js +25 -27
- package/dist/components/Skeleton/Skeleton.js.map +1 -1
- package/dist/components/Table/Table.d.ts +0 -1
- package/dist/components/Table/Table.d.ts.map +1 -1
- package/dist/components/Table/Table.js +21 -34
- package/dist/components/Table/Table.js.map +1 -1
- package/dist/components/Tabs/Tabs.d.ts.map +1 -1
- package/dist/components/Tabs/Tabs.js +49 -47
- package/dist/components/Tabs/Tabs.js.map +1 -1
- package/dist/components/Toast/ToastsProvider/ToastsProvider.d.ts.map +1 -1
- package/dist/components/Toast/ToastsProvider/ToastsProvider.js +22 -22
- package/dist/components/Toast/ToastsProvider/ToastsProvider.js.map +1 -1
- package/dist/components/Typography/Heading.js +11 -11
- package/dist/components/Typography/Heading.js.map +1 -1
- package/dist/components/Typography/Text.js +7 -7
- package/dist/components/Typography/Text.js.map +1 -1
- package/dist/fictoan-schema.json +33 -37
- package/dist/index.css +3 -3
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +129 -127
- package/dist/index.js.map +1 -1
- package/dist/utils/classNames.d.ts +1 -1
- package/dist/utils/classNames.d.ts.map +1 -1
- package/dist/utils/classNames.js.map +1 -1
- package/dist/utils/propSeparation.js +4 -4
- package/dist/utils/propSeparation.js.map +1 -1
- package/package.json +14 -3
|
@@ -1,35 +1,35 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx as
|
|
3
|
-
import
|
|
2
|
+
import { jsx as c } from "react/jsx-runtime";
|
|
3
|
+
import t from "react";
|
|
4
4
|
/* empty css */
|
|
5
5
|
import { Element as h } from "../../Element/Element.js";
|
|
6
|
-
const g =
|
|
6
|
+
const g = t.forwardRef(
|
|
7
7
|
({
|
|
8
|
-
isJoint:
|
|
8
|
+
isJoint: i,
|
|
9
9
|
equalWidthForChildren: a,
|
|
10
|
-
retainLayout:
|
|
10
|
+
retainLayout: p,
|
|
11
11
|
children: m,
|
|
12
|
-
legend:
|
|
12
|
+
legend: u,
|
|
13
13
|
id: s,
|
|
14
|
-
columns:
|
|
14
|
+
columns: e,
|
|
15
15
|
style: o,
|
|
16
|
-
...
|
|
17
|
-
},
|
|
18
|
-
const d = s || `form-group-${
|
|
16
|
+
...f
|
|
17
|
+
}, l) => {
|
|
18
|
+
const d = t.useId(), n = s || `form-group-${d.replace(/:/g, "")}`;
|
|
19
19
|
let r = [];
|
|
20
|
-
return
|
|
20
|
+
return i && r.push("is-joint"), a && r.push("equal-width-for-children"), p && r.push("retain-layout"), e && r.push("with-columns"), /* @__PURE__ */ c(
|
|
21
21
|
h,
|
|
22
22
|
{
|
|
23
23
|
as: "div",
|
|
24
24
|
"data-form-item-group": !0,
|
|
25
|
-
|
|
26
|
-
ref:
|
|
27
|
-
id:
|
|
25
|
+
inheritFormSpacing: !0,
|
|
26
|
+
ref: l,
|
|
27
|
+
id: n,
|
|
28
28
|
role: "group",
|
|
29
|
-
"aria-label":
|
|
29
|
+
"aria-label": u,
|
|
30
30
|
classNames: r,
|
|
31
|
-
style:
|
|
32
|
-
...
|
|
31
|
+
style: e ? { gridTemplateColumns: `repeat(${e}, 1fr)`, ...o } : o,
|
|
32
|
+
...f,
|
|
33
33
|
children: m
|
|
34
34
|
}
|
|
35
35
|
);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormItemGroup.js","sources":["../../../../src/components/Form/FormItemGroup/FormItemGroup.tsx"],"sourcesContent":["// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps } from \"../../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./form-item-group.css\";\n\n// prettier-ignore\nexport interface FormItemGroupCustomProps {\n isJoint ? : boolean;\n equalWidthForChildren ? : React.ReactNode;\n retainLayout ? : boolean;\n legend ? : string;\n columns ? : number;\n}\n\nexport type FormItemGroupElementType = HTMLDivElement;\nexport type FormItemGroupProps = Omit<CommonAndHTMLProps<FormItemGroupElementType>, keyof FormItemGroupCustomProps> &\n FormItemGroupCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const FormItemGroup = React.forwardRef(\n (\n {\n isJoint,\n equalWidthForChildren,\n retainLayout,\n children,\n legend,\n id,\n columns,\n style,\n ...props\n } : FormItemGroupProps,\n ref : React.Ref<FormItemGroupElementType>,\n ) => {\n const groupId = id || `form-group-${
|
|
1
|
+
{"version":3,"file":"FormItemGroup.js","sources":["../../../../src/components/Form/FormItemGroup/FormItemGroup.tsx"],"sourcesContent":["// REACT CORE ==========================================================================================================\nimport React from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { CommonAndHTMLProps } from \"../../Element/constants\";\nimport { Element } from \"$element\";\n\n// STYLES ==============================================================================================================\nimport \"./form-item-group.css\";\n\n// prettier-ignore\nexport interface FormItemGroupCustomProps {\n isJoint ? : boolean;\n equalWidthForChildren ? : React.ReactNode;\n retainLayout ? : boolean;\n legend ? : string;\n columns ? : number;\n}\n\nexport type FormItemGroupElementType = HTMLDivElement;\nexport type FormItemGroupProps = Omit<CommonAndHTMLProps<FormItemGroupElementType>, keyof FormItemGroupCustomProps> &\n FormItemGroupCustomProps;\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const FormItemGroup = React.forwardRef(\n (\n {\n isJoint,\n equalWidthForChildren,\n retainLayout,\n children,\n legend,\n id,\n columns,\n style,\n ...props\n } : FormItemGroupProps,\n ref : React.Ref<FormItemGroupElementType>,\n ) => {\n // useId (not Math.random) so the id is stable across server/client and doesn't cause hydration mismatches.\n const reactId = React.useId();\n const groupId = id || `form-group-${reactId.replace(/:/g, \"\")}`;\n let classNames = [];\n\n if (isJoint) {\n classNames.push(\"is-joint\");\n }\n\n if (equalWidthForChildren) {\n classNames.push(\"equal-width-for-children\");\n }\n\n if (retainLayout) {\n classNames.push(\"retain-layout\");\n }\n\n if (columns) {\n classNames.push(\"with-columns\");\n }\n\n return (\n <Element<FormItemGroupElementType>\n as=\"div\"\n data-form-item-group\n // Use the semantic prop: Element emits `data-form-spaced` from this. Passing the\n // raw attribute is clobbered by Element's own `data-form-spaced={inheritFormSpacing || undefined}`.\n inheritFormSpacing\n ref={ref}\n id={groupId}\n role=\"group\"\n aria-label={legend}\n classNames={classNames}\n style={columns ? { gridTemplateColumns : `repeat(${columns}, 1fr)`, ...style } : style}\n {...props}\n >\n {children}\n </Element>\n );\n },\n);\nFormItemGroup.displayName = \"FormItemGroup\";\n"],"names":["FormItemGroup","React","isJoint","equalWidthForChildren","retainLayout","children","legend","id","columns","style","props","ref","reactId","groupId","classNames","jsx","Element"],"mappings":";;;;AAwBO,MAAMA,IAAgBC,EAAM;AAAA,EAC/B,CACI;AAAA,IACI,SAAAC;AAAA,IACA,uBAAAC;AAAA,IACA,cAAAC;AAAA,IACA,UAAAC;AAAA,IACA,QAAAC;AAAA,IACA,IAAAC;AAAA,IACA,SAAAC;AAAA,IACA,OAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAEPC,MACC;AAED,UAAMC,IAAUX,EAAM,MAAA,GAChBY,IAAUN,KAAM,cAAcK,EAAQ,QAAQ,MAAM,EAAE,CAAC;AAC7D,QAAIE,IAAa,CAAA;AAEjB,WAAIZ,KACAY,EAAW,KAAK,UAAU,GAG1BX,KACAW,EAAW,KAAK,0BAA0B,GAG1CV,KACAU,EAAW,KAAK,eAAe,GAG/BN,KACAM,EAAW,KAAK,cAAc,GAI9B,gBAAAC;AAAA,MAACC;AAAA,MAAA;AAAA,QACG,IAAG;AAAA,QACH,wBAAoB;AAAA,QAGpB,oBAAkB;AAAA,QAClB,KAAAL;AAAA,QACA,IAAIE;AAAA,QACJ,MAAK;AAAA,QACL,cAAYP;AAAA,QACZ,YAAAQ;AAAA,QACA,OAAON,IAAU,EAAE,qBAAsB,UAAUA,CAAO,UAAU,GAAGC,EAAA,IAAUA;AAAA,QAChF,GAAGC;AAAA,QAEH,UAAAL;AAAA,MAAA;AAAA,IAAA;AAAA,EAGb;AACJ;AACAL,EAAc,cAAc;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { ListBoxCustomProps } from './constants';
|
|
3
3
|
|
|
4
|
-
export declare const ListBox: React.ForwardRefExoticComponent<Omit<import('
|
|
4
|
+
export declare const ListBox: React.ForwardRefExoticComponent<Omit<import('../../..').CommonAndHTMLProps<HTMLDivElement>, keyof ListBoxCustomProps> & ListBoxCustomProps & React.RefAttributes<HTMLDivElement>>;
|
|
5
5
|
//# sourceMappingURL=ListBox.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListBox.d.ts","sourceRoot":"","sources":["../../../../src/components/Form/ListBox/ListBox.tsx"],"names":[],"mappings":"AACA,OAAO,KAAuE,MAAM,OAAO,CAAC;AAa5F,OAAO,gBAAgB,CAAC;AAMxB,OAAO,EAA2D,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAK1G,eAAO,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"ListBox.d.ts","sourceRoot":"","sources":["../../../../src/components/Form/ListBox/ListBox.tsx"],"names":[],"mappings":"AACA,OAAO,KAAuE,MAAM,OAAO,CAAC;AAa5F,OAAO,gBAAgB,CAAC;AAMxB,OAAO,EAA2D,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAK1G,eAAO,MAAM,OAAO,mLAmbnB,CAAC"}
|
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx as a, jsxs as
|
|
3
|
-
import
|
|
4
|
-
import { Div as
|
|
5
|
-
import { useClickOutside as
|
|
6
|
-
import { separateWrapperProps as
|
|
2
|
+
import { jsx as a, jsxs as p, Fragment as pe } from "react/jsx-runtime";
|
|
3
|
+
import k, { useState as N, useRef as R, useEffect as E } from "react";
|
|
4
|
+
import { Div as b } from "../../Element/Tags.js";
|
|
5
|
+
import { useClickOutside as ue } from "../../../hooks/UseClickOutside.js";
|
|
6
|
+
import { separateWrapperProps as me } from "../../../utils/propSeparation.js";
|
|
7
7
|
/* empty css */
|
|
8
|
-
import { Badge as
|
|
9
|
-
import { deriveAriaIds as
|
|
10
|
-
import { InputField as
|
|
8
|
+
import { Badge as fe } from "../../Badge/Badge.js";
|
|
9
|
+
import { deriveAriaIds as be, FormItem as xe } from "../FormItem/FormItem.js";
|
|
10
|
+
import { InputField as he } from "../InputField/InputField.js";
|
|
11
11
|
import { Text as F } from "../../Typography/Text.js";
|
|
12
|
-
import { searchOptions as
|
|
13
|
-
import { Element as
|
|
14
|
-
const ve =
|
|
12
|
+
import { searchOptions as we } from "./listBoxUtils.js";
|
|
13
|
+
import { Element as Y } from "../../Element/Element.js";
|
|
14
|
+
const ve = k.forwardRef(
|
|
15
15
|
({
|
|
16
16
|
options: H = [],
|
|
17
|
-
label:
|
|
17
|
+
label: K,
|
|
18
18
|
helpText: P,
|
|
19
|
-
errorText:
|
|
19
|
+
errorText: $,
|
|
20
20
|
placeholder: V = "Select an option",
|
|
21
21
|
id: G,
|
|
22
22
|
defaultValue: J,
|
|
23
|
-
onChange:
|
|
24
|
-
disabled:
|
|
25
|
-
selectionLimit:
|
|
26
|
-
allowMultiSelect:
|
|
27
|
-
allowCustomEntries:
|
|
23
|
+
onChange: r,
|
|
24
|
+
disabled: x,
|
|
25
|
+
selectionLimit: h,
|
|
26
|
+
allowMultiSelect: w = !1,
|
|
27
|
+
allowCustomEntries: v = !1,
|
|
28
28
|
isLoading: Q,
|
|
29
29
|
value: L,
|
|
30
30
|
isFullWidth: U,
|
|
@@ -32,138 +32,140 @@ const ve = N.forwardRef(
|
|
|
32
32
|
required: j,
|
|
33
33
|
size: X,
|
|
34
34
|
...Z
|
|
35
|
-
},
|
|
36
|
-
const [i,
|
|
35
|
+
}, ye) => {
|
|
36
|
+
const [i, f] = N(!1), [u, z] = N(""), [c, n] = N(-1), [_, q] = N(!1), D = k.useMemo(() => [...H], [H]), W = k.useCallback(
|
|
37
37
|
(e, s) => e == null || e === "" ? [] : (Array.isArray(e) ? e : [e]).map((o) => s.find((B) => B.value === o)).filter((o) => o !== void 0),
|
|
38
38
|
[]
|
|
39
|
-
), S = L !== void 0, [M, g] =
|
|
40
|
-
() =>
|
|
41
|
-
),
|
|
39
|
+
), S = L !== void 0, [M, g] = N(
|
|
40
|
+
() => W(J, D)
|
|
41
|
+
), t = S ? W(L, D) : M, y = k.useCallback((e) => {
|
|
42
42
|
S || g(e);
|
|
43
|
-
}, [S]),
|
|
43
|
+
}, [S]), I = R(null), A = R(null), C = R(null), ee = k.useId(), m = G || `listbox-${ee.replace(/:/g, "")}`, { describedBy: se } = be(m, P, $), d = we(D, u), ae = c >= 0 && d[c] ? `${m}-option-${d[c].value}` : void 0, O = (e) => {
|
|
44
44
|
if (e.disabled) return;
|
|
45
45
|
let s;
|
|
46
|
-
if (
|
|
47
|
-
if (
|
|
48
|
-
s =
|
|
46
|
+
if (w) {
|
|
47
|
+
if (t.some((o) => o.value === e.value))
|
|
48
|
+
s = t.filter((o) => o.value !== e.value);
|
|
49
49
|
else {
|
|
50
|
-
if (
|
|
50
|
+
if (h && t.length >= h)
|
|
51
51
|
return;
|
|
52
|
-
s = [...
|
|
52
|
+
s = [...t, e];
|
|
53
53
|
}
|
|
54
|
-
y(s),
|
|
54
|
+
y(s), r == null || r(s.map((o) => o.value));
|
|
55
55
|
} else
|
|
56
|
-
s = [e], y(s),
|
|
56
|
+
s = [e], y(s), r == null || r(e.value), f(!1);
|
|
57
57
|
z(""), n(-1);
|
|
58
|
-
},
|
|
58
|
+
}, re = (e) => {
|
|
59
59
|
z(e);
|
|
60
|
-
},
|
|
61
|
-
if (!
|
|
62
|
-
const e =
|
|
60
|
+
}, te = () => {
|
|
61
|
+
if (!u.trim() || !v) return;
|
|
62
|
+
const e = u.trim(), s = {
|
|
63
63
|
value: e,
|
|
64
64
|
label: e
|
|
65
65
|
};
|
|
66
|
-
|
|
66
|
+
D.some((l) => l.value === e) || O(s);
|
|
67
67
|
}, le = (e) => {
|
|
68
|
-
if (
|
|
69
|
-
const s =
|
|
70
|
-
y(s),
|
|
68
|
+
if (w) {
|
|
69
|
+
const s = t.filter((l) => l.value !== e);
|
|
70
|
+
y(s), r == null || r(s.map((l) => l.value));
|
|
71
71
|
} else
|
|
72
|
-
y([]),
|
|
72
|
+
y([]), r == null || r("");
|
|
73
73
|
}, ie = () => {
|
|
74
|
-
y([]),
|
|
74
|
+
y([]), r == null || r(w ? [] : "");
|
|
75
75
|
}, oe = (e) => {
|
|
76
76
|
switch (e.key) {
|
|
77
77
|
case "ArrowDown":
|
|
78
78
|
e.preventDefault(), i ? n(
|
|
79
|
-
(s) => s <
|
|
80
|
-
) : (
|
|
79
|
+
(s) => s < d.length - 1 ? s + 1 : s
|
|
80
|
+
) : (f(!0), n(0));
|
|
81
81
|
break;
|
|
82
82
|
case "ArrowUp":
|
|
83
83
|
e.preventDefault(), n((s) => s > 0 ? s - 1 : s);
|
|
84
84
|
break;
|
|
85
85
|
case "Enter":
|
|
86
|
-
if (e.preventDefault(),
|
|
87
|
-
const s =
|
|
88
|
-
(l) => l.label.toLowerCase() ===
|
|
86
|
+
if (e.preventDefault(), v && u.trim()) {
|
|
87
|
+
const s = d.find(
|
|
88
|
+
(l) => l.label.toLowerCase() === u.trim().toLowerCase()
|
|
89
89
|
);
|
|
90
|
-
s ?
|
|
91
|
-
} else c >= 0 &&
|
|
90
|
+
s ? O(s) : te();
|
|
91
|
+
} else c >= 0 && d[c] && O(d[c]);
|
|
92
92
|
break;
|
|
93
93
|
case "Escape":
|
|
94
|
-
e.preventDefault(),
|
|
94
|
+
e.preventDefault(), f(!1), n(-1);
|
|
95
95
|
break;
|
|
96
96
|
case " ":
|
|
97
|
-
i || (e.preventDefault(),
|
|
97
|
+
i || (e.preventDefault(), f(!0), n(0));
|
|
98
98
|
break;
|
|
99
99
|
case "Home":
|
|
100
100
|
i && (e.preventDefault(), n(0));
|
|
101
101
|
break;
|
|
102
102
|
case "End":
|
|
103
|
-
i && (e.preventDefault(), n(
|
|
103
|
+
i && (e.preventDefault(), n(d.length - 1));
|
|
104
104
|
break;
|
|
105
105
|
}
|
|
106
|
+
}, ce = (e) => {
|
|
107
|
+
x || i || (e.key === "ArrowDown" || e.key === "Enter" || e.key === " ") && (e.preventDefault(), f(!0), n(0));
|
|
106
108
|
};
|
|
107
|
-
|
|
108
|
-
|
|
109
|
+
ue(I, () => {
|
|
110
|
+
f(!1), n(-1);
|
|
109
111
|
}), E(() => {
|
|
110
112
|
i && A.current && A.current.focus();
|
|
111
113
|
}, [i]), E(() => {
|
|
112
|
-
if (i &&
|
|
113
|
-
const e =
|
|
114
|
-
|
|
114
|
+
if (i && I.current) {
|
|
115
|
+
const e = I.current.getBoundingClientRect(), s = window.innerHeight, l = 300, o = s - e.bottom, B = e.top;
|
|
116
|
+
q(o < l && B > o);
|
|
115
117
|
} else
|
|
116
|
-
|
|
118
|
+
q(!1);
|
|
117
119
|
}, [i]), E(() => {
|
|
118
120
|
if (c >= 0) {
|
|
119
121
|
const e = document.querySelector(`[data-index="${c}"]`);
|
|
120
122
|
e == null || e.scrollIntoView({ block: "nearest" });
|
|
121
123
|
}
|
|
122
124
|
}, [c]);
|
|
123
|
-
const { wrapperProps:
|
|
125
|
+
const { wrapperProps: ne, inputProps: de } = me(Z);
|
|
124
126
|
return /* @__PURE__ */ a(
|
|
125
|
-
|
|
127
|
+
xe,
|
|
126
128
|
{
|
|
127
|
-
label:
|
|
128
|
-
htmlFor:
|
|
129
|
+
label: K,
|
|
130
|
+
htmlFor: m,
|
|
129
131
|
helpText: P,
|
|
130
|
-
errorText:
|
|
132
|
+
errorText: $,
|
|
131
133
|
required: j,
|
|
132
134
|
isFullWidth: U,
|
|
133
135
|
size: X,
|
|
134
|
-
...
|
|
135
|
-
children: /* @__PURE__ */
|
|
136
|
-
|
|
136
|
+
...ne,
|
|
137
|
+
children: /* @__PURE__ */ p(
|
|
138
|
+
Y,
|
|
137
139
|
{
|
|
138
140
|
as: "div",
|
|
139
141
|
"data-list-box": !0,
|
|
140
|
-
classNames: ["list-box-wrapper",
|
|
141
|
-
ref:
|
|
142
|
+
classNames: ["list-box-wrapper", x ? "disabled" : "", T || ""],
|
|
143
|
+
ref: I,
|
|
142
144
|
isFullWidth: U,
|
|
143
|
-
...
|
|
145
|
+
...de,
|
|
144
146
|
children: [
|
|
145
|
-
/* @__PURE__ */
|
|
146
|
-
|
|
147
|
+
/* @__PURE__ */ p(
|
|
148
|
+
b,
|
|
147
149
|
{
|
|
148
150
|
className: "list-box-input-wrapper",
|
|
149
|
-
id:
|
|
150
|
-
onClick: () => !
|
|
151
|
+
id: m,
|
|
152
|
+
onClick: () => !x && f(!i),
|
|
153
|
+
onKeyDown: ce,
|
|
151
154
|
role: "combobox",
|
|
155
|
+
"aria-label": K,
|
|
152
156
|
"aria-haspopup": "listbox",
|
|
153
157
|
"aria-expanded": i,
|
|
154
|
-
"aria-controls": `${
|
|
155
|
-
"aria-
|
|
156
|
-
"aria-activedescendant": i ? ae : void 0,
|
|
157
|
-
"aria-invalid": !!D || void 0,
|
|
158
|
+
"aria-controls": `${m}-listbox`,
|
|
159
|
+
"aria-invalid": !!$ || void 0,
|
|
158
160
|
"aria-required": j,
|
|
159
161
|
"aria-describedby": se,
|
|
160
|
-
"aria-disabled":
|
|
161
|
-
tabIndex:
|
|
162
|
+
"aria-disabled": x || void 0,
|
|
163
|
+
tabIndex: x ? -1 : 0,
|
|
162
164
|
children: [
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
/* @__PURE__ */ a(
|
|
166
|
-
|
|
165
|
+
w ? /* @__PURE__ */ p(pe, { children: [
|
|
166
|
+
t.length > 0 ? /* @__PURE__ */ p(b, { className: "options-wrapper", children: [
|
|
167
|
+
/* @__PURE__ */ a(b, { className: "options-list", children: t.map((e) => /* @__PURE__ */ a(
|
|
168
|
+
fe,
|
|
167
169
|
{
|
|
168
170
|
actionIcon: "cross",
|
|
169
171
|
onActionClick: () => le(e.value),
|
|
@@ -174,56 +176,57 @@ const ve = N.forwardRef(
|
|
|
174
176
|
},
|
|
175
177
|
e.value
|
|
176
178
|
)) }),
|
|
177
|
-
|
|
179
|
+
h && t.length >= h && /* @__PURE__ */ p(F, { className: "options-limit-warning", textColour: "red", size: "tiny", children: [
|
|
178
180
|
"You can choose only ",
|
|
179
|
-
|
|
181
|
+
h,
|
|
180
182
|
" option",
|
|
181
|
-
|
|
183
|
+
h === 1 ? "" : "s"
|
|
182
184
|
] })
|
|
183
185
|
] }) : /* @__PURE__ */ a("span", { className: "placeholder", children: V }),
|
|
184
|
-
|
|
185
|
-
|
|
186
|
+
t.length > 0 && /* @__PURE__ */ a(
|
|
187
|
+
b,
|
|
186
188
|
{
|
|
187
189
|
className: "icon-wrapper clear-all",
|
|
188
190
|
title: "Clear all options",
|
|
189
191
|
onClick: () => ie(),
|
|
190
|
-
children: /* @__PURE__ */
|
|
192
|
+
children: /* @__PURE__ */ p("svg", { viewBox: "0 0 24 24", children: [
|
|
191
193
|
/* @__PURE__ */ a("line", { x1: "5", y1: "5", x2: "19", y2: "19" }),
|
|
192
194
|
/* @__PURE__ */ a("line", { x1: "5", y1: "19", x2: "19", y2: "5" })
|
|
193
195
|
] })
|
|
194
196
|
}
|
|
195
197
|
)
|
|
196
|
-
] }) :
|
|
197
|
-
/* @__PURE__ */ a(
|
|
198
|
+
] }) : t[0] ? /* @__PURE__ */ a(F, { className: "selected-option", children: t[0].label }) : /* @__PURE__ */ a("span", { className: "placeholder", children: V }),
|
|
199
|
+
/* @__PURE__ */ a(b, { className: "icon-wrapper chevrons", children: /* @__PURE__ */ p("svg", { viewBox: "0 0 24 24", "aria-hidden": "true", children: [
|
|
198
200
|
/* @__PURE__ */ a("polyline", { points: "6 9 12 4 18 9" }),
|
|
199
201
|
/* @__PURE__ */ a("polyline", { points: "6 15 12 20 18 15" })
|
|
200
202
|
] }) })
|
|
201
203
|
]
|
|
202
204
|
}
|
|
203
205
|
),
|
|
204
|
-
i && !
|
|
205
|
-
|
|
206
|
+
i && !x && /* @__PURE__ */ p(
|
|
207
|
+
b,
|
|
206
208
|
{
|
|
207
209
|
ref: C,
|
|
208
210
|
className: `list-box-dropdown${_ ? " opens-upward" : ""}`,
|
|
209
211
|
children: [
|
|
210
|
-
/* @__PURE__ */
|
|
212
|
+
/* @__PURE__ */ p(b, { className: "list-box-search-wrapper", children: [
|
|
211
213
|
/* @__PURE__ */ a(
|
|
212
|
-
|
|
214
|
+
he,
|
|
213
215
|
{
|
|
214
216
|
type: "text",
|
|
215
217
|
ref: A,
|
|
216
218
|
className: "list-box-search",
|
|
217
|
-
placeholder:
|
|
218
|
-
value:
|
|
219
|
-
onChange:
|
|
219
|
+
placeholder: v ? "Type to search or add new" : "Search",
|
|
220
|
+
value: u,
|
|
221
|
+
onChange: re,
|
|
220
222
|
onKeyDown: oe,
|
|
221
|
-
"aria-controls": `${
|
|
223
|
+
"aria-controls": `${m}-listbox`,
|
|
224
|
+
"aria-activedescendant": ae,
|
|
222
225
|
"aria-label": "Search options",
|
|
223
226
|
isFullWidth: !0
|
|
224
227
|
}
|
|
225
228
|
),
|
|
226
|
-
|
|
229
|
+
v && u.trim() && !t.some((e) => e.label.toLowerCase() === u.trim().toLowerCase()) && /* @__PURE__ */ a(
|
|
227
230
|
"kbd",
|
|
228
231
|
{
|
|
229
232
|
className: "list-box-enter-key",
|
|
@@ -233,24 +236,24 @@ const ve = N.forwardRef(
|
|
|
233
236
|
)
|
|
234
237
|
] }),
|
|
235
238
|
/* @__PURE__ */ a(
|
|
236
|
-
|
|
239
|
+
Y,
|
|
237
240
|
{
|
|
238
241
|
as: "ul",
|
|
239
|
-
id: `${
|
|
242
|
+
id: `${m}-listbox`,
|
|
240
243
|
className: "list-box-options",
|
|
241
244
|
role: "listbox",
|
|
242
|
-
"aria-multiselectable":
|
|
245
|
+
"aria-multiselectable": w,
|
|
243
246
|
"aria-busy": Q,
|
|
244
247
|
tabIndex: -1,
|
|
245
|
-
children:
|
|
248
|
+
children: d.length > 0 ? d.map((e, s) => /* @__PURE__ */ a(
|
|
246
249
|
"li",
|
|
247
250
|
{
|
|
248
|
-
id: `${
|
|
251
|
+
id: `${m}-option-${e.value}`,
|
|
249
252
|
className: `list-box-option ${e.disabled ? "disabled" : ""} ${c === s ? "active" : ""}`,
|
|
250
253
|
role: "option",
|
|
251
|
-
"aria-selected":
|
|
254
|
+
"aria-selected": t.some((l) => l.value === e.value),
|
|
252
255
|
"aria-disabled": e.disabled,
|
|
253
|
-
onClick: () =>
|
|
256
|
+
onClick: () => O(e),
|
|
254
257
|
"data-index": s,
|
|
255
258
|
tabIndex: -1,
|
|
256
259
|
children: e.customLabel || e.label
|
|
@@ -262,7 +265,7 @@ const ve = N.forwardRef(
|
|
|
262
265
|
className: "list-box-option disabled",
|
|
263
266
|
role: "alert",
|
|
264
267
|
"aria-live": "polite",
|
|
265
|
-
children:
|
|
268
|
+
children: v ? "Type and press Enter to add new option" : "No matches found"
|
|
266
269
|
}
|
|
267
270
|
)
|
|
268
271
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListBox.js","sources":["../../../../src/components/Form/ListBox/ListBox.tsx"],"sourcesContent":["// REACT CORE ==========================================================================================================\nimport React, { useState, useRef, useEffect, MutableRefObject, KeyboardEvent } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { Div } from \"$tags\";\nimport { Element } from \"$element\";\n\n// HOOKS ===============================================================================================================\nimport { useClickOutside } from \"$hooks/UseClickOutside\";\n\n// UTILS ===============================================================================================================\nimport { separateWrapperProps } from \"$utils/propSeparation\";\n\n// STYLES ==============================================================================================================\nimport \"./list-box.css\";\n\n// OTHER ===============================================================================================================\nimport { Badge } from \"../../Badge/Badge\";\nimport { FormItem, deriveAriaIds } from \"../FormItem/FormItem\";\nimport { InputField } from \"../InputField/InputField\";\nimport { ListBoxProps, OptionForListBoxProps, ListBoxElementType, ListBoxCustomProps } from \"./constants\";\nimport { Text } from \"../../Typography/Text\";\nimport { searchOptions } from \"./listBoxUtils\";\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const ListBox = React.forwardRef<ListBoxElementType, ListBoxProps>(\n (\n {\n options = [],\n label,\n helpText,\n errorText,\n placeholder = \"Select an option\",\n id,\n defaultValue,\n onChange,\n disabled,\n selectionLimit,\n allowMultiSelect = false,\n allowCustomEntries = false,\n isLoading,\n value,\n isFullWidth,\n className,\n required,\n size,\n ...props\n },\n ref\n ) => {\n const [isOpen, setIsOpen] = useState(false);\n const [searchValue, setSearchValue] = useState(\"\");\n const [activeIndex, setActiveIndex] = useState(-1);\n const [openUpward, setOpenUpward] = useState(false);\n\n // Create a memoized version of the combined options\n const allOptions = React.useMemo(() => {\n return [...options];\n }, [options]);\n\n // Map a value or array of values to the matching option objects.\n const resolveSelectedOptions = React.useCallback(\n (val : string | string[] | undefined, opts : OptionForListBoxProps[]) : OptionForListBoxProps[] => {\n if (val == null || val === \"\") return [];\n const values = Array.isArray(val) ? val : [val];\n return values\n .map(v => opts.find(o => o.value === v))\n .filter((o) : o is OptionForListBoxProps => o !== undefined);\n },\n [],\n );\n\n // Internal state for uncontrolled mode. Lazy init from defaultValue so the\n // displayed selection is correct on first paint — no spurious onChange fires.\n const isControlled = value !== undefined;\n const [internalSelectedOptions, setInternalSelectedOptions] = useState<OptionForListBoxProps[]>(\n () => resolveSelectedOptions(defaultValue, allOptions),\n );\n\n // The effective selection: controlled value takes precedence, otherwise internal state.\n const selectedOptions = isControlled\n ? resolveSelectedOptions(value, allOptions)\n : internalSelectedOptions;\n\n const setSelectedOptions = React.useCallback((next : OptionForListBoxProps[]) => {\n if (!isControlled) setInternalSelectedOptions(next);\n }, [ isControlled ]);\n\n // The list-box wrapper renders as a <div>, not a <select> — the prior\n // HTMLSelectElement typing was a pre-existing mistake that only got\n // caught when Element's ref type tightened.\n const dropdownRef = useRef<HTMLDivElement>(null) as MutableRefObject<HTMLDivElement>;\n const searchInputRef = useRef<HTMLInputElement>(null);\n const dropdownMenuRef = useRef<HTMLDivElement>(null);\n\n const reactId = React.useId();\n const listboxId = id || `listbox-${reactId.replace(/:/g, \"\")}`;\n const { describedBy } = deriveAriaIds(listboxId, helpText, errorText);\n const filteredOptions = searchOptions(allOptions, searchValue);\n const activeOptionId = activeIndex >= 0 && filteredOptions[activeIndex]\n ? `${listboxId}-option-${filteredOptions[activeIndex].value}`\n : undefined;\n\n const handleSelectOption = (option: OptionForListBoxProps) => {\n if (option.disabled) return;\n\n let newSelectedOptions: OptionForListBoxProps[];\n if (allowMultiSelect) {\n const isSelected = selectedOptions.some(opt => opt.value === option.value);\n if (isSelected) {\n newSelectedOptions = selectedOptions.filter(opt => opt.value !== option.value);\n } else {\n if (selectionLimit && selectedOptions.length >= selectionLimit) {\n return;\n }\n newSelectedOptions = [...selectedOptions, option];\n }\n setSelectedOptions(newSelectedOptions);\n onChange?.(newSelectedOptions.map(opt => opt.value));\n } else {\n newSelectedOptions = [option];\n setSelectedOptions(newSelectedOptions);\n onChange?.(option.value);\n setIsOpen(false);\n }\n\n setSearchValue(\"\");\n setActiveIndex(-1);\n };\n\n const handleSearchChange = (value: string) => {\n setSearchValue(value);\n };\n\n const handleCustomEntry = () => {\n if (!searchValue.trim() || !allowCustomEntries) return;\n\n const customValue = searchValue.trim();\n const customOption: OptionForListBoxProps = {\n value: customValue,\n label: customValue,\n };\n\n // If this option doesn't exist yet\n if (!allOptions.some(opt => opt.value === customValue)) {\n handleSelectOption(customOption);\n }\n };\n\n const handleDeleteOption = (valueToRemove: string) => {\n if (allowMultiSelect) {\n // Filter out the option to remove\n const newSelectedOptions = selectedOptions.filter(opt => opt.value !== valueToRemove);\n\n // Update local state\n setSelectedOptions(newSelectedOptions);\n\n // Notify parent\n onChange?.(newSelectedOptions.map(opt => opt.value));\n } else {\n // For single-select mode, just clear everything\n setSelectedOptions([]);\n onChange?.(\"\");\n }\n };\n\n const handleClearAll = () => {\n // Reset local state for both single and multi-select\n setSelectedOptions([]);\n\n // Notify parent with empty data\n onChange?.(allowMultiSelect ? [] : \"\");\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n setActiveIndex(0);\n } else {\n setActiveIndex(prev =>\n prev < filteredOptions.length - 1 ? prev + 1 : prev\n );\n }\n break;\n\n case \"ArrowUp\":\n event.preventDefault();\n setActiveIndex(prev => prev > 0 ? prev - 1 : prev);\n break;\n\n case \"Enter\":\n event.preventDefault();\n if (allowCustomEntries && searchValue.trim()) {\n const exactMatch = filteredOptions.find(opt =>\n opt.label.toLowerCase() === searchValue.trim().toLowerCase()\n );\n if (exactMatch) {\n handleSelectOption(exactMatch);\n } else {\n handleCustomEntry();\n }\n } else if (activeIndex >= 0 && filteredOptions[activeIndex]) {\n handleSelectOption(filteredOptions[activeIndex]);\n }\n break;\n\n case \"Escape\":\n event.preventDefault();\n setIsOpen(false);\n setActiveIndex(-1);\n break;\n\n case \" \": // Space key\n if (!isOpen) {\n event.preventDefault();\n setIsOpen(true);\n setActiveIndex(0);\n }\n break;\n\n case \"Home\":\n if (isOpen) {\n event.preventDefault();\n setActiveIndex(0);\n }\n break;\n\n case \"End\":\n if (isOpen) {\n event.preventDefault();\n setActiveIndex(filteredOptions.length - 1);\n }\n break;\n }\n };\n\n useClickOutside(dropdownRef, () => {\n setIsOpen(false);\n setActiveIndex(-1);\n });\n\n useEffect(() => {\n if (isOpen && searchInputRef.current) {\n searchInputRef.current.focus();\n }\n }, [isOpen]);\n\n // Determine if dropdown should open upward based on available viewport space\n useEffect(() => {\n if (isOpen && dropdownRef.current) {\n const wrapperRect = dropdownRef.current.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n // Estimate dropdown height (max-height is 240px for options + search + padding)\n const estimatedDropdownHeight = 300;\n const spaceBelow = viewportHeight - wrapperRect.bottom;\n const spaceAbove = wrapperRect.top;\n\n // Open upward if not enough space below but enough space above\n setOpenUpward(spaceBelow < estimatedDropdownHeight && spaceAbove > spaceBelow);\n } else {\n setOpenUpward(false);\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (activeIndex >= 0) {\n const activeOption = document.querySelector(`[data-index=\"${activeIndex}\"]`);\n activeOption?.scrollIntoView({ block: \"nearest\" });\n }\n }, [activeIndex]);\n\n // Separate wrapper-level props (margin, padding, etc.) from input-specific props\n const { wrapperProps, inputProps } = separateWrapperProps(props);\n\n return (\n <FormItem\n label={label}\n htmlFor={listboxId}\n helpText={helpText}\n errorText={errorText}\n required={required}\n isFullWidth={isFullWidth}\n size={size}\n {...wrapperProps}\n >\n {/* PARENT */}\n <Element\n as=\"div\"\n data-list-box\n classNames={[\"list-box-wrapper\", disabled ? \"disabled\" : \"\", className || \"\"]}\n ref={dropdownRef}\n isFullWidth={isFullWidth}\n {...inputProps}\n >\n <Div\n className=\"list-box-input-wrapper\"\n id={listboxId}\n onClick={() => !disabled && setIsOpen(!isOpen)}\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={`${listboxId}-listbox`}\n aria-owns={`${listboxId}-listbox`}\n aria-activedescendant={isOpen ? activeOptionId : undefined}\n aria-invalid={Boolean(errorText) || undefined}\n aria-required={required}\n aria-describedby={describedBy}\n aria-disabled={disabled || undefined}\n tabIndex={disabled ? -1 : 0}\n >\n {allowMultiSelect ? (\n <>\n {selectedOptions.length > 0 ? (\n <Div className=\"options-wrapper\">\n <Div className=\"options-list\">\n {selectedOptions.map(option => (\n <Badge\n key={option.value}\n actionIcon=\"cross\"\n onActionClick={() => handleDeleteOption(option.value)}\n actionAriaLabel={`Remove ${option.label}`}\n size=\"small\"\n shape=\"rounded\"\n >\n <Text>{option.label}</Text>\n </Badge>\n ))}\n </Div>\n {selectionLimit && selectedOptions.length >= selectionLimit && (\n <Text className=\"options-limit-warning\" textColour=\"red\" size=\"tiny\">\n You can choose only {selectionLimit} option{selectionLimit === 1 ? \"\" : \"s\"}\n </Text>\n )}\n </Div>\n ) : (\n <span className=\"placeholder\">{placeholder}</span>\n )}\n\n {/* Clear button for multi-select */}\n {selectedOptions.length > 0 && (\n <Div\n className=\"icon-wrapper clear-all\"\n title=\"Clear all options\"\n onClick={() => handleClearAll()}\n >\n <svg viewBox=\"0 0 24 24\">\n <line x1=\"5\" y1=\"5\" x2=\"19\" y2=\"19\" />\n <line x1=\"5\" y1=\"19\" x2=\"19\" y2=\"5\" />\n </svg>\n </Div>\n )}\n </>\n ) : (\n selectedOptions[0]\n ? <Text className=\"selected-option\">{selectedOptions[0].label}</Text>\n : <span className=\"placeholder\">{placeholder}</span>\n )}\n\n <Div className=\"icon-wrapper chevrons\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <polyline points=\"6 9 12 4 18 9\"></polyline>\n <polyline points=\"6 15 12 20 18 15\"></polyline>\n </svg>\n </Div>\n </Div>\n\n {/* DROPDOWN */}\n {isOpen && !disabled && (\n <Div\n ref={dropdownMenuRef}\n className={`list-box-dropdown${openUpward ? \" opens-upward\" : \"\"}`}\n >\n <Div className=\"list-box-search-wrapper\">\n <InputField\n type=\"text\"\n ref={searchInputRef}\n className=\"list-box-search\"\n placeholder={allowCustomEntries ? \"Type to search or add new\" : \"Search\"}\n value={searchValue}\n onChange={handleSearchChange}\n onKeyDown={handleKeyDown}\n aria-controls={`${listboxId}-listbox`}\n aria-label=\"Search options\"\n isFullWidth\n />\n {allowCustomEntries && searchValue.trim() && !selectedOptions.some(opt =>\n opt.label.toLowerCase() === searchValue.trim().toLowerCase()) && (\n <kbd\n className=\"list-box-enter-key\"\n aria-label=\"Press Enter to add custom option\"\n >\n ↵\n </kbd>\n )}\n </Div>\n\n {/* OPTIONS */}\n <Element\n as=\"ul\"\n id={`${listboxId}-listbox`}\n className=\"list-box-options\"\n role=\"listbox\"\n aria-multiselectable={allowMultiSelect}\n aria-busy={isLoading}\n tabIndex={-1}\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option, index) => (\n <li\n key={option.value}\n id={`${listboxId}-option-${option.value}`}\n className={`list-box-option ${option.disabled ? \"disabled\" : \"\"} ${activeIndex === index ? \"active\" : \"\"}`}\n role=\"option\"\n aria-selected={selectedOptions.some(opt => opt.value === option.value)}\n aria-disabled={option.disabled}\n onClick={() => handleSelectOption(option)}\n data-index={index}\n tabIndex={-1}\n >\n {option.customLabel || option.label}\n </li>\n ))\n ) : (\n <li\n className=\"list-box-option disabled\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {allowCustomEntries\n ? \"Type and press Enter to add new option\"\n : \"No matches found\"\n }\n </li>\n )}\n </Element>\n </Div>\n )}\n </Element>\n </FormItem>\n );\n }\n);\nListBox.displayName = \"ListBox\";\n"],"names":["ListBox","React","options","label","helpText","errorText","placeholder","id","defaultValue","onChange","disabled","selectionLimit","allowMultiSelect","allowCustomEntries","isLoading","value","isFullWidth","className","required","size","props","ref","isOpen","setIsOpen","useState","searchValue","setSearchValue","activeIndex","setActiveIndex","openUpward","setOpenUpward","allOptions","resolveSelectedOptions","val","opts","v","o","isControlled","internalSelectedOptions","setInternalSelectedOptions","selectedOptions","setSelectedOptions","next","dropdownRef","useRef","searchInputRef","dropdownMenuRef","reactId","listboxId","describedBy","deriveAriaIds","filteredOptions","searchOptions","activeOptionId","handleSelectOption","option","newSelectedOptions","opt","handleSearchChange","handleCustomEntry","customValue","customOption","handleDeleteOption","valueToRemove","handleClearAll","handleKeyDown","event","prev","exactMatch","useClickOutside","useEffect","wrapperRect","viewportHeight","estimatedDropdownHeight","spaceBelow","spaceAbove","activeOption","wrapperProps","inputProps","separateWrapperProps","jsx","FormItem","jsxs","Element","Div","Fragment","Badge","Text","InputField","index"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ListBox.js","sources":["../../../../src/components/Form/ListBox/ListBox.tsx"],"sourcesContent":["// REACT CORE ==========================================================================================================\nimport React, { useState, useRef, useEffect, MutableRefObject, KeyboardEvent } from \"react\";\n\n// LOCAL COMPONENTS ====================================================================================================\nimport { Div } from \"$tags\";\nimport { Element } from \"$element\";\n\n// HOOKS ===============================================================================================================\nimport { useClickOutside } from \"$hooks/UseClickOutside\";\n\n// UTILS ===============================================================================================================\nimport { separateWrapperProps } from \"$utils/propSeparation\";\n\n// STYLES ==============================================================================================================\nimport \"./list-box.css\";\n\n// OTHER ===============================================================================================================\nimport { Badge } from \"../../Badge/Badge\";\nimport { FormItem, deriveAriaIds } from \"../FormItem/FormItem\";\nimport { InputField } from \"../InputField/InputField\";\nimport { ListBoxProps, OptionForListBoxProps, ListBoxElementType, ListBoxCustomProps } from \"./constants\";\nimport { Text } from \"../../Typography/Text\";\nimport { searchOptions } from \"./listBoxUtils\";\n\n// COMPONENT ///////////////////////////////////////////////////////////////////////////////////////////////////////////\nexport const ListBox = React.forwardRef<ListBoxElementType, ListBoxProps>(\n (\n {\n options = [],\n label,\n helpText,\n errorText,\n placeholder = \"Select an option\",\n id,\n defaultValue,\n onChange,\n disabled,\n selectionLimit,\n allowMultiSelect = false,\n allowCustomEntries = false,\n isLoading,\n value,\n isFullWidth,\n className,\n required,\n size,\n ...props\n },\n ref\n ) => {\n const [isOpen, setIsOpen] = useState(false);\n const [searchValue, setSearchValue] = useState(\"\");\n const [activeIndex, setActiveIndex] = useState(-1);\n const [openUpward, setOpenUpward] = useState(false);\n\n // Create a memoized version of the combined options\n const allOptions = React.useMemo(() => {\n return [...options];\n }, [options]);\n\n // Map a value or array of values to the matching option objects.\n const resolveSelectedOptions = React.useCallback(\n (val : string | string[] | undefined, opts : OptionForListBoxProps[]) : OptionForListBoxProps[] => {\n if (val == null || val === \"\") return [];\n const values = Array.isArray(val) ? val : [val];\n return values\n .map(v => opts.find(o => o.value === v))\n .filter((o) : o is OptionForListBoxProps => o !== undefined);\n },\n [],\n );\n\n // Internal state for uncontrolled mode. Lazy init from defaultValue so the\n // displayed selection is correct on first paint — no spurious onChange fires.\n const isControlled = value !== undefined;\n const [internalSelectedOptions, setInternalSelectedOptions] = useState<OptionForListBoxProps[]>(\n () => resolveSelectedOptions(defaultValue, allOptions),\n );\n\n // The effective selection: controlled value takes precedence, otherwise internal state.\n const selectedOptions = isControlled\n ? resolveSelectedOptions(value, allOptions)\n : internalSelectedOptions;\n\n const setSelectedOptions = React.useCallback((next : OptionForListBoxProps[]) => {\n if (!isControlled) setInternalSelectedOptions(next);\n }, [ isControlled ]);\n\n // The list-box wrapper renders as a <div>, not a <select> — the prior\n // HTMLSelectElement typing was a pre-existing mistake that only got\n // caught when Element's ref type tightened.\n const dropdownRef = useRef<HTMLDivElement>(null) as MutableRefObject<HTMLDivElement>;\n const searchInputRef = useRef<HTMLInputElement>(null);\n const dropdownMenuRef = useRef<HTMLDivElement>(null);\n\n const reactId = React.useId();\n const listboxId = id || `listbox-${reactId.replace(/:/g, \"\")}`;\n const { describedBy } = deriveAriaIds(listboxId, helpText, errorText);\n const filteredOptions = searchOptions(allOptions, searchValue);\n const activeOptionId = activeIndex >= 0 && filteredOptions[activeIndex]\n ? `${listboxId}-option-${filteredOptions[activeIndex].value}`\n : undefined;\n\n const handleSelectOption = (option: OptionForListBoxProps) => {\n if (option.disabled) return;\n\n let newSelectedOptions: OptionForListBoxProps[];\n if (allowMultiSelect) {\n const isSelected = selectedOptions.some(opt => opt.value === option.value);\n if (isSelected) {\n newSelectedOptions = selectedOptions.filter(opt => opt.value !== option.value);\n } else {\n if (selectionLimit && selectedOptions.length >= selectionLimit) {\n return;\n }\n newSelectedOptions = [...selectedOptions, option];\n }\n setSelectedOptions(newSelectedOptions);\n onChange?.(newSelectedOptions.map(opt => opt.value));\n } else {\n newSelectedOptions = [option];\n setSelectedOptions(newSelectedOptions);\n onChange?.(option.value);\n setIsOpen(false);\n }\n\n setSearchValue(\"\");\n setActiveIndex(-1);\n };\n\n const handleSearchChange = (value: string) => {\n setSearchValue(value);\n };\n\n const handleCustomEntry = () => {\n if (!searchValue.trim() || !allowCustomEntries) return;\n\n const customValue = searchValue.trim();\n const customOption: OptionForListBoxProps = {\n value: customValue,\n label: customValue,\n };\n\n // If this option doesn't exist yet\n if (!allOptions.some(opt => opt.value === customValue)) {\n handleSelectOption(customOption);\n }\n };\n\n const handleDeleteOption = (valueToRemove: string) => {\n if (allowMultiSelect) {\n // Filter out the option to remove\n const newSelectedOptions = selectedOptions.filter(opt => opt.value !== valueToRemove);\n\n // Update local state\n setSelectedOptions(newSelectedOptions);\n\n // Notify parent\n onChange?.(newSelectedOptions.map(opt => opt.value));\n } else {\n // For single-select mode, just clear everything\n setSelectedOptions([]);\n onChange?.(\"\");\n }\n };\n\n const handleClearAll = () => {\n // Reset local state for both single and multi-select\n setSelectedOptions([]);\n\n // Notify parent with empty data\n onChange?.(allowMultiSelect ? [] : \"\");\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n if (!isOpen) {\n setIsOpen(true);\n setActiveIndex(0);\n } else {\n setActiveIndex(prev =>\n prev < filteredOptions.length - 1 ? prev + 1 : prev\n );\n }\n break;\n\n case \"ArrowUp\":\n event.preventDefault();\n setActiveIndex(prev => prev > 0 ? prev - 1 : prev);\n break;\n\n case \"Enter\":\n event.preventDefault();\n if (allowCustomEntries && searchValue.trim()) {\n const exactMatch = filteredOptions.find(opt =>\n opt.label.toLowerCase() === searchValue.trim().toLowerCase()\n );\n if (exactMatch) {\n handleSelectOption(exactMatch);\n } else {\n handleCustomEntry();\n }\n } else if (activeIndex >= 0 && filteredOptions[activeIndex]) {\n handleSelectOption(filteredOptions[activeIndex]);\n }\n break;\n\n case \"Escape\":\n event.preventDefault();\n setIsOpen(false);\n setActiveIndex(-1);\n break;\n\n case \" \": // Space key\n if (!isOpen) {\n event.preventDefault();\n setIsOpen(true);\n setActiveIndex(0);\n }\n break;\n\n case \"Home\":\n if (isOpen) {\n event.preventDefault();\n setActiveIndex(0);\n }\n break;\n\n case \"End\":\n if (isOpen) {\n event.preventDefault();\n setActiveIndex(filteredOptions.length - 1);\n }\n break;\n }\n };\n\n // When CLOSED, the combobox div is the only focusable element — the search input\n // that carries handleKeyDown mounts only while open. Without this a keyboard-only\n // user can't open the ListBox. Guarded by !isOpen so it only handles opening;\n // once open, focus moves to the search input which takes over.\n const handleComboboxKeyDown = (event: KeyboardEvent) => {\n if (disabled || isOpen) return;\n if (event.key === \"ArrowDown\" || event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n setIsOpen(true);\n setActiveIndex(0);\n }\n };\n\n useClickOutside(dropdownRef, () => {\n setIsOpen(false);\n setActiveIndex(-1);\n });\n\n useEffect(() => {\n if (isOpen && searchInputRef.current) {\n searchInputRef.current.focus();\n }\n }, [isOpen]);\n\n // Determine if dropdown should open upward based on available viewport space\n useEffect(() => {\n if (isOpen && dropdownRef.current) {\n const wrapperRect = dropdownRef.current.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n // Estimate dropdown height (max-height is 240px for options + search + padding)\n const estimatedDropdownHeight = 300;\n const spaceBelow = viewportHeight - wrapperRect.bottom;\n const spaceAbove = wrapperRect.top;\n\n // Open upward if not enough space below but enough space above\n setOpenUpward(spaceBelow < estimatedDropdownHeight && spaceAbove > spaceBelow);\n } else {\n setOpenUpward(false);\n }\n }, [isOpen]);\n\n useEffect(() => {\n if (activeIndex >= 0) {\n const activeOption = document.querySelector(`[data-index=\"${activeIndex}\"]`);\n activeOption?.scrollIntoView({ block: \"nearest\" });\n }\n }, [activeIndex]);\n\n // Separate wrapper-level props (margin, padding, etc.) from input-specific props\n const { wrapperProps, inputProps } = separateWrapperProps(props);\n\n return (\n <FormItem\n label={label}\n htmlFor={listboxId}\n helpText={helpText}\n errorText={errorText}\n required={required}\n isFullWidth={isFullWidth}\n size={size}\n {...wrapperProps}\n >\n {/* PARENT */}\n <Element\n as=\"div\"\n data-list-box\n classNames={[\"list-box-wrapper\", disabled ? \"disabled\" : \"\", className || \"\"]}\n ref={dropdownRef}\n isFullWidth={isFullWidth}\n {...inputProps}\n >\n <Div\n className=\"list-box-input-wrapper\"\n id={listboxId}\n onClick={() => !disabled && setIsOpen(!isOpen)}\n onKeyDown={handleComboboxKeyDown}\n role=\"combobox\"\n // `htmlFor` on the visible <label> only names native controls, not a\n // role=\"combobox\" div — so give the combobox its own accessible name.\n aria-label={label}\n aria-haspopup=\"listbox\"\n aria-expanded={isOpen}\n aria-controls={`${listboxId}-listbox`}\n aria-invalid={Boolean(errorText) || undefined}\n aria-required={required}\n aria-describedby={describedBy}\n aria-disabled={disabled || undefined}\n tabIndex={disabled ? -1 : 0}\n >\n {allowMultiSelect ? (\n <>\n {selectedOptions.length > 0 ? (\n <Div className=\"options-wrapper\">\n <Div className=\"options-list\">\n {selectedOptions.map(option => (\n <Badge\n key={option.value}\n actionIcon=\"cross\"\n onActionClick={() => handleDeleteOption(option.value)}\n actionAriaLabel={`Remove ${option.label}`}\n size=\"small\"\n shape=\"rounded\"\n >\n <Text>{option.label}</Text>\n </Badge>\n ))}\n </Div>\n {selectionLimit && selectedOptions.length >= selectionLimit && (\n <Text className=\"options-limit-warning\" textColour=\"red\" size=\"tiny\">\n You can choose only {selectionLimit} option{selectionLimit === 1 ? \"\" : \"s\"}\n </Text>\n )}\n </Div>\n ) : (\n <span className=\"placeholder\">{placeholder}</span>\n )}\n\n {/* Clear button for multi-select */}\n {selectedOptions.length > 0 && (\n <Div\n className=\"icon-wrapper clear-all\"\n title=\"Clear all options\"\n onClick={() => handleClearAll()}\n >\n <svg viewBox=\"0 0 24 24\">\n <line x1=\"5\" y1=\"5\" x2=\"19\" y2=\"19\" />\n <line x1=\"5\" y1=\"19\" x2=\"19\" y2=\"5\" />\n </svg>\n </Div>\n )}\n </>\n ) : (\n selectedOptions[0]\n ? <Text className=\"selected-option\">{selectedOptions[0].label}</Text>\n : <span className=\"placeholder\">{placeholder}</span>\n )}\n\n <Div className=\"icon-wrapper chevrons\">\n <svg viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <polyline points=\"6 9 12 4 18 9\"></polyline>\n <polyline points=\"6 15 12 20 18 15\"></polyline>\n </svg>\n </Div>\n </Div>\n\n {/* DROPDOWN */}\n {isOpen && !disabled && (\n <Div\n ref={dropdownMenuRef}\n className={`list-box-dropdown${openUpward ? \" opens-upward\" : \"\"}`}\n >\n <Div className=\"list-box-search-wrapper\">\n <InputField\n type=\"text\"\n ref={searchInputRef}\n className=\"list-box-search\"\n placeholder={allowCustomEntries ? \"Type to search or add new\" : \"Search\"}\n value={searchValue}\n onChange={handleSearchChange}\n onKeyDown={handleKeyDown}\n aria-controls={`${listboxId}-listbox`}\n aria-activedescendant={activeOptionId}\n aria-label=\"Search options\"\n isFullWidth\n />\n {allowCustomEntries && searchValue.trim() && !selectedOptions.some(opt =>\n opt.label.toLowerCase() === searchValue.trim().toLowerCase()) && (\n <kbd\n className=\"list-box-enter-key\"\n aria-label=\"Press Enter to add custom option\"\n >\n ↵\n </kbd>\n )}\n </Div>\n\n {/* OPTIONS */}\n <Element\n as=\"ul\"\n id={`${listboxId}-listbox`}\n className=\"list-box-options\"\n role=\"listbox\"\n aria-multiselectable={allowMultiSelect}\n aria-busy={isLoading}\n tabIndex={-1}\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((option, index) => (\n <li\n key={option.value}\n id={`${listboxId}-option-${option.value}`}\n className={`list-box-option ${option.disabled ? \"disabled\" : \"\"} ${activeIndex === index ? \"active\" : \"\"}`}\n role=\"option\"\n aria-selected={selectedOptions.some(opt => opt.value === option.value)}\n aria-disabled={option.disabled}\n onClick={() => handleSelectOption(option)}\n data-index={index}\n tabIndex={-1}\n >\n {option.customLabel || option.label}\n </li>\n ))\n ) : (\n <li\n className=\"list-box-option disabled\"\n role=\"alert\"\n aria-live=\"polite\"\n >\n {allowCustomEntries\n ? \"Type and press Enter to add new option\"\n : \"No matches found\"\n }\n </li>\n )}\n </Element>\n </Div>\n )}\n </Element>\n </FormItem>\n );\n }\n);\nListBox.displayName = \"ListBox\";\n"],"names":["ListBox","React","options","label","helpText","errorText","placeholder","id","defaultValue","onChange","disabled","selectionLimit","allowMultiSelect","allowCustomEntries","isLoading","value","isFullWidth","className","required","size","props","ref","isOpen","setIsOpen","useState","searchValue","setSearchValue","activeIndex","setActiveIndex","openUpward","setOpenUpward","allOptions","resolveSelectedOptions","val","opts","v","o","isControlled","internalSelectedOptions","setInternalSelectedOptions","selectedOptions","setSelectedOptions","next","dropdownRef","useRef","searchInputRef","dropdownMenuRef","reactId","listboxId","describedBy","deriveAriaIds","filteredOptions","searchOptions","activeOptionId","handleSelectOption","option","newSelectedOptions","opt","handleSearchChange","handleCustomEntry","customValue","customOption","handleDeleteOption","valueToRemove","handleClearAll","handleKeyDown","event","prev","exactMatch","handleComboboxKeyDown","useClickOutside","useEffect","wrapperRect","viewportHeight","estimatedDropdownHeight","spaceBelow","spaceAbove","activeOption","wrapperProps","inputProps","separateWrapperProps","jsx","FormItem","jsxs","Element","Div","Fragment","Badge","Text","InputField","index"],"mappings":"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"}
|