@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.
Files changed (182) hide show
  1. package/es/Accordion/Accordion.d.mts +2 -2
  2. package/es/Accordion/AccordionItem.d.mts +2 -2
  3. package/es/ActionIcon/ActionIcon.d.mts +2 -2
  4. package/es/Alert/Alert.d.mts +2 -2
  5. package/es/AutoComplete/Select.d.mts +2 -2
  6. package/es/Avatar/AvatarGroup/index.d.mts +2 -2
  7. package/es/Burger/Burger.d.mts +2 -2
  8. package/es/CodeDiff/CodeDiff.d.mts +2 -2
  9. package/es/CodeDiff/PatchDiff.d.mts +2 -2
  10. package/es/CodeEditor/CodeEditor.d.mts +2 -2
  11. package/es/Collapse/Collapse.d.mts +2 -2
  12. package/es/ConfigProvider/index.d.mts +2 -2
  13. package/es/ContextMenu/ContextMenuHost.d.mts +3 -3
  14. package/es/CopyButton/CopyButton.d.mts +2 -2
  15. package/es/DatePicker/DatePicker.d.mts +2 -2
  16. package/es/DraggablePanel/components/DraggablePanelBody.d.mts +2 -2
  17. package/es/DraggablePanel/components/DraggablePanelContainer.d.mts +2 -2
  18. package/es/DraggablePanel/components/DraggablePanelFooter.d.mts +2 -2
  19. package/es/DraggablePanel/components/DraggablePanelHeader.d.mts +2 -2
  20. package/es/DraggableSideNav/DraggableSideNav.d.mts +2 -2
  21. package/es/Drawer/Drawer.d.mts +2 -2
  22. package/es/Dropdown/Dropdown.d.mts +2 -2
  23. package/es/DropdownMenu/DropdownMenu.d.mts +2 -2
  24. package/es/DropdownMenu/DropdownMenu.mjs +7 -5
  25. package/es/DropdownMenu/DropdownMenu.mjs.map +1 -1
  26. package/es/DropdownMenu/atoms.d.mts +29 -20
  27. package/es/DropdownMenu/atoms.mjs +5 -5
  28. package/es/DropdownMenu/atoms.mjs.map +1 -1
  29. package/es/DropdownMenu/type.d.mts +7 -0
  30. package/es/EditableText/EditableText.d.mts +2 -2
  31. package/es/EmojiPicker/EmojiPicker.d.mts +2 -2
  32. package/es/EmojiPicker/EmojiPicker.mjs +5 -1
  33. package/es/EmojiPicker/EmojiPicker.mjs.map +1 -1
  34. package/es/EmojiPicker/style.mjs +4 -0
  35. package/es/EmojiPicker/style.mjs.map +1 -1
  36. package/es/Flex/FlexBasic.d.mts +2 -2
  37. package/es/FontLoader/index.d.mts +2 -2
  38. package/es/Footer/Footer.d.mts +2 -2
  39. package/es/Form/components/FormGroup.d.mts +2 -2
  40. package/es/Form/components/FormItem.d.mts +2 -2
  41. package/es/Form/components/FormSubmitFooter.d.mts +2 -2
  42. package/es/FormModal/FormModal.d.mts +2 -2
  43. package/es/GuideCard/GuideCard.d.mts +2 -2
  44. package/es/Header/Header.d.mts +2 -2
  45. package/es/Highlighter/Highlighter.d.mts +2 -2
  46. package/es/Highlighter/SyntaxHighlighter/index.d.mts +2 -2
  47. package/es/Hotkey/Hotkey.d.mts +2 -2
  48. package/es/HotkeyInput/HotkeyInput.d.mts +2 -2
  49. package/es/Icon/Icon.d.mts +2 -2
  50. package/es/Icon/components/IconProvider.d.mts +3 -3
  51. package/es/Image/PreviewGroup.d.mts +2 -2
  52. package/es/ImageSelect/ImageSelect.d.mts +2 -2
  53. package/es/Input/Input.d.mts +2 -2
  54. package/es/Input/InputNumber.d.mts +2 -2
  55. package/es/Input/InputOPT.d.mts +2 -2
  56. package/es/Input/InputPassword.d.mts +2 -2
  57. package/es/Input/TextArea.d.mts +2 -2
  58. package/es/Layout/components/LayoutFooter.d.mts +2 -2
  59. package/es/Layout/components/LayoutHeader.d.mts +2 -2
  60. package/es/Layout/components/LayoutMain.d.mts +2 -2
  61. package/es/Layout/components/LayoutSidebar.d.mts +2 -2
  62. package/es/Layout/components/LayoutSidebarInner.d.mts +2 -2
  63. package/es/Layout/components/LayoutToc.d.mts +2 -2
  64. package/es/List/ListItem/index.d.mts +2 -2
  65. package/es/LobeSelect/LobeSelect.d.mts +8 -0
  66. package/es/LobeSelect/LobeSelect.mjs +486 -0
  67. package/es/LobeSelect/LobeSelect.mjs.map +1 -0
  68. package/es/LobeSelect/atoms.d.mts +155 -0
  69. package/es/LobeSelect/atoms.mjs +172 -0
  70. package/es/LobeSelect/atoms.mjs.map +1 -0
  71. package/es/LobeSelect/constants.d.mts +5 -0
  72. package/es/LobeSelect/constants.mjs +6 -0
  73. package/es/LobeSelect/constants.mjs.map +1 -0
  74. package/es/LobeSelect/index.d.mts +5 -0
  75. package/es/LobeSelect/index.d.ts +1 -0
  76. package/es/LobeSelect/index.js +1 -0
  77. package/es/LobeSelect/index.mjs +5 -0
  78. package/es/LobeSelect/style.mjs +274 -0
  79. package/es/LobeSelect/style.mjs.map +1 -0
  80. package/es/LobeSelect/type.d.mts +83 -0
  81. package/es/Markdown/Markdown.d.mts +2 -2
  82. package/es/Markdown/Typography.d.mts +2 -2
  83. package/es/Markdown/components/SearchResultCards/index.d.mts +2 -2
  84. package/es/Markdown/markdown.style.mjs +40 -15
  85. package/es/Markdown/markdown.style.mjs.map +1 -1
  86. package/es/MaskShadow/MaskShadow.d.mts +2 -2
  87. package/es/Menu/Menu.d.mts +2 -2
  88. package/es/Menu/sharedStyle.mjs +2 -2
  89. package/es/Menu/sharedStyle.mjs.map +1 -1
  90. package/es/Mermaid/Mermaid.d.mts +2 -2
  91. package/es/Mermaid/SyntaxMermaid/index.d.mts +2 -2
  92. package/es/Modal/Modal.d.mts +2 -2
  93. package/es/Modal/ModalProvider.d.mts +2 -2
  94. package/es/Modal/imperative.d.mts +2 -2
  95. package/es/MotionProvider/index.d.mts +2 -2
  96. package/es/Popover/ArrowIcon.d.mts +2 -2
  97. package/es/Popover/Popover.d.mts +1 -1
  98. package/es/Popover/Popover.mjs +1 -1
  99. package/es/Popover/Popover.mjs.map +1 -1
  100. package/es/Popover/PopoverGroup.mjs +1 -1
  101. package/es/Popover/PopoverGroup.mjs.map +1 -1
  102. package/es/Popover/PopoverInGroup.mjs +1 -1
  103. package/es/Popover/PopoverInGroup.mjs.map +1 -1
  104. package/es/Popover/PopoverStandalone.mjs +1 -1
  105. package/es/Popover/PopoverStandalone.mjs.map +1 -1
  106. package/es/Popover/atoms.d.mts +15 -6
  107. package/es/Popover/atoms.mjs +5 -5
  108. package/es/Popover/atoms.mjs.map +1 -1
  109. package/es/Popover/context.d.mts +2 -2
  110. package/es/Popover/index.d.mts +1 -1
  111. package/es/Popover/index.mjs +1 -1
  112. package/es/Popover/style.mjs +2 -2
  113. package/es/Popover/style.mjs.map +1 -1
  114. package/es/Popover/type.d.mts +7 -5
  115. package/es/SearchBar/SearchBar.d.mts +2 -2
  116. package/es/Segmented/Segmented.d.mts +2 -2
  117. package/es/Select/Select.d.mts +2 -2
  118. package/es/SideNav/SideNav.d.mts +2 -2
  119. package/es/SliderWithInput/SliderWithInput.d.mts +2 -2
  120. package/es/SortableList/components/DragHandle.d.mts +2 -2
  121. package/es/SortableList/components/SortableItem.d.mts +2 -2
  122. package/es/ThemeProvider/ThemeProvider.d.mts +2 -2
  123. package/es/Toast/imperative.d.mts +3 -3
  124. package/es/Toast/style.mjs +6 -3
  125. package/es/Toast/style.mjs.map +1 -1
  126. package/es/Toc/Toc.d.mts +2 -2
  127. package/es/Tooltip/type.d.mts +3 -3
  128. package/es/Video/index.d.mts +2 -2
  129. package/es/awesome/AuroraBackground/AuroraBackground.d.mts +2 -2
  130. package/es/awesome/BottomGradientButton/BottomGradientButton.d.mts +2 -2
  131. package/es/awesome/Features/Features.d.mts +2 -2
  132. package/es/awesome/Giscus/Giscus.d.mts +2 -2
  133. package/es/awesome/GradientButton/GradientButton.d.mts +2 -2
  134. package/es/awesome/GridBackground/GridBackground.d.mts +2 -2
  135. package/es/awesome/GridBackground/GridShowcase.d.mts +2 -2
  136. package/es/awesome/Spline/Spine.d.mts +2 -2
  137. package/es/awesome/Spotlight/Spotlight.d.mts +2 -2
  138. package/es/awesome/SpotlightCard/SpotlightCard.d.mts +2 -2
  139. package/es/awesome/TypewriterEffect/TypewriterEffect.d.mts +2 -2
  140. package/es/brand/LobeChat/index.d.mts +2 -2
  141. package/es/brand/LobeHub/index.d.mts +2 -2
  142. package/es/brand/LogoThree/LogoSpline.d.mts +2 -2
  143. package/es/brand/LogoThree/index.d.mts +2 -2
  144. package/es/chat/BackBottom/BackBottom.d.mts +2 -2
  145. package/es/chat/ChatInputArea/components/ChatInputAreaInner.d.mts +2 -2
  146. package/es/chat/ChatItem/ChatItem.d.mts +2 -2
  147. package/es/chat/ChatList/ChatList.d.mts +2 -2
  148. package/es/chat/EditableMessage/EditableMessage.d.mts +2 -2
  149. package/es/chat/EditableMessageList/EditableMessageList.d.mts +2 -2
  150. package/es/chat/MessageInput/MessageInput.d.mts +2 -2
  151. package/es/chat/MessageModal/MessageModal.d.mts +2 -2
  152. package/es/color/ColorScales/index.d.mts +2 -2
  153. package/es/color/CssVar/index.d.mts +2 -2
  154. package/es/i18n/context.d.mts +2 -2
  155. package/es/icons/lucideExtra/BotPromptIcon.d.mts +2 -2
  156. package/es/icons/lucideExtra/DiscordIcon.d.mts +3 -3
  157. package/es/icons/lucideExtra/GlobeOffIcon.d.mts +3 -3
  158. package/es/icons/lucideExtra/GroupBotIcon.d.mts +3 -3
  159. package/es/icons/lucideExtra/GroupBotSquareIcon.d.mts +3 -3
  160. package/es/icons/lucideExtra/LeftDoubleClickIcon.d.mts +3 -3
  161. package/es/icons/lucideExtra/McpIcon.d.mts +3 -3
  162. package/es/icons/lucideExtra/ProviderIcon.d.mts +3 -3
  163. package/es/icons/lucideExtra/RightClickIcon.d.mts +3 -3
  164. package/es/icons/lucideExtra/RightDoubleClickIcon.d.mts +3 -3
  165. package/es/icons/lucideExtra/ShapesUploadIcon.d.mts +3 -3
  166. package/es/icons/lucideExtra/TreeDownRightIcon.d.mts +3 -3
  167. package/es/icons/lucideExtra/TreeUpDownRightIcon.d.mts +3 -3
  168. package/es/index.d.mts +7 -1
  169. package/es/index.mjs +4 -1
  170. package/es/mdx/Mdx/index.d.mts +2 -2
  171. package/es/mobile/ChatHeader/ChatHeaderTitle.d.mts +2 -2
  172. package/es/mobile/ChatInputArea/components/ChatSendButton.d.mts +2 -2
  173. package/es/mobile/TabBar/TabBar.d.mts +2 -2
  174. package/es/storybook/StoryBook/index.d.mts +2 -2
  175. package/es/types/index.d.mts +2 -1
  176. package/es/types/trigger.d.mts +8 -0
  177. package/es/utils/parseTrigger.d.mts +14 -0
  178. package/es/{Popover → utils}/parseTrigger.mjs +1 -1
  179. package/es/utils/parseTrigger.mjs.map +1 -0
  180. package/package.json +3 -2
  181. package/es/Popover/parseTrigger.d.mts +0 -14
  182. 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":"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"}