@rainbow-oh/yee-c 0.8.0 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +40 -25
  3. package/dist/cjs/Card/card.js +7 -3
  4. package/dist/cjs/Carousel/carousel-item.js +7 -2
  5. package/dist/cjs/Carousel/carousel.js +31 -4
  6. package/dist/cjs/Cascader/cascader.js +38 -30
  7. package/dist/cjs/Cascader/column.js +17 -9
  8. package/dist/cjs/Cascader/node.js +16 -4
  9. package/dist/cjs/Cascader/search-list.js +31 -14
  10. package/dist/cjs/Cascader/utils/index.js +1 -5
  11. package/dist/cjs/Checkbox/checkbox-group.js +23 -14
  12. package/dist/cjs/Checkbox/checkbox.js +6 -3
  13. package/dist/cjs/Collapse/panel.js +10 -1
  14. package/dist/cjs/Dialog/dialog.js +22 -7
  15. package/dist/cjs/Dialog/interface.d.ts +1 -1
  16. package/dist/cjs/Dialog/style/index.less +2 -1
  17. package/dist/cjs/Drawer/drawer.js +22 -5
  18. package/dist/cjs/Form/Group.js +1 -1
  19. package/dist/cjs/Form/demo/tooltip.js +1 -3
  20. package/dist/cjs/List/hooks/useListKeyboard.js +3 -1
  21. package/dist/cjs/Menu/menu-item.js +14 -5
  22. package/dist/cjs/Menu/menu.js +26 -2
  23. package/dist/cjs/Pagination/items.js +60 -27
  24. package/dist/cjs/Pagination/pagination.js +33 -11
  25. package/dist/cjs/PickerPanel/panels/DateTimePanel/index.d.ts +1 -1
  26. package/dist/cjs/PickerPanel/panels/MonthPanel/MonthHeader.js +7 -1
  27. package/dist/cjs/Radio/radio-group.js +6 -5
  28. package/dist/cjs/Radio/radio.js +39 -29
  29. package/dist/cjs/Rate/rate.js +6 -1
  30. package/dist/cjs/Rate/star.js +31 -3
  31. package/dist/cjs/Segmented/demo/variant.js +15 -1
  32. package/dist/cjs/Segmented/index.d.ts +1 -1
  33. package/dist/cjs/Segmented/segmented.js +12 -15
  34. package/dist/cjs/Select/option.js +8 -1
  35. package/dist/cjs/Select/options.js +9 -1
  36. package/dist/cjs/Select/select.js +3 -1
  37. package/dist/cjs/Steps/step.js +19 -5
  38. package/dist/cjs/Steps/steps.js +11 -1
  39. package/dist/cjs/Table/demo/components-override.js +31 -2
  40. package/dist/cjs/Table/demo/grouping.js +7 -1
  41. package/dist/cjs/Table/hooks/useColumns.d.ts +3 -3
  42. package/dist/cjs/Table/hooks/useColumns.js +11 -14
  43. package/dist/cjs/Table/index.d.ts +1 -1
  44. package/dist/cjs/Table/style/index.less +2 -4
  45. package/dist/cjs/Table/tbody/row.js +1 -4
  46. package/dist/cjs/Table/theader/index.js +12 -4
  47. package/dist/cjs/Tabs/tab-content.js +3 -1
  48. package/dist/cjs/Tabs/tab-header/index.js +3 -1
  49. package/dist/cjs/Tabs/tab-header/tab-header-title.js +3 -1
  50. package/dist/cjs/Tour/index.d.ts +1 -1
  51. package/dist/cjs/Tree/style/index.less +1 -5
  52. package/dist/cjs/Tree/tree.js +38 -35
  53. package/dist/cjs/hooks/useDelayState.js +3 -2
  54. package/dist/cjs/hooks/useEvent.js +1 -4
  55. package/dist/cjs/hooks/useFocusManage.d.ts +1 -1
  56. package/dist/cjs/hooks/useFocusManage.js +27 -22
  57. package/dist/cjs/style/size.css +2 -0
  58. package/dist/cjs/style/themes.css +1 -1
  59. package/dist/cjs/style/variables.css +3 -1
  60. package/dist/cjs/utils/focusStack.d.ts +6 -2
  61. package/dist/cjs/utils/focusStack.js +40 -11
  62. package/dist/cjs/version.d.ts +1 -1
  63. package/dist/cjs/version.js +1 -1
  64. package/dist/esm/Card/card.js +7 -3
  65. package/dist/esm/Carousel/carousel-item.js +7 -2
  66. package/dist/esm/Carousel/carousel.js +31 -4
  67. package/dist/esm/Cascader/cascader.js +3 -1
  68. package/dist/esm/Cascader/column.js +2 -1
  69. package/dist/esm/Cascader/node.js +18 -4
  70. package/dist/esm/Cascader/search-list.js +18 -4
  71. package/dist/esm/Checkbox/checkbox-group.js +3 -1
  72. package/dist/esm/Checkbox/checkbox.js +6 -3
  73. package/dist/esm/Collapse/panel.js +11 -2
  74. package/dist/esm/Dialog/dialog.js +28 -11
  75. package/dist/esm/Dialog/interface.d.ts +1 -1
  76. package/dist/esm/Dialog/style/index.less +2 -1
  77. package/dist/esm/Drawer/drawer.js +16 -7
  78. package/dist/esm/Form/Group.js +1 -1
  79. package/dist/esm/Menu/menu-item.js +16 -5
  80. package/dist/esm/Menu/menu.js +11 -5
  81. package/dist/esm/Pagination/items.js +14 -5
  82. package/dist/esm/Pagination/pagination.js +16 -4
  83. package/dist/esm/PickerPanel/panels/DateTimePanel/index.d.ts +1 -1
  84. package/dist/esm/Radio/radio-group.js +5 -4
  85. package/dist/esm/Radio/radio.js +5 -4
  86. package/dist/esm/Rate/rate.js +6 -1
  87. package/dist/esm/Rate/star.js +12 -4
  88. package/dist/esm/Segmented/index.d.ts +1 -1
  89. package/dist/esm/Segmented/segmented.js +1 -1
  90. package/dist/esm/Steps/step.js +12 -6
  91. package/dist/esm/Steps/steps.js +3 -1
  92. package/dist/esm/Table/demo/components-override.js +1 -0
  93. package/dist/esm/Table/hooks/useColumns.d.ts +3 -3
  94. package/dist/esm/Table/hooks/useColumns.js +13 -16
  95. package/dist/esm/Table/index.d.ts +1 -1
  96. package/dist/esm/Table/style/index.less +2 -4
  97. package/dist/esm/Tabs/tab-content.js +3 -1
  98. package/dist/esm/Tabs/tab-header/index.js +3 -1
  99. package/dist/esm/Tabs/tab-header/tab-header-title.js +3 -1
  100. package/dist/esm/Tour/index.d.ts +1 -1
  101. package/dist/esm/Tree/style/index.less +1 -5
  102. package/dist/esm/Tree/tree.js +1 -1
  103. package/dist/esm/hooks/useDelayState.js +5 -2
  104. package/dist/esm/hooks/useFocusManage.d.ts +1 -1
  105. package/dist/esm/hooks/useFocusManage.js +31 -13
  106. package/dist/esm/style/size.css +2 -0
  107. package/dist/esm/style/themes.css +1 -1
  108. package/dist/esm/style/variables.css +3 -1
  109. package/dist/esm/utils/focusStack.d.ts +6 -2
  110. package/dist/esm/utils/focusStack.js +37 -14
  111. package/dist/esm/version.d.ts +1 -1
  112. package/dist/esm/version.js +1 -1
  113. package/dist/umd/yee-c.min.css +2 -2
  114. package/dist/umd/yee-c.min.js +1 -1
  115. package/package.json +10 -6
  116. package/src/Anchor/anchor.tsx +2 -2
  117. package/src/Card/card.tsx +5 -1
  118. package/src/Carousel/carousel-item.tsx +7 -1
  119. package/src/Carousel/carousel.tsx +29 -3
  120. package/src/Cascader/cascader.tsx +5 -1
  121. package/src/Cascader/column.tsx +5 -1
  122. package/src/Cascader/node.tsx +14 -2
  123. package/src/Cascader/search-list.tsx +19 -3
  124. package/src/Cascader/utils/index.ts +3 -6
  125. package/src/Checkbox/checkbox-group.tsx +6 -1
  126. package/src/Checkbox/checkbox.tsx +3 -0
  127. package/src/Collapse/panel.tsx +11 -1
  128. package/src/Dialog/dialog.tsx +35 -6
  129. package/src/Dialog/interface.ts +1 -1
  130. package/src/Dialog/style/index.less +2 -1
  131. package/src/Drawer/drawer.tsx +18 -3
  132. package/src/Form/Group.tsx +2 -4
  133. package/src/Form/demo/tooltip.tsx +2 -11
  134. package/src/Form/utils/validate.ts +1 -4
  135. package/src/List/hooks/useListKeyboard.ts +3 -3
  136. package/src/List/list.tsx +2 -1
  137. package/src/Menu/menu-item.tsx +12 -3
  138. package/src/Menu/menu.tsx +22 -5
  139. package/src/Pagination/items.tsx +21 -4
  140. package/src/Pagination/pagination.tsx +24 -4
  141. package/src/PickerPanel/panels/DatePanel/DateBody.tsx +1 -1
  142. package/src/PickerPanel/panels/DateTimePanel/index.tsx +1 -1
  143. package/src/PickerPanel/panels/MonthPanel/MonthHeader.tsx +7 -2
  144. package/src/PickerPanel/panels/PanelBody.tsx +1 -1
  145. package/src/PickerPanel/panels/QuarterPanel/QuarterHeader.tsx +1 -1
  146. package/src/PickerPanel/panels/RangePanel/index.tsx +1 -1
  147. package/src/PickerPanel/panels/TimePanel/TimeBody.tsx +1 -1
  148. package/src/PickerPanel/panels/YearPanel/YearHeader.tsx +1 -1
  149. package/src/PickerPanel/utils/pickerUtils.ts +2 -1
  150. package/src/Radio/radio-group.tsx +2 -1
  151. package/src/Radio/radio.tsx +7 -2
  152. package/src/RangePicker/range-picker-mobile.tsx +1 -3
  153. package/src/Rate/rate.tsx +5 -0
  154. package/src/Rate/star.tsx +20 -4
  155. package/src/Segmented/demo/variant.tsx +10 -2
  156. package/src/Segmented/index.ts +2 -2
  157. package/src/Segmented/segmented.tsx +4 -11
  158. package/src/Select/interface.ts +0 -1
  159. package/src/Select/option.tsx +8 -2
  160. package/src/Select/options.tsx +11 -4
  161. package/src/Select/select.tsx +4 -4
  162. package/src/Steps/step.tsx +23 -5
  163. package/src/Steps/steps.tsx +8 -1
  164. package/src/Table/demo/components-override.tsx +34 -7
  165. package/src/Table/demo/grouping.tsx +8 -4
  166. package/src/Table/hooks/useColumns.ts +14 -18
  167. package/src/Table/index.ts +3 -3
  168. package/src/Table/style/index.less +2 -4
  169. package/src/Table/table.tsx +2 -4
  170. package/src/Table/tbody/row.tsx +1 -3
  171. package/src/Table/theader/index.tsx +9 -10
  172. package/src/Tabs/tab-content.tsx +2 -0
  173. package/src/Tabs/tab-header/index.tsx +2 -0
  174. package/src/Tabs/tab-header/tab-header-title.tsx +3 -1
  175. package/src/Tour/demo/placement.tsx +2 -1
  176. package/src/Tour/index.ts +1 -1
  177. package/src/Tree/style/index.less +1 -5
  178. package/src/Tree/tree.tsx +16 -11
  179. package/src/Tree/utils/tree-tools.ts +4 -1
  180. package/src/hooks/useDelayState.ts +4 -2
  181. package/src/hooks/useEvent.ts +1 -3
  182. package/src/hooks/useFocusManage.ts +33 -17
  183. package/src/locale/context.tsx +5 -1
  184. package/src/locale/interface.ts +3 -1
  185. package/src/style/size.css +2 -0
  186. package/src/utils/debounce.ts +1 -3
  187. package/src/utils/focusStack.ts +55 -12
  188. package/src/version.ts +1 -1
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 InsureMO
3
+ Copyright (c) 2026 insureMO
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![npm](https://img.shields.io/npm/v/@rainbow-oh/yee-c.svg)](https://www.npmjs.com/package/@rainbow-oh/yee-c) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](./LICENSE)
4
4
 
5
- 65+ foundational React UI components for building modern enterprise applications. Part of the [Yee](https://github.com/InsureMO/oh-yee) component library.
5
+ 65+ foundational React UI components for building modern enterprise applications. Part of the [Yee](https://github.com/insureMO/oh-yee) component library.
6
6
 
7
7
  ## Features
8
8
 
@@ -24,7 +24,16 @@ Requires `react >= 18` and `react-dom >= 18` as peer dependencies.
24
24
  ## Usage
25
25
 
26
26
  ```tsx
27
- import { Button, Form, Input, Table, Card, Select, Dialog, message } from '@rainbow-oh/yee-c';
27
+ import {
28
+ Button,
29
+ Form,
30
+ Input,
31
+ Table,
32
+ Card,
33
+ Select,
34
+ Dialog,
35
+ message,
36
+ } from '@rainbow-oh/yee-c';
28
37
  ```
29
38
 
30
39
  Import styles:
@@ -54,10 +63,16 @@ function UserForm() {
54
63
  <>
55
64
  {messageHolder}
56
65
  <Form form={form} onFinish={handleSubmit}>
57
- <Form.Field label="Name" name="name" rules={[{ required: true, message: 'Please enter name' }]}>
66
+ <Form.Field
67
+ label="Name"
68
+ name="name"
69
+ rules={[{ required: true, message: 'Please enter name' }]}
70
+ >
58
71
  <Input />
59
72
  </Form.Field>
60
- <Button type="primary" htmlType="submit">Submit</Button>
73
+ <Button type="primary" htmlType="submit">
74
+ Submit
75
+ </Button>
61
76
  </Form>
62
77
  </>
63
78
  );
@@ -98,31 +113,31 @@ ConfigProvider, Portal
98
113
 
99
114
  20+ utility hooks for common React patterns:
100
115
 
101
- | Hook | Description |
102
- |---|---|
103
- | `useDebounceFunction` | Debounced function execution |
104
- | `useDebounceValue` | Debounced state value |
105
- | `useDeepCompareEffect` | Effect with deep comparison |
106
- | `useDeepCompareMemo` | Memo with deep comparison |
107
- | `useMergedState` | Controlled/uncontrolled state |
108
- | `useLatest` | Always-current ref value |
109
- | `useMount` | Mount lifecycle hook |
110
- | `useUpdateEffect` | Skip-first-run effect |
111
- | `useResizeObserver` | Element resize observation |
112
- | `useElementSize` | Element dimensions tracking |
113
- | `useEvent` | Stable event handler |
114
- | `useFocusManage` | Focus management |
115
- | `useKeyControl` | Keyboard control |
116
- | `useVirtualForm` | Virtual scrolling for forms |
116
+ | Hook | Description |
117
+ | ---------------------- | ----------------------------- |
118
+ | `useDebounceFunction` | Debounced function execution |
119
+ | `useDebounceValue` | Debounced state value |
120
+ | `useDeepCompareEffect` | Effect with deep comparison |
121
+ | `useDeepCompareMemo` | Memo with deep comparison |
122
+ | `useMergedState` | Controlled/uncontrolled state |
123
+ | `useLatest` | Always-current ref value |
124
+ | `useMount` | Mount lifecycle hook |
125
+ | `useUpdateEffect` | Skip-first-run effect |
126
+ | `useResizeObserver` | Element resize observation |
127
+ | `useElementSize` | Element dimensions tracking |
128
+ | `useEvent` | Stable event handler |
129
+ | `useFocusManage` | Focus management |
130
+ | `useKeyControl` | Keyboard control |
131
+ | `useVirtualForm` | Virtual scrolling for forms |
117
132
 
118
133
  ## Theming
119
134
 
120
135
  Use built-in color themes by importing the corresponding CSS file:
121
136
 
122
137
  ```tsx
123
- import '@rainbow-oh/yee-c/variables.css'; // Base variables
124
- import '@rainbow-oh/yee-c/color.blue.css'; // Blue theme
125
- import '@rainbow-oh/yee-c/color.dark.css'; // Dark theme
138
+ import '@rainbow-oh/yee-c/variables.css'; // Base variables
139
+ import '@rainbow-oh/yee-c/color.blue.css'; // Blue theme
140
+ import '@rainbow-oh/yee-c/color.dark.css'; // Dark theme
126
141
  ```
127
142
 
128
143
  Available themes: `blue`, `crimson`, `dark`, `green`, `jam`, `navy`, `peach`, `pine`, `pitaya`, `pumpkin`, `ruby`.
@@ -145,8 +160,8 @@ pnpm lint
145
160
 
146
161
  ## Contributing
147
162
 
148
- See the root [Contributing Guide](https://github.com/InsureMO/oh-yee/blob/main/CONTRIBUTING.md).
163
+ See the root [Contributing Guide](https://github.com/insureMO/oh-yee/blob/main/CONTRIBUTING.md).
149
164
 
150
165
  ## License
151
166
 
152
- [MIT](./LICENSE) © [InsureMO](https://github.com/InsureMO)
167
+ [MIT](./LICENSE) © [insureMO](https://github.com/insureMO)
@@ -140,10 +140,10 @@ var Card = (baseprops) => {
140
140
  ),
141
141
  style: styles == null ? void 0 : styles.expandIcon,
142
142
  "aria-expanded": mergedExpanded,
143
+ "aria-label": mergedExpanded ? "Collapse content" : "Expand content",
143
144
  icon: icon ? icon : /* @__PURE__ */ import_react2.default.createElement(
144
145
  import_lucide_react.ChevronUp,
145
146
  {
146
- "aria-label": "expanded",
147
147
  strokeWidth: 1.5,
148
148
  size: 16,
149
149
  style: {
@@ -187,7 +187,8 @@ var Card = (baseprops) => {
187
187
  onClick: headerClickable ? handleExpand : void 0,
188
188
  onKeyDown: handleKeyDown,
189
189
  tabIndex: headerClickable ? 0 : void 0,
190
- role: headerClickable ? "button" : void 0
190
+ role: headerClickable ? "button" : void 0,
191
+ "aria-expanded": headerClickable ? mergedExpanded : void 0
191
192
  },
192
193
  iconPosition === "left" ? renderExpandIcon() : null,
193
194
  title ? /* @__PURE__ */ import_react2.default.createElement(
@@ -208,7 +209,10 @@ var Card = (baseprops) => {
208
209
  style: __spreadProps(__spreadValues({}, styles == null ? void 0 : styles.content), { overflow: "hidden" }),
209
210
  animate: mergedExpanded ? { height: "auto" } : { height: 0 },
210
211
  exit: { height: 0, display: "none" },
211
- transition: { duration: animationDuration }
212
+ transition: { duration: animationDuration },
213
+ role: "region",
214
+ "aria-labelledby": title ? headerId : void 0,
215
+ "aria-hidden": !mergedExpanded
212
216
  },
213
217
  children
214
218
  )
@@ -38,18 +38,23 @@ var import_carousel = require("./carousel");
38
38
  var CarouselItem = (props) => {
39
39
  const { style, className, children, index } = props;
40
40
  const { prefixCls, current } = import_react.default.useContext(import_carousel.CarouselCtx);
41
+ const isActive = index === current - 1;
41
42
  return /* @__PURE__ */ import_react.default.createElement(
42
43
  "div",
43
44
  {
44
45
  className: (0, import_clsx.default)(
45
46
  `${prefixCls}-item`,
46
47
  {
47
- [`${prefixCls}-item-active`]: index === current - 1
48
+ [`${prefixCls}-item-active`]: isActive
48
49
  },
49
50
  className
50
51
  ),
51
52
  "data-index": index,
52
- style
53
+ style,
54
+ role: "tabpanel",
55
+ "aria-roledescription": "slide",
56
+ "aria-label": `Slide ${(index != null ? index : 0) + 1}`,
57
+ "aria-hidden": !isActive
53
58
  },
54
59
  children
55
60
  );
@@ -211,6 +211,9 @@ var Carousel = import_react.default.forwardRef(
211
211
  { [`${prefixCls}-arrows-visible`]: showArrow },
212
212
  className
213
213
  ),
214
+ role: "region",
215
+ "aria-roledescription": "carousel",
216
+ "aria-live": autoplay ? "off" : "polite",
214
217
  onMouseEnter: handleMouseEnter,
215
218
  onMouseLeave: handleMouseLeave
216
219
  });
@@ -233,7 +236,16 @@ var Carousel = import_react.default.forwardRef(
233
236
  classNames == null ? void 0 : classNames.prev
234
237
  ),
235
238
  style: styles == null ? void 0 : styles.prev,
236
- onClick: prev
239
+ onClick: prev,
240
+ role: "button",
241
+ "aria-label": "Previous slide",
242
+ tabIndex: 0,
243
+ onKeyDown: (e) => {
244
+ if (e.key === "Enter" || e.key === " ") {
245
+ e.preventDefault();
246
+ prev();
247
+ }
248
+ }
237
249
  },
238
250
  direction === "vertical" ? /* @__PURE__ */ import_react.default.createElement(import_lucide_react.ChevronUp, null) : /* @__PURE__ */ import_react.default.createElement(import_lucide_react.ChevronLeft, null)
239
251
  ), /* @__PURE__ */ import_react.default.createElement(
@@ -247,7 +259,16 @@ var Carousel = import_react.default.forwardRef(
247
259
  classNames == null ? void 0 : classNames.next
248
260
  ),
249
261
  style: styles == null ? void 0 : styles.next,
250
- onClick: next
262
+ onClick: next,
263
+ role: "button",
264
+ "aria-label": "Next slide",
265
+ tabIndex: 0,
266
+ onKeyDown: (e) => {
267
+ if (e.key === "Enter" || e.key === " ") {
268
+ e.preventDefault();
269
+ next();
270
+ }
271
+ }
251
272
  },
252
273
  direction === "vertical" ? /* @__PURE__ */ import_react.default.createElement(import_lucide_react.ChevronDown, null) : /* @__PURE__ */ import_react.default.createElement(import_lucide_react.ChevronRight, null)
253
274
  ));
@@ -262,15 +283,21 @@ var Carousel = import_react.default.forwardRef(
262
283
  [`${prefixCls}-bar-${dotPosition}`],
263
284
  classNames == null ? void 0 : classNames.dot
264
285
  ),
265
- style: styles == null ? void 0 : styles.dot
286
+ style: styles == null ? void 0 : styles.dot,
287
+ role: "tablist",
288
+ "aria-label": "Slide controls"
266
289
  },
267
290
  new Array(import_react.default.Children.count(children)).fill(0).map((i, index) => {
291
+ const isActive = current === index + 1 || current === 0 && index === count - 1;
268
292
  return /* @__PURE__ */ import_react.default.createElement(
269
293
  "li",
270
294
  {
271
295
  className: (0, import_clsx.default)({
272
- active: current === index + 1 || current === 0 && index === count
296
+ active: isActive
273
297
  }),
298
+ role: "tab",
299
+ "aria-selected": isActive,
300
+ "aria-label": `Slide ${index + 1}`,
274
301
  tabIndex: 0,
275
302
  onClick: () => handleIndicator(index + 1, "click"),
276
303
  onKeyDown: (e) => {
@@ -409,41 +409,49 @@ var Cascader = (baseprops) => {
409
409
  );
410
410
  };
411
411
  const renderPopup = () => {
412
- return /* @__PURE__ */ import_react.default.createElement("div", { className: (0, import_clsx.default)(prefixCls) }, isFilter ? /* @__PURE__ */ import_react.default.createElement(
413
- import_search_list.default,
414
- {
415
- prefixCls,
416
- items: filteredList,
417
- onClick: onSearchItemClick
418
- }
419
- ) : /* @__PURE__ */ import_react.default.createElement(
420
- CascaderCtx.Provider,
412
+ return /* @__PURE__ */ import_react.default.createElement(
413
+ "div",
421
414
  {
422
- value: {
415
+ className: (0, import_clsx.default)(prefixCls),
416
+ role: "group",
417
+ "aria-label": "Cascader options"
418
+ },
419
+ isFilter ? /* @__PURE__ */ import_react.default.createElement(
420
+ import_search_list.default,
421
+ {
423
422
  prefixCls,
424
- multiple: !!multiple,
425
- expandTrigger,
426
- mergedValue,
427
- nodeMap,
428
- flatOptions,
429
- expandedPath,
430
- loadData,
431
- onNodeMouseEnter,
432
- onItemClick
423
+ items: filteredList,
424
+ onClick: onSearchItemClick
433
425
  }
434
- },
435
- columns.map((data, index) => {
436
- return /* @__PURE__ */ import_react.default.createElement(
437
- import_column.default,
438
- {
426
+ ) : /* @__PURE__ */ import_react.default.createElement(
427
+ CascaderCtx.Provider,
428
+ {
429
+ value: {
439
430
  prefixCls,
440
- data,
441
- index,
442
- key: index
431
+ multiple: !!multiple,
432
+ expandTrigger,
433
+ mergedValue,
434
+ nodeMap,
435
+ flatOptions,
436
+ expandedPath,
437
+ loadData,
438
+ onNodeMouseEnter,
439
+ onItemClick
443
440
  }
444
- );
445
- })
446
- ));
441
+ },
442
+ columns.map((data, index) => {
443
+ return /* @__PURE__ */ import_react.default.createElement(
444
+ import_column.default,
445
+ {
446
+ prefixCls,
447
+ data,
448
+ index,
449
+ key: index
450
+ }
451
+ );
452
+ })
453
+ )
454
+ );
447
455
  };
448
456
  return /* @__PURE__ */ import_react.default.createElement(
449
457
  import_Trigger.default,
@@ -53,14 +53,22 @@ var import_react = __toESM(require("react"));
53
53
  var import_node = __toESM(require("./node"));
54
54
  var Column = (props) => {
55
55
  const { prefixCls, data, index } = props;
56
- return /* @__PURE__ */ import_react.default.createElement("ul", { className: `${prefixCls}-menu`, role: "menu" }, Array.isArray(data) && data.map((item, idx) => {
57
- return /* @__PURE__ */ import_react.default.createElement(
58
- import_node.default,
59
- __spreadProps(__spreadValues({}, item), {
60
- index: idx,
61
- key: `cascader-${index}-${item.uid || idx}`
62
- })
63
- );
64
- }));
56
+ return /* @__PURE__ */ import_react.default.createElement(
57
+ "ul",
58
+ {
59
+ className: `${prefixCls}-menu`,
60
+ role: "listbox",
61
+ "aria-label": `Level ${index + 1} options`
62
+ },
63
+ Array.isArray(data) && data.map((item, idx) => {
64
+ return /* @__PURE__ */ import_react.default.createElement(
65
+ import_node.default,
66
+ __spreadProps(__spreadValues({}, item), {
67
+ index: idx,
68
+ key: `cascader-${index}-${item.uid || idx}`
69
+ })
70
+ );
71
+ })
72
+ );
65
73
  };
66
74
  var column_default = Column;
@@ -41,7 +41,7 @@ var import_isEqual = __toESM(require("../utils/isEqual"));
41
41
  var import_cascader = require("./cascader");
42
42
  var import_utils = require("./utils");
43
43
  var Node = (props) => {
44
- var _a;
44
+ var _a, _b, _c;
45
45
  const { uid, value, disabled, label, $source, isLeaf, path, level } = props;
46
46
  const {
47
47
  prefixCls,
@@ -120,14 +120,26 @@ var Node = (props) => {
120
120
  {
121
121
  className: clsName,
122
122
  onMouseEnter: handleMouseEnter,
123
- onClick: (e) => handleClick(false, e)
123
+ onClick: (e) => handleClick(false, e),
124
+ role: "option",
125
+ "aria-disabled": disabled || void 0,
126
+ "aria-selected": checked || ((_b = expandedPath[level]) == null ? void 0 : _b.key) === uid,
127
+ "aria-expanded": isParent ? ((_c = expandedPath[level]) == null ? void 0 : _c.key) === uid : void 0,
128
+ tabIndex: disabled ? -1 : 0,
129
+ onKeyDown: (e) => {
130
+ if (e.key === "Enter" || e.key === " ") {
131
+ e.preventDefault();
132
+ handleClick(false, e);
133
+ }
134
+ }
124
135
  },
125
136
  multiple && /* @__PURE__ */ import_react.default.createElement(
126
137
  import_Checkbox.default,
127
138
  {
128
139
  checked: isParent ? checkedAll : checked,
129
140
  onChange: isParent ? () => handleClick(true) : void 0,
130
- indeterminate
141
+ indeterminate,
142
+ "aria-label": `Select ${typeof label === "string" ? label : String(label)}`
131
143
  }
132
144
  ),
133
145
  /* @__PURE__ */ import_react.default.createElement(
@@ -140,7 +152,7 @@ var Node = (props) => {
140
152
  },
141
153
  label
142
154
  ),
143
- load === 1 ? /* @__PURE__ */ import_react.default.createElement(import_Spin.default, { size: "small" }) : isLeaf === false ? /* @__PURE__ */ import_react.default.createElement(import_lucide_react.ChevronRight, { size: 20 }) : null
155
+ load === 1 ? /* @__PURE__ */ import_react.default.createElement(import_Spin.default, { size: "small", "aria-label": "Loading" }) : isLeaf === false ? /* @__PURE__ */ import_react.default.createElement(import_lucide_react.ChevronRight, { size: 20, "aria-hidden": "true" }) : null
144
156
  );
145
157
  };
146
158
  var node_default = (0, import_react.memo)(Node);
@@ -45,19 +45,36 @@ var renderHighlightText = (matches) => {
45
45
  };
46
46
  var SearchList = (props) => {
47
47
  const { prefixCls, items, onClick } = props;
48
- return /* @__PURE__ */ import_react.default.createElement("ul", { className: `${prefixCls}-filter-menu` }, items.length ? items.map((item) => {
49
- var _a;
50
- const title = ((_a = item.data.$source) == null ? void 0 : _a.title) || item.data.labelPath.join(" / ");
51
- return /* @__PURE__ */ import_react.default.createElement(
52
- "li",
53
- {
54
- className: `${prefixCls}-filter-menu-item`,
55
- title: typeof title === "string" ? title : String(title),
56
- onClick: () => onClick(item.data),
57
- key: item.data.uid
58
- },
59
- renderHighlightText(item.matches)
60
- );
61
- }) : /* @__PURE__ */ import_react.default.createElement("p", null, "No result"));
48
+ return /* @__PURE__ */ import_react.default.createElement(
49
+ "ul",
50
+ {
51
+ className: `${prefixCls}-filter-menu`,
52
+ role: "listbox",
53
+ "aria-label": "Search results"
54
+ },
55
+ items.length ? items.map((item) => {
56
+ var _a, _b;
57
+ const title = ((_a = item.data.$source) == null ? void 0 : _a.title) || item.data.labelPath.join(" / ");
58
+ return /* @__PURE__ */ import_react.default.createElement(
59
+ "li",
60
+ {
61
+ className: `${prefixCls}-filter-menu-item`,
62
+ title: typeof title === "string" ? title : String(title),
63
+ onClick: () => onClick(item.data),
64
+ key: item.data.uid,
65
+ role: "option",
66
+ "aria-disabled": ((_b = item.data.$source) == null ? void 0 : _b.disabled) || void 0,
67
+ tabIndex: 0,
68
+ onKeyDown: (e) => {
69
+ if (e.key === "Enter" || e.key === " ") {
70
+ e.preventDefault();
71
+ onClick(item.data);
72
+ }
73
+ }
74
+ },
75
+ renderHighlightText(item.matches)
76
+ );
77
+ }) : /* @__PURE__ */ import_react.default.createElement("li", { role: "option", "aria-disabled": "true" }, "No result")
78
+ );
62
79
  };
63
80
  var search_list_default = import_react.default.memo(SearchList);
@@ -113,11 +113,7 @@ var flattenOptions = (tree, fieldNames, maxDepth = DEFAULT_MAX_DEPTH) => {
113
113
  });
114
114
  if (hasChild(node, children)) {
115
115
  seen.add(node);
116
- dfs(
117
- node[children],
118
- path,
119
- labelPath
120
- );
116
+ dfs(node[children], path, labelPath);
121
117
  seen.delete(node);
122
118
  }
123
119
  });
@@ -100,22 +100,31 @@ var CheckboxGroup = (baseprops) => {
100
100
  setMergedValue(newValue);
101
101
  onChange == null ? void 0 : onChange(newValue);
102
102
  };
103
- return /* @__PURE__ */ import_react.default.createElement("div", { className: cls, style }, /* @__PURE__ */ import_react.default.createElement(
104
- CheckboxGroupCtx.Provider,
103
+ return /* @__PURE__ */ import_react.default.createElement(
104
+ "div",
105
105
  {
106
- value: { name, buttonStyle, onChange: handleChange }
106
+ className: cls,
107
+ style,
108
+ role: "group",
109
+ "aria-disabled": disabled || void 0
107
110
  },
108
- options == null ? void 0 : options.map((option, index) => /* @__PURE__ */ import_react.default.createElement(
109
- import_checkbox.default,
110
- __spreadProps(__spreadValues({
111
- disabled
112
- }, option), {
113
- checked: mergedValue.includes(option.value),
114
- key: option.value || index
115
- }),
116
- option.label
117
- ))
118
- ));
111
+ /* @__PURE__ */ import_react.default.createElement(
112
+ CheckboxGroupCtx.Provider,
113
+ {
114
+ value: { name, buttonStyle, onChange: handleChange }
115
+ },
116
+ options == null ? void 0 : options.map((option, index) => /* @__PURE__ */ import_react.default.createElement(
117
+ import_checkbox.default,
118
+ __spreadProps(__spreadValues({
119
+ disabled
120
+ }, option), {
121
+ checked: mergedValue.includes(option.value),
122
+ key: option.value || index
123
+ }),
124
+ option.label
125
+ ))
126
+ )
127
+ );
119
128
  };
120
129
  CheckboxGroup.displayName = "CheckboxGroup";
121
130
  var checkbox_group_default = CheckboxGroup;
@@ -119,7 +119,8 @@ var Checkbox = (baseprops) => {
119
119
  },
120
120
  className
121
121
  ),
122
- style
122
+ style,
123
+ "aria-disabled": disabled || void 0
123
124
  },
124
125
  /* @__PURE__ */ import_react.default.createElement(
125
126
  "span",
@@ -139,14 +140,16 @@ var Checkbox = (baseprops) => {
139
140
  value,
140
141
  disabled,
141
142
  checked: mergedChecked,
142
- onChange: handleChange
143
+ onChange: handleChange,
144
+ "aria-checked": indeterminate ? "mixed" : mergedChecked
143
145
  })
144
146
  ),
145
147
  /* @__PURE__ */ import_react.default.createElement(
146
148
  "span",
147
149
  {
148
150
  className: (0, import_clsx.default)(`${prefixCls}-inner`, classNames == null ? void 0 : classNames.inner),
149
- style: styles == null ? void 0 : styles.inner
151
+ style: styles == null ? void 0 : styles.inner,
152
+ "aria-hidden": "true"
150
153
  }
151
154
  )
152
155
  ),
@@ -41,6 +41,9 @@ var import_collapse = require("./collapse");
41
41
  var Panel = (props) => {
42
42
  const { children, title, id, className, style, extra, classNames, styles } = props;
43
43
  const { prefixCls, activeKey, onExpand } = (0, import_react2.useContext)(import_collapse.CollapseContext);
44
+ const panelId = (0, import_react2.useId)();
45
+ const headerId = `${panelId}-header`;
46
+ const contentId = `${panelId}-content`;
44
47
  const expanded = activeKey.includes(id);
45
48
  const itemClassName = (0, import_clsx.default)(
46
49
  `${prefixCls}-item`,
@@ -55,7 +58,9 @@ var Panel = (props) => {
55
58
  className: (0, import_clsx.default)(`${prefixCls}-header`, classNames == null ? void 0 : classNames.header),
56
59
  role: "button",
57
60
  style: styles == null ? void 0 : styles.header,
61
+ id: headerId,
58
62
  "aria-expanded": expanded,
63
+ "aria-controls": contentId,
59
64
  "aria-disabled": "false",
60
65
  tabIndex: 0,
61
66
  onClick: () => onExpand(id),
@@ -72,7 +77,8 @@ var Panel = (props) => {
72
77
  className: (0, import_clsx.default)(`${prefixCls}-expand-icon`, classNames == null ? void 0 : classNames.expandIcon),
73
78
  style: styles == null ? void 0 : styles.expandIcon,
74
79
  animate: { rotate: expanded ? 90 : 0 },
75
- transition: { duration: 0.15 }
80
+ transition: { duration: 0.15 },
81
+ "aria-hidden": "true"
76
82
  },
77
83
  /* @__PURE__ */ import_react2.default.createElement(import_Button.default, { icon: /* @__PURE__ */ import_react2.default.createElement(import_lucide_react.ChevronRight, { size: 16 }), type: "text" })
78
84
  ),
@@ -99,6 +105,9 @@ var Panel = (props) => {
99
105
  {
100
106
  className: (0, import_clsx.default)(`${prefixCls}-content`, classNames == null ? void 0 : classNames.content),
101
107
  style: styles == null ? void 0 : styles.content,
108
+ id: contentId,
109
+ role: "region",
110
+ "aria-labelledby": headerId,
102
111
  initial: { height: 0, opacity: 0 },
103
112
  animate: { height: "auto", opacity: 1 },
104
113
  exit: { height: 0, opacity: 0 },