@aloudata/aloudata-design 3.1.0 → 3.1.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 (186) 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 +91 -78
  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 +1 -0
  60. package/dist/MemberPicker/components/MemberSelection.js +83 -94
  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 +1 -0
  65. package/dist/MemberPicker/components/Panel.js +4 -1
  66. package/dist/MemberPicker/components/Panel.js.map +1 -1
  67. package/dist/MemberPicker/components/SelectedMemberTags.js +14 -6
  68. package/dist/MemberPicker/components/SelectedMemberTags.js.map +1 -1
  69. package/dist/MemberPicker/components/SingleOption.js +12 -0
  70. package/dist/MemberPicker/components/SingleOption.js.map +1 -1
  71. package/dist/MemberPicker/components/UserGroupSelection.d.ts +2 -1
  72. package/dist/MemberPicker/components/UserGroupSelection.js +61 -48
  73. package/dist/MemberPicker/components/UserGroupSelection.js.map +1 -1
  74. package/dist/MemberPicker/index.js +134 -108
  75. package/dist/MemberPicker/index.js.map +1 -1
  76. package/dist/Menu/index.d.ts +8 -0
  77. package/dist/Menu/index.js +33 -3
  78. package/dist/Menu/index.js.map +1 -1
  79. package/dist/Modal/index.d.ts +4 -0
  80. package/dist/Modal/index.js +55 -66
  81. package/dist/Modal/index.js.map +1 -1
  82. package/dist/OverflowCount/index.js +10 -0
  83. package/dist/OverflowCount/index.js.map +1 -1
  84. package/dist/Pagination/index.js +1 -0
  85. package/dist/Pagination/index.js.map +1 -1
  86. package/dist/Popconfirm/index.js +9 -1
  87. package/dist/Popconfirm/index.js.map +1 -1
  88. package/dist/Popover/index.js +52 -1
  89. package/dist/Popover/index.js.map +1 -1
  90. package/dist/Progress/index.js +4 -0
  91. package/dist/Progress/index.js.map +1 -1
  92. package/dist/Radio/components/Group/index.d.ts +5 -1
  93. package/dist/Radio/components/Group/index.js +7 -2
  94. package/dist/Radio/components/Group/index.js.map +1 -1
  95. package/dist/Radio/components/Radio/index.js +26 -0
  96. package/dist/Radio/components/Radio/index.js.map +1 -1
  97. package/dist/Radio/interface/radio.d.ts +7 -0
  98. package/dist/Radio/interface/radioGroup.d.ts +2 -0
  99. package/dist/RenameInput/index.js +11 -0
  100. package/dist/RenameInput/index.js.map +1 -1
  101. package/dist/Select/BaseSelect.d.ts +3 -0
  102. package/dist/Select/BaseSelect.js +229 -32
  103. package/dist/Select/BaseSelect.js.map +1 -1
  104. package/dist/Select/SelectTrigger.d.ts +2 -0
  105. package/dist/Select/SelectTrigger.js +13 -5
  106. package/dist/Select/SelectTrigger.js.map +1 -1
  107. package/dist/Select/components/OptionCollection.d.ts +41 -0
  108. package/dist/Select/components/OptionCollection.js +124 -0
  109. package/dist/Select/components/OptionCollection.js.map +1 -0
  110. package/dist/Select/index.js +45 -3
  111. package/dist/Select/index.js.map +1 -1
  112. package/dist/Select/interface.d.ts +1 -1
  113. package/dist/Skeleton/index.js +1 -1
  114. package/dist/Skeleton/index.js.map +1 -1
  115. package/dist/Spin/index.d.ts +1 -1
  116. package/dist/Spin/index.js +22 -7
  117. package/dist/Spin/index.js.map +1 -1
  118. package/dist/Switch/index.d.ts +5 -0
  119. package/dist/Switch/index.js +15 -5
  120. package/dist/Switch/index.js.map +1 -1
  121. package/dist/Table/components/Header.js +0 -1
  122. package/dist/Table/components/Header.js.map +1 -1
  123. package/dist/Table/index.js +42 -27
  124. package/dist/Table/index.js.map +1 -1
  125. package/dist/Tabs/index.js +1 -0
  126. package/dist/Tabs/index.js.map +1 -1
  127. package/dist/Tag/index.js +20 -1
  128. package/dist/Tag/index.js.map +1 -1
  129. package/dist/Tooltip/index.js +34 -5
  130. package/dist/Tooltip/index.js.map +1 -1
  131. package/dist/Tour/index.js +13 -1
  132. package/dist/Tour/index.js.map +1 -1
  133. package/dist/Tree/Tree2.js +2 -0
  134. package/dist/Tree/Tree2.js.map +1 -1
  135. package/dist/_utils/dialogAccessibility.d.ts +17 -0
  136. package/dist/_utils/dialogAccessibility.js +110 -0
  137. package/dist/_utils/dialogAccessibility.js.map +1 -0
  138. package/dist/_utils/formControlSemanticOwner.d.ts +3 -0
  139. package/dist/_utils/formControlSemanticOwner.js +17 -0
  140. package/dist/_utils/formControlSemanticOwner.js.map +1 -0
  141. package/dist/_utils/overlayCoordinator.js +1 -11
  142. package/dist/_utils/overlayCoordinator.js.map +1 -1
  143. package/dist/aloudata-design.css +1 -1
  144. package/dist/theme/contract/baselineResolvedTokenValueManifest.d.ts +1 -1
  145. package/dist/theme/contract/darkResolvedTokenValueManifest.d.ts +1 -1
  146. package/dist/theme/generator/acceptedColorValues.d.ts +2 -1
  147. package/dist/theme/generator/baselineTokenValueDelivery.d.ts +9 -1
  148. package/dist/theme/generator/minimalAcceptedColorValues.d.ts +2 -2
  149. package/dist/theme/generator/neutralSourceResolver.d.ts +28 -0
  150. package/dist/theme/generator/neutralSourceResolver.js +2 -0
  151. package/dist/theme/generator/neutralSourceValues.d.ts +27 -0
  152. package/dist/theme/generator/neutralSourceValues.js +2 -0
  153. package/dist/theme/index.d.ts +2 -0
  154. package/dist/theme/index.js +1 -0
  155. package/dist/theme/neutralSourceContract.d.ts +3 -0
  156. package/dist/theme/neutralSourceContract.js +11 -0
  157. package/dist/theme/neutralSourceContract.js.map +1 -0
  158. package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.d.ts +1 -1
  159. package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.js +45 -45
  160. package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.js.map +1 -1
  161. package/dist/theme/runtime/colorValueMode/generated/slateDarkDeclarations.d.ts +3 -0
  162. package/dist/theme/runtime/colorValueMode/generated/slateDarkDeclarations.js +2 -0
  163. package/dist/theme/runtime/colorValueMode/generated/slateLightDeclarations.d.ts +3 -0
  164. package/dist/theme/runtime/colorValueMode/generated/slateLightDeclarations.js +2 -0
  165. package/dist/theme/runtime/colorValueMode/generated/stoneDarkDeclarations.d.ts +3 -0
  166. package/dist/theme/runtime/colorValueMode/generated/stoneDarkDeclarations.js +2 -0
  167. package/dist/theme/runtime/colorValueMode/generated/stoneLightDeclarations.d.ts +3 -0
  168. package/dist/theme/runtime/colorValueMode/generated/stoneLightDeclarations.js +2 -0
  169. package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.d.ts +1 -1
  170. package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.js +41 -41
  171. package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.js.map +1 -1
  172. package/dist/theme/runtime/colorValueMode/index.js +2 -12
  173. package/dist/theme/runtime/colorValueMode/index.js.map +1 -1
  174. package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.d.ts +2 -0
  175. package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.js +48 -0
  176. package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.js.map +1 -0
  177. package/dist/theme/runtime/colorValueMode/registry.d.ts +1 -1
  178. package/dist/theme/runtime/colorValueMode/registry.js +2 -1
  179. package/dist/theme/runtime/colorValueMode/registry.js.map +1 -1
  180. package/dist/theme/runtime/initAldTheme.js +1 -3
  181. package/dist/theme/runtime/initAldTheme.js.map +1 -1
  182. package/dist/theme/runtime/neutralSource/index.d.ts +6 -0
  183. package/dist/theme/runtime/neutralSource/index.js +11 -0
  184. package/dist/theme/runtime/neutralSource/index.js.map +1 -0
  185. package/dist/theme/runtime/neutralSource.d.ts +2 -0
  186. package/package.json +1 -1
@@ -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":"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"}
@@ -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 {};
@@ -0,0 +1,124 @@
1
+ import { cn } from "../../lib/utils.js";
2
+ import Memo from "../../Icon/components/CheckLightLine.js";
3
+ import { toString } from "../utils/commonUtil.js";
4
+ import "react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/Select/components/OptionCollection.tsx
7
+ /**
8
+ * Private Select collection seam for normalized, flat option data.
9
+ *
10
+ * It intentionally consumes the existing useOptions result instead of adding
11
+ * another public normalization path. Menu-shaped and hierarchical inputs stay
12
+ * on the legacy compatibility path until their Select contract is migrated.
13
+ */
14
+ function createSelectOptionCollection(listboxId, keyMenuItems) {
15
+ const options = Array.from(keyMenuItems.entries()).map(([key, option]) => ({
16
+ id: `${listboxId}-option-${key}`,
17
+ key,
18
+ value: option.value ?? key,
19
+ label: option.label,
20
+ disabled: !!option.disabled,
21
+ option
22
+ }));
23
+ return {
24
+ listboxId,
25
+ options,
26
+ enabledOptions: options.filter((option) => !option.disabled)
27
+ };
28
+ }
29
+ /**
30
+ * Visual collection renderer for the standard flat single-select popup.
31
+ *
32
+ * The legacy Menu class hooks are retained only to preserve existing Select
33
+ * geometry and option presentation while ownership moves to Select.
34
+ */
35
+ function OptionCollection({ collection, selectedValues, activeOptionKey, multiple = false, loading = false, listHeight, notFoundContent, onSelect }) {
36
+ if (collection.options.length === 0) return /* @__PURE__ */ jsx("div", {
37
+ className: "ald-menu",
38
+ "data-select-option-collection": collection.listboxId,
39
+ style: {
40
+ height: listHeight,
41
+ overflow: "auto"
42
+ },
43
+ children: /* @__PURE__ */ jsx("div", {
44
+ className: "szh-menu",
45
+ id: collection.listboxId,
46
+ role: "listbox",
47
+ "aria-multiselectable": multiple || void 0,
48
+ "aria-busy": loading || void 0,
49
+ style: {
50
+ height: listHeight,
51
+ overflow: "auto"
52
+ },
53
+ children: /* @__PURE__ */ jsx("div", {
54
+ role: "status",
55
+ "aria-live": "polite",
56
+ "aria-atomic": "true",
57
+ children: notFoundContent
58
+ })
59
+ })
60
+ });
61
+ return /* @__PURE__ */ jsx("div", {
62
+ className: "ald-menu",
63
+ "data-select-option-collection": collection.listboxId,
64
+ children: /* @__PURE__ */ jsx("div", {
65
+ className: "szh-menu",
66
+ id: collection.listboxId,
67
+ role: "listbox",
68
+ "aria-multiselectable": multiple || void 0,
69
+ "aria-busy": loading || void 0,
70
+ style: {
71
+ width: "100%",
72
+ minWidth: 0,
73
+ maxWidth: "none",
74
+ maxHeight: listHeight,
75
+ overflowY: "auto"
76
+ },
77
+ children: collection.options.map((item) => {
78
+ const selected = selectedValues.some((value) => toString(value) === toString(item.value));
79
+ return /* @__PURE__ */ jsx("div", {
80
+ id: item.id,
81
+ role: "option",
82
+ "aria-selected": selected,
83
+ "aria-disabled": item.disabled || void 0,
84
+ className: cn("szh-menu__item", "ald-menu-item", {
85
+ "szh-menu__item--disabled": item.disabled,
86
+ "ald-menu-item-selected": selected,
87
+ "szh-menu__item--hover": activeOptionKey === item.key
88
+ }),
89
+ "data-select-option-id": item.id,
90
+ onClick: () => {
91
+ if (!item.disabled) onSelect(item.value);
92
+ },
93
+ children: /* @__PURE__ */ jsxs("div", {
94
+ className: "ald-menu-item-label",
95
+ children: [
96
+ item.option.icon && /* @__PURE__ */ jsx("div", {
97
+ className: "ald-menu-item-label-icon",
98
+ children: item.option.icon
99
+ }),
100
+ /* @__PURE__ */ jsx("div", {
101
+ className: "ald-menu-item-label-text tw-text-typography-body-dense",
102
+ children: item.label
103
+ }),
104
+ (item.option.extra || selectedValues.length > 0) && /* @__PURE__ */ jsxs("div", {
105
+ className: "ald-menu-item-right",
106
+ children: [item.option.extra && /* @__PURE__ */ jsx("span", {
107
+ className: "ald-menu-item-extra",
108
+ children: item.option.extra
109
+ }), selectedValues.length > 0 && /* @__PURE__ */ jsx("div", {
110
+ className: cn("ald-menu-item-selection-slot", { "ald-menu-item-selection-slot-selected ald-menu-item-selected-icon": selected }),
111
+ children: selected ? /* @__PURE__ */ jsx(Memo, {}) : null
112
+ })]
113
+ })
114
+ ]
115
+ })
116
+ }, item.key);
117
+ })
118
+ })
119
+ });
120
+ }
121
+ //#endregion
122
+ export { createSelectOptionCollection, OptionCollection as default };
123
+
124
+ //# sourceMappingURL=OptionCollection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OptionCollection.js","names":[],"sources":["../../../src/Select/components/OptionCollection.tsx"],"sourcesContent":["import React from 'react';\nimport { CheckLightLine } from '../../Icon';\nimport { cn } from '../../lib/utils';\nimport { RawValueType, SelectItemType } from '../interface';\nimport { toString } from '../utils/commonUtil';\n\nexport interface SelectOptionCollectionItem {\n id: string;\n key: string;\n value: RawValueType;\n label: React.ReactNode;\n disabled: boolean;\n option: SelectItemType;\n}\n\nexport interface SelectOptionCollection {\n listboxId: string;\n options: SelectOptionCollectionItem[];\n enabledOptions: SelectOptionCollectionItem[];\n}\n\n/**\n * Private Select collection seam for normalized, flat option data.\n *\n * It intentionally consumes the existing useOptions result instead of adding\n * another public normalization path. Menu-shaped and hierarchical inputs stay\n * on the legacy compatibility path until their Select contract is migrated.\n */\nexport function createSelectOptionCollection(\n listboxId: string,\n keyMenuItems: Map<string, SelectItemType>,\n): SelectOptionCollection {\n const options = Array.from(keyMenuItems.entries()).map(([key, option]) => ({\n id: `${listboxId}-option-${key}`,\n key,\n value: (option.value ?? key) as RawValueType,\n label: option.label,\n disabled: !!option.disabled,\n option,\n }));\n\n return {\n listboxId,\n options,\n enabledOptions: options.filter((option) => !option.disabled),\n };\n}\n\ninterface OptionCollectionProps {\n collection: SelectOptionCollection;\n selectedValues: RawValueType[];\n activeOptionKey?: string;\n multiple?: boolean;\n loading?: boolean;\n listHeight: number;\n notFoundContent: React.ReactNode;\n onSelect: (value: RawValueType) => void;\n}\n\n/**\n * Visual collection renderer for the standard flat single-select popup.\n *\n * The legacy Menu class hooks are retained only to preserve existing Select\n * geometry and option presentation while ownership moves to Select.\n */\nexport default function OptionCollection({\n collection,\n selectedValues,\n activeOptionKey,\n multiple = false,\n loading = false,\n listHeight,\n notFoundContent,\n onSelect,\n}: OptionCollectionProps) {\n if (collection.options.length === 0) {\n return (\n <div\n className=\"ald-menu\"\n data-select-option-collection={collection.listboxId}\n style={{ height: listHeight, overflow: 'auto' }}\n >\n <div\n className=\"szh-menu\"\n id={collection.listboxId}\n role=\"listbox\"\n aria-multiselectable={multiple || undefined}\n aria-busy={loading || undefined}\n style={{ height: listHeight, overflow: 'auto' }}\n >\n <div role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n {notFoundContent}\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div\n className=\"ald-menu\"\n data-select-option-collection={collection.listboxId}\n >\n <div\n className=\"szh-menu\"\n id={collection.listboxId}\n role=\"listbox\"\n aria-multiselectable={multiple || undefined}\n aria-busy={loading || undefined}\n style={{\n width: '100%',\n minWidth: 0,\n maxWidth: 'none',\n maxHeight: listHeight,\n overflowY: 'auto',\n }}\n >\n {collection.options.map((item) => {\n const selected = selectedValues.some(\n (value) => toString(value) === toString(item.value),\n );\n\n return (\n <div\n key={item.key}\n id={item.id}\n role=\"option\"\n aria-selected={selected}\n aria-disabled={item.disabled || undefined}\n className={cn('szh-menu__item', 'ald-menu-item', {\n 'szh-menu__item--disabled': item.disabled,\n 'ald-menu-item-selected': selected,\n 'szh-menu__item--hover': activeOptionKey === item.key,\n })}\n data-select-option-id={item.id}\n onClick={() => {\n if (!item.disabled) {\n onSelect(item.value);\n }\n }}\n >\n <div className=\"ald-menu-item-label\">\n {item.option.icon && (\n <div className=\"ald-menu-item-label-icon\">\n {item.option.icon}\n </div>\n )}\n <div className=\"ald-menu-item-label-text tw-text-typography-body-dense\">\n {item.label}\n </div>\n {(item.option.extra || selectedValues.length > 0) && (\n <div className=\"ald-menu-item-right\">\n {item.option.extra && (\n <span className=\"ald-menu-item-extra\">\n {item.option.extra}\n </span>\n )}\n {selectedValues.length > 0 && (\n <div\n className={cn('ald-menu-item-selection-slot', {\n 'ald-menu-item-selection-slot-selected ald-menu-item-selected-icon':\n selected,\n })}\n >\n {selected ? <CheckLightLine /> : null}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AA4BA,SAAgB,6BACd,WACA,cACwB;CACxB,MAAM,UAAU,MAAM,KAAK,aAAa,SAAS,CAAC,CAAC,KAAK,CAAC,KAAK,aAAa;EACzE,IAAI,GAAG,UAAU,UAAU;EAC3B;EACA,OAAQ,OAAO,SAAS;EACxB,OAAO,OAAO;EACd,UAAU,CAAC,CAAC,OAAO;EACnB;EACD,EAAE;AAEH,QAAO;EACL;EACA;EACA,gBAAgB,QAAQ,QAAQ,WAAW,CAAC,OAAO,SAAS;EAC7D;;;;;;;;AAoBH,SAAwB,iBAAiB,EACvC,YACA,gBACA,iBACA,WAAW,OACX,UAAU,OACV,YACA,iBACA,YACwB;AACxB,KAAI,WAAW,QAAQ,WAAW,EAChC,QACE,oBAAC,OAAD;EACE,WAAU;EACV,iCAA+B,WAAW;EAC1C,OAAO;GAAE,QAAQ;GAAY,UAAU;GAAQ;YAE/C,oBAAC,OAAD;GACE,WAAU;GACV,IAAI,WAAW;GACf,MAAK;GACL,wBAAsB,YAAY;GAClC,aAAW,WAAW;GACtB,OAAO;IAAE,QAAQ;IAAY,UAAU;IAAQ;aAE/C,oBAAC,OAAD;IAAK,MAAK;IAAS,aAAU;IAAS,eAAY;cAC/C;IACG,CAAA;GACF,CAAA;EACF,CAAA;AAIV,QACE,oBAAC,OAAD;EACE,WAAU;EACV,iCAA+B,WAAW;YAE1C,oBAAC,OAAD;GACE,WAAU;GACV,IAAI,WAAW;GACf,MAAK;GACL,wBAAsB,YAAY;GAClC,aAAW,WAAW;GACtB,OAAO;IACL,OAAO;IACP,UAAU;IACV,UAAU;IACV,WAAW;IACX,WAAW;IACZ;aAEA,WAAW,QAAQ,KAAK,SAAS;IAChC,MAAM,WAAW,eAAe,MAC7B,UAAU,SAAS,MAAM,KAAK,SAAS,KAAK,MAAM,CACpD;AAED,WACE,oBAAC,OAAD;KAEE,IAAI,KAAK;KACT,MAAK;KACL,iBAAe;KACf,iBAAe,KAAK,YAAY;KAChC,WAAW,GAAG,kBAAkB,iBAAiB;MAC/C,4BAA4B,KAAK;MACjC,0BAA0B;MAC1B,yBAAyB,oBAAoB,KAAK;MACnD,CAAC;KACF,yBAAuB,KAAK;KAC5B,eAAe;AACb,UAAI,CAAC,KAAK,SACR,UAAS,KAAK,MAAM;;eAIxB,qBAAC,OAAD;MAAK,WAAU;gBAAf;OACG,KAAK,OAAO,QACX,oBAAC,OAAD;QAAK,WAAU;kBACZ,KAAK,OAAO;QACT,CAAA;OAER,oBAAC,OAAD;QAAK,WAAU;kBACZ,KAAK;QACF,CAAA;QACJ,KAAK,OAAO,SAAS,eAAe,SAAS,MAC7C,qBAAC,OAAD;QAAK,WAAU;kBAAf,CACG,KAAK,OAAO,SACX,oBAAC,QAAD;SAAM,WAAU;mBACb,KAAK,OAAO;SACR,CAAA,EAER,eAAe,SAAS,KACvB,oBAAC,OAAD;SACE,WAAW,GAAG,gCAAgC,EAC5C,qEACE,UACH,CAAC;mBAED,WAAW,oBAAC,MAAD,EAAkB,CAAA,GAAG;SAC7B,CAAA,CAEJ;;OAEJ;;KACF,EA9CC,KAAK,IA8CN;KAER;GACE,CAAA;EACF,CAAA"}
@@ -2,6 +2,7 @@ import DisabledContext from "../ConfigProvider/DisabledContext.js";
2
2
  import { noOpFilter, toArray, toString } from "./utils/commonUtil.js";
3
3
  import useOptions, { isRawValue } from "./hooks/useOptions.js";
4
4
  import useCache_default from "./hooks/useCache.js";
5
+ import { createSelectOptionCollection } from "./components/OptionCollection.js";
5
6
  import BaseSelect, { isMultiple } from "./BaseSelect.js";
6
7
  import { injectPropsWithOption } from "./utils/valueUtil.js";
7
8
  import useDisplayMenu from "./hooks/useDisplayMenu.js";
@@ -10,7 +11,7 @@ import { jsx } from "react/jsx-runtime";
10
11
  import useMergedState from "rc-util/es/hooks/useMergedState";
11
12
  //#region src/Select/index.tsx
12
13
  var Select_default = forwardRef(function Select(props, ref) {
13
- const { value, defaultValue, mode, menu, options, onChange, onSelect, onSearch, onDeselect, labelInValue, filterOption, searchValue, optionLabelProp, listHeight = 256, disabled: customDisabled } = props;
14
+ const { value, defaultValue, mode, menu, options, onChange, onSelect, onSearch, onDeselect, labelInValue, filterOption, searchValue, optionLabelProp, listHeight = 256, disabled: customDisabled, showSearch, dropdownRender } = props;
14
15
  const [internalValue, setInternalValue] = useMergedState(defaultValue, { value });
15
16
  const disabled = useContext(DisabledContext);
16
17
  const mergedDisabled = customDisabled ?? disabled;
@@ -21,7 +22,7 @@ var Select_default = forwardRef(function Select(props, ref) {
21
22
  optionLabelProp,
22
23
  listHeight
23
24
  });
24
- const multiple = mode && isMultiple(mode);
25
+ const multiple = isMultiple(mode);
25
26
  const [innerSearchValue, setInnerSearchValue] = useMergedState(void 0, { value: searchValue });
26
27
  const convert2LabelValues = React.useCallback((draftValues) => {
27
28
  return toArray(draftValues).map((val) => {
@@ -132,6 +133,45 @@ var Select_default = forwardRef(function Select(props, ref) {
132
133
  keyMenuItems
133
134
  ]);
134
135
  const displayMenu = useDisplayMenu(selectMenu, onSearch ? filterOption || noOpFilter : filterOption, innerSearchValue);
136
+ const useStandardOptionCollection = !menu && !dropdownRender && (!showSearch || !multiple) && !(options || []).some((option) => option.children?.length);
137
+ const collectionMenuItems = useMemo(() => {
138
+ if (!showSearch) return keyMenuItems;
139
+ const query = innerSearchValue || "";
140
+ return new Map(Array.from(keyMenuItems).filter(([, option]) => {
141
+ if (onSearch && !filterOption) return true;
142
+ if (filterOption) return filterOption(query, option);
143
+ return String(option.label ?? option.value).toLocaleLowerCase().includes(query.toLocaleLowerCase());
144
+ }));
145
+ }, [
146
+ filterOption,
147
+ innerSearchValue,
148
+ keyMenuItems,
149
+ onSearch,
150
+ showSearch
151
+ ]);
152
+ const collectionId = React.useId().replace(/:/g, "");
153
+ const optionCollection = useMemo(() => {
154
+ if (!useStandardOptionCollection) return;
155
+ return createSelectOptionCollection(`ald-select-listbox-${collectionId}`, collectionMenuItems);
156
+ }, [
157
+ collectionId,
158
+ collectionMenuItems,
159
+ useStandardOptionCollection
160
+ ]);
161
+ const onCollectionOptionSelect = useCallback((value) => {
162
+ const menuItem = keyMenuItems.get(toString(value));
163
+ const originalValue = menuItem?.value !== void 0 ? menuItem.value : value;
164
+ const selected = displayValues.some((item) => toString(item.value) === toString(originalValue));
165
+ if (multiple) triggerChange(selected ? displayValues.filter((item) => toString(item.value) !== toString(originalValue)).map((item) => item.value) : [...displayValues.map((item) => item.value), originalValue]);
166
+ else triggerChange(originalValue);
167
+ onOptionSelect(originalValue);
168
+ }, [
169
+ displayValues,
170
+ keyMenuItems,
171
+ multiple,
172
+ onOptionSelect,
173
+ triggerChange
174
+ ]);
135
175
  return /* @__PURE__ */ jsx(BaseSelect, {
136
176
  ...props,
137
177
  ref,
@@ -142,7 +182,9 @@ var Select_default = forwardRef(function Select(props, ref) {
142
182
  innerSearchValue: searchValue === void 0 ? innerSearchValue : searchValue,
143
183
  onOptionSelect,
144
184
  menu: selectMenu,
145
- displayMenu
185
+ displayMenu,
186
+ optionCollection,
187
+ onCollectionOptionSelect
146
188
  });
147
189
  });
148
190
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/Select/index.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useContext, useMemo } from 'react';\nimport {\n BaseSelectRef,\n DefaultOptionType,\n DisplayInfoType,\n DraftValueType,\n ISelectProps,\n LabelInValueType,\n RawValueType,\n} from './interface';\n\nimport useOptions, { isRawValue } from './hooks/useOptions';\nimport useMergedState from 'rc-util/es/hooks/useMergedState';\nimport { noOpFilter, toArray } from './utils/commonUtil';\nimport useCache from './hooks/useCache';\nimport BaseSelect, { BaseSelectProps, isMultiple } from './BaseSelect';\nimport { MenuInfo } from '../Menu';\nimport { injectPropsWithOption } from './utils/valueUtil';\nimport useDisplayMenu from './hooks/useDisplayMenu';\nimport { toString } from './utils/commonUtil';\nimport DisabledContext from '../ConfigProvider/DisabledContext';\n\nexport default forwardRef(function Select(\n props: ISelectProps,\n ref: React.Ref<BaseSelectRef>,\n) {\n const {\n value,\n defaultValue,\n mode,\n menu,\n options,\n onChange,\n onSelect,\n onSearch,\n onDeselect,\n labelInValue,\n filterOption,\n searchValue,\n optionLabelProp,\n listHeight = 256,\n disabled: customDisabled,\n } = props;\n\n // =========================== Values ===========================\n const [internalValue, setInternalValue] = useMergedState(defaultValue, {\n value,\n });\n const disabled = useContext(DisabledContext);\n const mergedDisabled = customDisabled ?? disabled;\n const parsedOptions = useOptions({\n menu,\n options,\n value: internalValue,\n optionLabelProp,\n listHeight,\n });\n const { menu: mergedMenu, keyMenuItems } = parsedOptions;\n const multiple = mode && isMultiple(mode);\n // ============================== SearchValue ==============================\n const [innerSearchValue, setInnerSearchValue] = useMergedState<\n string | undefined\n >(undefined, {\n value: searchValue,\n });\n // ========================= Wrap Value =========================\n const convert2LabelValues = React.useCallback(\n (draftValues: DraftValueType) => {\n // Convert to array\n const valueList = toArray(draftValues);\n\n // Convert to labelInValue type\n return valueList.map((val) => {\n let rawValue: RawValueType;\n let rawLabel: React.ReactNode;\n let rawDisabled: boolean | undefined;\n\n if (isRawValue(val)) {\n rawValue = val;\n } else {\n rawLabel = val.label;\n // @ts-ignore val.key是为了兼容存在key的情况\n rawValue = (val.value as RawValueType) ?? (val.key as RawValueType);\n }\n\n const menuItem = keyMenuItems.get(toString(rawValue));\n if (menuItem) {\n // Fill missing props\n if (rawLabel === undefined) {\n if (optionLabelProp) {\n rawLabel = menuItem[optionLabelProp] || menuItem.label;\n } else {\n rawLabel = menuItem.label;\n }\n }\n rawDisabled = menuItem.disabled;\n }\n\n return {\n label: rawLabel,\n value: rawValue,\n disabled: rawDisabled,\n };\n });\n },\n [keyMenuItems, optionLabelProp],\n );\n\n // Merged value with LabelValueType\n const rawLabeledValues = React.useMemo(() => {\n const values = convert2LabelValues(internalValue);\n\n return values;\n }, [internalValue, convert2LabelValues]);\n\n // Fill label with cache to avoid option remove\n const [mergedValues, getMixedOption] = useCache(\n rawLabeledValues,\n keyMenuItems,\n );\n\n const displayValues = React.useMemo(() => {\n // `null` need show as placeholder instead\n if (!mode && mergedValues.length === 1) {\n const firstValue = mergedValues[0];\n if (\n firstValue.value === null &&\n (firstValue.label === null || firstValue.label === undefined)\n ) {\n return [] as LabelInValueType[];\n }\n }\n\n return mergedValues.map((item) => ({\n ...item,\n label: item.label ?? item.value,\n }));\n }, [mode, mergedValues]);\n\n // =========================== Change ===========================\n const triggerChange = useCallback(\n (values: DraftValueType) => {\n const labeledValues = convert2LabelValues(values);\n setInternalValue(labeledValues);\n\n if (\n onChange &&\n // Trigger event only when value changed\n (labeledValues.length !== mergedValues.length ||\n labeledValues.some(\n (newVal, index) => mergedValues[index]?.value !== newVal?.value,\n ))\n ) {\n const returnValues = labelInValue\n ? labeledValues\n : labeledValues.map((v) => v.value);\n const returnOptions = labeledValues.map((v) =>\n injectPropsWithOption(getMixedOption(v.value)),\n );\n\n onChange(\n // Value\n multiple ? returnValues : returnValues[0],\n // Option\n multiple ? returnOptions : returnOptions[0],\n );\n }\n },\n [\n convert2LabelValues,\n setInternalValue,\n onChange,\n mergedValues,\n labelInValue,\n multiple,\n getMixedOption,\n ],\n );\n // ========================= OptionList =========================\n const triggerSelect = (\n val: RawValueType,\n selected: boolean,\n type?: DisplayInfoType,\n ) => {\n const getSelectEnt = (): [\n RawValueType | LabelInValueType,\n DefaultOptionType,\n ] => {\n const option = getMixedOption(val);\n\n return [\n labelInValue\n ? {\n label: option.label,\n value: val,\n }\n : val,\n injectPropsWithOption(option),\n ];\n };\n\n if (selected && onSelect) {\n const [wrappedValue, option] = getSelectEnt();\n onSelect(wrappedValue, option);\n } else if (!selected && onDeselect && type !== 'clear') {\n const [wrappedValue, option] = getSelectEnt();\n onDeselect(wrappedValue, option);\n }\n };\n // Used for OptionList selection\n const onOptionSelect = (val: RawValueType) => {\n // Get the original value from keyMenuItems to preserve the type (number/string)\n const menuItem = keyMenuItems.get(toString(val));\n const originalValue = menuItem?.value !== undefined ? menuItem.value : val;\n\n const selected = displayValues.find(\n (item) => toString(item.value) === toString(val),\n );\n if (isMultiple(mode)) {\n if (!selected) {\n triggerSelect(originalValue, true, 'add');\n } else {\n triggerSelect(originalValue, false, 'remove');\n }\n } else {\n triggerSelect(originalValue, true, 'add');\n }\n };\n // ======================= Display Change =======================\n // BaseSelect display values change\n const onDisplayValuesChange: BaseSelectProps['onDisplayValuesChange'] = (\n nextValues,\n info,\n ) => {\n triggerChange(nextValues);\n const { type, values } = info;\n\n if (type === 'remove' || type === 'clear') {\n values.forEach((item) => {\n triggerSelect(item.value, false, type);\n });\n }\n };\n const handleSearch = (value: string) => {\n setInnerSearchValue(value);\n if (onSearch) {\n onSearch(value);\n }\n };\n\n const selectMenu = useMemo(() => {\n return {\n ...mergedMenu,\n items: mergedMenu?.items || [],\n onClick: (menuInfo: MenuInfo) => {\n // Get the original value from keyMenuItems to preserve the type (number/string)\n const menuItem = keyMenuItems.get(menuInfo.key);\n const originalValue =\n menuItem?.value !== undefined ? menuItem.value : menuInfo.key;\n\n if (mode && isMultiple(mode)) {\n if (\n displayValues.find((item) => toString(item.value) === menuInfo.key)\n ) {\n triggerChange(\n displayValues\n .filter((item) => toString(item.value) !== menuInfo.key)\n .map((item) => item.value),\n );\n } else {\n triggerChange([...displayValues, originalValue]);\n }\n } else {\n triggerChange(originalValue);\n }\n mergedMenu?.onClick?.(menuInfo);\n },\n };\n }, [mergedMenu, mode, displayValues, triggerChange, keyMenuItems]);\n\n const displayMenu = useDisplayMenu(\n selectMenu,\n // 如果用户接管了搜索,则默认不做搜索过滤\n onSearch ? filterOption || noOpFilter : filterOption,\n innerSearchValue,\n );\n\n return (\n <BaseSelect\n {...props}\n ref={ref}\n disabled={mergedDisabled}\n displayValues={displayValues}\n onDisplayValuesChange={onDisplayValuesChange}\n setInnerSearchValue={handleSearch}\n innerSearchValue={\n searchValue === undefined ? innerSearchValue : searchValue\n }\n onOptionSelect={onOptionSelect}\n menu={selectMenu}\n displayMenu={displayMenu}\n ></BaseSelect>\n );\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/Select/index.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useContext, useMemo } from 'react';\nimport {\n BaseSelectRef,\n DefaultOptionType,\n DisplayInfoType,\n DraftValueType,\n ISelectProps,\n LabelInValueType,\n RawValueType,\n} from './interface';\n\nimport useOptions, { isRawValue } from './hooks/useOptions';\nimport useMergedState from 'rc-util/es/hooks/useMergedState';\nimport { noOpFilter, toArray } from './utils/commonUtil';\nimport useCache from './hooks/useCache';\nimport BaseSelect, { BaseSelectProps, isMultiple } from './BaseSelect';\nimport { MenuInfo } from '../Menu';\nimport { injectPropsWithOption } from './utils/valueUtil';\nimport useDisplayMenu from './hooks/useDisplayMenu';\nimport { toString } from './utils/commonUtil';\nimport DisabledContext from '../ConfigProvider/DisabledContext';\nimport {\n createSelectOptionCollection,\n SelectOptionCollection,\n} from './components/OptionCollection';\n\nexport default forwardRef(function Select(\n props: ISelectProps,\n ref: React.Ref<BaseSelectRef>,\n) {\n const {\n value,\n defaultValue,\n mode,\n menu,\n options,\n onChange,\n onSelect,\n onSearch,\n onDeselect,\n labelInValue,\n filterOption,\n searchValue,\n optionLabelProp,\n listHeight = 256,\n disabled: customDisabled,\n showSearch,\n dropdownRender,\n } = props;\n\n // =========================== Values ===========================\n const [internalValue, setInternalValue] = useMergedState(defaultValue, {\n value,\n });\n const disabled = useContext(DisabledContext);\n const mergedDisabled = customDisabled ?? disabled;\n const parsedOptions = useOptions({\n menu,\n options,\n value: internalValue,\n optionLabelProp,\n listHeight,\n });\n const { menu: mergedMenu, keyMenuItems } = parsedOptions;\n const multiple = isMultiple(mode);\n // ============================== SearchValue ==============================\n const [innerSearchValue, setInnerSearchValue] = useMergedState<\n string | undefined\n >(undefined, {\n value: searchValue,\n });\n // ========================= Wrap Value =========================\n const convert2LabelValues = React.useCallback(\n (draftValues: DraftValueType) => {\n // Convert to array\n const valueList = toArray(draftValues);\n\n // Convert to labelInValue type\n return valueList.map((val) => {\n let rawValue: RawValueType;\n let rawLabel: React.ReactNode;\n let rawDisabled: boolean | undefined;\n\n if (isRawValue(val)) {\n rawValue = val;\n } else {\n rawLabel = val.label;\n // @ts-ignore val.key是为了兼容存在key的情况\n rawValue = (val.value as RawValueType) ?? (val.key as RawValueType);\n }\n\n const menuItem = keyMenuItems.get(toString(rawValue));\n if (menuItem) {\n // Fill missing props\n if (rawLabel === undefined) {\n if (optionLabelProp) {\n rawLabel = menuItem[optionLabelProp] || menuItem.label;\n } else {\n rawLabel = menuItem.label;\n }\n }\n rawDisabled = menuItem.disabled;\n }\n\n return {\n label: rawLabel,\n value: rawValue,\n disabled: rawDisabled,\n };\n });\n },\n [keyMenuItems, optionLabelProp],\n );\n\n // Merged value with LabelValueType\n const rawLabeledValues = React.useMemo(() => {\n const values = convert2LabelValues(internalValue);\n\n return values;\n }, [internalValue, convert2LabelValues]);\n\n // Fill label with cache to avoid option remove\n const [mergedValues, getMixedOption] = useCache(\n rawLabeledValues,\n keyMenuItems,\n );\n\n const displayValues = React.useMemo(() => {\n // `null` need show as placeholder instead\n if (!mode && mergedValues.length === 1) {\n const firstValue = mergedValues[0];\n if (\n firstValue.value === null &&\n (firstValue.label === null || firstValue.label === undefined)\n ) {\n return [] as LabelInValueType[];\n }\n }\n\n return mergedValues.map((item) => ({\n ...item,\n label: item.label ?? item.value,\n }));\n }, [mode, mergedValues]);\n\n // =========================== Change ===========================\n const triggerChange = useCallback(\n (values: DraftValueType) => {\n const labeledValues = convert2LabelValues(values);\n setInternalValue(labeledValues);\n\n if (\n onChange &&\n // Trigger event only when value changed\n (labeledValues.length !== mergedValues.length ||\n labeledValues.some(\n (newVal, index) => mergedValues[index]?.value !== newVal?.value,\n ))\n ) {\n const returnValues = labelInValue\n ? labeledValues\n : labeledValues.map((v) => v.value);\n const returnOptions = labeledValues.map((v) =>\n injectPropsWithOption(getMixedOption(v.value)),\n );\n\n onChange(\n // Value\n multiple ? returnValues : returnValues[0],\n // Option\n multiple ? returnOptions : returnOptions[0],\n );\n }\n },\n [\n convert2LabelValues,\n setInternalValue,\n onChange,\n mergedValues,\n labelInValue,\n multiple,\n getMixedOption,\n ],\n );\n // ========================= OptionList =========================\n const triggerSelect = (\n val: RawValueType,\n selected: boolean,\n type?: DisplayInfoType,\n ) => {\n const getSelectEnt = (): [\n RawValueType | LabelInValueType,\n DefaultOptionType,\n ] => {\n const option = getMixedOption(val);\n\n return [\n labelInValue\n ? {\n label: option.label,\n value: val,\n }\n : val,\n injectPropsWithOption(option),\n ];\n };\n\n if (selected && onSelect) {\n const [wrappedValue, option] = getSelectEnt();\n onSelect(wrappedValue, option);\n } else if (!selected && onDeselect && type !== 'clear') {\n const [wrappedValue, option] = getSelectEnt();\n onDeselect(wrappedValue, option);\n }\n };\n // Used for OptionList selection\n const onOptionSelect = (val: RawValueType) => {\n // Get the original value from keyMenuItems to preserve the type (number/string)\n const menuItem = keyMenuItems.get(toString(val));\n const originalValue = menuItem?.value !== undefined ? menuItem.value : val;\n\n const selected = displayValues.find(\n (item) => toString(item.value) === toString(val),\n );\n if (isMultiple(mode)) {\n if (!selected) {\n triggerSelect(originalValue, true, 'add');\n } else {\n triggerSelect(originalValue, false, 'remove');\n }\n } else {\n triggerSelect(originalValue, true, 'add');\n }\n };\n // ======================= Display Change =======================\n // BaseSelect display values change\n const onDisplayValuesChange: BaseSelectProps['onDisplayValuesChange'] = (\n nextValues,\n info,\n ) => {\n triggerChange(nextValues);\n const { type, values } = info;\n\n if (type === 'remove' || type === 'clear') {\n values.forEach((item) => {\n triggerSelect(item.value, false, type);\n });\n }\n };\n const handleSearch = (value: string) => {\n setInnerSearchValue(value);\n if (onSearch) {\n onSearch(value);\n }\n };\n\n const selectMenu = useMemo(() => {\n return {\n ...mergedMenu,\n items: mergedMenu?.items || [],\n onClick: (menuInfo: MenuInfo) => {\n // Get the original value from keyMenuItems to preserve the type (number/string)\n const menuItem = keyMenuItems.get(menuInfo.key);\n const originalValue =\n menuItem?.value !== undefined ? menuItem.value : menuInfo.key;\n\n if (mode && isMultiple(mode)) {\n if (\n displayValues.find((item) => toString(item.value) === menuInfo.key)\n ) {\n triggerChange(\n displayValues\n .filter((item) => toString(item.value) !== menuInfo.key)\n .map((item) => item.value),\n );\n } else {\n triggerChange([...displayValues, originalValue]);\n }\n } else {\n triggerChange(originalValue);\n }\n mergedMenu?.onClick?.(menuInfo);\n },\n };\n }, [mergedMenu, mode, displayValues, triggerChange, keyMenuItems]);\n\n const displayMenu = useDisplayMenu(\n selectMenu,\n // 如果用户接管了搜索,则默认不做搜索过滤\n onSearch ? filterOption || noOpFilter : filterOption,\n innerSearchValue,\n );\n\n // Flat standard options use the private collection. Menu-shaped,\n // searchable, custom popup, and nested inputs remain on the legacy path.\n const useStandardOptionCollection =\n !menu &&\n !dropdownRender &&\n (!showSearch || !multiple) &&\n !(options || []).some((option) => option.children?.length);\n const collectionMenuItems = useMemo(() => {\n if (!showSearch) {\n return keyMenuItems;\n }\n\n const query = innerSearchValue || '';\n return new Map(\n Array.from(keyMenuItems).filter(([, option]) => {\n if (onSearch && !filterOption) {\n return true;\n }\n if (filterOption) {\n return filterOption(query, option);\n }\n return String(option.label ?? option.value)\n .toLocaleLowerCase()\n .includes(query.toLocaleLowerCase());\n }),\n );\n }, [filterOption, innerSearchValue, keyMenuItems, onSearch, showSearch]);\n const collectionId = React.useId().replace(/:/g, '');\n const optionCollection = useMemo<SelectOptionCollection | undefined>(() => {\n if (!useStandardOptionCollection) {\n return undefined;\n }\n\n return createSelectOptionCollection(\n `ald-select-listbox-${collectionId}`,\n collectionMenuItems,\n );\n }, [collectionId, collectionMenuItems, useStandardOptionCollection]);\n\n const onCollectionOptionSelect = useCallback(\n (value: RawValueType) => {\n const menuItem = keyMenuItems.get(toString(value));\n const originalValue =\n menuItem?.value !== undefined ? menuItem.value : value;\n\n const selected = displayValues.some(\n (item) => toString(item.value) === toString(originalValue),\n );\n if (multiple) {\n triggerChange(\n selected\n ? displayValues\n .filter(\n (item) => toString(item.value) !== toString(originalValue),\n )\n .map((item) => item.value)\n : [...displayValues.map((item) => item.value), originalValue],\n );\n } else {\n triggerChange(originalValue);\n }\n onOptionSelect(originalValue);\n },\n [displayValues, keyMenuItems, multiple, onOptionSelect, triggerChange],\n );\n\n return (\n <BaseSelect\n {...props}\n ref={ref}\n disabled={mergedDisabled}\n displayValues={displayValues}\n onDisplayValuesChange={onDisplayValuesChange}\n setInnerSearchValue={handleSearch}\n innerSearchValue={\n searchValue === undefined ? innerSearchValue : searchValue\n }\n onOptionSelect={onOptionSelect}\n menu={selectMenu}\n displayMenu={displayMenu}\n optionCollection={optionCollection}\n onCollectionOptionSelect={onCollectionOptionSelect}\n ></BaseSelect>\n );\n});\n"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { PlacementType } from '../Dropdown';
2
2
  import { ItemType, MenuDividerType, MenuHeaderType, MenuProps, SubMenuType } from '../Menu';
3
3
  import { CustomTagProps, Mode } from './BaseSelect.js';
4
4
  type ArrayElementType<T> = T extends (infer E)[] ? E : T;
5
- export interface ISelectProps<ValueType = any, OptionType extends BaseOptionType = DefaultOptionType> {
5
+ export interface ISelectProps<ValueType = any, OptionType extends BaseOptionType = DefaultOptionType> extends React.AriaAttributes {
6
6
  prefix?: React.ReactNode;
7
7
  size?: 'small' | 'middle' | 'large';
8
8
  mode?: Mode;
@@ -26,7 +26,7 @@ var INPUT_SIZE_MAP = {
26
26
  default: 32,
27
27
  large: 40
28
28
  };
29
- var SKELETON_BACKGROUND_COLOR = "var(--alias-colors-bg-skeleton-subtle, var(--background-neutral-subtle, #e5e7eb))";
29
+ var SKELETON_BACKGROUND_COLOR = "var(--background-neutral-surface)";
30
30
  var SkeletonButton = ({ active, size = "default", shape = "square", block, className, style }) => {
31
31
  const animClass = active ? "tw-animate-pulse" : "";
32
32
  const dims = BUTTON_SIZE_MAP[size];