@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
@@ -113,7 +113,7 @@ export interface FormInstance<Values = any> {
113
113
  /**
114
114
  * Submit form
115
115
  */
116
- submit: () => ValidateMessage[];
116
+ submit: () => Promise<ValidateMessage[]>;
117
117
  /**
118
118
  * Get all field values
119
119
  */
@@ -140,7 +140,7 @@ export interface FormInstance<Values = any> {
140
140
  validateField: (
141
141
  name: Name,
142
142
  trigger?: 'onChange' | 'onBlur',
143
- ) => ValidateMessage[];
143
+ ) => Promise<ValidateMessage[]>;
144
144
  /**
145
145
  * Get callback functions
146
146
  */
@@ -152,7 +152,10 @@ export interface FormInstance<Values = any> {
152
152
  /**
153
153
  * Validate fields and get error messages
154
154
  */
155
- validateFields: (names?: Name[], trigger?: TRIGGER) => ValidateMessage[];
155
+ validateFields: (
156
+ names?: Name[],
157
+ trigger?: TRIGGER,
158
+ ) => Promise<ValidateMessage[]>;
156
159
  /**
157
160
  * Initialize form - mainly used to set initial values and callbacks
158
161
  */
@@ -233,9 +236,12 @@ export type Rule = {
233
236
  */
234
237
  message?: string;
235
238
  /**
236
- * Custom validation function, returns true for pass, false or throw for fail
239
+ * Custom validation function. Supports sync and async:
240
+ * - sync: return true/undefined to pass, return false or throw to fail
241
+ * - async: return a Promise (resolve to pass, reject/throw to fail)
242
+ * When throwing/rejecting with an Error, its message overrides rule.message.
237
243
  */
238
- validator?: (value: unknown) => boolean;
244
+ validator?: (value: unknown) => boolean | void | Promise<boolean | void>;
239
245
  /**
240
246
  * Validation trigger timing
241
247
  */
@@ -354,7 +360,7 @@ export type FormListField<T = any> = {
354
360
  };
355
361
 
356
362
  export type FormListOperation = {
357
- add: (defaultValue?: any, insertIndex?: number) => void;
363
+ add: (defaultValue?: any, insertIndex?: number) => void | Promise<void>;
358
364
  remove: (index: number | number[]) => void;
359
365
  move: (from: number, to: number) => void;
360
366
  };
@@ -403,6 +409,6 @@ export type FieldGroupProps = {
403
409
  };
404
410
 
405
411
  export interface GroupEntity {
406
- validate: (force: boolean) => ValidateMessage[];
412
+ validate: (force: boolean) => Promise<ValidateMessage[]>;
407
413
  reset: () => void;
408
414
  }
@@ -56,5 +56,20 @@
56
56
  color: var(--yee-error-color);
57
57
  }
58
58
  }
59
+
60
+ // 表单校验态:在此重定义控件读取的 border / box-shadow 变量,
61
+ // 后代里的 Input / Selector / InputNumber / TextArea 等通过 CSS 变量继承自动变色,
62
+ // 无需在每个组件里重复 .yee-form-item-error 块,也不存在 specificity / !important 问题。
63
+ &&-error {
64
+ --yee-input-border-color: var(--yee-error-color);
65
+ --yee-input-hover-border-color: var(--yee-error-color-hover);
66
+ --yee-input-focus-bs-color: var(--yee-error-color-border);
67
+ }
68
+
69
+ &&-warning {
70
+ --yee-input-border-color: var(--yee-warning-color);
71
+ --yee-input-hover-border-color: var(--yee-warning-color-hover);
72
+ --yee-input-focus-bs-color: var(--yee-warning-color-border);
73
+ }
59
74
  }
60
75
  }
@@ -1,5 +1,4 @@
1
- // true: 校验通过;false校验未通过
2
- import { Rule } from '../interface';
1
+ import type { Rule } from '../interface';
3
2
 
4
3
  function isEmpty(v: unknown) {
5
4
  return v === undefined || v === null || v === '' ? true : false;
@@ -60,11 +59,15 @@ function verifyRuleOfRegexp(regexp: RegExp, value: unknown) {
60
59
  }
61
60
  }
62
61
 
63
- /**
64
- * @returns validated
65
- * */
66
- function verifyMain(rule: Rule, value: any): boolean {
67
- const { min, max, minLength, maxLength, regexp, validator } = rule;
62
+ export interface ValidateResult {
63
+ passed: boolean;
64
+ // Custom message from a thrown/rejected validator; falls back to rule.message upstream
65
+ message?: string;
66
+ }
67
+
68
+ // Check the synchronous built-in rules (min/max/minLength/maxLength/regexp).
69
+ function verifySyncRules(rule: Rule, value: unknown): boolean {
70
+ const { min, max, minLength, maxLength, regexp } = rule;
68
71
 
69
72
  if (typeof min !== 'undefined' && !verifyRuleOfMin(min, value)) {
70
73
  return false;
@@ -87,18 +90,67 @@ function verifyMain(rule: Rule, value: any): boolean {
87
90
  if (regexp instanceof RegExp && !verifyRuleOfRegexp(regexp, value)) {
88
91
  return false;
89
92
  }
90
- if (typeof validator === 'function' && !validator(value)) {
91
- return false;
92
- }
93
93
  return true;
94
94
  }
95
95
 
96
- function validate(rule: Rule, value: unknown): boolean {
96
+ /**
97
+ * Run a custom validator, dispatching between sync and async at runtime.
98
+ *
99
+ * Supports all of the following shapes (backwards compatible):
100
+ * - sync `return true` / `return undefined` → pass
101
+ * - sync `return false` → fail (use rule.message)
102
+ * - sync `throw new Error(msg)` → fail (use msg)
103
+ * - async `return Promise.resolve()` → pass
104
+ * - async `return Promise.resolve(false)` → fail (use rule.message)
105
+ * - async `throw` / `return Promise.reject(new Error(msg))` → fail (use msg)
106
+ */
107
+ export async function runValidator(
108
+ validator: NonNullable<Rule['validator']>,
109
+ value: unknown,
110
+ ): Promise<ValidateResult> {
111
+ try {
112
+ const res = validator(value);
113
+ if (res instanceof Promise) {
114
+ const resolved = await res;
115
+ if (resolved === false) {
116
+ return { passed: false };
117
+ }
118
+ return { passed: true };
119
+ }
120
+ if (res === false) {
121
+ return { passed: false };
122
+ }
123
+ return { passed: true };
124
+ } catch (e) {
125
+ return {
126
+ passed: false,
127
+ message: e instanceof Error ? e.message : String(e),
128
+ };
129
+ }
130
+ }
131
+
132
+ /**
133
+ * Validate a single rule against a value.
134
+ * Returns { passed, message? }. Sync rules short-circuit; the custom validator
135
+ * is awaited so async validators are supported.
136
+ */
137
+ async function validate(
138
+ rule: Rule,
139
+ value: unknown,
140
+ ): Promise<ValidateResult> {
97
141
  if (rule.required && isEmpty(value)) {
98
- return false;
142
+ return { passed: false };
143
+ }
144
+
145
+ if (!verifySyncRules(rule, value)) {
146
+ return { passed: false };
147
+ }
148
+
149
+ if (typeof rule.validator === 'function') {
150
+ return runValidator(rule.validator, value);
99
151
  }
100
152
 
101
- return verifyMain(rule, value);
153
+ return { passed: true };
102
154
  }
103
155
 
104
156
  export default validate;
@@ -110,20 +110,3 @@ input[type='number']::-webkit-outer-spin-button {
110
110
  input::placeholder {
111
111
  color: var(--yee-placeholder-color);
112
112
  }
113
-
114
- // form error status
115
- .yee-form-item-error {
116
- @{pls} {
117
- border-color: var(--yee-error-color);
118
-
119
- &:hover {
120
- border-color: var(--yee-error-color-hover);
121
- }
122
- }
123
- }
124
-
125
- .yee-form-item-warning {
126
- @{pls} {
127
- border-color: var(--yee-warning-color);
128
- }
129
- }
@@ -185,32 +185,3 @@
185
185
  padding-right: 0;
186
186
  }
187
187
  }
188
-
189
- // Form error status
190
- .yee-form-item-error {
191
- @{pls} {
192
- border-color: var(--yee-error-color);
193
-
194
- &:not(@{pls}-disabled):hover {
195
- border-color: var(--yee-error-color);
196
- }
197
-
198
- &-focused {
199
- box-shadow: 0 0 0 2px var(--yee-input-content-error-focus-bs-color);
200
- }
201
- }
202
- }
203
-
204
- .yee-form-item-warning {
205
- @{pls} {
206
- border-color: var(--yee-warning-color);
207
-
208
- &:not(@{pls}-disabled):hover {
209
- border-color: var(--yee-warning-color);
210
- }
211
-
212
- &-focused {
213
- box-shadow: 0 0 0 2px var(--yee-input-content-warning-focus-bs-color);
214
- }
215
- }
216
- }
@@ -1,4 +1,5 @@
1
1
  import { Dayjs } from 'dayjs';
2
+ import type { usePanelConfigs } from './configs/locale-adapter';
2
3
  export type PickerType =
3
4
  | 'date'
4
5
  | 'week'
@@ -18,6 +19,9 @@ export type SemanticType =
18
19
 
19
20
  export type UnitType = 'day' | 'hour' | 'minute' | 'second';
20
21
 
22
+ /** Hour/minute/second granularity used by the time sub-panels. */
23
+ export type TimeUnit = 'hour' | 'minute' | 'second';
24
+
21
25
  interface HeaderProps {
22
26
  showPrevIcon?: boolean;
23
27
  showNextIcon?: boolean;
@@ -115,13 +119,50 @@ export interface PickerPanelProps extends HeaderProps {
115
119
  /**
116
120
  * Hover range dates [start date, end date]
117
121
  */
118
- hoverRange?: Array<Dayjs | null>;
122
+ hoverRange?: Array<Dayjs | null | undefined>;
119
123
  /**
120
124
  * Selected range dates [start date, end date]
121
125
  */
122
- selectedRange?: Array<Dayjs | null>;
126
+ selectedRange?: Array<Dayjs | null | undefined>;
123
127
  /**
124
128
  * Disabled date function
125
129
  */
126
130
  disabledDate?: (current: Dayjs) => boolean;
127
131
  }
132
+
133
+ /**
134
+ * Locale/config bag produced by `usePanelConfigs`, shared by every panel.
135
+ */
136
+ export type PanelConfigs = ReturnType<typeof usePanelConfigs>;
137
+
138
+ /**
139
+ * The `panelProps` bag shared by all date-picking panels, headers and bodies.
140
+ *
141
+ * Standalone (does not extend `PickerPanelProps`) so each panel only declares
142
+ * the fields it actually reads while still receiving the full bag via
143
+ * `{...props}` spreads (JSX spreads do not trigger excess-property checks).
144
+ */
145
+ export interface PanelSharedProps {
146
+ prefixCls?: string;
147
+ picker?: PickerType;
148
+ offset?: { year?: number; month?: number; day?: number };
149
+ viewDate: Dayjs;
150
+ selectedDate?: Dayjs;
151
+ panelConfigs: PanelConfigs;
152
+ handleMouseChange?: (date: Dayjs | '') => void;
153
+ onViewDateChange: (date: Dayjs) => void;
154
+ onPanelChange: (view: PickerType) => void;
155
+ onSelect?: (date: Dayjs) => void;
156
+ offsetYear?: number;
157
+ /** Never set in `panelProps`, so always `undefined` at runtime. */
158
+ nowDate?: Dayjs;
159
+ weekStart?: number;
160
+ showHeader?: boolean;
161
+ cellRender?: (date: Dayjs, panel: PickerType) => React.ReactNode;
162
+ prefixColumn?: (currentDate: Dayjs) => React.ReactNode;
163
+ getRowClassName?: (currentDate: Dayjs) => string;
164
+ hoverRange?: Array<Dayjs | null | undefined>;
165
+ selectedRange?: Array<Dayjs | null | undefined>;
166
+ maxDate?: Dayjs;
167
+ minDate?: Dayjs;
168
+ }
@@ -2,6 +2,7 @@ import clsx from 'clsx';
2
2
  import { Dayjs } from 'dayjs';
3
3
  import React from 'react';
4
4
  import useEvent from '../../../hooks/useEvent';
5
+ import type { PanelSharedProps } from '../../interface';
5
6
  import panelConfig from '../../configs';
6
7
  import pickerUtils from '../../utils/pickerUtils';
7
8
  import PanelBody from '../PanelBody';
@@ -10,7 +11,7 @@ const DATEPANEL_WEEK_DAY_COUNT = 7;
10
11
 
11
12
  const weekTitle = panelConfig.shortWeekList;
12
13
 
13
- function DateBody(props: any) {
14
+ function DateBody(props: PanelSharedProps) {
14
15
  const {
15
16
  prefixCls,
16
17
  viewDate,
@@ -2,10 +2,11 @@ import React from 'react';
2
2
  import Button from '../../../Button';
3
3
  import useEvent from '../../../hooks/useEvent';
4
4
  import { useLocale } from '../../../locale';
5
+ import type { PanelSharedProps } from '../../interface';
5
6
  import pickerUtils from '../../utils/pickerUtils';
6
7
  import Header from '../Header';
7
8
 
8
- export default function DateHeader(props: any) {
9
+ export default function DateHeader(props: PanelSharedProps) {
9
10
  const { locale, lang } = useLocale();
10
11
  const { datepicker } = locale;
11
12
 
@@ -15,7 +16,7 @@ export default function DateHeader(props: any) {
15
16
  const month = pickerUtils.getMonth(viewDate);
16
17
 
17
18
  if (offset?.year) {
18
- year = year + parseInt(offset.year);
19
+ year = year + offset.year;
19
20
  }
20
21
 
21
22
  const onSuperPrevClick = useEvent(() => {
@@ -1,8 +1,9 @@
1
1
  import React from 'react';
2
+ import type { PanelSharedProps } from '../../interface';
2
3
  import DateBody from './DateBody';
3
4
  import DateHeader from './DateHeader';
4
5
 
5
- export default function DatePanel(props: any) {
6
+ export default function DatePanel(props: PanelSharedProps) {
6
7
  const { prefixCls, showHeader = true } = props;
7
8
 
8
9
  return (
@@ -1,24 +1,31 @@
1
1
  import { Dayjs } from 'dayjs';
2
2
  import * as React from 'react';
3
+ import type { PickerType, PanelSharedProps } from '../../interface';
3
4
  import DatePanel from '../DatePanel';
4
5
  import TimePanel from '../TimePanel';
5
6
 
6
- function DateTimePanel(props: any) {
7
- const { prefixCls = 'yee-picker', onSelect, showTime } = props;
7
+ interface DateTimePanelProps extends Omit<PanelSharedProps, 'onSelect'> {
8
+ onSelect?: (panel: PickerType, date: Dayjs) => void;
9
+ showTime?: boolean;
10
+ }
11
+
12
+ function DateTimePanel(props: DateTimePanelProps) {
13
+ const { onSelect, showTime, ...rest } = props;
14
+ const prefixCls = rest.prefixCls ?? 'yee-picker';
8
15
 
9
16
  const handleSelect = (type: string, date: Dayjs) => {
10
- onSelect(type, date);
17
+ onSelect?.(type as PickerType, date);
11
18
  };
12
19
 
13
20
  return (
14
21
  <div className={`${prefixCls}-datetime-panel`}>
15
22
  <DatePanel
16
- {...props}
23
+ {...rest}
17
24
  onSelect={(date: Dayjs) => handleSelect('date', date)}
18
25
  />
19
26
  {showTime ? (
20
27
  <TimePanel
21
- {...props}
28
+ {...rest}
22
29
  onSelect={(date: Dayjs) => handleSelect('datetimetime', date)}
23
30
  showHeader
24
31
  />
@@ -2,11 +2,12 @@ import clsx from 'clsx';
2
2
  import { Dayjs } from 'dayjs';
3
3
  import * as React from 'react';
4
4
  import useEvent from '../../../hooks/useEvent';
5
+ import type { PanelSharedProps } from '../../interface';
5
6
  import pickerUtils from '../../utils/pickerUtils';
6
7
  import PanelBody from '../PanelBody';
7
8
 
8
- function DecadeBody(props: any) {
9
- const { prefixCls, viewDate, offsetYear } = props;
9
+ function DecadeBody(props: PanelSharedProps) {
10
+ const { prefixCls, viewDate, offsetYear = 0 } = props;
10
11
 
11
12
  const baseDate = pickerUtils.getBaseDate('decade', viewDate);
12
13
 
@@ -1,10 +1,11 @@
1
1
  import * as React from 'react';
2
2
  import useEvent from '../../../hooks/useEvent';
3
+ import type { PanelSharedProps } from '../../interface';
3
4
  import pickerUtils from '../../utils/pickerUtils';
4
5
  import Header from '../Header';
5
6
 
6
- export default function DecadeHeader(props: any) {
7
- const { viewDate, offsetYear, onViewDateChange } = props;
7
+ export default function DecadeHeader(props: PanelSharedProps) {
8
+ const { viewDate, offsetYear = 0, onViewDateChange } = props;
8
9
  const onSuperPrevClick = useEvent(() => {
9
10
  onViewDateChange(pickerUtils.addYear(viewDate, -100));
10
11
  });
@@ -1,14 +1,15 @@
1
1
  import * as React from 'react';
2
+ import type { PanelSharedProps } from '../../interface';
2
3
 
3
4
  import DecadeBody from './DecadeBody';
4
5
  import DecadeHeader from './DecadeHeader';
5
6
 
6
- export default function DecadePanel(props: any) {
7
+ export default function DecadePanel(props: PanelSharedProps) {
7
8
  const { prefixCls, offset } = props;
8
9
 
9
10
  let offsetYear = 0;
10
11
  if (offset?.year) {
11
- offsetYear = parseInt(offset.year);
12
+ offsetYear = offset.year;
12
13
  }
13
14
 
14
15
  return (
@@ -7,7 +7,20 @@ import {
7
7
  import React from 'react';
8
8
  import Button from '../../Button';
9
9
 
10
- export default function Header(props: any) {
10
+ export interface PanelHeaderProps {
11
+ prefixCls?: string;
12
+ onPrevClick?: () => void;
13
+ onSuperPrevClick?: () => void;
14
+ onNextClick?: () => void;
15
+ onSuperNextClick?: () => void;
16
+ showPrevIcon?: boolean;
17
+ showNextIcon?: boolean;
18
+ showSuperPrevIcon?: boolean;
19
+ showSuperNextIcon?: boolean;
20
+ children?: React.ReactNode;
21
+ }
22
+
23
+ export default function Header(props: PanelHeaderProps) {
11
24
  const {
12
25
  prefixCls,
13
26
  onPrevClick,
@@ -2,10 +2,11 @@ import clsx from 'clsx';
2
2
  import { Dayjs } from 'dayjs';
3
3
  import * as React from 'react';
4
4
  import useEvent from '../../../hooks/useEvent';
5
+ import type { PanelSharedProps } from '../../interface';
5
6
  import pickerUtils from '../../utils/pickerUtils';
6
7
  import PanelBody from '../PanelBody';
7
8
 
8
- function MonthBody(props: any) {
9
+ function MonthBody(props: PanelSharedProps) {
9
10
  const {
10
11
  prefixCls,
11
12
  viewDate,
@@ -1,11 +1,12 @@
1
1
  import * as React from 'react';
2
2
  import Button from '../../../Button';
3
3
  import useEvent from '../../../hooks/useEvent';
4
+ import type { PanelSharedProps } from '../../interface';
4
5
  import pickerUtils from '../../utils/pickerUtils';
5
6
  import Header from '../Header';
6
7
 
7
- export default function MonthHeader(props: any) {
8
- const { prefixCls, viewDate, offsetYear, onViewDateChange, onPanelChange } =
8
+ export default function MonthHeader(props: PanelSharedProps) {
9
+ const { prefixCls, viewDate, offsetYear = 0, onViewDateChange, onPanelChange } =
9
10
  props;
10
11
 
11
12
  const year = pickerUtils.getYear(viewDate) + offsetYear;
@@ -1,14 +1,15 @@
1
1
  import * as React from 'react';
2
+ import type { PanelSharedProps } from '../../interface';
2
3
 
3
4
  import MonthBody from './MonthBody';
4
5
  import MonthHeader from './MonthHeader';
5
6
 
6
- export default function DecadePanel(props: any) {
7
+ export default function DecadePanel(props: PanelSharedProps) {
7
8
  const { prefixCls, offset, showHeader = true } = props;
8
9
 
9
10
  let offsetYear = 0;
10
11
  if (offset?.year) {
11
- offsetYear = parseInt(offset.year);
12
+ offsetYear = offset.year;
12
13
  }
13
14
 
14
15
  return (
@@ -2,8 +2,28 @@ import clsx from 'clsx';
2
2
  import { Dayjs } from 'dayjs';
3
3
  import * as React from 'react';
4
4
  import pickerUtils from '../utils/pickerUtils';
5
+ import type { PickerType } from '../interface';
5
6
 
6
- function PanelBody(props: any) {
7
+ export interface PanelBodyProps {
8
+ prefixCls?: string;
9
+ picker?: PickerType;
10
+ rowCount: number;
11
+ colCount: number;
12
+ baseDate?: Dayjs | number;
13
+ onSelect?: (date: Dayjs) => void;
14
+ handleMouseChange?: (date: Dayjs | '') => void;
15
+ headerCells?: React.ReactNode;
16
+ getCellNode?: (currentDate: Dayjs) => React.ReactNode;
17
+ getCellDate: (baseDate: Dayjs, offset: number) => Dayjs;
18
+ getCellText: (currentDate: Dayjs) => number | string;
19
+ getCellTitle?: (currentDate: Dayjs) => string;
20
+ getCellClassName?: (currentDate: Dayjs) => string;
21
+ prefixColumn?: (currentDate: Dayjs) => React.ReactNode;
22
+ getRowClassName?: (currentDate: Dayjs) => string;
23
+ cellRender?: (date: Dayjs, panel: PickerType) => React.ReactNode;
24
+ }
25
+
26
+ function PanelBody(props: PanelBodyProps) {
7
27
  const {
8
28
  prefixCls,
9
29
  rowCount,
@@ -39,7 +59,7 @@ function PanelBody(props: any) {
39
59
 
40
60
  for (let j = 0; j < colCount; j++) {
41
61
  const offset = i * colCount + j;
42
- const currentDate = getCellDate(baseDate, offset);
62
+ const currentDate = getCellDate(baseDate as Dayjs, offset);
43
63
 
44
64
  if (j === 0) {
45
65
  rowStartDate = currentDate;
@@ -60,11 +80,13 @@ function PanelBody(props: any) {
60
80
  {
61
81
  [`${cellPrefixCls}-start`]:
62
82
  getCellText(currentDate) === 1 ||
63
- (picker === 'year' && getCellText(currentDate) % 10 === 0),
83
+ (picker === 'year' &&
84
+ Number(getCellText(currentDate)) % 10 === 0),
64
85
  [`${cellPrefixCls}-end`]:
65
86
  getCellText(currentDate) ===
66
87
  pickerUtils.getDate(currentDate.endOf('month')) ||
67
- (picker === 'year' && getCellText(currentDate) % 10 === 9),
88
+ (picker === 'year' &&
89
+ Number(getCellText(currentDate)) % 10 === 9),
68
90
  },
69
91
  cls,
70
92
  )}
@@ -90,7 +112,7 @@ function PanelBody(props: any) {
90
112
  </div>
91
113
  {cellRender ? (
92
114
  <div className={`${prefixCls}-cell-content`}>
93
- {cellRender(currentDate, { mode: picker })}
115
+ {cellRender(currentDate, picker as PickerType)}
94
116
  </div>
95
117
  ) : null}
96
118
  </div>
@@ -4,11 +4,12 @@ import React from 'react';
4
4
  import PanelBody from '../PanelBody';
5
5
 
6
6
  import useEvent from '../../../hooks/useEvent';
7
+ import type { PanelSharedProps } from '../../interface';
7
8
  import pickerUtils from '../../utils/pickerUtils';
8
9
 
9
10
  const quarter = ['Q1', 'Q2', 'Q3', 'Q4'];
10
11
 
11
- function QuarterBody(props: any) {
12
+ function QuarterBody(props: PanelSharedProps) {
12
13
  const { prefixCls, viewDate, nowDate } = props;
13
14
 
14
15
  const baseDate = pickerUtils.setMonth(viewDate, 0);
@@ -2,10 +2,11 @@ import * as React from 'react';
2
2
  import Button from '../../../Button';
3
3
  import useEvent from '../../../hooks/useEvent';
4
4
  import Header from '../Header';
5
+ import type { PanelSharedProps } from '../../interface';
5
6
 
6
7
  import pickerUtils from '../../utils/pickerUtils';
7
8
 
8
- export default function QuarterHeader(props: any) {
9
+ export default function QuarterHeader(props: PanelSharedProps) {
9
10
  const { prefixCls, viewDate, onViewDateChange, onPanelChange } = props;
10
11
 
11
12
  const year = pickerUtils.getYear(viewDate);
@@ -1,9 +1,10 @@
1
1
  import * as React from 'react';
2
+ import type { PanelSharedProps } from '../../interface';
2
3
 
3
4
  import QuarterBody from './QuarterBody';
4
5
  import QuarterHeader from './QuarterHeader';
5
6
 
6
- export default function DecadePanel(props: any) {
7
+ export default function DecadePanel(props: PanelSharedProps) {
7
8
  const { prefixCls } = props;
8
9
  return (
9
10
  <div className={`${prefixCls}-quarter-panel`}>