@aloudata/aloudata-design 3.1.0 → 3.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/dist/AProgress/index.js +10 -0
  2. package/dist/AProgress/index.js.map +1 -1
  3. package/dist/Alert/index.js +3 -1
  4. package/dist/Alert/index.js.map +1 -1
  5. package/dist/Badge/index.js +37 -11
  6. package/dist/Badge/index.js.map +1 -1
  7. package/dist/Breadcrumb/index.js +12 -2
  8. package/dist/Breadcrumb/index.js.map +1 -1
  9. package/dist/Button/index.d.ts +1 -1
  10. package/dist/Button/index.js +20 -6
  11. package/dist/Button/index.js.map +1 -1
  12. package/dist/Card/index.js +1 -1
  13. package/dist/Card/index.js.map +1 -1
  14. package/dist/Carousel/index.js +9 -1
  15. package/dist/Carousel/index.js.map +1 -1
  16. package/dist/Checkbox/index.js +17 -2
  17. package/dist/Checkbox/index.js.map +1 -1
  18. package/dist/Checkbox/type.d.ts +10 -2
  19. package/dist/ColorPicker/index.js +112 -46
  20. package/dist/ColorPicker/index.js.map +1 -1
  21. package/dist/DataPreviewTable/components/Body/Cell.d.ts +2 -0
  22. package/dist/DataPreviewTable/components/Body/Cell.js +9 -1
  23. package/dist/DataPreviewTable/components/Body/Cell.js.map +1 -1
  24. package/dist/DataPreviewTable/components/Body/index.d.ts +1 -0
  25. package/dist/DataPreviewTable/components/Body/index.js +35 -23
  26. package/dist/DataPreviewTable/components/Body/index.js.map +1 -1
  27. package/dist/DataPreviewTable/components/Header/index.d.ts +1 -0
  28. package/dist/DataPreviewTable/components/Header/index.js +36 -28
  29. package/dist/DataPreviewTable/components/Header/index.js.map +1 -1
  30. package/dist/DataPreviewTable/index.js +19 -2
  31. package/dist/DataPreviewTable/index.js.map +1 -1
  32. package/dist/Drawer/index.d.ts +4 -0
  33. package/dist/Drawer/index.js +93 -79
  34. package/dist/Drawer/index.js.map +1 -1
  35. package/dist/Dropdown/index.d.ts +1 -1
  36. package/dist/Dropdown/index.js +64 -13
  37. package/dist/Dropdown/index.js.map +1 -1
  38. package/dist/Form/FormItemContext.d.ts +1 -1
  39. package/dist/Form/FormItemContext.js.map +1 -1
  40. package/dist/Form/index.js +50 -7
  41. package/dist/Form/index.js.map +1 -1
  42. package/dist/IconButton/index.d.ts +2 -2
  43. package/dist/IconButton/index.js +9 -3
  44. package/dist/IconButton/index.js.map +1 -1
  45. package/dist/Input/components/Input/index.js +18 -8
  46. package/dist/Input/components/Input/index.js.map +1 -1
  47. package/dist/Input/components/TextArea/index.js +18 -7
  48. package/dist/Input/components/TextArea/index.js.map +1 -1
  49. package/dist/Input/privateSemanticOwner.d.ts +2 -0
  50. package/dist/Input/privateSemanticOwner.js +1 -0
  51. package/dist/InputNumber/index.js +16 -9
  52. package/dist/InputNumber/index.js.map +1 -1
  53. package/dist/InputNumber/type.d.ts +2 -2
  54. package/dist/LogicTree/components/LogicItem/index.d.ts +2 -1
  55. package/dist/LogicTree/components/LogicItem/index.js +13 -2
  56. package/dist/LogicTree/components/LogicItem/index.js.map +1 -1
  57. package/dist/LogicTree/index.js +2 -0
  58. package/dist/LogicTree/index.js.map +1 -1
  59. package/dist/MemberPicker/components/MemberSelection.d.ts +2 -0
  60. package/dist/MemberPicker/components/MemberSelection.js +15 -13
  61. package/dist/MemberPicker/components/MemberSelection.js.map +1 -1
  62. package/dist/MemberPicker/components/MultipleOption.js +12 -0
  63. package/dist/MemberPicker/components/MultipleOption.js.map +1 -1
  64. package/dist/MemberPicker/components/Panel.d.ts +2 -0
  65. package/dist/MemberPicker/components/Panel.js +11 -1
  66. package/dist/MemberPicker/components/Panel.js.map +1 -1
  67. package/dist/MemberPicker/components/PanelWrapper.js +2 -0
  68. package/dist/MemberPicker/components/PanelWrapper.js.map +1 -1
  69. package/dist/MemberPicker/components/SelectedMemberTags.js +14 -6
  70. package/dist/MemberPicker/components/SelectedMemberTags.js.map +1 -1
  71. package/dist/MemberPicker/components/SingleOption.js +12 -0
  72. package/dist/MemberPicker/components/SingleOption.js.map +1 -1
  73. package/dist/MemberPicker/components/UserGroupSelection.d.ts +3 -1
  74. package/dist/MemberPicker/components/UserGroupSelection.js +65 -42
  75. package/dist/MemberPicker/components/UserGroupSelection.js.map +1 -1
  76. package/dist/MemberPicker/index.js +134 -108
  77. package/dist/MemberPicker/index.js.map +1 -1
  78. package/dist/Menu/index.d.ts +8 -0
  79. package/dist/Menu/index.js +33 -3
  80. package/dist/Menu/index.js.map +1 -1
  81. package/dist/Modal/index.d.ts +4 -0
  82. package/dist/Modal/index.js +55 -66
  83. package/dist/Modal/index.js.map +1 -1
  84. package/dist/OverflowCount/index.js +10 -0
  85. package/dist/OverflowCount/index.js.map +1 -1
  86. package/dist/Pagination/index.js +1 -0
  87. package/dist/Pagination/index.js.map +1 -1
  88. package/dist/Popconfirm/index.js +9 -1
  89. package/dist/Popconfirm/index.js.map +1 -1
  90. package/dist/Popover/index.js +52 -1
  91. package/dist/Popover/index.js.map +1 -1
  92. package/dist/Progress/index.js +4 -0
  93. package/dist/Progress/index.js.map +1 -1
  94. package/dist/Radio/components/Group/index.d.ts +5 -1
  95. package/dist/Radio/components/Group/index.js +7 -2
  96. package/dist/Radio/components/Group/index.js.map +1 -1
  97. package/dist/Radio/components/Radio/index.js +26 -0
  98. package/dist/Radio/components/Radio/index.js.map +1 -1
  99. package/dist/Radio/interface/radio.d.ts +7 -0
  100. package/dist/Radio/interface/radioGroup.d.ts +2 -0
  101. package/dist/RenameInput/index.js +11 -0
  102. package/dist/RenameInput/index.js.map +1 -1
  103. package/dist/Select/BaseSelect.d.ts +3 -0
  104. package/dist/Select/BaseSelect.js +229 -32
  105. package/dist/Select/BaseSelect.js.map +1 -1
  106. package/dist/Select/SelectTrigger.d.ts +2 -0
  107. package/dist/Select/SelectTrigger.js +13 -5
  108. package/dist/Select/SelectTrigger.js.map +1 -1
  109. package/dist/Select/components/OptionCollection.d.ts +41 -0
  110. package/dist/Select/components/OptionCollection.js +124 -0
  111. package/dist/Select/components/OptionCollection.js.map +1 -0
  112. package/dist/Select/index.js +45 -3
  113. package/dist/Select/index.js.map +1 -1
  114. package/dist/Select/interface.d.ts +1 -1
  115. package/dist/Skeleton/index.js +1 -1
  116. package/dist/Skeleton/index.js.map +1 -1
  117. package/dist/Spin/index.d.ts +1 -1
  118. package/dist/Spin/index.js +22 -7
  119. package/dist/Spin/index.js.map +1 -1
  120. package/dist/Switch/index.d.ts +5 -0
  121. package/dist/Switch/index.js +15 -5
  122. package/dist/Switch/index.js.map +1 -1
  123. package/dist/Table/components/Header.js +0 -1
  124. package/dist/Table/components/Header.js.map +1 -1
  125. package/dist/Table/index.js +42 -27
  126. package/dist/Table/index.js.map +1 -1
  127. package/dist/Tabs/index.js +1 -0
  128. package/dist/Tabs/index.js.map +1 -1
  129. package/dist/Tag/index.js +20 -1
  130. package/dist/Tag/index.js.map +1 -1
  131. package/dist/Tooltip/index.js +34 -5
  132. package/dist/Tooltip/index.js.map +1 -1
  133. package/dist/Tour/index.js +13 -1
  134. package/dist/Tour/index.js.map +1 -1
  135. package/dist/Tree/Tree2.js +2 -0
  136. package/dist/Tree/Tree2.js.map +1 -1
  137. package/dist/_utils/dialogAccessibility.d.ts +17 -0
  138. package/dist/_utils/dialogAccessibility.js +110 -0
  139. package/dist/_utils/dialogAccessibility.js.map +1 -0
  140. package/dist/_utils/formControlSemanticOwner.d.ts +3 -0
  141. package/dist/_utils/formControlSemanticOwner.js +17 -0
  142. package/dist/_utils/formControlSemanticOwner.js.map +1 -0
  143. package/dist/_utils/overlayCoordinator.js +1 -11
  144. package/dist/_utils/overlayCoordinator.js.map +1 -1
  145. package/dist/aloudata-design.css +1 -1
  146. package/dist/governance/semantic.d.ts +1 -0
  147. package/dist/governance/semantic.js +2 -0
  148. package/dist/governance/semantic.json +1737 -0
  149. package/dist/theme/contract/baselineResolvedTokenValueManifest.d.ts +1 -1
  150. package/dist/theme/contract/darkResolvedTokenValueManifest.d.ts +1 -1
  151. package/dist/theme/contract/tokenOutputContract.js +1 -0
  152. package/dist/theme/contract/tokenOutputContract.js.map +1 -1
  153. package/dist/theme/generator/acceptedColorValues.d.ts +2 -1
  154. package/dist/theme/generator/baselineTokenValueDelivery.d.ts +9 -1
  155. package/dist/theme/generator/minimalAcceptedColorValues.d.ts +2 -2
  156. package/dist/theme/generator/neutralSourceResolver.d.ts +28 -0
  157. package/dist/theme/generator/neutralSourceResolver.js +2 -0
  158. package/dist/theme/generator/neutralSourceValues.d.ts +28 -0
  159. package/dist/theme/generator/neutralSourceValues.js +2 -0
  160. package/dist/theme/governance/semanticGovernanceContract.d.ts +91 -0
  161. package/dist/theme/governance/semanticGovernanceContract.js +342 -0
  162. package/dist/theme/governance/semanticGovernanceContract.js.map +1 -0
  163. package/dist/theme/index.d.ts +2 -0
  164. package/dist/theme/index.js +1 -0
  165. package/dist/theme/neutralSourceContract.d.ts +3 -0
  166. package/dist/theme/neutralSourceContract.js +11 -0
  167. package/dist/theme/neutralSourceContract.js.map +1 -0
  168. package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.d.ts +1 -1
  169. package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.js +46 -45
  170. package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.js.map +1 -1
  171. package/dist/theme/runtime/colorValueMode/generated/slateDarkDeclarations.d.ts +3 -0
  172. package/dist/theme/runtime/colorValueMode/generated/slateDarkDeclarations.js +2 -0
  173. package/dist/theme/runtime/colorValueMode/generated/slateLightDeclarations.d.ts +3 -0
  174. package/dist/theme/runtime/colorValueMode/generated/slateLightDeclarations.js +2 -0
  175. package/dist/theme/runtime/colorValueMode/generated/stoneDarkDeclarations.d.ts +3 -0
  176. package/dist/theme/runtime/colorValueMode/generated/stoneDarkDeclarations.js +2 -0
  177. package/dist/theme/runtime/colorValueMode/generated/stoneLightDeclarations.d.ts +3 -0
  178. package/dist/theme/runtime/colorValueMode/generated/stoneLightDeclarations.js +2 -0
  179. package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.d.ts +1 -1
  180. package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.js +42 -41
  181. package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.js.map +1 -1
  182. package/dist/theme/runtime/colorValueMode/index.js +2 -12
  183. package/dist/theme/runtime/colorValueMode/index.js.map +1 -1
  184. package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.d.ts +2 -0
  185. package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.js +48 -0
  186. package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.js.map +1 -0
  187. package/dist/theme/runtime/colorValueMode/registry.d.ts +1 -1
  188. package/dist/theme/runtime/colorValueMode/registry.js +2 -1
  189. package/dist/theme/runtime/colorValueMode/registry.js.map +1 -1
  190. package/dist/theme/runtime/initAldTheme.js +1 -3
  191. package/dist/theme/runtime/initAldTheme.js.map +1 -1
  192. package/dist/theme/runtime/neutralSource/index.d.ts +6 -0
  193. package/dist/theme/runtime/neutralSource/index.js +11 -0
  194. package/dist/theme/runtime/neutralSource/index.js.map +1 -0
  195. package/dist/theme/runtime/neutralSource.d.ts +2 -0
  196. package/package.json +12 -2
@@ -1,5 +1,6 @@
1
1
  import { PlacementType } from '../Dropdown';
2
2
  import { BaseSelectRef, ISelectProps, LabelInValueType, SelectMenuProps } from './interface.js';
3
+ import { SelectOptionCollection } from './components/OptionCollection.js';
3
4
  import * as React from 'react';
4
5
  /** Align config type (locally defined to avoid rc-trigger dependency) */
5
6
  export interface AlignType {
@@ -50,10 +51,12 @@ export interface BaseSelectProps extends BaseSelectPrivateProps, ISelectProps, R
50
51
  innerSearchValue?: string;
51
52
  setInnerSearchValue?: (value: string) => void;
52
53
  displayMenu?: SelectMenuProps;
54
+ optionCollection?: SelectOptionCollection;
53
55
  open?: boolean;
54
56
  defaultOpen?: boolean;
55
57
  onOpenChange?: (open: boolean) => void;
56
58
  onOptionSelect?: (val: RawValueType) => void;
59
+ onCollectionOptionSelect?: (val: RawValueType) => void;
57
60
  allowClear?: boolean;
58
61
  showArrow?: boolean;
59
62
  suffixIcon?: React.ReactNode;
@@ -10,12 +10,23 @@ import Selector from "./Selector/index.js";
10
10
  import { FormItemInputContext } from "../Form/FormItemContext.js";
11
11
  import getWidthStyle from "./utils/getWidthStyle.js";
12
12
  import { ConfigContext } from "../ConfigProvider/index.js";
13
+ import OptionCollection from "./components/OptionCollection.js";
13
14
  import * as React$1 from "react";
14
15
  import { useContext, useRef, useState } from "react";
15
- import { jsx, jsxs } from "react/jsx-runtime";
16
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
16
17
  import _ from "lodash";
17
18
  import useMergedState from "rc-util/es/hooks/useMergedState";
18
19
  //#region src/Select/BaseSelect.tsx
20
+ function splitAriaProps(props) {
21
+ return Object.keys(props).reduce((result, key) => {
22
+ if (key.startsWith("aria-")) result.ariaProps[key] = props[key];
23
+ else result.restProps[key] = props[key];
24
+ return result;
25
+ }, {
26
+ ariaProps: {},
27
+ restProps: {}
28
+ });
29
+ }
19
30
  function isMultiple(mode) {
20
31
  return !!mode;
21
32
  }
@@ -27,10 +38,16 @@ function isShowSelectedSection(mode) {
27
38
  return typeof mode === "object" && mode.showSelectedSection && mode.responsive;
28
39
  }
29
40
  var BaseSelect = React$1.forwardRef((props, ref) => {
30
- const { id, className, displayValues, onDisplayValuesChange, displayMenu, notFoundContent, onClear, width, mode, status: customStatus, onOptionSelect, onClick, size: customSize, borderLess = false, disabled, placeholder, loading = false, open, defaultOpen, onOpenChange, showSearch, innerSearchValue, setInnerSearchValue, allowClear, showArrow = true, prefix, suffixIcon, dropdownRender, overlayStyle, dropdownStyle, popupMatchSelectWidth = true, placement, popupClassName, allowOverlap, style, "data-testid": dataTestid, "aria-label": ariaLabel, ...restProps } = props;
41
+ const { id, className, displayValues, onDisplayValuesChange, displayMenu, optionCollection, notFoundContent, onClear, width, mode, status: customStatus, onOptionSelect, onCollectionOptionSelect, onClick, size: customSize, borderLess = false, disabled, placeholder, loading = false, open, defaultOpen, onOpenChange, showSearch, innerSearchValue, setInnerSearchValue, onInputKeyDown, allowClear, showArrow = true, prefix, suffixIcon, dropdownRender, overlayStyle, dropdownStyle, popupMatchSelectWidth = true, placement, popupClassName, allowOverlap, style, "data-testid": dataTestid, "aria-label": ariaLabel, ...restProps } = props;
42
+ const { ariaProps, restProps: passthroughProps } = React$1.useMemo(() => splitAriaProps(restProps), [restProps]);
43
+ const triggerAriaProps = React$1.useMemo(() => ({
44
+ ...ariaProps,
45
+ "aria-label": ariaLabel
46
+ }), [ariaLabel, ariaProps]);
31
47
  const setClassNames = prefixCls("select");
32
48
  const selectRef = useRef(null);
33
49
  const triggerRef = useRef(null);
50
+ const searchInputRef = useRef(null);
34
51
  const widthStyle = getWidthStyle(width);
35
52
  const dropdownRef = useRef(null);
36
53
  const [matchedPopupWidth, setMatchedPopupWidth] = useState();
@@ -44,8 +61,14 @@ var BaseSelect = React$1.forwardRef((props, ref) => {
44
61
  const { status: contextStatus } = useContext(FormItemInputContext);
45
62
  const mergedStatus = customStatus === null ? void 0 : customStatus || contextStatus;
46
63
  React$1.useImperativeHandle(ref, () => ({
47
- focus: () => triggerRef.current?.focus(),
48
- blur: () => triggerRef.current?.blur(),
64
+ focus: () => {
65
+ if (showSearch && optionCollection) searchInputRef.current?.focus();
66
+ else triggerRef.current?.focus();
67
+ },
68
+ blur: () => {
69
+ if (showSearch && optionCollection) searchInputRef.current?.blur();
70
+ else triggerRef.current?.blur();
71
+ },
49
72
  open: () => onToggleOpen(true),
50
73
  close: () => {
51
74
  console.log("ref close");
@@ -53,6 +76,19 @@ var BaseSelect = React$1.forwardRef((props, ref) => {
53
76
  }
54
77
  }));
55
78
  const [isHover, setIsHover] = useState(false);
79
+ const [activeOptionKey, setActiveOptionKey] = useState();
80
+ const [composingSearchValue, setComposingSearchValue] = useState();
81
+ const isComposingSearchRef = useRef(false);
82
+ const isSearchableCollection = !!optionCollection && !!showSearch;
83
+ const ownerAriaProps = React$1.useMemo(() => ({
84
+ ...triggerAriaProps,
85
+ "aria-busy": loading || triggerAriaProps["aria-busy"] || void 0,
86
+ "aria-invalid": triggerAriaProps["aria-invalid"] ?? (mergedStatus === "error" ? true : void 0)
87
+ }), [
88
+ loading,
89
+ mergedStatus,
90
+ triggerAriaProps
91
+ ]);
56
92
  const [innerOpen, setInnerOpen] = useMergedState(false, {
57
93
  defaultValue: defaultOpen,
58
94
  value: open
@@ -79,6 +115,22 @@ var BaseSelect = React$1.forwardRef((props, ref) => {
79
115
  onOpenChange,
80
116
  updateMatchedPopupWidth
81
117
  ]);
118
+ const getInitialActiveOptionKey = React$1.useCallback((position) => {
119
+ if (!optionCollection) return;
120
+ if (position === "last") return optionCollection.enabledOptions[optionCollection.enabledOptions.length - 1]?.key;
121
+ return optionCollection.options.find((option) => !option.disabled && displayValues.some((value) => toString(value.value) === toString(option.value)))?.key ?? optionCollection.enabledOptions[0]?.key;
122
+ }, [displayValues, optionCollection]);
123
+ React$1.useEffect(() => {
124
+ if (!optionCollection || !mergedOpen) {
125
+ setActiveOptionKey(void 0);
126
+ return;
127
+ }
128
+ setActiveOptionKey((current) => optionCollection.enabledOptions.some((option) => option.key === current) ? current : getInitialActiveOptionKey("first"));
129
+ }, [
130
+ getInitialActiveOptionKey,
131
+ mergedOpen,
132
+ optionCollection
133
+ ]);
82
134
  React$1.useLayoutEffect(() => {
83
135
  if (!mergedOpen || !shouldMatchPopupWidth) return;
84
136
  const element = selectRef.current;
@@ -164,6 +216,124 @@ var BaseSelect = React$1.forwardRef((props, ref) => {
164
216
  }
165
217
  }, []);
166
218
  const mergedPopupMatchSelectWidth = shouldMatchPopupWidth && matchedPopupWidth !== void 0 ? matchedPopupWidth : popupMatchSelectWidth;
219
+ const activeOptionId = optionCollection?.options.find((option) => option.key === activeOptionKey)?.id;
220
+ const moveActiveOption = React$1.useCallback((direction) => {
221
+ if (!optionCollection || optionCollection.enabledOptions.length === 0) return;
222
+ const currentIndex = optionCollection.enabledOptions.findIndex((option) => option.key === activeOptionKey);
223
+ const nextIndex = currentIndex === -1 ? direction === 1 ? 0 : optionCollection.enabledOptions.length - 1 : (currentIndex + direction + optionCollection.enabledOptions.length) % optionCollection.enabledOptions.length;
224
+ setActiveOptionKey(optionCollection.enabledOptions[nextIndex].key);
225
+ }, [activeOptionKey, optionCollection]);
226
+ const typeaheadRef = useRef({
227
+ value: "",
228
+ timestamp: 0
229
+ });
230
+ const onCollectionKeyDown = React$1.useCallback((event) => {
231
+ if (!optionCollection || disabled) return;
232
+ const openCollection = (position) => {
233
+ event.preventDefault();
234
+ setActiveOptionKey(getInitialActiveOptionKey(position));
235
+ onToggleOpen(true);
236
+ };
237
+ if (!mergedOpen) {
238
+ if (event.key === "ArrowDown") openCollection("first");
239
+ else if (event.key === "ArrowUp") openCollection("last");
240
+ else if (event.key === "Enter" || event.key === " ") openCollection("first");
241
+ return;
242
+ }
243
+ if (event.key === "ArrowDown") {
244
+ event.preventDefault();
245
+ moveActiveOption(1);
246
+ return;
247
+ }
248
+ if (event.key === "ArrowUp") {
249
+ event.preventDefault();
250
+ moveActiveOption(-1);
251
+ return;
252
+ }
253
+ if (event.key === "Home") {
254
+ event.preventDefault();
255
+ setActiveOptionKey(optionCollection.enabledOptions[0]?.key);
256
+ return;
257
+ }
258
+ if (event.key === "End") {
259
+ event.preventDefault();
260
+ setActiveOptionKey(optionCollection.enabledOptions[optionCollection.enabledOptions.length - 1]?.key);
261
+ return;
262
+ }
263
+ if (event.key === "Enter" || event.key === " ") {
264
+ event.preventDefault();
265
+ const activeOption = optionCollection.options.find((option) => option.key === activeOptionKey);
266
+ if (activeOption && !activeOption.disabled) {
267
+ if (!isMultipleMode) onToggleOpen(false);
268
+ onCollectionOptionSelect?.(activeOption.value);
269
+ }
270
+ return;
271
+ }
272
+ if (event.key === "Escape") {
273
+ event.preventDefault();
274
+ onToggleOpen(false);
275
+ if (isSearchableCollection) searchInputRef.current?.focus();
276
+ else triggerRef.current?.focus();
277
+ return;
278
+ }
279
+ if (event.key === "Tab") {
280
+ onToggleOpen(false);
281
+ return;
282
+ }
283
+ if (event.key.length === 1 && !event.altKey && !event.ctrlKey && !event.metaKey) {
284
+ const now = Date.now();
285
+ const query = now - typeaheadRef.current.timestamp > 500 ? event.key : `${typeaheadRef.current.value}${event.key}`;
286
+ typeaheadRef.current = {
287
+ value: query,
288
+ timestamp: now
289
+ };
290
+ const normalizedQuery = query.toLocaleLowerCase();
291
+ const activeIndex = optionCollection.enabledOptions.findIndex((option) => option.key === activeOptionKey);
292
+ const match = [...optionCollection.enabledOptions.slice(activeIndex + 1), ...optionCollection.enabledOptions.slice(0, activeIndex + 1)].find((option) => String(option.label ?? option.value).toLocaleLowerCase().startsWith(normalizedQuery));
293
+ if (match) {
294
+ event.preventDefault();
295
+ setActiveOptionKey(match.key);
296
+ }
297
+ }
298
+ }, [
299
+ activeOptionKey,
300
+ disabled,
301
+ getInitialActiveOptionKey,
302
+ mergedOpen,
303
+ moveActiveOption,
304
+ onCollectionOptionSelect,
305
+ onToggleOpen,
306
+ optionCollection,
307
+ isSearchableCollection
308
+ ]);
309
+ const onSearchInputKeyDown = React$1.useCallback((event) => {
310
+ onInputKeyDown?.(event);
311
+ if (event.defaultPrevented) return;
312
+ if (event.key === " " || event.key.length === 1 && !event.altKey && !event.ctrlKey && !event.metaKey) return;
313
+ onCollectionKeyDown(event);
314
+ }, [onCollectionKeyDown, onInputKeyDown]);
315
+ const onSearchInputChange = React$1.useCallback((event) => {
316
+ const nextValue = event.target.value;
317
+ if (isComposingSearchRef.current) {
318
+ setComposingSearchValue(nextValue);
319
+ return;
320
+ }
321
+ setInnerSearchValue?.(nextValue);
322
+ }, [setInnerSearchValue]);
323
+ const searchInputValue = composingSearchValue ?? innerSearchValue ?? "";
324
+ const collectionContent = optionCollection ? /* @__PURE__ */ jsx(OptionCollection, {
325
+ collection: optionCollection,
326
+ selectedValues: displayValues.map((item) => item.value),
327
+ activeOptionKey,
328
+ multiple: isMultipleMode,
329
+ loading,
330
+ listHeight: props.listHeight ?? 256,
331
+ notFoundContent,
332
+ onSelect: (value) => {
333
+ if (!isMultipleMode) onToggleOpen(false);
334
+ onCollectionOptionSelect?.(value);
335
+ }
336
+ }) : void 0;
167
337
  return /* @__PURE__ */ jsxs("div", {
168
338
  className: mergedClassName,
169
339
  style: {
@@ -177,10 +347,11 @@ var BaseSelect = React$1.forwardRef((props, ref) => {
177
347
  "data-testid": dataTestid,
178
348
  "aria-label": ariaLabel,
179
349
  children: [/* @__PURE__ */ jsx(RefSelectTrigger, {
180
- ...restProps,
350
+ ...passthroughProps,
181
351
  open: !!mergedOpen,
182
352
  notFoundContent,
183
353
  menu: showMenu,
354
+ collection: collectionContent,
184
355
  ref: dropdownRef,
185
356
  showSearch,
186
357
  searchValue: innerSearchValue,
@@ -197,35 +368,61 @@ var BaseSelect = React$1.forwardRef((props, ref) => {
197
368
  else onToggleOpen(open);
198
369
  },
199
370
  children: /* @__PURE__ */ jsxs("div", {
371
+ ...!isSearchableCollection ? ownerAriaProps : {},
200
372
  ref: triggerRef,
201
- tabIndex: disabled ? void 0 : 0,
202
- role: "combobox",
203
- "aria-disabled": disabled || void 0,
204
- "aria-expanded": mergedOpen,
373
+ tabIndex: isSearchableCollection || disabled ? void 0 : 0,
374
+ role: isSearchableCollection ? void 0 : "combobox",
375
+ "aria-disabled": isSearchableCollection ? void 0 : disabled || void 0,
376
+ "aria-expanded": isSearchableCollection ? void 0 : mergedOpen,
377
+ "aria-haspopup": isSearchableCollection ? void 0 : optionCollection ? "listbox" : void 0,
378
+ "aria-controls": isSearchableCollection ? void 0 : mergedOpen && optionCollection ? optionCollection.listboxId : void 0,
379
+ "aria-activedescendant": isSearchableCollection ? void 0 : mergedOpen && optionCollection ? activeOptionId : void 0,
380
+ onKeyDown: isSearchableCollection ? void 0 : optionCollection ? onCollectionKeyDown : void 0,
205
381
  className: cn(setClassNames("trigger"), "ant-select-selector"),
206
- children: [
207
- prefix && /* @__PURE__ */ jsx("div", {
208
- className: setClassNames("prefix"),
209
- children: prefix
210
- }),
211
- _.isEmpty(displayValues) && /* @__PURE__ */ jsx("div", {
212
- className: cn(setClassNames("placeholder"), "ant-select-selection-placeholder"),
213
- children: placeholder
214
- }),
215
- !_.isEmpty(displayValues) && /* @__PURE__ */ jsx(Selector, {
216
- ...restProps,
217
- suffixIcon,
218
- size,
219
- disabled,
220
- mode,
221
- dropdownRef,
222
- displayValues,
223
- onToggleOpen,
224
- onRemove: onSelectorRemove,
225
- showResponsiveSelectedSection,
226
- onOverflowCollapsedChange: setOverflowCollapsed
227
- })
228
- ]
382
+ children: [prefix && /* @__PURE__ */ jsx("div", {
383
+ className: setClassNames("prefix"),
384
+ children: prefix
385
+ }), isSearchableCollection ? /* @__PURE__ */ jsx("input", {
386
+ ...ownerAriaProps,
387
+ ref: searchInputRef,
388
+ type: "text",
389
+ role: "combobox",
390
+ className: setClassNames("search-input"),
391
+ value: searchInputValue,
392
+ disabled,
393
+ placeholder: typeof placeholder === "string" ? placeholder : void 0,
394
+ "aria-disabled": disabled || void 0,
395
+ "aria-expanded": mergedOpen,
396
+ "aria-haspopup": "listbox",
397
+ "aria-controls": mergedOpen ? optionCollection?.listboxId : void 0,
398
+ "aria-activedescendant": mergedOpen ? activeOptionId : void 0,
399
+ onFocus: () => onToggleOpen(true),
400
+ onChange: onSearchInputChange,
401
+ onCompositionStart: () => {
402
+ isComposingSearchRef.current = true;
403
+ },
404
+ onCompositionEnd: (event) => {
405
+ isComposingSearchRef.current = false;
406
+ setComposingSearchValue(void 0);
407
+ setInnerSearchValue?.(event.currentTarget.value);
408
+ },
409
+ onKeyDown: onSearchInputKeyDown
410
+ }) : /* @__PURE__ */ jsxs(Fragment, { children: [_.isEmpty(displayValues) && /* @__PURE__ */ jsx("div", {
411
+ className: cn(setClassNames("placeholder"), "ant-select-selection-placeholder"),
412
+ children: placeholder
413
+ }), !_.isEmpty(displayValues) && /* @__PURE__ */ jsx(Selector, {
414
+ ...passthroughProps,
415
+ suffixIcon,
416
+ size,
417
+ disabled,
418
+ mode,
419
+ dropdownRef,
420
+ displayValues,
421
+ onToggleOpen,
422
+ onRemove: onSelectorRemove,
423
+ showResponsiveSelectedSection,
424
+ onOverflowCollapsedChange: setOverflowCollapsed
425
+ })] })]
229
426
  })
230
427
  }), /* @__PURE__ */ jsx(Suffix, {
231
428
  showArrow,
@@ -1 +1 @@
1
- {"version":3,"file":"BaseSelect.js","names":[],"sources":["../../src/Select/BaseSelect.tsx"],"sourcesContent":["import './ald-select.css';\nimport * as React from 'react';\nimport useMergedState from 'rc-util/es/hooks/useMergedState';\nimport { cn } from '../lib/utils';\nimport prefixCls from '../_utils/prefixCls';\n\n/** Align config type (locally defined to avoid rc-trigger dependency) */\nexport interface AlignType {\n points?: string[];\n offset?: (number | string)[];\n targetOffset?: (number | string)[];\n overflow?: { adjustX?: boolean; adjustY?: boolean };\n _experimental?: Record<string, any>;\n}\nimport SelectTrigger, { RefTriggerProps } from './SelectTrigger';\nimport Selector from './Selector';\nimport _ from 'lodash';\nimport { useContext, useRef, useState } from 'react';\nimport { FormItemInputContext } from '../Form/FormItemContext';\nimport getWidthStyle from './utils/getWidthStyle';\nimport Suffix from './components/Suffix';\nimport { PlacementType } from '../Dropdown';\nimport {\n BaseSelectRef,\n DisplayValueType,\n ISelectProps,\n LabelInValueType,\n SelectMenuProps,\n} from './interface';\nimport SizeContext from '../ConfigProvider/sizeContext';\nimport { ConfigContext } from '../ConfigProvider';\nimport { useCompactItemContext } from '../Space/CompactContext';\nimport { MenuInfo } from '../Menu';\nimport { toString } from './utils/commonUtil';\n\nexport type RenderNode = React.ReactNode | ((props: any) => React.ReactNode);\n\nexport type RenderDOMFunc = (props: any) => HTMLElement;\n\nexport type Mode =\n | 'multiple'\n | {\n type: 'multiple';\n responsive?: boolean;\n maxRows?: number;\n showSelectedSection?: boolean;\n };\n\nexport type RawValueType = string | number;\n\nexport type CustomTagProps = {\n label: React.ReactNode;\n value: any;\n disabled: boolean;\n onClose: (event?: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n closable: boolean;\n};\nexport interface BaseSelectPrivateProps {\n // >>> MISC\n omitDomProps?: string[];\n\n // >>> Value\n displayValues: LabelInValueType[];\n onDisplayValuesChange: (\n values: LabelInValueType[],\n info: {\n type: 'add' | 'remove' | 'clear';\n values: LabelInValueType[];\n },\n ) => void;\n\n // >>> Active\n /** Current dropdown list active item string value */\n activeValue?: string;\n /** Link search input with target element */\n activeDescendantId?: string;\n onActiveValueChange?: (value: string | null) => void;\n}\n\nexport type BaseSelectPropsWithoutPrivate = Omit<\n BaseSelectProps,\n keyof BaseSelectPrivateProps\n>;\n\nexport interface BaseSelectProps\n extends BaseSelectPrivateProps,\n ISelectProps,\n React.AriaAttributes {\n className?: string;\n style?: React.CSSProperties;\n notFoundContent?: React.ReactNode;\n onClear?: () => void;\n innerSearchValue?: string;\n setInnerSearchValue?: (value: string) => void;\n displayMenu?: SelectMenuProps;\n // >>> Open\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n onOptionSelect?: (val: RawValueType) => void;\n\n // >>> Icons\n allowClear?: boolean;\n showArrow?: boolean;\n suffixIcon?: React.ReactNode;\n\n // >>> Dropdown\n dropdownAlign?: AlignType;\n placement?: PlacementType;\n getPopupContainer?: () => HTMLElement;\n\n // >>> Focus\n onBlur?: React.FocusEventHandler<HTMLElement>;\n onFocus?: React.FocusEventHandler<HTMLElement>;\n\n // >>> Rest Events\n onKeyUp?: React.KeyboardEventHandler<HTMLDivElement>;\n onKeyDown?: React.KeyboardEventHandler<HTMLDivElement>;\n onMouseDown?: React.MouseEventHandler<HTMLDivElement>;\n onPopupScroll?: React.UIEventHandler<HTMLDivElement>;\n onInputKeyDown?: React.KeyboardEventHandler<\n HTMLInputElement | HTMLTextAreaElement\n >;\n onMouseEnter?: React.MouseEventHandler<HTMLDivElement>;\n onMouseLeave?: React.MouseEventHandler<HTMLDivElement>;\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n}\n\nexport function isMultiple(mode?: Mode) {\n return !!mode;\n}\nexport function isResponsive(mode?: Mode) {\n return mode === 'multiple' || (typeof mode === 'object' && mode?.responsive);\n}\nexport function isShowSelectedSection(mode?: Mode) {\n if (!mode || mode === 'multiple') {\n return false;\n }\n\n return (\n typeof mode === 'object' && mode.showSelectedSection && mode.responsive\n );\n}\nconst BaseSelect = React.forwardRef(\n (props: BaseSelectProps, ref: React.Ref<BaseSelectRef>) => {\n const {\n id,\n className,\n // Value\n displayValues,\n onDisplayValuesChange,\n displayMenu,\n notFoundContent,\n onClear,\n width,\n mode,\n status: customStatus,\n onOptionSelect,\n onClick,\n size: customSize,\n borderLess = false,\n // Status\n disabled,\n placeholder,\n loading = false,\n\n // Open\n open,\n defaultOpen,\n onOpenChange,\n showSearch,\n innerSearchValue,\n setInnerSearchValue,\n // Icons\n allowClear,\n showArrow = true,\n prefix,\n suffixIcon,\n dropdownRender,\n overlayStyle,\n dropdownStyle,\n popupMatchSelectWidth = true,\n placement,\n popupClassName,\n allowOverlap,\n style,\n 'data-testid': dataTestid,\n 'aria-label': ariaLabel,\n ...restProps\n // Rest Props\n } = props;\n const setClassNames = prefixCls('select');\n const selectRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const widthStyle = getWidthStyle(width);\n const dropdownRef = useRef<RefTriggerProps>(null);\n const [matchedPopupWidth, setMatchedPopupWidth] = useState<\n number | undefined\n >();\n const isResponsiveMode = isResponsive(mode);\n const isMultipleMode = isMultiple(mode);\n /** Used for component focused management */\n const contentSize = useContext(SizeContext);\n const { direction } = React.useContext(ConfigContext);\n // ===================== Compact Item =====================\n const { compactSize, compactItemClassnames } = useCompactItemContext(\n 'ald-select',\n direction,\n );\n const size = compactSize || customSize || contentSize || 'middle';\n const {\n status: contextStatus,\n // hasFeedback,\n // isFormItemInput,\n // feedbackIcon,\n } = useContext(FormItemInputContext);\n\n const mergedStatus =\n customStatus === null ? undefined : customStatus || contextStatus;\n\n // =========================== Imperative ===========================\n React.useImperativeHandle(ref, () => ({\n // The trigger is the Select focus owner. Keeping this as a real DOM\n // focus target makes keyboard focus, the Focus State Layer, and the\n // public imperative API describe the same element.\n focus: () => triggerRef.current?.focus(),\n blur: () => triggerRef.current?.blur(),\n open: () => onToggleOpen(true),\n close: () => {\n console.log('ref close');\n onToggleOpen(false);\n },\n }));\n const [isHover, setIsHover] = useState(false);\n // ============================== Open ==============================\n const [innerOpen, setInnerOpen] = useMergedState<boolean>(false, {\n defaultValue: defaultOpen,\n value: open,\n });\n const mergedOpen = innerOpen;\n const shouldMatchPopupWidth =\n !!popupMatchSelectWidth && typeof popupMatchSelectWidth !== 'number';\n const updateMatchedPopupWidth = React.useCallback(() => {\n if (!shouldMatchPopupWidth) {\n return;\n }\n\n const nextWidth = selectRef.current?.getBoundingClientRect().width;\n if (nextWidth !== undefined) {\n setMatchedPopupWidth((currentWidth) =>\n currentWidth === nextWidth ? currentWidth : nextWidth,\n );\n }\n }, [shouldMatchPopupWidth]);\n const onToggleOpen = React.useCallback(\n (newOpen?: boolean) => {\n const nextOpen = newOpen !== undefined ? newOpen : !mergedOpen;\n if (nextOpen) {\n updateMatchedPopupWidth();\n }\n if (!nextOpen) {\n setShowResponsiveSelectedSection(false);\n }\n if (mergedOpen !== nextOpen && !disabled) {\n setInnerOpen(nextOpen);\n onOpenChange?.(nextOpen);\n }\n },\n [\n mergedOpen,\n disabled,\n setInnerOpen,\n onOpenChange,\n updateMatchedPopupWidth,\n ],\n );\n React.useLayoutEffect(() => {\n if (!mergedOpen || !shouldMatchPopupWidth) {\n return;\n }\n\n const element = selectRef.current;\n if (!element) {\n return;\n }\n\n const updateMatchedWidth = () => {\n const nextWidth = element.getBoundingClientRect().width;\n setMatchedPopupWidth((currentWidth) =>\n currentWidth === nextWidth ? currentWidth : nextWidth,\n );\n };\n\n updateMatchedWidth();\n\n if (typeof ResizeObserver === 'undefined') {\n window.addEventListener('resize', updateMatchedWidth);\n return () => {\n window.removeEventListener('resize', updateMatchedWidth);\n };\n }\n\n let resizeAnimationFrame: number | undefined;\n const scheduleMatchedWidthUpdate = () => {\n if (resizeAnimationFrame !== undefined) {\n cancelAnimationFrame(resizeAnimationFrame);\n }\n resizeAnimationFrame = requestAnimationFrame(updateMatchedWidth);\n };\n\n const observer = new ResizeObserver(scheduleMatchedWidthUpdate);\n observer.observe(element);\n\n return () => {\n if (resizeAnimationFrame !== undefined) {\n cancelAnimationFrame(resizeAnimationFrame);\n }\n observer.disconnect();\n };\n }, [mergedOpen, shouldMatchPopupWidth]);\n const [showResponsiveSelectedSection, setShowResponsiveSelectedSection] =\n useState(false);\n // 多选 responsive 进入 -1 收纳态(仅\"首 tag + +N\")时为 true,\n // width:auto 下据此给根节点加 overflow-collapsed 钳住 min-width 链,\n // 抵抗父 flex 行因 intrinsic 低估造成的假压缩(详见 ald-select.css 对应段)\n const [overflowCollapsed, setOverflowCollapsed] = useState(false);\n\n // ============================ Selector ============================\n const onSelectorRemove = (val: DisplayValueType) => {\n const newValues = displayValues.filter(\n (item) => toString(item.value) !== toString(val.value),\n );\n\n onDisplayValuesChange(newValues, {\n type: 'remove',\n values: [\n {\n label: val.label,\n value: val.value as RawValueType,\n },\n ],\n });\n };\n\n const mergedClassName = cn(\n setClassNames('beta-ald-select', size, {\n // Popup visibility is not focus. The trigger's :focus-visible state\n // owns the Focus State Layer in ald-select.css.\n open: mergedOpen,\n // Retain the legacy hook for consumers that style the open state.\n // It no longer represents trigger focus.\n active: mergedOpen,\n borderless: borderLess,\n disabled: disabled,\n loading: loading,\n [`${mergedStatus}`]: !!mergedStatus,\n 'multiple-responsive': isResponsiveMode,\n 'multiple-default': isMultipleMode && !isResponsiveMode,\n // 仅 width:auto 生效:固定宽度下 -1 收纳态的收缩省略是预期行为,\n // 钳 min-width 反而会把固定宽撑破\n 'overflow-collapsed':\n overflowCollapsed && width === 'auto' && !_.isEmpty(displayValues),\n }),\n 'tw-text-typography-body-dense',\n className,\n compactItemClassnames,\n );\n const showMenu = React.useMemo(() => {\n if (!displayMenu) {\n return undefined;\n }\n\n return {\n ...displayMenu,\n onClick: (info: MenuInfo) => {\n displayMenu?.onClick?.(info);\n if (isMultipleMode) {\n // 多选默认选中后不收起下拉:Dropdown 在 menu.onClick 之后读\n // info.keepOpen 决定是否 onChangeOpen(false),不设则每次点击都被\n // 当成关闭信号。用 ?? 保留用户在自己的 onClick 里显式设 false 的能力\n info.keepOpen = info.keepOpen ?? true;\n } else if (displayMenu) {\n onToggleOpen(false);\n }\n setIsHover(false);\n onOptionSelect?.(info.key);\n },\n };\n }, [displayMenu, isMultipleMode, onToggleOpen, onOptionSelect]);\n const onSelectClick = React.useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) {\n return;\n }\n onClick?.(e);\n },\n [disabled, onClick],\n );\n React.useEffect(() => {\n const element = selectRef.current;\n if (element) {\n const handleMouseOver = () => setIsHover(true);\n const handleMouseOut = () => setIsHover(false);\n\n element.addEventListener('mouseover', handleMouseOver);\n element.addEventListener('mouseout', handleMouseOut);\n\n return () => {\n element.removeEventListener('mouseover', handleMouseOver);\n element.removeEventListener('mouseout', handleMouseOut);\n };\n }\n }, []);\n const mergedPopupMatchSelectWidth =\n shouldMatchPopupWidth && matchedPopupWidth !== undefined\n ? matchedPopupWidth\n : popupMatchSelectWidth;\n return (\n <div\n className={mergedClassName}\n style={{\n ...widthStyle,\n // width:auto 且无选中值时锁 shrink:Chromium 对该子树给父 flex 行的\n // intrinsic 宽度贡献恒少约 14px,父行按低估值布局后回头压缩根节点,\n // placeholder 右侧会被裁;有选中值时必须保持可压缩,rc-overflow\n // 才能在父行变窄时把放不下的 tag 收纳成 \"+N\"\n ...(width === 'auto' && _.isEmpty(displayValues)\n ? { flexShrink: 0 }\n : {}),\n ...style,\n }}\n ref={selectRef}\n id={id}\n onClick={onSelectClick}\n data-testid={dataTestid}\n aria-label={ariaLabel}\n >\n <SelectTrigger\n {...restProps}\n open={!!mergedOpen}\n notFoundContent={notFoundContent}\n menu={showMenu}\n ref={dropdownRef}\n showSearch={showSearch}\n searchValue={innerSearchValue}\n setInnerSearchValue={setInnerSearchValue}\n popupMatchSelectWidth={mergedPopupMatchSelectWidth}\n overlayClassName={popupClassName}\n // @ts-ignore\n dropdownRender={dropdownRender}\n overlayStyle={overlayStyle || dropdownStyle}\n placement={placement}\n allowOverlap={allowOverlap}\n onOpenChange={(open) => {\n if (isResponsiveMode) {\n if (\n !mergedOpen &&\n !showResponsiveSelectedSection &&\n displayValues.length > 0 &&\n isShowSelectedSection(mode)\n ) {\n setShowResponsiveSelectedSection(true);\n } else {\n onToggleOpen(open);\n }\n } else {\n onToggleOpen(open);\n }\n }}\n >\n {/* antd 兼容:保留 ant-* class,消费方 CSS 可能依赖该选择器 */}\n <div\n ref={triggerRef}\n tabIndex={disabled ? undefined : 0}\n role=\"combobox\"\n aria-disabled={disabled || undefined}\n aria-expanded={mergedOpen}\n className={cn(setClassNames('trigger'), 'ant-select-selector')}\n >\n {prefix && <div className={setClassNames('prefix')}>{prefix}</div>}\n {_.isEmpty(displayValues) && (\n <div\n className={cn(\n setClassNames('placeholder'),\n 'ant-select-selection-placeholder',\n )}\n >\n {placeholder}\n </div>\n )}\n {!_.isEmpty(displayValues) && (\n <Selector\n {...restProps}\n suffixIcon={suffixIcon}\n size={size}\n disabled={disabled}\n mode={mode}\n dropdownRef={dropdownRef}\n displayValues={displayValues}\n onToggleOpen={onToggleOpen}\n onRemove={onSelectorRemove}\n showResponsiveSelectedSection={showResponsiveSelectedSection}\n onOverflowCollapsedChange={setOverflowCollapsed}\n ></Selector>\n )}\n </div>\n </SelectTrigger>\n <Suffix\n showArrow={showArrow}\n allowClear={allowClear}\n disabled={disabled}\n loading={loading}\n isHover={isHover}\n onClear={() => {\n onToggleOpen(false);\n\n onDisplayValuesChange([], {\n type: 'clear',\n values: displayValues,\n });\n onClear?.();\n }}\n isActive={innerOpen}\n icon={suffixIcon}\n displayValues={displayValues}\n ></Suffix>\n </div>\n );\n },\n);\n\nexport default BaseSelect;\n"],"mappings":"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"}
1
+ {"version":3,"file":"BaseSelect.js","names":[],"sources":["../../src/Select/BaseSelect.tsx"],"sourcesContent":["import './ald-select.css';\nimport * as React from 'react';\nimport useMergedState from 'rc-util/es/hooks/useMergedState';\nimport { cn } from '../lib/utils';\nimport prefixCls from '../_utils/prefixCls';\n\n/** Align config type (locally defined to avoid rc-trigger dependency) */\nexport interface AlignType {\n points?: string[];\n offset?: (number | string)[];\n targetOffset?: (number | string)[];\n overflow?: { adjustX?: boolean; adjustY?: boolean };\n _experimental?: Record<string, any>;\n}\nimport SelectTrigger, { RefTriggerProps } from './SelectTrigger';\nimport Selector from './Selector';\nimport _ from 'lodash';\nimport { useContext, useRef, useState } from 'react';\nimport { FormItemInputContext } from '../Form/FormItemContext';\nimport getWidthStyle from './utils/getWidthStyle';\nimport Suffix from './components/Suffix';\nimport { PlacementType } from '../Dropdown';\nimport {\n BaseSelectRef,\n DisplayValueType,\n ISelectProps,\n LabelInValueType,\n SelectMenuProps,\n} from './interface';\nimport SizeContext from '../ConfigProvider/sizeContext';\nimport { ConfigContext } from '../ConfigProvider';\nimport { useCompactItemContext } from '../Space/CompactContext';\nimport { MenuInfo } from '../Menu';\nimport { toString } from './utils/commonUtil';\nimport OptionCollection, {\n SelectOptionCollection,\n} from './components/OptionCollection';\n\nexport type RenderNode = React.ReactNode | ((props: any) => React.ReactNode);\n\nexport type RenderDOMFunc = (props: any) => HTMLElement;\n\nexport type Mode =\n | 'multiple'\n | {\n type: 'multiple';\n responsive?: boolean;\n maxRows?: number;\n showSelectedSection?: boolean;\n };\n\nexport type RawValueType = string | number;\n\nfunction splitAriaProps(props: Record<string, any>) {\n return Object.keys(props).reduce<{\n ariaProps: Record<string, any>;\n restProps: Record<string, any>;\n }>(\n (result, key) => {\n if (key.startsWith('aria-')) {\n result.ariaProps[key] = props[key];\n } else {\n result.restProps[key] = props[key];\n }\n return result;\n },\n { ariaProps: {}, restProps: {} },\n );\n}\n\nexport type CustomTagProps = {\n label: React.ReactNode;\n value: any;\n disabled: boolean;\n onClose: (event?: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n closable: boolean;\n};\nexport interface BaseSelectPrivateProps {\n // >>> MISC\n omitDomProps?: string[];\n\n // >>> Value\n displayValues: LabelInValueType[];\n onDisplayValuesChange: (\n values: LabelInValueType[],\n info: {\n type: 'add' | 'remove' | 'clear';\n values: LabelInValueType[];\n },\n ) => void;\n\n // >>> Active\n /** Current dropdown list active item string value */\n activeValue?: string;\n /** Link search input with target element */\n activeDescendantId?: string;\n onActiveValueChange?: (value: string | null) => void;\n}\n\nexport type BaseSelectPropsWithoutPrivate = Omit<\n BaseSelectProps,\n keyof BaseSelectPrivateProps\n>;\n\nexport interface BaseSelectProps\n extends BaseSelectPrivateProps,\n ISelectProps,\n React.AriaAttributes {\n className?: string;\n style?: React.CSSProperties;\n notFoundContent?: React.ReactNode;\n onClear?: () => void;\n innerSearchValue?: string;\n setInnerSearchValue?: (value: string) => void;\n displayMenu?: SelectMenuProps;\n optionCollection?: SelectOptionCollection;\n // >>> Open\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n onOptionSelect?: (val: RawValueType) => void;\n onCollectionOptionSelect?: (val: RawValueType) => void;\n\n // >>> Icons\n allowClear?: boolean;\n showArrow?: boolean;\n suffixIcon?: React.ReactNode;\n\n // >>> Dropdown\n dropdownAlign?: AlignType;\n placement?: PlacementType;\n getPopupContainer?: () => HTMLElement;\n\n // >>> Focus\n onBlur?: React.FocusEventHandler<HTMLElement>;\n onFocus?: React.FocusEventHandler<HTMLElement>;\n\n // >>> Rest Events\n onKeyUp?: React.KeyboardEventHandler<HTMLDivElement>;\n onKeyDown?: React.KeyboardEventHandler<HTMLDivElement>;\n onMouseDown?: React.MouseEventHandler<HTMLDivElement>;\n onPopupScroll?: React.UIEventHandler<HTMLDivElement>;\n onInputKeyDown?: React.KeyboardEventHandler<\n HTMLInputElement | HTMLTextAreaElement\n >;\n onMouseEnter?: React.MouseEventHandler<HTMLDivElement>;\n onMouseLeave?: React.MouseEventHandler<HTMLDivElement>;\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n}\n\nexport function isMultiple(mode?: Mode) {\n return !!mode;\n}\nexport function isResponsive(mode?: Mode) {\n return mode === 'multiple' || (typeof mode === 'object' && mode?.responsive);\n}\nexport function isShowSelectedSection(mode?: Mode) {\n if (!mode || mode === 'multiple') {\n return false;\n }\n\n return (\n typeof mode === 'object' && mode.showSelectedSection && mode.responsive\n );\n}\nconst BaseSelect = React.forwardRef(\n (props: BaseSelectProps, ref: React.Ref<BaseSelectRef>) => {\n const {\n id,\n className,\n // Value\n displayValues,\n onDisplayValuesChange,\n displayMenu,\n optionCollection,\n notFoundContent,\n onClear,\n width,\n mode,\n status: customStatus,\n onOptionSelect,\n onCollectionOptionSelect,\n onClick,\n size: customSize,\n borderLess = false,\n // Status\n disabled,\n placeholder,\n loading = false,\n\n // Open\n open,\n defaultOpen,\n onOpenChange,\n showSearch,\n innerSearchValue,\n setInnerSearchValue,\n onInputKeyDown,\n // Icons\n allowClear,\n showArrow = true,\n prefix,\n suffixIcon,\n dropdownRender,\n overlayStyle,\n dropdownStyle,\n popupMatchSelectWidth = true,\n placement,\n popupClassName,\n allowOverlap,\n style,\n 'data-testid': dataTestid,\n 'aria-label': ariaLabel,\n ...restProps\n // Rest Props\n } = props;\n const { ariaProps, restProps: passthroughProps } = React.useMemo(\n () => splitAriaProps(restProps),\n [restProps],\n );\n const triggerAriaProps = React.useMemo<React.AriaAttributes>(\n () => ({\n ...ariaProps,\n 'aria-label': ariaLabel,\n }),\n [ariaLabel, ariaProps],\n );\n const setClassNames = prefixCls('select');\n const selectRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLDivElement>(null);\n const searchInputRef = useRef<HTMLInputElement>(null);\n const widthStyle = getWidthStyle(width);\n const dropdownRef = useRef<RefTriggerProps>(null);\n const [matchedPopupWidth, setMatchedPopupWidth] = useState<\n number | undefined\n >();\n const isResponsiveMode = isResponsive(mode);\n const isMultipleMode = isMultiple(mode);\n /** Used for component focused management */\n const contentSize = useContext(SizeContext);\n const { direction } = React.useContext(ConfigContext);\n // ===================== Compact Item =====================\n const { compactSize, compactItemClassnames } = useCompactItemContext(\n 'ald-select',\n direction,\n );\n const size = compactSize || customSize || contentSize || 'middle';\n const {\n status: contextStatus,\n // hasFeedback,\n // isFormItemInput,\n // feedbackIcon,\n } = useContext(FormItemInputContext);\n\n const mergedStatus =\n customStatus === null ? undefined : customStatus || contextStatus;\n\n // =========================== Imperative ===========================\n React.useImperativeHandle(ref, () => ({\n // The trigger is the Select focus owner. Keeping this as a real DOM\n // focus target makes keyboard focus, the Focus State Layer, and the\n // public imperative API describe the same element.\n focus: () => {\n if (showSearch && optionCollection) {\n searchInputRef.current?.focus();\n } else {\n triggerRef.current?.focus();\n }\n },\n blur: () => {\n if (showSearch && optionCollection) {\n searchInputRef.current?.blur();\n } else {\n triggerRef.current?.blur();\n }\n },\n open: () => onToggleOpen(true),\n close: () => {\n console.log('ref close');\n onToggleOpen(false);\n },\n }));\n const [isHover, setIsHover] = useState(false);\n const [activeOptionKey, setActiveOptionKey] = useState<string>();\n const [composingSearchValue, setComposingSearchValue] = useState<\n string | undefined\n >();\n const isComposingSearchRef = useRef(false);\n const isSearchableCollection = !!optionCollection && !!showSearch;\n const ownerAriaProps = React.useMemo(\n () => ({\n ...triggerAriaProps,\n 'aria-busy': loading || triggerAriaProps['aria-busy'] || undefined,\n 'aria-invalid':\n triggerAriaProps['aria-invalid'] ??\n (mergedStatus === 'error' ? true : undefined),\n }),\n [loading, mergedStatus, triggerAriaProps],\n );\n // ============================== Open ==============================\n const [innerOpen, setInnerOpen] = useMergedState<boolean>(false, {\n defaultValue: defaultOpen,\n value: open,\n });\n const mergedOpen = innerOpen;\n const shouldMatchPopupWidth =\n !!popupMatchSelectWidth && typeof popupMatchSelectWidth !== 'number';\n const updateMatchedPopupWidth = React.useCallback(() => {\n if (!shouldMatchPopupWidth) {\n return;\n }\n\n const nextWidth = selectRef.current?.getBoundingClientRect().width;\n if (nextWidth !== undefined) {\n setMatchedPopupWidth((currentWidth) =>\n currentWidth === nextWidth ? currentWidth : nextWidth,\n );\n }\n }, [shouldMatchPopupWidth]);\n const onToggleOpen = React.useCallback(\n (newOpen?: boolean) => {\n const nextOpen = newOpen !== undefined ? newOpen : !mergedOpen;\n if (nextOpen) {\n updateMatchedPopupWidth();\n }\n if (!nextOpen) {\n setShowResponsiveSelectedSection(false);\n }\n if (mergedOpen !== nextOpen && !disabled) {\n setInnerOpen(nextOpen);\n onOpenChange?.(nextOpen);\n }\n },\n [\n mergedOpen,\n disabled,\n setInnerOpen,\n onOpenChange,\n updateMatchedPopupWidth,\n ],\n );\n const getInitialActiveOptionKey = React.useCallback(\n (position: 'first' | 'last') => {\n if (!optionCollection) {\n return undefined;\n }\n\n if (position === 'last') {\n return optionCollection.enabledOptions[\n optionCollection.enabledOptions.length - 1\n ]?.key;\n }\n\n const selected = optionCollection.options.find(\n (option) =>\n !option.disabled &&\n displayValues.some(\n (value) => toString(value.value) === toString(option.value),\n ),\n );\n return selected?.key ?? optionCollection.enabledOptions[0]?.key;\n },\n [displayValues, optionCollection],\n );\n React.useEffect(() => {\n if (!optionCollection || !mergedOpen) {\n setActiveOptionKey(undefined);\n return;\n }\n\n setActiveOptionKey((current) =>\n optionCollection.enabledOptions.some((option) => option.key === current)\n ? current\n : getInitialActiveOptionKey('first'),\n );\n }, [getInitialActiveOptionKey, mergedOpen, optionCollection]);\n React.useLayoutEffect(() => {\n if (!mergedOpen || !shouldMatchPopupWidth) {\n return;\n }\n\n const element = selectRef.current;\n if (!element) {\n return;\n }\n\n const updateMatchedWidth = () => {\n const nextWidth = element.getBoundingClientRect().width;\n setMatchedPopupWidth((currentWidth) =>\n currentWidth === nextWidth ? currentWidth : nextWidth,\n );\n };\n\n updateMatchedWidth();\n\n if (typeof ResizeObserver === 'undefined') {\n window.addEventListener('resize', updateMatchedWidth);\n return () => {\n window.removeEventListener('resize', updateMatchedWidth);\n };\n }\n\n let resizeAnimationFrame: number | undefined;\n const scheduleMatchedWidthUpdate = () => {\n if (resizeAnimationFrame !== undefined) {\n cancelAnimationFrame(resizeAnimationFrame);\n }\n resizeAnimationFrame = requestAnimationFrame(updateMatchedWidth);\n };\n\n const observer = new ResizeObserver(scheduleMatchedWidthUpdate);\n observer.observe(element);\n\n return () => {\n if (resizeAnimationFrame !== undefined) {\n cancelAnimationFrame(resizeAnimationFrame);\n }\n observer.disconnect();\n };\n }, [mergedOpen, shouldMatchPopupWidth]);\n const [showResponsiveSelectedSection, setShowResponsiveSelectedSection] =\n useState(false);\n // 多选 responsive 进入 -1 收纳态(仅\"首 tag + +N\")时为 true,\n // width:auto 下据此给根节点加 overflow-collapsed 钳住 min-width 链,\n // 抵抗父 flex 行因 intrinsic 低估造成的假压缩(详见 ald-select.css 对应段)\n const [overflowCollapsed, setOverflowCollapsed] = useState(false);\n\n // ============================ Selector ============================\n const onSelectorRemove = (val: DisplayValueType) => {\n const newValues = displayValues.filter(\n (item) => toString(item.value) !== toString(val.value),\n );\n\n onDisplayValuesChange(newValues, {\n type: 'remove',\n values: [\n {\n label: val.label,\n value: val.value as RawValueType,\n },\n ],\n });\n };\n\n const mergedClassName = cn(\n setClassNames('beta-ald-select', size, {\n // Popup visibility is not focus. The trigger's :focus-visible state\n // owns the Focus State Layer in ald-select.css.\n open: mergedOpen,\n // Retain the legacy hook for consumers that style the open state.\n // It no longer represents trigger focus.\n active: mergedOpen,\n borderless: borderLess,\n disabled: disabled,\n loading: loading,\n [`${mergedStatus}`]: !!mergedStatus,\n 'multiple-responsive': isResponsiveMode,\n 'multiple-default': isMultipleMode && !isResponsiveMode,\n // 仅 width:auto 生效:固定宽度下 -1 收纳态的收缩省略是预期行为,\n // 钳 min-width 反而会把固定宽撑破\n 'overflow-collapsed':\n overflowCollapsed && width === 'auto' && !_.isEmpty(displayValues),\n }),\n 'tw-text-typography-body-dense',\n className,\n compactItemClassnames,\n );\n const showMenu = React.useMemo(() => {\n if (!displayMenu) {\n return undefined;\n }\n\n return {\n ...displayMenu,\n onClick: (info: MenuInfo) => {\n displayMenu?.onClick?.(info);\n if (isMultipleMode) {\n // 多选默认选中后不收起下拉:Dropdown 在 menu.onClick 之后读\n // info.keepOpen 决定是否 onChangeOpen(false),不设则每次点击都被\n // 当成关闭信号。用 ?? 保留用户在自己的 onClick 里显式设 false 的能力\n info.keepOpen = info.keepOpen ?? true;\n } else if (displayMenu) {\n onToggleOpen(false);\n }\n setIsHover(false);\n onOptionSelect?.(info.key);\n },\n };\n }, [displayMenu, isMultipleMode, onToggleOpen, onOptionSelect]);\n const onSelectClick = React.useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) {\n return;\n }\n onClick?.(e);\n },\n [disabled, onClick],\n );\n React.useEffect(() => {\n const element = selectRef.current;\n if (element) {\n const handleMouseOver = () => setIsHover(true);\n const handleMouseOut = () => setIsHover(false);\n\n element.addEventListener('mouseover', handleMouseOver);\n element.addEventListener('mouseout', handleMouseOut);\n\n return () => {\n element.removeEventListener('mouseover', handleMouseOver);\n element.removeEventListener('mouseout', handleMouseOut);\n };\n }\n }, []);\n const mergedPopupMatchSelectWidth =\n shouldMatchPopupWidth && matchedPopupWidth !== undefined\n ? matchedPopupWidth\n : popupMatchSelectWidth;\n const activeOptionId = optionCollection?.options.find(\n (option) => option.key === activeOptionKey,\n )?.id;\n const moveActiveOption = React.useCallback(\n (direction: 1 | -1) => {\n if (!optionCollection || optionCollection.enabledOptions.length === 0) {\n return;\n }\n\n const currentIndex = optionCollection.enabledOptions.findIndex(\n (option) => option.key === activeOptionKey,\n );\n const nextIndex =\n currentIndex === -1\n ? direction === 1\n ? 0\n : optionCollection.enabledOptions.length - 1\n : (currentIndex +\n direction +\n optionCollection.enabledOptions.length) %\n optionCollection.enabledOptions.length;\n setActiveOptionKey(optionCollection.enabledOptions[nextIndex].key);\n },\n [activeOptionKey, optionCollection],\n );\n const typeaheadRef = useRef({ value: '', timestamp: 0 });\n const onCollectionKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLElement>) => {\n if (!optionCollection || disabled) {\n return;\n }\n\n const openCollection = (position: 'first' | 'last') => {\n event.preventDefault();\n setActiveOptionKey(getInitialActiveOptionKey(position));\n onToggleOpen(true);\n };\n\n if (!mergedOpen) {\n if (event.key === 'ArrowDown') {\n openCollection('first');\n } else if (event.key === 'ArrowUp') {\n openCollection('last');\n } else if (event.key === 'Enter' || event.key === ' ') {\n openCollection('first');\n }\n return;\n }\n\n if (event.key === 'ArrowDown') {\n event.preventDefault();\n moveActiveOption(1);\n return;\n }\n if (event.key === 'ArrowUp') {\n event.preventDefault();\n moveActiveOption(-1);\n return;\n }\n if (event.key === 'Home') {\n event.preventDefault();\n setActiveOptionKey(optionCollection.enabledOptions[0]?.key);\n return;\n }\n if (event.key === 'End') {\n event.preventDefault();\n setActiveOptionKey(\n optionCollection.enabledOptions[\n optionCollection.enabledOptions.length - 1\n ]?.key,\n );\n return;\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n const activeOption = optionCollection.options.find(\n (option) => option.key === activeOptionKey,\n );\n if (activeOption && !activeOption.disabled) {\n if (!isMultipleMode) {\n onToggleOpen(false);\n }\n onCollectionOptionSelect?.(activeOption.value);\n }\n return;\n }\n if (event.key === 'Escape') {\n event.preventDefault();\n onToggleOpen(false);\n if (isSearchableCollection) {\n searchInputRef.current?.focus();\n } else {\n triggerRef.current?.focus();\n }\n return;\n }\n if (event.key === 'Tab') {\n onToggleOpen(false);\n return;\n }\n if (\n event.key.length === 1 &&\n !event.altKey &&\n !event.ctrlKey &&\n !event.metaKey\n ) {\n const now = Date.now();\n const query =\n now - typeaheadRef.current.timestamp > 500\n ? event.key\n : `${typeaheadRef.current.value}${event.key}`;\n typeaheadRef.current = { value: query, timestamp: now };\n const normalizedQuery = query.toLocaleLowerCase();\n const activeIndex = optionCollection.enabledOptions.findIndex(\n (option) => option.key === activeOptionKey,\n );\n const orderedOptions = [\n ...optionCollection.enabledOptions.slice(activeIndex + 1),\n ...optionCollection.enabledOptions.slice(0, activeIndex + 1),\n ];\n const match = orderedOptions.find((option) =>\n String(option.label ?? option.value)\n .toLocaleLowerCase()\n .startsWith(normalizedQuery),\n );\n if (match) {\n event.preventDefault();\n setActiveOptionKey(match.key);\n }\n }\n },\n [\n activeOptionKey,\n disabled,\n getInitialActiveOptionKey,\n mergedOpen,\n moveActiveOption,\n onCollectionOptionSelect,\n onToggleOpen,\n optionCollection,\n isSearchableCollection,\n ],\n );\n const onSearchInputKeyDown = React.useCallback(\n (event: React.KeyboardEvent<HTMLInputElement>) => {\n onInputKeyDown?.(event);\n if (event.defaultPrevented) {\n return;\n }\n\n if (\n event.key === ' ' ||\n (event.key.length === 1 &&\n !event.altKey &&\n !event.ctrlKey &&\n !event.metaKey)\n ) {\n return;\n }\n\n onCollectionKeyDown(event);\n },\n [onCollectionKeyDown, onInputKeyDown],\n );\n const onSearchInputChange = React.useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const nextValue = event.target.value;\n if (isComposingSearchRef.current) {\n setComposingSearchValue(nextValue);\n return;\n }\n setInnerSearchValue?.(nextValue);\n },\n [setInnerSearchValue],\n );\n const searchInputValue = composingSearchValue ?? innerSearchValue ?? '';\n const collectionContent = optionCollection ? (\n <OptionCollection\n collection={optionCollection}\n selectedValues={displayValues.map((item) => item.value as RawValueType)}\n activeOptionKey={activeOptionKey}\n multiple={isMultipleMode}\n loading={loading}\n listHeight={props.listHeight ?? 256}\n notFoundContent={notFoundContent}\n onSelect={(value) => {\n if (!isMultipleMode) {\n onToggleOpen(false);\n }\n onCollectionOptionSelect?.(value);\n }}\n />\n ) : undefined;\n return (\n <div\n className={mergedClassName}\n style={{\n ...widthStyle,\n // width:auto 且无选中值时锁 shrink:Chromium 对该子树给父 flex 行的\n // intrinsic 宽度贡献恒少约 14px,父行按低估值布局后回头压缩根节点,\n // placeholder 右侧会被裁;有选中值时必须保持可压缩,rc-overflow\n // 才能在父行变窄时把放不下的 tag 收纳成 \"+N\"\n ...(width === 'auto' && _.isEmpty(displayValues)\n ? { flexShrink: 0 }\n : {}),\n ...style,\n }}\n ref={selectRef}\n id={id}\n onClick={onSelectClick}\n data-testid={dataTestid}\n aria-label={ariaLabel}\n >\n <SelectTrigger\n {...passthroughProps}\n open={!!mergedOpen}\n notFoundContent={notFoundContent}\n menu={showMenu}\n collection={collectionContent}\n ref={dropdownRef}\n showSearch={showSearch}\n searchValue={innerSearchValue}\n setInnerSearchValue={setInnerSearchValue}\n popupMatchSelectWidth={mergedPopupMatchSelectWidth}\n overlayClassName={popupClassName}\n // @ts-ignore\n dropdownRender={dropdownRender}\n overlayStyle={overlayStyle || dropdownStyle}\n placement={placement}\n allowOverlap={allowOverlap}\n onOpenChange={(open) => {\n if (isResponsiveMode) {\n if (\n !mergedOpen &&\n !showResponsiveSelectedSection &&\n displayValues.length > 0 &&\n isShowSelectedSection(mode)\n ) {\n setShowResponsiveSelectedSection(true);\n } else {\n onToggleOpen(open);\n }\n } else {\n onToggleOpen(open);\n }\n }}\n >\n {/* antd 兼容:保留 ant-* class,消费方 CSS 可能依赖该选择器 */}\n <div\n {...(!isSearchableCollection ? ownerAriaProps : {})}\n ref={triggerRef}\n tabIndex={isSearchableCollection || disabled ? undefined : 0}\n role={isSearchableCollection ? undefined : 'combobox'}\n aria-disabled={\n isSearchableCollection ? undefined : disabled || undefined\n }\n aria-expanded={isSearchableCollection ? undefined : mergedOpen}\n aria-haspopup={\n isSearchableCollection\n ? undefined\n : optionCollection\n ? 'listbox'\n : undefined\n }\n aria-controls={\n isSearchableCollection\n ? undefined\n : mergedOpen && optionCollection\n ? optionCollection.listboxId\n : undefined\n }\n aria-activedescendant={\n isSearchableCollection\n ? undefined\n : mergedOpen && optionCollection\n ? activeOptionId\n : undefined\n }\n onKeyDown={\n isSearchableCollection\n ? undefined\n : optionCollection\n ? onCollectionKeyDown\n : undefined\n }\n className={cn(setClassNames('trigger'), 'ant-select-selector')}\n >\n {prefix && <div className={setClassNames('prefix')}>{prefix}</div>}\n {isSearchableCollection ? (\n <input\n {...ownerAriaProps}\n ref={searchInputRef}\n type=\"text\"\n role=\"combobox\"\n className={setClassNames('search-input')}\n value={searchInputValue}\n disabled={disabled}\n placeholder={\n typeof placeholder === 'string' ? placeholder : undefined\n }\n aria-disabled={disabled || undefined}\n aria-expanded={mergedOpen}\n aria-haspopup=\"listbox\"\n aria-controls={\n mergedOpen ? optionCollection?.listboxId : undefined\n }\n aria-activedescendant={mergedOpen ? activeOptionId : undefined}\n onFocus={() => onToggleOpen(true)}\n onChange={onSearchInputChange}\n onCompositionStart={() => {\n isComposingSearchRef.current = true;\n }}\n onCompositionEnd={(event) => {\n isComposingSearchRef.current = false;\n setComposingSearchValue(undefined);\n setInnerSearchValue?.(event.currentTarget.value);\n }}\n onKeyDown={onSearchInputKeyDown}\n />\n ) : (\n <>\n {_.isEmpty(displayValues) && (\n <div\n className={cn(\n setClassNames('placeholder'),\n 'ant-select-selection-placeholder',\n )}\n >\n {placeholder}\n </div>\n )}\n {!_.isEmpty(displayValues) && (\n <Selector\n {...passthroughProps}\n suffixIcon={suffixIcon}\n size={size}\n disabled={disabled}\n mode={mode}\n dropdownRef={dropdownRef}\n displayValues={displayValues}\n onToggleOpen={onToggleOpen}\n onRemove={onSelectorRemove}\n showResponsiveSelectedSection={\n showResponsiveSelectedSection\n }\n onOverflowCollapsedChange={setOverflowCollapsed}\n ></Selector>\n )}\n </>\n )}\n </div>\n </SelectTrigger>\n <Suffix\n showArrow={showArrow}\n allowClear={allowClear}\n disabled={disabled}\n loading={loading}\n isHover={isHover}\n onClear={() => {\n onToggleOpen(false);\n\n onDisplayValuesChange([], {\n type: 'clear',\n values: displayValues,\n });\n onClear?.();\n }}\n isActive={innerOpen}\n icon={suffixIcon}\n displayValues={displayValues}\n ></Suffix>\n </div>\n );\n },\n);\n\nexport default BaseSelect;\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAqDA,SAAS,eAAe,OAA4B;AAClD,QAAO,OAAO,KAAK,MAAM,CAAC,QAIvB,QAAQ,QAAQ;AACf,MAAI,IAAI,WAAW,QAAQ,CACzB,QAAO,UAAU,OAAO,MAAM;MAE9B,QAAO,UAAU,OAAO,MAAM;AAEhC,SAAO;IAET;EAAE,WAAW,EAAE;EAAE,WAAW,EAAE;EAAE,CACjC;;AAmFH,SAAgB,WAAW,MAAa;AACtC,QAAO,CAAC,CAAC;;AAEX,SAAgB,aAAa,MAAa;AACxC,QAAO,SAAS,cAAe,OAAO,SAAS,YAAY,MAAM;;AAEnE,SAAgB,sBAAsB,MAAa;AACjD,KAAI,CAAC,QAAQ,SAAS,WACpB,QAAO;AAGT,QACE,OAAO,SAAS,YAAY,KAAK,uBAAuB,KAAK;;AAGjE,IAAM,aAAa,QAAM,YACtB,OAAwB,QAAkC;CACzD,MAAM,EACJ,IACA,WAEA,eACA,uBACA,aACA,kBACA,iBACA,SACA,OACA,MACA,QAAQ,cACR,gBACA,0BACA,SACA,MAAM,YACN,aAAa,OAEb,UACA,aACA,UAAU,OAGV,MACA,aACA,cACA,YACA,kBACA,qBACA,gBAEA,YACA,YAAY,MACZ,QACA,YACA,gBACA,cACA,eACA,wBAAwB,MACxB,WACA,gBACA,cACA,OACA,eAAe,YACf,cAAc,WACd,GAAG,cAED;CACJ,MAAM,EAAE,WAAW,WAAW,qBAAqB,QAAM,cACjD,eAAe,UAAU,EAC/B,CAAC,UAAU,CACZ;CACD,MAAM,mBAAmB,QAAM,eACtB;EACL,GAAG;EACH,cAAc;EACf,GACD,CAAC,WAAW,UAAU,CACvB;CACD,MAAM,gBAAgB,UAAU,SAAS;CACzC,MAAM,YAAY,OAAuB,KAAK;CAC9C,MAAM,aAAa,OAAuB,KAAK;CAC/C,MAAM,iBAAiB,OAAyB,KAAK;CACrD,MAAM,aAAa,cAAc,MAAM;CACvC,MAAM,cAAc,OAAwB,KAAK;CACjD,MAAM,CAAC,mBAAmB,wBAAwB,UAE/C;CACH,MAAM,mBAAmB,aAAa,KAAK;CAC3C,MAAM,iBAAiB,WAAW,KAAK;;CAEvC,MAAM,cAAc,WAAW,YAAY;CAC3C,MAAM,EAAE,cAAc,QAAM,WAAW,cAAc;CAErD,MAAM,EAAE,aAAa,0BAA0B,sBAC7C,cACA,UACD;CACD,MAAM,OAAO,eAAe,cAAc,eAAe;CACzD,MAAM,EACJ,QAAQ,kBAIN,WAAW,qBAAqB;CAEpC,MAAM,eACJ,iBAAiB,OAAO,SAAY,gBAAgB;AAGtD,SAAM,oBAAoB,YAAY;EAIpC,aAAa;AACX,OAAI,cAAc,iBAChB,gBAAe,SAAS,OAAO;OAE/B,YAAW,SAAS,OAAO;;EAG/B,YAAY;AACV,OAAI,cAAc,iBAChB,gBAAe,SAAS,MAAM;OAE9B,YAAW,SAAS,MAAM;;EAG9B,YAAY,aAAa,KAAK;EAC9B,aAAa;AACX,WAAQ,IAAI,YAAY;AACxB,gBAAa,MAAM;;EAEtB,EAAE;CACH,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;CAC7C,MAAM,CAAC,iBAAiB,sBAAsB,UAAkB;CAChE,MAAM,CAAC,sBAAsB,2BAA2B,UAErD;CACH,MAAM,uBAAuB,OAAO,MAAM;CAC1C,MAAM,yBAAyB,CAAC,CAAC,oBAAoB,CAAC,CAAC;CACvD,MAAM,iBAAiB,QAAM,eACpB;EACL,GAAG;EACH,aAAa,WAAW,iBAAiB,gBAAgB;EACzD,gBACE,iBAAiB,oBAChB,iBAAiB,UAAU,OAAO;EACtC,GACD;EAAC;EAAS;EAAc;EAAiB,CAC1C;CAED,MAAM,CAAC,WAAW,gBAAgB,eAAwB,OAAO;EAC/D,cAAc;EACd,OAAO;EACR,CAAC;CACF,MAAM,aAAa;CACnB,MAAM,wBACJ,CAAC,CAAC,yBAAyB,OAAO,0BAA0B;CAC9D,MAAM,0BAA0B,QAAM,kBAAkB;AACtD,MAAI,CAAC,sBACH;EAGF,MAAM,YAAY,UAAU,SAAS,uBAAuB,CAAC;AAC7D,MAAI,cAAc,OAChB,uBAAsB,iBACpB,iBAAiB,YAAY,eAAe,UAC7C;IAEF,CAAC,sBAAsB,CAAC;CAC3B,MAAM,eAAe,QAAM,aACxB,YAAsB;EACrB,MAAM,WAAW,YAAY,SAAY,UAAU,CAAC;AACpD,MAAI,SACF,0BAAyB;AAE3B,MAAI,CAAC,SACH,kCAAiC,MAAM;AAEzC,MAAI,eAAe,YAAY,CAAC,UAAU;AACxC,gBAAa,SAAS;AACtB,kBAAe,SAAS;;IAG5B;EACE;EACA;EACA;EACA;EACA;EACD,CACF;CACD,MAAM,4BAA4B,QAAM,aACrC,aAA+B;AAC9B,MAAI,CAAC,iBACH;AAGF,MAAI,aAAa,OACf,QAAO,iBAAiB,eACtB,iBAAiB,eAAe,SAAS,IACxC;AAUL,SAPiB,iBAAiB,QAAQ,MACvC,WACC,CAAC,OAAO,YACR,cAAc,MACX,UAAU,SAAS,MAAM,MAAM,KAAK,SAAS,OAAO,MAAM,CAC5D,CACJ,EACgB,OAAO,iBAAiB,eAAe,IAAI;IAE9D,CAAC,eAAe,iBAAiB,CAClC;AACD,SAAM,gBAAgB;AACpB,MAAI,CAAC,oBAAoB,CAAC,YAAY;AACpC,sBAAmB,OAAU;AAC7B;;AAGF,sBAAoB,YAClB,iBAAiB,eAAe,MAAM,WAAW,OAAO,QAAQ,QAAQ,GACpE,UACA,0BAA0B,QAAQ,CACvC;IACA;EAAC;EAA2B;EAAY;EAAiB,CAAC;AAC7D,SAAM,sBAAsB;AAC1B,MAAI,CAAC,cAAc,CAAC,sBAClB;EAGF,MAAM,UAAU,UAAU;AAC1B,MAAI,CAAC,QACH;EAGF,MAAM,2BAA2B;GAC/B,MAAM,YAAY,QAAQ,uBAAuB,CAAC;AAClD,yBAAsB,iBACpB,iBAAiB,YAAY,eAAe,UAC7C;;AAGH,sBAAoB;AAEpB,MAAI,OAAO,mBAAmB,aAAa;AACzC,UAAO,iBAAiB,UAAU,mBAAmB;AACrD,gBAAa;AACX,WAAO,oBAAoB,UAAU,mBAAmB;;;EAI5D,IAAI;EACJ,MAAM,mCAAmC;AACvC,OAAI,yBAAyB,OAC3B,sBAAqB,qBAAqB;AAE5C,0BAAuB,sBAAsB,mBAAmB;;EAGlE,MAAM,WAAW,IAAI,eAAe,2BAA2B;AAC/D,WAAS,QAAQ,QAAQ;AAEzB,eAAa;AACX,OAAI,yBAAyB,OAC3B,sBAAqB,qBAAqB;AAE5C,YAAS,YAAY;;IAEtB,CAAC,YAAY,sBAAsB,CAAC;CACvC,MAAM,CAAC,+BAA+B,oCACpC,SAAS,MAAM;CAIjB,MAAM,CAAC,mBAAmB,wBAAwB,SAAS,MAAM;CAGjE,MAAM,oBAAoB,QAA0B;AAKlD,wBAJkB,cAAc,QAC7B,SAAS,SAAS,KAAK,MAAM,KAAK,SAAS,IAAI,MAAM,CACvD,EAEgC;GAC/B,MAAM;GACN,QAAQ,CACN;IACE,OAAO,IAAI;IACX,OAAO,IAAI;IACZ,CACF;GACF,CAAC;;CAGJ,MAAM,kBAAkB,GACtB,cAAc,mBAAmB,MAAM;EAGrC,MAAM;EAGN,QAAQ;EACR,YAAY;EACF;EACD;GACR,GAAG,iBAAiB,CAAC,CAAC;EACvB,uBAAuB;EACvB,oBAAoB,kBAAkB,CAAC;EAGvC,sBACE,qBAAqB,UAAU,UAAU,CAAC,EAAE,QAAQ,cAAc;EACrE,CAAC,EACF,iCACA,WACA,sBACD;CACD,MAAM,WAAW,QAAM,cAAc;AACnC,MAAI,CAAC,YACH;AAGF,SAAO;GACL,GAAG;GACH,UAAU,SAAmB;AAC3B,iBAAa,UAAU,KAAK;AAC5B,QAAI,eAIF,MAAK,WAAW,KAAK,YAAY;aACxB,YACT,cAAa,MAAM;AAErB,eAAW,MAAM;AACjB,qBAAiB,KAAK,IAAI;;GAE7B;IACA;EAAC;EAAa;EAAgB;EAAc;EAAe,CAAC;CAC/D,MAAM,gBAAgB,QAAM,aACzB,MAAwC;AACvC,MAAI,SACF;AAEF,YAAU,EAAE;IAEd,CAAC,UAAU,QAAQ,CACpB;AACD,SAAM,gBAAgB;EACpB,MAAM,UAAU,UAAU;AAC1B,MAAI,SAAS;GACX,MAAM,wBAAwB,WAAW,KAAK;GAC9C,MAAM,uBAAuB,WAAW,MAAM;AAE9C,WAAQ,iBAAiB,aAAa,gBAAgB;AACtD,WAAQ,iBAAiB,YAAY,eAAe;AAEpD,gBAAa;AACX,YAAQ,oBAAoB,aAAa,gBAAgB;AACzD,YAAQ,oBAAoB,YAAY,eAAe;;;IAG1D,EAAE,CAAC;CACN,MAAM,8BACJ,yBAAyB,sBAAsB,SAC3C,oBACA;CACN,MAAM,iBAAiB,kBAAkB,QAAQ,MAC9C,WAAW,OAAO,QAAQ,gBAC5B,EAAE;CACH,MAAM,mBAAmB,QAAM,aAC5B,cAAsB;AACrB,MAAI,CAAC,oBAAoB,iBAAiB,eAAe,WAAW,EAClE;EAGF,MAAM,eAAe,iBAAiB,eAAe,WAClD,WAAW,OAAO,QAAQ,gBAC5B;EACD,MAAM,YACJ,iBAAiB,KACb,cAAc,IACZ,IACA,iBAAiB,eAAe,SAAS,KAC1C,eACC,YACA,iBAAiB,eAAe,UAClC,iBAAiB,eAAe;AACtC,qBAAmB,iBAAiB,eAAe,WAAW,IAAI;IAEpE,CAAC,iBAAiB,iBAAiB,CACpC;CACD,MAAM,eAAe,OAAO;EAAE,OAAO;EAAI,WAAW;EAAG,CAAC;CACxD,MAAM,sBAAsB,QAAM,aAC/B,UAA4C;AAC3C,MAAI,CAAC,oBAAoB,SACvB;EAGF,MAAM,kBAAkB,aAA+B;AACrD,SAAM,gBAAgB;AACtB,sBAAmB,0BAA0B,SAAS,CAAC;AACvD,gBAAa,KAAK;;AAGpB,MAAI,CAAC,YAAY;AACf,OAAI,MAAM,QAAQ,YAChB,gBAAe,QAAQ;YACd,MAAM,QAAQ,UACvB,gBAAe,OAAO;YACb,MAAM,QAAQ,WAAW,MAAM,QAAQ,IAChD,gBAAe,QAAQ;AAEzB;;AAGF,MAAI,MAAM,QAAQ,aAAa;AAC7B,SAAM,gBAAgB;AACtB,oBAAiB,EAAE;AACnB;;AAEF,MAAI,MAAM,QAAQ,WAAW;AAC3B,SAAM,gBAAgB;AACtB,oBAAiB,GAAG;AACpB;;AAEF,MAAI,MAAM,QAAQ,QAAQ;AACxB,SAAM,gBAAgB;AACtB,sBAAmB,iBAAiB,eAAe,IAAI,IAAI;AAC3D;;AAEF,MAAI,MAAM,QAAQ,OAAO;AACvB,SAAM,gBAAgB;AACtB,sBACE,iBAAiB,eACf,iBAAiB,eAAe,SAAS,IACxC,IACJ;AACD;;AAEF,MAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,SAAM,gBAAgB;GACtB,MAAM,eAAe,iBAAiB,QAAQ,MAC3C,WAAW,OAAO,QAAQ,gBAC5B;AACD,OAAI,gBAAgB,CAAC,aAAa,UAAU;AAC1C,QAAI,CAAC,eACH,cAAa,MAAM;AAErB,+BAA2B,aAAa,MAAM;;AAEhD;;AAEF,MAAI,MAAM,QAAQ,UAAU;AAC1B,SAAM,gBAAgB;AACtB,gBAAa,MAAM;AACnB,OAAI,uBACF,gBAAe,SAAS,OAAO;OAE/B,YAAW,SAAS,OAAO;AAE7B;;AAEF,MAAI,MAAM,QAAQ,OAAO;AACvB,gBAAa,MAAM;AACnB;;AAEF,MACE,MAAM,IAAI,WAAW,KACrB,CAAC,MAAM,UACP,CAAC,MAAM,WACP,CAAC,MAAM,SACP;GACA,MAAM,MAAM,KAAK,KAAK;GACtB,MAAM,QACJ,MAAM,aAAa,QAAQ,YAAY,MACnC,MAAM,MACN,GAAG,aAAa,QAAQ,QAAQ,MAAM;AAC5C,gBAAa,UAAU;IAAE,OAAO;IAAO,WAAW;IAAK;GACvD,MAAM,kBAAkB,MAAM,mBAAmB;GACjD,MAAM,cAAc,iBAAiB,eAAe,WACjD,WAAW,OAAO,QAAQ,gBAC5B;GAKD,MAAM,QAJiB,CACrB,GAAG,iBAAiB,eAAe,MAAM,cAAc,EAAE,EACzD,GAAG,iBAAiB,eAAe,MAAM,GAAG,cAAc,EAAE,CAC7D,CAC4B,MAAM,WACjC,OAAO,OAAO,SAAS,OAAO,MAAM,CACjC,mBAAmB,CACnB,WAAW,gBAAgB,CAC/B;AACD,OAAI,OAAO;AACT,UAAM,gBAAgB;AACtB,uBAAmB,MAAM,IAAI;;;IAInC;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF;CACD,MAAM,uBAAuB,QAAM,aAChC,UAAiD;AAChD,mBAAiB,MAAM;AACvB,MAAI,MAAM,iBACR;AAGF,MACE,MAAM,QAAQ,OACb,MAAM,IAAI,WAAW,KACpB,CAAC,MAAM,UACP,CAAC,MAAM,WACP,CAAC,MAAM,QAET;AAGF,sBAAoB,MAAM;IAE5B,CAAC,qBAAqB,eAAe,CACtC;CACD,MAAM,sBAAsB,QAAM,aAC/B,UAA+C;EAC9C,MAAM,YAAY,MAAM,OAAO;AAC/B,MAAI,qBAAqB,SAAS;AAChC,2BAAwB,UAAU;AAClC;;AAEF,wBAAsB,UAAU;IAElC,CAAC,oBAAoB,CACtB;CACD,MAAM,mBAAmB,wBAAwB,oBAAoB;CACrE,MAAM,oBAAoB,mBACxB,oBAAC,kBAAD;EACE,YAAY;EACZ,gBAAgB,cAAc,KAAK,SAAS,KAAK,MAAsB;EACtD;EACjB,UAAU;EACD;EACT,YAAY,MAAM,cAAc;EACf;EACjB,WAAW,UAAU;AACnB,OAAI,CAAC,eACH,cAAa,MAAM;AAErB,8BAA2B,MAAM;;EAEnC,CAAA,GACA;AACJ,QACE,qBAAC,OAAD;EACE,WAAW;EACX,OAAO;GACL,GAAG;GAKH,GAAI,UAAU,UAAU,EAAE,QAAQ,cAAc,GAC5C,EAAE,YAAY,GAAG,GACjB,EAAE;GACN,GAAG;GACJ;EACD,KAAK;EACD;EACJ,SAAS;EACT,eAAa;EACb,cAAY;YAjBd,CAmBE,oBAAC,kBAAD;GACE,GAAI;GACJ,MAAM,CAAC,CAAC;GACS;GACjB,MAAM;GACN,YAAY;GACZ,KAAK;GACO;GACZ,aAAa;GACQ;GACrB,uBAAuB;GACvB,kBAAkB;GAEF;GAChB,cAAc,gBAAgB;GACnB;GACG;GACd,eAAe,SAAS;AACtB,QAAI,iBACF,KACE,CAAC,cACD,CAAC,iCACD,cAAc,SAAS,KACvB,sBAAsB,KAAK,CAE3B,kCAAiC,KAAK;QAEtC,cAAa,KAAK;QAGpB,cAAa,KAAK;;aAKtB,qBAAC,OAAD;IACE,GAAK,CAAC,yBAAyB,iBAAiB,EAAE;IAClD,KAAK;IACL,UAAU,0BAA0B,WAAW,SAAY;IAC3D,MAAM,yBAAyB,SAAY;IAC3C,iBACE,yBAAyB,SAAY,YAAY;IAEnD,iBAAe,yBAAyB,SAAY;IACpD,iBACE,yBACI,SACA,mBACA,YACA;IAEN,iBACE,yBACI,SACA,cAAc,mBACd,iBAAiB,YACjB;IAEN,yBACE,yBACI,SACA,cAAc,mBACd,iBACA;IAEN,WACE,yBACI,SACA,mBACA,sBACA;IAEN,WAAW,GAAG,cAAc,UAAU,EAAE,sBAAsB;cArChE,CAuCG,UAAU,oBAAC,OAAD;KAAK,WAAW,cAAc,SAAS;eAAG;KAAa,CAAA,EACjE,yBACC,oBAAC,SAAD;KACE,GAAI;KACJ,KAAK;KACL,MAAK;KACL,MAAK;KACL,WAAW,cAAc,eAAe;KACxC,OAAO;KACG;KACV,aACE,OAAO,gBAAgB,WAAW,cAAc;KAElD,iBAAe,YAAY;KAC3B,iBAAe;KACf,iBAAc;KACd,iBACE,aAAa,kBAAkB,YAAY;KAE7C,yBAAuB,aAAa,iBAAiB;KACrD,eAAe,aAAa,KAAK;KACjC,UAAU;KACV,0BAA0B;AACxB,2BAAqB,UAAU;;KAEjC,mBAAmB,UAAU;AAC3B,2BAAqB,UAAU;AAC/B,8BAAwB,OAAU;AAClC,4BAAsB,MAAM,cAAc,MAAM;;KAElD,WAAW;KACX,CAAA,GAEF,qBAAA,UAAA,EAAA,UAAA,CACG,EAAE,QAAQ,cAAc,IACvB,oBAAC,OAAD;KACE,WAAW,GACT,cAAc,cAAc,EAC5B,mCACD;eAEA;KACG,CAAA,EAEP,CAAC,EAAE,QAAQ,cAAc,IACxB,oBAAC,UAAD;KACE,GAAI;KACQ;KACN;KACI;KACJ;KACO;KACE;KACD;KACd,UAAU;KAER;KAEF,2BAA2B;KACjB,CAAA,CAEb,EAAA,CAAA,CAED;;GACQ,CAAA,EAChB,oBAAC,QAAD;GACa;GACC;GACF;GACD;GACA;GACT,eAAe;AACb,iBAAa,MAAM;AAEnB,0BAAsB,EAAE,EAAE;KACxB,MAAM;KACN,QAAQ;KACT,CAAC;AACF,eAAW;;GAEb,UAAU;GACV,MAAM;GACS;GACP,CAAA,CACN;;EAGX"}
@@ -18,6 +18,8 @@ export interface SelectTriggerProps extends IDropdownProps {
18
18
  searchValue?: string;
19
19
  setInnerSearchValue?: (value: string) => void;
20
20
  filterOption?: (inputValue: string, option: SelectOptionType) => boolean;
21
+ /** Private Select-owned popup collection for the flat standard path. */
22
+ collection?: React.ReactNode;
21
23
  }
22
24
  declare const RefSelectTrigger: React.ForwardRefExoticComponent<SelectTriggerProps & React.RefAttributes<RefTriggerProps>>;
23
25
  export default RefSelectTrigger;
@@ -7,20 +7,20 @@ import React, { useCallback } from "react";
7
7
  import { jsx, jsxs } from "react/jsx-runtime";
8
8
  //#region src/Select/SelectTrigger.tsx
9
9
  var RefSelectTrigger = React.forwardRef((props, ref) => {
10
- const { overlayStyle, disabled, open, children, dropdownRender, getPopupContainer, onOpenChange, showSearch, searchValue, setInnerSearchValue, menu: menuProps, overlayClassName, placement = "bottom-start", popupMatchSelectWidth, notFoundContent = /* @__PURE__ */ jsx(Empty, { size: "small" }), ...restProps } = props;
10
+ const { overlayStyle, disabled, open, children, dropdownRender, getPopupContainer, onOpenChange, showSearch, searchValue, setInnerSearchValue, menu: menuProps, collection, overlayClassName, placement = "bottom-start", popupMatchSelectWidth, notFoundContent = /* @__PURE__ */ jsx(Empty, { size: "small" }), ...restProps } = props;
11
11
  const popupRef = React.useRef(null);
12
12
  React.useImperativeHandle(ref, () => ({ getPopupElement: () => popupRef.current }));
13
13
  const customDropdownRender = useCallback((menu) => {
14
14
  return /* @__PURE__ */ jsxs("div", {
15
15
  className: "beta-ald-select-popup",
16
16
  ref: popupRef,
17
- children: [/* @__PURE__ */ jsx(SearchBox_default, {
17
+ children: [!collection && /* @__PURE__ */ jsx(SearchBox_default, {
18
18
  showSearch,
19
19
  value: searchValue,
20
20
  onChange: (value) => {
21
21
  setInnerSearchValue?.(value);
22
22
  }
23
- }), /* @__PURE__ */ jsx(PopupContent, {
23
+ }), collection || /* @__PURE__ */ jsx(PopupContent, {
24
24
  content: menu,
25
25
  notFoundContent,
26
26
  dropdownRender,
@@ -29,6 +29,7 @@ var RefSelectTrigger = React.forwardRef((props, ref) => {
29
29
  });
30
30
  }, [
31
31
  dropdownRender,
32
+ collection,
32
33
  menuProps,
33
34
  notFoundContent,
34
35
  searchValue,
@@ -39,7 +40,7 @@ var RefSelectTrigger = React.forwardRef((props, ref) => {
39
40
  ...restProps,
40
41
  disabled,
41
42
  open,
42
- menu: menuProps,
43
+ menu: collection ? void 0 : menuProps,
43
44
  placement,
44
45
  popupMatchTriggerWidth: popupMatchSelectWidth,
45
46
  overlayStyle,
@@ -50,7 +51,14 @@ var RefSelectTrigger = React.forwardRef((props, ref) => {
50
51
  onOpenChange: (o) => {
51
52
  onOpenChange?.(o);
52
53
  },
53
- children
54
+ children: collection ? /* @__PURE__ */ jsx("span", {
55
+ style: {
56
+ display: "flex",
57
+ flex: "1 1 auto",
58
+ minWidth: 0
59
+ },
60
+ children
61
+ }) : children
54
62
  });
55
63
  });
56
64
  RefSelectTrigger.displayName = "SelectTrigger";
@@ -1 +1 @@
1
- {"version":3,"file":"SelectTrigger.js","names":[],"sources":["../../src/Select/SelectTrigger.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport type { ScrollTo } from 'rc-virtual-list/es/List';\nimport Dropdown from '../Dropdown';\nimport { cn } from '../lib/utils';\nimport { IDropdownProps } from '../Dropdown';\nimport { DefaultOptionType as SelectOptionType } from './interface';\nimport SearchBox from './components/SearchBox';\nimport PopupContent from './components/PopupContent';\nimport Empty from '../Empty';\n\nexport interface RefTriggerProps {\n getPopupElement: () => HTMLDivElement | null;\n}\nexport interface RefSelectorProps {\n focus: (options?: FocusOptions) => void;\n blur: () => void;\n scrollTo?: ScrollTo;\n}\nexport interface SelectTriggerProps extends IDropdownProps {\n open: boolean;\n notFoundContent?: React.ReactNode;\n popupMatchSelectWidth?: boolean | number;\n showSearch?: boolean;\n searchValue?: string;\n setInnerSearchValue?: (value: string) => void;\n filterOption?: (inputValue: string, option: SelectOptionType) => boolean;\n}\n\nconst RefSelectTrigger = React.forwardRef<RefTriggerProps, SelectTriggerProps>(\n (props, ref) => {\n const {\n // prefixCls,\n overlayStyle,\n disabled,\n open,\n children,\n dropdownRender,\n getPopupContainer,\n onOpenChange,\n showSearch,\n searchValue,\n setInnerSearchValue,\n menu: menuProps,\n overlayClassName,\n placement = 'bottom-start',\n popupMatchSelectWidth,\n notFoundContent = <Empty size=\"small\" />,\n ...restProps\n } = props;\n\n // ======================= Ref =======================\n const popupRef = React.useRef<HTMLDivElement>(null);\n React.useImperativeHandle(ref, () => ({\n getPopupElement: () => popupRef.current,\n }));\n\n const customDropdownRender = useCallback(\n (menu: React.ReactNode) => {\n return (\n <div className=\"beta-ald-select-popup\" ref={popupRef}>\n <SearchBox\n showSearch={showSearch}\n value={searchValue}\n onChange={(value) => {\n setInnerSearchValue?.(value);\n }}\n />\n <PopupContent\n content={menu}\n notFoundContent={notFoundContent}\n dropdownRender={dropdownRender}\n menuProps={menuProps}\n />\n </div>\n );\n },\n [\n dropdownRender,\n menuProps,\n notFoundContent,\n searchValue,\n setInnerSearchValue,\n showSearch,\n ],\n );\n\n return (\n <Dropdown\n {...restProps}\n disabled={disabled}\n open={open}\n menu={menuProps}\n placement={placement}\n popupMatchTriggerWidth={popupMatchSelectWidth}\n overlayStyle={overlayStyle}\n overlayClassName={cn(\n 'beta-ald-select-popup-container',\n overlayClassName,\n )}\n autoUpdatePos\n dropdownRender={customDropdownRender}\n getPopupContainer={getPopupContainer}\n onOpenChange={(o) => {\n onOpenChange?.(o);\n }}\n >\n {children}\n </Dropdown>\n );\n },\n);\n\nRefSelectTrigger.displayName = 'SelectTrigger';\n\nexport default RefSelectTrigger;\n"],"mappings":";;;;;;;;AA4BA,IAAM,mBAAmB,MAAM,YAC5B,OAAO,QAAQ;CACd,MAAM,EAEJ,cACA,UACA,MACA,UACA,gBACA,mBACA,cACA,YACA,aACA,qBACA,MAAM,WACN,kBACA,YAAY,gBACZ,uBACA,kBAAkB,oBAAC,OAAD,EAAO,MAAK,SAAU,CAAA,EACxC,GAAG,cACD;CAGJ,MAAM,WAAW,MAAM,OAAuB,KAAK;AACnD,OAAM,oBAAoB,YAAY,EACpC,uBAAuB,SAAS,SACjC,EAAE;CAEH,MAAM,uBAAuB,aAC1B,SAA0B;AACzB,SACE,qBAAC,OAAD;GAAK,WAAU;GAAwB,KAAK;aAA5C,CACE,oBAAC,mBAAD;IACc;IACZ,OAAO;IACP,WAAW,UAAU;AACnB,2BAAsB,MAAM;;IAE9B,CAAA,EACF,oBAAC,cAAD;IACE,SAAS;IACQ;IACD;IACL;IACX,CAAA,CACE;;IAGV;EACE;EACA;EACA;EACA;EACA;EACA;EACD,CACF;AAED,QACE,oBAAC,UAAD;EACE,GAAI;EACM;EACJ;EACN,MAAM;EACK;EACX,wBAAwB;EACV;EACd,kBAAkB,GAChB,mCACA,iBACD;EACD,eAAA;EACA,gBAAgB;EACG;EACnB,eAAe,MAAM;AACnB,kBAAe,EAAE;;EAGlB;EACQ,CAAA;EAGhB;AAED,iBAAiB,cAAc"}
1
+ {"version":3,"file":"SelectTrigger.js","names":[],"sources":["../../src/Select/SelectTrigger.tsx"],"sourcesContent":["import React, { useCallback } from 'react';\nimport type { ScrollTo } from 'rc-virtual-list/es/List';\nimport Dropdown from '../Dropdown';\nimport { cn } from '../lib/utils';\nimport { IDropdownProps } from '../Dropdown';\nimport { DefaultOptionType as SelectOptionType } from './interface';\nimport SearchBox from './components/SearchBox';\nimport PopupContent from './components/PopupContent';\nimport Empty from '../Empty';\n\nexport interface RefTriggerProps {\n getPopupElement: () => HTMLDivElement | null;\n}\nexport interface RefSelectorProps {\n focus: (options?: FocusOptions) => void;\n blur: () => void;\n scrollTo?: ScrollTo;\n}\nexport interface SelectTriggerProps extends IDropdownProps {\n open: boolean;\n notFoundContent?: React.ReactNode;\n popupMatchSelectWidth?: boolean | number;\n showSearch?: boolean;\n searchValue?: string;\n setInnerSearchValue?: (value: string) => void;\n filterOption?: (inputValue: string, option: SelectOptionType) => boolean;\n /** Private Select-owned popup collection for the flat standard path. */\n collection?: React.ReactNode;\n}\n\nconst RefSelectTrigger = React.forwardRef<RefTriggerProps, SelectTriggerProps>(\n (props, ref) => {\n const {\n // prefixCls,\n overlayStyle,\n disabled,\n open,\n children,\n dropdownRender,\n getPopupContainer,\n onOpenChange,\n showSearch,\n searchValue,\n setInnerSearchValue,\n menu: menuProps,\n collection,\n overlayClassName,\n placement = 'bottom-start',\n popupMatchSelectWidth,\n notFoundContent = <Empty size=\"small\" />,\n ...restProps\n } = props;\n\n // ======================= Ref =======================\n const popupRef = React.useRef<HTMLDivElement>(null);\n React.useImperativeHandle(ref, () => ({\n getPopupElement: () => popupRef.current,\n }));\n\n const customDropdownRender = useCallback(\n (menu: React.ReactNode) => {\n return (\n <div className=\"beta-ald-select-popup\" ref={popupRef}>\n {!collection && (\n <SearchBox\n showSearch={showSearch}\n value={searchValue}\n onChange={(value) => {\n setInnerSearchValue?.(value);\n }}\n />\n )}\n {collection || (\n <PopupContent\n content={menu}\n notFoundContent={notFoundContent}\n dropdownRender={dropdownRender}\n menuProps={menuProps}\n />\n )}\n </div>\n );\n },\n [\n dropdownRender,\n collection,\n menuProps,\n notFoundContent,\n searchValue,\n setInnerSearchValue,\n showSearch,\n ],\n );\n\n return (\n <Dropdown\n {...restProps}\n disabled={disabled}\n open={open}\n // Dropdown still receives the existing menu input to preserve its\n // trigger lifecycle. For the private collection path, its rendered\n // Menu node is ignored by customDropdownRender above.\n menu={collection ? undefined : menuProps}\n placement={placement}\n popupMatchTriggerWidth={popupMatchSelectWidth}\n overlayStyle={overlayStyle}\n overlayClassName={cn(\n 'beta-ald-select-popup-container',\n overlayClassName,\n )}\n autoUpdatePos\n dropdownRender={customDropdownRender}\n getPopupContainer={getPopupContainer}\n onOpenChange={(o) => {\n onOpenChange?.(o);\n }}\n >\n {collection ? (\n <span style={{ display: 'flex', flex: '1 1 auto', minWidth: 0 }}>\n {children}\n </span>\n ) : (\n children\n )}\n </Dropdown>\n );\n },\n);\n\nRefSelectTrigger.displayName = 'SelectTrigger';\n\nexport default RefSelectTrigger;\n"],"mappings":";;;;;;;;AA8BA,IAAM,mBAAmB,MAAM,YAC5B,OAAO,QAAQ;CACd,MAAM,EAEJ,cACA,UACA,MACA,UACA,gBACA,mBACA,cACA,YACA,aACA,qBACA,MAAM,WACN,YACA,kBACA,YAAY,gBACZ,uBACA,kBAAkB,oBAAC,OAAD,EAAO,MAAK,SAAU,CAAA,EACxC,GAAG,cACD;CAGJ,MAAM,WAAW,MAAM,OAAuB,KAAK;AACnD,OAAM,oBAAoB,YAAY,EACpC,uBAAuB,SAAS,SACjC,EAAE;CAEH,MAAM,uBAAuB,aAC1B,SAA0B;AACzB,SACE,qBAAC,OAAD;GAAK,WAAU;GAAwB,KAAK;aAA5C,CACG,CAAC,cACA,oBAAC,mBAAD;IACc;IACZ,OAAO;IACP,WAAW,UAAU;AACnB,2BAAsB,MAAM;;IAE9B,CAAA,EAEH,cACC,oBAAC,cAAD;IACE,SAAS;IACQ;IACD;IACL;IACX,CAAA,CAEA;;IAGV;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CACF;AAED,QACE,oBAAC,UAAD;EACE,GAAI;EACM;EACJ;EAIN,MAAM,aAAa,SAAY;EACpB;EACX,wBAAwB;EACV;EACd,kBAAkB,GAChB,mCACA,iBACD;EACD,eAAA;EACA,gBAAgB;EACG;EACnB,eAAe,MAAM;AACnB,kBAAe,EAAE;;YAGlB,aACC,oBAAC,QAAD;GAAM,OAAO;IAAE,SAAS;IAAQ,MAAM;IAAY,UAAU;IAAG;GAC5D;GACI,CAAA,GAEP;EAEO,CAAA;EAGhB;AAED,iBAAiB,cAAc"}
@@ -0,0 +1,41 @@
1
+ import { default as React } from 'react';
2
+ import { RawValueType, SelectItemType } from '../interface';
3
+ export interface SelectOptionCollectionItem {
4
+ id: string;
5
+ key: string;
6
+ value: RawValueType;
7
+ label: React.ReactNode;
8
+ disabled: boolean;
9
+ option: SelectItemType;
10
+ }
11
+ export interface SelectOptionCollection {
12
+ listboxId: string;
13
+ options: SelectOptionCollectionItem[];
14
+ enabledOptions: SelectOptionCollectionItem[];
15
+ }
16
+ /**
17
+ * Private Select collection seam for normalized, flat option data.
18
+ *
19
+ * It intentionally consumes the existing useOptions result instead of adding
20
+ * another public normalization path. Menu-shaped and hierarchical inputs stay
21
+ * on the legacy compatibility path until their Select contract is migrated.
22
+ */
23
+ export declare function createSelectOptionCollection(listboxId: string, keyMenuItems: Map<string, SelectItemType>): SelectOptionCollection;
24
+ interface OptionCollectionProps {
25
+ collection: SelectOptionCollection;
26
+ selectedValues: RawValueType[];
27
+ activeOptionKey?: string;
28
+ multiple?: boolean;
29
+ loading?: boolean;
30
+ listHeight: number;
31
+ notFoundContent: React.ReactNode;
32
+ onSelect: (value: RawValueType) => void;
33
+ }
34
+ /**
35
+ * Visual collection renderer for the standard flat single-select popup.
36
+ *
37
+ * The legacy Menu class hooks are retained only to preserve existing Select
38
+ * geometry and option presentation while ownership moves to Select.
39
+ */
40
+ export default function OptionCollection({ collection, selectedValues, activeOptionKey, multiple, loading, listHeight, notFoundContent, onSelect, }: OptionCollectionProps): import("react/jsx-runtime").JSX.Element;
41
+ export {};