se-design 1.0.84-dev.0 → 1.0.84
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/index25.js +44 -46
- package/dist/index25.js.map +1 -1
- package/dist/index38.js +90 -94
- package/dist/index38.js.map +1 -1
- package/package.json +1 -1
package/dist/index25.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import n, { useState as j, useRef as ce, useEffect as O, useLayoutEffect as
|
|
2
|
-
import { Popover as
|
|
1
|
+
import n, { useState as j, useRef as ce, useEffect as O, useLayoutEffect as Ke } from "react";
|
|
2
|
+
import { Popover as Le } from "./index19.js";
|
|
3
3
|
import { Icon as de } from "./index6.js";
|
|
4
|
-
import { Checkbox as
|
|
4
|
+
import { Checkbox as Fe } from "./index23.js";
|
|
5
5
|
import { Button as ue } from "./index4.js";
|
|
6
|
-
import { InputWithIcon as
|
|
6
|
+
import { InputWithIcon as Oe } from "./index52.js";
|
|
7
7
|
import { useStableId as U } from "./index205.js";
|
|
8
8
|
import { useCombobox as me } from "./index68.js";
|
|
9
|
-
import {
|
|
9
|
+
import { announce as Be } from "./index75.js";
|
|
10
10
|
function p() {
|
|
11
11
|
return p = Object.assign ? Object.assign.bind() : function(t) {
|
|
12
12
|
for (var b = 1; b < arguments.length; b++) {
|
|
@@ -16,28 +16,26 @@ function p() {
|
|
|
16
16
|
return t;
|
|
17
17
|
}, p.apply(null, arguments);
|
|
18
18
|
}
|
|
19
|
-
const
|
|
20
|
-
const b = t.selectedValue !== void 0, x = t.isOpen !== void 0, [w, fe] = j(!1), [S, W] = j(""), [ye, _] = j(() => t?.defaultSelectedValue ? Array.isArray(t?.defaultSelectedValue) ? t?.defaultSelectedValue : [t.defaultSelectedValue] : []), m = ce(null), P = ce(null), {
|
|
21
|
-
announce: ge
|
|
22
|
-
} = Te(), B = U(void 0, "dropdown-label"), z = U(void 0, "dropdown-value"), N = U(void 0, "dropdown-listbox"), s = x ? t.isOpen : w, l = b ? Array.isArray(t.selectedValue) ? t.selectedValue : t.selectedValue ? [t.selectedValue] : [] : ye, V = (e) => {
|
|
19
|
+
const Je = (t) => {
|
|
20
|
+
const b = t.selectedValue !== void 0, x = t.isOpen !== void 0, [w, fe] = j(!1), [S, W] = j(""), [ye, _] = j(() => t?.defaultSelectedValue ? Array.isArray(t?.defaultSelectedValue) ? t?.defaultSelectedValue : [t.defaultSelectedValue] : []), m = ce(null), P = ce(null), B = U(void 0, "dropdown-label"), z = U(void 0, "dropdown-value"), N = U(void 0, "dropdown-listbox"), s = x ? t.isOpen : w, l = b ? Array.isArray(t.selectedValue) ? t.selectedValue : t.selectedValue ? [t.selectedValue] : [] : ye, V = (e) => {
|
|
23
21
|
x || fe(e), t.onOpenChange?.(e);
|
|
24
22
|
}, T = (e) => {
|
|
25
23
|
b || _(e);
|
|
26
24
|
}, {
|
|
27
25
|
selectBy: f = "",
|
|
28
26
|
optionsUniqueBy: c = "",
|
|
29
|
-
displaySelected:
|
|
27
|
+
displaySelected: ge = !1,
|
|
30
28
|
dropDownOptions: J,
|
|
31
29
|
defaultText: u = "Select",
|
|
32
30
|
iconColor: Q = "var(--color-gray-700)",
|
|
33
31
|
disabled: $ = !1,
|
|
34
|
-
dropdownClassName:
|
|
32
|
+
dropdownClassName: pe = "",
|
|
35
33
|
hasError: X = !1,
|
|
36
|
-
errorMessage:
|
|
34
|
+
errorMessage: be = "",
|
|
37
35
|
customDropdownContent: G = null,
|
|
38
|
-
isBorderless:
|
|
36
|
+
isBorderless: he = !1,
|
|
39
37
|
shouldShowSearch: d = !1,
|
|
40
|
-
showSearchIcon:
|
|
38
|
+
showSearchIcon: ve = !0,
|
|
41
39
|
searchPlaceholder: Y = "Search...",
|
|
42
40
|
searchResultEmptyMessage: E = "No results found",
|
|
43
41
|
ariaLabel: h = "",
|
|
@@ -54,23 +52,23 @@ const Qe = (t) => {
|
|
|
54
52
|
s || W("");
|
|
55
53
|
}, [s]), O(() => {
|
|
56
54
|
s && d && P.current && requestAnimationFrame(() => P.current?.focus());
|
|
57
|
-
}, [s, d]),
|
|
55
|
+
}, [s, d]), Ke(() => {
|
|
58
56
|
t.popoverElementRef && (t.popoverElementRef.current = m.current?.element ?? null);
|
|
59
57
|
});
|
|
60
|
-
const i = t?.type === "multi-select",
|
|
58
|
+
const i = t?.type === "multi-select", xe = () => S.trim() ? (J || []).filter((e) => (e?.[f]?.toString().toLowerCase() || "").includes(S.toLowerCase())) : J || [], A = (e) => {
|
|
61
59
|
T([e]), V(!1), t?.onOptionClick?.(e), requestAnimationFrame(() => {
|
|
62
60
|
requestAnimationFrame(() => {
|
|
63
61
|
m.current?.focusTrigger();
|
|
64
62
|
});
|
|
65
63
|
});
|
|
66
|
-
}, r =
|
|
64
|
+
}, r = xe(), {
|
|
67
65
|
listboxProps: q,
|
|
68
|
-
getOptionProps:
|
|
66
|
+
getOptionProps: we,
|
|
69
67
|
highlightedIndex: C,
|
|
70
68
|
setHighlightedIndex: te,
|
|
71
69
|
containerProps: M,
|
|
72
70
|
inputProps: K,
|
|
73
|
-
isKeyboardFocused:
|
|
71
|
+
isKeyboardFocused: Se
|
|
74
72
|
} = me({
|
|
75
73
|
items: i ? [] : r,
|
|
76
74
|
// Only use for single-select
|
|
@@ -87,8 +85,8 @@ const Qe = (t) => {
|
|
|
87
85
|
listboxProps: L,
|
|
88
86
|
containerProps: I,
|
|
89
87
|
highlightedIndex: D,
|
|
90
|
-
setHighlightedIndex:
|
|
91
|
-
isKeyboardFocused:
|
|
88
|
+
setHighlightedIndex: Ee,
|
|
89
|
+
isKeyboardFocused: Ce
|
|
92
90
|
} = me({
|
|
93
91
|
items: i ? r : [],
|
|
94
92
|
isOpen: s && i,
|
|
@@ -102,13 +100,13 @@ const Qe = (t) => {
|
|
|
102
100
|
closeOnTab: !1
|
|
103
101
|
});
|
|
104
102
|
O(() => {
|
|
105
|
-
s && r.length === 0 && S.trim() &&
|
|
103
|
+
s && r.length === 0 && S.trim() && Be(E, {
|
|
106
104
|
assertiveness: "polite",
|
|
107
105
|
batchId: "dropdown-empty-state",
|
|
108
106
|
delay: 300
|
|
109
107
|
});
|
|
110
108
|
}, [r.length, s, S]);
|
|
111
|
-
const
|
|
109
|
+
const Ie = (e, o = !1) => i ? u : o && R ? R : e?.[f] || u, De = () => {
|
|
112
110
|
T([]), t?.onClear?.();
|
|
113
111
|
}, oe = (e, o = !1) => {
|
|
114
112
|
if (t?.renderOptionChip)
|
|
@@ -123,14 +121,14 @@ const Qe = (t) => {
|
|
|
123
121
|
className: "flex-shrink-0"
|
|
124
122
|
}, "+", k));
|
|
125
123
|
}
|
|
126
|
-
const a =
|
|
124
|
+
const a = Ie(e, o), y = !!t?.label || !!t?.ariaLabelledBy, v = o && u && e?.[f] && !R && !y;
|
|
127
125
|
return /* @__PURE__ */ n.createElement("p", {
|
|
128
126
|
className: "option-chip flex flex-1 items-center justify-between"
|
|
129
127
|
}, v ? `${u}: ${a}` : a);
|
|
130
128
|
}, ne = (e) => /* @__PURE__ */ n.createElement("div", {
|
|
131
129
|
className: " w-full relative flex items-center border-b border-[var(--color-gray-300)]"
|
|
132
|
-
}, /* @__PURE__ */ n.createElement(
|
|
133
|
-
leftIcon:
|
|
130
|
+
}, /* @__PURE__ */ n.createElement(Oe, {
|
|
131
|
+
leftIcon: ve ? {
|
|
134
132
|
name: "search",
|
|
135
133
|
position: "left",
|
|
136
134
|
style: {
|
|
@@ -162,17 +160,17 @@ const Qe = (t) => {
|
|
|
162
160
|
K.onKeyDown(e), e.key === "Escape" && requestAnimationFrame(() => m.current?.focusTrigger());
|
|
163
161
|
}
|
|
164
162
|
}), ae = (e, o) => {
|
|
165
|
-
const a = e[f], y = l[0]?.[f] || u, v = c?.length ? e[c] == l[0]?.[c] : !0, g =
|
|
163
|
+
const a = e[f], y = l[0]?.[f] || u, v = c?.length ? e[c] == l[0]?.[c] : !0, g = ge && a === y && v, k = C === o, Ae = i ? {} : we(o, g);
|
|
166
164
|
return /* @__PURE__ */ n.createElement("div", p({
|
|
167
165
|
key: e.id || e.value,
|
|
168
|
-
className: `option break-words px-3 py-2 hover:bg-[var(--color-gray-100)] cursor-pointer select-none flex items-center justify-between ${g ? "selected" : ""} ${k ? `bg-[var(--color-gray-100)]${
|
|
166
|
+
className: `option break-words px-3 py-2 hover:bg-[var(--color-gray-100)] cursor-pointer select-none flex items-center justify-between ${g ? "selected" : ""} ${k ? `bg-[var(--color-gray-100)]${Se ? " outline outline-[length:var(--focus-width)] -outline-offset-2 outline-[var(--focus-color)]" : ""}` : ""}`,
|
|
169
167
|
onClick: () => A(e),
|
|
170
168
|
onKeyDown: (F) => {
|
|
171
169
|
F.key === "Enter" || F.key === " " ? (F.preventDefault(), A(e)) : F.key === "Escape" && requestAnimationFrame(() => m.current?.focusTrigger());
|
|
172
170
|
},
|
|
173
171
|
tabIndex: -1,
|
|
174
172
|
"data-automation-id": `dropdown-option-${e?.automationId || o}`
|
|
175
|
-
},
|
|
173
|
+
}, Ae, {
|
|
176
174
|
"aria-selected": g ? "true" : "false"
|
|
177
175
|
}), oe({
|
|
178
176
|
...e,
|
|
@@ -181,7 +179,7 @@ const Qe = (t) => {
|
|
|
181
179
|
name: "checkmark",
|
|
182
180
|
stroke: Q
|
|
183
181
|
}));
|
|
184
|
-
},
|
|
182
|
+
}, ke = () => /* @__PURE__ */ n.createElement(n.Fragment, null, t?.label && ee && /* @__PURE__ */ n.createElement("div", {
|
|
185
183
|
"aria-hidden": "true",
|
|
186
184
|
className: "px-3 pt-2 pb-1 text-[var(--color-gray-650)] text-xs cursor-default select-none"
|
|
187
185
|
}, t.label), d && re(), /* @__PURE__ */ n.createElement("div", p({
|
|
@@ -214,7 +212,7 @@ const Qe = (t) => {
|
|
|
214
212
|
}, E))), le = (e, o) => {
|
|
215
213
|
let a = [];
|
|
216
214
|
e ? a = [...l, o] : a = l?.filter((y) => y[c] !== o[c]), T(a);
|
|
217
|
-
},
|
|
215
|
+
}, Pe = () => {
|
|
218
216
|
m.current?.togglePopover(), t?.onApply?.(l);
|
|
219
217
|
}, se = (e, o = !1) => {
|
|
220
218
|
if (!(o && e.key === " ")) {
|
|
@@ -234,10 +232,10 @@ const Qe = (t) => {
|
|
|
234
232
|
id: y,
|
|
235
233
|
role: "option",
|
|
236
234
|
"aria-selected": a,
|
|
237
|
-
className: `option px-3 py-2 hover:bg-[var(--color-gray-100)] cursor-pointer select-none flex items-center gap-2 ${v ? `bg-[var(--color-gray-100)]${
|
|
235
|
+
className: `option px-3 py-2 hover:bg-[var(--color-gray-100)] cursor-pointer select-none flex items-center gap-2 ${v ? `bg-[var(--color-gray-100)]${Ce ? " outline outline-[length:var(--focus-width)] -outline-offset-2 outline-[var(--focus-color)]" : ""}` : ""}`,
|
|
238
236
|
onClick: () => le(!a, e),
|
|
239
237
|
"data-automation-id": `dropdown-option-${e?.automationId || o}`
|
|
240
|
-
}, /* @__PURE__ */ n.createElement(
|
|
238
|
+
}, /* @__PURE__ */ n.createElement(Fe, {
|
|
241
239
|
tabIndex: -1,
|
|
242
240
|
ariaHidden: !0,
|
|
243
241
|
checked: a,
|
|
@@ -247,7 +245,7 @@ const Qe = (t) => {
|
|
|
247
245
|
}), /* @__PURE__ */ n.createElement("span", {
|
|
248
246
|
className: "checkbox-label"
|
|
249
247
|
}, e?.label));
|
|
250
|
-
},
|
|
248
|
+
}, Ne = () => /* @__PURE__ */ n.createElement("div", {
|
|
251
249
|
onKeyDown: (e) => {
|
|
252
250
|
e.key === "Tab" && e.stopPropagation();
|
|
253
251
|
}
|
|
@@ -264,7 +262,7 @@ const Qe = (t) => {
|
|
|
264
262
|
"aria-activedescendant": H["aria-activedescendant"],
|
|
265
263
|
onKeyDown: (e) => se(e, !1),
|
|
266
264
|
onFocus: () => {
|
|
267
|
-
D === -1 && r.length > 0 &&
|
|
265
|
+
D === -1 && r.length > 0 && Ee(0);
|
|
268
266
|
}
|
|
269
267
|
}), d ? /* @__PURE__ */ n.createElement("div", p({
|
|
270
268
|
className: "flex flex-col max-h-80 overflow-y-auto"
|
|
@@ -288,16 +286,16 @@ const Qe = (t) => {
|
|
|
288
286
|
label: "Clear",
|
|
289
287
|
type: "link",
|
|
290
288
|
size: "sm",
|
|
291
|
-
onClick:
|
|
289
|
+
onClick: De,
|
|
292
290
|
automationId: "se-design-dropdown-clear-button"
|
|
293
291
|
}), /* @__PURE__ */ n.createElement(ue, {
|
|
294
292
|
label: "Apply",
|
|
295
293
|
type: "primary",
|
|
296
294
|
size: "sm",
|
|
297
|
-
onClick:
|
|
295
|
+
onClick: Pe,
|
|
298
296
|
automationId: "se-design-dropdown-apply-button"
|
|
299
|
-
}))),
|
|
300
|
-
const e = s ? "border-[var(--color-blue-500)]" : $ ? "border-[var(--color-gray-300)]" : "border-[var(--color-gray-600)]", o = X ? "border-[var(--color-red-500)]" : "", a = `dropdown-src-element bg-[var(--color-white)] flex px-3 py-2 ${
|
|
297
|
+
}))), Ve = () => {
|
|
298
|
+
const e = s ? "border-[var(--color-blue-500)]" : $ ? "border-[var(--color-gray-300)]" : "border-[var(--color-gray-600)]", o = X ? "border-[var(--color-red-500)]" : "", a = `dropdown-src-element bg-[var(--color-white)] flex px-3 py-2 ${he ? "border-0" : `border rounded-md ${o || e}`} flex items-center ${pe}`;
|
|
301
299
|
return /* @__PURE__ */ n.createElement("div", {
|
|
302
300
|
className: a
|
|
303
301
|
}, /* @__PURE__ */ n.createElement("div", {
|
|
@@ -313,7 +311,7 @@ const Qe = (t) => {
|
|
|
313
311
|
className: "transition-transform",
|
|
314
312
|
stroke: Q
|
|
315
313
|
})));
|
|
316
|
-
},
|
|
314
|
+
}, $e = () => {
|
|
317
315
|
const e = l[0]?.[f];
|
|
318
316
|
return h && e ? `${h}, ${e}` : h || u || "Select option";
|
|
319
317
|
};
|
|
@@ -350,17 +348,17 @@ const Qe = (t) => {
|
|
|
350
348
|
...Z ? {
|
|
351
349
|
onBlurCapture: void 0
|
|
352
350
|
} : {}
|
|
353
|
-
}), /* @__PURE__ */ n.createElement(
|
|
351
|
+
}), /* @__PURE__ */ n.createElement(Le, p({
|
|
354
352
|
ref: m,
|
|
355
353
|
isPopoverOpen: s,
|
|
356
354
|
isWithPortal: Z,
|
|
357
|
-
renderPopoverContents: G || (i ?
|
|
355
|
+
renderPopoverContents: G || (i ? Ne : ke),
|
|
358
356
|
contentWidth: "full",
|
|
359
357
|
popoverContentStyleProperty: t.popoverContentStyleProperty,
|
|
360
358
|
renderPopoverSrcElement: t.renderSrcElement ? () => t.renderSrcElement({
|
|
361
359
|
isOpen: s,
|
|
362
360
|
selectedValue: l
|
|
363
|
-
}) :
|
|
361
|
+
}) : Ve,
|
|
364
362
|
onPopoverToggle: (e) => {
|
|
365
363
|
if (V(e), e && !i && l.length > 0) {
|
|
366
364
|
const o = r.findIndex((a) => c ? a[c] === l[0]?.[c] : a[f] === l[0]?.[f]);
|
|
@@ -375,16 +373,16 @@ const Qe = (t) => {
|
|
|
375
373
|
automationId: t?.dropDownSrcAutomationId,
|
|
376
374
|
popoverContentAutomationId: t?.dropDownContentAutomationId,
|
|
377
375
|
ariaLabelledBy: t?.label || t?.ariaLabelledBy || h ? [t?.label || !t?.ariaLabelledBy && h ? B : t?.ariaLabelledBy, z].filter(Boolean).join(" ") : void 0,
|
|
378
|
-
ariaLabel: !t?.label && !h && !t?.ariaLabelledBy ?
|
|
376
|
+
ariaLabel: !t?.label && !h && !t?.ariaLabelledBy ? $e() : void 0,
|
|
379
377
|
sourceRole: "button",
|
|
380
378
|
"aria-haspopup": "listbox"
|
|
381
379
|
}, s ? {
|
|
382
380
|
"aria-controls": N
|
|
383
381
|
} : {}))), X && /* @__PURE__ */ n.createElement("div", {
|
|
384
382
|
className: "text-[var(--color-red-500)] text-sm"
|
|
385
|
-
},
|
|
383
|
+
}, be));
|
|
386
384
|
};
|
|
387
385
|
export {
|
|
388
|
-
|
|
386
|
+
Je as Dropdown
|
|
389
387
|
};
|
|
390
388
|
//# sourceMappingURL=index25.js.map
|
package/dist/index25.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index25.js","sources":["../src/components/Dropdown/index.tsx"],"sourcesContent":["import React, { FC, useState, useRef, useEffect, useLayoutEffect } from 'react';\n\nimport { Popover, PopoverHandle } from 'src/components/Popover';\nimport { Icon } from 'components/Icon';\nimport { Checkbox } from '../Checkbox';\nimport { Button } from '../Button';\nimport { InputWithIcon } from '../InputWithIcon';\nimport { useStableId } from '../../utils/useStableId';\nimport { useCombobox } from '../../utils/a11y/useCombobox';\nimport { useLiveAnnouncer } from '../../utils/a11y/liveAnnouncer';\n\ntype DropdownValue = {\n [key: string]: any;\n};\n\ntype DropdownProps = {\n label?: string;\n firstOptionAsHeading?: boolean;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n type: 'select' | 'multi-select';\n dropDownOptions?: DropdownValue[];\n defaultText?: string;\n selectBy?: string;\n optionsUniqueBy?: string;\n displaySelected?: boolean;\n defaultSelectedValue?: DropdownValue | DropdownValue[];\n customSelectedValue?: string;\n onOptionClick?: (selectedValue: DropdownValue) => void;\n style?: React.CSSProperties;\n renderOptionChip?: (option: DropdownValue, srcOption: boolean) => React.ReactNode;\n className?: string;\n iconColor?: string;\n disabled?: boolean;\n dropdownClassName?: string;\n hasError?: boolean;\n errorMessage?: string;\n onApply?: (selectedValue: DropdownValue[]) => void;\n onClear?: () => void;\n customDropdownContent?: () => React.ReactNode;\n isBorderless?: boolean;\n dropDownSrcAutomationId?: string;\n dropDownSelectAutomationId?: string;\n dropDownContentAutomationId?: string;\n shouldShowSearch?: boolean;\n showSearchIcon?: boolean;\n searchPlaceholder?: string;\n searchResultEmptyMessage?: string;\n /** Controlled selection — when provided, Dropdown won't manage internal selected state */\n selectedValue?: DropdownValue | DropdownValue[];\n /** Controlled open state — when provided, Dropdown won't manage internal open/close */\n isOpen?: boolean;\n /** Callback when open state changes (fires in both controlled and uncontrolled modes) */\n onOpenChange?: (isOpen: boolean) => void;\n /** Custom trigger element — replaces the default bordered div + chevron */\n renderSrcElement?: (props: { isOpen: boolean; selectedValue: DropdownValue[] }) => React.ReactNode;\n /** Render the dropdown panel in a portal (document.body) to escape overflow:hidden containers */\n isWithPortal?: boolean;\n /** Optional ref that will be populated with the Popover wrapper element on mount.\n * Use with setFocusAnchor() to return focus to the dropdown trigger after a modal closes. */\n popoverElementRef?: React.RefObject<HTMLElement | null>;\n /** Inline styles forwarded to the Popover content (portal or inline). Useful for min-width overrides. */\n popoverContentStyleProperty?: React.CSSProperties;\n};\n\nexport const Dropdown: FC<DropdownProps> = (props) => {\n const isControlledSelection = props.selectedValue !== undefined;\n const isControlledOpen = props.isOpen !== undefined;\n\n const [internalIsOpen, setInternalIsOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const [internalSelectedValues, setInternalSelectedValues] = useState<DropdownValue[]>(() =>\n props?.defaultSelectedValue\n ? Array.isArray(props?.defaultSelectedValue)\n ? props?.defaultSelectedValue\n : [props.defaultSelectedValue]\n : []\n );\n const popoverRef = useRef<HTMLDivElement & PopoverHandle>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n const { announce } = useLiveAnnouncer();\n const labelId = useStableId(undefined, 'dropdown-label');\n const valueId = useStableId(undefined, 'dropdown-value');\n const listboxId = useStableId(undefined, 'dropdown-listbox');\n\n // Derived state: controlled props take precedence over internal state\n const isDropDownOpen = isControlledOpen ? props.isOpen! : internalIsOpen;\n const selectedDropDownValues = isControlledSelection\n ? (Array.isArray(props.selectedValue) ? props.selectedValue : props.selectedValue ? [props.selectedValue] : [])\n : internalSelectedValues;\n\n const setIsDropDownOpen = (value: boolean) => {\n if (!isControlledOpen) {\n setInternalIsOpen(value);\n }\n props.onOpenChange?.(value);\n };\n\n const setSelectedDropDownValues = (values: DropdownValue[]) => {\n if (!isControlledSelection) {\n setInternalSelectedValues(values);\n }\n };\n\n const {\n selectBy = '',\n optionsUniqueBy = '',\n displaySelected = false,\n dropDownOptions,\n defaultText = 'Select',\n iconColor = 'var(--color-gray-700)',\n disabled = false,\n dropdownClassName = '',\n hasError = false,\n errorMessage = '',\n customDropdownContent = null,\n isBorderless = false,\n shouldShowSearch = false,\n showSearchIcon = true,\n searchPlaceholder = 'Search...',\n searchResultEmptyMessage = 'No results found',\n ariaLabel = '',\n customSelectedValue = '',\n isWithPortal = false,\n firstOptionAsHeading = false\n } = props;\n\n useEffect(() => {\n if (!isControlledSelection) {\n const newValues = props?.defaultSelectedValue\n ? Array.isArray(props?.defaultSelectedValue)\n ? props?.defaultSelectedValue\n : [props.defaultSelectedValue]\n : [];\n setInternalSelectedValues(newValues);\n }\n }, [props?.defaultSelectedValue, isControlledSelection]);\n\n useEffect(() => {\n if (!isDropDownOpen) {\n setSearchQuery('');\n }\n }, [isDropDownOpen]);\n\n // Focus search input when dropdown opens with search enabled\n useEffect(() => {\n if (isDropDownOpen && shouldShowSearch && searchInputRef.current) {\n requestAnimationFrame(() => searchInputRef.current?.focus());\n }\n }, [isDropDownOpen, shouldShowSearch]);\n\n // Populate caller's popoverElementRef with the Popover wrapper element.\n // Runs after mount so popoverRef.current is set.\n useLayoutEffect(() => {\n if (props.popoverElementRef) {\n props.popoverElementRef.current = popoverRef.current?.element ?? null;\n }\n });\n\n const isMultiSelect = props?.type === 'multi-select';\n\n const getFilteredOptions = () => {\n if (!searchQuery.trim()) {\n return dropDownOptions || [];\n }\n return (dropDownOptions || []).filter((option) => {\n const optionValue = option?.[selectBy]?.toString().toLowerCase() || '';\n return optionValue.includes(searchQuery.toLowerCase());\n });\n };\n\n const handleDropDownOptionClick = (dropDownOption: any) => {\n setSelectedDropDownValues([dropDownOption]);\n setIsDropDownOpen(false);\n props?.onOptionClick?.(dropDownOption);\n // Restore focus to the trigger after portal unmounts.\n // Double rAF ensures this runs after React re-renders AND the focus trap safety net,\n // getting the final say on focus.\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n popoverRef.current?.focusTrigger();\n });\n });\n };\n\n // Use useCombobox hook for keyboard navigation (only for single-select)\n const filteredOptions = getFilteredOptions();\n const {\n listboxProps,\n getOptionProps,\n highlightedIndex,\n setHighlightedIndex,\n containerProps: comboboxContainerProps,\n inputProps: comboboxInputProps,\n isKeyboardFocused: isSingleSelectKeyboardFocused\n } = useCombobox({\n items: isMultiSelect ? [] : filteredOptions, // Only use for single-select\n isOpen: isDropDownOpen && !isMultiSelect,\n onOpenChange: setIsDropDownOpen,\n onSelect: (item: DropdownValue) => {\n handleDropDownOptionClick(item);\n },\n listboxId,\n disabled: isMultiSelect || disabled,\n hasItems: filteredOptions.length > 0\n });\n\n // Second useCombobox for multi-select: provides ARIA props, keyboard navigation, and auto-scroll.\n // Enter/Space are intercepted in multiSelectOnKeyDown to avoid the hook's highlight reset after select.\n const {\n inputProps: multiSelectComboboxInputProps,\n listboxProps: multiSelectListboxProps,\n containerProps: multiSelectContainerProps,\n highlightedIndex: highlightedMultiSelectIndex,\n setHighlightedIndex: setHighlightedMultiSelectIndex,\n isKeyboardFocused: isMultiSelectKeyboardFocused\n } = useCombobox({\n items: isMultiSelect ? filteredOptions : [],\n isOpen: isDropDownOpen && isMultiSelect,\n onOpenChange: setIsDropDownOpen,\n onSelect: () => {},\n listboxId,\n disabled: !isMultiSelect,\n loop: false,\n hasItems: filteredOptions.length > 0,\n closeOnTab: false\n });\n\n useEffect(() => {\n if (isDropDownOpen && filteredOptions.length === 0 && searchQuery.trim()) {\n announce(searchResultEmptyMessage, { assertiveness: 'polite', batchId: 'dropdown-empty-state', delay: 300 });\n }\n }, [filteredOptions.length, isDropDownOpen, searchQuery]);\n\n const getSelectedDropDownValue = (option: DropdownValue, isSrcOption: boolean = false) => {\n if (isMultiSelect) {\n return defaultText;\n }\n\n // if custom selected value is provided, use it instead of the option value\n if (isSrcOption && customSelectedValue) {\n return customSelectedValue;\n }\n\n return option?.[selectBy] || defaultText;\n };\n\n const clearSelectedDropDownValues = () => {\n setSelectedDropDownValues([]);\n props?.onClear?.();\n };\n\n const optionChip = (option: DropdownValue, srcOption: boolean = false) => {\n if (props?.renderOptionChip) {\n return props?.renderOptionChip(option, srcOption);\n }\n\n if (isMultiSelect && selectedDropDownValues?.length > 0) {\n const firstSelectedLabel = selectedDropDownValues[0]?.[selectBy] || '';\n const remainingCount = selectedDropDownValues.length - 1;\n\n // For multiple selections: text takes remaining space, count takes minimum space needed\n return (\n <div className={`option-chip flex items-center w-full`}>\n <div\n className={`${remainingCount > 0 ? 'w-full' : 'flex-1'} truncate`}\n >{`${defaultText}: ${firstSelectedLabel}`}</div>\n {remainingCount > 0 && <div className=\"flex-shrink-0\">+{remainingCount}</div>}\n </div>\n );\n }\n\n const selectedLabel = getSelectedDropDownValue(option, srcOption);\n const hasVisibleLabel = !!props?.label || !!props?.ariaLabelledBy;\n const showPrefix = srcOption && defaultText && option?.[selectBy] && !customSelectedValue && !hasVisibleLabel;\n\n return (\n <p className={`option-chip flex flex-1 items-center justify-between`}>\n {showPrefix ? `${defaultText}: ${selectedLabel}` : selectedLabel}\n </p>\n );\n };\n\n const renderSearchInput = (extraInputProps: Record<string, any>) => (\n <div className=\" w-full relative flex items-center border-b border-[var(--color-gray-300)]\">\n <InputWithIcon\n leftIcon={showSearchIcon ? { name: 'search', position: 'left', style: { color: 'var(--color-gray-500)' } } : undefined}\n value={searchQuery}\n onChange={(value) => setSearchQuery(value)}\n placeholder={searchPlaceholder}\n style={{ margin: 0, gap: 0 }}\n inputStyle={{ width: '100%', border: 'none', outline: 'none' }}\n automationId=\"se-design-dropdown-search\"\n ariaLabel={searchPlaceholder}\n inputRef={searchInputRef}\n inputProps={extraInputProps}\n />\n </div>\n );\n\n const renderSearchBar = () => {\n if (isMultiSelect) {\n return renderSearchInput({\n ...multiSelectComboboxInputProps,\n onKeyDown: (e: React.KeyboardEvent) => multiSelectOnKeyDown(e, true)\n });\n }\n\n // Single-select: wrap onKeyDown to add Escape → focusTrigger (portal-safe)\n return renderSearchInput({\n ...comboboxInputProps,\n onKeyDown: (e: React.KeyboardEvent) => {\n comboboxInputProps.onKeyDown(e);\n if (e.key === 'Escape') {\n requestAnimationFrame(() => popoverRef.current?.focusTrigger());\n }\n }\n });\n };\n\n const dropDownOptionJsx = (dropDownOption: DropdownValue, index: number) => {\n const optionTxt = dropDownOption[selectBy];\n const dropDownSelectedValue = selectedDropDownValues[0]?.[selectBy] || defaultText;\n const selectByUniqueId = optionsUniqueBy?.length\n ? dropDownOption[optionsUniqueBy] == selectedDropDownValues[0]?.[optionsUniqueBy]\n : true;\n const isOptionSelected = displaySelected && optionTxt === dropDownSelectedValue && selectByUniqueId;\n const isHighlighted = highlightedIndex === index;\n const optionProps = !isMultiSelect ? getOptionProps(index, isOptionSelected) : {};\n\n return (\n <div\n key={dropDownOption.id || dropDownOption.value}\n className={`option break-words px-3 py-2 hover:bg-[var(--color-gray-100)] cursor-pointer select-none flex items-center justify-between ${\n isOptionSelected ? 'selected' : ''\n } ${isHighlighted ? `bg-[var(--color-gray-100)]${isSingleSelectKeyboardFocused ? ' outline outline-[length:var(--focus-width)] -outline-offset-2 outline-[var(--focus-color)]' : ''}` : ''}`}\n onClick={() => handleDropDownOptionClick(dropDownOption)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleDropDownOptionClick(dropDownOption);\n } else if (e.key === 'Escape') {\n requestAnimationFrame(() => popoverRef.current?.focusTrigger());\n }\n }}\n tabIndex={-1}\n data-automation-id={`dropdown-option-${dropDownOption?.automationId || index}`}\n {...optionProps}\n aria-selected={isOptionSelected ? 'true' : 'false'}\n >\n {optionChip({ ...dropDownOption, isOptionSelected }, false)}\n {isOptionSelected && <Icon name=\"checkmark\" stroke={iconColor} />}\n </div>\n );\n };\n\n const renderDropdownContents = () => {\n return (\n <>\n {props?.label && firstOptionAsHeading && (\n <div\n aria-hidden=\"true\"\n className=\"px-3 pt-2 pb-1 text-[var(--color-gray-650)] text-xs cursor-default select-none\"\n >\n {props.label}\n </div>\n )}\n {shouldShowSearch && renderSearchBar()}\n <div\n className={`dropdown-content dropdown-options${shouldShowSearch ? '' : ' flex flex-col max-h-80 overflow-y-auto'}`}\n {...(shouldShowSearch ? {} : {\n ...listboxProps,\n 'aria-label': `${defaultText} options`,\n style: { outline: 'none' },\n tabIndex: -1,\n 'aria-activedescendant': comboboxInputProps['aria-activedescendant'],\n onKeyDown: (e: React.KeyboardEvent) => {\n comboboxContainerProps.onKeyDownCapture?.(e as React.KeyboardEvent<HTMLElement>);\n if (e.key === ' ') {\n e.preventDefault();\n if (highlightedIndex >= 0 && filteredOptions[highlightedIndex]) {\n handleDropDownOptionClick(filteredOptions[highlightedIndex]);\n }\n return;\n }\n comboboxInputProps.onKeyDown(e);\n },\n onFocus: () => {\n if (highlightedIndex === -1 && filteredOptions.length > 0) {\n setHighlightedIndex(0);\n }\n }\n })}\n >\n {shouldShowSearch ? (\n <div\n className=\"flex flex-col max-h-80 overflow-y-auto\"\n aria-label={`${defaultText} options`}\n {...listboxProps}\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((dropDownOption, index) => dropDownOptionJsx(dropDownOption, index))\n ) : (\n <div className=\"px-3 py-4 text-center text-[var(--color-gray-700)] text-sm\">\n {searchResultEmptyMessage}\n </div>\n )}\n </div>\n ) : (\n filteredOptions.length > 0 ? (\n filteredOptions.map((dropDownOption, index) => dropDownOptionJsx(dropDownOption, index))\n ) : (\n <div className=\"px-3 py-4 text-center text-[var(--color-gray-700)] text-sm\">\n {searchResultEmptyMessage}\n </div>\n )\n )}\n </div>\n </>\n );\n };\n\n const handleMultiSelectDropdownOptionClick = (isSelected: boolean, dropDownOption: DropdownValue) => {\n let newSelectedDropDownValues: DropdownValue[] = [];\n if (isSelected) {\n newSelectedDropDownValues = [...selectedDropDownValues, dropDownOption];\n } else {\n newSelectedDropDownValues = selectedDropDownValues?.filter(\n (option) => option[optionsUniqueBy] !== dropDownOption[optionsUniqueBy]\n );\n }\n setSelectedDropDownValues(newSelectedDropDownValues);\n };\n\n const handleApplySelectedDropDownValues = () => {\n popoverRef.current?.togglePopover();\n props?.onApply?.(selectedDropDownValues);\n };\n\n // Wraps the multi-select useCombobox's onKeyDown.\n // - Intercepts Enter/Space to toggle selection without resetting the highlight\n // (the hook resets highlightedIndex to -1 after onSelect, which is wrong for multi-select).\n // - When isSearchInput is true, Space is left for typing.\n // - Adds focusTrigger on Escape (Popover's handler is unreliable for portals).\n const multiSelectOnKeyDown = (e: React.KeyboardEvent, isSearchInput: boolean = false) => {\n if (isSearchInput && e.key === ' ') return;\n\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n if (highlightedMultiSelectIndex >= 0 && highlightedMultiSelectIndex < filteredOptions.length) {\n const option = filteredOptions[highlightedMultiSelectIndex];\n const isSelected = selectedDropDownValues.some(\n (v) => v[optionsUniqueBy] === option[optionsUniqueBy]\n );\n handleMultiSelectDropdownOptionClick(!isSelected, option);\n }\n return;\n }\n\n multiSelectComboboxInputProps.onKeyDown(e);\n\n if (e.key === 'Escape') {\n e.stopPropagation();\n requestAnimationFrame(() => popoverRef.current?.focusTrigger());\n }\n };\n\n const multiSelectDropdownOptionJSX = (dropDownOption: DropdownValue, index: number) => {\n const isOptionSelected = selectedDropDownValues.some(\n (option) => option[optionsUniqueBy] === dropDownOption[optionsUniqueBy]\n );\n const optionId = `${listboxId}-option-${index}`;\n const isHighlighted = highlightedMultiSelectIndex === index;\n\n return (\n <div\n key={dropDownOption.id || dropDownOption.value}\n id={optionId}\n role=\"option\"\n aria-selected={isOptionSelected}\n className={`option px-3 py-2 hover:bg-[var(--color-gray-100)] cursor-pointer select-none flex items-center gap-2 ${\n isHighlighted ? `bg-[var(--color-gray-100)]${isMultiSelectKeyboardFocused ? ' outline outline-[length:var(--focus-width)] -outline-offset-2 outline-[var(--focus-color)]' : ''}` : ''\n }`}\n onClick={() => handleMultiSelectDropdownOptionClick(!isOptionSelected, dropDownOption)}\n data-automation-id={`dropdown-option-${dropDownOption?.automationId || index}`}\n >\n <Checkbox\n tabIndex={-1}\n ariaHidden\n checked={isOptionSelected}\n onChange={() => {}}\n className=\"pointer-events-none\"\n />\n <span className=\"checkbox-label\">{dropDownOption?.label}</span>\n </div>\n );\n };\n\n const renderMultiSelectDropdownContents = () => {\n return (\n <div\n onKeyDown={(e) => {\n // Stop all Tab events from reaching Popover's handlePopoverContentKeyDown (which closes on Tab).\n // Forward Tab: search → Clear → Apply → focus exits → useDismissOnFocusOut closes.\n // Shift+Tab: Apply → Clear → search → trigger.\n if (e.key === 'Tab') {\n e.stopPropagation();\n }\n }}\n >\n {shouldShowSearch && renderSearchBar()}\n <div\n className={`dropdown-content dropdown-options${shouldShowSearch ? '' : ' flex flex-col max-h-80 overflow-y-auto'}`}\n {...(shouldShowSearch ? {} : {\n ...multiSelectListboxProps,\n 'aria-label': `${defaultText} options`,\n 'aria-multiselectable': 'true',\n style: { outline: 'none' },\n tabIndex: -1,\n 'aria-activedescendant': multiSelectComboboxInputProps['aria-activedescendant'],\n onKeyDown: (e: React.KeyboardEvent) => multiSelectOnKeyDown(e, false),\n onFocus: () => {\n if (highlightedMultiSelectIndex === -1 && filteredOptions.length > 0) {\n setHighlightedMultiSelectIndex(0);\n }\n }\n })}\n >\n {shouldShowSearch ? (\n <div\n className=\"flex flex-col max-h-80 overflow-y-auto\"\n {...multiSelectListboxProps}\n aria-label={`${defaultText} options`}\n aria-multiselectable=\"true\"\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((dropDownOption, index) => multiSelectDropdownOptionJSX(dropDownOption, index))\n ) : (\n <div className=\"px-3 py-4 text-center text-[var(--color-gray-700)] text-sm\">\n {searchResultEmptyMessage}\n </div>\n )}\n </div>\n ) : (\n filteredOptions.length > 0 ? (\n filteredOptions.map((dropDownOption, index) => multiSelectDropdownOptionJSX(dropDownOption, index))\n ) : (\n <div className=\"px-3 py-4 text-center text-[var(--color-gray-700)] text-sm\">\n {searchResultEmptyMessage}\n </div>\n )\n )}\n </div>\n <div\n className=\"flex items-center justify-end gap-4 p-3 border-t border-[var(--color-gray-200)]\"\n onKeyDown={(e) => {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'Home' || e.key === 'End') {\n // Stop arrow keys from reaching Popover's handleArrowKeyNavigation\n // which would move focus out of the CTA buttons back into options\n e.stopPropagation();\n return;\n }\n if (e.key === 'Tab' && e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n if (shouldShowSearch) {\n searchInputRef.current?.focus();\n } else {\n multiSelectListboxProps.ref.current?.focus();\n }\n }\n }}\n >\n <Button label=\"Clear\" type=\"link\" size=\"sm\" onClick={clearSelectedDropDownValues} automationId=\"se-design-dropdown-clear-button\" />\n <Button label=\"Apply\" type=\"primary\" size=\"sm\" onClick={handleApplySelectedDropDownValues} automationId=\"se-design-dropdown-apply-button\" />\n </div>\n </div>\n );\n };\n\n const renderDropdownSelect = () => {\n const borderColor = isDropDownOpen\n ? 'border-[var(--color-blue-500)]'\n : disabled\n ? 'border-[var(--color-gray-300)]'\n : 'border-[var(--color-gray-600)]';\n const errorBorderColor = hasError ? 'border-[var(--color-red-500)]' : '';\n const dropDownSelectClass = `dropdown-src-element bg-[var(--color-white)] flex px-3 py-2 ${\n isBorderless ? 'border-0' : `border rounded-md ${errorBorderColor ? errorBorderColor : borderColor}`\n } flex items-center ${dropdownClassName}`;\n\n return (\n <div className={dropDownSelectClass}>\n <div\n id={valueId}\n className=\"flex-1 min-w-0\"\n data-automation-id={props?.dropDownSelectAutomationId || 'selected-dropdown-value'}\n >\n {optionChip(selectedDropDownValues[0], true)}\n </div>\n <div className=\"flex-shrink-0 ml-2\" aria-hidden=\"true\">\n <Icon\n name={'chevron'}\n rotation={isDropDownOpen ? '180' : '0'}\n className={`transition-transform`}\n stroke={iconColor}\n />\n </div>\n </div>\n );\n };\n\n const getDropdownAriaLabel = () => {\n const selectedLabel = selectedDropDownValues[0]?.[selectBy];\n if (ariaLabel && selectedLabel) {\n return `${ariaLabel}, ${selectedLabel}`;\n }\n return ariaLabel || defaultText || 'Select option';\n };\n\n // Trigger is always a button that reveals a listbox popup (Select/Listbox pattern).\n // For search-enabled dropdowns, the combobox role lives on the search input inside the popup.\n // This matches React Aria (useSelect), Radix (Select), and Headless UI (Listbox) — all use\n // role=\"button\" with real focus on options, separate from their Combobox components.\n const triggerSourceRole = 'button';\n\n // Trigger is always role=\"button\" — combobox ARIA (aria-activedescendant etc.)\n // lives on the search input inside the popup, not on the trigger.\n // Trigger only needs aria-haspopup + aria-expanded (Popover handles) + aria-controls.\n\n return (\n <div\n className={`se-design-dropdown-container${props?.className ? ` ${props?.className}` : ''}`}\n style={props?.style}\n >\n {props?.label ? (\n <div id={labelId} className={`se-design-dropdown-label ${firstOptionAsHeading ? 'sr-only' : 'mb-[3px] text-[var(--color-gray-700)] text-sm'}`}>\n {props?.label}\n </div>\n ) : !props?.ariaLabelledBy && ariaLabel ? (\n <span id={labelId} className=\"sr-only\">{ariaLabel}</span>\n ) : null}\n <div\n style={props?.style}\n className={`${disabled ? 'bg-[var(--color-gray-50)] rounded-md cursor-not-allowed' : ''}`}\n {...(!isMultiSelect ? {\n ...comboboxContainerProps,\n onKeyDownCapture: (e: React.KeyboardEvent<HTMLElement>) => {\n // Handle Escape/Tab BEFORE dismiss — React unmounts the popup after\n // dismiss's setState, so bubble-phase handlers never fire.\n if ((e.key === 'Escape' || e.key === 'Tab') && isDropDownOpen) {\n e.stopPropagation(); // prevent Popover wrapper + parent sidebar from seeing Escape\n popoverRef.current?.focusTrigger();\n }\n comboboxContainerProps.onKeyDownCapture?.(e);\n },\n // Portal content lives in document.body — focus moving into it looks like \"focus out\" to\n // the container's blur handler, causing immediate close. Suppress it; the Popover's own\n // onBlur handler checks both source and portal content and handles dismissal correctly.\n ...(isWithPortal ? { onBlurCapture: undefined } : {})\n } : {\n // Multi-select: only spread focus-tracking handlers for isKeyboardFocused.\n // Dismiss is handled by Popover — don't spread onBlurCapture.\n onPointerMove: multiSelectContainerProps.onPointerMove,\n onPointerDown: multiSelectContainerProps.onPointerDown,\n onPointerUp: multiSelectContainerProps.onPointerUp,\n onFocusCapture: multiSelectContainerProps.onFocusCapture,\n onKeyDownCapture: (e: React.KeyboardEvent<HTMLElement>) => {\n if (e.key === 'Escape' && isDropDownOpen) {\n e.stopPropagation();\n popoverRef.current?.focusTrigger();\n }\n multiSelectContainerProps.onKeyDownCapture?.(e);\n }\n })}\n >\n <Popover\n ref={popoverRef}\n isPopoverOpen={isDropDownOpen}\n isWithPortal={isWithPortal}\n renderPopoverContents={\n customDropdownContent\n ? customDropdownContent\n : isMultiSelect\n ? renderMultiSelectDropdownContents\n : renderDropdownContents\n }\n contentWidth={'full'}\n popoverContentStyleProperty={props.popoverContentStyleProperty}\n renderPopoverSrcElement={\n props.renderSrcElement\n ? () => props.renderSrcElement!({ isOpen: isDropDownOpen, selectedValue: selectedDropDownValues })\n : renderDropdownSelect\n }\n onPopoverToggle={(value) => {\n setIsDropDownOpen(value);\n if (value && !isMultiSelect && selectedDropDownValues.length > 0) {\n // Highlight the currently selected option when the dropdown opens (APG Select pattern)\n const selectedIndex = filteredOptions.findIndex(\n (option) => optionsUniqueBy\n ? option[optionsUniqueBy] === selectedDropDownValues[0]?.[optionsUniqueBy]\n : option[selectBy] === selectedDropDownValues[0]?.[selectBy]\n );\n if (selectedIndex >= 0) {\n setHighlightedIndex(selectedIndex);\n }\n }\n if (value && !shouldShowSearch) {\n // Focus listbox after Popover's own focus-first-on-open (setTimeout 0ms) has fired.\n // Using nested requestAnimationFrame ensures we run after both the Popover timeout\n // and any pending paint, so the listbox DOM is ready and we get the last word on focus.\n const ref = isMultiSelect ? multiSelectListboxProps.ref : listboxProps.ref;\n requestAnimationFrame(() => requestAnimationFrame(() => ref.current?.focus()));\n }\n // When search is enabled, Popover's focus-first-on-open naturally finds the search input.\n }}\n disabled={disabled}\n automationId={props?.dropDownSrcAutomationId}\n popoverContentAutomationId={props?.dropDownContentAutomationId}\n ariaLabelledBy={\n props?.label || props?.ariaLabelledBy || ariaLabel\n ? [props?.label || (!props?.ariaLabelledBy && ariaLabel) ? labelId : props?.ariaLabelledBy, valueId].filter(Boolean).join(' ')\n : undefined\n }\n ariaLabel={!props?.label && !ariaLabel && !props?.ariaLabelledBy ? getDropdownAriaLabel() : undefined}\n sourceRole={triggerSourceRole}\n {...{ 'aria-haspopup': 'listbox' }}\n {...(isDropDownOpen ? { 'aria-controls': listboxId } : {})}\n />\n </div>\n {hasError && <div className=\"text-[var(--color-red-500)] text-sm\">{errorMessage}</div>}\n </div>\n );\n};\n"],"names":["Dropdown","props","isControlledSelection","selectedValue","undefined","isControlledOpen","isOpen","internalIsOpen","setInternalIsOpen","useState","searchQuery","setSearchQuery","internalSelectedValues","setInternalSelectedValues","defaultSelectedValue","Array","isArray","popoverRef","useRef","searchInputRef","announce","useLiveAnnouncer","labelId","useStableId","valueId","listboxId","isDropDownOpen","selectedDropDownValues","setIsDropDownOpen","value","onOpenChange","setSelectedDropDownValues","values","selectBy","optionsUniqueBy","displaySelected","dropDownOptions","defaultText","iconColor","disabled","dropdownClassName","hasError","errorMessage","customDropdownContent","isBorderless","shouldShowSearch","showSearchIcon","searchPlaceholder","searchResultEmptyMessage","ariaLabel","customSelectedValue","isWithPortal","firstOptionAsHeading","useEffect","newValues","current","requestAnimationFrame","focus","useLayoutEffect","popoverElementRef","element","isMultiSelect","type","getFilteredOptions","trim","filter","option","toString","toLowerCase","includes","handleDropDownOptionClick","dropDownOption","onOptionClick","focusTrigger","filteredOptions","listboxProps","getOptionProps","highlightedIndex","setHighlightedIndex","containerProps","comboboxContainerProps","inputProps","comboboxInputProps","isKeyboardFocused","isSingleSelectKeyboardFocused","useCombobox","items","onSelect","item","hasItems","length","multiSelectComboboxInputProps","multiSelectListboxProps","multiSelectContainerProps","highlightedMultiSelectIndex","setHighlightedMultiSelectIndex","isMultiSelectKeyboardFocused","loop","closeOnTab","assertiveness","batchId","delay","getSelectedDropDownValue","isSrcOption","clearSelectedDropDownValues","onClear","optionChip","srcOption","renderOptionChip","firstSelectedLabel","remainingCount","React","createElement","className","selectedLabel","hasVisibleLabel","label","ariaLabelledBy","showPrefix","renderSearchInput","extraInputProps","InputWithIcon","leftIcon","name","position","style","color","onChange","placeholder","margin","gap","inputStyle","width","border","outline","automationId","inputRef","renderSearchBar","onKeyDown","e","multiSelectOnKeyDown","key","dropDownOptionJsx","index","optionTxt","dropDownSelectedValue","selectByUniqueId","isOptionSelected","isHighlighted","optionProps","_extends","id","onClick","preventDefault","tabIndex","Icon","stroke","renderDropdownContents","Fragment","onKeyDownCapture","onFocus","map","handleMultiSelectDropdownOptionClick","isSelected","newSelectedDropDownValues","handleApplySelectedDropDownValues","togglePopover","onApply","isSearchInput","some","v","stopPropagation","multiSelectDropdownOptionJSX","optionId","role","Checkbox","ariaHidden","checked","renderMultiSelectDropdownContents","shiftKey","ref","Button","size","renderDropdownSelect","borderColor","errorBorderColor","dropDownSelectClass","dropDownSelectAutomationId","rotation","getDropdownAriaLabel","onPointerMove","onPointerDown","onPointerUp","onFocusCapture","onBlurCapture","Popover","isPopoverOpen","renderPopoverContents","contentWidth","popoverContentStyleProperty","renderPopoverSrcElement","renderSrcElement","onPopoverToggle","selectedIndex","findIndex","dropDownSrcAutomationId","popoverContentAutomationId","dropDownContentAutomationId","Boolean","join","sourceRole"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index25.js","sources":["../src/components/Dropdown/index.tsx"],"sourcesContent":["import React, { FC, useState, useRef, useEffect, useLayoutEffect } from 'react';\n\nimport { Popover, PopoverHandle } from 'src/components/Popover';\nimport { Icon } from 'components/Icon';\nimport { Checkbox } from '../Checkbox';\nimport { Button } from '../Button';\nimport { InputWithIcon } from '../InputWithIcon';\nimport { useStableId } from '../../utils/useStableId';\nimport { useCombobox } from '../../utils/a11y/useCombobox';\nimport { announce } from '../../utils/a11y/liveAnnouncer/LiveAnnouncer';\n\ntype DropdownValue = {\n [key: string]: any;\n};\n\ntype DropdownProps = {\n label?: string;\n firstOptionAsHeading?: boolean;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n type: 'select' | 'multi-select';\n dropDownOptions?: DropdownValue[];\n defaultText?: string;\n selectBy?: string;\n optionsUniqueBy?: string;\n displaySelected?: boolean;\n defaultSelectedValue?: DropdownValue | DropdownValue[];\n customSelectedValue?: string;\n onOptionClick?: (selectedValue: DropdownValue) => void;\n style?: React.CSSProperties;\n renderOptionChip?: (option: DropdownValue, srcOption: boolean) => React.ReactNode;\n className?: string;\n iconColor?: string;\n disabled?: boolean;\n dropdownClassName?: string;\n hasError?: boolean;\n errorMessage?: string;\n onApply?: (selectedValue: DropdownValue[]) => void;\n onClear?: () => void;\n customDropdownContent?: () => React.ReactNode;\n isBorderless?: boolean;\n dropDownSrcAutomationId?: string;\n dropDownSelectAutomationId?: string;\n dropDownContentAutomationId?: string;\n shouldShowSearch?: boolean;\n showSearchIcon?: boolean;\n searchPlaceholder?: string;\n searchResultEmptyMessage?: string;\n /** Controlled selection — when provided, Dropdown won't manage internal selected state */\n selectedValue?: DropdownValue | DropdownValue[];\n /** Controlled open state — when provided, Dropdown won't manage internal open/close */\n isOpen?: boolean;\n /** Callback when open state changes (fires in both controlled and uncontrolled modes) */\n onOpenChange?: (isOpen: boolean) => void;\n /** Custom trigger element — replaces the default bordered div + chevron */\n renderSrcElement?: (props: { isOpen: boolean; selectedValue: DropdownValue[] }) => React.ReactNode;\n /** Render the dropdown panel in a portal (document.body) to escape overflow:hidden containers */\n isWithPortal?: boolean;\n /** Optional ref that will be populated with the Popover wrapper element on mount.\n * Use with setFocusAnchor() to return focus to the dropdown trigger after a modal closes. */\n popoverElementRef?: React.RefObject<HTMLElement | null>;\n /** Inline styles forwarded to the Popover content (portal or inline). Useful for min-width overrides. */\n popoverContentStyleProperty?: React.CSSProperties;\n};\n\nexport const Dropdown: FC<DropdownProps> = (props) => {\n const isControlledSelection = props.selectedValue !== undefined;\n const isControlledOpen = props.isOpen !== undefined;\n\n const [internalIsOpen, setInternalIsOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const [internalSelectedValues, setInternalSelectedValues] = useState<DropdownValue[]>(() =>\n props?.defaultSelectedValue\n ? Array.isArray(props?.defaultSelectedValue)\n ? props?.defaultSelectedValue\n : [props.defaultSelectedValue]\n : []\n );\n const popoverRef = useRef<HTMLDivElement & PopoverHandle>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n const labelId = useStableId(undefined, 'dropdown-label');\n const valueId = useStableId(undefined, 'dropdown-value');\n const listboxId = useStableId(undefined, 'dropdown-listbox');\n\n // Derived state: controlled props take precedence over internal state\n const isDropDownOpen = isControlledOpen ? props.isOpen! : internalIsOpen;\n const selectedDropDownValues = isControlledSelection\n ? (Array.isArray(props.selectedValue) ? props.selectedValue : props.selectedValue ? [props.selectedValue] : [])\n : internalSelectedValues;\n\n const setIsDropDownOpen = (value: boolean) => {\n if (!isControlledOpen) {\n setInternalIsOpen(value);\n }\n props.onOpenChange?.(value);\n };\n\n const setSelectedDropDownValues = (values: DropdownValue[]) => {\n if (!isControlledSelection) {\n setInternalSelectedValues(values);\n }\n };\n\n const {\n selectBy = '',\n optionsUniqueBy = '',\n displaySelected = false,\n dropDownOptions,\n defaultText = 'Select',\n iconColor = 'var(--color-gray-700)',\n disabled = false,\n dropdownClassName = '',\n hasError = false,\n errorMessage = '',\n customDropdownContent = null,\n isBorderless = false,\n shouldShowSearch = false,\n showSearchIcon = true,\n searchPlaceholder = 'Search...',\n searchResultEmptyMessage = 'No results found',\n ariaLabel = '',\n customSelectedValue = '',\n isWithPortal = false,\n firstOptionAsHeading = false\n } = props;\n\n useEffect(() => {\n if (!isControlledSelection) {\n const newValues = props?.defaultSelectedValue\n ? Array.isArray(props?.defaultSelectedValue)\n ? props?.defaultSelectedValue\n : [props.defaultSelectedValue]\n : [];\n setInternalSelectedValues(newValues);\n }\n }, [props?.defaultSelectedValue, isControlledSelection]);\n\n useEffect(() => {\n if (!isDropDownOpen) {\n setSearchQuery('');\n }\n }, [isDropDownOpen]);\n\n // Focus search input when dropdown opens with search enabled\n useEffect(() => {\n if (isDropDownOpen && shouldShowSearch && searchInputRef.current) {\n requestAnimationFrame(() => searchInputRef.current?.focus());\n }\n }, [isDropDownOpen, shouldShowSearch]);\n\n // Populate caller's popoverElementRef with the Popover wrapper element.\n // Runs after mount so popoverRef.current is set.\n useLayoutEffect(() => {\n if (props.popoverElementRef) {\n props.popoverElementRef.current = popoverRef.current?.element ?? null;\n }\n });\n\n const isMultiSelect = props?.type === 'multi-select';\n\n const getFilteredOptions = () => {\n if (!searchQuery.trim()) {\n return dropDownOptions || [];\n }\n return (dropDownOptions || []).filter((option) => {\n const optionValue = option?.[selectBy]?.toString().toLowerCase() || '';\n return optionValue.includes(searchQuery.toLowerCase());\n });\n };\n\n const handleDropDownOptionClick = (dropDownOption: any) => {\n setSelectedDropDownValues([dropDownOption]);\n setIsDropDownOpen(false);\n props?.onOptionClick?.(dropDownOption);\n // Restore focus to the trigger after portal unmounts.\n // Double rAF ensures this runs after React re-renders AND the focus trap safety net,\n // getting the final say on focus.\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n popoverRef.current?.focusTrigger();\n });\n });\n };\n\n // Use useCombobox hook for keyboard navigation (only for single-select)\n const filteredOptions = getFilteredOptions();\n const {\n listboxProps,\n getOptionProps,\n highlightedIndex,\n setHighlightedIndex,\n containerProps: comboboxContainerProps,\n inputProps: comboboxInputProps,\n isKeyboardFocused: isSingleSelectKeyboardFocused\n } = useCombobox({\n items: isMultiSelect ? [] : filteredOptions, // Only use for single-select\n isOpen: isDropDownOpen && !isMultiSelect,\n onOpenChange: setIsDropDownOpen,\n onSelect: (item: DropdownValue) => {\n handleDropDownOptionClick(item);\n },\n listboxId,\n disabled: isMultiSelect || disabled,\n hasItems: filteredOptions.length > 0\n });\n\n // Second useCombobox for multi-select: provides ARIA props, keyboard navigation, and auto-scroll.\n // Enter/Space are intercepted in multiSelectOnKeyDown to avoid the hook's highlight reset after select.\n const {\n inputProps: multiSelectComboboxInputProps,\n listboxProps: multiSelectListboxProps,\n containerProps: multiSelectContainerProps,\n highlightedIndex: highlightedMultiSelectIndex,\n setHighlightedIndex: setHighlightedMultiSelectIndex,\n isKeyboardFocused: isMultiSelectKeyboardFocused\n } = useCombobox({\n items: isMultiSelect ? filteredOptions : [],\n isOpen: isDropDownOpen && isMultiSelect,\n onOpenChange: setIsDropDownOpen,\n onSelect: () => {},\n listboxId,\n disabled: !isMultiSelect,\n loop: false,\n hasItems: filteredOptions.length > 0,\n closeOnTab: false\n });\n\n useEffect(() => {\n if (isDropDownOpen && filteredOptions.length === 0 && searchQuery.trim()) {\n announce(searchResultEmptyMessage, { assertiveness: 'polite', batchId: 'dropdown-empty-state', delay: 300 });\n }\n }, [filteredOptions.length, isDropDownOpen, searchQuery]);\n\n const getSelectedDropDownValue = (option: DropdownValue, isSrcOption: boolean = false) => {\n if (isMultiSelect) {\n return defaultText;\n }\n\n // if custom selected value is provided, use it instead of the option value\n if (isSrcOption && customSelectedValue) {\n return customSelectedValue;\n }\n\n return option?.[selectBy] || defaultText;\n };\n\n const clearSelectedDropDownValues = () => {\n setSelectedDropDownValues([]);\n props?.onClear?.();\n };\n\n const optionChip = (option: DropdownValue, srcOption: boolean = false) => {\n if (props?.renderOptionChip) {\n return props?.renderOptionChip(option, srcOption);\n }\n\n if (isMultiSelect && selectedDropDownValues?.length > 0) {\n const firstSelectedLabel = selectedDropDownValues[0]?.[selectBy] || '';\n const remainingCount = selectedDropDownValues.length - 1;\n\n // For multiple selections: text takes remaining space, count takes minimum space needed\n return (\n <div className={`option-chip flex items-center w-full`}>\n <div\n className={`${remainingCount > 0 ? 'w-full' : 'flex-1'} truncate`}\n >{`${defaultText}: ${firstSelectedLabel}`}</div>\n {remainingCount > 0 && <div className=\"flex-shrink-0\">+{remainingCount}</div>}\n </div>\n );\n }\n\n const selectedLabel = getSelectedDropDownValue(option, srcOption);\n const hasVisibleLabel = !!props?.label || !!props?.ariaLabelledBy;\n const showPrefix = srcOption && defaultText && option?.[selectBy] && !customSelectedValue && !hasVisibleLabel;\n\n return (\n <p className={`option-chip flex flex-1 items-center justify-between`}>\n {showPrefix ? `${defaultText}: ${selectedLabel}` : selectedLabel}\n </p>\n );\n };\n\n const renderSearchInput = (extraInputProps: Record<string, any>) => (\n <div className=\" w-full relative flex items-center border-b border-[var(--color-gray-300)]\">\n <InputWithIcon\n leftIcon={showSearchIcon ? { name: 'search', position: 'left', style: { color: 'var(--color-gray-500)' } } : undefined}\n value={searchQuery}\n onChange={(value) => setSearchQuery(value)}\n placeholder={searchPlaceholder}\n style={{ margin: 0, gap: 0 }}\n inputStyle={{ width: '100%', border: 'none', outline: 'none' }}\n automationId=\"se-design-dropdown-search\"\n ariaLabel={searchPlaceholder}\n inputRef={searchInputRef}\n inputProps={extraInputProps}\n />\n </div>\n );\n\n const renderSearchBar = () => {\n if (isMultiSelect) {\n return renderSearchInput({\n ...multiSelectComboboxInputProps,\n onKeyDown: (e: React.KeyboardEvent) => multiSelectOnKeyDown(e, true)\n });\n }\n\n // Single-select: wrap onKeyDown to add Escape → focusTrigger (portal-safe)\n return renderSearchInput({\n ...comboboxInputProps,\n onKeyDown: (e: React.KeyboardEvent) => {\n comboboxInputProps.onKeyDown(e);\n if (e.key === 'Escape') {\n requestAnimationFrame(() => popoverRef.current?.focusTrigger());\n }\n }\n });\n };\n\n const dropDownOptionJsx = (dropDownOption: DropdownValue, index: number) => {\n const optionTxt = dropDownOption[selectBy];\n const dropDownSelectedValue = selectedDropDownValues[0]?.[selectBy] || defaultText;\n const selectByUniqueId = optionsUniqueBy?.length\n ? dropDownOption[optionsUniqueBy] == selectedDropDownValues[0]?.[optionsUniqueBy]\n : true;\n const isOptionSelected = displaySelected && optionTxt === dropDownSelectedValue && selectByUniqueId;\n const isHighlighted = highlightedIndex === index;\n const optionProps = !isMultiSelect ? getOptionProps(index, isOptionSelected) : {};\n\n return (\n <div\n key={dropDownOption.id || dropDownOption.value}\n className={`option break-words px-3 py-2 hover:bg-[var(--color-gray-100)] cursor-pointer select-none flex items-center justify-between ${\n isOptionSelected ? 'selected' : ''\n } ${isHighlighted ? `bg-[var(--color-gray-100)]${isSingleSelectKeyboardFocused ? ' outline outline-[length:var(--focus-width)] -outline-offset-2 outline-[var(--focus-color)]' : ''}` : ''}`}\n onClick={() => handleDropDownOptionClick(dropDownOption)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleDropDownOptionClick(dropDownOption);\n } else if (e.key === 'Escape') {\n requestAnimationFrame(() => popoverRef.current?.focusTrigger());\n }\n }}\n tabIndex={-1}\n data-automation-id={`dropdown-option-${dropDownOption?.automationId || index}`}\n {...optionProps}\n aria-selected={isOptionSelected ? 'true' : 'false'}\n >\n {optionChip({ ...dropDownOption, isOptionSelected }, false)}\n {isOptionSelected && <Icon name=\"checkmark\" stroke={iconColor} />}\n </div>\n );\n };\n\n const renderDropdownContents = () => {\n return (\n <>\n {props?.label && firstOptionAsHeading && (\n <div\n aria-hidden=\"true\"\n className=\"px-3 pt-2 pb-1 text-[var(--color-gray-650)] text-xs cursor-default select-none\"\n >\n {props.label}\n </div>\n )}\n {shouldShowSearch && renderSearchBar()}\n <div\n className={`dropdown-content dropdown-options${shouldShowSearch ? '' : ' flex flex-col max-h-80 overflow-y-auto'}`}\n {...(shouldShowSearch ? {} : {\n ...listboxProps,\n 'aria-label': `${defaultText} options`,\n style: { outline: 'none' },\n tabIndex: -1,\n 'aria-activedescendant': comboboxInputProps['aria-activedescendant'],\n onKeyDown: (e: React.KeyboardEvent) => {\n comboboxContainerProps.onKeyDownCapture?.(e as React.KeyboardEvent<HTMLElement>);\n if (e.key === ' ') {\n e.preventDefault();\n if (highlightedIndex >= 0 && filteredOptions[highlightedIndex]) {\n handleDropDownOptionClick(filteredOptions[highlightedIndex]);\n }\n return;\n }\n comboboxInputProps.onKeyDown(e);\n },\n onFocus: () => {\n if (highlightedIndex === -1 && filteredOptions.length > 0) {\n setHighlightedIndex(0);\n }\n }\n })}\n >\n {shouldShowSearch ? (\n <div\n className=\"flex flex-col max-h-80 overflow-y-auto\"\n aria-label={`${defaultText} options`}\n {...listboxProps}\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((dropDownOption, index) => dropDownOptionJsx(dropDownOption, index))\n ) : (\n <div className=\"px-3 py-4 text-center text-[var(--color-gray-700)] text-sm\">\n {searchResultEmptyMessage}\n </div>\n )}\n </div>\n ) : (\n filteredOptions.length > 0 ? (\n filteredOptions.map((dropDownOption, index) => dropDownOptionJsx(dropDownOption, index))\n ) : (\n <div className=\"px-3 py-4 text-center text-[var(--color-gray-700)] text-sm\">\n {searchResultEmptyMessage}\n </div>\n )\n )}\n </div>\n </>\n );\n };\n\n const handleMultiSelectDropdownOptionClick = (isSelected: boolean, dropDownOption: DropdownValue) => {\n let newSelectedDropDownValues: DropdownValue[] = [];\n if (isSelected) {\n newSelectedDropDownValues = [...selectedDropDownValues, dropDownOption];\n } else {\n newSelectedDropDownValues = selectedDropDownValues?.filter(\n (option) => option[optionsUniqueBy] !== dropDownOption[optionsUniqueBy]\n );\n }\n setSelectedDropDownValues(newSelectedDropDownValues);\n };\n\n const handleApplySelectedDropDownValues = () => {\n popoverRef.current?.togglePopover();\n props?.onApply?.(selectedDropDownValues);\n };\n\n // Wraps the multi-select useCombobox's onKeyDown.\n // - Intercepts Enter/Space to toggle selection without resetting the highlight\n // (the hook resets highlightedIndex to -1 after onSelect, which is wrong for multi-select).\n // - When isSearchInput is true, Space is left for typing.\n // - Adds focusTrigger on Escape (Popover's handler is unreliable for portals).\n const multiSelectOnKeyDown = (e: React.KeyboardEvent, isSearchInput: boolean = false) => {\n if (isSearchInput && e.key === ' ') return;\n\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n if (highlightedMultiSelectIndex >= 0 && highlightedMultiSelectIndex < filteredOptions.length) {\n const option = filteredOptions[highlightedMultiSelectIndex];\n const isSelected = selectedDropDownValues.some(\n (v) => v[optionsUniqueBy] === option[optionsUniqueBy]\n );\n handleMultiSelectDropdownOptionClick(!isSelected, option);\n }\n return;\n }\n\n multiSelectComboboxInputProps.onKeyDown(e);\n\n if (e.key === 'Escape') {\n e.stopPropagation();\n requestAnimationFrame(() => popoverRef.current?.focusTrigger());\n }\n };\n\n const multiSelectDropdownOptionJSX = (dropDownOption: DropdownValue, index: number) => {\n const isOptionSelected = selectedDropDownValues.some(\n (option) => option[optionsUniqueBy] === dropDownOption[optionsUniqueBy]\n );\n const optionId = `${listboxId}-option-${index}`;\n const isHighlighted = highlightedMultiSelectIndex === index;\n\n return (\n <div\n key={dropDownOption.id || dropDownOption.value}\n id={optionId}\n role=\"option\"\n aria-selected={isOptionSelected}\n className={`option px-3 py-2 hover:bg-[var(--color-gray-100)] cursor-pointer select-none flex items-center gap-2 ${\n isHighlighted ? `bg-[var(--color-gray-100)]${isMultiSelectKeyboardFocused ? ' outline outline-[length:var(--focus-width)] -outline-offset-2 outline-[var(--focus-color)]' : ''}` : ''\n }`}\n onClick={() => handleMultiSelectDropdownOptionClick(!isOptionSelected, dropDownOption)}\n data-automation-id={`dropdown-option-${dropDownOption?.automationId || index}`}\n >\n <Checkbox\n tabIndex={-1}\n ariaHidden\n checked={isOptionSelected}\n onChange={() => {}}\n className=\"pointer-events-none\"\n />\n <span className=\"checkbox-label\">{dropDownOption?.label}</span>\n </div>\n );\n };\n\n const renderMultiSelectDropdownContents = () => {\n return (\n <div\n onKeyDown={(e) => {\n // Stop all Tab events from reaching Popover's handlePopoverContentKeyDown (which closes on Tab).\n // Forward Tab: search → Clear → Apply → focus exits → useDismissOnFocusOut closes.\n // Shift+Tab: Apply → Clear → search → trigger.\n if (e.key === 'Tab') {\n e.stopPropagation();\n }\n }}\n >\n {shouldShowSearch && renderSearchBar()}\n <div\n className={`dropdown-content dropdown-options${shouldShowSearch ? '' : ' flex flex-col max-h-80 overflow-y-auto'}`}\n {...(shouldShowSearch ? {} : {\n ...multiSelectListboxProps,\n 'aria-label': `${defaultText} options`,\n 'aria-multiselectable': 'true',\n style: { outline: 'none' },\n tabIndex: -1,\n 'aria-activedescendant': multiSelectComboboxInputProps['aria-activedescendant'],\n onKeyDown: (e: React.KeyboardEvent) => multiSelectOnKeyDown(e, false),\n onFocus: () => {\n if (highlightedMultiSelectIndex === -1 && filteredOptions.length > 0) {\n setHighlightedMultiSelectIndex(0);\n }\n }\n })}\n >\n {shouldShowSearch ? (\n <div\n className=\"flex flex-col max-h-80 overflow-y-auto\"\n {...multiSelectListboxProps}\n aria-label={`${defaultText} options`}\n aria-multiselectable=\"true\"\n >\n {filteredOptions.length > 0 ? (\n filteredOptions.map((dropDownOption, index) => multiSelectDropdownOptionJSX(dropDownOption, index))\n ) : (\n <div className=\"px-3 py-4 text-center text-[var(--color-gray-700)] text-sm\">\n {searchResultEmptyMessage}\n </div>\n )}\n </div>\n ) : (\n filteredOptions.length > 0 ? (\n filteredOptions.map((dropDownOption, index) => multiSelectDropdownOptionJSX(dropDownOption, index))\n ) : (\n <div className=\"px-3 py-4 text-center text-[var(--color-gray-700)] text-sm\">\n {searchResultEmptyMessage}\n </div>\n )\n )}\n </div>\n <div\n className=\"flex items-center justify-end gap-4 p-3 border-t border-[var(--color-gray-200)]\"\n onKeyDown={(e) => {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'Home' || e.key === 'End') {\n // Stop arrow keys from reaching Popover's handleArrowKeyNavigation\n // which would move focus out of the CTA buttons back into options\n e.stopPropagation();\n return;\n }\n if (e.key === 'Tab' && e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n if (shouldShowSearch) {\n searchInputRef.current?.focus();\n } else {\n multiSelectListboxProps.ref.current?.focus();\n }\n }\n }}\n >\n <Button label=\"Clear\" type=\"link\" size=\"sm\" onClick={clearSelectedDropDownValues} automationId=\"se-design-dropdown-clear-button\" />\n <Button label=\"Apply\" type=\"primary\" size=\"sm\" onClick={handleApplySelectedDropDownValues} automationId=\"se-design-dropdown-apply-button\" />\n </div>\n </div>\n );\n };\n\n const renderDropdownSelect = () => {\n const borderColor = isDropDownOpen\n ? 'border-[var(--color-blue-500)]'\n : disabled\n ? 'border-[var(--color-gray-300)]'\n : 'border-[var(--color-gray-600)]';\n const errorBorderColor = hasError ? 'border-[var(--color-red-500)]' : '';\n const dropDownSelectClass = `dropdown-src-element bg-[var(--color-white)] flex px-3 py-2 ${\n isBorderless ? 'border-0' : `border rounded-md ${errorBorderColor ? errorBorderColor : borderColor}`\n } flex items-center ${dropdownClassName}`;\n\n return (\n <div className={dropDownSelectClass}>\n <div\n id={valueId}\n className=\"flex-1 min-w-0\"\n data-automation-id={props?.dropDownSelectAutomationId || 'selected-dropdown-value'}\n >\n {optionChip(selectedDropDownValues[0], true)}\n </div>\n <div className=\"flex-shrink-0 ml-2\" aria-hidden=\"true\">\n <Icon\n name={'chevron'}\n rotation={isDropDownOpen ? '180' : '0'}\n className={`transition-transform`}\n stroke={iconColor}\n />\n </div>\n </div>\n );\n };\n\n const getDropdownAriaLabel = () => {\n const selectedLabel = selectedDropDownValues[0]?.[selectBy];\n if (ariaLabel && selectedLabel) {\n return `${ariaLabel}, ${selectedLabel}`;\n }\n return ariaLabel || defaultText || 'Select option';\n };\n\n // Trigger is always a button that reveals a listbox popup (Select/Listbox pattern).\n // For search-enabled dropdowns, the combobox role lives on the search input inside the popup.\n // This matches React Aria (useSelect), Radix (Select), and Headless UI (Listbox) — all use\n // role=\"button\" with real focus on options, separate from their Combobox components.\n const triggerSourceRole = 'button';\n\n // Trigger is always role=\"button\" — combobox ARIA (aria-activedescendant etc.)\n // lives on the search input inside the popup, not on the trigger.\n // Trigger only needs aria-haspopup + aria-expanded (Popover handles) + aria-controls.\n\n return (\n <div\n className={`se-design-dropdown-container${props?.className ? ` ${props?.className}` : ''}`}\n style={props?.style}\n >\n {props?.label ? (\n <div id={labelId} className={`se-design-dropdown-label ${firstOptionAsHeading ? 'sr-only' : 'mb-[3px] text-[var(--color-gray-700)] text-sm'}`}>\n {props?.label}\n </div>\n ) : !props?.ariaLabelledBy && ariaLabel ? (\n <span id={labelId} className=\"sr-only\">{ariaLabel}</span>\n ) : null}\n <div\n style={props?.style}\n className={`${disabled ? 'bg-[var(--color-gray-50)] rounded-md cursor-not-allowed' : ''}`}\n {...(!isMultiSelect ? {\n ...comboboxContainerProps,\n onKeyDownCapture: (e: React.KeyboardEvent<HTMLElement>) => {\n // Handle Escape/Tab BEFORE dismiss — React unmounts the popup after\n // dismiss's setState, so bubble-phase handlers never fire.\n if ((e.key === 'Escape' || e.key === 'Tab') && isDropDownOpen) {\n e.stopPropagation(); // prevent Popover wrapper + parent sidebar from seeing Escape\n popoverRef.current?.focusTrigger();\n }\n comboboxContainerProps.onKeyDownCapture?.(e);\n },\n // Portal content lives in document.body — focus moving into it looks like \"focus out\" to\n // the container's blur handler, causing immediate close. Suppress it; the Popover's own\n // onBlur handler checks both source and portal content and handles dismissal correctly.\n ...(isWithPortal ? { onBlurCapture: undefined } : {})\n } : {\n // Multi-select: only spread focus-tracking handlers for isKeyboardFocused.\n // Dismiss is handled by Popover — don't spread onBlurCapture.\n onPointerMove: multiSelectContainerProps.onPointerMove,\n onPointerDown: multiSelectContainerProps.onPointerDown,\n onPointerUp: multiSelectContainerProps.onPointerUp,\n onFocusCapture: multiSelectContainerProps.onFocusCapture,\n onKeyDownCapture: (e: React.KeyboardEvent<HTMLElement>) => {\n if (e.key === 'Escape' && isDropDownOpen) {\n e.stopPropagation();\n popoverRef.current?.focusTrigger();\n }\n multiSelectContainerProps.onKeyDownCapture?.(e);\n }\n })}\n >\n <Popover\n ref={popoverRef}\n isPopoverOpen={isDropDownOpen}\n isWithPortal={isWithPortal}\n renderPopoverContents={\n customDropdownContent\n ? customDropdownContent\n : isMultiSelect\n ? renderMultiSelectDropdownContents\n : renderDropdownContents\n }\n contentWidth={'full'}\n popoverContentStyleProperty={props.popoverContentStyleProperty}\n renderPopoverSrcElement={\n props.renderSrcElement\n ? () => props.renderSrcElement!({ isOpen: isDropDownOpen, selectedValue: selectedDropDownValues })\n : renderDropdownSelect\n }\n onPopoverToggle={(value) => {\n setIsDropDownOpen(value);\n if (value && !isMultiSelect && selectedDropDownValues.length > 0) {\n // Highlight the currently selected option when the dropdown opens (APG Select pattern)\n const selectedIndex = filteredOptions.findIndex(\n (option) => optionsUniqueBy\n ? option[optionsUniqueBy] === selectedDropDownValues[0]?.[optionsUniqueBy]\n : option[selectBy] === selectedDropDownValues[0]?.[selectBy]\n );\n if (selectedIndex >= 0) {\n setHighlightedIndex(selectedIndex);\n }\n }\n if (value && !shouldShowSearch) {\n // Focus listbox after Popover's own focus-first-on-open (setTimeout 0ms) has fired.\n // Using nested requestAnimationFrame ensures we run after both the Popover timeout\n // and any pending paint, so the listbox DOM is ready and we get the last word on focus.\n const ref = isMultiSelect ? multiSelectListboxProps.ref : listboxProps.ref;\n requestAnimationFrame(() => requestAnimationFrame(() => ref.current?.focus()));\n }\n // When search is enabled, Popover's focus-first-on-open naturally finds the search input.\n }}\n disabled={disabled}\n automationId={props?.dropDownSrcAutomationId}\n popoverContentAutomationId={props?.dropDownContentAutomationId}\n ariaLabelledBy={\n props?.label || props?.ariaLabelledBy || ariaLabel\n ? [props?.label || (!props?.ariaLabelledBy && ariaLabel) ? labelId : props?.ariaLabelledBy, valueId].filter(Boolean).join(' ')\n : undefined\n }\n ariaLabel={!props?.label && !ariaLabel && !props?.ariaLabelledBy ? getDropdownAriaLabel() : undefined}\n sourceRole={triggerSourceRole}\n {...{ 'aria-haspopup': 'listbox' }}\n {...(isDropDownOpen ? { 'aria-controls': listboxId } : {})}\n />\n </div>\n {hasError && <div className=\"text-[var(--color-red-500)] text-sm\">{errorMessage}</div>}\n </div>\n );\n};\n"],"names":["Dropdown","props","isControlledSelection","selectedValue","undefined","isControlledOpen","isOpen","internalIsOpen","setInternalIsOpen","useState","searchQuery","setSearchQuery","internalSelectedValues","setInternalSelectedValues","defaultSelectedValue","Array","isArray","popoverRef","useRef","searchInputRef","labelId","useStableId","valueId","listboxId","isDropDownOpen","selectedDropDownValues","setIsDropDownOpen","value","onOpenChange","setSelectedDropDownValues","values","selectBy","optionsUniqueBy","displaySelected","dropDownOptions","defaultText","iconColor","disabled","dropdownClassName","hasError","errorMessage","customDropdownContent","isBorderless","shouldShowSearch","showSearchIcon","searchPlaceholder","searchResultEmptyMessage","ariaLabel","customSelectedValue","isWithPortal","firstOptionAsHeading","useEffect","newValues","current","requestAnimationFrame","focus","useLayoutEffect","popoverElementRef","element","isMultiSelect","type","getFilteredOptions","trim","filter","option","toString","toLowerCase","includes","handleDropDownOptionClick","dropDownOption","onOptionClick","focusTrigger","filteredOptions","listboxProps","getOptionProps","highlightedIndex","setHighlightedIndex","containerProps","comboboxContainerProps","inputProps","comboboxInputProps","isKeyboardFocused","isSingleSelectKeyboardFocused","useCombobox","items","onSelect","item","hasItems","length","multiSelectComboboxInputProps","multiSelectListboxProps","multiSelectContainerProps","highlightedMultiSelectIndex","setHighlightedMultiSelectIndex","isMultiSelectKeyboardFocused","loop","closeOnTab","announce","assertiveness","batchId","delay","getSelectedDropDownValue","isSrcOption","clearSelectedDropDownValues","onClear","optionChip","srcOption","renderOptionChip","firstSelectedLabel","remainingCount","React","createElement","className","selectedLabel","hasVisibleLabel","label","ariaLabelledBy","showPrefix","renderSearchInput","extraInputProps","InputWithIcon","leftIcon","name","position","style","color","onChange","placeholder","margin","gap","inputStyle","width","border","outline","automationId","inputRef","renderSearchBar","onKeyDown","e","multiSelectOnKeyDown","key","dropDownOptionJsx","index","optionTxt","dropDownSelectedValue","selectByUniqueId","isOptionSelected","isHighlighted","optionProps","_extends","id","onClick","preventDefault","tabIndex","Icon","stroke","renderDropdownContents","Fragment","onKeyDownCapture","onFocus","map","handleMultiSelectDropdownOptionClick","isSelected","newSelectedDropDownValues","handleApplySelectedDropDownValues","togglePopover","onApply","isSearchInput","some","v","stopPropagation","multiSelectDropdownOptionJSX","optionId","role","Checkbox","ariaHidden","checked","renderMultiSelectDropdownContents","shiftKey","ref","Button","size","renderDropdownSelect","borderColor","errorBorderColor","dropDownSelectClass","dropDownSelectAutomationId","rotation","getDropdownAriaLabel","onPointerMove","onPointerDown","onPointerUp","onFocusCapture","onBlurCapture","Popover","isPopoverOpen","renderPopoverContents","contentWidth","popoverContentStyleProperty","renderPopoverSrcElement","renderSrcElement","onPopoverToggle","selectedIndex","findIndex","dropDownSrcAutomationId","popoverContentAutomationId","dropDownContentAutomationId","Boolean","join","sourceRole"],"mappings":"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"}
|
package/dist/index38.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { Popover as
|
|
3
|
-
import { Icon as
|
|
4
|
-
import { Checkbox as
|
|
1
|
+
import a, { forwardRef as be, useState as _, useRef as M, useCallback as F, useEffect as W, useImperativeHandle as Ee } from "react";
|
|
2
|
+
import { Popover as Pe } from "./index19.js";
|
|
3
|
+
import { Icon as Ce } from "./index6.js";
|
|
4
|
+
import { Checkbox as Se } from "./index23.js";
|
|
5
5
|
import { Button as X } from "./index4.js";
|
|
6
|
-
import { getA11yNameAttributes as
|
|
6
|
+
import { getA11yNameAttributes as De } from "./index81.js";
|
|
7
7
|
import "./index72.js";
|
|
8
|
-
import { useCombobox as
|
|
9
|
-
import { useStableId as
|
|
10
|
-
import {
|
|
8
|
+
import { useCombobox as Ne } from "./index68.js";
|
|
9
|
+
import { useStableId as $e } from "./index205.js";
|
|
10
|
+
import { announce as Oe } from "./index75.js";
|
|
11
11
|
/* empty css */
|
|
12
12
|
function g() {
|
|
13
13
|
return g = Object.assign ? Object.assign.bind() : function(h) {
|
|
@@ -18,7 +18,7 @@ function g() {
|
|
|
18
18
|
return h;
|
|
19
19
|
}, g.apply(null, arguments);
|
|
20
20
|
}
|
|
21
|
-
const
|
|
21
|
+
const We = /* @__PURE__ */ be(({
|
|
22
22
|
value: h,
|
|
23
23
|
onChange: i,
|
|
24
24
|
placeholder: k = "Type to search or add custom tags...",
|
|
@@ -32,7 +32,7 @@ const xe = /* @__PURE__ */ Ee(({
|
|
|
32
32
|
automationId: u = "",
|
|
33
33
|
noOptionsMessage: U = "No options found",
|
|
34
34
|
allowCustomTags: j = !0,
|
|
35
|
-
disabled:
|
|
35
|
+
disabled: r = !1,
|
|
36
36
|
type: H = "select",
|
|
37
37
|
showInput: z = !0,
|
|
38
38
|
displayTagBy: B = "label",
|
|
@@ -47,21 +47,21 @@ const xe = /* @__PURE__ */ Ee(({
|
|
|
47
47
|
label: t,
|
|
48
48
|
value: t
|
|
49
49
|
};
|
|
50
|
-
}), [o, f] = _(() => G(h || [])), [l, b] = _(""), [K,
|
|
51
|
-
if (
|
|
50
|
+
}), [o, f] = _(() => G(h || [])), [l, b] = _(""), [K, ae] = _(d), [p, c] = _(!1), re = M(null), S = M(null), D = M(!1), E = H === "multi-select-without-cta", m = H === "multi-select" || E, oe = $e(u, "dropdown-input-tags-listbox"), N = F((e) => {
|
|
51
|
+
if (r) return;
|
|
52
52
|
const t = [...o];
|
|
53
53
|
t.some((n) => n.value === e.value) || (t.push({
|
|
54
54
|
label: e.label,
|
|
55
55
|
value: e.value
|
|
56
56
|
}), f(t), i?.(t.map((n) => n.value))), b(""), c(!1);
|
|
57
|
-
}, [
|
|
57
|
+
}, [r, o, i]), V = F((e, t) => {
|
|
58
58
|
let n = [];
|
|
59
59
|
e ? n = [...o, {
|
|
60
60
|
label: t.label,
|
|
61
61
|
value: t.value
|
|
62
62
|
}] : n = o.filter((s) => s.value !== t.value), f(n), b(""), E && (D.current = !0, i?.(n.map((s) => s.value)));
|
|
63
63
|
}, [o, E, i]), $ = "__add_custom_tag__", q = F((e) => {
|
|
64
|
-
if (!
|
|
64
|
+
if (!r) {
|
|
65
65
|
if (e.value === $) {
|
|
66
66
|
const t = l.trim();
|
|
67
67
|
if (!t) return;
|
|
@@ -74,11 +74,11 @@ const xe = /* @__PURE__ */ Ee(({
|
|
|
74
74
|
}
|
|
75
75
|
if (m) {
|
|
76
76
|
const t = o.some((n) => n.value === e.value);
|
|
77
|
-
|
|
77
|
+
V(!t, e);
|
|
78
78
|
} else
|
|
79
79
|
N(e);
|
|
80
80
|
}
|
|
81
|
-
}, [
|
|
81
|
+
}, [r, m, o, l, i, V, N]), v = K.length > 0 ? K : j && l.trim() ? [{
|
|
82
82
|
id: $,
|
|
83
83
|
label: `Add "${l.trim()}"`,
|
|
84
84
|
value: $
|
|
@@ -86,11 +86,11 @@ const xe = /* @__PURE__ */ Ee(({
|
|
|
86
86
|
containerProps: le,
|
|
87
87
|
inputProps: J,
|
|
88
88
|
listboxProps: se,
|
|
89
|
-
getOptionProps:
|
|
90
|
-
highlightedIndex:
|
|
89
|
+
getOptionProps: O,
|
|
90
|
+
highlightedIndex: A,
|
|
91
91
|
setHighlightedIndex: w,
|
|
92
92
|
isKeyboardFocused: Q
|
|
93
|
-
} =
|
|
93
|
+
} = Ne({
|
|
94
94
|
items: v,
|
|
95
95
|
isOpen: p,
|
|
96
96
|
onOpenChange: c,
|
|
@@ -108,24 +108,20 @@ const xe = /* @__PURE__ */ Ee(({
|
|
|
108
108
|
f(G(h || []));
|
|
109
109
|
}, [h, d, p]), W(() => {
|
|
110
110
|
const e = d.filter((t) => t.label.toLowerCase().includes(l.toLowerCase()) || t.value.toLowerCase().includes(l.toLowerCase()));
|
|
111
|
-
|
|
112
|
-
}, [l, d])
|
|
113
|
-
|
|
114
|
-
announce: ie
|
|
115
|
-
} = Oe();
|
|
116
|
-
W(() => {
|
|
117
|
-
p && v.length === 0 && l.trim() && ie(U, {
|
|
111
|
+
ae(e);
|
|
112
|
+
}, [l, d]), W(() => {
|
|
113
|
+
p && v.length === 0 && l.trim() && Oe(U, {
|
|
118
114
|
assertiveness: "polite",
|
|
119
115
|
batchId: "dropdown-input-tags-empty-state",
|
|
120
116
|
delay: 300
|
|
121
117
|
});
|
|
122
118
|
}, [v.length, p, l]);
|
|
123
|
-
const
|
|
124
|
-
if (
|
|
119
|
+
const ie = (e) => {
|
|
120
|
+
if (r) return;
|
|
125
121
|
const t = o.filter((n, s) => s !== e);
|
|
126
122
|
f(t), (!m || E || m && !p) && i?.(t.map((n) => n.value));
|
|
127
|
-
},
|
|
128
|
-
if (!
|
|
123
|
+
}, ce = (e) => {
|
|
124
|
+
if (!r) {
|
|
129
125
|
if (e.key === "Backspace" && l === "" && o.length > 0) {
|
|
130
126
|
e.preventDefault();
|
|
131
127
|
const t = o.slice(0, -1);
|
|
@@ -143,59 +139,59 @@ const xe = /* @__PURE__ */ Ee(({
|
|
|
143
139
|
}
|
|
144
140
|
J.onKeyDown(e);
|
|
145
141
|
}
|
|
146
|
-
},
|
|
147
|
-
if (
|
|
142
|
+
}, ue = (e) => {
|
|
143
|
+
if (r) return;
|
|
148
144
|
const t = e.target.value;
|
|
149
145
|
b(t), w(-1), t.trim() && !p && c(!0);
|
|
150
|
-
},
|
|
151
|
-
|
|
146
|
+
}, pe = () => {
|
|
147
|
+
r || (l.trim() || d.length > 0) && c(!0);
|
|
148
|
+
}, me = (e) => {
|
|
149
|
+
r || (e.stopPropagation(), S.current?.focus(), !p && (l.trim() || d.length > 0) && c(!0));
|
|
152
150
|
}, fe = (e) => {
|
|
153
|
-
|
|
154
|
-
}, ge = (e) => {
|
|
155
|
-
if (a) {
|
|
151
|
+
if (r) {
|
|
156
152
|
e.preventDefault(), e.stopPropagation();
|
|
157
153
|
return;
|
|
158
154
|
}
|
|
159
155
|
e.target.closest(".input-with-tags-container") && e.stopPropagation();
|
|
160
|
-
},
|
|
161
|
-
|
|
156
|
+
}, ge = () => {
|
|
157
|
+
r || c(!p);
|
|
162
158
|
};
|
|
163
|
-
|
|
164
|
-
toggleDropdown:
|
|
159
|
+
Ee(ne, () => ({
|
|
160
|
+
toggleDropdown: ge
|
|
165
161
|
}), []);
|
|
166
|
-
const
|
|
167
|
-
const P = o.some((C) => C.value === e.value), I =
|
|
168
|
-
return /* @__PURE__ */
|
|
162
|
+
const de = (e, t, n, s) => {
|
|
163
|
+
const P = o.some((C) => C.value === e.value), I = A === t, L = O(t, P);
|
|
164
|
+
return /* @__PURE__ */ a.createElement("div", g({
|
|
169
165
|
key: e.id
|
|
170
|
-
},
|
|
166
|
+
}, L, {
|
|
171
167
|
className: `dropdown-with-input-tags-option ${T(I)}`,
|
|
172
168
|
onClick: () => !s && n(e),
|
|
173
169
|
onMouseEnter: () => w(t),
|
|
174
170
|
"data-automation-id": `${u}-option-${e.id}`
|
|
175
|
-
}), /* @__PURE__ */
|
|
171
|
+
}), /* @__PURE__ */ a.createElement("span", {
|
|
176
172
|
className: "option-label"
|
|
177
|
-
}, e.label), e.value !== e.label && /* @__PURE__ */
|
|
173
|
+
}, e.label), e.value !== e.label && /* @__PURE__ */ a.createElement("span", {
|
|
178
174
|
className: "option-value"
|
|
179
175
|
}, e.value));
|
|
180
|
-
},
|
|
176
|
+
}, he = () => {
|
|
181
177
|
D.current = !0;
|
|
182
178
|
const e = o.map((t) => t.value);
|
|
183
179
|
i?.(e), c(!1);
|
|
184
|
-
},
|
|
180
|
+
}, ve = () => {
|
|
185
181
|
f([]);
|
|
186
|
-
},
|
|
187
|
-
const n = o.some((I) => I.value === e.value), s =
|
|
188
|
-
return /* @__PURE__ */
|
|
182
|
+
}, we = (e, t) => {
|
|
183
|
+
const n = o.some((I) => I.value === e.value), s = A === t, P = O(t, n);
|
|
184
|
+
return /* @__PURE__ */ a.createElement("div", g({
|
|
189
185
|
key: e.id
|
|
190
186
|
}, P, {
|
|
191
187
|
className: `dropdown-with-input-tags-option dropdown-with-input-tags-multi-select-option ${T(s)}`,
|
|
192
188
|
"aria-checked": n,
|
|
193
189
|
onClick: () => {
|
|
194
|
-
|
|
190
|
+
r || (V(!n, e), S.current?.focus());
|
|
195
191
|
},
|
|
196
192
|
onMouseEnter: () => w(t),
|
|
197
193
|
"data-automation-id": `${u}-option-${e.id}`
|
|
198
|
-
}), /* @__PURE__ */
|
|
194
|
+
}), /* @__PURE__ */ a.createElement(Se, {
|
|
199
195
|
automationId: "checkbox",
|
|
200
196
|
className: "checkbox",
|
|
201
197
|
checked: n,
|
|
@@ -204,103 +200,103 @@ const xe = /* @__PURE__ */ Ee(({
|
|
|
204
200
|
label: e.label,
|
|
205
201
|
tabIndex: -1
|
|
206
202
|
}));
|
|
207
|
-
},
|
|
203
|
+
}, ke = () => /* @__PURE__ */ a.createElement("div", {
|
|
208
204
|
className: "dropdown-with-input-tags-ctas-container",
|
|
209
205
|
onKeyDown: (e) => {
|
|
210
206
|
(e.key === "ArrowDown" || e.key === "ArrowUp" || e.key === "Home" || e.key === "End") && e.stopPropagation();
|
|
211
207
|
}
|
|
212
|
-
}, /* @__PURE__ */
|
|
208
|
+
}, /* @__PURE__ */ a.createElement(X, {
|
|
213
209
|
label: "Clear",
|
|
214
210
|
type: "link",
|
|
215
211
|
size: "sm",
|
|
216
|
-
onClick:
|
|
212
|
+
onClick: ve,
|
|
217
213
|
automationId: `${u}-clear-button`
|
|
218
|
-
}), /* @__PURE__ */
|
|
214
|
+
}), /* @__PURE__ */ a.createElement(X, {
|
|
219
215
|
label: "Apply",
|
|
220
216
|
type: "primary",
|
|
221
217
|
size: "sm",
|
|
222
|
-
onClick:
|
|
218
|
+
onClick: he,
|
|
223
219
|
automationId: `${u}-apply-button`
|
|
224
220
|
}));
|
|
225
|
-
return /* @__PURE__ */
|
|
226
|
-
className: `dropdown-with-input-tags-wrapper ${y} ${
|
|
221
|
+
return /* @__PURE__ */ a.createElement("div", g({
|
|
222
|
+
className: `dropdown-with-input-tags-wrapper ${y} ${r ? "disabled-wrapper" : ""}`,
|
|
227
223
|
"data-automation-id": u
|
|
228
|
-
}, le), R && /* @__PURE__ */
|
|
224
|
+
}, le), R && /* @__PURE__ */ a.createElement("label", {
|
|
229
225
|
id: `${u}-label`,
|
|
230
226
|
className: "dropdown-with-input-tags-label"
|
|
231
|
-
}, R), /* @__PURE__ */
|
|
232
|
-
onClick:
|
|
233
|
-
}, /* @__PURE__ */
|
|
234
|
-
ref:
|
|
227
|
+
}, R), /* @__PURE__ */ a.createElement("div", {
|
|
228
|
+
onClick: fe
|
|
229
|
+
}, /* @__PURE__ */ a.createElement(Pe, {
|
|
230
|
+
ref: re,
|
|
235
231
|
className: "dropdown-with-input-tags-popover",
|
|
236
232
|
contentWidth: "full",
|
|
237
233
|
position: "bottom-left",
|
|
238
|
-
isPopoverOpen: !
|
|
239
|
-
onPopoverToggle:
|
|
234
|
+
isPopoverOpen: !r && p,
|
|
235
|
+
onPopoverToggle: r ? () => {
|
|
240
236
|
} : c,
|
|
241
237
|
disableClickToggle: !0,
|
|
242
238
|
isWithPortal: te,
|
|
243
239
|
renderPopoverContents: ({
|
|
244
240
|
closePopoverCb: e
|
|
245
|
-
}) => /* @__PURE__ */
|
|
241
|
+
}) => /* @__PURE__ */ a.createElement(a.Fragment, null, /* @__PURE__ */ a.createElement("div", g({}, se, {
|
|
246
242
|
className: "dropdown-with-input-tags-content"
|
|
247
243
|
}, m && {
|
|
248
244
|
"aria-multiselectable": "true"
|
|
249
245
|
}), v.length > 0 ? v.map((t, n) => {
|
|
250
246
|
if (t.value === $) {
|
|
251
|
-
const C =
|
|
252
|
-
return /* @__PURE__ */
|
|
247
|
+
const C = A === n, ye = O(n, !1);
|
|
248
|
+
return /* @__PURE__ */ a.createElement("div", g({
|
|
253
249
|
key: t.id
|
|
254
|
-
},
|
|
250
|
+
}, ye, {
|
|
255
251
|
className: `dropdown-with-input-tags-option dropdown-with-input-tags-custom-option ${T(C)}`,
|
|
256
252
|
onClick: () => {
|
|
257
|
-
|
|
253
|
+
r || (q(t), e());
|
|
258
254
|
},
|
|
259
255
|
onMouseEnter: () => w(n)
|
|
260
256
|
}), 'Add "', l.trim(), '"');
|
|
261
257
|
}
|
|
262
258
|
if (m)
|
|
263
|
-
return
|
|
264
|
-
const s = o.some((C) => C.value === t.value), P =
|
|
265
|
-
...
|
|
259
|
+
return we(t, n);
|
|
260
|
+
const s = o.some((C) => C.value === t.value), P = A === n, L = {
|
|
261
|
+
...O(n, s),
|
|
266
262
|
onMouseEnter: () => w(n),
|
|
267
263
|
className: `dropdown-with-input-tags-option ${T(P)}`
|
|
268
264
|
};
|
|
269
|
-
return x ? x(t,
|
|
270
|
-
}) : /* @__PURE__ */
|
|
265
|
+
return x ? x(t, L, N) : de(t, n, N, r);
|
|
266
|
+
}) : /* @__PURE__ */ a.createElement("div", {
|
|
271
267
|
className: "dropdown-with-input-tags-no-options"
|
|
272
|
-
}, /* @__PURE__ */
|
|
268
|
+
}, /* @__PURE__ */ a.createElement("div", {
|
|
273
269
|
className: "dropdown-with-input-tags-no-options-text"
|
|
274
|
-
}, U))), m && !E &&
|
|
275
|
-
renderPopoverSrcElement: () => /* @__PURE__ */
|
|
270
|
+
}, U))), m && !E && ke()),
|
|
271
|
+
renderPopoverSrcElement: () => /* @__PURE__ */ a.createElement("div", {
|
|
276
272
|
className: "dropdown-with-input-tags-input-container"
|
|
277
|
-
}, /* @__PURE__ */
|
|
278
|
-
className: `input-with-tags-container ${
|
|
279
|
-
onClick:
|
|
273
|
+
}, /* @__PURE__ */ a.createElement("div", {
|
|
274
|
+
className: `input-with-tags-container ${r ? "disabled-input-with-tags-container" : ""} ${Q ? "keyboard-focused" : ""}`,
|
|
275
|
+
onClick: me,
|
|
280
276
|
onKeyDown: (e) => {
|
|
281
277
|
e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey && S.current?.focus();
|
|
282
278
|
}
|
|
283
|
-
}, o.map((e, t) => /* @__PURE__ */
|
|
279
|
+
}, o.map((e, t) => /* @__PURE__ */ a.createElement("span", {
|
|
284
280
|
key: t,
|
|
285
281
|
className: "tag-in-inputwithtags"
|
|
286
|
-
}, e[B], !
|
|
282
|
+
}, e[B], !r && /* @__PURE__ */ a.createElement(Ce, {
|
|
287
283
|
name: "close",
|
|
288
284
|
className: "close-icon-in-inputwithtags",
|
|
289
285
|
ariaLabel: `Remove tag ${e[B]}`,
|
|
290
|
-
onClick: () =>
|
|
286
|
+
onClick: () => ie(t),
|
|
291
287
|
shouldStopPropagation: !0
|
|
292
|
-
}))), (z || !o.length || m) && /* @__PURE__ */
|
|
288
|
+
}))), (z || !o.length || m) && /* @__PURE__ */ a.createElement("input", g({
|
|
293
289
|
ref: S
|
|
294
290
|
}, J, {
|
|
295
291
|
type: "text",
|
|
296
292
|
value: l,
|
|
297
|
-
onChange:
|
|
298
|
-
onKeyDown:
|
|
299
|
-
onFocus:
|
|
293
|
+
onChange: ue,
|
|
294
|
+
onKeyDown: ce,
|
|
295
|
+
onFocus: pe,
|
|
300
296
|
placeholder: o.length === 0 ? k : "",
|
|
301
297
|
className: `input-with-tags-input${!z && o.length > 0 && !l ? " sr-only" : ""}`,
|
|
302
|
-
disabled:
|
|
303
|
-
},
|
|
298
|
+
disabled: r
|
|
299
|
+
}, De({
|
|
304
300
|
ariaLabel: Y || R || "Search and select options",
|
|
305
301
|
ariaLabelledBy: Z,
|
|
306
302
|
ariaDescribedBy: ee
|
|
@@ -310,6 +306,6 @@ const xe = /* @__PURE__ */ Ee(({
|
|
|
310
306
|
})));
|
|
311
307
|
});
|
|
312
308
|
export {
|
|
313
|
-
|
|
309
|
+
We as DropdownWithInputTags
|
|
314
310
|
};
|
|
315
311
|
//# sourceMappingURL=index38.js.map
|
package/dist/index38.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index38.js","sources":["../src/components/DropdownWithInputTags/index.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef, forwardRef, ForwardedRef, useImperativeHandle, KeyboardEvent, useCallback } from 'react';\nimport { Popover, PopoverHandle } from '../Popover';\nimport { Icon } from '../Icon';\nimport { Checkbox } from '../Checkbox';\nimport { Button } from '../Button';\nimport { useCombobox, getA11yNameAttributes } from '../../utils/a11y';\nimport { useLiveAnnouncer } from '../../utils/a11y/liveAnnouncer';\nimport { useStableId } from '../../utils/useStableId';\nimport './styles.scss';\n\nexport interface DropdownOption {\n id: string | number;\n label: string;\n value: string;\n [key: string]: any; // Allow additional properties\n}\n\nexport interface DropdownWithInputTagsHandle {\n toggleDropdown: () => void;\n}\n\nexport interface DropdownWithInputTagsProps {\n value: string[];\n onChange?: (tags: string[]) => void;\n placeholder?: string;\n className?: string;\n options?: DropdownOption[];\n renderOption?: (\n option: DropdownOption, \n props: { \n id: string; \n role: 'option'; \n 'aria-selected': boolean; \n onMouseEnter: () => void;\n className: string;\n },\n onSelect: (option: DropdownOption) => void\n ) => React.ReactNode;\n label?: string;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n ariaDescribedBy?: string;\n automationId?: string;\n noOptionsMessage?: string;\n allowCustomTags?: boolean;\n disabled?: boolean;\n type?: 'select' | 'multi-select' |'multi-select-without-cta';\n showInput?: boolean;\n displayTagBy?: 'label' | 'value';\n isWithPortal?: boolean;\n}\n\nexport const DropdownWithInputTags = forwardRef<DropdownWithInputTagsHandle, DropdownWithInputTagsProps>(\n (\n {\n value,\n onChange,\n placeholder = \"Type to search or add custom tags...\",\n className = '',\n options = [],\n renderOption,\n label,\n ariaLabel,\n ariaLabelledBy,\n ariaDescribedBy,\n automationId = '',\n noOptionsMessage = \"No options found\",\n allowCustomTags = true,\n disabled = false,\n type = 'select',\n showInput = true,\n displayTagBy = 'label',\n isWithPortal = false\n },\n ref: ForwardedRef<DropdownWithInputTagsHandle>\n ) => {\n // Define initValues at the top, right after props\n const initValues = (values: string[]) => {\n return values.map(val => {\n const found = options.find(opt => opt.value === val);\n return found ? { label: found.label, value: found.value } : { label: val, value: val };\n });\n };\n\n // Now use it in useState\n const [tags, setTags] = useState<{ label: string; value: string }[]>(() => {\n return initValues(value || []);\n });\n const [inputValue, setInputValue] = useState('');\n const [filteredOptions, setFilteredOptions] = useState<DropdownOption[]>(options);\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const popoverRef = useRef<PopoverHandle>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const applyClickedRef = useRef<boolean>(false);\n \n const isMultiSelectWithoutCTA = type === 'multi-select-without-cta';\n const isMultiSelect = type === 'multi-select' ||isMultiSelectWithoutCTA;\n\n // Generate stable ID for listbox\n const listboxId = useStableId(automationId, 'dropdown-input-tags-listbox');\n\n const handleSelectOption = useCallback(\n (option: DropdownOption) => {\n if (disabled) return;\n\n const newTags = [...tags];\n if (!newTags.some((tag) => tag.value === option.value)) {\n newTags.push({ label: option.label, value: option.value });\n setTags(newTags);\n onChange?.(newTags.map((tag) => tag.value));\n }\n setInputValue('');\n setIsDropdownOpen(false);\n },\n [disabled, tags, onChange]\n );\n\n const handleMultiSelectDropdownOptionClick = useCallback(\n (isSelected: boolean, option: DropdownOption) => {\n let newSelectedTags: { label: string; value: string }[] = [];\n if (isSelected) {\n newSelectedTags = [...tags, { label: option.label, value: option.value }];\n } else {\n newSelectedTags = tags.filter((tag) => tag.value !== option.value);\n }\n setTags(newSelectedTags);\n setInputValue('');\n if (isMultiSelectWithoutCTA) {\n applyClickedRef.current = true;\n onChange?.(newSelectedTags.map((tag) => tag.value));\n }\n },\n [tags, isMultiSelectWithoutCTA, onChange]\n );\n\n const ADD_CUSTOM_TAG_VALUE = '__add_custom_tag__';\n\n const handleSelectFromDropdown = useCallback((option: DropdownOption) => {\n if (disabled) return;\n\n if (option.value === ADD_CUSTOM_TAG_VALUE) {\n const trimmed = inputValue.trim();\n if (!trimmed) return;\n const newTags = [...tags];\n if (!newTags.some((tag) => tag.value === trimmed)) {\n newTags.push({ label: trimmed, value: trimmed });\n setTags(newTags);\n onChange?.(newTags.map((tag) => tag.value));\n }\n setInputValue('');\n setIsDropdownOpen(false);\n return;\n }\n\n if (isMultiSelect) {\n const isSelected = tags.some(tag => tag.value === option.value);\n handleMultiSelectDropdownOptionClick(!isSelected, option);\n } else {\n handleSelectOption(option);\n }\n }, [disabled, isMultiSelect, tags, inputValue, onChange, handleMultiSelectDropdownOptionClick, handleSelectOption]);\n\n const effectiveItems: DropdownOption[] =\n filteredOptions.length > 0\n ? filteredOptions\n : allowCustomTags && inputValue.trim()\n ? [{ id: ADD_CUSTOM_TAG_VALUE, label: `Add \"${inputValue.trim()}\"`, value: ADD_CUSTOM_TAG_VALUE }]\n : [];\n\n // Combobox hook for keyboard navigation and ARIA\n const {\n containerProps,\n inputProps: comboboxInputProps,\n listboxProps,\n getOptionProps,\n highlightedIndex,\n setHighlightedIndex,\n isKeyboardFocused\n } = useCombobox({\n items: effectiveItems,\n isOpen: isDropdownOpen,\n onOpenChange: setIsDropdownOpen,\n onSelect: handleSelectFromDropdown,\n listboxId,\n hasItems: effectiveItems.length > 0,\n keepHighlightOnSelect: isMultiSelect,\n closeOnTab: type !== 'multi-select'\n });\n\n const getHighlightClass = (isHighlighted: boolean) =>\n isHighlighted ? `highlighted${isKeyboardFocused ? ' keyboard-highlight' : ''}` : '';\n\n useEffect(() => {\n if (applyClickedRef.current) {\n applyClickedRef.current = false;\n return;\n }\n setTags(initValues(value || []));\n }, [value, options, isDropdownOpen]);\n\n\n useEffect(() => {\n // const isInputEmpty = !inputValue.trim();\n const filtered = options.filter(option =>\n option.label.toLowerCase().includes(inputValue.toLowerCase()) ||\n option.value.toLowerCase().includes(inputValue.toLowerCase())\n );\n setFilteredOptions(filtered);\n }, [inputValue, options]);\n\n const { announce } = useLiveAnnouncer();\n\n useEffect(() => {\n if (isDropdownOpen && effectiveItems.length === 0 && inputValue.trim()) {\n announce(noOptionsMessage, { assertiveness: 'polite', batchId: 'dropdown-input-tags-empty-state', delay: 300 });\n }\n }, [effectiveItems.length, isDropdownOpen, inputValue]);\n\n const handleRemoveTag = (indexToRemove: number) => {\n if (disabled) return;\n \n const newTags = tags.filter((_, index) => index !== indexToRemove);\n setTags(newTags);\n \n //in multiselect if tag removed while dorpdownopen, do not call onchange\n if(!isMultiSelect || isMultiSelectWithoutCTA ||(isMultiSelect && !isDropdownOpen)) {\n onChange?.(newTags.map(tag => tag.value));\n }\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n \n // Handle Backspace to remove last tag (preserve existing behavior)\n if (e.key === 'Backspace' && inputValue === \"\" && tags.length > 0) {\n e.preventDefault();\n const newTags = tags.slice(0, -1);\n setTags(newTags);\n onChange?.(newTags.map(tag => tag.value));\n return;\n }\n\n // Handle Enter for custom tags when no options match\n if (e.key === 'Enter' && inputValue.trim() && filteredOptions.length === 0 && allowCustomTags) {\n e.preventDefault();\n const newTags = [...tags];\n if (!newTags.some(tag => tag.value === inputValue.trim())) {\n newTags.push({ label: inputValue.trim(), value: inputValue.trim() });\n setTags(newTags);\n onChange?.(newTags.map(tag => tag.value));\n }\n setInputValue('');\n setHighlightedIndex(-1);\n setIsDropdownOpen(false);\n return;\n }\n\n // Let combobox hook handle all other keyboard events (Arrow keys, Enter, Escape, etc.)\n comboboxInputProps.onKeyDown(e);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n \n const newValue = e.target.value;\n setInputValue(newValue);\n setHighlightedIndex(-1); // Reset highlighted index when user types\n \n if (newValue.trim() && !isDropdownOpen) {\n setIsDropdownOpen(true);\n }\n };\n\n const handleInputFocus = () => {\n if (disabled) return;\n\n if (inputValue.trim() || options.length > 0) {\n setIsDropdownOpen(true);\n }\n };\n\n const handleInputContainerClick = (e: React.MouseEvent) => {\n if (disabled) return;\n\n e.stopPropagation();\n inputRef.current?.focus();\n if (!isDropdownOpen && (inputValue.trim() || options.length > 0)) {\n setIsDropdownOpen(true);\n }\n };\n\n const handlePopoverWrapperClick = (e: React.MouseEvent) => {\n if (disabled) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n \n const target = e.target as HTMLElement;\n const isInputArea = target.closest('.input-with-tags-container');\n if (isInputArea) {\n e.stopPropagation();\n }\n };\n\n const toggleDropdown = () => {\n if (disabled) return;\n setIsDropdownOpen(!isDropdownOpen);\n };\n\n useImperativeHandle(ref, () => ({ toggleDropdown }), []);\n\n const defaultRenderOption = (\n option: DropdownOption,\n index: number,\n onSelect: (option: DropdownOption) => void,\n disabled: boolean\n ) => {\n const isSelected = tags.some((tag) => tag.value === option.value);\n const isHighlighted = highlightedIndex === index;\n const optionProps = getOptionProps(index, isSelected);\n \n return (\n <div\n key={option.id}\n {...optionProps}\n className={`dropdown-with-input-tags-option ${getHighlightClass(isHighlighted)}`}\n onClick={() => !disabled && onSelect(option)}\n onMouseEnter={() => setHighlightedIndex(index)}\n data-automation-id={`${automationId}-option-${option.id}`}\n >\n <span className=\"option-label\">{option.label}</span>\n {option.value !== option.label && <span className=\"option-value\">{option.value}</span>}\n </div>\n );\n };\n const handleApplySelectedDropDownValues = () => {\n applyClickedRef.current = true;\n const newTagValues = tags.map(tag => tag.value);\n onChange?.(newTagValues);\n setIsDropdownOpen(false);\n };\n\n const clearSelectedDropDownValues = () => {\n setTags([]);\n };\n const multiSelectRenderOption = (option: DropdownOption, index: number) => {\n const isOptionSelected = tags.some(tag => tag.value === option.value);\n const isHighlighted = highlightedIndex === index;\n const optionProps = getOptionProps(index, isOptionSelected);\n \n return (\n <div\n key={option.id}\n {...optionProps}\n className={`dropdown-with-input-tags-option dropdown-with-input-tags-multi-select-option ${getHighlightClass(isHighlighted)}`}\n aria-checked={isOptionSelected}\n onClick={() => {\n if (disabled) return;\n handleMultiSelectDropdownOptionClick(!isOptionSelected, option);\n inputRef.current?.focus();\n }}\n onMouseEnter={() => setHighlightedIndex(index)}\n data-automation-id={`${automationId}-option-${option.id}`}\n >\n <Checkbox\n automationId=\"checkbox\"\n className=\"checkbox\"\n checked={isOptionSelected}\n onChange={() => {}}\n label={option.label}\n tabIndex={-1}\n />\n </div>\n );\n };\n\n const multiSelectRenderCTAs = () => {\n return (\n <div\n className=\"dropdown-with-input-tags-ctas-container\"\n onKeyDown={(e) => {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'Home' || e.key === 'End') {\n e.stopPropagation();\n }\n }}\n >\n <Button label=\"Clear\" type=\"link\" size=\"sm\" onClick={clearSelectedDropDownValues} automationId={`${automationId}-clear-button`} />\n <Button label=\"Apply\" type=\"primary\" size=\"sm\" onClick={handleApplySelectedDropDownValues} automationId={`${automationId}-apply-button`} />\n </div>\n );\n };\n\n \n\n return (\n <div\n className={`dropdown-with-input-tags-wrapper ${className} ${disabled ? 'disabled-wrapper' : ''}`}\n data-automation-id={automationId}\n {...containerProps}\n >\n {label && <label id={`${automationId}-label`} className=\"dropdown-with-input-tags-label\">{label}</label>}\n\n <div onClick={handlePopoverWrapperClick}>\n <Popover\n ref={popoverRef}\n className=\"dropdown-with-input-tags-popover\"\n contentWidth=\"full\"\n position=\"bottom-left\"\n isPopoverOpen={!disabled && isDropdownOpen}\n onPopoverToggle={disabled ? () => {} : setIsDropdownOpen}\n disableClickToggle={true}\n isWithPortal={isWithPortal}\n renderPopoverContents={({ closePopoverCb }) => (\n <>\n <div\n {...listboxProps}\n className=\"dropdown-with-input-tags-content\"\n {...(isMultiSelect && { 'aria-multiselectable': 'true' })}\n >\n {effectiveItems.length > 0 ? (\n effectiveItems.map((option, index) => {\n if (option.value === ADD_CUSTOM_TAG_VALUE) {\n const isHighlighted = highlightedIndex === index;\n const optionProps = getOptionProps(index, false);\n return (\n <div\n key={option.id}\n {...optionProps}\n className={`dropdown-with-input-tags-option dropdown-with-input-tags-custom-option ${getHighlightClass(isHighlighted)}`}\n onClick={() => {\n if (disabled) return;\n handleSelectFromDropdown(option);\n closePopoverCb();\n }}\n onMouseEnter={() => setHighlightedIndex(index)}\n >\n Add \"{inputValue.trim()}\"\n </div>\n );\n }\n if (isMultiSelect) {\n return multiSelectRenderOption(option, index);\n }\n \n const isSelected = tags.some((tag) => tag.value === option.value);\n const isHighlighted = highlightedIndex === index;\n const optionProps = getOptionProps(index, isSelected);\n const optionPropsWithHandlers = {\n ...optionProps,\n onMouseEnter: () => setHighlightedIndex(index),\n className: `dropdown-with-input-tags-option ${getHighlightClass(isHighlighted)}`\n };\n \n return renderOption\n ? renderOption(option, optionPropsWithHandlers, handleSelectOption)\n : defaultRenderOption(option, index, handleSelectOption, disabled);\n })\n ) : (\n <div className=\"dropdown-with-input-tags-no-options\">\n <div className=\"dropdown-with-input-tags-no-options-text\">\n {noOptionsMessage}\n </div>\n </div>\n )}\n </div>\n {isMultiSelect && !isMultiSelectWithoutCTA && multiSelectRenderCTAs()}\n </>\n )}\n renderPopoverSrcElement={() => (\n <div className=\"dropdown-with-input-tags-input-container\">\n <div\n className={`input-with-tags-container ${disabled ? 'disabled-input-with-tags-container' : ''} ${isKeyboardFocused ? 'keyboard-focused' : ''}`}\n onClick={handleInputContainerClick}\n onKeyDown={(e) => {\n if (e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n inputRef.current?.focus();\n }\n }}\n >\n {tags.map((tag, index) => (\n <span key={index} className=\"tag-in-inputwithtags\">\n {tag[displayTagBy]}\n {!disabled && (\n <Icon\n name=\"close\"\n className=\"close-icon-in-inputwithtags\"\n ariaLabel={`Remove tag ${tag[displayTagBy]}`}\n onClick={() => handleRemoveTag(index)}\n shouldStopPropagation\n />\n )}\n </span>\n ))}\n {(showInput || !tags.length || isMultiSelect) && (\n <input\n ref={inputRef}\n {...comboboxInputProps}\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={handleInputFocus}\n placeholder={tags.length === 0 ? placeholder : ''}\n className={`input-with-tags-input${!showInput && tags.length > 0 && !inputValue ? ' sr-only' : ''}`}\n disabled={disabled}\n {...getA11yNameAttributes({\n ariaLabel: ariaLabel || label || 'Search and select options',\n ariaLabelledBy,\n ariaDescribedBy\n })}\n />\n )}\n </div>\n </div>\n )}\n automationId={automationId}\n popoverContentAutomationId={`${automationId}-content`}\n />\n </div>\n </div>\n );\n }\n); "],"names":["DropdownWithInputTags","value","onChange","placeholder","className","options","renderOption","label","ariaLabel","ariaLabelledBy","ariaDescribedBy","automationId","noOptionsMessage","allowCustomTags","disabled","type","showInput","displayTagBy","isWithPortal","ref","initValues","values","map","val","found","find","opt","tags","setTags","useState","inputValue","setInputValue","filteredOptions","setFilteredOptions","isDropdownOpen","setIsDropdownOpen","popoverRef","useRef","inputRef","applyClickedRef","isMultiSelectWithoutCTA","isMultiSelect","listboxId","useStableId","handleSelectOption","useCallback","option","newTags","some","tag","push","handleMultiSelectDropdownOptionClick","isSelected","newSelectedTags","filter","current","ADD_CUSTOM_TAG_VALUE","handleSelectFromDropdown","trimmed","trim","effectiveItems","length","id","containerProps","inputProps","comboboxInputProps","listboxProps","getOptionProps","highlightedIndex","setHighlightedIndex","isKeyboardFocused","useCombobox","items","isOpen","onOpenChange","onSelect","hasItems","keepHighlightOnSelect","closeOnTab","getHighlightClass","isHighlighted","useEffect","filtered","toLowerCase","includes","announce","useLiveAnnouncer","assertiveness","batchId","delay","handleRemoveTag","indexToRemove","_","index","handleKeyDown","e","key","preventDefault","slice","onKeyDown","handleInputChange","newValue","target","handleInputFocus","handleInputContainerClick","stopPropagation","focus","handlePopoverWrapperClick","closest","toggleDropdown","useImperativeHandle","defaultRenderOption","optionProps","React","createElement","_extends","onClick","onMouseEnter","handleApplySelectedDropDownValues","newTagValues","clearSelectedDropDownValues","multiSelectRenderOption","isOptionSelected","Checkbox","checked","tabIndex","multiSelectRenderCTAs","Button","size","Popover","contentWidth","position","isPopoverOpen","onPopoverToggle","disableClickToggle","renderPopoverContents","closePopoverCb","Fragment","optionPropsWithHandlers","renderPopoverSrcElement","ctrlKey","metaKey","altKey","Icon","name","shouldStopPropagation","onFocus","getA11yNameAttributes","popoverContentAutomationId"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index38.js","sources":["../src/components/DropdownWithInputTags/index.tsx"],"sourcesContent":["import React, { useState, useEffect, useRef, forwardRef, ForwardedRef, useImperativeHandle, KeyboardEvent, useCallback } from 'react';\nimport { Popover, PopoverHandle } from '../Popover';\nimport { Icon } from '../Icon';\nimport { Checkbox } from '../Checkbox';\nimport { Button } from '../Button';\nimport { useCombobox, getA11yNameAttributes } from '../../utils/a11y';\nimport { announce } from '../../utils/a11y/liveAnnouncer/LiveAnnouncer';\nimport { useStableId } from '../../utils/useStableId';\nimport './styles.scss';\n\nexport interface DropdownOption {\n id: string | number;\n label: string;\n value: string;\n [key: string]: any; // Allow additional properties\n}\n\nexport interface DropdownWithInputTagsHandle {\n toggleDropdown: () => void;\n}\n\nexport interface DropdownWithInputTagsProps {\n value: string[];\n onChange?: (tags: string[]) => void;\n placeholder?: string;\n className?: string;\n options?: DropdownOption[];\n renderOption?: (\n option: DropdownOption, \n props: { \n id: string; \n role: 'option'; \n 'aria-selected': boolean; \n onMouseEnter: () => void;\n className: string;\n },\n onSelect: (option: DropdownOption) => void\n ) => React.ReactNode;\n label?: string;\n ariaLabel?: string;\n ariaLabelledBy?: string;\n ariaDescribedBy?: string;\n automationId?: string;\n noOptionsMessage?: string;\n allowCustomTags?: boolean;\n disabled?: boolean;\n type?: 'select' | 'multi-select' |'multi-select-without-cta';\n showInput?: boolean;\n displayTagBy?: 'label' | 'value';\n isWithPortal?: boolean;\n}\n\nexport const DropdownWithInputTags = forwardRef<DropdownWithInputTagsHandle, DropdownWithInputTagsProps>(\n (\n {\n value,\n onChange,\n placeholder = \"Type to search or add custom tags...\",\n className = '',\n options = [],\n renderOption,\n label,\n ariaLabel,\n ariaLabelledBy,\n ariaDescribedBy,\n automationId = '',\n noOptionsMessage = \"No options found\",\n allowCustomTags = true,\n disabled = false,\n type = 'select',\n showInput = true,\n displayTagBy = 'label',\n isWithPortal = false\n },\n ref: ForwardedRef<DropdownWithInputTagsHandle>\n ) => {\n // Define initValues at the top, right after props\n const initValues = (values: string[]) => {\n return values.map(val => {\n const found = options.find(opt => opt.value === val);\n return found ? { label: found.label, value: found.value } : { label: val, value: val };\n });\n };\n\n // Now use it in useState\n const [tags, setTags] = useState<{ label: string; value: string }[]>(() => {\n return initValues(value || []);\n });\n const [inputValue, setInputValue] = useState('');\n const [filteredOptions, setFilteredOptions] = useState<DropdownOption[]>(options);\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const popoverRef = useRef<PopoverHandle>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const applyClickedRef = useRef<boolean>(false);\n \n const isMultiSelectWithoutCTA = type === 'multi-select-without-cta';\n const isMultiSelect = type === 'multi-select' ||isMultiSelectWithoutCTA;\n\n // Generate stable ID for listbox\n const listboxId = useStableId(automationId, 'dropdown-input-tags-listbox');\n\n const handleSelectOption = useCallback(\n (option: DropdownOption) => {\n if (disabled) return;\n\n const newTags = [...tags];\n if (!newTags.some((tag) => tag.value === option.value)) {\n newTags.push({ label: option.label, value: option.value });\n setTags(newTags);\n onChange?.(newTags.map((tag) => tag.value));\n }\n setInputValue('');\n setIsDropdownOpen(false);\n },\n [disabled, tags, onChange]\n );\n\n const handleMultiSelectDropdownOptionClick = useCallback(\n (isSelected: boolean, option: DropdownOption) => {\n let newSelectedTags: { label: string; value: string }[] = [];\n if (isSelected) {\n newSelectedTags = [...tags, { label: option.label, value: option.value }];\n } else {\n newSelectedTags = tags.filter((tag) => tag.value !== option.value);\n }\n setTags(newSelectedTags);\n setInputValue('');\n if (isMultiSelectWithoutCTA) {\n applyClickedRef.current = true;\n onChange?.(newSelectedTags.map((tag) => tag.value));\n }\n },\n [tags, isMultiSelectWithoutCTA, onChange]\n );\n\n const ADD_CUSTOM_TAG_VALUE = '__add_custom_tag__';\n\n const handleSelectFromDropdown = useCallback((option: DropdownOption) => {\n if (disabled) return;\n\n if (option.value === ADD_CUSTOM_TAG_VALUE) {\n const trimmed = inputValue.trim();\n if (!trimmed) return;\n const newTags = [...tags];\n if (!newTags.some((tag) => tag.value === trimmed)) {\n newTags.push({ label: trimmed, value: trimmed });\n setTags(newTags);\n onChange?.(newTags.map((tag) => tag.value));\n }\n setInputValue('');\n setIsDropdownOpen(false);\n return;\n }\n\n if (isMultiSelect) {\n const isSelected = tags.some(tag => tag.value === option.value);\n handleMultiSelectDropdownOptionClick(!isSelected, option);\n } else {\n handleSelectOption(option);\n }\n }, [disabled, isMultiSelect, tags, inputValue, onChange, handleMultiSelectDropdownOptionClick, handleSelectOption]);\n\n const effectiveItems: DropdownOption[] =\n filteredOptions.length > 0\n ? filteredOptions\n : allowCustomTags && inputValue.trim()\n ? [{ id: ADD_CUSTOM_TAG_VALUE, label: `Add \"${inputValue.trim()}\"`, value: ADD_CUSTOM_TAG_VALUE }]\n : [];\n\n // Combobox hook for keyboard navigation and ARIA\n const {\n containerProps,\n inputProps: comboboxInputProps,\n listboxProps,\n getOptionProps,\n highlightedIndex,\n setHighlightedIndex,\n isKeyboardFocused\n } = useCombobox({\n items: effectiveItems,\n isOpen: isDropdownOpen,\n onOpenChange: setIsDropdownOpen,\n onSelect: handleSelectFromDropdown,\n listboxId,\n hasItems: effectiveItems.length > 0,\n keepHighlightOnSelect: isMultiSelect,\n closeOnTab: type !== 'multi-select'\n });\n\n const getHighlightClass = (isHighlighted: boolean) =>\n isHighlighted ? `highlighted${isKeyboardFocused ? ' keyboard-highlight' : ''}` : '';\n\n useEffect(() => {\n if (applyClickedRef.current) {\n applyClickedRef.current = false;\n return;\n }\n setTags(initValues(value || []));\n }, [value, options, isDropdownOpen]);\n\n\n useEffect(() => {\n // const isInputEmpty = !inputValue.trim();\n const filtered = options.filter(option =>\n option.label.toLowerCase().includes(inputValue.toLowerCase()) ||\n option.value.toLowerCase().includes(inputValue.toLowerCase())\n );\n setFilteredOptions(filtered);\n }, [inputValue, options]);\n\n useEffect(() => {\n if (isDropdownOpen && effectiveItems.length === 0 && inputValue.trim()) {\n announce(noOptionsMessage, { assertiveness: 'polite', batchId: 'dropdown-input-tags-empty-state', delay: 300 });\n }\n }, [effectiveItems.length, isDropdownOpen, inputValue]);\n\n const handleRemoveTag = (indexToRemove: number) => {\n if (disabled) return;\n \n const newTags = tags.filter((_, index) => index !== indexToRemove);\n setTags(newTags);\n \n //in multiselect if tag removed while dorpdownopen, do not call onchange\n if(!isMultiSelect || isMultiSelectWithoutCTA ||(isMultiSelect && !isDropdownOpen)) {\n onChange?.(newTags.map(tag => tag.value));\n }\n };\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (disabled) return;\n \n // Handle Backspace to remove last tag (preserve existing behavior)\n if (e.key === 'Backspace' && inputValue === \"\" && tags.length > 0) {\n e.preventDefault();\n const newTags = tags.slice(0, -1);\n setTags(newTags);\n onChange?.(newTags.map(tag => tag.value));\n return;\n }\n\n // Handle Enter for custom tags when no options match\n if (e.key === 'Enter' && inputValue.trim() && filteredOptions.length === 0 && allowCustomTags) {\n e.preventDefault();\n const newTags = [...tags];\n if (!newTags.some(tag => tag.value === inputValue.trim())) {\n newTags.push({ label: inputValue.trim(), value: inputValue.trim() });\n setTags(newTags);\n onChange?.(newTags.map(tag => tag.value));\n }\n setInputValue('');\n setHighlightedIndex(-1);\n setIsDropdownOpen(false);\n return;\n }\n\n // Let combobox hook handle all other keyboard events (Arrow keys, Enter, Escape, etc.)\n comboboxInputProps.onKeyDown(e);\n };\n\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n \n const newValue = e.target.value;\n setInputValue(newValue);\n setHighlightedIndex(-1); // Reset highlighted index when user types\n \n if (newValue.trim() && !isDropdownOpen) {\n setIsDropdownOpen(true);\n }\n };\n\n const handleInputFocus = () => {\n if (disabled) return;\n\n if (inputValue.trim() || options.length > 0) {\n setIsDropdownOpen(true);\n }\n };\n\n const handleInputContainerClick = (e: React.MouseEvent) => {\n if (disabled) return;\n\n e.stopPropagation();\n inputRef.current?.focus();\n if (!isDropdownOpen && (inputValue.trim() || options.length > 0)) {\n setIsDropdownOpen(true);\n }\n };\n\n const handlePopoverWrapperClick = (e: React.MouseEvent) => {\n if (disabled) {\n e.preventDefault();\n e.stopPropagation();\n return;\n }\n \n const target = e.target as HTMLElement;\n const isInputArea = target.closest('.input-with-tags-container');\n if (isInputArea) {\n e.stopPropagation();\n }\n };\n\n const toggleDropdown = () => {\n if (disabled) return;\n setIsDropdownOpen(!isDropdownOpen);\n };\n\n useImperativeHandle(ref, () => ({ toggleDropdown }), []);\n\n const defaultRenderOption = (\n option: DropdownOption,\n index: number,\n onSelect: (option: DropdownOption) => void,\n disabled: boolean\n ) => {\n const isSelected = tags.some((tag) => tag.value === option.value);\n const isHighlighted = highlightedIndex === index;\n const optionProps = getOptionProps(index, isSelected);\n \n return (\n <div\n key={option.id}\n {...optionProps}\n className={`dropdown-with-input-tags-option ${getHighlightClass(isHighlighted)}`}\n onClick={() => !disabled && onSelect(option)}\n onMouseEnter={() => setHighlightedIndex(index)}\n data-automation-id={`${automationId}-option-${option.id}`}\n >\n <span className=\"option-label\">{option.label}</span>\n {option.value !== option.label && <span className=\"option-value\">{option.value}</span>}\n </div>\n );\n };\n const handleApplySelectedDropDownValues = () => {\n applyClickedRef.current = true;\n const newTagValues = tags.map(tag => tag.value);\n onChange?.(newTagValues);\n setIsDropdownOpen(false);\n };\n\n const clearSelectedDropDownValues = () => {\n setTags([]);\n };\n const multiSelectRenderOption = (option: DropdownOption, index: number) => {\n const isOptionSelected = tags.some(tag => tag.value === option.value);\n const isHighlighted = highlightedIndex === index;\n const optionProps = getOptionProps(index, isOptionSelected);\n \n return (\n <div\n key={option.id}\n {...optionProps}\n className={`dropdown-with-input-tags-option dropdown-with-input-tags-multi-select-option ${getHighlightClass(isHighlighted)}`}\n aria-checked={isOptionSelected}\n onClick={() => {\n if (disabled) return;\n handleMultiSelectDropdownOptionClick(!isOptionSelected, option);\n inputRef.current?.focus();\n }}\n onMouseEnter={() => setHighlightedIndex(index)}\n data-automation-id={`${automationId}-option-${option.id}`}\n >\n <Checkbox\n automationId=\"checkbox\"\n className=\"checkbox\"\n checked={isOptionSelected}\n onChange={() => {}}\n label={option.label}\n tabIndex={-1}\n />\n </div>\n );\n };\n\n const multiSelectRenderCTAs = () => {\n return (\n <div\n className=\"dropdown-with-input-tags-ctas-container\"\n onKeyDown={(e) => {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp' || e.key === 'Home' || e.key === 'End') {\n e.stopPropagation();\n }\n }}\n >\n <Button label=\"Clear\" type=\"link\" size=\"sm\" onClick={clearSelectedDropDownValues} automationId={`${automationId}-clear-button`} />\n <Button label=\"Apply\" type=\"primary\" size=\"sm\" onClick={handleApplySelectedDropDownValues} automationId={`${automationId}-apply-button`} />\n </div>\n );\n };\n\n \n\n return (\n <div\n className={`dropdown-with-input-tags-wrapper ${className} ${disabled ? 'disabled-wrapper' : ''}`}\n data-automation-id={automationId}\n {...containerProps}\n >\n {label && <label id={`${automationId}-label`} className=\"dropdown-with-input-tags-label\">{label}</label>}\n\n <div onClick={handlePopoverWrapperClick}>\n <Popover\n ref={popoverRef}\n className=\"dropdown-with-input-tags-popover\"\n contentWidth=\"full\"\n position=\"bottom-left\"\n isPopoverOpen={!disabled && isDropdownOpen}\n onPopoverToggle={disabled ? () => {} : setIsDropdownOpen}\n disableClickToggle={true}\n isWithPortal={isWithPortal}\n renderPopoverContents={({ closePopoverCb }) => (\n <>\n <div\n {...listboxProps}\n className=\"dropdown-with-input-tags-content\"\n {...(isMultiSelect && { 'aria-multiselectable': 'true' })}\n >\n {effectiveItems.length > 0 ? (\n effectiveItems.map((option, index) => {\n if (option.value === ADD_CUSTOM_TAG_VALUE) {\n const isHighlighted = highlightedIndex === index;\n const optionProps = getOptionProps(index, false);\n return (\n <div\n key={option.id}\n {...optionProps}\n className={`dropdown-with-input-tags-option dropdown-with-input-tags-custom-option ${getHighlightClass(isHighlighted)}`}\n onClick={() => {\n if (disabled) return;\n handleSelectFromDropdown(option);\n closePopoverCb();\n }}\n onMouseEnter={() => setHighlightedIndex(index)}\n >\n Add \"{inputValue.trim()}\"\n </div>\n );\n }\n if (isMultiSelect) {\n return multiSelectRenderOption(option, index);\n }\n \n const isSelected = tags.some((tag) => tag.value === option.value);\n const isHighlighted = highlightedIndex === index;\n const optionProps = getOptionProps(index, isSelected);\n const optionPropsWithHandlers = {\n ...optionProps,\n onMouseEnter: () => setHighlightedIndex(index),\n className: `dropdown-with-input-tags-option ${getHighlightClass(isHighlighted)}`\n };\n \n return renderOption\n ? renderOption(option, optionPropsWithHandlers, handleSelectOption)\n : defaultRenderOption(option, index, handleSelectOption, disabled);\n })\n ) : (\n <div className=\"dropdown-with-input-tags-no-options\">\n <div className=\"dropdown-with-input-tags-no-options-text\">\n {noOptionsMessage}\n </div>\n </div>\n )}\n </div>\n {isMultiSelect && !isMultiSelectWithoutCTA && multiSelectRenderCTAs()}\n </>\n )}\n renderPopoverSrcElement={() => (\n <div className=\"dropdown-with-input-tags-input-container\">\n <div\n className={`input-with-tags-container ${disabled ? 'disabled-input-with-tags-container' : ''} ${isKeyboardFocused ? 'keyboard-focused' : ''}`}\n onClick={handleInputContainerClick}\n onKeyDown={(e) => {\n if (e.key.length === 1 && !e.ctrlKey && !e.metaKey && !e.altKey) {\n inputRef.current?.focus();\n }\n }}\n >\n {tags.map((tag, index) => (\n <span key={index} className=\"tag-in-inputwithtags\">\n {tag[displayTagBy]}\n {!disabled && (\n <Icon\n name=\"close\"\n className=\"close-icon-in-inputwithtags\"\n ariaLabel={`Remove tag ${tag[displayTagBy]}`}\n onClick={() => handleRemoveTag(index)}\n shouldStopPropagation\n />\n )}\n </span>\n ))}\n {(showInput || !tags.length || isMultiSelect) && (\n <input\n ref={inputRef}\n {...comboboxInputProps}\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onFocus={handleInputFocus}\n placeholder={tags.length === 0 ? placeholder : ''}\n className={`input-with-tags-input${!showInput && tags.length > 0 && !inputValue ? ' sr-only' : ''}`}\n disabled={disabled}\n {...getA11yNameAttributes({\n ariaLabel: ariaLabel || label || 'Search and select options',\n ariaLabelledBy,\n ariaDescribedBy\n })}\n />\n )}\n </div>\n </div>\n )}\n automationId={automationId}\n popoverContentAutomationId={`${automationId}-content`}\n />\n </div>\n </div>\n );\n }\n); "],"names":["DropdownWithInputTags","value","onChange","placeholder","className","options","renderOption","label","ariaLabel","ariaLabelledBy","ariaDescribedBy","automationId","noOptionsMessage","allowCustomTags","disabled","type","showInput","displayTagBy","isWithPortal","ref","initValues","values","map","val","found","find","opt","tags","setTags","useState","inputValue","setInputValue","filteredOptions","setFilteredOptions","isDropdownOpen","setIsDropdownOpen","popoverRef","useRef","inputRef","applyClickedRef","isMultiSelectWithoutCTA","isMultiSelect","listboxId","useStableId","handleSelectOption","useCallback","option","newTags","some","tag","push","handleMultiSelectDropdownOptionClick","isSelected","newSelectedTags","filter","current","ADD_CUSTOM_TAG_VALUE","handleSelectFromDropdown","trimmed","trim","effectiveItems","length","id","containerProps","inputProps","comboboxInputProps","listboxProps","getOptionProps","highlightedIndex","setHighlightedIndex","isKeyboardFocused","useCombobox","items","isOpen","onOpenChange","onSelect","hasItems","keepHighlightOnSelect","closeOnTab","getHighlightClass","isHighlighted","useEffect","filtered","toLowerCase","includes","announce","assertiveness","batchId","delay","handleRemoveTag","indexToRemove","_","index","handleKeyDown","e","key","preventDefault","slice","onKeyDown","handleInputChange","newValue","target","handleInputFocus","handleInputContainerClick","stopPropagation","focus","handlePopoverWrapperClick","closest","toggleDropdown","useImperativeHandle","defaultRenderOption","optionProps","React","createElement","_extends","onClick","onMouseEnter","handleApplySelectedDropDownValues","newTagValues","clearSelectedDropDownValues","multiSelectRenderOption","isOptionSelected","Checkbox","checked","tabIndex","multiSelectRenderCTAs","Button","size","Popover","contentWidth","position","isPopoverOpen","onPopoverToggle","disableClickToggle","renderPopoverContents","closePopoverCb","Fragment","optionPropsWithHandlers","renderPopoverSrcElement","ctrlKey","metaKey","altKey","Icon","name","shouldStopPropagation","onFocus","getA11yNameAttributes","popoverContentAutomationId"],"mappings":"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"}
|