@lobehub/ui 4.20.1 → 4.21.1
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/es/Accordion/Accordion.d.mts +2 -2
- package/es/Accordion/AccordionItem.d.mts +2 -2
- package/es/ActionIcon/ActionIcon.d.mts +2 -2
- package/es/Alert/Alert.d.mts +2 -2
- package/es/AutoComplete/Select.d.mts +2 -2
- package/es/Avatar/AvatarGroup/index.d.mts +2 -2
- package/es/Burger/Burger.d.mts +2 -2
- package/es/CodeDiff/CodeDiff.d.mts +2 -2
- package/es/CodeDiff/PatchDiff.d.mts +2 -2
- package/es/CodeEditor/CodeEditor.d.mts +2 -2
- package/es/Collapse/Collapse.d.mts +2 -2
- package/es/ConfigProvider/index.d.mts +2 -2
- package/es/ContextMenu/ContextMenuHost.d.mts +3 -3
- package/es/CopyButton/CopyButton.d.mts +2 -2
- package/es/DatePicker/DatePicker.d.mts +2 -2
- package/es/DraggablePanel/components/DraggablePanelBody.d.mts +2 -2
- package/es/DraggablePanel/components/DraggablePanelContainer.d.mts +2 -2
- package/es/DraggablePanel/components/DraggablePanelFooter.d.mts +2 -2
- package/es/DraggablePanel/components/DraggablePanelHeader.d.mts +2 -2
- package/es/DraggableSideNav/DraggableSideNav.d.mts +2 -2
- package/es/Drawer/Drawer.d.mts +2 -2
- package/es/Dropdown/Dropdown.d.mts +2 -2
- package/es/DropdownMenu/DropdownMenu.d.mts +2 -2
- package/es/DropdownMenu/DropdownMenu.mjs +7 -5
- package/es/DropdownMenu/DropdownMenu.mjs.map +1 -1
- package/es/DropdownMenu/atoms.d.mts +29 -20
- package/es/DropdownMenu/atoms.mjs +5 -5
- package/es/DropdownMenu/atoms.mjs.map +1 -1
- package/es/DropdownMenu/type.d.mts +7 -0
- package/es/EditableText/EditableText.d.mts +2 -2
- package/es/EmojiPicker/EmojiPicker.d.mts +2 -2
- package/es/EmojiPicker/EmojiPicker.mjs +5 -1
- package/es/EmojiPicker/EmojiPicker.mjs.map +1 -1
- package/es/EmojiPicker/style.mjs +4 -0
- package/es/EmojiPicker/style.mjs.map +1 -1
- package/es/Flex/FlexBasic.d.mts +2 -2
- package/es/FontLoader/index.d.mts +2 -2
- package/es/Footer/Footer.d.mts +2 -2
- package/es/Form/components/FormGroup.d.mts +2 -2
- package/es/Form/components/FormItem.d.mts +2 -2
- package/es/Form/components/FormSubmitFooter.d.mts +2 -2
- package/es/FormModal/FormModal.d.mts +2 -2
- package/es/GuideCard/GuideCard.d.mts +2 -2
- package/es/Header/Header.d.mts +2 -2
- package/es/Highlighter/Highlighter.d.mts +2 -2
- package/es/Highlighter/SyntaxHighlighter/index.d.mts +2 -2
- package/es/Hotkey/Hotkey.d.mts +2 -2
- package/es/HotkeyInput/HotkeyInput.d.mts +2 -2
- package/es/Icon/Icon.d.mts +2 -2
- package/es/Icon/components/IconProvider.d.mts +3 -3
- package/es/Image/PreviewGroup.d.mts +2 -2
- package/es/ImageSelect/ImageSelect.d.mts +2 -2
- package/es/Input/Input.d.mts +2 -2
- package/es/Input/InputNumber.d.mts +2 -2
- package/es/Input/InputOPT.d.mts +2 -2
- package/es/Input/InputPassword.d.mts +2 -2
- package/es/Input/TextArea.d.mts +2 -2
- package/es/Layout/components/LayoutFooter.d.mts +2 -2
- package/es/Layout/components/LayoutHeader.d.mts +2 -2
- package/es/Layout/components/LayoutMain.d.mts +2 -2
- package/es/Layout/components/LayoutSidebar.d.mts +2 -2
- package/es/Layout/components/LayoutSidebarInner.d.mts +2 -2
- package/es/Layout/components/LayoutToc.d.mts +2 -2
- package/es/List/ListItem/index.d.mts +2 -2
- package/es/LobeSelect/LobeSelect.d.mts +8 -0
- package/es/LobeSelect/LobeSelect.mjs +486 -0
- package/es/LobeSelect/LobeSelect.mjs.map +1 -0
- package/es/LobeSelect/atoms.d.mts +155 -0
- package/es/LobeSelect/atoms.mjs +172 -0
- package/es/LobeSelect/atoms.mjs.map +1 -0
- package/es/LobeSelect/constants.d.mts +5 -0
- package/es/LobeSelect/constants.mjs +6 -0
- package/es/LobeSelect/constants.mjs.map +1 -0
- package/es/LobeSelect/index.d.mts +5 -0
- package/es/LobeSelect/index.d.ts +1 -0
- package/es/LobeSelect/index.js +1 -0
- package/es/LobeSelect/index.mjs +5 -0
- package/es/LobeSelect/style.mjs +274 -0
- package/es/LobeSelect/style.mjs.map +1 -0
- package/es/LobeSelect/type.d.mts +83 -0
- package/es/Markdown/Markdown.d.mts +2 -2
- package/es/Markdown/Typography.d.mts +2 -2
- package/es/Markdown/components/SearchResultCards/index.d.mts +2 -2
- package/es/Markdown/markdown.style.mjs +40 -15
- package/es/Markdown/markdown.style.mjs.map +1 -1
- package/es/MaskShadow/MaskShadow.d.mts +2 -2
- package/es/Menu/Menu.d.mts +2 -2
- package/es/Menu/sharedStyle.mjs +2 -2
- package/es/Menu/sharedStyle.mjs.map +1 -1
- package/es/Mermaid/Mermaid.d.mts +2 -2
- package/es/Mermaid/SyntaxMermaid/index.d.mts +2 -2
- package/es/Modal/Modal.d.mts +2 -2
- package/es/Modal/ModalProvider.d.mts +2 -2
- package/es/Modal/imperative.d.mts +2 -2
- package/es/MotionProvider/index.d.mts +2 -2
- package/es/Popover/ArrowIcon.d.mts +2 -2
- package/es/Popover/Popover.d.mts +1 -1
- package/es/Popover/Popover.mjs +1 -1
- package/es/Popover/Popover.mjs.map +1 -1
- package/es/Popover/PopoverGroup.mjs +1 -1
- package/es/Popover/PopoverGroup.mjs.map +1 -1
- package/es/Popover/PopoverInGroup.mjs +1 -1
- package/es/Popover/PopoverInGroup.mjs.map +1 -1
- package/es/Popover/PopoverStandalone.mjs +1 -1
- package/es/Popover/PopoverStandalone.mjs.map +1 -1
- package/es/Popover/atoms.d.mts +15 -6
- package/es/Popover/atoms.mjs +5 -5
- package/es/Popover/atoms.mjs.map +1 -1
- package/es/Popover/context.d.mts +2 -2
- package/es/Popover/index.d.mts +1 -1
- package/es/Popover/index.mjs +1 -1
- package/es/Popover/style.mjs +2 -2
- package/es/Popover/style.mjs.map +1 -1
- package/es/Popover/type.d.mts +7 -5
- package/es/SearchBar/SearchBar.d.mts +2 -2
- package/es/Segmented/Segmented.d.mts +2 -2
- package/es/Select/Select.d.mts +2 -2
- package/es/SideNav/SideNav.d.mts +2 -2
- package/es/SliderWithInput/SliderWithInput.d.mts +2 -2
- package/es/SortableList/components/DragHandle.d.mts +2 -2
- package/es/SortableList/components/SortableItem.d.mts +2 -2
- package/es/ThemeProvider/ThemeProvider.d.mts +2 -2
- package/es/Toast/imperative.d.mts +3 -3
- package/es/Toast/style.mjs +6 -3
- package/es/Toast/style.mjs.map +1 -1
- package/es/Toc/Toc.d.mts +2 -2
- package/es/Tooltip/type.d.mts +3 -3
- package/es/Video/index.d.mts +2 -2
- package/es/awesome/AuroraBackground/AuroraBackground.d.mts +2 -2
- package/es/awesome/BottomGradientButton/BottomGradientButton.d.mts +2 -2
- package/es/awesome/Features/Features.d.mts +2 -2
- package/es/awesome/Giscus/Giscus.d.mts +2 -2
- package/es/awesome/GradientButton/GradientButton.d.mts +2 -2
- package/es/awesome/GridBackground/GridBackground.d.mts +2 -2
- package/es/awesome/GridBackground/GridShowcase.d.mts +2 -2
- package/es/awesome/Spline/Spine.d.mts +2 -2
- package/es/awesome/Spotlight/Spotlight.d.mts +2 -2
- package/es/awesome/SpotlightCard/SpotlightCard.d.mts +2 -2
- package/es/awesome/TypewriterEffect/TypewriterEffect.d.mts +2 -2
- package/es/brand/LobeChat/index.d.mts +2 -2
- package/es/brand/LobeHub/index.d.mts +2 -2
- package/es/brand/LogoThree/LogoSpline.d.mts +2 -2
- package/es/brand/LogoThree/index.d.mts +2 -2
- package/es/chat/BackBottom/BackBottom.d.mts +2 -2
- package/es/chat/ChatInputArea/components/ChatInputAreaInner.d.mts +2 -2
- package/es/chat/ChatItem/ChatItem.d.mts +2 -2
- package/es/chat/ChatList/ChatList.d.mts +2 -2
- package/es/chat/EditableMessage/EditableMessage.d.mts +2 -2
- package/es/chat/EditableMessageList/EditableMessageList.d.mts +2 -2
- package/es/chat/MessageInput/MessageInput.d.mts +2 -2
- package/es/chat/MessageModal/MessageModal.d.mts +2 -2
- package/es/color/ColorScales/index.d.mts +2 -2
- package/es/color/CssVar/index.d.mts +2 -2
- package/es/i18n/context.d.mts +2 -2
- package/es/icons/lucideExtra/BotPromptIcon.d.mts +2 -2
- package/es/icons/lucideExtra/DiscordIcon.d.mts +3 -3
- package/es/icons/lucideExtra/GlobeOffIcon.d.mts +3 -3
- package/es/icons/lucideExtra/GroupBotIcon.d.mts +3 -3
- package/es/icons/lucideExtra/GroupBotSquareIcon.d.mts +3 -3
- package/es/icons/lucideExtra/LeftDoubleClickIcon.d.mts +3 -3
- package/es/icons/lucideExtra/McpIcon.d.mts +3 -3
- package/es/icons/lucideExtra/ProviderIcon.d.mts +3 -3
- package/es/icons/lucideExtra/RightClickIcon.d.mts +3 -3
- package/es/icons/lucideExtra/RightDoubleClickIcon.d.mts +3 -3
- package/es/icons/lucideExtra/ShapesUploadIcon.d.mts +3 -3
- package/es/icons/lucideExtra/TreeDownRightIcon.d.mts +3 -3
- package/es/icons/lucideExtra/TreeUpDownRightIcon.d.mts +3 -3
- package/es/index.d.mts +7 -1
- package/es/index.mjs +4 -1
- package/es/mdx/Mdx/index.d.mts +2 -2
- package/es/mobile/ChatHeader/ChatHeaderTitle.d.mts +2 -2
- package/es/mobile/ChatInputArea/components/ChatSendButton.d.mts +2 -2
- package/es/mobile/TabBar/TabBar.d.mts +2 -2
- package/es/storybook/StoryBook/index.d.mts +2 -2
- package/es/types/index.d.mts +2 -1
- package/es/types/trigger.d.mts +8 -0
- package/es/utils/parseTrigger.d.mts +14 -0
- package/es/{Popover → utils}/parseTrigger.mjs +1 -1
- package/es/utils/parseTrigger.mjs.map +1 -0
- package/package.json +3 -2
- package/es/Popover/parseTrigger.d.mts +0 -14
- package/es/Popover/parseTrigger.mjs.map +0 -1
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import Icon_default from "../Icon/Icon.mjs";
|
|
4
|
+
import { styles } from "../Menu/sharedStyle.mjs";
|
|
5
|
+
import { usePortalContainer } from "../hooks/usePortalContainer.mjs";
|
|
6
|
+
import { LOBE_SELECT_CONTAINER_ATTR } from "./constants.mjs";
|
|
7
|
+
import { styles as styles$1, triggerVariants } from "./style.mjs";
|
|
8
|
+
import { isValidElement, memo, useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
9
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
10
|
+
import { cx, useThemeMode } from "antd-style";
|
|
11
|
+
import { Check, ChevronDown, Loader2, X } from "lucide-react";
|
|
12
|
+
import { Select } from "@base-ui/react/select";
|
|
13
|
+
import { Virtualizer } from "virtua";
|
|
14
|
+
|
|
15
|
+
//#region src/LobeSelect/LobeSelect.tsx
|
|
16
|
+
const isGroupOption = (option) => Boolean(option.options);
|
|
17
|
+
const getOptionSearchText = (option) => {
|
|
18
|
+
if (typeof option.label === "string" || typeof option.label === "number") return String(option.label);
|
|
19
|
+
if (typeof option.value === "string" || typeof option.value === "number") return String(option.value);
|
|
20
|
+
if (option.title) return option.title;
|
|
21
|
+
return "";
|
|
22
|
+
};
|
|
23
|
+
const escapeRegExp = (value) => value.replaceAll(/[$()*+.?[\\\]^{|}]/g, "\\$&");
|
|
24
|
+
const splitBySeparators = (value, separators) => {
|
|
25
|
+
if (!separators || separators.length === 0) return [value];
|
|
26
|
+
const pattern = separators.map(escapeRegExp).join("|");
|
|
27
|
+
return value.split(new RegExp(pattern, "g"));
|
|
28
|
+
};
|
|
29
|
+
const countVirtualItems = (items) => items.reduce((count, item) => {
|
|
30
|
+
if (isGroupOption(item)) return count + item.options.length + 1;
|
|
31
|
+
return count + 1;
|
|
32
|
+
}, 0);
|
|
33
|
+
const isValueEmpty = (value) => value === null || value === void 0 || value === "";
|
|
34
|
+
const LobeSelect = memo(({ allowClear, autoFocus, className, classNames, defaultOpen, defaultValue, disabled, id, listItemHeight, labelRender, loading, mode, name, onChange, onOpenChange, onSelect, open, optionRender, options, placeholder, popupClassName, popupMatchSelectWidth, prefix, readOnly, required, shadow, showSearch, size = "middle", style, suffixIcon, suffixIconProps, tokenSeparators, value, variant, virtual }) => {
|
|
35
|
+
const { isDarkMode } = useThemeMode();
|
|
36
|
+
const resolvedVariant = variant ?? (isDarkMode ? "filled" : "outlined");
|
|
37
|
+
const isMultiple = mode === "multiple" || mode === "tags";
|
|
38
|
+
const [uncontrolledValue, setUncontrolledValue] = useState(() => {
|
|
39
|
+
if (defaultValue !== void 0) return defaultValue;
|
|
40
|
+
return isMultiple ? [] : null;
|
|
41
|
+
});
|
|
42
|
+
const normalizeValue = useCallback((nextValue) => {
|
|
43
|
+
if (isMultiple) {
|
|
44
|
+
if (Array.isArray(nextValue)) return nextValue;
|
|
45
|
+
if (nextValue === null || nextValue === void 0) return [];
|
|
46
|
+
return [nextValue];
|
|
47
|
+
}
|
|
48
|
+
if (Array.isArray(nextValue)) return nextValue[0] ?? null;
|
|
49
|
+
return nextValue === void 0 ? null : nextValue;
|
|
50
|
+
}, [isMultiple]);
|
|
51
|
+
const mergedValue = value !== void 0 ? value : uncontrolledValue;
|
|
52
|
+
const normalizedValue = useMemo(() => normalizeValue(mergedValue), [mergedValue, normalizeValue]);
|
|
53
|
+
const valueArray = useMemo(() => isMultiple ? normalizedValue : isValueEmpty(normalizedValue) ? [] : [normalizedValue], [isMultiple, normalizedValue]);
|
|
54
|
+
const [extraOptions, setExtraOptions] = useState([]);
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
if (mode !== "tags" && extraOptions.length > 0) setExtraOptions([]);
|
|
57
|
+
}, [mode, extraOptions.length]);
|
|
58
|
+
const { resolvedOptions, optionMap } = useMemo(() => {
|
|
59
|
+
const baseOptions = options ?? [];
|
|
60
|
+
const optionValueMap = /* @__PURE__ */ new Map();
|
|
61
|
+
const addOption = (item) => {
|
|
62
|
+
if (!optionValueMap.has(item.value)) optionValueMap.set(item.value, item);
|
|
63
|
+
};
|
|
64
|
+
const walkOptions = (items) => {
|
|
65
|
+
items.forEach((item) => {
|
|
66
|
+
if (isGroupOption(item)) item.options.forEach(addOption);
|
|
67
|
+
else addOption(item);
|
|
68
|
+
});
|
|
69
|
+
};
|
|
70
|
+
walkOptions(baseOptions);
|
|
71
|
+
const filteredExtraOptions = extraOptions.filter((item) => !optionValueMap.has(item.value));
|
|
72
|
+
filteredExtraOptions.forEach(addOption);
|
|
73
|
+
const mergedOptions = [...baseOptions, ...filteredExtraOptions];
|
|
74
|
+
const missingValueOptions = valueArray.filter((val) => !optionValueMap.has(val)).map((val) => ({
|
|
75
|
+
label: String(val),
|
|
76
|
+
value: val
|
|
77
|
+
}));
|
|
78
|
+
missingValueOptions.forEach(addOption);
|
|
79
|
+
return {
|
|
80
|
+
optionMap: optionValueMap,
|
|
81
|
+
resolvedOptions: missingValueOptions.length ? [...mergedOptions, ...missingValueOptions] : mergedOptions
|
|
82
|
+
};
|
|
83
|
+
}, [
|
|
84
|
+
extraOptions,
|
|
85
|
+
options,
|
|
86
|
+
valueArray
|
|
87
|
+
]);
|
|
88
|
+
const [uncontrolledOpen, setUncontrolledOpen] = useState(Boolean(defaultOpen));
|
|
89
|
+
useEffect(() => {
|
|
90
|
+
if (open !== void 0) setUncontrolledOpen(open);
|
|
91
|
+
}, [open]);
|
|
92
|
+
const mergedOpen = open ?? uncontrolledOpen;
|
|
93
|
+
const handleOpenChange = useCallback((nextOpen) => {
|
|
94
|
+
onOpenChange?.(nextOpen);
|
|
95
|
+
if (open === void 0) setUncontrolledOpen(nextOpen);
|
|
96
|
+
}, [onOpenChange, open]);
|
|
97
|
+
const [searchValue, setSearchValue] = useState("");
|
|
98
|
+
const shouldShowSearch = Boolean(showSearch || mode === "tags");
|
|
99
|
+
useEffect(() => {
|
|
100
|
+
if (!mergedOpen) setSearchValue("");
|
|
101
|
+
}, [mergedOpen]);
|
|
102
|
+
const getOption = useCallback((optionValue) => {
|
|
103
|
+
const matched = optionMap.get(optionValue);
|
|
104
|
+
if (matched) return matched;
|
|
105
|
+
if (optionValue && typeof optionValue === "object" && "label" in optionValue) return {
|
|
106
|
+
label: optionValue.label,
|
|
107
|
+
value: optionValue
|
|
108
|
+
};
|
|
109
|
+
return {
|
|
110
|
+
label: String(optionValue),
|
|
111
|
+
value: optionValue
|
|
112
|
+
};
|
|
113
|
+
}, [optionMap]);
|
|
114
|
+
const previousValueRef = useRef(normalizedValue);
|
|
115
|
+
useEffect(() => {
|
|
116
|
+
previousValueRef.current = normalizedValue;
|
|
117
|
+
}, [normalizedValue]);
|
|
118
|
+
const handleValueChange = useCallback((nextValue) => {
|
|
119
|
+
const normalizedNextValue = normalizeValue(nextValue);
|
|
120
|
+
const previousValue = previousValueRef.current;
|
|
121
|
+
if (isMultiple) {
|
|
122
|
+
const prevValues = Array.isArray(previousValue) ? previousValue : [];
|
|
123
|
+
const nextValues = Array.isArray(normalizedNextValue) ? normalizedNextValue : [];
|
|
124
|
+
nextValues.filter((val) => !prevValues.some((prev) => Object.is(prev, val))).forEach((val) => {
|
|
125
|
+
onSelect?.(val, getOption(val));
|
|
126
|
+
});
|
|
127
|
+
if (value === void 0) setUncontrolledValue(nextValues);
|
|
128
|
+
onChange?.(nextValues, nextValues.map((val) => getOption(val)));
|
|
129
|
+
} else {
|
|
130
|
+
if (!isValueEmpty(normalizedNextValue) && !Object.is(previousValue, normalizedNextValue)) onSelect?.(normalizedNextValue, getOption(normalizedNextValue));
|
|
131
|
+
if (value === void 0) setUncontrolledValue(normalizedNextValue);
|
|
132
|
+
onChange?.(normalizedNextValue, isValueEmpty(normalizedNextValue) ? void 0 : getOption(normalizedNextValue));
|
|
133
|
+
}
|
|
134
|
+
previousValueRef.current = normalizedNextValue;
|
|
135
|
+
}, [
|
|
136
|
+
getOption,
|
|
137
|
+
isMultiple,
|
|
138
|
+
normalizeValue,
|
|
139
|
+
onChange,
|
|
140
|
+
onSelect,
|
|
141
|
+
value
|
|
142
|
+
]);
|
|
143
|
+
const appendTagValues = useCallback((rawValues) => {
|
|
144
|
+
const valuesToAdd = rawValues.map((val) => val.trim()).filter(Boolean);
|
|
145
|
+
if (!valuesToAdd.length) return;
|
|
146
|
+
const nextValues = [...valueArray];
|
|
147
|
+
const newOptionValues = valuesToAdd.filter((val) => !optionMap.has(val));
|
|
148
|
+
if (newOptionValues.length > 0) setExtraOptions((prev) => {
|
|
149
|
+
const existingValues = new Set(prev.map((item) => item.value));
|
|
150
|
+
const merged = [...prev];
|
|
151
|
+
newOptionValues.forEach((val) => {
|
|
152
|
+
if (!existingValues.has(val)) merged.push({
|
|
153
|
+
label: val,
|
|
154
|
+
value: val
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
return merged;
|
|
158
|
+
});
|
|
159
|
+
valuesToAdd.forEach((val) => {
|
|
160
|
+
if (!nextValues.some((item) => Object.is(item, val))) nextValues.push(val);
|
|
161
|
+
});
|
|
162
|
+
if (nextValues.length !== valueArray.length) handleValueChange(nextValues);
|
|
163
|
+
}, [
|
|
164
|
+
handleValueChange,
|
|
165
|
+
optionMap,
|
|
166
|
+
valueArray
|
|
167
|
+
]);
|
|
168
|
+
const handleSearchChange = useCallback((event) => {
|
|
169
|
+
const nextValue = event.target.value;
|
|
170
|
+
if (mode === "tags") {
|
|
171
|
+
const parts = splitBySeparators(nextValue, tokenSeparators);
|
|
172
|
+
if (parts.length > 1) {
|
|
173
|
+
const pending = parts.pop() ?? "";
|
|
174
|
+
appendTagValues(parts.filter(Boolean));
|
|
175
|
+
setSearchValue(pending);
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
setSearchValue(nextValue);
|
|
180
|
+
}, [
|
|
181
|
+
appendTagValues,
|
|
182
|
+
mode,
|
|
183
|
+
tokenSeparators
|
|
184
|
+
]);
|
|
185
|
+
const handleSearchKeyDown = useCallback((event) => {
|
|
186
|
+
event.stopPropagation();
|
|
187
|
+
if (event.key === "Escape") {
|
|
188
|
+
handleOpenChange(false);
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
if (mode !== "tags") return;
|
|
192
|
+
if (event.key === "Enter") {
|
|
193
|
+
event.preventDefault();
|
|
194
|
+
event.stopPropagation();
|
|
195
|
+
appendTagValues([searchValue]);
|
|
196
|
+
setSearchValue("");
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
if (tokenSeparators?.includes(event.key)) {
|
|
200
|
+
event.preventDefault();
|
|
201
|
+
event.stopPropagation();
|
|
202
|
+
appendTagValues([searchValue]);
|
|
203
|
+
setSearchValue("");
|
|
204
|
+
}
|
|
205
|
+
}, [
|
|
206
|
+
appendTagValues,
|
|
207
|
+
handleOpenChange,
|
|
208
|
+
mode,
|
|
209
|
+
searchValue,
|
|
210
|
+
tokenSeparators
|
|
211
|
+
]);
|
|
212
|
+
const filteredOptions = useMemo(() => {
|
|
213
|
+
if (!shouldShowSearch || !searchValue.trim()) return resolvedOptions;
|
|
214
|
+
const query = searchValue.trim().toLowerCase();
|
|
215
|
+
const filterItems = (items) => {
|
|
216
|
+
return items.map((item) => {
|
|
217
|
+
if (isGroupOption(item)) {
|
|
218
|
+
const groupItems = item.options.filter((option) => getOptionSearchText(option).toLowerCase().includes(query));
|
|
219
|
+
if (!groupItems.length) return null;
|
|
220
|
+
return {
|
|
221
|
+
...item,
|
|
222
|
+
options: groupItems
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
return getOptionSearchText(item).toLowerCase().includes(query) ? item : null;
|
|
226
|
+
}).filter(Boolean);
|
|
227
|
+
};
|
|
228
|
+
return filterItems(resolvedOptions);
|
|
229
|
+
}, [
|
|
230
|
+
resolvedOptions,
|
|
231
|
+
searchValue,
|
|
232
|
+
shouldShowSearch
|
|
233
|
+
]);
|
|
234
|
+
const renderValue = useCallback((currentValue) => {
|
|
235
|
+
const resolved = normalizeValue(currentValue);
|
|
236
|
+
const placeholderNode = placeholder === void 0 ? null : /* @__PURE__ */ jsx("span", {
|
|
237
|
+
className: styles$1.valueText,
|
|
238
|
+
children: placeholder
|
|
239
|
+
});
|
|
240
|
+
if (isMultiple) {
|
|
241
|
+
const values = Array.isArray(resolved) ? resolved : [];
|
|
242
|
+
if (values.length === 0) return placeholderNode;
|
|
243
|
+
return /* @__PURE__ */ jsx("span", {
|
|
244
|
+
className: styles$1.tags,
|
|
245
|
+
children: values.map((val, index) => {
|
|
246
|
+
const option$1 = getOption(val);
|
|
247
|
+
const content$1 = labelRender ? labelRender(option$1) : option$1.label ?? String(val);
|
|
248
|
+
return /* @__PURE__ */ jsx("span", {
|
|
249
|
+
className: styles$1.tag,
|
|
250
|
+
children: content$1
|
|
251
|
+
}, `${String(val)}-${index}`);
|
|
252
|
+
})
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
if (isValueEmpty(resolved)) return placeholderNode;
|
|
256
|
+
const option = getOption(resolved);
|
|
257
|
+
const content = labelRender ? labelRender(option) : option.label ?? String(resolved);
|
|
258
|
+
return /* @__PURE__ */ jsx("span", {
|
|
259
|
+
className: styles$1.valueText,
|
|
260
|
+
children: content
|
|
261
|
+
});
|
|
262
|
+
}, [
|
|
263
|
+
getOption,
|
|
264
|
+
isMultiple,
|
|
265
|
+
labelRender,
|
|
266
|
+
normalizeValue,
|
|
267
|
+
placeholder
|
|
268
|
+
]);
|
|
269
|
+
const hasValue = isMultiple ? valueArray.length > 0 : !isValueEmpty(normalizedValue);
|
|
270
|
+
const showClear = Boolean(allowClear && hasValue && !disabled && !readOnly);
|
|
271
|
+
const handleClear = useCallback((event) => {
|
|
272
|
+
event.preventDefault();
|
|
273
|
+
event.stopPropagation();
|
|
274
|
+
handleValueChange(isMultiple ? [] : null);
|
|
275
|
+
}, [handleValueChange, isMultiple]);
|
|
276
|
+
const prefixNode = useMemo(() => {
|
|
277
|
+
if (prefix === void 0 || prefix === null) return null;
|
|
278
|
+
if (isValidElement(prefix) || typeof prefix === "string" || typeof prefix === "number") return prefix;
|
|
279
|
+
return /* @__PURE__ */ jsx(Icon_default, {
|
|
280
|
+
icon: prefix,
|
|
281
|
+
size: "small"
|
|
282
|
+
});
|
|
283
|
+
}, [prefix]);
|
|
284
|
+
const suffixIconNode = useMemo(() => {
|
|
285
|
+
if (loading) return /* @__PURE__ */ jsx(Icon_default, {
|
|
286
|
+
icon: Loader2,
|
|
287
|
+
size: "small",
|
|
288
|
+
spin: true
|
|
289
|
+
});
|
|
290
|
+
if (suffixIcon === null) return null;
|
|
291
|
+
if (isValidElement(suffixIcon) || typeof suffixIcon === "string" || typeof suffixIcon === "number") return suffixIcon;
|
|
292
|
+
return /* @__PURE__ */ jsx(Icon_default, {
|
|
293
|
+
icon: suffixIcon || ChevronDown,
|
|
294
|
+
size: "small",
|
|
295
|
+
...suffixIconProps,
|
|
296
|
+
style: {
|
|
297
|
+
pointerEvents: "none",
|
|
298
|
+
...suffixIconProps?.style
|
|
299
|
+
}
|
|
300
|
+
});
|
|
301
|
+
}, [
|
|
302
|
+
loading,
|
|
303
|
+
suffixIcon,
|
|
304
|
+
suffixIconProps
|
|
305
|
+
]);
|
|
306
|
+
const popupStyle = useMemo(() => {
|
|
307
|
+
const baseStyle = {
|
|
308
|
+
maxWidth: "var(--available-width)",
|
|
309
|
+
minWidth: "var(--anchor-width)"
|
|
310
|
+
};
|
|
311
|
+
if (popupMatchSelectWidth === void 0 || popupMatchSelectWidth === true) return baseStyle;
|
|
312
|
+
if (typeof popupMatchSelectWidth === "number") return {
|
|
313
|
+
...baseStyle,
|
|
314
|
+
minWidth: popupMatchSelectWidth,
|
|
315
|
+
width: popupMatchSelectWidth
|
|
316
|
+
};
|
|
317
|
+
return {
|
|
318
|
+
...baseStyle,
|
|
319
|
+
minWidth: "max-content"
|
|
320
|
+
};
|
|
321
|
+
}, [popupMatchSelectWidth]);
|
|
322
|
+
const triggerClassName = cx(triggerVariants({
|
|
323
|
+
shadow,
|
|
324
|
+
size,
|
|
325
|
+
variant: resolvedVariant
|
|
326
|
+
}), className, classNames?.root, classNames?.trigger);
|
|
327
|
+
const portalContainer = usePortalContainer(LOBE_SELECT_CONTAINER_ATTR);
|
|
328
|
+
const virtualListStyle = useMemo(() => {
|
|
329
|
+
if (!virtual) return void 0;
|
|
330
|
+
const rowCount = countVirtualItems(filteredOptions);
|
|
331
|
+
const maxVisibleRows = 6;
|
|
332
|
+
const estimatedRowHeight = listItemHeight ?? (size === "large" ? 40 : size === "small" ? 28 : 32);
|
|
333
|
+
return { height: `min(${Math.min(Math.max(rowCount, 1), maxVisibleRows) * estimatedRowHeight + 8}px, var(--available-height))` };
|
|
334
|
+
}, [
|
|
335
|
+
filteredOptions,
|
|
336
|
+
listItemHeight,
|
|
337
|
+
size,
|
|
338
|
+
virtual
|
|
339
|
+
]);
|
|
340
|
+
const itemTextClassName = cx(optionRender ? styles.itemContent : styles.label, styles$1.itemText, classNames?.itemText);
|
|
341
|
+
let optionIndex = 0;
|
|
342
|
+
const renderOptions = (items) => items.map((item, index) => {
|
|
343
|
+
if (isGroupOption(item)) return /* @__PURE__ */ jsxs(Select.Group, {
|
|
344
|
+
className: cx(styles$1.group, classNames?.group),
|
|
345
|
+
children: [/* @__PURE__ */ jsx(Select.GroupLabel, {
|
|
346
|
+
className: cx(styles.groupLabel, styles$1.groupLabel, classNames?.groupLabel),
|
|
347
|
+
children: item.label
|
|
348
|
+
}), item.options.map((option) => {
|
|
349
|
+
const currentIndex$1 = optionIndex++;
|
|
350
|
+
return /* @__PURE__ */ jsxs(Select.Item, {
|
|
351
|
+
className: cx(styles.item, styles$1.item, classNames?.item, classNames?.option, option.className),
|
|
352
|
+
disabled: option.disabled,
|
|
353
|
+
label: getOptionSearchText(option),
|
|
354
|
+
style: {
|
|
355
|
+
minHeight: listItemHeight,
|
|
356
|
+
...option.style
|
|
357
|
+
},
|
|
358
|
+
value: option.value,
|
|
359
|
+
children: [/* @__PURE__ */ jsx(Select.ItemText, {
|
|
360
|
+
className: itemTextClassName,
|
|
361
|
+
children: optionRender ? optionRender(option, { index: currentIndex$1 }) : option.label
|
|
362
|
+
}), /* @__PURE__ */ jsx(Select.ItemIndicator, {
|
|
363
|
+
className: cx(styles$1.itemIndicator, classNames?.itemIndicator),
|
|
364
|
+
children: /* @__PURE__ */ jsx(Icon_default, {
|
|
365
|
+
icon: Check,
|
|
366
|
+
size: "small"
|
|
367
|
+
})
|
|
368
|
+
})]
|
|
369
|
+
}, `${String(option.value)}-${currentIndex$1}`);
|
|
370
|
+
})]
|
|
371
|
+
}, `group-${index}`);
|
|
372
|
+
const currentIndex = optionIndex++;
|
|
373
|
+
return /* @__PURE__ */ jsxs(Select.Item, {
|
|
374
|
+
className: cx(styles.item, styles$1.item, classNames?.item, classNames?.option, item.className),
|
|
375
|
+
disabled: item.disabled,
|
|
376
|
+
label: getOptionSearchText(item),
|
|
377
|
+
style: {
|
|
378
|
+
minHeight: listItemHeight,
|
|
379
|
+
...item.style
|
|
380
|
+
},
|
|
381
|
+
value: item.value,
|
|
382
|
+
children: [/* @__PURE__ */ jsx(Select.ItemText, {
|
|
383
|
+
className: itemTextClassName,
|
|
384
|
+
children: optionRender ? optionRender(item, { index: currentIndex }) : item.label
|
|
385
|
+
}), /* @__PURE__ */ jsx(Select.ItemIndicator, {
|
|
386
|
+
className: cx(styles$1.itemIndicator, classNames?.itemIndicator),
|
|
387
|
+
children: /* @__PURE__ */ jsx(Icon_default, {
|
|
388
|
+
icon: Check,
|
|
389
|
+
size: "small"
|
|
390
|
+
})
|
|
391
|
+
})]
|
|
392
|
+
}, `${String(item.value)}-${currentIndex}`);
|
|
393
|
+
});
|
|
394
|
+
return /* @__PURE__ */ jsxs(Select.Root, {
|
|
395
|
+
disabled,
|
|
396
|
+
id,
|
|
397
|
+
modal: false,
|
|
398
|
+
multiple: isMultiple,
|
|
399
|
+
name,
|
|
400
|
+
onOpenChange: handleOpenChange,
|
|
401
|
+
onValueChange: handleValueChange,
|
|
402
|
+
open: mergedOpen,
|
|
403
|
+
readOnly,
|
|
404
|
+
required,
|
|
405
|
+
value: normalizedValue,
|
|
406
|
+
children: [/* @__PURE__ */ jsxs(Select.Trigger, {
|
|
407
|
+
autoFocus,
|
|
408
|
+
className: triggerClassName,
|
|
409
|
+
disabled,
|
|
410
|
+
style,
|
|
411
|
+
children: [
|
|
412
|
+
prefixNode !== null && prefixNode !== void 0 && /* @__PURE__ */ jsx("span", {
|
|
413
|
+
className: cx(styles$1.prefix, classNames?.prefix),
|
|
414
|
+
children: prefixNode
|
|
415
|
+
}),
|
|
416
|
+
/* @__PURE__ */ jsx(Select.Value, {
|
|
417
|
+
className: cx(styles$1.value, classNames?.value),
|
|
418
|
+
children: renderValue
|
|
419
|
+
}),
|
|
420
|
+
/* @__PURE__ */ jsxs("span", {
|
|
421
|
+
className: cx(styles$1.suffix, classNames?.suffix),
|
|
422
|
+
children: [showClear && /* @__PURE__ */ jsx("span", {
|
|
423
|
+
className: cx(styles$1.clear, classNames?.clear),
|
|
424
|
+
"data-role": "lobe-select-clear",
|
|
425
|
+
onClick: handleClear,
|
|
426
|
+
children: /* @__PURE__ */ jsx(Icon_default, {
|
|
427
|
+
icon: X,
|
|
428
|
+
size: "small"
|
|
429
|
+
})
|
|
430
|
+
}), suffixIconNode !== null && suffixIconNode !== void 0 && /* @__PURE__ */ jsx(Select.Icon, {
|
|
431
|
+
className: cx(styles$1.icon, classNames?.icon),
|
|
432
|
+
children: suffixIconNode
|
|
433
|
+
})]
|
|
434
|
+
})
|
|
435
|
+
]
|
|
436
|
+
}), /* @__PURE__ */ jsx(Select.Portal, {
|
|
437
|
+
container: portalContainer,
|
|
438
|
+
children: /* @__PURE__ */ jsx(Select.Positioner, {
|
|
439
|
+
align: "start",
|
|
440
|
+
alignItemWithTrigger: false,
|
|
441
|
+
className: styles$1.positioner,
|
|
442
|
+
side: "bottom",
|
|
443
|
+
sideOffset: 6,
|
|
444
|
+
children: /* @__PURE__ */ jsxs(Select.Popup, {
|
|
445
|
+
className: cx(styles.popup, styles$1.popup, popupClassName, classNames?.popup, classNames?.dropdown),
|
|
446
|
+
style: popupStyle,
|
|
447
|
+
children: [shouldShowSearch && /* @__PURE__ */ jsx("div", {
|
|
448
|
+
className: cx(styles$1.search, classNames?.search),
|
|
449
|
+
children: /* @__PURE__ */ jsx("input", {
|
|
450
|
+
className: styles$1.searchInput,
|
|
451
|
+
onChange: handleSearchChange,
|
|
452
|
+
onKeyDown: handleSearchKeyDown,
|
|
453
|
+
placeholder: typeof placeholder === "string" ? placeholder : void 0,
|
|
454
|
+
value: searchValue
|
|
455
|
+
})
|
|
456
|
+
}), (() => {
|
|
457
|
+
const content = filteredOptions.length > 0 ? renderOptions(filteredOptions) : /* @__PURE__ */ jsx("div", {
|
|
458
|
+
className: cx(styles.item, styles.empty, styles$1.empty, classNames?.empty),
|
|
459
|
+
children: "No data"
|
|
460
|
+
});
|
|
461
|
+
if (!virtual || filteredOptions.length === 0) return /* @__PURE__ */ jsx(Select.List, {
|
|
462
|
+
className: cx(styles$1.list, classNames?.list),
|
|
463
|
+
"data-virtual": virtual || void 0,
|
|
464
|
+
children: content
|
|
465
|
+
});
|
|
466
|
+
return /* @__PURE__ */ jsx(Select.List, {
|
|
467
|
+
className: cx(styles$1.list, classNames?.list),
|
|
468
|
+
"data-virtual": virtual || void 0,
|
|
469
|
+
style: virtualListStyle,
|
|
470
|
+
children: /* @__PURE__ */ jsx(Virtualizer, {
|
|
471
|
+
itemSize: listItemHeight,
|
|
472
|
+
children: content
|
|
473
|
+
})
|
|
474
|
+
});
|
|
475
|
+
})()]
|
|
476
|
+
})
|
|
477
|
+
})
|
|
478
|
+
})]
|
|
479
|
+
});
|
|
480
|
+
});
|
|
481
|
+
LobeSelect.displayName = "LobeSelect";
|
|
482
|
+
var LobeSelect_default = LobeSelect;
|
|
483
|
+
|
|
484
|
+
//#endregion
|
|
485
|
+
export { LobeSelect_default as default };
|
|
486
|
+
//# sourceMappingURL=LobeSelect.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LobeSelect.mjs","names":["mergedOptions: LobeSelectOptions","missingValueOptions: LobeSelectOption<any>[]","styles","option","content","Icon","baseStyle: React.CSSProperties","menuStyles","currentIndex"],"sources":["../../src/LobeSelect/LobeSelect.tsx"],"sourcesContent":["'use client';\n\nimport { Select } from '@base-ui/react/select';\nimport { cx, useThemeMode } from 'antd-style';\nimport { Check, ChevronDown, Loader2, X } from 'lucide-react';\nimport type { ChangeEvent, KeyboardEvent, MouseEvent } from 'react';\nimport { isValidElement, memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Virtualizer } from 'virtua';\n\nimport Icon from '@/Icon';\nimport { styles as menuStyles } from '@/Menu/sharedStyle';\nimport { usePortalContainer } from '@/hooks/usePortalContainer';\n\nimport { LOBE_SELECT_CONTAINER_ATTR } from './constants';\nimport { styles, triggerVariants } from './style';\nimport type {\n LobeSelectOption,\n LobeSelectOptionGroup,\n LobeSelectOptions,\n LobeSelectProps,\n} from './type';\n\nconst isGroupOption = <Value,>(\n option: LobeSelectOption<Value> | LobeSelectOptionGroup<Value>,\n): option is LobeSelectOptionGroup<Value> =>\n Boolean((option as LobeSelectOptionGroup<Value>).options);\n\nconst getOptionSearchText = <Value,>(option: LobeSelectOption<Value>) => {\n if (typeof option.label === 'string' || typeof option.label === 'number') {\n return String(option.label);\n }\n if (typeof option.value === 'string' || typeof option.value === 'number') {\n return String(option.value);\n }\n if (option.title) return option.title;\n return '';\n};\n\nconst escapeRegExp = (value: string) => value.replaceAll(/[$()*+.?[\\\\\\]^{|}]/g, '\\\\$&');\n\nconst splitBySeparators = (value: string, separators?: string[]) => {\n if (!separators || separators.length === 0) return [value];\n const pattern = separators.map(escapeRegExp).join('|');\n return value.split(new RegExp(pattern, 'g'));\n};\n\nconst countVirtualItems = (items: LobeSelectOptions) =>\n items.reduce((count, item) => {\n if (isGroupOption(item)) {\n return count + item.options.length + 1;\n }\n return count + 1;\n }, 0);\n\nconst isValueEmpty = (value: unknown) => value === null || value === undefined || value === '';\n\nconst LobeSelect = memo<LobeSelectProps<any>>(\n ({\n allowClear,\n autoFocus,\n className,\n classNames,\n defaultOpen,\n defaultValue,\n disabled,\n id,\n listItemHeight,\n labelRender,\n loading,\n mode,\n name,\n onChange,\n onOpenChange,\n onSelect,\n open,\n optionRender,\n options,\n placeholder,\n popupClassName,\n popupMatchSelectWidth,\n prefix,\n readOnly,\n required,\n shadow,\n showSearch,\n size = 'middle',\n style,\n suffixIcon,\n suffixIconProps,\n tokenSeparators,\n value,\n variant,\n virtual,\n }) => {\n const { isDarkMode } = useThemeMode();\n const resolvedVariant = variant ?? (isDarkMode ? 'filled' : 'outlined');\n const isMultiple = mode === 'multiple' || mode === 'tags';\n\n const [uncontrolledValue, setUncontrolledValue] = useState<any>(() => {\n if (defaultValue !== undefined) return defaultValue;\n return isMultiple ? [] : null;\n });\n\n const normalizeValue = useCallback(\n (nextValue: any) => {\n if (isMultiple) {\n if (Array.isArray(nextValue)) return nextValue;\n if (nextValue === null || nextValue === undefined) return [];\n return [nextValue];\n }\n if (Array.isArray(nextValue)) return nextValue[0] ?? null;\n return nextValue === undefined ? null : nextValue;\n },\n [isMultiple],\n );\n\n const mergedValue = value !== undefined ? value : uncontrolledValue;\n const normalizedValue = useMemo(\n () => normalizeValue(mergedValue),\n [mergedValue, normalizeValue],\n );\n const valueArray = useMemo(\n () =>\n isMultiple\n ? (normalizedValue as any[])\n : isValueEmpty(normalizedValue)\n ? []\n : [normalizedValue],\n [isMultiple, normalizedValue],\n );\n\n const [extraOptions, setExtraOptions] = useState<LobeSelectOption<any>[]>([]);\n\n useEffect(() => {\n if (mode !== 'tags' && extraOptions.length > 0) {\n setExtraOptions([]);\n }\n }, [mode, extraOptions.length]);\n\n const { resolvedOptions, optionMap } = useMemo(() => {\n const baseOptions = options ?? [];\n const optionValueMap = new Map<any, LobeSelectOption<any>>();\n\n const addOption = (item: LobeSelectOption<any>) => {\n if (!optionValueMap.has(item.value)) {\n optionValueMap.set(item.value, item);\n }\n };\n\n const walkOptions = (items: LobeSelectOptions) => {\n items.forEach((item) => {\n if (isGroupOption(item)) {\n item.options.forEach(addOption);\n } else {\n addOption(item);\n }\n });\n };\n\n walkOptions(baseOptions);\n\n const filteredExtraOptions = extraOptions.filter((item) => !optionValueMap.has(item.value));\n filteredExtraOptions.forEach(addOption);\n\n const mergedOptions: LobeSelectOptions = [...baseOptions, ...filteredExtraOptions];\n\n const missingValueOptions: LobeSelectOption<any>[] = valueArray\n .filter((val) => !optionValueMap.has(val))\n .map((val) => ({\n label: String(val),\n value: val,\n }));\n missingValueOptions.forEach(addOption);\n\n return {\n optionMap: optionValueMap,\n resolvedOptions: missingValueOptions.length\n ? [...mergedOptions, ...missingValueOptions]\n : mergedOptions,\n };\n }, [extraOptions, options, valueArray]);\n\n const [uncontrolledOpen, setUncontrolledOpen] = useState(Boolean(defaultOpen));\n\n useEffect(() => {\n if (open !== undefined) {\n setUncontrolledOpen(open);\n }\n }, [open]);\n\n const mergedOpen = open ?? uncontrolledOpen;\n\n const handleOpenChange = useCallback(\n (nextOpen: boolean) => {\n onOpenChange?.(nextOpen);\n if (open === undefined) {\n setUncontrolledOpen(nextOpen);\n }\n },\n [onOpenChange, open],\n );\n\n const [searchValue, setSearchValue] = useState('');\n const shouldShowSearch = Boolean(showSearch || mode === 'tags');\n\n useEffect(() => {\n if (!mergedOpen) setSearchValue('');\n }, [mergedOpen]);\n\n const getOption = useCallback(\n (optionValue: any): LobeSelectOption<any> => {\n const matched = optionMap.get(optionValue);\n if (matched) return matched;\n if (optionValue && typeof optionValue === 'object' && 'label' in optionValue) {\n return {\n label: (optionValue as any).label,\n value: optionValue,\n };\n }\n return {\n label: String(optionValue),\n value: optionValue,\n };\n },\n [optionMap],\n );\n\n const previousValueRef = useRef<any>(normalizedValue);\n\n useEffect(() => {\n previousValueRef.current = normalizedValue;\n }, [normalizedValue]);\n\n const handleValueChange = useCallback(\n (nextValue: any) => {\n const normalizedNextValue = normalizeValue(nextValue);\n const previousValue = previousValueRef.current;\n\n if (isMultiple) {\n const prevValues = Array.isArray(previousValue) ? previousValue : [];\n const nextValues = Array.isArray(normalizedNextValue) ? normalizedNextValue : [];\n const addedValues = nextValues.filter(\n (val) => !prevValues.some((prev) => Object.is(prev, val)),\n );\n\n addedValues.forEach((val) => {\n onSelect?.(val, getOption(val));\n });\n\n if (value === undefined) {\n setUncontrolledValue(nextValues);\n }\n onChange?.(\n nextValues,\n nextValues.map((val) => getOption(val)),\n );\n } else {\n if (\n !isValueEmpty(normalizedNextValue) &&\n !Object.is(previousValue, normalizedNextValue)\n ) {\n onSelect?.(normalizedNextValue, getOption(normalizedNextValue));\n }\n if (value === undefined) {\n setUncontrolledValue(normalizedNextValue);\n }\n onChange?.(\n normalizedNextValue,\n isValueEmpty(normalizedNextValue) ? undefined : getOption(normalizedNextValue),\n );\n }\n\n previousValueRef.current = normalizedNextValue;\n },\n [getOption, isMultiple, normalizeValue, onChange, onSelect, value],\n );\n\n const appendTagValues = useCallback(\n (rawValues: string[]) => {\n const valuesToAdd = rawValues.map((val) => val.trim()).filter(Boolean);\n if (!valuesToAdd.length) return;\n\n const nextValues = [...valueArray];\n const newOptionValues = valuesToAdd.filter((val) => !optionMap.has(val));\n\n if (newOptionValues.length > 0) {\n setExtraOptions((prev) => {\n const existingValues = new Set(prev.map((item) => item.value));\n const merged = [...prev];\n newOptionValues.forEach((val) => {\n if (!existingValues.has(val)) {\n merged.push({ label: val, value: val });\n }\n });\n return merged;\n });\n }\n\n valuesToAdd.forEach((val) => {\n if (!nextValues.some((item) => Object.is(item, val))) {\n nextValues.push(val);\n }\n });\n\n if (nextValues.length !== valueArray.length) {\n handleValueChange(nextValues);\n }\n },\n [handleValueChange, optionMap, valueArray],\n );\n\n const handleSearchChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const nextValue = event.target.value;\n if (mode === 'tags') {\n const parts = splitBySeparators(nextValue, tokenSeparators);\n if (parts.length > 1) {\n const pending = parts.pop() ?? '';\n appendTagValues(parts.filter(Boolean));\n setSearchValue(pending);\n return;\n }\n }\n setSearchValue(nextValue);\n },\n [appendTagValues, mode, tokenSeparators],\n );\n\n const handleSearchKeyDown = useCallback(\n (event: KeyboardEvent<HTMLInputElement>) => {\n event.stopPropagation();\n\n if (event.key === 'Escape') {\n handleOpenChange(false);\n return;\n }\n\n if (mode !== 'tags') return;\n\n if (event.key === 'Enter') {\n event.preventDefault();\n event.stopPropagation();\n appendTagValues([searchValue]);\n setSearchValue('');\n return;\n }\n\n if (tokenSeparators?.includes(event.key)) {\n event.preventDefault();\n event.stopPropagation();\n appendTagValues([searchValue]);\n setSearchValue('');\n }\n },\n [appendTagValues, handleOpenChange, mode, searchValue, tokenSeparators],\n );\n\n const filteredOptions = useMemo(() => {\n if (!shouldShowSearch || !searchValue.trim()) return resolvedOptions;\n const query = searchValue.trim().toLowerCase();\n\n const filterItems = (items: LobeSelectOptions): LobeSelectOptions => {\n const filtered = items\n .map((item) => {\n if (isGroupOption(item)) {\n const groupItems = item.options.filter((option) =>\n getOptionSearchText(option).toLowerCase().includes(query),\n );\n if (!groupItems.length) return null;\n return { ...item, options: groupItems };\n }\n return getOptionSearchText(item).toLowerCase().includes(query) ? item : null;\n })\n .filter(Boolean) as LobeSelectOptions;\n\n return filtered;\n };\n\n return filterItems(resolvedOptions);\n }, [resolvedOptions, searchValue, shouldShowSearch]);\n\n const renderValue = useCallback(\n (currentValue: any) => {\n const resolved = normalizeValue(currentValue);\n const placeholderNode =\n placeholder === undefined ? null : (\n <span className={styles.valueText}>{placeholder}</span>\n );\n\n if (isMultiple) {\n const values = Array.isArray(resolved) ? resolved : [];\n if (values.length === 0) return placeholderNode;\n return (\n <span className={styles.tags}>\n {values.map((val, index) => {\n const option = getOption(val);\n const content = labelRender ? labelRender(option) : (option.label ?? String(val));\n return (\n <span className={styles.tag} key={`${String(val)}-${index}`}>\n {content}\n </span>\n );\n })}\n </span>\n );\n }\n\n if (isValueEmpty(resolved)) return placeholderNode;\n const option = getOption(resolved);\n const content = labelRender ? labelRender(option) : (option.label ?? String(resolved));\n return <span className={styles.valueText}>{content}</span>;\n },\n [getOption, isMultiple, labelRender, normalizeValue, placeholder],\n );\n\n const hasValue = isMultiple ? valueArray.length > 0 : !isValueEmpty(normalizedValue);\n const showClear = Boolean(allowClear && hasValue && !disabled && !readOnly);\n\n const handleClear = useCallback(\n (event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n handleValueChange(isMultiple ? [] : null);\n },\n [handleValueChange, isMultiple],\n );\n\n const prefixNode = useMemo(() => {\n if (prefix === undefined || prefix === null) return null;\n if (isValidElement(prefix) || typeof prefix === 'string' || typeof prefix === 'number') {\n return prefix;\n }\n return <Icon icon={prefix as any} size={'small'} />;\n }, [prefix]);\n\n const suffixIconNode = useMemo(() => {\n if (loading) {\n return <Icon icon={Loader2} size={'small'} spin />;\n }\n if (suffixIcon === null) return null;\n if (\n isValidElement(suffixIcon) ||\n typeof suffixIcon === 'string' ||\n typeof suffixIcon === 'number'\n ) {\n return suffixIcon;\n }\n return (\n <Icon\n icon={(suffixIcon as any) || ChevronDown}\n size={'small'}\n {...suffixIconProps}\n style={{\n pointerEvents: 'none',\n ...suffixIconProps?.style,\n }}\n />\n );\n }, [loading, suffixIcon, suffixIconProps]);\n\n const popupStyle = useMemo(() => {\n const baseStyle: React.CSSProperties = {\n maxWidth: 'var(--available-width)',\n minWidth: 'var(--anchor-width)',\n };\n\n if (popupMatchSelectWidth === undefined || popupMatchSelectWidth === true) {\n return baseStyle;\n }\n if (typeof popupMatchSelectWidth === 'number') {\n return {\n ...baseStyle,\n minWidth: popupMatchSelectWidth,\n width: popupMatchSelectWidth,\n };\n }\n return {\n ...baseStyle,\n minWidth: 'max-content',\n };\n }, [popupMatchSelectWidth]);\n\n const triggerClassName = cx(\n triggerVariants({ shadow, size, variant: resolvedVariant }),\n className,\n classNames?.root,\n classNames?.trigger,\n );\n\n const portalContainer = usePortalContainer(LOBE_SELECT_CONTAINER_ATTR);\n const virtualListStyle = useMemo(() => {\n if (!virtual) return undefined;\n const rowCount = countVirtualItems(filteredOptions);\n const maxVisibleRows = 6;\n const estimatedRowHeight =\n listItemHeight ?? (size === 'large' ? 40 : size === 'small' ? 28 : 32);\n const visibleRows = Math.min(Math.max(rowCount, 1), maxVisibleRows);\n const estimatedHeight = visibleRows * estimatedRowHeight + 8;\n\n return {\n height: `min(${estimatedHeight}px, var(--available-height))`,\n };\n }, [filteredOptions, listItemHeight, size, virtual]);\n\n const itemTextClassName = cx(\n optionRender ? menuStyles.itemContent : menuStyles.label,\n styles.itemText,\n classNames?.itemText,\n );\n let optionIndex = 0;\n const renderOptions = (items: LobeSelectOptions) =>\n items.map((item, index) => {\n if (isGroupOption(item)) {\n return (\n <Select.Group className={cx(styles.group, classNames?.group)} key={`group-${index}`}>\n <Select.GroupLabel\n className={cx(menuStyles.groupLabel, styles.groupLabel, classNames?.groupLabel)}\n >\n {item.label}\n </Select.GroupLabel>\n {item.options.map((option) => {\n const currentIndex = optionIndex++;\n return (\n <Select.Item\n className={cx(\n menuStyles.item,\n styles.item,\n classNames?.item,\n classNames?.option,\n option.className,\n )}\n disabled={option.disabled}\n key={`${String(option.value)}-${currentIndex}`}\n label={getOptionSearchText(option)}\n style={{\n minHeight: listItemHeight,\n ...option.style,\n }}\n value={option.value}\n >\n <Select.ItemText className={itemTextClassName}>\n {optionRender ? optionRender(option, { index: currentIndex }) : option.label}\n </Select.ItemText>\n <Select.ItemIndicator\n className={cx(styles.itemIndicator, classNames?.itemIndicator)}\n >\n <Icon icon={Check} size={'small'} />\n </Select.ItemIndicator>\n </Select.Item>\n );\n })}\n </Select.Group>\n );\n }\n\n const currentIndex = optionIndex++;\n return (\n <Select.Item\n className={cx(\n menuStyles.item,\n styles.item,\n classNames?.item,\n classNames?.option,\n item.className,\n )}\n disabled={item.disabled}\n key={`${String(item.value)}-${currentIndex}`}\n label={getOptionSearchText(item)}\n style={{\n minHeight: listItemHeight,\n ...item.style,\n }}\n value={item.value}\n >\n <Select.ItemText className={itemTextClassName}>\n {optionRender ? optionRender(item, { index: currentIndex }) : item.label}\n </Select.ItemText>\n <Select.ItemIndicator className={cx(styles.itemIndicator, classNames?.itemIndicator)}>\n <Icon icon={Check} size={'small'} />\n </Select.ItemIndicator>\n </Select.Item>\n );\n });\n\n return (\n <Select.Root\n disabled={disabled}\n id={id}\n modal={false}\n multiple={isMultiple}\n name={name}\n onOpenChange={handleOpenChange}\n onValueChange={handleValueChange}\n open={mergedOpen}\n readOnly={readOnly}\n required={required}\n value={normalizedValue}\n >\n <Select.Trigger\n autoFocus={autoFocus}\n className={triggerClassName}\n disabled={disabled}\n style={style}\n >\n {prefixNode !== null && prefixNode !== undefined && (\n <span className={cx(styles.prefix, classNames?.prefix)}>{prefixNode}</span>\n )}\n <Select.Value className={cx(styles.value, classNames?.value)}>{renderValue}</Select.Value>\n <span className={cx(styles.suffix, classNames?.suffix)}>\n {showClear && (\n <span\n className={cx(styles.clear, classNames?.clear)}\n data-role=\"lobe-select-clear\"\n onClick={handleClear}\n >\n <Icon icon={X} size={'small'} />\n </span>\n )}\n {suffixIconNode !== null && suffixIconNode !== undefined && (\n <Select.Icon className={cx(styles.icon, classNames?.icon)}>\n {suffixIconNode}\n </Select.Icon>\n )}\n </span>\n </Select.Trigger>\n\n <Select.Portal container={portalContainer}>\n <Select.Positioner\n align=\"start\"\n alignItemWithTrigger={false}\n className={styles.positioner}\n side=\"bottom\"\n sideOffset={6}\n >\n <Select.Popup\n className={cx(\n menuStyles.popup,\n styles.popup,\n popupClassName,\n classNames?.popup,\n classNames?.dropdown,\n )}\n style={popupStyle}\n >\n {shouldShowSearch && (\n <div className={cx(styles.search, classNames?.search)}>\n <input\n className={styles.searchInput}\n onChange={handleSearchChange}\n onKeyDown={handleSearchKeyDown}\n placeholder={typeof placeholder === 'string' ? placeholder : undefined}\n value={searchValue}\n />\n </div>\n )}\n {(() => {\n const content =\n filteredOptions.length > 0 ? (\n renderOptions(filteredOptions)\n ) : (\n <div\n className={cx(\n menuStyles.item,\n menuStyles.empty,\n styles.empty,\n classNames?.empty,\n )}\n >\n No data\n </div>\n );\n\n if (!virtual || filteredOptions.length === 0) {\n return (\n <Select.List\n className={cx(styles.list, classNames?.list)}\n data-virtual={virtual || undefined}\n >\n {content}\n </Select.List>\n );\n }\n\n return (\n <Select.List\n className={cx(styles.list, classNames?.list)}\n data-virtual={virtual || undefined}\n style={virtualListStyle}\n >\n <Virtualizer itemSize={listItemHeight}>{content}</Virtualizer>\n </Select.List>\n );\n })()}\n </Select.Popup>\n </Select.Positioner>\n </Select.Portal>\n </Select.Root>\n );\n },\n);\n\nLobeSelect.displayName = 'LobeSelect';\n\nexport default LobeSelect;\n"],"mappings":";;;;;;;;;;;;;;;AAsBA,MAAM,iBACJ,WAEA,QAAS,OAAwC,QAAQ;AAE3D,MAAM,uBAA+B,WAAoC;AACvE,KAAI,OAAO,OAAO,UAAU,YAAY,OAAO,OAAO,UAAU,SAC9D,QAAO,OAAO,OAAO,MAAM;AAE7B,KAAI,OAAO,OAAO,UAAU,YAAY,OAAO,OAAO,UAAU,SAC9D,QAAO,OAAO,OAAO,MAAM;AAE7B,KAAI,OAAO,MAAO,QAAO,OAAO;AAChC,QAAO;;AAGT,MAAM,gBAAgB,UAAkB,MAAM,WAAW,uBAAuB,OAAO;AAEvF,MAAM,qBAAqB,OAAe,eAA0B;AAClE,KAAI,CAAC,cAAc,WAAW,WAAW,EAAG,QAAO,CAAC,MAAM;CAC1D,MAAM,UAAU,WAAW,IAAI,aAAa,CAAC,KAAK,IAAI;AACtD,QAAO,MAAM,MAAM,IAAI,OAAO,SAAS,IAAI,CAAC;;AAG9C,MAAM,qBAAqB,UACzB,MAAM,QAAQ,OAAO,SAAS;AAC5B,KAAI,cAAc,KAAK,CACrB,QAAO,QAAQ,KAAK,QAAQ,SAAS;AAEvC,QAAO,QAAQ;GACd,EAAE;AAEP,MAAM,gBAAgB,UAAmB,UAAU,QAAQ,UAAU,UAAa,UAAU;AAE5F,MAAM,aAAa,MAChB,EACC,YACA,WACA,WACA,YACA,aACA,cACA,UACA,IACA,gBACA,aACA,SACA,MACA,MACA,UACA,cACA,UACA,MACA,cACA,SACA,aACA,gBACA,uBACA,QACA,UACA,UACA,QACA,YACA,OAAO,UACP,OACA,YACA,iBACA,iBACA,OACA,SACA,cACI;CACJ,MAAM,EAAE,eAAe,cAAc;CACrC,MAAM,kBAAkB,YAAY,aAAa,WAAW;CAC5D,MAAM,aAAa,SAAS,cAAc,SAAS;CAEnD,MAAM,CAAC,mBAAmB,wBAAwB,eAAoB;AACpE,MAAI,iBAAiB,OAAW,QAAO;AACvC,SAAO,aAAa,EAAE,GAAG;GACzB;CAEF,MAAM,iBAAiB,aACpB,cAAmB;AAClB,MAAI,YAAY;AACd,OAAI,MAAM,QAAQ,UAAU,CAAE,QAAO;AACrC,OAAI,cAAc,QAAQ,cAAc,OAAW,QAAO,EAAE;AAC5D,UAAO,CAAC,UAAU;;AAEpB,MAAI,MAAM,QAAQ,UAAU,CAAE,QAAO,UAAU,MAAM;AACrD,SAAO,cAAc,SAAY,OAAO;IAE1C,CAAC,WAAW,CACb;CAED,MAAM,cAAc,UAAU,SAAY,QAAQ;CAClD,MAAM,kBAAkB,cAChB,eAAe,YAAY,EACjC,CAAC,aAAa,eAAe,CAC9B;CACD,MAAM,aAAa,cAEf,aACK,kBACD,aAAa,gBAAgB,GAC3B,EAAE,GACF,CAAC,gBAAgB,EACzB,CAAC,YAAY,gBAAgB,CAC9B;CAED,MAAM,CAAC,cAAc,mBAAmB,SAAkC,EAAE,CAAC;AAE7E,iBAAgB;AACd,MAAI,SAAS,UAAU,aAAa,SAAS,EAC3C,iBAAgB,EAAE,CAAC;IAEpB,CAAC,MAAM,aAAa,OAAO,CAAC;CAE/B,MAAM,EAAE,iBAAiB,cAAc,cAAc;EACnD,MAAM,cAAc,WAAW,EAAE;EACjC,MAAM,iCAAiB,IAAI,KAAiC;EAE5D,MAAM,aAAa,SAAgC;AACjD,OAAI,CAAC,eAAe,IAAI,KAAK,MAAM,CACjC,gBAAe,IAAI,KAAK,OAAO,KAAK;;EAIxC,MAAM,eAAe,UAA6B;AAChD,SAAM,SAAS,SAAS;AACtB,QAAI,cAAc,KAAK,CACrB,MAAK,QAAQ,QAAQ,UAAU;QAE/B,WAAU,KAAK;KAEjB;;AAGJ,cAAY,YAAY;EAExB,MAAM,uBAAuB,aAAa,QAAQ,SAAS,CAAC,eAAe,IAAI,KAAK,MAAM,CAAC;AAC3F,uBAAqB,QAAQ,UAAU;EAEvC,MAAMA,gBAAmC,CAAC,GAAG,aAAa,GAAG,qBAAqB;EAElF,MAAMC,sBAA+C,WAClD,QAAQ,QAAQ,CAAC,eAAe,IAAI,IAAI,CAAC,CACzC,KAAK,SAAS;GACb,OAAO,OAAO,IAAI;GAClB,OAAO;GACR,EAAE;AACL,sBAAoB,QAAQ,UAAU;AAEtC,SAAO;GACL,WAAW;GACX,iBAAiB,oBAAoB,SACjC,CAAC,GAAG,eAAe,GAAG,oBAAoB,GAC1C;GACL;IACA;EAAC;EAAc;EAAS;EAAW,CAAC;CAEvC,MAAM,CAAC,kBAAkB,uBAAuB,SAAS,QAAQ,YAAY,CAAC;AAE9E,iBAAgB;AACd,MAAI,SAAS,OACX,qBAAoB,KAAK;IAE1B,CAAC,KAAK,CAAC;CAEV,MAAM,aAAa,QAAQ;CAE3B,MAAM,mBAAmB,aACtB,aAAsB;AACrB,iBAAe,SAAS;AACxB,MAAI,SAAS,OACX,qBAAoB,SAAS;IAGjC,CAAC,cAAc,KAAK,CACrB;CAED,MAAM,CAAC,aAAa,kBAAkB,SAAS,GAAG;CAClD,MAAM,mBAAmB,QAAQ,cAAc,SAAS,OAAO;AAE/D,iBAAgB;AACd,MAAI,CAAC,WAAY,gBAAe,GAAG;IAClC,CAAC,WAAW,CAAC;CAEhB,MAAM,YAAY,aACf,gBAA4C;EAC3C,MAAM,UAAU,UAAU,IAAI,YAAY;AAC1C,MAAI,QAAS,QAAO;AACpB,MAAI,eAAe,OAAO,gBAAgB,YAAY,WAAW,YAC/D,QAAO;GACL,OAAQ,YAAoB;GAC5B,OAAO;GACR;AAEH,SAAO;GACL,OAAO,OAAO,YAAY;GAC1B,OAAO;GACR;IAEH,CAAC,UAAU,CACZ;CAED,MAAM,mBAAmB,OAAY,gBAAgB;AAErD,iBAAgB;AACd,mBAAiB,UAAU;IAC1B,CAAC,gBAAgB,CAAC;CAErB,MAAM,oBAAoB,aACvB,cAAmB;EAClB,MAAM,sBAAsB,eAAe,UAAU;EACrD,MAAM,gBAAgB,iBAAiB;AAEvC,MAAI,YAAY;GACd,MAAM,aAAa,MAAM,QAAQ,cAAc,GAAG,gBAAgB,EAAE;GACpE,MAAM,aAAa,MAAM,QAAQ,oBAAoB,GAAG,sBAAsB,EAAE;AAKhF,GAJoB,WAAW,QAC5B,QAAQ,CAAC,WAAW,MAAM,SAAS,OAAO,GAAG,MAAM,IAAI,CAAC,CAC1D,CAEW,SAAS,QAAQ;AAC3B,eAAW,KAAK,UAAU,IAAI,CAAC;KAC/B;AAEF,OAAI,UAAU,OACZ,sBAAqB,WAAW;AAElC,cACE,YACA,WAAW,KAAK,QAAQ,UAAU,IAAI,CAAC,CACxC;SACI;AACL,OACE,CAAC,aAAa,oBAAoB,IAClC,CAAC,OAAO,GAAG,eAAe,oBAAoB,CAE9C,YAAW,qBAAqB,UAAU,oBAAoB,CAAC;AAEjE,OAAI,UAAU,OACZ,sBAAqB,oBAAoB;AAE3C,cACE,qBACA,aAAa,oBAAoB,GAAG,SAAY,UAAU,oBAAoB,CAC/E;;AAGH,mBAAiB,UAAU;IAE7B;EAAC;EAAW;EAAY;EAAgB;EAAU;EAAU;EAAM,CACnE;CAED,MAAM,kBAAkB,aACrB,cAAwB;EACvB,MAAM,cAAc,UAAU,KAAK,QAAQ,IAAI,MAAM,CAAC,CAAC,OAAO,QAAQ;AACtE,MAAI,CAAC,YAAY,OAAQ;EAEzB,MAAM,aAAa,CAAC,GAAG,WAAW;EAClC,MAAM,kBAAkB,YAAY,QAAQ,QAAQ,CAAC,UAAU,IAAI,IAAI,CAAC;AAExE,MAAI,gBAAgB,SAAS,EAC3B,kBAAiB,SAAS;GACxB,MAAM,iBAAiB,IAAI,IAAI,KAAK,KAAK,SAAS,KAAK,MAAM,CAAC;GAC9D,MAAM,SAAS,CAAC,GAAG,KAAK;AACxB,mBAAgB,SAAS,QAAQ;AAC/B,QAAI,CAAC,eAAe,IAAI,IAAI,CAC1B,QAAO,KAAK;KAAE,OAAO;KAAK,OAAO;KAAK,CAAC;KAEzC;AACF,UAAO;IACP;AAGJ,cAAY,SAAS,QAAQ;AAC3B,OAAI,CAAC,WAAW,MAAM,SAAS,OAAO,GAAG,MAAM,IAAI,CAAC,CAClD,YAAW,KAAK,IAAI;IAEtB;AAEF,MAAI,WAAW,WAAW,WAAW,OACnC,mBAAkB,WAAW;IAGjC;EAAC;EAAmB;EAAW;EAAW,CAC3C;CAED,MAAM,qBAAqB,aACxB,UAAyC;EACxC,MAAM,YAAY,MAAM,OAAO;AAC/B,MAAI,SAAS,QAAQ;GACnB,MAAM,QAAQ,kBAAkB,WAAW,gBAAgB;AAC3D,OAAI,MAAM,SAAS,GAAG;IACpB,MAAM,UAAU,MAAM,KAAK,IAAI;AAC/B,oBAAgB,MAAM,OAAO,QAAQ,CAAC;AACtC,mBAAe,QAAQ;AACvB;;;AAGJ,iBAAe,UAAU;IAE3B;EAAC;EAAiB;EAAM;EAAgB,CACzC;CAED,MAAM,sBAAsB,aACzB,UAA2C;AAC1C,QAAM,iBAAiB;AAEvB,MAAI,MAAM,QAAQ,UAAU;AAC1B,oBAAiB,MAAM;AACvB;;AAGF,MAAI,SAAS,OAAQ;AAErB,MAAI,MAAM,QAAQ,SAAS;AACzB,SAAM,gBAAgB;AACtB,SAAM,iBAAiB;AACvB,mBAAgB,CAAC,YAAY,CAAC;AAC9B,kBAAe,GAAG;AAClB;;AAGF,MAAI,iBAAiB,SAAS,MAAM,IAAI,EAAE;AACxC,SAAM,gBAAgB;AACtB,SAAM,iBAAiB;AACvB,mBAAgB,CAAC,YAAY,CAAC;AAC9B,kBAAe,GAAG;;IAGtB;EAAC;EAAiB;EAAkB;EAAM;EAAa;EAAgB,CACxE;CAED,MAAM,kBAAkB,cAAc;AACpC,MAAI,CAAC,oBAAoB,CAAC,YAAY,MAAM,CAAE,QAAO;EACrD,MAAM,QAAQ,YAAY,MAAM,CAAC,aAAa;EAE9C,MAAM,eAAe,UAAgD;AAcnE,UAbiB,MACd,KAAK,SAAS;AACb,QAAI,cAAc,KAAK,EAAE;KACvB,MAAM,aAAa,KAAK,QAAQ,QAAQ,WACtC,oBAAoB,OAAO,CAAC,aAAa,CAAC,SAAS,MAAM,CAC1D;AACD,SAAI,CAAC,WAAW,OAAQ,QAAO;AAC/B,YAAO;MAAE,GAAG;MAAM,SAAS;MAAY;;AAEzC,WAAO,oBAAoB,KAAK,CAAC,aAAa,CAAC,SAAS,MAAM,GAAG,OAAO;KACxE,CACD,OAAO,QAAQ;;AAKpB,SAAO,YAAY,gBAAgB;IAClC;EAAC;EAAiB;EAAa;EAAiB,CAAC;CAEpD,MAAM,cAAc,aACjB,iBAAsB;EACrB,MAAM,WAAW,eAAe,aAAa;EAC7C,MAAM,kBACJ,gBAAgB,SAAY,OAC1B,oBAAC;GAAK,WAAWC,SAAO;aAAY;IAAmB;AAG3D,MAAI,YAAY;GACd,MAAM,SAAS,MAAM,QAAQ,SAAS,GAAG,WAAW,EAAE;AACtD,OAAI,OAAO,WAAW,EAAG,QAAO;AAChC,UACE,oBAAC;IAAK,WAAWA,SAAO;cACrB,OAAO,KAAK,KAAK,UAAU;KAC1B,MAAMC,WAAS,UAAU,IAAI;KAC7B,MAAMC,YAAU,cAAc,YAAYD,SAAO,GAAIA,SAAO,SAAS,OAAO,IAAI;AAChF,YACE,oBAAC;MAAK,WAAWD,SAAO;gBACrBE;QAD+B,GAAG,OAAO,IAAI,CAAC,GAAG,QAE7C;MAET;KACG;;AAIX,MAAI,aAAa,SAAS,CAAE,QAAO;EACnC,MAAM,SAAS,UAAU,SAAS;EAClC,MAAM,UAAU,cAAc,YAAY,OAAO,GAAI,OAAO,SAAS,OAAO,SAAS;AACrF,SAAO,oBAAC;GAAK,WAAWF,SAAO;aAAY;IAAe;IAE5D;EAAC;EAAW;EAAY;EAAa;EAAgB;EAAY,CAClE;CAED,MAAM,WAAW,aAAa,WAAW,SAAS,IAAI,CAAC,aAAa,gBAAgB;CACpF,MAAM,YAAY,QAAQ,cAAc,YAAY,CAAC,YAAY,CAAC,SAAS;CAE3E,MAAM,cAAc,aACjB,UAAsB;AACrB,QAAM,gBAAgB;AACtB,QAAM,iBAAiB;AACvB,oBAAkB,aAAa,EAAE,GAAG,KAAK;IAE3C,CAAC,mBAAmB,WAAW,CAChC;CAED,MAAM,aAAa,cAAc;AAC/B,MAAI,WAAW,UAAa,WAAW,KAAM,QAAO;AACpD,MAAI,eAAe,OAAO,IAAI,OAAO,WAAW,YAAY,OAAO,WAAW,SAC5E,QAAO;AAET,SAAO,oBAACG;GAAK,MAAM;GAAe,MAAM;IAAW;IAClD,CAAC,OAAO,CAAC;CAEZ,MAAM,iBAAiB,cAAc;AACnC,MAAI,QACF,QAAO,oBAACA;GAAK,MAAM;GAAS,MAAM;GAAS;IAAO;AAEpD,MAAI,eAAe,KAAM,QAAO;AAChC,MACE,eAAe,WAAW,IAC1B,OAAO,eAAe,YACtB,OAAO,eAAe,SAEtB,QAAO;AAET,SACE,oBAACA;GACC,MAAO,cAAsB;GAC7B,MAAM;GACN,GAAI;GACJ,OAAO;IACL,eAAe;IACf,GAAG,iBAAiB;IACrB;IACD;IAEH;EAAC;EAAS;EAAY;EAAgB,CAAC;CAE1C,MAAM,aAAa,cAAc;EAC/B,MAAMC,YAAiC;GACrC,UAAU;GACV,UAAU;GACX;AAED,MAAI,0BAA0B,UAAa,0BAA0B,KACnE,QAAO;AAET,MAAI,OAAO,0BAA0B,SACnC,QAAO;GACL,GAAG;GACH,UAAU;GACV,OAAO;GACR;AAEH,SAAO;GACL,GAAG;GACH,UAAU;GACX;IACA,CAAC,sBAAsB,CAAC;CAE3B,MAAM,mBAAmB,GACvB,gBAAgB;EAAE;EAAQ;EAAM,SAAS;EAAiB,CAAC,EAC3D,WACA,YAAY,MACZ,YAAY,QACb;CAED,MAAM,kBAAkB,mBAAmB,2BAA2B;CACtE,MAAM,mBAAmB,cAAc;AACrC,MAAI,CAAC,QAAS,QAAO;EACrB,MAAM,WAAW,kBAAkB,gBAAgB;EACnD,MAAM,iBAAiB;EACvB,MAAM,qBACJ,mBAAmB,SAAS,UAAU,KAAK,SAAS,UAAU,KAAK;AAIrE,SAAO,EACL,QAAQ,OAJU,KAAK,IAAI,KAAK,IAAI,UAAU,EAAE,EAAE,eAAe,GAC7B,qBAAqB,EAG1B,+BAChC;IACA;EAAC;EAAiB;EAAgB;EAAM;EAAQ,CAAC;CAEpD,MAAM,oBAAoB,GACxB,eAAeC,OAAW,cAAcA,OAAW,OACnDL,SAAO,UACP,YAAY,SACb;CACD,IAAI,cAAc;CAClB,MAAM,iBAAiB,UACrB,MAAM,KAAK,MAAM,UAAU;AACzB,MAAI,cAAc,KAAK,CACrB,QACE,qBAAC,OAAO;GAAM,WAAW,GAAGA,SAAO,OAAO,YAAY,MAAM;cAC1D,oBAAC,OAAO;IACN,WAAW,GAAGK,OAAW,YAAYL,SAAO,YAAY,YAAY,WAAW;cAE9E,KAAK;KACY,EACnB,KAAK,QAAQ,KAAK,WAAW;IAC5B,MAAMM,iBAAe;AACrB,WACE,qBAAC,OAAO;KACN,WAAW,GACTD,OAAW,MACXL,SAAO,MACP,YAAY,MACZ,YAAY,QACZ,OAAO,UACR;KACD,UAAU,OAAO;KAEjB,OAAO,oBAAoB,OAAO;KAClC,OAAO;MACL,WAAW;MACX,GAAG,OAAO;MACX;KACD,OAAO,OAAO;gBAEd,oBAAC,OAAO;MAAS,WAAW;gBACzB,eAAe,aAAa,QAAQ,EAAE,OAAOM,gBAAc,CAAC,GAAG,OAAO;OACvD,EAClB,oBAAC,OAAO;MACN,WAAW,GAAGN,SAAO,eAAe,YAAY,cAAc;gBAE9D,oBAACG;OAAK,MAAM;OAAO,MAAM;QAAW;OACf;OAflB,GAAG,OAAO,OAAO,MAAM,CAAC,GAAGG,iBAgBpB;KAEhB;KApC+D,SAAS,QAqC7D;EAInB,MAAM,eAAe;AACrB,SACE,qBAAC,OAAO;GACN,WAAW,GACTD,OAAW,MACXL,SAAO,MACP,YAAY,MACZ,YAAY,QACZ,KAAK,UACN;GACD,UAAU,KAAK;GAEf,OAAO,oBAAoB,KAAK;GAChC,OAAO;IACL,WAAW;IACX,GAAG,KAAK;IACT;GACD,OAAO,KAAK;cAEZ,oBAAC,OAAO;IAAS,WAAW;cACzB,eAAe,aAAa,MAAM,EAAE,OAAO,cAAc,CAAC,GAAG,KAAK;KACnD,EAClB,oBAAC,OAAO;IAAc,WAAW,GAAGA,SAAO,eAAe,YAAY,cAAc;cAClF,oBAACG;KAAK,MAAM;KAAO,MAAM;MAAW;KACf;KAblB,GAAG,OAAO,KAAK,MAAM,CAAC,GAAG,eAclB;GAEhB;AAEJ,QACE,qBAAC,OAAO;EACI;EACN;EACJ,OAAO;EACP,UAAU;EACJ;EACN,cAAc;EACd,eAAe;EACf,MAAM;EACI;EACA;EACV,OAAO;aAEP,qBAAC,OAAO;GACK;GACX,WAAW;GACD;GACH;;IAEN,eAAe,QAAQ,eAAe,UACrC,oBAAC;KAAK,WAAW,GAAGH,SAAO,QAAQ,YAAY,OAAO;eAAG;MAAkB;IAE7E,oBAAC,OAAO;KAAM,WAAW,GAAGA,SAAO,OAAO,YAAY,MAAM;eAAG;MAA2B;IAC1F,qBAAC;KAAK,WAAW,GAAGA,SAAO,QAAQ,YAAY,OAAO;gBACnD,aACC,oBAAC;MACC,WAAW,GAAGA,SAAO,OAAO,YAAY,MAAM;MAC9C,aAAU;MACV,SAAS;gBAET,oBAACG;OAAK,MAAM;OAAG,MAAM;QAAW;OAC3B,EAER,mBAAmB,QAAQ,mBAAmB,UAC7C,oBAAC,OAAO;MAAK,WAAW,GAAGH,SAAO,MAAM,YAAY,KAAK;gBACtD;OACW;MAEX;;IACQ,EAEjB,oBAAC,OAAO;GAAO,WAAW;aACxB,oBAAC,OAAO;IACN,OAAM;IACN,sBAAsB;IACtB,WAAWA,SAAO;IAClB,MAAK;IACL,YAAY;cAEZ,qBAAC,OAAO;KACN,WAAW,GACTK,OAAW,OACXL,SAAO,OACP,gBACA,YAAY,OACZ,YAAY,SACb;KACD,OAAO;gBAEN,oBACC,oBAAC;MAAI,WAAW,GAAGA,SAAO,QAAQ,YAAY,OAAO;gBACnD,oBAAC;OACC,WAAWA,SAAO;OAClB,UAAU;OACV,WAAW;OACX,aAAa,OAAO,gBAAgB,WAAW,cAAc;OAC7D,OAAO;QACP;OACE,SAEA;MACN,MAAM,UACJ,gBAAgB,SAAS,IACvB,cAAc,gBAAgB,GAE9B,oBAAC;OACC,WAAW,GACTK,OAAW,MACXA,OAAW,OACXL,SAAO,OACP,YAAY,MACb;iBACF;QAEK;AAGV,UAAI,CAAC,WAAW,gBAAgB,WAAW,EACzC,QACE,oBAAC,OAAO;OACN,WAAW,GAAGA,SAAO,MAAM,YAAY,KAAK;OAC5C,gBAAc,WAAW;iBAExB;QACW;AAIlB,aACE,oBAAC,OAAO;OACN,WAAW,GAAGA,SAAO,MAAM,YAAY,KAAK;OAC5C,gBAAc,WAAW;OACzB,OAAO;iBAEP,oBAAC;QAAY,UAAU;kBAAiB;SAAsB;QAClD;SAEd;MACS;KACG;IACN;GACJ;EAGnB;AAED,WAAW,cAAc;AAEzB,yBAAe"}
|