@hjmds/react 0.8.2
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/README.md +146 -0
- package/dist/actions.d.ts +61 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +54 -0
- package/dist/actions.js.map +1 -0
- package/dist/advanced-display.d.ts +133 -0
- package/dist/advanced-display.d.ts.map +1 -0
- package/dist/advanced-display.js +201 -0
- package/dist/advanced-display.js.map +1 -0
- package/dist/advanced-forms.d.ts +116 -0
- package/dist/advanced-forms.d.ts.map +1 -0
- package/dist/advanced-forms.js +234 -0
- package/dist/advanced-forms.js.map +1 -0
- package/dist/advanced-navigation.d.ts +24 -0
- package/dist/advanced-navigation.d.ts.map +1 -0
- package/dist/advanced-navigation.js +25 -0
- package/dist/advanced-navigation.js.map +1 -0
- package/dist/bottom-navigation.d.ts +37 -0
- package/dist/bottom-navigation.d.ts.map +1 -0
- package/dist/bottom-navigation.js +132 -0
- package/dist/bottom-navigation.js.map +1 -0
- package/dist/date-picker.d.ts +24 -0
- package/dist/date-picker.d.ts.map +1 -0
- package/dist/date-picker.js +81 -0
- package/dist/date-picker.js.map +1 -0
- package/dist/display-public.d.ts +5 -0
- package/dist/display-public.d.ts.map +1 -0
- package/dist/display-public.js +5 -0
- package/dist/display-public.js.map +1 -0
- package/dist/display.d.ts +77 -0
- package/dist/display.d.ts.map +1 -0
- package/dist/display.js +51 -0
- package/dist/display.js.map +1 -0
- package/dist/evidence.d.ts +940 -0
- package/dist/evidence.d.ts.map +1 -0
- package/dist/evidence.js +98 -0
- package/dist/evidence.js.map +1 -0
- package/dist/feedback.d.ts +89 -0
- package/dist/feedback.d.ts.map +1 -0
- package/dist/feedback.js +41 -0
- package/dist/feedback.js.map +1 -0
- package/dist/file-picker.d.ts +30 -0
- package/dist/file-picker.d.ts.map +1 -0
- package/dist/file-picker.js +40 -0
- package/dist/file-picker.js.map +1 -0
- package/dist/forms-public.d.ts +8 -0
- package/dist/forms-public.d.ts.map +1 -0
- package/dist/forms-public.js +8 -0
- package/dist/forms-public.js.map +1 -0
- package/dist/forms.d.ts +160 -0
- package/dist/forms.d.ts.map +1 -0
- package/dist/forms.js +178 -0
- package/dist/forms.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/internal.d.ts +17 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +68 -0
- package/dist/internal.js.map +1 -0
- package/dist/layout.d.ts +134 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +167 -0
- package/dist/layout.js.map +1 -0
- package/dist/navigation-public.d.ts +6 -0
- package/dist/navigation-public.d.ts.map +1 -0
- package/dist/navigation-public.js +6 -0
- package/dist/navigation-public.js.map +1 -0
- package/dist/navigation.d.ts +65 -0
- package/dist/navigation.d.ts.map +1 -0
- package/dist/navigation.js +196 -0
- package/dist/navigation.js.map +1 -0
- package/dist/number-field.d.ts +55 -0
- package/dist/number-field.d.ts.map +1 -0
- package/dist/number-field.js +107 -0
- package/dist/number-field.js.map +1 -0
- package/dist/otp-field.d.ts +2 -0
- package/dist/otp-field.d.ts.map +1 -0
- package/dist/otp-field.js +2 -0
- package/dist/otp-field.js.map +1 -0
- package/dist/overlays.d.ts +192 -0
- package/dist/overlays.d.ts.map +1 -0
- package/dist/overlays.js +949 -0
- package/dist/overlays.js.map +1 -0
- package/dist/password-field.d.ts +2 -0
- package/dist/password-field.d.ts.map +1 -0
- package/dist/password-field.js +2 -0
- package/dist/password-field.js.map +1 -0
- package/dist/portal.d.ts +32 -0
- package/dist/portal.d.ts.map +1 -0
- package/dist/portal.js +264 -0
- package/dist/portal.js.map +1 -0
- package/dist/provider.d.ts +38 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +87 -0
- package/dist/provider.js.map +1 -0
- package/dist/select.d.ts +72 -0
- package/dist/select.d.ts.map +1 -0
- package/dist/select.js +353 -0
- package/dist/select.js.map +1 -0
- package/dist/selection.d.ts +160 -0
- package/dist/selection.d.ts.map +1 -0
- package/dist/selection.js +225 -0
- package/dist/selection.js.map +1 -0
- package/dist/slider.d.ts +35 -0
- package/dist/slider.d.ts.map +1 -0
- package/dist/slider.js +150 -0
- package/dist/slider.js.map +1 -0
- package/dist/steps.d.ts +29 -0
- package/dist/steps.d.ts.map +1 -0
- package/dist/steps.js +10 -0
- package/dist/steps.js.map +1 -0
- package/dist/styles.css +1349 -0
- package/dist/supplemental-display.d.ts +59 -0
- package/dist/supplemental-display.d.ts.map +1 -0
- package/dist/supplemental-display.js +136 -0
- package/dist/supplemental-display.js.map +1 -0
- package/dist/supplemental-navigation.d.ts +28 -0
- package/dist/supplemental-navigation.d.ts.map +1 -0
- package/dist/supplemental-navigation.js +106 -0
- package/dist/supplemental-navigation.js.map +1 -0
- package/dist/theme.d.ts +5 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +55 -0
- package/dist/theme.js.map +1 -0
- package/dist/toast.d.ts +41 -0
- package/dist/toast.d.ts.map +1 -0
- package/dist/toast.js +250 -0
- package/dist/toast.js.map +1 -0
- package/dist/upload-item.d.ts +18 -0
- package/dist/upload-item.d.ts.map +1 -0
- package/dist/upload-item.js +19 -0
- package/dist/upload-item.js.map +1 -0
- package/package.json +151 -0
package/dist/select.js
ADDED
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { getCollectionNavigationIntent, getCollectionNavigationTarget, getCollectionTypeaheadMatch, reconcileSelectSelection, resolveCollectionItem, resolveSelectSelectedItem, validateCollection, } from "@hjmds/design-contracts/components/collection";
|
|
3
|
+
import { resolveControlAccessibleName, selectBehaviorDefaults, } from "@hjmds/design-contracts/behaviors";
|
|
4
|
+
import { iconRecipe, selectRecipe, } from "@hjmds/design-contracts/recipes";
|
|
5
|
+
import { forwardRef, useCallback, useEffect, useId, useRef, useState, } from "react";
|
|
6
|
+
import { classNames, useControllableState } from "./internal.js";
|
|
7
|
+
import { AnchoredPortal, useAnchoredPopup, } from "./portal.js";
|
|
8
|
+
const emptySelectionKey = Symbol("hjm-select-empty-selection");
|
|
9
|
+
function SelectInner(props, forwardedRef) {
|
|
10
|
+
const { items, sections, label, accessibilityLabel, description, error, placeholder, emptySelectionLabel, asyncState = { status: "idle" }, selectedItem, disallowEmptySelection = selectBehaviorDefaults.disallowEmptySelection, loop = selectBehaviorDefaults.loop, busy = false, readOnly = false, size = selectRecipe.defaults.size, density = selectRecipe.defaults.density, align = "start", fieldClassName, portalContainer, locale, renderLeading, renderOptionLeading, className, id: idProp, name, disabled = false, required = false, selectedKey: selectedKeyProp, defaultSelectedKey, onSelectionChange, open: openProp, defaultOpen = false, onOpenChange, onClick, onFocus, onBlur, onKeyDown, ...buttonProps } = props;
|
|
11
|
+
const source = sections === undefined
|
|
12
|
+
? { items: items ?? [] }
|
|
13
|
+
: { sections };
|
|
14
|
+
validateCollection(source);
|
|
15
|
+
const accessibleName = resolveControlAccessibleName(label, accessibilityLabel, "Select");
|
|
16
|
+
if (placeholder.trim().length === 0)
|
|
17
|
+
throw new TypeError("Select placeholder must not be empty");
|
|
18
|
+
if (emptySelectionLabel.trim().length === 0) {
|
|
19
|
+
throw new TypeError("Select emptySelectionLabel must not be empty");
|
|
20
|
+
}
|
|
21
|
+
const flatItems = source.sections
|
|
22
|
+
? source.sections.flatMap((section) => section.items)
|
|
23
|
+
: source.items;
|
|
24
|
+
if (flatItems.length === 0 &&
|
|
25
|
+
(asyncState.status === "idle" || asyncState.status === "loadingMore")) {
|
|
26
|
+
throw new TypeError("Select requires options unless its async state is transient or empty");
|
|
27
|
+
}
|
|
28
|
+
const initialSelectionRef = useRef(null);
|
|
29
|
+
if (initialSelectionRef.current === null) {
|
|
30
|
+
initialSelectionRef.current = {
|
|
31
|
+
value: reconcileSelectSelection(source, selectedKeyProp ?? defaultSelectedKey ?? null, {
|
|
32
|
+
disallowEmptySelection,
|
|
33
|
+
asyncState,
|
|
34
|
+
...(selectedItem === undefined ? {} : { selectedItem }),
|
|
35
|
+
}),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
const [storedSelectedKey, setSelectedKey] = useControllableState({
|
|
39
|
+
...(selectedKeyProp === undefined ? {} : { value: selectedKeyProp }),
|
|
40
|
+
defaultValue: initialSelectionRef.current.value,
|
|
41
|
+
...(onSelectionChange === undefined ? {} : { onChange: onSelectionChange }),
|
|
42
|
+
});
|
|
43
|
+
const reconciledSelectedKey = reconcileSelectSelection(source, storedSelectedKey, {
|
|
44
|
+
disallowEmptySelection,
|
|
45
|
+
asyncState,
|
|
46
|
+
...(selectedItem === undefined ? {} : { selectedItem }),
|
|
47
|
+
});
|
|
48
|
+
const reconciliationRequestRef = useRef(undefined);
|
|
49
|
+
useEffect(() => {
|
|
50
|
+
if (storedSelectedKey === reconciledSelectedKey) {
|
|
51
|
+
reconciliationRequestRef.current = undefined;
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const token = `${storedSelectedKey ?? "<empty>"}->${reconciledSelectedKey ?? "<empty>"}`;
|
|
55
|
+
if (reconciliationRequestRef.current === token)
|
|
56
|
+
return;
|
|
57
|
+
reconciliationRequestRef.current = token;
|
|
58
|
+
setSelectedKey(reconciledSelectedKey);
|
|
59
|
+
}, [reconciledSelectedKey, setSelectedKey, storedSelectedKey]);
|
|
60
|
+
const resolvedSelectedItem = resolveSelectSelectedItem(source, reconciledSelectedKey, selectedItem !== undefined && selectedItem.id === reconciledSelectedKey
|
|
61
|
+
? selectedItem
|
|
62
|
+
: undefined);
|
|
63
|
+
const [internalOpen, setInternalOpen] = useState(defaultOpen);
|
|
64
|
+
const openControlled = openProp !== undefined;
|
|
65
|
+
const open = openControlled ? openProp : internalOpen;
|
|
66
|
+
const pendingOpenRequestRef = useRef(undefined);
|
|
67
|
+
useEffect(() => {
|
|
68
|
+
if (pendingOpenRequestRef.current === open)
|
|
69
|
+
pendingOpenRequestRef.current = undefined;
|
|
70
|
+
}, [open]);
|
|
71
|
+
const changeOpen = useCallback((nextOpen, reason) => {
|
|
72
|
+
if (nextOpen === open || pendingOpenRequestRef.current === nextOpen)
|
|
73
|
+
return;
|
|
74
|
+
pendingOpenRequestRef.current = nextOpen;
|
|
75
|
+
if (!openControlled)
|
|
76
|
+
setInternalOpen(nextOpen);
|
|
77
|
+
onOpenChange?.(nextOpen, reason);
|
|
78
|
+
if (openControlled && nextOpen) {
|
|
79
|
+
queueMicrotask(() => {
|
|
80
|
+
if (pendingOpenRequestRef.current === true) {
|
|
81
|
+
pendingOpenRequestRef.current = undefined;
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}, [onOpenChange, open, openControlled]);
|
|
86
|
+
const generatedId = useId().replaceAll(":", "");
|
|
87
|
+
const controlId = idProp ?? `hjm-select-${generatedId}`;
|
|
88
|
+
const listboxId = `${controlId}-listbox`;
|
|
89
|
+
const descriptionId = `${controlId}-description`;
|
|
90
|
+
const errorId = `${controlId}-error`;
|
|
91
|
+
const optionId = (key) => `${controlId}-option-${flatItems.findIndex((item) => item.id === key)}`;
|
|
92
|
+
const rootRef = useRef(null);
|
|
93
|
+
const triggerRef = useRef(null);
|
|
94
|
+
const listboxRef = useRef(null);
|
|
95
|
+
const [listboxNode, setListboxNode] = useState(null);
|
|
96
|
+
const optionRefs = useRef(new Map());
|
|
97
|
+
const typeaheadRef = useRef({ value: "", time: 0 });
|
|
98
|
+
const restoreFocusRef = useRef(false);
|
|
99
|
+
const showOptions = asyncState.status === "idle" || asyncState.status === "loadingMore";
|
|
100
|
+
const emptySelectionAvailable = !disallowEmptySelection && showOptions;
|
|
101
|
+
const selectionItemInSource = resolveCollectionItem(source, reconciledSelectedKey);
|
|
102
|
+
const initialHighlight = selectionItemInSource && !selectionItemInSource.disabled
|
|
103
|
+
? selectionItemInSource.id
|
|
104
|
+
: reconciledSelectedKey === null && emptySelectionAvailable
|
|
105
|
+
? emptySelectionKey
|
|
106
|
+
: getCollectionNavigationTarget(source, null, "first", loop) ?? null;
|
|
107
|
+
const [highlightedKey, setHighlightedKey] = useState(initialHighlight);
|
|
108
|
+
const highlightedItem = showOptions && highlightedKey !== emptySelectionKey
|
|
109
|
+
? resolveCollectionItem(source, highlightedKey)
|
|
110
|
+
: null;
|
|
111
|
+
const activeKey = highlightedItem && !highlightedItem.disabled
|
|
112
|
+
? highlightedItem.id
|
|
113
|
+
: highlightedKey === emptySelectionKey && emptySelectionAvailable
|
|
114
|
+
? emptySelectionKey
|
|
115
|
+
: null;
|
|
116
|
+
const activeOptionId = activeKey === emptySelectionKey
|
|
117
|
+
? `${controlId}-option-empty`
|
|
118
|
+
: activeKey === null
|
|
119
|
+
? undefined
|
|
120
|
+
: optionId(activeKey);
|
|
121
|
+
const popupPosition = useAnchoredPopup(triggerRef, listboxNode, {
|
|
122
|
+
align,
|
|
123
|
+
matchAnchorWidth: true,
|
|
124
|
+
zIndex: 800,
|
|
125
|
+
});
|
|
126
|
+
const setListboxRef = useCallback((node) => {
|
|
127
|
+
listboxRef.current = node;
|
|
128
|
+
setListboxNode(node);
|
|
129
|
+
}, []);
|
|
130
|
+
useEffect(() => {
|
|
131
|
+
if (!open) {
|
|
132
|
+
if (restoreFocusRef.current) {
|
|
133
|
+
restoreFocusRef.current = false;
|
|
134
|
+
queueMicrotask(() => triggerRef.current?.focus());
|
|
135
|
+
}
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
if (activeKey === null && showOptions)
|
|
139
|
+
setHighlightedKey(initialHighlight);
|
|
140
|
+
}, [activeKey, initialHighlight, open, showOptions]);
|
|
141
|
+
useEffect(() => {
|
|
142
|
+
if (open && activeKey !== null) {
|
|
143
|
+
optionRefs.current.get(activeKey)?.scrollIntoView({ block: "nearest" });
|
|
144
|
+
}
|
|
145
|
+
}, [activeKey, open]);
|
|
146
|
+
useEffect(() => {
|
|
147
|
+
if (!open)
|
|
148
|
+
return;
|
|
149
|
+
const handlePointerDown = (event) => {
|
|
150
|
+
if (event.target instanceof Node &&
|
|
151
|
+
!rootRef.current?.contains(event.target) &&
|
|
152
|
+
!listboxRef.current?.contains(event.target)) {
|
|
153
|
+
changeOpen(false, "outside");
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
document.addEventListener("pointerdown", handlePointerDown);
|
|
157
|
+
return () => document.removeEventListener("pointerdown", handlePointerDown);
|
|
158
|
+
}, [changeOpen, open]);
|
|
159
|
+
const openWithIntent = (intent = "first") => {
|
|
160
|
+
if (disabled || busy || readOnly)
|
|
161
|
+
return;
|
|
162
|
+
const selectedInSource = resolveCollectionItem(source, reconciledSelectedKey);
|
|
163
|
+
const target = selectedInSource && !selectedInSource.disabled
|
|
164
|
+
? selectedInSource.id
|
|
165
|
+
: reconciledSelectedKey === null && emptySelectionAvailable
|
|
166
|
+
? emptySelectionKey
|
|
167
|
+
: intent === "last" && emptySelectionAvailable
|
|
168
|
+
? emptySelectionKey
|
|
169
|
+
: getCollectionNavigationTarget(source, null, intent, loop) ?? null;
|
|
170
|
+
setHighlightedKey(target);
|
|
171
|
+
changeOpen(true, "keyboard");
|
|
172
|
+
};
|
|
173
|
+
const moveHighlight = (intent) => {
|
|
174
|
+
const enabledKeys = flatItems
|
|
175
|
+
.filter((item) => !item.disabled)
|
|
176
|
+
.map((item) => item.id);
|
|
177
|
+
const firstKey = enabledKeys[0];
|
|
178
|
+
const lastKey = enabledKeys.at(-1);
|
|
179
|
+
if (emptySelectionAvailable) {
|
|
180
|
+
if (intent === "last") {
|
|
181
|
+
setHighlightedKey(emptySelectionKey);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
if (activeKey === emptySelectionKey) {
|
|
185
|
+
if (intent === "previous" && lastKey !== undefined)
|
|
186
|
+
setHighlightedKey(lastKey);
|
|
187
|
+
else if (((intent === "next" && loop) || intent === "first") &&
|
|
188
|
+
firstKey !== undefined) {
|
|
189
|
+
setHighlightedKey(firstKey);
|
|
190
|
+
}
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (intent === "next" && activeKey === lastKey) {
|
|
194
|
+
setHighlightedKey(emptySelectionKey);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
if (intent === "previous" && activeKey === firstKey && loop) {
|
|
198
|
+
setHighlightedKey(emptySelectionKey);
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
const target = getCollectionNavigationTarget(source, activeKey === emptySelectionKey ? null : activeKey, intent, loop);
|
|
203
|
+
if (target !== undefined)
|
|
204
|
+
setHighlightedKey(target);
|
|
205
|
+
};
|
|
206
|
+
const commit = (key) => {
|
|
207
|
+
if (key === emptySelectionKey) {
|
|
208
|
+
if (disabled || readOnly || !emptySelectionAvailable)
|
|
209
|
+
return;
|
|
210
|
+
setSelectedKey(null);
|
|
211
|
+
restoreFocusRef.current = true;
|
|
212
|
+
changeOpen(false, "selection");
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const item = resolveCollectionItem(source, key);
|
|
216
|
+
if (!item ||
|
|
217
|
+
item.disabled ||
|
|
218
|
+
disabled ||
|
|
219
|
+
busy ||
|
|
220
|
+
readOnly ||
|
|
221
|
+
asyncState.status === "loading")
|
|
222
|
+
return;
|
|
223
|
+
setSelectedKey(key);
|
|
224
|
+
restoreFocusRef.current = true;
|
|
225
|
+
changeOpen(false, "selection");
|
|
226
|
+
};
|
|
227
|
+
const runTypeahead = (key) => {
|
|
228
|
+
const now = Date.now();
|
|
229
|
+
const previous = now - typeaheadRef.current.time < 500
|
|
230
|
+
? typeaheadRef.current.value
|
|
231
|
+
: "";
|
|
232
|
+
const combined = `${previous}${key}`;
|
|
233
|
+
const query = new Set(combined.toLocaleLowerCase()).size === 1 ? key : combined;
|
|
234
|
+
typeaheadRef.current = { value: combined, time: now };
|
|
235
|
+
const match = getCollectionTypeaheadMatch(source, query, {
|
|
236
|
+
startsAfterKey: activeKey === emptySelectionKey
|
|
237
|
+
? reconciledSelectedKey
|
|
238
|
+
: activeKey ?? reconciledSelectedKey,
|
|
239
|
+
...(locale === undefined ? {} : { locale }),
|
|
240
|
+
});
|
|
241
|
+
if (match !== undefined) {
|
|
242
|
+
setHighlightedKey(match);
|
|
243
|
+
if (!open)
|
|
244
|
+
changeOpen(true, "keyboard");
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
const handleKeyDown = (event) => {
|
|
248
|
+
onKeyDown?.(event);
|
|
249
|
+
if (event.defaultPrevented || disabled || busy || readOnly)
|
|
250
|
+
return;
|
|
251
|
+
const navigationIntent = getCollectionNavigationIntent(event.key);
|
|
252
|
+
if (navigationIntent !== undefined) {
|
|
253
|
+
event.preventDefault();
|
|
254
|
+
if (!open) {
|
|
255
|
+
openWithIntent(navigationIntent === "previous" || navigationIntent === "last"
|
|
256
|
+
? "last"
|
|
257
|
+
: "first");
|
|
258
|
+
}
|
|
259
|
+
else
|
|
260
|
+
moveHighlight(navigationIntent);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
264
|
+
event.preventDefault();
|
|
265
|
+
if (!open)
|
|
266
|
+
openWithIntent();
|
|
267
|
+
else if (activeKey !== null)
|
|
268
|
+
commit(activeKey);
|
|
269
|
+
}
|
|
270
|
+
else if (event.key === "Escape" && open) {
|
|
271
|
+
event.preventDefault();
|
|
272
|
+
restoreFocusRef.current = true;
|
|
273
|
+
changeOpen(false, "escape");
|
|
274
|
+
}
|
|
275
|
+
else if (event.key === "Tab" && open) {
|
|
276
|
+
changeOpen(false, "blur");
|
|
277
|
+
}
|
|
278
|
+
else if (event.key.length === 1 &&
|
|
279
|
+
event.key !== " " &&
|
|
280
|
+
!event.altKey &&
|
|
281
|
+
!event.ctrlKey &&
|
|
282
|
+
!event.metaKey) {
|
|
283
|
+
event.preventDefault();
|
|
284
|
+
runTypeahead(event.key);
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
const handleBlur = (event) => {
|
|
288
|
+
onBlur?.(event);
|
|
289
|
+
if (event.defaultPrevented)
|
|
290
|
+
return;
|
|
291
|
+
queueMicrotask(() => {
|
|
292
|
+
if (open &&
|
|
293
|
+
document.activeElement instanceof Node &&
|
|
294
|
+
!rootRef.current?.contains(document.activeElement) &&
|
|
295
|
+
!listboxRef.current?.contains(document.activeElement))
|
|
296
|
+
changeOpen(false, "blur");
|
|
297
|
+
});
|
|
298
|
+
};
|
|
299
|
+
const describedBy = error ? errorId : description ? descriptionId : undefined;
|
|
300
|
+
const renderOption = (item) => {
|
|
301
|
+
const selected = item.id === reconciledSelectedKey;
|
|
302
|
+
const active = item.id === activeKey;
|
|
303
|
+
const leadingSize = iconRecipe.sizes[selectRecipe.optionLeading.glyph];
|
|
304
|
+
const leading = renderOptionLeading?.(item, {
|
|
305
|
+
selected,
|
|
306
|
+
highlighted: active,
|
|
307
|
+
disabled: item.disabled ?? false,
|
|
308
|
+
color: "currentColor",
|
|
309
|
+
size: leadingSize,
|
|
310
|
+
glyphSize: leadingSize,
|
|
311
|
+
});
|
|
312
|
+
return (_jsxs("div", { ref: (node) => {
|
|
313
|
+
if (node)
|
|
314
|
+
optionRefs.current.set(item.id, node);
|
|
315
|
+
else
|
|
316
|
+
optionRefs.current.delete(item.id);
|
|
317
|
+
}, id: optionId(item.id), role: "option", className: "hjm-select__option", "aria-selected": selected, "aria-disabled": item.disabled || undefined, "data-state": item.disabled ? "disabled" : selected ? "selected" : "idle", "data-active": active || undefined, onMouseDown: (event) => event.preventDefault(), onMouseMove: () => {
|
|
318
|
+
if (!item.disabled)
|
|
319
|
+
setHighlightedKey(item.id);
|
|
320
|
+
}, onClick: () => commit(item.id), children: [leading ? (_jsx("span", { className: "hjm-select__option-leading", "aria-hidden": "true", children: leading })) : null, _jsxs("span", { className: "hjm-select__option-copy", children: [_jsx("span", { children: item.label }), item.description ? (_jsx("span", { className: "hjm-select__option-description", children: item.description })) : null] }), selected ? _jsx("span", { className: "hjm-select__check", "aria-hidden": "true", children: "\u2713" }) : null] }, item.id));
|
|
321
|
+
};
|
|
322
|
+
const triggerLeadingSize = iconRecipe.sizes[selectRecipe.sizes[size].glyph];
|
|
323
|
+
const triggerLeading = renderLeading?.(resolvedSelectedItem, {
|
|
324
|
+
color: "currentColor",
|
|
325
|
+
size: triggerLeadingSize,
|
|
326
|
+
glyphSize: triggerLeadingSize,
|
|
327
|
+
});
|
|
328
|
+
return (_jsxs("div", { ref: rootRef, className: classNames("hjm-field hjm-select", fieldClassName), "data-state": disabled ? "disabled" : error ? "invalid" : open ? "focused" : "idle", "data-size": size, "data-density": density, "data-async-state": asyncState.status, "data-busy": busy || undefined, children: [label !== undefined ? (_jsxs("label", { className: "hjm-field__label", htmlFor: controlId, children: [label, required ? _jsx("span", { "aria-hidden": "true", children: " *" }) : null] })) : null, _jsxs("div", { className: "hjm-select__anchor", children: [_jsxs("button", { ...buttonProps, ref: (node) => {
|
|
329
|
+
triggerRef.current = node;
|
|
330
|
+
if (typeof forwardedRef === "function")
|
|
331
|
+
forwardedRef(node);
|
|
332
|
+
else if (forwardedRef)
|
|
333
|
+
forwardedRef.current = node;
|
|
334
|
+
}, id: controlId, type: "button", role: "combobox", className: classNames("hjm-field__control hjm-select__trigger", className), disabled: disabled, "aria-disabled": busy || undefined, "aria-label": accessibilityLabel ?? (label === undefined ? accessibleName : undefined), "aria-haspopup": "listbox", "aria-expanded": open, "aria-controls": open ? listboxId : undefined, "aria-activedescendant": open ? activeOptionId : undefined, "aria-busy": busy || asyncState.status === "loading" || asyncState.status === "loadingMore" || undefined, "aria-invalid": error ? true : undefined, "aria-describedby": describedBy, "aria-readonly": readOnly || undefined, "aria-required": required || undefined, onFocus: onFocus, onBlur: handleBlur, onKeyDown: handleKeyDown, onClick: (event) => {
|
|
335
|
+
onClick?.(event);
|
|
336
|
+
if (event.defaultPrevented || disabled || busy || readOnly)
|
|
337
|
+
return;
|
|
338
|
+
if (open)
|
|
339
|
+
changeOpen(false, "trigger");
|
|
340
|
+
else
|
|
341
|
+
openWithIntent();
|
|
342
|
+
}, children: [triggerLeading ? (_jsx("span", { className: "hjm-select__leading", "aria-hidden": "true", children: triggerLeading })) : null, _jsx("span", { className: "hjm-select__value", "data-state": resolvedSelectedItem ? "selected" : "placeholder", children: resolvedSelectedItem?.label ?? placeholder }), busy ? (_jsx("span", { className: "hjm-select__busy-indicator", "aria-hidden": "true" })) : (_jsx("span", { className: "hjm-select__indicator", "aria-hidden": "true", children: "\u2304" }))] }), open ? (_jsx(AnchoredPortal, { anchorRef: triggerRef, ssrFallback: "inline", ...(portalContainer === undefined ? {} : { container: portalContainer }), children: _jsxs("div", { ref: setListboxRef, id: listboxId, role: "listbox", "aria-label": accessibleName, className: "hjm-select__listbox", "data-density": density, "data-placement": popupPosition.placement, "data-align": popupPosition.align, style: popupPosition.style, children: [asyncState.status !== "idle" ? (_jsx("div", { className: "hjm-select__message", role: asyncState.status === "error" ? "alert" : "status", children: asyncState.message })) : null, showOptions ? (source.sections ? source.sections.map((section) => {
|
|
343
|
+
const sectionLabelId = `${controlId}-section-${section.id}`;
|
|
344
|
+
return (_jsxs("div", { role: "group", "aria-labelledby": section.label ? sectionLabelId : undefined, "aria-label": section.label ? undefined : section.accessibilityLabel, className: "hjm-select__section", children: [section.label ? (_jsx("div", { id: sectionLabelId, className: "hjm-select__section-label", children: section.label })) : null, section.items.map(renderOption)] }, section.id));
|
|
345
|
+
}) : source.items.map(renderOption)) : null, !disallowEmptySelection && showOptions ? (_jsx("div", { ref: (node) => {
|
|
346
|
+
if (node)
|
|
347
|
+
optionRefs.current.set(emptySelectionKey, node);
|
|
348
|
+
else
|
|
349
|
+
optionRefs.current.delete(emptySelectionKey);
|
|
350
|
+
}, id: `${controlId}-option-empty`, role: "option", className: "hjm-select__option hjm-select__option--empty", "aria-selected": reconciledSelectedKey === null, "data-state": reconciledSelectedKey === null ? "selected" : "idle", "data-active": activeKey === emptySelectionKey || undefined, onMouseDown: (event) => event.preventDefault(), onMouseMove: () => setHighlightedKey(emptySelectionKey), onClick: () => commit(emptySelectionKey), children: emptySelectionLabel })) : null] }) })) : null] }), description && !error ? (_jsx("div", { id: descriptionId, className: "hjm-field__description", children: description })) : null, error ? _jsx("div", { id: errorId, className: "hjm-field__error", children: error }) : null, name ? _jsx("input", { type: "hidden", name: name, value: reconciledSelectedKey ?? "" }) : null] }));
|
|
351
|
+
}
|
|
352
|
+
export const Select = forwardRef(SelectInner);
|
|
353
|
+
//# sourceMappingURL=select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.js","sourceRoot":"","sources":["../src/select.tsx"],"names":[],"mappings":";AAAA,OAAO,EACL,6BAA6B,EAC7B,6BAA6B,EAC7B,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,yBAAyB,EACzB,kBAAkB,GAInB,MAAM,+CAA+C,CAAC;AACvD,OAAO,EACL,4BAA4B,EAC5B,sBAAsB,GAIvB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACL,UAAU,EACV,YAAY,GAGb,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,UAAU,EACV,WAAW,EACX,SAAS,EACT,KAAK,EACL,MAAM,EACN,QAAQ,GAOT,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EACL,cAAc,EACd,gBAAgB,GAEjB,MAAM,aAAa,CAAC;AAoBrB,MAAM,iBAAiB,GAAG,MAAM,CAAC,4BAA4B,CAAC,CAAC;AAoF/D,SAAS,WAAW,CAClB,KAAmC,EACnC,YAAmD;IAEnD,MAAM,EACJ,KAAK,EACL,QAAQ,EACR,KAAK,EACL,kBAAkB,EAClB,WAAW,EACX,KAAK,EACL,WAAW,EACX,mBAAmB,EACnB,UAAU,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAC/B,YAAY,EACZ,sBAAsB,GAAG,sBAAsB,CAAC,sBAAsB,EACtE,IAAI,GAAG,sBAAsB,CAAC,IAAI,EAClC,IAAI,GAAG,KAAK,EACZ,QAAQ,GAAG,KAAK,EAChB,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,EACjC,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,EACvC,KAAK,GAAG,OAAO,EACf,cAAc,EACd,eAAe,EACf,MAAM,EACN,aAAa,EACb,mBAAmB,EACnB,SAAS,EACT,EAAE,EAAE,MAAM,EACV,IAAI,EACJ,QAAQ,GAAG,KAAK,EAChB,QAAQ,GAAG,KAAK,EAChB,WAAW,EAAE,eAAe,EAC5B,kBAAkB,EAClB,iBAAiB,EACjB,IAAI,EAAE,QAAQ,EACd,WAAW,GAAG,KAAK,EACnB,YAAY,EACZ,OAAO,EACP,OAAO,EACP,MAAM,EACN,SAAS,EACT,GAAG,WAAW,EACf,GAAG,KAAK,CAAC;IACV,MAAM,MAAM,GAA4C,QAAQ,KAAK,SAAS;QAC5E,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,EAAE;QACxB,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;IACjB,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,MAAM,cAAc,GAAG,4BAA4B,CACjD,KAAK,EACL,kBAAkB,EAClB,QAAQ,CACT,CAAC;IACF,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;IACjG,IAAI,mBAAmB,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,SAAS,CAAC,8CAA8C,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ;QAC/B,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;QACrD,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;IACjB,IACE,SAAS,CAAC,MAAM,KAAK,CAAC;QACtB,CAAC,UAAU,CAAC,MAAM,KAAK,MAAM,IAAI,UAAU,CAAC,MAAM,KAAK,aAAa,CAAC,EACrE,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,sEAAsE,CAAC,CAAC;IAC9F,CAAC;IACD,MAAM,mBAAmB,GAAG,MAAM,CAAyC,IAAI,CAAC,CAAC;IACjF,IAAI,mBAAmB,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACzC,mBAAmB,CAAC,OAAO,GAAG;YAC5B,KAAK,EAAE,wBAAwB,CAC7B,MAAM,EACN,eAAe,IAAI,kBAAkB,IAAI,IAAI,EAC7C;gBACA,sBAAsB;gBACtB,UAAU;gBACV,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;aACtD,CACF;SACF,CAAC;IACJ,CAAC;IACD,MAAM,CAAC,iBAAiB,EAAE,cAAc,CAAC,GAAG,oBAAoB,CAAa;QAC3E,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;QACpE,YAAY,EAAE,mBAAmB,CAAC,OAAO,CAAC,KAAK;QAC/C,GAAG,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;KAC5E,CAAC,CAAC;IACH,MAAM,qBAAqB,GAAG,wBAAwB,CAAC,MAAM,EAAE,iBAAiB,EAAE;QAChF,sBAAsB;QACtB,UAAU;QACV,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;KACxD,CAAC,CAAC;IACH,MAAM,wBAAwB,GAAG,MAAM,CAAqB,SAAS,CAAC,CAAC;IACvE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,iBAAiB,KAAK,qBAAqB,EAAE,CAAC;YAChD,wBAAwB,CAAC,OAAO,GAAG,SAAS,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,GAAG,iBAAiB,IAAI,SAAS,KAAK,qBAAqB,IAAI,SAAS,EAAE,CAAC;QACzF,IAAI,wBAAwB,CAAC,OAAO,KAAK,KAAK;YAAE,OAAO;QACvD,wBAAwB,CAAC,OAAO,GAAG,KAAK,CAAC;QACzC,cAAc,CAAC,qBAAqB,CAAC,CAAC;IACxC,CAAC,EAAE,CAAC,qBAAqB,EAAE,cAAc,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC/D,MAAM,oBAAoB,GAAG,yBAAyB,CACpD,MAAM,EACN,qBAAqB,EACrB,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,EAAE,KAAK,qBAAqB;QACrE,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,SAAS,CACd,CAAC;IAEF,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC9D,MAAM,cAAc,GAAG,QAAQ,KAAK,SAAS,CAAC;IAC9C,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC;IACtD,MAAM,qBAAqB,GAAG,MAAM,CAAsB,SAAS,CAAC,CAAC;IACrE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,qBAAqB,CAAC,OAAO,KAAK,IAAI;YAAE,qBAAqB,CAAC,OAAO,GAAG,SAAS,CAAC;IACxF,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IACX,MAAM,UAAU,GAAG,WAAW,CAC5B,CAAC,QAAiB,EAAE,MAA8B,EAAE,EAAE;QACpD,IAAI,QAAQ,KAAK,IAAI,IAAI,qBAAqB,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO;QAC5E,qBAAqB,CAAC,OAAO,GAAG,QAAQ,CAAC;QACzC,IAAI,CAAC,cAAc;YAAE,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC/C,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,cAAc,IAAI,QAAQ,EAAE,CAAC;YAC/B,cAAc,CAAC,GAAG,EAAE;gBAClB,IAAI,qBAAqB,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;oBAC3C,qBAAqB,CAAC,OAAO,GAAG,SAAS,CAAC;gBAC5C,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,EACD,CAAC,YAAY,EAAE,IAAI,EAAE,cAAc,CAAC,CACrC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,MAAM,IAAI,cAAc,WAAW,EAAE,CAAC;IACxD,MAAM,SAAS,GAAG,GAAG,SAAS,UAAU,CAAC;IACzC,MAAM,aAAa,GAAG,GAAG,SAAS,cAAc,CAAC;IACjD,MAAM,OAAO,GAAG,GAAG,SAAS,QAAQ,CAAC;IACrC,MAAM,QAAQ,GAAG,CAAC,GAAQ,EAAE,EAAE,CAC5B,GAAG,SAAS,WAAW,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC;IAC1E,MAAM,OAAO,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,MAAM,CAA2B,IAAI,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,QAAQ,CAAwB,IAAI,CAAC,CAAC;IAC5E,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,GAAG,EAA2C,CAAC,CAAC;IAC9E,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IACpD,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,KAAK,MAAM,IAAI,UAAU,CAAC,MAAM,KAAK,aAAa,CAAC;IACxF,MAAM,uBAAuB,GAAG,CAAC,sBAAsB,IAAI,WAAW,CAAC;IACvE,MAAM,qBAAqB,GAAG,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;IACnF,MAAM,gBAAgB,GAAG,qBAAqB,IAAI,CAAC,qBAAqB,CAAC,QAAQ;QAC/E,CAAC,CAAC,qBAAqB,CAAC,EAAE;QAC1B,CAAC,CAAC,qBAAqB,KAAK,IAAI,IAAI,uBAAuB;YACzD,CAAC,CAAC,iBAAiB;YACnB,CAAC,CAAC,6BAA6B,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC;IACzE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAClD,gBAAgB,CACjB,CAAC;IACF,MAAM,eAAe,GAAG,WAAW,IAAI,cAAc,KAAK,iBAAiB;QACzE,CAAC,CAAC,qBAAqB,CAAC,MAAM,EAAE,cAAc,CAAC;QAC/C,CAAC,CAAC,IAAI,CAAC;IACT,MAAM,SAAS,GAAmC,eAAe,IAAI,CAAC,eAAe,CAAC,QAAQ;QAC5F,CAAC,CAAC,eAAe,CAAC,EAAE;QACpB,CAAC,CAAC,cAAc,KAAK,iBAAiB,IAAI,uBAAuB;YAC/D,CAAC,CAAC,iBAAiB;YACnB,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,cAAc,GAAG,SAAS,KAAK,iBAAiB;QACpD,CAAC,CAAC,GAAG,SAAS,eAAe;QAC7B,CAAC,CAAC,SAAS,KAAK,IAAI;YAClB,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC1B,MAAM,aAAa,GAAG,gBAAgB,CAAC,UAAU,EAAE,WAAW,EAAE;QAC9D,KAAK;QACL,gBAAgB,EAAE,IAAI;QACtB,MAAM,EAAE,GAAG;KACZ,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,IAA2B,EAAE,EAAE;QAChE,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;QAC1B,cAAc,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,eAAe,CAAC,OAAO,EAAE,CAAC;gBAC5B,eAAe,CAAC,OAAO,GAAG,KAAK,CAAC;gBAChC,cAAc,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;YACpD,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,SAAS,KAAK,IAAI,IAAI,WAAW;YAAE,iBAAiB,CAAC,gBAAgB,CAAC,CAAC;IAC7E,CAAC,EAAE,CAAC,SAAS,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;IACrD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,IAAI,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;YAC/B,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IACtB,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,iBAAiB,GAAG,CAAC,KAAmB,EAAE,EAAE;YAChD,IACE,KAAK,CAAC,MAAM,YAAY,IAAI;gBAC5B,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;gBACxC,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAC3C,CAAC;gBACD,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC,CAAC;QACF,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;QAC5D,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;IAC9E,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;IAEvB,MAAM,cAAc,GAAG,CAAC,SAA2B,OAAO,EAAE,EAAE;QAC5D,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ;YAAE,OAAO;QACzC,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,gBAAgB,IAAI,CAAC,gBAAgB,CAAC,QAAQ;YAC3D,CAAC,CAAC,gBAAgB,CAAC,EAAE;YACrB,CAAC,CAAC,qBAAqB,KAAK,IAAI,IAAI,uBAAuB;gBACzD,CAAC,CAAC,iBAAiB;gBACnB,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,uBAAuB;oBAC5C,CAAC,CAAC,iBAAiB;oBACnB,CAAC,CAAC,6BAA6B,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC;QAC1E,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC1B,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/B,CAAC,CAAC;IACF,MAAM,aAAa,GAAG,CAAC,MAA8C,EAAE,EAAE;QACvE,MAAM,WAAW,GAAG,SAAS;aAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;aAChC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,uBAAuB,EAAE,CAAC;YAC5B,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;gBACrC,OAAO;YACT,CAAC;YACD,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;gBACpC,IAAI,MAAM,KAAK,UAAU,IAAI,OAAO,KAAK,SAAS;oBAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;qBAC1E,IACH,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,MAAM,KAAK,OAAO,CAAC;oBACnD,QAAQ,KAAK,SAAS,EACtB,CAAC;oBACD,iBAAiB,CAAC,QAAQ,CAAC,CAAC;gBAC9B,CAAC;gBACD,OAAO;YACT,CAAC;YACD,IAAI,MAAM,KAAK,MAAM,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;gBAC/C,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;gBACrC,OAAO;YACT,CAAC;YACD,IAAI,MAAM,KAAK,UAAU,IAAI,SAAS,KAAK,QAAQ,IAAI,IAAI,EAAE,CAAC;gBAC5D,iBAAiB,CAAC,iBAAiB,CAAC,CAAC;gBACrC,OAAO;YACT,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,6BAA6B,CAC1C,MAAM,EACN,SAAS,KAAK,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAClD,MAAM,EACN,IAAI,CACL,CAAC;QACF,IAAI,MAAM,KAAK,SAAS;YAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACtD,CAAC,CAAC;IACF,MAAM,MAAM,GAAG,CAAC,GAA4B,EAAE,EAAE;QAC9C,IAAI,GAAG,KAAK,iBAAiB,EAAE,CAAC;YAC9B,IAAI,QAAQ,IAAI,QAAQ,IAAI,CAAC,uBAAuB;gBAAE,OAAO;YAC7D,cAAc,CAAC,IAAI,CAAC,CAAC;YACrB,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;YAC/B,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,qBAAqB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChD,IACE,CAAC,IAAI;YACL,IAAI,CAAC,QAAQ;YACb,QAAQ;YACR,IAAI;YACJ,QAAQ;YACR,UAAU,CAAC,MAAM,KAAK,SAAS;YAC/B,OAAO;QACT,cAAc,CAAC,GAAG,CAAC,CAAC;QACpB,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;QAC/B,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACjC,CAAC,CAAC;IACF,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,EAAE;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,GAAG,GAAG;YACpD,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK;YAC5B,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,QAAQ,GAAG,GAAG,QAAQ,GAAG,GAAG,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,iBAAiB,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;QAChF,YAAY,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,2BAA2B,CAAC,MAAM,EAAE,KAAK,EAAE;YACvD,cAAc,EAAE,SAAS,KAAK,iBAAiB;gBAC7C,CAAC,CAAC,qBAAqB;gBACvB,CAAC,CAAC,SAAS,IAAI,qBAAqB;YACtC,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;SAC5C,CAAC,CAAC;QACH,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,IAAI;gBAAE,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CAAC;IACF,MAAM,aAAa,GAAG,CAAC,KAAuC,EAAE,EAAE;QAChE,SAAS,EAAE,CAAC,KAAK,CAAC,CAAC;QACnB,IAAI,KAAK,CAAC,gBAAgB,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ;YAAE,OAAO;QACnE,MAAM,gBAAgB,GAAG,6BAA6B,CACpD,KAAK,CAAC,GAAqB,CAC5B,CAAC;QACF,IAAI,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACnC,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,cAAc,CACZ,gBAAgB,KAAK,UAAU,IAAI,gBAAgB,KAAK,MAAM;oBAC5D,CAAC,CAAC,MAAM;oBACR,CAAC,CAAC,OAAO,CACZ,CAAC;YACJ,CAAC;;gBACI,aAAa,CAAC,gBAAgB,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;YAC/C,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI;gBAAE,cAAc,EAAE,CAAC;iBACvB,IAAI,SAAS,KAAK,IAAI;gBAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,KAAK,CAAC,GAAG,KAAK,QAAQ,IAAI,IAAI,EAAE,CAAC;YAC1C,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,eAAe,CAAC,OAAO,GAAG,IAAI,CAAC;YAC/B,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,IAAI,IAAI,EAAE,CAAC;YACvC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC5B,CAAC;aAAM,IACL,KAAK,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC;YACtB,KAAK,CAAC,GAAG,KAAK,GAAG;YACjB,CAAC,KAAK,CAAC,MAAM;YACb,CAAC,KAAK,CAAC,OAAO;YACd,CAAC,KAAK,CAAC,OAAO,EACd,CAAC;YACD,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,CAAC,KAAoC,EAAE,EAAE;QAC1D,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;QAChB,IAAI,KAAK,CAAC,gBAAgB;YAAE,OAAO;QACnC,cAAc,CAAC,GAAG,EAAE;YAClB,IACE,IAAI;gBACJ,QAAQ,CAAC,aAAa,YAAY,IAAI;gBACtC,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC;gBAClD,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC;gBACrD,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IACF,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;IAE9E,MAAM,YAAY,GAAG,CAAC,IAA+B,EAAE,EAAE;QACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,KAAK,qBAAqB,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC;QACrC,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,OAAO,GAAG,mBAAmB,EAAE,CAAC,IAAI,EAAE;YAC1C,QAAQ;YACR,WAAW,EAAE,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK;YAChC,KAAK,EAAE,cAAc;YACrB,IAAI,EAAE,WAAW;YACjB,SAAS,EAAE,WAAW;SACvB,CAAC,CAAC;QACH,OAAO,CACL,eAEE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;gBACZ,IAAI,IAAI;oBAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;;oBAC3C,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC1C,CAAC,EACD,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,EACrB,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,oBAAoB,mBACf,QAAQ,mBACR,IAAI,CAAC,QAAQ,IAAI,SAAS,gBAC7B,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,iBAC1D,MAAM,IAAI,SAAS,EAChC,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EAC9C,WAAW,EAAE,GAAG,EAAE;gBAChB,IAAI,CAAC,IAAI,CAAC,QAAQ;oBAAE,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjD,CAAC,EACD,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,aAE7B,OAAO,CAAC,CAAC,CAAC,CACT,eAAM,SAAS,EAAC,4BAA4B,iBAAa,MAAM,YAC5D,OAAO,GACH,CACR,CAAC,CAAC,CAAC,IAAI,EACR,gBAAM,SAAS,EAAC,yBAAyB,aACvC,yBAAO,IAAI,CAAC,KAAK,GAAQ,EACxB,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAClB,eAAM,SAAS,EAAC,gCAAgC,YAAE,IAAI,CAAC,WAAW,GAAQ,CAC3E,CAAC,CAAC,CAAC,IAAI,IACH,EACN,QAAQ,CAAC,CAAC,CAAC,eAAM,SAAS,EAAC,mBAAmB,iBAAa,MAAM,uBAAS,CAAC,CAAC,CAAC,IAAI,KA7B7E,IAAI,CAAC,EAAE,CA8BR,CACP,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;IAC5E,MAAM,cAAc,GAAG,aAAa,EAAE,CAAC,oBAAoB,EAAE;QAC3D,KAAK,EAAE,cAAc;QACrB,IAAI,EAAE,kBAAkB;QACxB,SAAS,EAAE,kBAAkB;KAC9B,CAAC,CAAC;IAEH,OAAO,CACL,eACE,GAAG,EAAE,OAAO,EACZ,SAAS,EAAE,UAAU,CAAC,sBAAsB,EAAE,cAAc,CAAC,gBACjD,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,eACtE,IAAI,kBACD,OAAO,sBACH,UAAU,CAAC,MAAM,eACxB,IAAI,IAAI,SAAS,aAE3B,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CACrB,iBAAO,SAAS,EAAC,kBAAkB,EAAC,OAAO,EAAE,SAAS,aACnD,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,8BAAkB,MAAM,mBAAU,CAAC,CAAC,CAAC,IAAI,IACtD,CACT,CAAC,CAAC,CAAC,IAAI,EACR,eAAK,SAAS,EAAC,oBAAoB,aACjC,qBACM,WAAW,EACf,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;4BACZ,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;4BAC1B,IAAI,OAAO,YAAY,KAAK,UAAU;gCAAE,YAAY,CAAC,IAAI,CAAC,CAAC;iCACtD,IAAI,YAAY;gCAAE,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;wBACrD,CAAC,EACD,EAAE,EAAE,SAAS,EACb,IAAI,EAAC,QAAQ,EACb,IAAI,EAAC,UAAU,EACf,SAAS,EAAE,UAAU,CAAC,wCAAwC,EAAE,SAAS,CAAC,EAC1E,QAAQ,EAAE,QAAQ,mBACH,IAAI,IAAI,SAAS,gBACpB,kBAAkB,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,mBACtE,SAAS,mBACR,IAAI,mBACJ,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,2BACpB,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,eAC7C,IAAI,IAAI,UAAU,CAAC,MAAM,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,aAAa,IAAI,SAAS,kBACxF,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,sBACpB,WAAW,mBACd,QAAQ,IAAI,SAAS,mBACrB,QAAQ,IAAI,SAAS,EACpC,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;4BACjB,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;4BACjB,IAAI,KAAK,CAAC,gBAAgB,IAAI,QAAQ,IAAI,IAAI,IAAI,QAAQ;gCAAE,OAAO;4BACnE,IAAI,IAAI;gCAAE,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;;gCAClC,cAAc,EAAE,CAAC;wBACxB,CAAC,aAEA,cAAc,CAAC,CAAC,CAAC,CAChB,eAAM,SAAS,EAAC,qBAAqB,iBAAa,MAAM,YACrD,cAAc,GACV,CACR,CAAC,CAAC,CAAC,IAAI,EACR,eACE,SAAS,EAAC,mBAAmB,gBACjB,oBAAoB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,YAE5D,oBAAoB,EAAE,KAAK,IAAI,WAAW,GACtC,EACN,IAAI,CAAC,CAAC,CAAC,CACN,eAAM,SAAS,EAAC,4BAA4B,iBAAa,MAAM,GAAG,CACnE,CAAC,CAAC,CAAC,CACF,eAAM,SAAS,EAAC,uBAAuB,iBAAa,MAAM,uBAAS,CACpE,IACM,EACR,IAAI,CAAC,CAAC,CAAC,CACN,KAAC,cAAc,IACb,SAAS,EAAE,UAAU,EACrB,WAAW,EAAC,QAAQ,KAChB,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,YAEzE,eACE,GAAG,EAAE,aAAa,EAClB,EAAE,EAAE,SAAS,EACb,IAAI,EAAC,SAAS,gBACF,cAAc,EAC1B,SAAS,EAAC,qBAAqB,kBACjB,OAAO,oBACL,aAAa,CAAC,SAAS,gBAC3B,aAAa,CAAC,KAAK,EAC/B,KAAK,EAAE,aAAa,CAAC,KAAK,aAE3B,UAAU,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,CAC9B,cACE,SAAS,EAAC,qBAAqB,EAC/B,IAAI,EAAE,UAAU,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,YAEvD,UAAU,CAAC,OAAO,GACf,CACP,CAAC,CAAC,CAAC,IAAI,EACP,WAAW,CAAC,CAAC,CAAC,CACb,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;oCAChD,MAAM,cAAc,GAAG,GAAG,SAAS,YAAY,OAAO,CAAC,EAAE,EAAE,CAAC;oCAC5D,OAAO,CACL,eAEE,IAAI,EAAC,OAAO,qBACK,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,gBAC/C,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAClE,SAAS,EAAC,qBAAqB,aAE9B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CACf,cAAK,EAAE,EAAE,cAAc,EAAE,SAAS,EAAC,2BAA2B,YAC3D,OAAO,CAAC,KAAK,GACV,CACP,CAAC,CAAC,CAAC,IAAI,EACP,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,KAX3B,OAAO,CAAC,EAAE,CAYX,CACP,CAAC;gCACJ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CACpC,CAAC,CAAC,CAAC,IAAI,EACP,CAAC,sBAAsB,IAAI,WAAW,CAAC,CAAC,CAAC,CACxC,cACE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;wCACZ,IAAI,IAAI;4CAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;;4CACrD,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;oCACpD,CAAC,EACD,EAAE,EAAE,GAAG,SAAS,eAAe,EAC/B,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,8CAA8C,mBACzC,qBAAqB,KAAK,IAAI,gBACjC,qBAAqB,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,iBACnD,SAAS,KAAK,iBAAiB,IAAI,SAAS,EACzD,WAAW,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,EAC9C,WAAW,EAAE,GAAG,EAAE,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,EACvD,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,YAEvC,mBAAmB,GAChB,CACP,CAAC,CAAC,CAAC,IAAI,IACF,GACS,CAClB,CAAC,CAAC,CAAC,IAAI,IACJ,EACL,WAAW,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CACvB,cAAK,EAAE,EAAE,aAAa,EAAE,SAAS,EAAC,wBAAwB,YAAE,WAAW,GAAO,CAC/E,CAAC,CAAC,CAAC,IAAI,EACP,KAAK,CAAC,CAAC,CAAC,cAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAC,kBAAkB,YAAE,KAAK,GAAO,CAAC,CAAC,CAAC,IAAI,EAC3E,IAAI,CAAC,CAAC,CAAC,gBAAO,IAAI,EAAC,QAAQ,EAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,qBAAqB,IAAI,EAAE,GAAI,CAAC,CAAC,CAAC,IAAI,IAClF,CACP,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAC,WAAW,CAKpB,CAAC","sourcesContent":["import {\n getCollectionNavigationIntent,\n getCollectionNavigationTarget,\n getCollectionTypeaheadMatch,\n reconcileSelectSelection,\n resolveCollectionItem,\n resolveSelectSelectedItem,\n validateCollection,\n type SelectCollectionSectionDescriptor,\n type SelectCollectionSource,\n type SelectOpenChangeReason,\n} from \"@hjmds/design-contracts/components/collection\";\nimport {\n resolveControlAccessibleName,\n selectBehaviorDefaults,\n type AsyncCollectionState,\n type SelectItemDescriptor,\n type WebKeyboardKey,\n} from \"@hjmds/design-contracts/behaviors\";\nimport {\n iconRecipe,\n selectRecipe,\n type SelectDensity,\n type SelectSize,\n} from \"@hjmds/design-contracts/recipes\";\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useRef,\n useState,\n type ButtonHTMLAttributes,\n type FocusEvent,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n type RefAttributes,\n} from \"react\";\nimport { classNames, useControllableState } from \"./internal.js\";\nimport {\n AnchoredPortal,\n useAnchoredPopup,\n type AnchoredPopupAlign,\n} from \"./portal.js\";\n\nexport type SelectItem<Key extends string = string> = SelectItemDescriptor<Key>;\nexport type SelectSection<\n Key extends string = string,\n SectionKey extends string = string,\n> = SelectCollectionSectionDescriptor<Key, SectionKey>;\n\nexport type SelectLeadingRenderProps = Readonly<{\n color: \"currentColor\";\n size: number;\n glyphSize: number;\n}>;\n\nexport type SelectOptionLeadingRenderProps = SelectLeadingRenderProps & Readonly<{\n selected: boolean;\n highlighted: boolean;\n disabled: boolean;\n}>;\n\nconst emptySelectionKey = Symbol(\"hjm-select-empty-selection\");\ntype SelectHighlightKey<Key extends string> = Key | typeof emptySelectionKey;\n\ntype SelectSourceProps<Key extends string, SectionKey extends string> =\n SelectCollectionSource<Key, SectionKey>;\n\ntype SelectSelectionProps<Key extends string> =\n | Readonly<{\n selectedKey: Key | null;\n defaultSelectedKey?: never;\n onSelectionChange(key: Key | null): void;\n }>\n | Readonly<{\n selectedKey?: never;\n defaultSelectedKey?: Key | null;\n onSelectionChange?: (key: Key | null) => void;\n }>;\n\ntype SelectOpenProps =\n | Readonly<{\n open: boolean;\n defaultOpen?: never;\n onOpenChange(open: boolean, reason: SelectOpenChangeReason): void;\n }>\n | Readonly<{\n open?: never;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean, reason: SelectOpenChangeReason) => void;\n }>;\n\ntype SelectLabelProps =\n | Readonly<{ label: string; accessibilityLabel?: string }>\n | Readonly<{ label?: never; accessibilityLabel: string }>;\n\ntype SelectBaseProps<Key extends string> = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n | \"aria-label\"\n | \"children\"\n | \"defaultValue\"\n | \"onChange\"\n | \"role\"\n | \"value\"\n> &\n Readonly<{\n description?: ReactNode;\n error?: ReactNode;\n /** Localized text shown when no item is selected. */\n placeholder: string;\n /** Localized label for the nullable empty-selection option. */\n emptySelectionLabel: string;\n asyncState?: AsyncCollectionState;\n selectedItem?: SelectItemDescriptor<Key>;\n disallowEmptySelection?: boolean;\n loop?: boolean;\n /** Locks interaction without removing the trigger from the focus order. */\n busy?: boolean;\n readOnly?: boolean;\n required?: boolean;\n size?: SelectSize;\n density?: SelectDensity;\n /** Logical listbox alignment against the trigger; automatically mirrors in RTL. */\n align?: AnchoredPopupAlign;\n fieldClassName?: string;\n portalContainer?: HTMLElement;\n locale?: string | readonly string[];\n renderLeading?: (\n item: SelectItemDescriptor<Key> | null,\n appearance: SelectLeadingRenderProps,\n ) => ReactNode;\n renderOptionLeading?: (\n item: SelectItemDescriptor<Key>,\n appearance: SelectOptionLeadingRenderProps,\n ) => ReactNode;\n }>;\n\nexport type SelectProps<\n Key extends string = string,\n SectionKey extends string = string,\n> = SelectBaseProps<Key> &\n SelectSourceProps<Key, SectionKey> &\n SelectSelectionProps<Key> &\n SelectOpenProps &\n SelectLabelProps;\n\nfunction SelectInner<Key extends string, SectionKey extends string>(\n props: SelectProps<Key, SectionKey>,\n forwardedRef: React.ForwardedRef<HTMLButtonElement>,\n) {\n const {\n items,\n sections,\n label,\n accessibilityLabel,\n description,\n error,\n placeholder,\n emptySelectionLabel,\n asyncState = { status: \"idle\" },\n selectedItem,\n disallowEmptySelection = selectBehaviorDefaults.disallowEmptySelection,\n loop = selectBehaviorDefaults.loop,\n busy = false,\n readOnly = false,\n size = selectRecipe.defaults.size,\n density = selectRecipe.defaults.density,\n align = \"start\",\n fieldClassName,\n portalContainer,\n locale,\n renderLeading,\n renderOptionLeading,\n className,\n id: idProp,\n name,\n disabled = false,\n required = false,\n selectedKey: selectedKeyProp,\n defaultSelectedKey,\n onSelectionChange,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n onClick,\n onFocus,\n onBlur,\n onKeyDown,\n ...buttonProps\n } = props;\n const source: SelectCollectionSource<Key, SectionKey> = sections === undefined\n ? { items: items ?? [] }\n : { sections };\n validateCollection(source);\n const accessibleName = resolveControlAccessibleName(\n label,\n accessibilityLabel,\n \"Select\",\n );\n if (placeholder.trim().length === 0) throw new TypeError(\"Select placeholder must not be empty\");\n if (emptySelectionLabel.trim().length === 0) {\n throw new TypeError(\"Select emptySelectionLabel must not be empty\");\n }\n const flatItems = source.sections\n ? source.sections.flatMap((section) => section.items)\n : source.items;\n if (\n flatItems.length === 0 &&\n (asyncState.status === \"idle\" || asyncState.status === \"loadingMore\")\n ) {\n throw new TypeError(\"Select requires options unless its async state is transient or empty\");\n }\n const initialSelectionRef = useRef<Readonly<{ value: Key | null }> | null>(null);\n if (initialSelectionRef.current === null) {\n initialSelectionRef.current = {\n value: reconcileSelectSelection(\n source,\n selectedKeyProp ?? defaultSelectedKey ?? null,\n {\n disallowEmptySelection,\n asyncState,\n ...(selectedItem === undefined ? {} : { selectedItem }),\n },\n ),\n };\n }\n const [storedSelectedKey, setSelectedKey] = useControllableState<Key | null>({\n ...(selectedKeyProp === undefined ? {} : { value: selectedKeyProp }),\n defaultValue: initialSelectionRef.current.value,\n ...(onSelectionChange === undefined ? {} : { onChange: onSelectionChange }),\n });\n const reconciledSelectedKey = reconcileSelectSelection(source, storedSelectedKey, {\n disallowEmptySelection,\n asyncState,\n ...(selectedItem === undefined ? {} : { selectedItem }),\n });\n const reconciliationRequestRef = useRef<string | undefined>(undefined);\n useEffect(() => {\n if (storedSelectedKey === reconciledSelectedKey) {\n reconciliationRequestRef.current = undefined;\n return;\n }\n const token = `${storedSelectedKey ?? \"<empty>\"}->${reconciledSelectedKey ?? \"<empty>\"}`;\n if (reconciliationRequestRef.current === token) return;\n reconciliationRequestRef.current = token;\n setSelectedKey(reconciledSelectedKey);\n }, [reconciledSelectedKey, setSelectedKey, storedSelectedKey]);\n const resolvedSelectedItem = resolveSelectSelectedItem(\n source,\n reconciledSelectedKey,\n selectedItem !== undefined && selectedItem.id === reconciledSelectedKey\n ? selectedItem\n : undefined,\n );\n\n const [internalOpen, setInternalOpen] = useState(defaultOpen);\n const openControlled = openProp !== undefined;\n const open = openControlled ? openProp : internalOpen;\n const pendingOpenRequestRef = useRef<boolean | undefined>(undefined);\n useEffect(() => {\n if (pendingOpenRequestRef.current === open) pendingOpenRequestRef.current = undefined;\n }, [open]);\n const changeOpen = useCallback(\n (nextOpen: boolean, reason: SelectOpenChangeReason) => {\n if (nextOpen === open || pendingOpenRequestRef.current === nextOpen) return;\n pendingOpenRequestRef.current = nextOpen;\n if (!openControlled) setInternalOpen(nextOpen);\n onOpenChange?.(nextOpen, reason);\n if (openControlled && nextOpen) {\n queueMicrotask(() => {\n if (pendingOpenRequestRef.current === true) {\n pendingOpenRequestRef.current = undefined;\n }\n });\n }\n },\n [onOpenChange, open, openControlled],\n );\n\n const generatedId = useId().replaceAll(\":\", \"\");\n const controlId = idProp ?? `hjm-select-${generatedId}`;\n const listboxId = `${controlId}-listbox`;\n const descriptionId = `${controlId}-description`;\n const errorId = `${controlId}-error`;\n const optionId = (key: Key) =>\n `${controlId}-option-${flatItems.findIndex((item) => item.id === key)}`;\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement | null>(null);\n const listboxRef = useRef<HTMLDivElement | null>(null);\n const [listboxNode, setListboxNode] = useState<HTMLDivElement | null>(null);\n const optionRefs = useRef(new Map<SelectHighlightKey<Key>, HTMLDivElement>());\n const typeaheadRef = useRef({ value: \"\", time: 0 });\n const restoreFocusRef = useRef(false);\n const showOptions = asyncState.status === \"idle\" || asyncState.status === \"loadingMore\";\n const emptySelectionAvailable = !disallowEmptySelection && showOptions;\n const selectionItemInSource = resolveCollectionItem(source, reconciledSelectedKey);\n const initialHighlight = selectionItemInSource && !selectionItemInSource.disabled\n ? selectionItemInSource.id\n : reconciledSelectedKey === null && emptySelectionAvailable\n ? emptySelectionKey\n : getCollectionNavigationTarget(source, null, \"first\", loop) ?? null;\n const [highlightedKey, setHighlightedKey] = useState<SelectHighlightKey<Key> | null>(\n initialHighlight,\n );\n const highlightedItem = showOptions && highlightedKey !== emptySelectionKey\n ? resolveCollectionItem(source, highlightedKey)\n : null;\n const activeKey: SelectHighlightKey<Key> | null = highlightedItem && !highlightedItem.disabled\n ? highlightedItem.id\n : highlightedKey === emptySelectionKey && emptySelectionAvailable\n ? emptySelectionKey\n : null;\n const activeOptionId = activeKey === emptySelectionKey\n ? `${controlId}-option-empty`\n : activeKey === null\n ? undefined\n : optionId(activeKey);\n const popupPosition = useAnchoredPopup(triggerRef, listboxNode, {\n align,\n matchAnchorWidth: true,\n zIndex: 800,\n });\n const setListboxRef = useCallback((node: HTMLDivElement | null) => {\n listboxRef.current = node;\n setListboxNode(node);\n }, []);\n\n useEffect(() => {\n if (!open) {\n if (restoreFocusRef.current) {\n restoreFocusRef.current = false;\n queueMicrotask(() => triggerRef.current?.focus());\n }\n return;\n }\n if (activeKey === null && showOptions) setHighlightedKey(initialHighlight);\n }, [activeKey, initialHighlight, open, showOptions]);\n useEffect(() => {\n if (open && activeKey !== null) {\n optionRefs.current.get(activeKey)?.scrollIntoView({ block: \"nearest\" });\n }\n }, [activeKey, open]);\n useEffect(() => {\n if (!open) return;\n const handlePointerDown = (event: PointerEvent) => {\n if (\n event.target instanceof Node &&\n !rootRef.current?.contains(event.target) &&\n !listboxRef.current?.contains(event.target)\n ) {\n changeOpen(false, \"outside\");\n }\n };\n document.addEventListener(\"pointerdown\", handlePointerDown);\n return () => document.removeEventListener(\"pointerdown\", handlePointerDown);\n }, [changeOpen, open]);\n\n const openWithIntent = (intent: \"first\" | \"last\" = \"first\") => {\n if (disabled || busy || readOnly) return;\n const selectedInSource = resolveCollectionItem(source, reconciledSelectedKey);\n const target = selectedInSource && !selectedInSource.disabled\n ? selectedInSource.id\n : reconciledSelectedKey === null && emptySelectionAvailable\n ? emptySelectionKey\n : intent === \"last\" && emptySelectionAvailable\n ? emptySelectionKey\n : getCollectionNavigationTarget(source, null, intent, loop) ?? null;\n setHighlightedKey(target);\n changeOpen(true, \"keyboard\");\n };\n const moveHighlight = (intent: \"next\" | \"previous\" | \"first\" | \"last\") => {\n const enabledKeys = flatItems\n .filter((item) => !item.disabled)\n .map((item) => item.id);\n const firstKey = enabledKeys[0];\n const lastKey = enabledKeys.at(-1);\n if (emptySelectionAvailable) {\n if (intent === \"last\") {\n setHighlightedKey(emptySelectionKey);\n return;\n }\n if (activeKey === emptySelectionKey) {\n if (intent === \"previous\" && lastKey !== undefined) setHighlightedKey(lastKey);\n else if (\n ((intent === \"next\" && loop) || intent === \"first\") &&\n firstKey !== undefined\n ) {\n setHighlightedKey(firstKey);\n }\n return;\n }\n if (intent === \"next\" && activeKey === lastKey) {\n setHighlightedKey(emptySelectionKey);\n return;\n }\n if (intent === \"previous\" && activeKey === firstKey && loop) {\n setHighlightedKey(emptySelectionKey);\n return;\n }\n }\n const target = getCollectionNavigationTarget(\n source,\n activeKey === emptySelectionKey ? null : activeKey,\n intent,\n loop,\n );\n if (target !== undefined) setHighlightedKey(target);\n };\n const commit = (key: SelectHighlightKey<Key>) => {\n if (key === emptySelectionKey) {\n if (disabled || readOnly || !emptySelectionAvailable) return;\n setSelectedKey(null);\n restoreFocusRef.current = true;\n changeOpen(false, \"selection\");\n return;\n }\n const item = resolveCollectionItem(source, key);\n if (\n !item ||\n item.disabled ||\n disabled ||\n busy ||\n readOnly ||\n asyncState.status === \"loading\"\n ) return;\n setSelectedKey(key);\n restoreFocusRef.current = true;\n changeOpen(false, \"selection\");\n };\n const runTypeahead = (key: string) => {\n const now = Date.now();\n const previous = now - typeaheadRef.current.time < 500\n ? typeaheadRef.current.value\n : \"\";\n const combined = `${previous}${key}`;\n const query = new Set(combined.toLocaleLowerCase()).size === 1 ? key : combined;\n typeaheadRef.current = { value: combined, time: now };\n const match = getCollectionTypeaheadMatch(source, query, {\n startsAfterKey: activeKey === emptySelectionKey\n ? reconciledSelectedKey\n : activeKey ?? reconciledSelectedKey,\n ...(locale === undefined ? {} : { locale }),\n });\n if (match !== undefined) {\n setHighlightedKey(match);\n if (!open) changeOpen(true, \"keyboard\");\n }\n };\n const handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n onKeyDown?.(event);\n if (event.defaultPrevented || disabled || busy || readOnly) return;\n const navigationIntent = getCollectionNavigationIntent(\n event.key as WebKeyboardKey,\n );\n if (navigationIntent !== undefined) {\n event.preventDefault();\n if (!open) {\n openWithIntent(\n navigationIntent === \"previous\" || navigationIntent === \"last\"\n ? \"last\"\n : \"first\",\n );\n }\n else moveHighlight(navigationIntent);\n return;\n }\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n if (!open) openWithIntent();\n else if (activeKey !== null) commit(activeKey);\n } else if (event.key === \"Escape\" && open) {\n event.preventDefault();\n restoreFocusRef.current = true;\n changeOpen(false, \"escape\");\n } else if (event.key === \"Tab\" && open) {\n changeOpen(false, \"blur\");\n } else if (\n event.key.length === 1 &&\n event.key !== \" \" &&\n !event.altKey &&\n !event.ctrlKey &&\n !event.metaKey\n ) {\n event.preventDefault();\n runTypeahead(event.key);\n }\n };\n const handleBlur = (event: FocusEvent<HTMLButtonElement>) => {\n onBlur?.(event);\n if (event.defaultPrevented) return;\n queueMicrotask(() => {\n if (\n open &&\n document.activeElement instanceof Node &&\n !rootRef.current?.contains(document.activeElement) &&\n !listboxRef.current?.contains(document.activeElement)\n ) changeOpen(false, \"blur\");\n });\n };\n const describedBy = error ? errorId : description ? descriptionId : undefined;\n\n const renderOption = (item: SelectItemDescriptor<Key>) => {\n const selected = item.id === reconciledSelectedKey;\n const active = item.id === activeKey;\n const leadingSize = iconRecipe.sizes[selectRecipe.optionLeading.glyph];\n const leading = renderOptionLeading?.(item, {\n selected,\n highlighted: active,\n disabled: item.disabled ?? false,\n color: \"currentColor\",\n size: leadingSize,\n glyphSize: leadingSize,\n });\n return (\n <div\n key={item.id}\n ref={(node) => {\n if (node) optionRefs.current.set(item.id, node);\n else optionRefs.current.delete(item.id);\n }}\n id={optionId(item.id)}\n role=\"option\"\n className=\"hjm-select__option\"\n aria-selected={selected}\n aria-disabled={item.disabled || undefined}\n data-state={item.disabled ? \"disabled\" : selected ? \"selected\" : \"idle\"}\n data-active={active || undefined}\n onMouseDown={(event) => event.preventDefault()}\n onMouseMove={() => {\n if (!item.disabled) setHighlightedKey(item.id);\n }}\n onClick={() => commit(item.id)}\n >\n {leading ? (\n <span className=\"hjm-select__option-leading\" aria-hidden=\"true\">\n {leading}\n </span>\n ) : null}\n <span className=\"hjm-select__option-copy\">\n <span>{item.label}</span>\n {item.description ? (\n <span className=\"hjm-select__option-description\">{item.description}</span>\n ) : null}\n </span>\n {selected ? <span className=\"hjm-select__check\" aria-hidden=\"true\">✓</span> : null}\n </div>\n );\n };\n\n const triggerLeadingSize = iconRecipe.sizes[selectRecipe.sizes[size].glyph];\n const triggerLeading = renderLeading?.(resolvedSelectedItem, {\n color: \"currentColor\",\n size: triggerLeadingSize,\n glyphSize: triggerLeadingSize,\n });\n\n return (\n <div\n ref={rootRef}\n className={classNames(\"hjm-field hjm-select\", fieldClassName)}\n data-state={disabled ? \"disabled\" : error ? \"invalid\" : open ? \"focused\" : \"idle\"}\n data-size={size}\n data-density={density}\n data-async-state={asyncState.status}\n data-busy={busy || undefined}\n >\n {label !== undefined ? (\n <label className=\"hjm-field__label\" htmlFor={controlId}>\n {label}{required ? <span aria-hidden=\"true\"> *</span> : null}\n </label>\n ) : null}\n <div className=\"hjm-select__anchor\">\n <button\n {...buttonProps}\n ref={(node) => {\n triggerRef.current = node;\n if (typeof forwardedRef === \"function\") forwardedRef(node);\n else if (forwardedRef) forwardedRef.current = node;\n }}\n id={controlId}\n type=\"button\"\n role=\"combobox\"\n className={classNames(\"hjm-field__control hjm-select__trigger\", className)}\n disabled={disabled}\n aria-disabled={busy || undefined}\n aria-label={accessibilityLabel ?? (label === undefined ? accessibleName : undefined)}\n aria-haspopup=\"listbox\"\n aria-expanded={open}\n aria-controls={open ? listboxId : undefined}\n aria-activedescendant={open ? activeOptionId : undefined}\n aria-busy={busy || asyncState.status === \"loading\" || asyncState.status === \"loadingMore\" || undefined}\n aria-invalid={error ? true : undefined}\n aria-describedby={describedBy}\n aria-readonly={readOnly || undefined}\n aria-required={required || undefined}\n onFocus={onFocus}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onClick={(event) => {\n onClick?.(event);\n if (event.defaultPrevented || disabled || busy || readOnly) return;\n if (open) changeOpen(false, \"trigger\");\n else openWithIntent();\n }}\n >\n {triggerLeading ? (\n <span className=\"hjm-select__leading\" aria-hidden=\"true\">\n {triggerLeading}\n </span>\n ) : null}\n <span\n className=\"hjm-select__value\"\n data-state={resolvedSelectedItem ? \"selected\" : \"placeholder\"}\n >\n {resolvedSelectedItem?.label ?? placeholder}\n </span>\n {busy ? (\n <span className=\"hjm-select__busy-indicator\" aria-hidden=\"true\" />\n ) : (\n <span className=\"hjm-select__indicator\" aria-hidden=\"true\">⌄</span>\n )}\n </button>\n {open ? (\n <AnchoredPortal\n anchorRef={triggerRef}\n ssrFallback=\"inline\"\n {...(portalContainer === undefined ? {} : { container: portalContainer })}\n >\n <div\n ref={setListboxRef}\n id={listboxId}\n role=\"listbox\"\n aria-label={accessibleName}\n className=\"hjm-select__listbox\"\n data-density={density}\n data-placement={popupPosition.placement}\n data-align={popupPosition.align}\n style={popupPosition.style}\n >\n {asyncState.status !== \"idle\" ? (\n <div\n className=\"hjm-select__message\"\n role={asyncState.status === \"error\" ? \"alert\" : \"status\"}\n >\n {asyncState.message}\n </div>\n ) : null}\n {showOptions ? (\n source.sections ? source.sections.map((section) => {\n const sectionLabelId = `${controlId}-section-${section.id}`;\n return (\n <div\n key={section.id}\n role=\"group\"\n aria-labelledby={section.label ? sectionLabelId : undefined}\n aria-label={section.label ? undefined : section.accessibilityLabel}\n className=\"hjm-select__section\"\n >\n {section.label ? (\n <div id={sectionLabelId} className=\"hjm-select__section-label\">\n {section.label}\n </div>\n ) : null}\n {section.items.map(renderOption)}\n </div>\n );\n }) : source.items.map(renderOption)\n ) : null}\n {!disallowEmptySelection && showOptions ? (\n <div\n ref={(node) => {\n if (node) optionRefs.current.set(emptySelectionKey, node);\n else optionRefs.current.delete(emptySelectionKey);\n }}\n id={`${controlId}-option-empty`}\n role=\"option\"\n className=\"hjm-select__option hjm-select__option--empty\"\n aria-selected={reconciledSelectedKey === null}\n data-state={reconciledSelectedKey === null ? \"selected\" : \"idle\"}\n data-active={activeKey === emptySelectionKey || undefined}\n onMouseDown={(event) => event.preventDefault()}\n onMouseMove={() => setHighlightedKey(emptySelectionKey)}\n onClick={() => commit(emptySelectionKey)}\n >\n {emptySelectionLabel}\n </div>\n ) : null}\n </div>\n </AnchoredPortal>\n ) : null}\n </div>\n {description && !error ? (\n <div id={descriptionId} className=\"hjm-field__description\">{description}</div>\n ) : null}\n {error ? <div id={errorId} className=\"hjm-field__error\">{error}</div> : null}\n {name ? <input type=\"hidden\" name={name} value={reconciledSelectedKey ?? \"\"} /> : null}\n </div>\n );\n}\n\nexport const Select = forwardRef(SelectInner) as <\n Key extends string = string,\n SectionKey extends string = string,\n>(\n props: SelectProps<Key, SectionKey> & RefAttributes<HTMLButtonElement>,\n) => ReactElement | null;\n"]}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { chipRecipe, type SegmentedControlSize, type SelectionControlPresentation, type SelectionControlSize, type SelectionGroupOrientation, type SelectionGroupPresentation } from "@hjmds/design-contracts/recipes";
|
|
2
|
+
import { type CheckboxGroupSelection, type SelectionItemDescriptor } from "@hjmds/design-contracts/behaviors";
|
|
3
|
+
import { type ButtonHTMLAttributes, type ChangeEvent, type FieldsetHTMLAttributes, type InputHTMLAttributes, type MouseEvent, type ReactElement, type ReactNode, type RefAttributes } from "react";
|
|
4
|
+
export type ChoiceLeadingRenderProps = Readonly<{
|
|
5
|
+
selected: boolean;
|
|
6
|
+
color: "currentColor";
|
|
7
|
+
size: number;
|
|
8
|
+
}>;
|
|
9
|
+
type ChipBaseProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children" | "onChange" | "onClick" | "size"> & Readonly<{
|
|
10
|
+
label: ReactNode;
|
|
11
|
+
size?: keyof typeof chipRecipe.sizes;
|
|
12
|
+
leading?: ReactNode;
|
|
13
|
+
trailing?: ReactNode;
|
|
14
|
+
renderSelectionIndicator?: (props: Readonly<{
|
|
15
|
+
selected: boolean;
|
|
16
|
+
color: "currentColor";
|
|
17
|
+
size: number;
|
|
18
|
+
}>) => ReactNode;
|
|
19
|
+
}>;
|
|
20
|
+
type ActionChipProps = Readonly<{
|
|
21
|
+
selectionMode?: "action";
|
|
22
|
+
selected?: never;
|
|
23
|
+
onPress?: (event: MouseEvent<HTMLButtonElement>) => void;
|
|
24
|
+
onSelectedChange?: never;
|
|
25
|
+
}>;
|
|
26
|
+
type SelectionChipProps = Readonly<{
|
|
27
|
+
selectionMode: "single" | "multiple";
|
|
28
|
+
selected: boolean;
|
|
29
|
+
onSelectedChange: (selected: boolean) => void;
|
|
30
|
+
onPress?: (event: MouseEvent<HTMLButtonElement>) => void;
|
|
31
|
+
}>;
|
|
32
|
+
export type ChipProps = ChipBaseProps & (ActionChipProps | SelectionChipProps);
|
|
33
|
+
/** Action/filter chip with explicit selection semantics and no hidden state. */
|
|
34
|
+
export declare const Chip: import("react").ForwardRefExoticComponent<ChipProps & RefAttributes<HTMLButtonElement>>;
|
|
35
|
+
export type CheckboxProps = Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "checked" | "defaultChecked" | "onChange" | "children" | "size"> & Readonly<{
|
|
36
|
+
label: ReactNode;
|
|
37
|
+
description?: ReactNode;
|
|
38
|
+
checked?: boolean;
|
|
39
|
+
defaultChecked?: boolean;
|
|
40
|
+
indeterminate?: boolean;
|
|
41
|
+
onCheckedChange?: (checked: boolean) => void;
|
|
42
|
+
onChange?: (event: ChangeEvent<HTMLInputElement>) => void;
|
|
43
|
+
presentation?: SelectionControlPresentation;
|
|
44
|
+
size?: SelectionControlSize;
|
|
45
|
+
renderLeading?: (appearance: ChoiceLeadingRenderProps) => ReactNode;
|
|
46
|
+
}>;
|
|
47
|
+
export declare const Checkbox: import("react").ForwardRefExoticComponent<Omit<InputHTMLAttributes<HTMLInputElement>, "onChange" | "children" | "defaultChecked" | "type" | "size" | "checked"> & Readonly<{
|
|
48
|
+
label: ReactNode;
|
|
49
|
+
description?: ReactNode;
|
|
50
|
+
checked?: boolean;
|
|
51
|
+
defaultChecked?: boolean;
|
|
52
|
+
indeterminate?: boolean;
|
|
53
|
+
onCheckedChange?: (checked: boolean) => void;
|
|
54
|
+
onChange?: (event: ChangeEvent<HTMLInputElement>) => void;
|
|
55
|
+
presentation?: SelectionControlPresentation;
|
|
56
|
+
size?: SelectionControlSize;
|
|
57
|
+
renderLeading?: (appearance: ChoiceLeadingRenderProps) => ReactNode;
|
|
58
|
+
}> & RefAttributes<HTMLInputElement>>;
|
|
59
|
+
type RadioState = Readonly<{
|
|
60
|
+
checked: boolean;
|
|
61
|
+
defaultChecked?: never;
|
|
62
|
+
onCheckedChange(checked: true): void;
|
|
63
|
+
}> | Readonly<{
|
|
64
|
+
checked?: never;
|
|
65
|
+
defaultChecked?: boolean;
|
|
66
|
+
onCheckedChange?: (checked: true) => void;
|
|
67
|
+
}>;
|
|
68
|
+
export type RadioProps = Omit<InputHTMLAttributes<HTMLInputElement>, "type" | "checked" | "defaultChecked" | "onChange" | "children" | "size"> & RadioState & Readonly<{
|
|
69
|
+
label: ReactNode;
|
|
70
|
+
description?: ReactNode;
|
|
71
|
+
onChange?: (event: ChangeEvent<HTMLInputElement>) => void;
|
|
72
|
+
presentation?: SelectionControlPresentation;
|
|
73
|
+
size?: SelectionControlSize;
|
|
74
|
+
renderLeading?: (appearance: ChoiceLeadingRenderProps) => ReactNode;
|
|
75
|
+
}>;
|
|
76
|
+
/** Native radio item primitive. Use RadioGroup when the renderer owns group state. */
|
|
77
|
+
export declare const Radio: import("react").ForwardRefExoticComponent<RadioProps & RefAttributes<HTMLInputElement>>;
|
|
78
|
+
export type CheckboxGroupItem<Key extends string = string> = SelectionItemDescriptor<Key>;
|
|
79
|
+
type CheckboxGroupBaseProps<Key extends string> = Omit<FieldsetHTMLAttributes<HTMLFieldSetElement>, "defaultValue" | "onChange" | "value"> & Readonly<{
|
|
80
|
+
items: readonly CheckboxGroupItem<Key>[];
|
|
81
|
+
label?: string;
|
|
82
|
+
accessibilityLabel?: string;
|
|
83
|
+
description?: ReactNode;
|
|
84
|
+
error?: ReactNode;
|
|
85
|
+
orientation?: SelectionGroupOrientation;
|
|
86
|
+
presentation?: SelectionGroupPresentation;
|
|
87
|
+
size?: SelectionControlSize;
|
|
88
|
+
name?: string;
|
|
89
|
+
required?: boolean;
|
|
90
|
+
readOnly?: boolean;
|
|
91
|
+
renderLeading?: (item: CheckboxGroupItem<Key>, appearance: ChoiceLeadingRenderProps) => ReactNode;
|
|
92
|
+
}>;
|
|
93
|
+
export type CheckboxGroupProps<Key extends string = string> = CheckboxGroupBaseProps<Key> & CheckboxGroupSelection<Key>;
|
|
94
|
+
export declare const CheckboxGroup: <Key extends string = string>(props: CheckboxGroupProps<Key> & RefAttributes<HTMLFieldSetElement>) => ReactElement;
|
|
95
|
+
export type RadioGroupItem = Readonly<{
|
|
96
|
+
value: string;
|
|
97
|
+
label: ReactNode;
|
|
98
|
+
description?: ReactNode;
|
|
99
|
+
disabled?: boolean;
|
|
100
|
+
}>;
|
|
101
|
+
type RadioGroupLabelProps = Readonly<{
|
|
102
|
+
label: ReactNode;
|
|
103
|
+
accessibilityLabel?: string;
|
|
104
|
+
}> | Readonly<{
|
|
105
|
+
label?: never;
|
|
106
|
+
accessibilityLabel: string;
|
|
107
|
+
}>;
|
|
108
|
+
export type RadioGroupProps = Omit<FieldsetHTMLAttributes<HTMLFieldSetElement>, "defaultValue" | "onChange" | "value"> & RadioGroupLabelProps & Readonly<{
|
|
109
|
+
items: readonly RadioGroupItem[];
|
|
110
|
+
value?: string | null;
|
|
111
|
+
defaultValue?: string | null;
|
|
112
|
+
onValueChange?: (value: string) => void;
|
|
113
|
+
orientation?: SelectionGroupOrientation;
|
|
114
|
+
presentation?: SelectionGroupPresentation;
|
|
115
|
+
size?: SelectionControlSize;
|
|
116
|
+
description?: ReactNode;
|
|
117
|
+
error?: ReactNode;
|
|
118
|
+
name?: string;
|
|
119
|
+
required?: boolean;
|
|
120
|
+
readOnly?: boolean;
|
|
121
|
+
renderLeading?: (item: RadioGroupItem, appearance: ChoiceLeadingRenderProps) => ReactNode;
|
|
122
|
+
}>;
|
|
123
|
+
export declare const RadioGroup: import("react").ForwardRefExoticComponent<RadioGroupProps & RefAttributes<HTMLFieldSetElement>>;
|
|
124
|
+
export type SwitchProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>, "role" | "onChange" | "value"> & Readonly<{
|
|
125
|
+
label: ReactNode;
|
|
126
|
+
checked?: boolean;
|
|
127
|
+
defaultChecked?: boolean;
|
|
128
|
+
onCheckedChange?: (checked: boolean) => void;
|
|
129
|
+
}>;
|
|
130
|
+
export declare const Switch: import("react").ForwardRefExoticComponent<Omit<ButtonHTMLAttributes<HTMLButtonElement>, "value" | "onChange" | "role"> & Readonly<{
|
|
131
|
+
label: ReactNode;
|
|
132
|
+
checked?: boolean;
|
|
133
|
+
defaultChecked?: boolean;
|
|
134
|
+
onCheckedChange?: (checked: boolean) => void;
|
|
135
|
+
}> & RefAttributes<HTMLButtonElement>>;
|
|
136
|
+
export type SegmentedControlItem = Readonly<{
|
|
137
|
+
value: string;
|
|
138
|
+
label: ReactNode;
|
|
139
|
+
disabled?: boolean;
|
|
140
|
+
}>;
|
|
141
|
+
export type SegmentedControlProps = Omit<FieldsetHTMLAttributes<HTMLFieldSetElement>, "defaultValue" | "onChange" | "value"> & Readonly<{
|
|
142
|
+
label: string;
|
|
143
|
+
items: readonly SegmentedControlItem[];
|
|
144
|
+
value?: string;
|
|
145
|
+
defaultValue?: string;
|
|
146
|
+
onValueChange?: (value: string) => void;
|
|
147
|
+
size?: SegmentedControlSize;
|
|
148
|
+
name?: string;
|
|
149
|
+
}>;
|
|
150
|
+
export declare const SegmentedControl: import("react").ForwardRefExoticComponent<Omit<FieldsetHTMLAttributes<HTMLFieldSetElement>, "value" | "defaultValue" | "onChange"> & Readonly<{
|
|
151
|
+
label: string;
|
|
152
|
+
items: readonly SegmentedControlItem[];
|
|
153
|
+
value?: string;
|
|
154
|
+
defaultValue?: string;
|
|
155
|
+
onValueChange?: (value: string) => void;
|
|
156
|
+
size?: SegmentedControlSize;
|
|
157
|
+
name?: string;
|
|
158
|
+
}> & RefAttributes<HTMLFieldSetElement>>;
|
|
159
|
+
export {};
|
|
160
|
+
//# sourceMappingURL=selection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../src/selection.tsx"],"names":[],"mappings":"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"}
|