@rainbow-oh/yee-c 0.4.4 → 0.5.0

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 (272) hide show
  1. package/dist/cjs/Button/button.d.ts +1 -1
  2. package/dist/cjs/CSV/download.d.ts +1 -1
  3. package/dist/cjs/Carousel/carousel.d.ts +2 -2
  4. package/dist/cjs/Carousel/carousel.js +9 -2
  5. package/dist/cjs/Carousel/interface.d.ts +5 -0
  6. package/dist/cjs/Dialog/demo/basic.js +1 -1
  7. package/dist/cjs/Dialog/dialog.js +1 -1
  8. package/dist/cjs/Drawer/style/index.less +4 -0
  9. package/dist/cjs/Field/demo/validation.js +23 -3
  10. package/dist/cjs/Field/field.js +1 -1
  11. package/dist/cjs/FloatButton/float-button.d.ts +1 -1
  12. package/dist/cjs/Form/Field.js +1 -4
  13. package/dist/cjs/Form/Form.js +1 -1
  14. package/dist/cjs/Form/Group.js +36 -14
  15. package/dist/cjs/Form/List.js +23 -3
  16. package/dist/cjs/Form/demo/async-validate.d.ts +3 -0
  17. package/dist/cjs/Form/demo/async-validate.js +108 -0
  18. package/dist/cjs/Form/demo/basic.js +2 -2
  19. package/dist/cjs/Form/demo/virtual.js +1 -1
  20. package/dist/cjs/Form/form-store.d.ts +4 -4
  21. package/dist/cjs/Form/form-store.js +55 -25
  22. package/dist/cjs/Form/interface.d.ts +10 -7
  23. package/dist/cjs/Form/style/index.less +15 -0
  24. package/dist/cjs/Form/utils/validate.d.ts +23 -2
  25. package/dist/cjs/Form/utils/validate.js +59 -10
  26. package/dist/cjs/Input/style/index.less +0 -17
  27. package/dist/cjs/InputNumber/style/index.less +0 -29
  28. package/dist/cjs/PickerPanel/interface.d.ts +44 -2
  29. package/dist/cjs/PickerPanel/panels/DatePanel/DateBody.d.ts +2 -1
  30. package/dist/cjs/PickerPanel/panels/DatePanel/DateHeader.d.ts +2 -1
  31. package/dist/cjs/PickerPanel/panels/DatePanel/DateHeader.js +1 -1
  32. package/dist/cjs/PickerPanel/panels/DatePanel/index.d.ts +2 -1
  33. package/dist/cjs/PickerPanel/panels/DateTimePanel/index.d.ts +7 -1
  34. package/dist/cjs/PickerPanel/panels/DateTimePanel/index.js +18 -4
  35. package/dist/cjs/PickerPanel/panels/DecadePanel/DecadeBody.d.ts +2 -1
  36. package/dist/cjs/PickerPanel/panels/DecadePanel/DecadeBody.js +1 -1
  37. package/dist/cjs/PickerPanel/panels/DecadePanel/DecadeHeader.d.ts +2 -1
  38. package/dist/cjs/PickerPanel/panels/DecadePanel/DecadeHeader.js +1 -1
  39. package/dist/cjs/PickerPanel/panels/DecadePanel/index.d.ts +2 -1
  40. package/dist/cjs/PickerPanel/panels/DecadePanel/index.js +1 -1
  41. package/dist/cjs/PickerPanel/panels/Header.d.ts +13 -1
  42. package/dist/cjs/PickerPanel/panels/MonthPanel/MonthBody.d.ts +2 -1
  43. package/dist/cjs/PickerPanel/panels/MonthPanel/MonthHeader.d.ts +2 -1
  44. package/dist/cjs/PickerPanel/panels/MonthPanel/MonthHeader.js +1 -1
  45. package/dist/cjs/PickerPanel/panels/MonthPanel/index.d.ts +2 -1
  46. package/dist/cjs/PickerPanel/panels/MonthPanel/index.js +1 -1
  47. package/dist/cjs/PickerPanel/panels/PanelBody.d.ts +21 -1
  48. package/dist/cjs/PickerPanel/panels/PanelBody.js +3 -3
  49. package/dist/cjs/PickerPanel/panels/QuarterPanel/QuarterBody.d.ts +2 -1
  50. package/dist/cjs/PickerPanel/panels/QuarterPanel/QuarterHeader.d.ts +2 -1
  51. package/dist/cjs/PickerPanel/panels/QuarterPanel/index.d.ts +2 -1
  52. package/dist/cjs/PickerPanel/panels/RangePanel/index.d.ts +2 -1
  53. package/dist/cjs/PickerPanel/panels/RangePanel/index.js +2 -2
  54. package/dist/cjs/PickerPanel/panels/RangePanel/interface.d.ts +5 -5
  55. package/dist/cjs/PickerPanel/panels/TimePanel/TimeBody.d.ts +17 -1
  56. package/dist/cjs/PickerPanel/panels/TimePanel/TimeCell.d.ts +7 -1
  57. package/dist/cjs/PickerPanel/panels/TimePanel/TimeCell.js +1 -1
  58. package/dist/cjs/PickerPanel/panels/TimePanel/TimeColumn.d.ts +14 -1
  59. package/dist/cjs/PickerPanel/panels/TimePanel/TimeColumn.js +1 -1
  60. package/dist/cjs/PickerPanel/panels/TimePanel/TimeHeader.d.ts +4 -1
  61. package/dist/cjs/PickerPanel/panels/TimePanel/index.d.ts +9 -1
  62. package/dist/cjs/PickerPanel/panels/WeekPanel/WeekBody.d.ts +2 -1
  63. package/dist/cjs/PickerPanel/panels/WeekPanel/WeekHeader.d.ts +2 -1
  64. package/dist/cjs/PickerPanel/panels/WeekPanel/index.d.ts +2 -1
  65. package/dist/cjs/PickerPanel/panels/YearPanel/YearBody.d.ts +2 -1
  66. package/dist/cjs/PickerPanel/panels/YearPanel/YearBody.js +2 -2
  67. package/dist/cjs/PickerPanel/panels/YearPanel/YearHeader.d.ts +2 -1
  68. package/dist/cjs/PickerPanel/panels/YearPanel/YearHeader.js +7 -1
  69. package/dist/cjs/PickerPanel/panels/YearPanel/index.d.ts +2 -1
  70. package/dist/cjs/PickerPanel/panels/YearPanel/index.js +1 -1
  71. package/dist/cjs/PickerPanel/utils/pickerUtils.d.ts +7 -7
  72. package/dist/cjs/PickerPanel/utils/pickerUtils.js +2 -2
  73. package/dist/cjs/Select/demo/basic.js +1 -1
  74. package/dist/cjs/Select/demo/virtual.d.ts +3 -0
  75. package/dist/cjs/Select/demo/virtual.js +55 -0
  76. package/dist/cjs/Select/hooks/useSelectKeyboard.d.ts +7 -1
  77. package/dist/cjs/Select/hooks/useSelectKeyboard.js +16 -6
  78. package/dist/cjs/Select/interface.d.ts +44 -0
  79. package/dist/cjs/Select/option.js +3 -2
  80. package/dist/cjs/Select/options.js +115 -15
  81. package/dist/cjs/Select/select.js +20 -4
  82. package/dist/cjs/Select/style/index.less +17 -13
  83. package/dist/cjs/Selector/style/index.less +2 -137
  84. package/dist/cjs/Table/style/index.less +19 -0
  85. package/dist/cjs/TextArea/style/index.less +0 -17
  86. package/dist/cjs/hooks/index.d.ts +2 -1
  87. package/dist/cjs/hooks/index.js +3 -1
  88. package/dist/cjs/hooks/useEvent.js +4 -1
  89. package/dist/cjs/hooks/useVirtualList.d.ts +71 -0
  90. package/dist/cjs/hooks/useVirtualList.js +117 -0
  91. package/dist/cjs/style/size.css +1 -0
  92. package/dist/cjs/style/themes.css +1 -1
  93. package/dist/cjs/style/variables.css +2 -1
  94. package/dist/cjs/version.d.ts +1 -1
  95. package/dist/cjs/version.js +1 -1
  96. package/dist/esm/Button/button.d.ts +1 -1
  97. package/dist/esm/CSV/download.d.ts +1 -1
  98. package/dist/esm/Carousel/carousel.d.ts +2 -2
  99. package/dist/esm/Carousel/carousel.js +5 -1
  100. package/dist/esm/Carousel/interface.d.ts +5 -0
  101. package/dist/esm/Dialog/demo/basic.js +1 -1
  102. package/dist/esm/Dialog/dialog.js +1 -1
  103. package/dist/esm/Drawer/style/index.less +4 -0
  104. package/dist/esm/Field/demo/validation.js +30 -9
  105. package/dist/esm/Field/field.js +2 -1
  106. package/dist/esm/FloatButton/float-button.d.ts +1 -1
  107. package/dist/esm/Form/Field.js +3 -4
  108. package/dist/esm/Form/Form.js +1 -1
  109. package/dist/esm/Form/Group.js +142 -53
  110. package/dist/esm/Form/List.js +61 -42
  111. package/dist/esm/Form/demo/async-validate.d.ts +3 -0
  112. package/dist/esm/Form/demo/async-validate.js +95 -0
  113. package/dist/esm/Form/demo/basic.js +4 -2
  114. package/dist/esm/Form/demo/virtual.js +1 -1
  115. package/dist/esm/Form/form-store.d.ts +4 -4
  116. package/dist/esm/Form/form-store.js +187 -93
  117. package/dist/esm/Form/interface.d.ts +10 -7
  118. package/dist/esm/Form/style/index.less +15 -0
  119. package/dist/esm/Form/utils/validate.d.ts +23 -2
  120. package/dist/esm/Form/utils/validate.js +122 -17
  121. package/dist/esm/Input/style/index.less +0 -17
  122. package/dist/esm/InputNumber/style/index.less +0 -29
  123. package/dist/esm/PickerPanel/interface.d.ts +44 -2
  124. package/dist/esm/PickerPanel/panels/DatePanel/DateBody.d.ts +2 -1
  125. package/dist/esm/PickerPanel/panels/DatePanel/DateHeader.d.ts +2 -1
  126. package/dist/esm/PickerPanel/panels/DatePanel/DateHeader.js +1 -1
  127. package/dist/esm/PickerPanel/panels/DatePanel/index.d.ts +2 -1
  128. package/dist/esm/PickerPanel/panels/DateTimePanel/index.d.ts +7 -1
  129. package/dist/esm/PickerPanel/panels/DateTimePanel/index.js +11 -7
  130. package/dist/esm/PickerPanel/panels/DecadePanel/DecadeBody.d.ts +2 -1
  131. package/dist/esm/PickerPanel/panels/DecadePanel/DecadeBody.js +2 -1
  132. package/dist/esm/PickerPanel/panels/DecadePanel/DecadeHeader.d.ts +2 -1
  133. package/dist/esm/PickerPanel/panels/DecadePanel/DecadeHeader.js +2 -1
  134. package/dist/esm/PickerPanel/panels/DecadePanel/index.d.ts +2 -1
  135. package/dist/esm/PickerPanel/panels/DecadePanel/index.js +1 -1
  136. package/dist/esm/PickerPanel/panels/Header.d.ts +13 -1
  137. package/dist/esm/PickerPanel/panels/MonthPanel/MonthBody.d.ts +2 -1
  138. package/dist/esm/PickerPanel/panels/MonthPanel/MonthHeader.d.ts +2 -1
  139. package/dist/esm/PickerPanel/panels/MonthPanel/MonthHeader.js +2 -1
  140. package/dist/esm/PickerPanel/panels/MonthPanel/index.d.ts +2 -1
  141. package/dist/esm/PickerPanel/panels/MonthPanel/index.js +1 -1
  142. package/dist/esm/PickerPanel/panels/PanelBody.d.ts +21 -1
  143. package/dist/esm/PickerPanel/panels/PanelBody.js +2 -4
  144. package/dist/esm/PickerPanel/panels/QuarterPanel/QuarterBody.d.ts +2 -1
  145. package/dist/esm/PickerPanel/panels/QuarterPanel/QuarterHeader.d.ts +2 -1
  146. package/dist/esm/PickerPanel/panels/QuarterPanel/index.d.ts +2 -1
  147. package/dist/esm/PickerPanel/panels/RangePanel/index.d.ts +2 -1
  148. package/dist/esm/PickerPanel/panels/RangePanel/index.js +2 -2
  149. package/dist/esm/PickerPanel/panels/RangePanel/interface.d.ts +5 -5
  150. package/dist/esm/PickerPanel/panels/TimePanel/TimeBody.d.ts +17 -1
  151. package/dist/esm/PickerPanel/panels/TimePanel/TimeCell.d.ts +7 -1
  152. package/dist/esm/PickerPanel/panels/TimePanel/TimeCell.js +1 -1
  153. package/dist/esm/PickerPanel/panels/TimePanel/TimeColumn.d.ts +14 -1
  154. package/dist/esm/PickerPanel/panels/TimePanel/TimeColumn.js +1 -1
  155. package/dist/esm/PickerPanel/panels/TimePanel/TimeHeader.d.ts +4 -1
  156. package/dist/esm/PickerPanel/panels/TimePanel/index.d.ts +9 -1
  157. package/dist/esm/PickerPanel/panels/WeekPanel/WeekBody.d.ts +2 -1
  158. package/dist/esm/PickerPanel/panels/WeekPanel/WeekHeader.d.ts +2 -1
  159. package/dist/esm/PickerPanel/panels/WeekPanel/index.d.ts +2 -1
  160. package/dist/esm/PickerPanel/panels/YearPanel/YearBody.d.ts +2 -1
  161. package/dist/esm/PickerPanel/panels/YearPanel/YearBody.js +3 -2
  162. package/dist/esm/PickerPanel/panels/YearPanel/YearHeader.d.ts +2 -1
  163. package/dist/esm/PickerPanel/panels/YearPanel/YearHeader.js +2 -1
  164. package/dist/esm/PickerPanel/panels/YearPanel/index.d.ts +2 -1
  165. package/dist/esm/PickerPanel/panels/YearPanel/index.js +1 -1
  166. package/dist/esm/PickerPanel/picker-panel.js +3 -0
  167. package/dist/esm/PickerPanel/utils/pickerUtils.d.ts +7 -7
  168. package/dist/esm/PickerPanel/utils/pickerUtils.js +4 -10
  169. package/dist/esm/Select/demo/basic.js +1 -1
  170. package/dist/esm/Select/demo/virtual.d.ts +3 -0
  171. package/dist/esm/Select/demo/virtual.js +38 -0
  172. package/dist/esm/Select/hooks/useSelectKeyboard.d.ts +7 -1
  173. package/dist/esm/Select/hooks/useSelectKeyboard.js +25 -9
  174. package/dist/esm/Select/interface.d.ts +44 -0
  175. package/dist/esm/Select/option.js +4 -2
  176. package/dist/esm/Select/options.js +132 -13
  177. package/dist/esm/Select/select.js +19 -4
  178. package/dist/esm/Select/style/index.less +17 -13
  179. package/dist/esm/Selector/style/index.less +2 -137
  180. package/dist/esm/Table/style/index.less +19 -0
  181. package/dist/esm/TextArea/style/index.less +0 -17
  182. package/dist/esm/hooks/index.d.ts +2 -1
  183. package/dist/esm/hooks/index.js +2 -1
  184. package/dist/esm/hooks/useVirtualList.d.ts +71 -0
  185. package/dist/esm/hooks/useVirtualList.js +129 -0
  186. package/dist/esm/style/size.css +1 -0
  187. package/dist/esm/style/themes.css +1 -1
  188. package/dist/esm/style/variables.css +2 -1
  189. package/dist/esm/version.d.ts +1 -1
  190. package/dist/esm/version.js +1 -1
  191. package/dist/umd/yee-c.min.css +2 -2
  192. package/dist/umd/yee-c.min.js +1 -1
  193. package/package.json +1 -1
  194. package/src/Carousel/carousel.tsx +14 -3
  195. package/src/Carousel/interface.ts +6 -0
  196. package/src/Cascader/cascader.tsx +3 -1
  197. package/src/Cascader/column.tsx +1 -1
  198. package/src/Dialog/demo/basic.tsx +1 -1
  199. package/src/Dialog/dialog.tsx +1 -1
  200. package/src/Drawer/style/index.less +4 -0
  201. package/src/Dropdown/dropdown.tsx +1 -1
  202. package/src/Field/demo/validation.tsx +2 -2
  203. package/src/Field/field.tsx +2 -1
  204. package/src/Field/index.en-US.md +1 -1
  205. package/src/Field/index.zh-CN.md +1 -1
  206. package/src/FloatButton/float-button.tsx +5 -3
  207. package/src/Form/Field.tsx +3 -4
  208. package/src/Form/Form.tsx +1 -1
  209. package/src/Form/Group.tsx +15 -12
  210. package/src/Form/List.tsx +3 -3
  211. package/src/Form/demo/async-validate.tsx +71 -0
  212. package/src/Form/demo/basic.tsx +2 -2
  213. package/src/Form/demo/virtual.tsx +1 -1
  214. package/src/Form/form-store.ts +37 -21
  215. package/src/Form/index.en-US.md +6 -5
  216. package/src/Form/index.zh-CN.md +6 -5
  217. package/src/Form/interface.ts +13 -7
  218. package/src/Form/style/index.less +15 -0
  219. package/src/Form/utils/validate.ts +65 -13
  220. package/src/Input/style/index.less +0 -17
  221. package/src/InputNumber/style/index.less +0 -29
  222. package/src/PickerPanel/interface.ts +43 -2
  223. package/src/PickerPanel/panels/DatePanel/DateBody.tsx +2 -1
  224. package/src/PickerPanel/panels/DatePanel/DateHeader.tsx +3 -2
  225. package/src/PickerPanel/panels/DatePanel/index.tsx +2 -1
  226. package/src/PickerPanel/panels/DateTimePanel/index.tsx +12 -5
  227. package/src/PickerPanel/panels/DecadePanel/DecadeBody.tsx +3 -2
  228. package/src/PickerPanel/panels/DecadePanel/DecadeHeader.tsx +3 -2
  229. package/src/PickerPanel/panels/DecadePanel/index.tsx +3 -2
  230. package/src/PickerPanel/panels/Header.tsx +14 -1
  231. package/src/PickerPanel/panels/MonthPanel/MonthBody.tsx +2 -1
  232. package/src/PickerPanel/panels/MonthPanel/MonthHeader.tsx +3 -2
  233. package/src/PickerPanel/panels/MonthPanel/index.tsx +3 -2
  234. package/src/PickerPanel/panels/PanelBody.tsx +27 -5
  235. package/src/PickerPanel/panels/QuarterPanel/QuarterBody.tsx +2 -1
  236. package/src/PickerPanel/panels/QuarterPanel/QuarterHeader.tsx +2 -1
  237. package/src/PickerPanel/panels/QuarterPanel/index.tsx +2 -1
  238. package/src/PickerPanel/panels/RangePanel/index.tsx +11 -9
  239. package/src/PickerPanel/panels/RangePanel/interface.ts +5 -5
  240. package/src/PickerPanel/panels/TimePanel/TimeBody.tsx +21 -5
  241. package/src/PickerPanel/panels/TimePanel/TimeCell.tsx +9 -2
  242. package/src/PickerPanel/panels/TimePanel/TimeColumn.tsx +15 -2
  243. package/src/PickerPanel/panels/TimePanel/TimeHeader.tsx +5 -1
  244. package/src/PickerPanel/panels/TimePanel/index.tsx +10 -1
  245. package/src/PickerPanel/panels/WeekPanel/WeekBody.tsx +2 -1
  246. package/src/PickerPanel/panels/WeekPanel/WeekHeader.tsx +2 -1
  247. package/src/PickerPanel/panels/WeekPanel/index.tsx +2 -1
  248. package/src/PickerPanel/panels/YearPanel/YearBody.tsx +4 -3
  249. package/src/PickerPanel/panels/YearPanel/YearHeader.tsx +9 -3
  250. package/src/PickerPanel/panels/YearPanel/index.tsx +3 -2
  251. package/src/PickerPanel/picker-panel.tsx +5 -3
  252. package/src/PickerPanel/utils/pickerUtils.ts +17 -8
  253. package/src/Select/demo/basic.tsx +1 -1
  254. package/src/Select/demo/virtual.tsx +25 -0
  255. package/src/Select/hooks/useSelectKeyboard.ts +30 -6
  256. package/src/Select/index.en-US.md +4 -0
  257. package/src/Select/index.zh-CN.md +4 -0
  258. package/src/Select/interface.ts +48 -2
  259. package/src/Select/option.tsx +2 -1
  260. package/src/Select/options.tsx +139 -8
  261. package/src/Select/select.tsx +23 -1
  262. package/src/Select/style/index.less +17 -13
  263. package/src/Selector/style/index.less +2 -137
  264. package/src/Splitter/hooks/useMove.ts +2 -2
  265. package/src/Table/style/index.less +19 -0
  266. package/src/TextArea/style/index.less +0 -17
  267. package/src/hooks/index.ts +2 -0
  268. package/src/hooks/useEvent.ts +7 -4
  269. package/src/hooks/useMergedState.ts +6 -4
  270. package/src/hooks/useVirtualList.ts +169 -0
  271. package/src/style/size.css +1 -0
  272. package/src/version.ts +1 -1
@@ -14,7 +14,7 @@ function TimeCell(props) {
14
14
  return /*#__PURE__*/React.createElement("li", {
15
15
  className: cls,
16
16
  onClick: function onClick() {
17
- return onSelect(value);
17
+ return onSelect === null || onSelect === void 0 ? void 0 : onSelect(value);
18
18
  }
19
19
  }, /*#__PURE__*/React.createElement("div", {
20
20
  className: "".concat(prefixCls, "-time-panel-cell-inner")
@@ -1,3 +1,16 @@
1
+ import { Dayjs } from 'dayjs';
1
2
  import React from 'react';
2
- declare function TimeColumn(props: any): React.JSX.Element;
3
+ import type { TimeUnit } from '../../interface';
4
+ interface TimeColumnProps {
5
+ prefixCls?: string;
6
+ type: TimeUnit;
7
+ value?: Dayjs;
8
+ cells: Dayjs[];
9
+ disabled?: boolean;
10
+ onSelect?: (date: Dayjs) => void;
11
+ viewDate?: Dayjs;
12
+ maxDate?: Dayjs;
13
+ minDate?: Dayjs;
14
+ }
15
+ declare function TimeColumn(props: TimeColumnProps): React.JSX.Element;
3
16
  export default TimeColumn;
@@ -28,7 +28,7 @@ function TimeColumn(props) {
28
28
  selectedCell = _React$useState2[0],
29
29
  setSelectedCell = _React$useState2[1];
30
30
  React.useLayoutEffect(function () {
31
- if (value !== -1 && selectedRef.current) {
31
+ if (value !== undefined && selectedRef.current) {
32
32
  var _ref$current, _selectedRef$current;
33
33
  (_ref$current = ref.current) === null || _ref$current === void 0 || _ref$current.scrollTo({
34
34
  top: (_selectedRef$current = selectedRef.current) === null || _selectedRef$current === void 0 ? void 0 : _selectedRef$current.offsetTop,
@@ -1,3 +1,6 @@
1
1
  import React from 'react';
2
- declare function TimeHeader(props: any): React.JSX.Element;
2
+ interface TimeHeaderProps {
3
+ prefixCls?: string;
4
+ }
5
+ declare function TimeHeader(props: TimeHeaderProps): React.JSX.Element;
3
6
  export default TimeHeader;
@@ -1,3 +1,11 @@
1
1
  import * as React from 'react';
2
- declare function TimePanel(props: any): React.JSX.Element;
2
+ import type { PanelSharedProps } from '../../interface';
3
+ interface TimePanelProps extends PanelSharedProps {
4
+ format?: string;
5
+ hourStep?: number;
6
+ minuteStep?: number;
7
+ secondStep?: number;
8
+ showTitle?: boolean;
9
+ }
10
+ declare function TimePanel(props: TimePanelProps): React.JSX.Element;
3
11
  export default TimePanel;
@@ -1,3 +1,4 @@
1
1
  import * as React from 'react';
2
- declare function WeekBody(props: any): React.JSX.Element;
2
+ import type { PanelSharedProps } from '../../interface';
3
+ declare function WeekBody(props: PanelSharedProps): React.JSX.Element;
3
4
  export default WeekBody;
@@ -1,2 +1,3 @@
1
1
  import * as React from 'react';
2
- export default function WeekHeader(props: any): React.JSX.Element;
2
+ import type { PanelSharedProps } from '../../interface';
3
+ export default function WeekHeader(props: PanelSharedProps): React.JSX.Element;
@@ -1,2 +1,3 @@
1
1
  import React from 'react';
2
- export default function WeekPanel(props: any): React.JSX.Element;
2
+ import type { PanelSharedProps } from '../../interface';
3
+ export default function WeekPanel(props: PanelSharedProps): React.JSX.Element;
@@ -1,3 +1,4 @@
1
1
  import * as React from 'react';
2
- declare function YearBody(props: any): React.JSX.Element;
2
+ import type { PanelSharedProps } from '../../interface';
3
+ declare function YearBody(props: PanelSharedProps): React.JSX.Element;
3
4
  export default YearBody;
@@ -21,7 +21,8 @@ function YearBody(props) {
21
21
  maxDate = props.maxDate,
22
22
  minDate = props.minDate,
23
23
  nowDate = props.nowDate,
24
- offsetYear = props.offsetYear,
24
+ _props$offsetYear = props.offsetYear,
25
+ offsetYear = _props$offsetYear === void 0 ? 0 : _props$offsetYear,
25
26
  _props$hoverRange = props.hoverRange,
26
27
  hoverRange = _props$hoverRange === void 0 ? [] : _props$hoverRange,
27
28
  _props$selectedRange = props.selectedRange,
@@ -45,7 +46,7 @@ function YearBody(props) {
45
46
  });
46
47
  var getCellTitle = useEvent(function (currentDate) {
47
48
  var _year = pickerUtils.getYear(currentDate) + offsetYear;
48
- return _year < 1000 ? '0' + _year : _year;
49
+ return _year < 1000 ? '0' + _year : String(_year);
49
50
  });
50
51
  var getCellClassName = useEvent(function (currentDate) {
51
52
  var currentYear = pickerUtils.getYear(currentDate);
@@ -1,2 +1,3 @@
1
1
  import * as React from 'react';
2
- export default function YearHeader(props: any): React.JSX.Element;
2
+ import type { PanelSharedProps } from '../../interface';
3
+ export default function YearHeader(props: PanelSharedProps): React.JSX.Element;
@@ -8,7 +8,8 @@ export default function YearHeader(props) {
8
8
  viewDate = props.viewDate,
9
9
  onViewDateChange = props.onViewDateChange,
10
10
  onPanelChange = props.onPanelChange,
11
- offsetYear = props.offsetYear;
11
+ _props$offsetYear = props.offsetYear,
12
+ offsetYear = _props$offsetYear === void 0 ? 0 : _props$offsetYear;
12
13
  var viewYear = pickerUtils.getYear(viewDate);
13
14
  var startYear = viewYear - viewYear % 10 + offsetYear;
14
15
  var endYear = startYear + 9;
@@ -1,2 +1,3 @@
1
1
  import React from 'react';
2
- export default function DecadePanel(props: any): React.JSX.Element;
2
+ import type { PanelSharedProps } from '../../interface';
3
+ export default function DecadePanel(props: PanelSharedProps): React.JSX.Element;
@@ -7,7 +7,7 @@ export default function DecadePanel(props) {
7
7
  offset = props.offset;
8
8
  var offsetYear = 0;
9
9
  if (offset !== null && offset !== void 0 && offset.year) {
10
- offsetYear = parseInt(offset.year);
10
+ offsetYear = offset.year;
11
11
  }
12
12
  return /*#__PURE__*/React.createElement("div", {
13
13
  className: "".concat(prefixCls, "-year-panel")
@@ -95,6 +95,9 @@ var PickerPanel = /*#__PURE__*/React.forwardRef(function (props, ref) {
95
95
  setMergedPickerView(newViewDate);
96
96
  onPanelChange === null || onPanelChange === void 0 || onPanelChange(newViewDate);
97
97
  };
98
+
99
+ // `PanelBody` clears the hover by passing `''`; forward as-is to preserve
100
+ // the existing runtime behavior.
98
101
  var handleMouseChange = function handleMouseChange(date) {
99
102
  onCellMouse === null || onCellMouse === void 0 || onCellMouse(date);
100
103
  };
@@ -1,8 +1,8 @@
1
- import dayjs, { Dayjs } from 'dayjs';
1
+ import dayjs, { Dayjs, OpUnitType } from 'dayjs';
2
2
  type PickerType = 'year' | 'quarter' | 'month' | 'week' | 'day' | 'second' | 'minute' | 'hour';
3
3
  declare const d: {
4
4
  dayjs: typeof dayjs;
5
- init: (date?: string, ...rest: any[]) => dayjs.Dayjs;
5
+ init: (date?: dayjs.ConfigType, option?: dayjs.OptionType) => dayjs.Dayjs;
6
6
  getNow: () => dayjs.Dayjs;
7
7
  getYear: (date: Dayjs) => number;
8
8
  getQuarter: (date: Dayjs) => number;
@@ -13,7 +13,7 @@ declare const d: {
13
13
  getMinute: (date: Dayjs) => number;
14
14
  getSecond: (date: Dayjs) => number;
15
15
  format: (date: Dayjs, format: string) => string;
16
- isSame: (date1: Dayjs, date2: Dayjs, type?: PickerType) => boolean;
16
+ isSame: (date1: Dayjs | undefined, date2: Dayjs | undefined, type?: PickerType) => boolean;
17
17
  setYear: (date: Dayjs, year: number) => dayjs.Dayjs;
18
18
  setMonth: (date: Dayjs, month: number) => dayjs.Dayjs;
19
19
  setDate: (date: Dayjs, day: number) => dayjs.Dayjs;
@@ -23,10 +23,10 @@ declare const d: {
23
23
  addYear: (date: Dayjs, offset: number) => dayjs.Dayjs;
24
24
  addMonth: (date: Dayjs, offset: number) => dayjs.Dayjs;
25
25
  addDate: (date: Dayjs, offset: number) => dayjs.Dayjs;
26
- isAfter: (date1: Dayjs, date2: Dayjs, type?: 'day' | 'hour' | 'minute' | 'second' | 'year' | 'month') => boolean;
27
- isBefore: (date1: Dayjs, date2: Dayjs, type?: 'day' | 'hour' | 'minute' | 'second' | 'year' | 'month') => boolean;
28
- isValid: (date: Dayjs, format?: string, strict?: boolean) => boolean;
29
- isBetween: (date: Dayjs, start: Dayjs, end: Dayjs, ...args: any[]) => boolean;
26
+ isAfter: (date1: Dayjs, date2: Dayjs | undefined, type?: 'day' | 'hour' | 'minute' | 'second' | 'year' | 'month') => boolean;
27
+ isBefore: (date1: Dayjs, date2: Dayjs | undefined, type?: 'day' | 'hour' | 'minute' | 'second' | 'year' | 'month') => boolean;
28
+ isValid: (date: Dayjs | undefined, format?: string, strict?: boolean) => boolean;
29
+ isBetween: (date: Dayjs, start: Dayjs, end: Dayjs, unit?: OpUnitType, nulls?: '()' | '[]' | '[)' | '(]') => boolean;
30
30
  getCellClassName: ({ date, startHoverDate, endHoverDate, startSelectedDate, endSelectedDate, unit, prefixCls, }: {
31
31
  date: Dayjs;
32
32
  startHoverDate: Dayjs | null | undefined;
@@ -21,11 +21,8 @@ dayjs.extend(buddhistEra); // Buddhist calendar
21
21
 
22
22
  var d = {
23
23
  dayjs: dayjs,
24
- init: function init(date) {
25
- for (var _len = arguments.length, rest = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
26
- rest[_key - 1] = arguments[_key];
27
- }
28
- return dayjs.apply(void 0, [date].concat(rest));
24
+ init: function init(date, option) {
25
+ return dayjs(date, option);
29
26
  },
30
27
  getNow: function getNow() {
31
28
  return d.init(undefined);
@@ -97,11 +94,8 @@ var d = {
97
94
  isValid: function isValid(date, format, strict) {
98
95
  return dayjs(date, format, strict).isValid();
99
96
  },
100
- isBetween: function isBetween(date, start, end) {
101
- for (var _len2 = arguments.length, args = new Array(_len2 > 3 ? _len2 - 3 : 0), _key2 = 3; _key2 < _len2; _key2++) {
102
- args[_key2 - 3] = arguments[_key2];
103
- }
104
- return date && start && end ? date.isBetween.apply(date, [start, end].concat(args)) : false;
97
+ isBetween: function isBetween(date, start, end, unit, nulls) {
98
+ return date && start && end ? date.isBetween(start, end, unit, nulls) : false;
105
99
  },
106
100
  getCellClassName: function getCellClassName(_ref) {
107
101
  var date = _ref.date,
@@ -38,7 +38,7 @@ var options = [{
38
38
  value: 'peach'
39
39
  }];
40
40
  export default (function () {
41
- var _useState = useState('apple'),
41
+ var _useState = useState('mango'),
42
42
  _useState2 = _slicedToArray(_useState, 2),
43
43
  value = _useState2[0],
44
44
  setValue = _useState2[1];
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ declare const _default: () => React.JSX.Element;
3
+ export default _default;
@@ -0,0 +1,38 @@
1
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
3
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
4
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
5
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
6
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
+ import { Select } from "../..";
8
+ import React, { useState } from 'react';
9
+
10
+ // Build a large option set (5000 items) to demonstrate virtual scrolling.
11
+ // Even with this many options, the DOM only holds the visible window.
12
+ var options = Array.from({
13
+ length: 5000
14
+ }, function (_, i) {
15
+ return {
16
+ label: "Option ".concat(i + 1),
17
+ value: i
18
+ };
19
+ });
20
+ export default (function () {
21
+ var _useState = useState(100),
22
+ _useState2 = _slicedToArray(_useState, 2),
23
+ value = _useState2[0],
24
+ setValue = _useState2[1];
25
+ return /*#__PURE__*/React.createElement(Select, {
26
+ virtual: true,
27
+ searchable: true,
28
+ value: value,
29
+ onChange: function onChange(val) {
30
+ return setValue(val);
31
+ },
32
+ options: options,
33
+ style: {
34
+ width: 200
35
+ },
36
+ placeholder: "Please select"
37
+ });
38
+ });
@@ -11,8 +11,14 @@ interface UseSelectKeyboardParams {
11
11
  onClose?: () => void;
12
12
  onOpenChange?: (open: boolean) => void;
13
13
  containerRef?: React.RefObject<HTMLElement>;
14
+ /**
15
+ * Virtual-mode scroll hook. When provided, keyboard navigation drives the
16
+ * virtual viewport through this callback instead of calling scrollIntoView
17
+ * (the focused option may not be in the DOM while virtualized).
18
+ */
19
+ scrollToIndex?: (index: number) => void;
14
20
  }
15
- export default function useSelectKeyboard({ options, open, selectedKeys, onSelect, onClose, onOpenChange, containerRef, }: UseSelectKeyboardParams): {
21
+ export default function useSelectKeyboard({ options, open, selectedKeys, onSelect, onClose, onOpenChange, containerRef, scrollToIndex, }: UseSelectKeyboardParams): {
16
22
  focusedKey: string | number;
17
23
  onKeyDown: (event: React.KeyboardEvent) => void;
18
24
  };
@@ -13,7 +13,8 @@ export default function useSelectKeyboard(_ref) {
13
13
  onSelect = _ref.onSelect,
14
14
  onClose = _ref.onClose,
15
15
  onOpenChange = _ref.onOpenChange,
16
- containerRef = _ref.containerRef;
16
+ containerRef = _ref.containerRef,
17
+ scrollToIndex = _ref.scrollToIndex;
17
18
  var _useState = useState(''),
18
19
  _useState2 = _slicedToArray(_useState, 2),
19
20
  focusedKey = _useState2[0],
@@ -51,6 +52,12 @@ export default function useSelectKeyboard(_ref) {
51
52
 
52
53
  // Scroll the focused option into view
53
54
  var scrollOptionIntoView = function scrollOptionIntoView(index) {
55
+ // Virtual mode: drive the virtual viewport directly, since the option
56
+ // element may not be mounted when it lies outside the render window.
57
+ if (scrollToIndex) {
58
+ scrollToIndex(index);
59
+ return;
60
+ }
54
61
  var container = containerRef === null || containerRef === void 0 ? void 0 : containerRef.current;
55
62
  if (!container) return;
56
63
  var optionElements = container.querySelectorAll('[role="option"]');
@@ -152,22 +159,31 @@ export default function useSelectKeyboard(_ref) {
152
159
  useEffect(function () {
153
160
  if (open) {
154
161
  // Focus the first selected option, or the first enabled option
162
+ var focusedValue = '';
155
163
  if ((selectedKeys === null || selectedKeys === void 0 ? void 0 : selectedKeys.length) > 0) {
156
164
  var firstSelected = options === null || options === void 0 ? void 0 : options.find(function (opt) {
157
165
  return opt.value === selectedKeys[0];
158
166
  });
159
167
  if (firstSelected && !firstSelected.disabled) {
160
- setFocusedKey(firstSelected.value);
161
- return;
168
+ focusedValue = firstSelected.value;
162
169
  }
163
170
  }
164
- // Find the first enabled option
165
- var firstEnabled = options === null || options === void 0 ? void 0 : options.find(function (opt) {
166
- return !opt.disabled;
167
- });
168
- if (firstEnabled) {
169
- setFocusedKey(firstEnabled.value);
171
+ if (!focusedValue) {
172
+ // Find the first enabled option
173
+ var firstEnabled = options === null || options === void 0 ? void 0 : options.find(function (opt) {
174
+ return !opt.disabled;
175
+ });
176
+ if (firstEnabled) {
177
+ focusedValue = firstEnabled.value;
178
+ }
179
+ }
180
+ if (focusedValue) {
181
+ setFocusedKey(focusedValue);
170
182
  }
183
+ // Scrolling the focused option into view in virtual mode is handled by
184
+ // <Options> itself (it owns the viewport + virtual list), which avoids
185
+ // the first-open timing issue where this effect runs before the virtual
186
+ // API ref is wired up.
171
187
  } else {
172
188
  // Clear focused key when closing
173
189
  setFocusedKey('');
@@ -94,6 +94,26 @@ export interface SelectProps extends DataAttributeProps {
94
94
  * Callback when searching
95
95
  */
96
96
  onFilter?: (value: string, options: Array<Option>) => Array<Option>;
97
+ /**
98
+ * Enable virtual scrolling for the dropdown.
99
+ *
100
+ * When enabled, only the options inside the visible window are rendered
101
+ * (the DOM node count stays constant regardless of how many options there
102
+ * are). Recommended for large option sets (hundreds or thousands).
103
+ * @default false
104
+ */
105
+ virtual?: boolean;
106
+ /**
107
+ * Height of each option in pixels. Required to be a fixed value when
108
+ * `virtual` is enabled (the list assumes every option has exactly this height).
109
+ * @default 32
110
+ */
111
+ itemHeight?: number;
112
+ /**
113
+ * Max height of the dropdown popup in pixels.
114
+ * @default 200
115
+ */
116
+ listHeight?: number;
97
117
  }
98
118
  /**
99
119
  * Props for the internal Option component (renders a single dropdown option).
@@ -119,6 +139,11 @@ export interface OptionProps {
119
139
  * Test id forwarded to the option element
120
140
  */
121
141
  dataTestId?: string;
142
+ /**
143
+ * Inline style forwarded to the option element.
144
+ * Used by virtual scrolling to position each option absolutely.
145
+ */
146
+ style?: React.CSSProperties;
122
147
  }
123
148
  /**
124
149
  * Context value shared between Options and each Option.
@@ -167,6 +192,25 @@ export interface OptionsProps extends Omit<React.HTMLAttributes<HTMLDivElement>,
167
192
  * Whether multiple selection mode is active
168
193
  */
169
194
  multiple: boolean;
195
+ /**
196
+ * Whether virtual scrolling is enabled
197
+ */
198
+ virtual?: boolean;
199
+ /**
200
+ * Fixed option height in pixels (only meaningful when `virtual` is enabled)
201
+ */
202
+ itemHeight?: number;
203
+ /**
204
+ * Max popup height in pixels (only meaningful when `virtual` is enabled)
205
+ */
206
+ listHeight?: number;
207
+ /**
208
+ * Ref that receives the virtual list API (currently `scrollToIndex`),
209
+ * so the parent can wire keyboard navigation to the virtual viewport.
210
+ */
211
+ virtualApiRef?: React.MutableRefObject<{
212
+ scrollToIndex: (index: number) => void;
213
+ } | null>;
170
214
  /**
171
215
  * Callback when an option is selected
172
216
  */
@@ -11,7 +11,8 @@ var Option = function Option(props) {
11
11
  value = props.value,
12
12
  disabled = props.disabled,
13
13
  title = props.title,
14
- dataTestId = props.dataTestId;
14
+ dataTestId = props.dataTestId,
15
+ style = props.style;
15
16
  var _useContext = useContext(OptionsCtx),
16
17
  prefixCls = _useContext.prefixCls,
17
18
  selectedKeys = _useContext.selectedKeys,
@@ -37,7 +38,8 @@ var Option = function Option(props) {
37
38
  role: "option",
38
39
  tabIndex: disabled ? undefined : 0,
39
40
  title: htmlTitle,
40
- "data-testid": dataTestId
41
+ "data-testid": dataTestId,
42
+ style: style
41
43
  }, /*#__PURE__*/React.createElement("div", {
42
44
  className: "".concat(prefixCls, "-option-content")
43
45
  }, label), multiple && selected && /*#__PURE__*/React.createElement("span", {
@@ -1,9 +1,10 @@
1
- var _excluded = ["prefixCls", "options", "popupClassName", "popupStyle", "selectedKeys", "focusedKey", "dataTestId", "multiple", "onSelect"];
1
+ var _excluded = ["prefixCls", "options", "popupClassName", "popupStyle", "selectedKeys", "focusedKey", "dataTestId", "multiple", "virtual", "itemHeight", "listHeight", "virtualApiRef", "onSelect"];
2
2
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
3
3
  function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
4
4
  function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
5
5
  import clsx from 'clsx';
6
- import React, { createContext, forwardRef, useRef } from 'react';
6
+ import React, { createContext, forwardRef, useEffect, useImperativeHandle, useRef } from 'react';
7
+ import useVirtualList from "../hooks/useVirtualList";
7
8
  import { useLocale } from "../locale";
8
9
  import Option from "./option";
9
10
  export var OptionsCtx = /*#__PURE__*/createContext({});
@@ -19,26 +20,144 @@ var Options = /*#__PURE__*/forwardRef(function (props, ref) {
19
20
  focusedKey = props.focusedKey,
20
21
  dataTestId = props.dataTestId,
21
22
  multiple = props.multiple,
23
+ virtual = props.virtual,
24
+ _props$itemHeight = props.itemHeight,
25
+ itemHeight = _props$itemHeight === void 0 ? 32 : _props$itemHeight,
26
+ _props$listHeight = props.listHeight,
27
+ listHeight = _props$listHeight === void 0 ? 200 : _props$listHeight,
28
+ virtualApiRef = props.virtualApiRef,
22
29
  onSelect = props.onSelect,
23
30
  rest = _objectWithoutProperties(props, _excluded);
31
+ var rootRef = useRef(null);
32
+ // Forward the popup root element to the parent (Select uses it as the
33
+ // keyboard-nav containerRef) while keeping a stable RefObject for the
34
+ // effects below.
35
+ useImperativeHandle(ref, function () {
36
+ return rootRef.current;
37
+ }, []);
24
38
 
25
- // eslint-disable-next-line react-hooks/rules-of-hooks
26
- var componentRef = ref || useRef(null);
39
+ // Hook is always called (rules of hooks). When `virtual` is off the
40
+ // returned viewportRef is never attached, so the observer stays idle.
41
+ var _useVirtualList = useVirtualList({
42
+ itemCount: options.length,
43
+ itemHeight: itemHeight
44
+ }),
45
+ start = _useVirtualList.start,
46
+ end = _useVirtualList.end,
47
+ offsetY = _useVirtualList.offsetY,
48
+ totalHeight = _useVirtualList.totalHeight,
49
+ viewportRef = _useVirtualList.viewportRef,
50
+ onScroll = _useVirtualList.onScroll,
51
+ scrollToIndex = _useVirtualList.scrollToIndex;
52
+
53
+ // Expose the virtual scroll API to the parent so keyboard navigation
54
+ // can drive the virtual viewport (replaces scrollIntoView).
55
+ useEffect(function () {
56
+ if (!virtual || !virtualApiRef) return;
57
+ virtualApiRef.current = {
58
+ scrollToIndex: scrollToIndex
59
+ };
60
+ return function () {
61
+ if (virtualApiRef.current) {
62
+ virtualApiRef.current = null;
63
+ }
64
+ };
65
+ }, [virtual, virtualApiRef, scrollToIndex]);
66
+
67
+ // Reset the scroll position whenever the option set changes (e.g. after
68
+ // filtering via search), otherwise the viewport may sit at an offset
69
+ // where none of the new results are visible.
70
+ useEffect(function () {
71
+ if (virtual) {
72
+ scrollToIndex(0);
73
+ }
74
+ }, [options, virtual, scrollToIndex]);
75
+
76
+ // Bring the focused option into view on open and whenever it changes.
77
+ // - virtual mode: drive the virtual viewport via scrollToIndex.
78
+ // - default mode: scrollIntoView on the option's DOM node.
79
+ // Options owns this (rather than the keyboard hook) so it also covers the
80
+ // initial open, where the keyboard effect can fire before the popup is
81
+ // mounted / the virtual API ref is wired up.
82
+ useEffect(function () {
83
+ if (options.length === 0) return;
84
+ if (focusedKey === '') return;
85
+ var focusedIndex = options.findIndex(function (o) {
86
+ return o.value === focusedKey;
87
+ });
88
+ if (focusedIndex < 0) return;
89
+ if (virtual) {
90
+ scrollToIndex(focusedIndex);
91
+ return;
92
+ }
93
+ var container = rootRef.current;
94
+ if (!container) return;
95
+ var optionElements = container.querySelectorAll('[role="option"]');
96
+ var targetElement = optionElements[focusedIndex];
97
+ if (targetElement) {
98
+ targetElement.scrollIntoView({
99
+ block: 'nearest'
100
+ });
101
+ }
102
+ }, [focusedKey, virtual, options, scrollToIndex, rootRef]);
103
+ var isEmpty = options.length === 0;
104
+ var ctxValue = {
105
+ prefixCls: prefixCls,
106
+ selectedKeys: selectedKeys,
107
+ focusedKey: focusedKey,
108
+ multiple: multiple,
109
+ onSelect: onSelect
110
+ };
111
+
112
+ // ----- Virtual mode: only render the visible window -----
113
+ if (virtual && !isEmpty) {
114
+ var visibleOptions = options.slice(start, end);
115
+ return /*#__PURE__*/React.createElement("div", _extends({}, rest, {
116
+ className: clsx("".concat(prefixCls, "-popup"), "".concat(prefixCls, "-popup-virtual"), popupClassName),
117
+ style: popupStyle,
118
+ ref: rootRef,
119
+ tabIndex: -1
120
+ }), /*#__PURE__*/React.createElement(OptionsCtx.Provider, {
121
+ value: ctxValue
122
+ }, /*#__PURE__*/React.createElement("div", {
123
+ className: "".concat(prefixCls, "-popup-viewport"),
124
+ ref: viewportRef,
125
+ onScroll: onScroll,
126
+ style: {
127
+ maxHeight: listHeight,
128
+ overflowY: 'auto'
129
+ }
130
+ }, /*#__PURE__*/React.createElement("div", {
131
+ style: {
132
+ height: totalHeight,
133
+ position: 'relative'
134
+ }
135
+ }, visibleOptions.map(function (option, i) {
136
+ return /*#__PURE__*/React.createElement(Option, _extends({}, option, {
137
+ key: option.value,
138
+ dataTestId: "".concat(dataTestId, "-").concat(start + i),
139
+ style: {
140
+ position: 'absolute',
141
+ top: 0,
142
+ left: 0,
143
+ right: 0,
144
+ height: itemHeight,
145
+ transform: "translateY(".concat(offsetY + i * itemHeight, "px)")
146
+ }
147
+ }));
148
+ })))));
149
+ }
150
+
151
+ // ----- Default mode: render every option (unchanged behavior) -----
27
152
  return /*#__PURE__*/React.createElement("div", _extends({}, rest, {
28
153
  className: clsx("".concat(prefixCls, "-popup"), popupClassName),
29
154
  style: popupStyle,
30
- ref: componentRef,
155
+ ref: rootRef,
31
156
  tabIndex: -1
32
- }), options.length === 0 ? /*#__PURE__*/React.createElement("div", {
157
+ }), isEmpty ? /*#__PURE__*/React.createElement("div", {
33
158
  className: "".concat(prefixCls, "-empty")
34
159
  }, select.noData) : /*#__PURE__*/React.createElement(OptionsCtx.Provider, {
35
- value: {
36
- prefixCls: prefixCls,
37
- selectedKeys: selectedKeys,
38
- focusedKey: focusedKey,
39
- multiple: multiple,
40
- onSelect: onSelect
41
- }
160
+ value: ctxValue
42
161
  }, options.map(function (option, index) {
43
162
  return /*#__PURE__*/React.createElement(Option, _extends({}, option, {
44
163
  key: option.value,