@sdata/web-vue 3.13.0 → 3.14.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 (224) hide show
  1. package/dist/sd.css +141 -111
  2. package/dist/sd.min.css +2 -2
  3. package/es/_components/input-label/input-label.d.ts +2 -0
  4. package/es/_components/input-label/input-label.js +4 -2
  5. package/es/_components/input-label/style/index.css +2 -2
  6. package/es/_components/picker/style/index.scss +8 -2
  7. package/es/_components/resize-observer.js +1 -1
  8. package/es/_components/resize-trigger.vue_vue_type_script_setup_true_lang.js +9 -2
  9. package/es/_components/select-view/select-view.d.ts +2 -0
  10. package/es/_components/select-view/select-view.js +5 -1
  11. package/es/_components/select-view/style/index.css +5 -5
  12. package/es/_hooks/use-focus-trap.d.ts +10 -0
  13. package/es/_hooks/use-focus-trap.js +115 -0
  14. package/es/_utils/dom.js +1 -10
  15. package/es/_utils/keyboard.d.ts +4 -0
  16. package/es/_utils/keyboard.js +21 -2
  17. package/es/alert/alert.vue.d.ts +2 -2
  18. package/es/alert/alert.vue_vue_type_script_setup_true_lang.js +12 -3
  19. package/es/alert/index.d.ts +5 -5
  20. package/es/alert/style/index.css +1 -1
  21. package/es/alert/style/index.scss +1 -1
  22. package/es/anchor/anchor-link.vue_vue_type_script_setup_true_lang.js +3 -1
  23. package/es/anchor/anchor.vue_vue_type_script_setup_true_lang.js +2 -0
  24. package/es/anchor/style/index.css +1 -1
  25. package/es/anchor/style/index.scss +3 -1
  26. package/es/auto-complete/auto-complete.js +8 -0
  27. package/es/avatar/avatar.vue_vue_type_script_setup_true_lang.js +8 -2
  28. package/es/avatar/style/index.css +2 -2
  29. package/es/avatar/style/index.scss +2 -2
  30. package/es/back-top/back-top.vue_vue_type_script_setup_true_lang.js +5 -1
  31. package/es/back-top/style/index.css +1 -1
  32. package/es/back-top/style/index.scss +2 -1
  33. package/es/badge/badge.js +4 -1
  34. package/es/badge/style/index.css +3 -3
  35. package/es/badge/style/index.scss +3 -3
  36. package/es/breadcrumb/breadcrumb.js +1 -0
  37. package/es/button/button.vue_vue_type_script_setup_true_lang.js +10 -5
  38. package/es/button/style/index.css +15 -6
  39. package/es/button/style/index.scss +25 -7
  40. package/es/calendar/style/event.scss +2 -2
  41. package/es/calendar/style/index.css +2 -2
  42. package/es/card/style/index.css +3 -3
  43. package/es/card/style/index.scss +3 -3
  44. package/es/carousel/carousel-arrow.vue.d.ts +4 -4
  45. package/es/carousel/carousel-arrow.vue_vue_type_script_setup_true_lang.js +20 -4
  46. package/es/carousel/carousel-indicator.vue_vue_type_script_setup_true_lang.js +23 -4
  47. package/es/carousel/carousel-item.vue_vue_type_script_setup_true_lang.js +8 -1
  48. package/es/carousel/carousel.js +18 -1
  49. package/es/carousel/style/index.css +1 -1
  50. package/es/carousel/style/index.scss +1 -1
  51. package/es/cascader/cascader.vue_vue_type_script_setup_true_lang.js +11 -2
  52. package/es/cascader/style/index.css +2 -2
  53. package/es/cascader/style/index.scss +3 -1
  54. package/es/checkbox/checkbox-group.js +4 -1
  55. package/es/checkbox/checkbox.d.ts +9 -0
  56. package/es/checkbox/checkbox.js +14 -0
  57. package/es/checkbox/index.d.ts +15 -0
  58. package/es/checkbox/style/index.css +1 -1
  59. package/es/checkbox/style/index.scss +1 -1
  60. package/es/collapse/collapse-item.js +21 -3
  61. package/es/collapse/context.d.ts +1 -1
  62. package/es/color-picker/color-picker.js +6 -0
  63. package/es/copy/copy.vue_vue_type_script_setup_true_lang.js +10 -2
  64. package/es/date-picker/panels/body.vue_vue_type_script_setup_true_lang.js +14 -1
  65. package/es/date-picker/picker.vue_vue_type_script_setup_true_lang.js +1 -0
  66. package/es/date-picker/style/index.css +5 -5
  67. package/es/date-picker/style/index.scss +4 -3
  68. package/es/drawer/drawer.vue.d.ts +1 -1
  69. package/es/drawer/drawer.vue_vue_type_script_setup_true_lang.js +28 -7
  70. package/es/drawer/index.d.ts +3 -3
  71. package/es/dropdown/dropdown-option.vue_vue_type_script_setup_true_lang.js +5 -1
  72. package/es/dropdown/dropdown-panel.vue.d.ts +9 -0
  73. package/es/dropdown/dropdown-panel.vue_vue_type_script_setup_true_lang.js +75 -2
  74. package/es/dropdown/dropdown-submenu.vue_vue_type_script_setup_true_lang.js +5 -2
  75. package/es/dropdown/dropdown.vue_vue_type_script_setup_true_lang.js +4 -2
  76. package/es/dropdown/style/index.css +1 -1
  77. package/es/dropdown/style/index.scss +3 -1
  78. package/es/file-previewer/file-previewer.vue.d.ts +1 -1
  79. package/es/file-previewer/file-previewer.vue_vue_type_script_setup_true_lang.js +7 -3
  80. package/es/file-previewer/index.d.ts +3 -3
  81. package/es/form/context.d.ts +1 -0
  82. package/es/form/form-item.vue_vue_type_script_setup_true_lang.js +6 -2
  83. package/es/form/style/index.css +2 -2
  84. package/es/form/style/index.scss +2 -2
  85. package/es/image/preview.vue.d.ts +1 -1
  86. package/es/image/preview.vue_vue_type_script_setup_true_lang.js +1 -1
  87. package/es/index.css +141 -111
  88. package/es/input/input.js +16 -2
  89. package/es/input/style/index.css +2 -2
  90. package/es/input/style/input.scss +4 -4
  91. package/es/input-number/input-number.js +5 -1
  92. package/es/input-number/style/index.css +3 -3
  93. package/es/input-number/style/index.scss +5 -1
  94. package/es/input-tag/index.d.ts +3 -0
  95. package/es/input-tag/input-tag.d.ts +2 -0
  96. package/es/input-tag/input-tag.js +34 -30
  97. package/es/input-tag/style/index.css +8 -8
  98. package/es/input-tag/style/index.scss +11 -5
  99. package/es/layout/sider.vue_vue_type_script_setup_true_lang.js +31 -6
  100. package/es/layout/style/index.css +2 -2
  101. package/es/layout/style/index.scss +4 -2
  102. package/es/link/style/index.css +1 -1
  103. package/es/link/style/index.scss +3 -1
  104. package/es/mention/mention.js +8 -0
  105. package/es/menu/base-menu.vue_vue_type_script_setup_true_lang.js +29 -3
  106. package/es/menu/item.js +14 -1
  107. package/es/menu/style/index.css +6 -6
  108. package/es/menu/style/index.scss +5 -3
  109. package/es/message/style/index.css +3 -3
  110. package/es/message/style/index.scss +5 -3
  111. package/es/modal/index.d.ts +3 -3
  112. package/es/modal/modal.vue.d.ts +1 -1
  113. package/es/modal/modal.vue_vue_type_script_setup_true_lang.js +28 -13
  114. package/es/modal/style/index.css +2 -2
  115. package/es/modal/style/index.scss +3 -2
  116. package/es/notification/style/index.css +3 -3
  117. package/es/notification/style/index.scss +11 -3
  118. package/es/page-header/page-header.vue.d.ts +6 -6
  119. package/es/page-header/page-header.vue_vue_type_script_setup_true_lang.js +12 -1
  120. package/es/pagination/page-item-ellipsis.vue_vue_type_script_setup_true_lang.js +12 -2
  121. package/es/pagination/page-item-step.vue.d.ts +2 -2
  122. package/es/pagination/page-item-step.vue_vue_type_script_setup_true_lang.js +19 -2
  123. package/es/pagination/page-item.vue.d.ts +2 -2
  124. package/es/pagination/page-item.vue_vue_type_script_setup_true_lang.js +21 -3
  125. package/es/pagination/pagination.js +5 -1
  126. package/es/pagination/style/index.css +6 -1
  127. package/es/pagination/style/index.scss +9 -3
  128. package/es/popconfirm/popconfirm.vue_vue_type_script_setup_true_lang.js +2 -0
  129. package/es/popover/popover.vue_vue_type_script_setup_true_lang.js +2 -0
  130. package/es/progress/style/index.css +2 -2
  131. package/es/progress/style/index.scss +5 -3
  132. package/es/qr-code/qr-code-status.vue_vue_type_script_setup_true_lang.js +5 -1
  133. package/es/qr-code/qr-code.vue_vue_type_script_setup_true_lang.js +11 -6
  134. package/es/radio/context.d.ts +1 -0
  135. package/es/radio/radio-group.js +6 -2
  136. package/es/radio/radio.js +1 -0
  137. package/es/radio/style/index.css +2 -2
  138. package/es/radio/style/index.scss +4 -2
  139. package/es/rate/rate.js +25 -1
  140. package/es/resize-box/resize-box.vue.d.ts +4 -4
  141. package/es/resize-box/resize-box.vue_vue_type_script_setup_true_lang.js +30 -1
  142. package/es/result/result.vue_vue_type_script_setup_true_lang.js +7 -4
  143. package/es/select/index.d.ts +124 -0
  144. package/es/select/select-dropdown.vue_vue_type_script_setup_true_lang.js +4 -1
  145. package/es/select/select.d.ts +62 -0
  146. package/es/select/select.js +18 -2
  147. package/es/select/style/index.css +1 -1
  148. package/es/select/style/index.scss +3 -1
  149. package/es/selectable-card/style/index.css +2 -2
  150. package/es/selectable-card/style/index.scss +5 -5
  151. package/es/skeleton/skeleton.vue_vue_type_script_setup_true_lang.js +5 -1
  152. package/es/slider/slider-button.vue.d.ts +2 -0
  153. package/es/slider/slider-button.vue_vue_type_script_setup_true_lang.js +7 -2
  154. package/es/slider/slider.vue_vue_type_script_setup_true_lang.js +23 -2
  155. package/es/slider/style/index.css +1 -1
  156. package/es/slider/style/index.scss +3 -1
  157. package/es/spin/spin.js +7 -2
  158. package/es/spin/style/index.css +1 -1
  159. package/es/spin/style/index.scss +1 -1
  160. package/es/split/split.vue.d.ts +4 -4
  161. package/es/split/split.vue_vue_type_script_setup_true_lang.js +27 -3
  162. package/es/steps/context.d.ts +1 -0
  163. package/es/steps/step.vue_vue_type_script_setup_true_lang.js +15 -2
  164. package/es/steps/steps.vue_vue_type_script_setup_true_lang.js +6 -1
  165. package/es/steps/style/index.css +1 -1
  166. package/es/steps/style/index.scss +1 -1
  167. package/es/style/animation/index.scss +1 -0
  168. package/es/style/animation/reduced-motion.scss +22 -0
  169. package/es/style/animation/zoom.scss +7 -6
  170. package/es/style/icon.scss +9 -1
  171. package/es/switch/style/index.css +1 -1
  172. package/es/switch/style/index.scss +4 -1
  173. package/es/switch/switch.vue_vue_type_script_setup_true_lang.js +6 -1
  174. package/es/table/style/index.css +8 -8
  175. package/es/table/style/index.scss +11 -8
  176. package/es/table/table-operation-td.d.ts +15 -0
  177. package/es/table/table-tbody.js +4 -1
  178. package/es/table/table-td.js +2 -1
  179. package/es/table/table-th.js +4 -2
  180. package/es/table/table-thead.js +4 -1
  181. package/es/table/table-tr.js +4 -1
  182. package/es/table/table.js +6 -2
  183. package/es/tabs/context.d.ts +1 -0
  184. package/es/tabs/style/index.css +5 -5
  185. package/es/tabs/style/index.scss +7 -7
  186. package/es/tabs/tab-pane.vue_vue_type_script_setup_true_lang.js +21 -2
  187. package/es/tabs/tabs-nav.js +34 -1
  188. package/es/tabs/tabs-tab.vue_vue_type_script_setup_true_lang.js +27 -4
  189. package/es/tabs/tabs.js +4 -2
  190. package/es/tag/index.d.ts +5 -5
  191. package/es/tag/style/index.css +1 -1
  192. package/es/tag/style/index.scss +3 -1
  193. package/es/tag/tag.vue.d.ts +2 -2
  194. package/es/tag/tag.vue_vue_type_script_setup_true_lang.js +19 -2
  195. package/es/textarea/style/index.css +2 -2
  196. package/es/textarea/textarea.vue_vue_type_script_setup_true_lang.js +15 -3
  197. package/es/time-picker/time-column.vue_vue_type_script_setup_true_lang.js +11 -3
  198. package/es/time-picker/time-picker.vue_vue_type_script_setup_true_lang.js +4 -1
  199. package/es/tooltip/tooltip.vue_vue_type_script_setup_true_lang.js +1 -0
  200. package/es/transfer/style/index.css +1 -1
  201. package/es/transfer/style/index.scss +1 -1
  202. package/es/transfer/transfer-list-item.js +16 -2
  203. package/es/tree/base-node.vue_vue_type_script_setup_true_lang.js +27 -7
  204. package/es/tree/context.d.ts +2 -0
  205. package/es/tree/style/index.css +1 -1
  206. package/es/tree/style/index.scss +1 -1
  207. package/es/tree/tree.vue_vue_type_script_setup_true_lang.js +81 -2
  208. package/es/tree-select/tree-select.vue_vue_type_script_setup_true_lang.js +10 -1
  209. package/es/trigger/index.d.ts +45 -0
  210. package/es/trigger/trigger.d.ts +27 -0
  211. package/es/trigger/trigger.js +47 -5
  212. package/es/typography/edit-content.vue_vue_type_script_setup_true_lang.js +11 -8
  213. package/es/typography/operations.vue_vue_type_script_setup_true_lang.js +38 -6
  214. package/es/typography/style/index.css +2 -2
  215. package/es/typography/style/index.scss +2 -2
  216. package/es/upload/style/index.css +9 -9
  217. package/es/upload/style/index.scss +15 -9
  218. package/es/upload/upload-list-item.js +18 -5
  219. package/es/upload/upload-picture-item.js +25 -3
  220. package/es/verification-code/verification-code.js +6 -1
  221. package/json/vetur-attributes.json +15 -0
  222. package/json/vetur-tags.json +6 -2
  223. package/json/web-types.json +33 -1
  224. package/package.json +1 -1
@@ -3,7 +3,12 @@ import { isUndefined } from "../_utils/is.js";
3
3
  import { scrollTo } from "./utils/index.js";
4
4
  import { Fragment, createElementBlock, createElementVNode, defineComponent, nextTick, normalizeClass, onMounted, openBlock, ref, renderList, toDisplayString, watch } from "vue";
5
5
  //#region components/time-picker/time-column.vue?vue&type=script&setup=true&lang.ts
6
- var _hoisted_1 = ["onClick"];
6
+ var _hoisted_1 = { role: "listbox" };
7
+ var _hoisted_2 = [
8
+ "aria-selected",
9
+ "aria-disabled",
10
+ "onClick"
11
+ ];
7
12
  var time_column_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent(_objectSpread2(_objectSpread2({}, { name: "TimePickerColumn" }), {}, {
8
13
  __name: "time-column",
9
14
  props: {
@@ -50,13 +55,16 @@ var time_column_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
50
55
  ref_key: "refWrapper",
51
56
  ref: refWrapper,
52
57
  class: normalizeClass(`${__props.prefixCls}-column`)
53
- }, [createElementVNode("ul", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.list, (item) => {
58
+ }, [createElementVNode("ul", _hoisted_1, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.list, (item) => {
54
59
  return openBlock(), createElementBlock("li", {
55
60
  key: item.value,
56
61
  ref_for: true,
57
62
  ref: (el) => {
58
63
  onItemRef(el, item);
59
64
  },
65
+ role: "option",
66
+ "aria-selected": item.selected ? "true" : "false",
67
+ "aria-disabled": item.disabled || void 0,
60
68
  class: normalizeClass([`${__props.prefixCls}-cell`, {
61
69
  [`${__props.prefixCls}-cell-disabled`]: item.disabled,
62
70
  [`${__props.prefixCls}-cell-selected`]: item.selected
@@ -64,7 +72,7 @@ var time_column_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
64
72
  onClick: () => {
65
73
  onItemClick(item);
66
74
  }
67
- }, [createElementVNode("div", { class: normalizeClass(`${__props.prefixCls}-cell-inner`) }, toDisplayString(item.label), 3)], 10, _hoisted_1);
75
+ }, [createElementVNode("div", { class: normalizeClass(`${__props.prefixCls}-cell-inner`) }, toDisplayString(item.label), 3)], 10, _hoisted_2);
68
76
  }), 128))])], 2);
69
77
  };
70
78
  }
@@ -376,7 +376,10 @@ var time_picker_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
376
376
  "prevent-focus": true,
377
377
  "unmount-on-close": __props.unmountOnClose,
378
378
  "popup-container": __props.popupContainer
379
- }, _objectSpread2({}, __props.triggerProps), { onPopupVisibleChange: onPanelVisibleChange }), {
379
+ }, _objectSpread2({}, __props.triggerProps), {
380
+ "aria-has-popup": "dialog",
381
+ onPopupVisibleChange: onPanelVisibleChange
382
+ }), {
380
383
  content: withCtx(() => [createElementVNode("div", {
381
384
  class: normalizeClass(`${unref(prefixCls)}-container`),
382
385
  onClick: onPanelClick
@@ -80,6 +80,7 @@ var tooltip_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCo
80
80
  "animation-name": "zoom-in-fade-out",
81
81
  "auto-fit-transform-origin": "",
82
82
  role: "tooltip",
83
+ "aria-describedby-popup": "",
83
84
  onPopupVisibleChange: handlePopupVisibleChange
84
85
  }, {
85
86
  content: withCtx(() => [renderSlot(_ctx.$slots, "content", {}, () => [createTextVNode(toDisplayString(__props.content), 1)])]),
@@ -218,7 +218,7 @@
218
218
  }
219
219
  .sd-transfer-list-item-dragged {
220
220
  animation: sd-transfer-drag-item-blink 0.4s;
221
- animation-timing-function: cubic-bezier(0, 0, 1, 1);
221
+ animation-timing-function: cubic-bezier(0.34, 0.69, 0.1, 1);
222
222
  }
223
223
  .sd-transfer-operations {
224
224
  padding: 0 20px;
@@ -243,7 +243,7 @@ $transfer-prefix-cls: string.unquote('#{theme.$prefix}-transfer');
243
243
 
244
244
  &-dragged {
245
245
  animation: #{theme.$prefix}-transfer-drag-item-blink 0.4s;
246
- animation-timing-function: theme.$transition-timing-function-linear;
246
+ animation-timing-function: theme.$transition-timing-function-standard;
247
247
  }
248
248
  }
249
249
 
@@ -1,9 +1,10 @@
1
1
  import { getPrefixCls } from "../_utils/global-config.js";
2
2
  import icon_hover_default from "../_components/icon-hover.js";
3
+ import { isActivationKey } from "../_utils/keyboard.js";
3
4
  import IconClose from "../icon/icon-close/index.js";
4
5
  import Checkbox from "../checkbox/index.js";
5
6
  import { transferInjectionKey } from "./context.js";
6
- import { computed, createVNode, defineComponent, inject, mergeProps } from "vue";
7
+ import { computed, createVNode, defineComponent, inject } from "vue";
7
8
  //#region components/transfer/transfer-list-item.tsx
8
9
  var transfer_list_item_default = /* @__PURE__ */ defineComponent({
9
10
  name: "TransferListItem",
@@ -31,6 +32,12 @@ var transfer_list_item_default = /* @__PURE__ */ defineComponent({
31
32
  const handleRemove = () => {
32
33
  transferCtx === null || transferCtx === void 0 || transferCtx.moveTo([props.data.value], "source");
33
34
  };
35
+ const handleRemoveKeydown = (ev) => {
36
+ if (isActivationKey(ev)) {
37
+ ev.preventDefault();
38
+ handleRemove();
39
+ }
40
+ };
34
41
  return () => {
35
42
  var _transferCtx$slots$it, _transferCtx$slots, _transferCtx$slots$it2;
36
43
  return createVNode("div", {
@@ -52,7 +59,14 @@ var transfer_list_item_default = /* @__PURE__ */ defineComponent({
52
59
  label: props.data.label,
53
60
  value: props.data.value
54
61
  })) !== null && _transferCtx$slots$it3 !== void 0 ? _transferCtx$slots$it3 : props.data.label];
55
- } }), props.allowClear && !props.disabled && createVNode(icon_hover_default, mergeProps({ "class": `${prefixCls}-remove-btn` }, { onClick: handleRemove }), { default: () => [createVNode(IconClose, null, null)] })]);
62
+ } }), props.allowClear && !props.disabled && createVNode("span", {
63
+ "class": `${prefixCls}-remove-btn`,
64
+ "role": "button",
65
+ "tabindex": "0",
66
+ "aria-label": "Remove",
67
+ "onClick": handleRemove,
68
+ "onKeydown": handleRemoveKeydown
69
+ }, [createVNode(icon_hover_default, null, { default: () => [createVNode(IconClose, null, null)] })])]);
56
70
  };
57
71
  }
58
72
  });
@@ -12,7 +12,15 @@ import node_switcher_default from "./node-switcher.js";
12
12
  import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createTextVNode, createVNode, defineComponent, mergeProps, normalizeClass, normalizeProps, openBlock, reactive, ref, renderList, renderSlot, resolveDynamicComponent, toDisplayString, toRefs, unref, useSlots, withCtx } from "vue";
13
13
  import { onLongPress, useSwipe } from "@vueuse/core";
14
14
  //#region components/tree/base-node.vue?vue&type=script&setup=true&lang.ts
15
- var _hoisted_1 = ["data-level", "data-key"];
15
+ var _hoisted_1 = [
16
+ "data-level",
17
+ "data-key",
18
+ "tabindex",
19
+ "aria-level",
20
+ "aria-expanded",
21
+ "aria-selected",
22
+ "aria-disabled"
23
+ ];
16
24
  var _hoisted_2 = ["draggable"];
17
25
  var base_node_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent(_objectSpread2(_objectSpread2({}, { name: "BaseTreeNode" }), {}, {
18
26
  __name: "base-node",
@@ -192,6 +200,11 @@ var base_node_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
192
200
  var _treeContext$onNodeEv;
193
201
  (_treeContext$onNodeEv = treeContext.onNodeEvent) === null || _treeContext$onNodeEv === void 0 || _treeContext$onNodeEv.call(treeContext, eventName, key.value, e);
194
202
  }
203
+ function onTreeitemKeydown(e) {
204
+ var _treeContext$onNodeKe;
205
+ onNodeDomEvent("keydown", e);
206
+ (_treeContext$onNodeKe = treeContext.onNodeKeydown) === null || _treeContext$onNodeKe === void 0 || _treeContext$onNodeKe.call(treeContext, key.value, e);
207
+ }
195
208
  function onDragStart(e) {
196
209
  if (!draggable.value) return;
197
210
  e.stopPropagation();
@@ -229,7 +242,16 @@ var base_node_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
229
242
  return openBlock(), createElementBlock("div", {
230
243
  class: normalizeClass(classNames.value),
231
244
  "data-level": __props.level,
232
- "data-key": unref(nodekey)
245
+ "data-key": unref(nodekey),
246
+ role: "treeitem",
247
+ tabindex: unref(treeContext).activeKey === unref(nodekey) ? 0 : -1,
248
+ "aria-level": __props.level + 1,
249
+ "aria-expanded": unref(isLeaf) ? void 0 : expanded.value,
250
+ "aria-selected": unref(selectable) ? selected.value : void 0,
251
+ "aria-disabled": unref(disabled) || void 0,
252
+ onKeydown: onTreeitemKeydown,
253
+ onKeyup: _cache[21] || (_cache[21] = ($event) => onNodeDomEvent("keyup", $event)),
254
+ onKeypress: _cache[22] || (_cache[22] = ($event) => onNodeDomEvent("keypress", $event))
233
255
  }, [
234
256
  createElementVNode("span", { class: normalizeClass(`${unref(prefixCls)}-indent`) }, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.level, (i) => {
235
257
  return openBlock(), createElementBlock("span", {
@@ -272,6 +294,7 @@ var base_node_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
272
294
  disabled: unref(disableCheckbox) || unref(disabled),
273
295
  "model-value": checked.value,
274
296
  indeterminate: indeterminate.value,
297
+ tabindex: "-1",
275
298
  "uninject-group-context": "",
276
299
  onChange: onCheckboxChange
277
300
  }, null, 8, [
@@ -310,10 +333,7 @@ var base_node_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
310
333
  onTouchstart: _cache[17] || (_cache[17] = ($event) => onNodeDomEvent("touchstart", $event)),
311
334
  onTouchmove: _cache[18] || (_cache[18] = ($event) => onNodeDomEvent("touchmove", $event)),
312
335
  onTouchend: _cache[19] || (_cache[19] = ($event) => onNodeDomEvent("touchend", $event)),
313
- onTouchcancel: _cache[20] || (_cache[20] = ($event) => onNodeDomEvent("touchcancel", $event)),
314
- onKeydown: _cache[21] || (_cache[21] = ($event) => onNodeDomEvent("keydown", $event)),
315
- onKeyup: _cache[22] || (_cache[22] = ($event) => onNodeDomEvent("keyup", $event)),
316
- onKeypress: _cache[23] || (_cache[23] = ($event) => onNodeDomEvent("keypress", $event))
336
+ onTouchcancel: _cache[20] || (_cache[20] = ($event) => onNodeDomEvent("touchcancel", $event))
317
337
  }, [_ctx.$slots.icon || __props.icon || treeNodeIcon.value ? (openBlock(), createElementBlock("span", {
318
338
  key: 0,
319
339
  class: normalizeClass([`${unref(prefixCls)}-icon`, `${unref(prefixCls)}-custom-icon`])
@@ -337,7 +357,7 @@ var base_node_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ define
337
357
  node: treeNodeData.value
338
358
  }, nodeStatus), null, 16, ["node"])) : (openBlock(), createBlock(unref(IconDragDotVertical), { key: 3 }))], 2)) : createCommentVNode("", true)], 2)], 42, _hoisted_2),
339
359
  extra.value ? (openBlock(), createBlock(resolveDynamicComponent(extra.value), { key: 2 })) : createCommentVNode("", true)
340
- ], 10, _hoisted_1);
360
+ ], 42, _hoisted_1);
341
361
  };
342
362
  }
343
363
  }));
@@ -19,6 +19,7 @@ export type TreeContext = Readonly<{
19
19
  expandedKeys: TreeNodeKey[];
20
20
  loadingKeys: TreeNodeKey[];
21
21
  currentExpandKeys: TreeNodeKey[];
22
+ activeKey?: TreeNodeKey;
22
23
  onLoadMore?: (key: TreeNodeKey) => void;
23
24
  onCheck: (checked: boolean, key: TreeNodeKey, e?: Event) => void;
24
25
  onSelect: (key: TreeNodeKey, e: Event) => void;
@@ -31,6 +32,7 @@ export type TreeContext = Readonly<{
31
32
  onDrop?: (key: TreeNodeKey, dropPosition: DropPosition, e: DragEvent) => void;
32
33
  allowDrop?: (key: TreeNodeKey, dropPosition: DropPosition) => boolean;
33
34
  onNodeEvent?: (eventName: TreeNodeDomEventName, key: TreeNodeKey, e: Event) => void;
35
+ onNodeKeydown?: (key: TreeNodeKey, e: KeyboardEvent) => void;
34
36
  onNodeLongPress?: (key: TreeNodeKey, e: PointerEvent) => void;
35
37
  onNodeSwipe?: (eventName: TreeNodeSwipeEventName, key: TreeNodeKey, e: TouchEvent, data: TreeNodeSwipeEventData) => void;
36
38
  }>;
@@ -120,7 +120,7 @@
120
120
  }
121
121
  .sd-tree-node-selected .sd-tree-node-title, .sd-tree-node-selected .sd-tree-node-title:hover {
122
122
  color: rgb(var(--sd-primary-6));
123
- transition: color 0.2s cubic-bezier(0, 0, 1, 1);
123
+ transition: color 0.2s cubic-bezier(0.34, 0.69, 0.1, 1);
124
124
  }
125
125
  .sd-tree-node-disabled-selectable .sd-tree-node-title,
126
126
  .sd-tree-node-disabled-selectable .sd-tree-node-title:hover, .sd-tree-node-disabled .sd-tree-node-title,
@@ -157,7 +157,7 @@ $tree-node-prefix-cls: string.unquote('#{theme.$prefix}-tree-node');
157
157
  &-selected &-title,
158
158
  &-selected &-title:hover {
159
159
  color: $tree-color-title-text_active;
160
- transition: color theme.$transition-duration-2 theme.$transition-timing-function-linear;
160
+ transition: color theme.$transition-duration-2 theme.$transition-timing-function-standard;
161
161
  }
162
162
 
163
163
  &-disabled-selectable,
@@ -1,6 +1,7 @@
1
1
  import { _objectSpread2 } from "../_virtual/_@oxc-project_runtime@0.133.0/helpers/esm/objectSpread2.js";
2
2
  import { getPrefixCls } from "../_utils/global-config.js";
3
3
  import { isArray, isFunction, isUndefined } from "../_utils/is.js";
4
+ import { KEYBOARD_KEY } from "../_utils/keyboard.js";
4
5
  import { _asyncToGenerator } from "../_virtual/_@oxc-project_runtime@0.133.0/helpers/esm/asyncToGenerator.js";
5
6
  import virtual_list_default from "../_components/virtual-list/index.js";
6
7
  import usePickSlots from "../_hooks/use-pick-slots.js";
@@ -11,7 +12,7 @@ import { getCheckedStateByCheck, isNodeCheckable } from "./utils/check-utils.js"
11
12
  import { TreeInjectionKey } from "./context.js";
12
13
  import useCheckedState from "./hooks/use-checked-state.js";
13
14
  import node_default from "./node.js";
14
- import { Fragment, computed, createBlock, createElementBlock, defineComponent, mergeProps, normalizeClass, normalizeStyle, openBlock, provide, reactive, ref, renderList, toRefs, unref, useSlots, watch, withCtx } from "vue";
15
+ import { Fragment, computed, createBlock, createElementBlock, defineComponent, mergeProps, nextTick, normalizeClass, normalizeStyle, openBlock, provide, reactive, ref, renderList, toRefs, unref, useSlots, watch, withCtx } from "vue";
15
16
  //#region components/tree/tree.vue?vue&type=script&setup=true&lang.ts
16
17
  var tree_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent(_objectSpread2(_objectSpread2({}, { name: "Tree" }), {}, {
17
18
  __name: "tree",
@@ -340,6 +341,7 @@ var tree_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCompo
340
341
  };
341
342
  });
342
343
  const virtualListRef = ref(null);
344
+ const rootEl = ref(null);
343
345
  const virtualListVersion = ref(0);
344
346
  const virtualListKey = computed(() => `tree-virtual-list-${virtualListVersion.value}`);
345
347
  const switcherIcon = usePickSlots(slots, "switcher-icon");
@@ -421,6 +423,78 @@ var tree_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCompo
421
423
  });
422
424
  return uniqueNodeList;
423
425
  });
426
+ const activeKey = ref(void 0);
427
+ const effectiveActiveKey = computed(() => {
428
+ var _visibleTreeNodeList$;
429
+ if (activeKey.value !== void 0) return activeKey.value;
430
+ const selected = mergedSelectedKeys.value.find((k) => key2TreeNode.value.has(k));
431
+ if (selected !== void 0) return selected;
432
+ return (_visibleTreeNodeList$ = visibleTreeNodeList.value[0]) === null || _visibleTreeNodeList$ === void 0 ? void 0 : _visibleTreeNodeList$.key;
433
+ });
434
+ function focusNodeKey(targetKey) {
435
+ activeKey.value = targetKey;
436
+ nextTick(() => {
437
+ var _rootEl$value;
438
+ const el = (_rootEl$value = rootEl.value) === null || _rootEl$value === void 0 ? void 0 : _rootEl$value.querySelector(`[data-key="${CSS.escape(String(targetKey))}"]`);
439
+ el === null || el === void 0 || el.focus();
440
+ });
441
+ }
442
+ function onNodeKeydown(key, e) {
443
+ var _node$children;
444
+ const list = visibleTreeNodeList.value;
445
+ const idx = list.findIndex((n) => n.key === key);
446
+ if (idx === -1) return;
447
+ const node = list[idx];
448
+ const hasChildren = !node.isLeaf && Boolean((_node$children = node.children) === null || _node$children === void 0 ? void 0 : _node$children.length);
449
+ const isExpanded = mergedExpandedKeys.value.includes(key);
450
+ switch (e.key) {
451
+ case KEYBOARD_KEY.ARROW_DOWN:
452
+ e.preventDefault();
453
+ if (list[idx + 1]) focusNodeKey(list[idx + 1].key);
454
+ break;
455
+ case KEYBOARD_KEY.ARROW_UP:
456
+ e.preventDefault();
457
+ if (list[idx - 1]) focusNodeKey(list[idx - 1].key);
458
+ break;
459
+ case KEYBOARD_KEY.HOME:
460
+ e.preventDefault();
461
+ if (list[0]) focusNodeKey(list[0].key);
462
+ break;
463
+ case KEYBOARD_KEY.END:
464
+ e.preventDefault();
465
+ if (list.length) focusNodeKey(list[list.length - 1].key);
466
+ break;
467
+ case KEYBOARD_KEY.ARROW_RIGHT:
468
+ e.preventDefault();
469
+ if (hasChildren && !isExpanded) onExpand(true, key, e);
470
+ else if (hasChildren && isExpanded) {
471
+ var _node$children2;
472
+ const firstChild = (_node$children2 = node.children) === null || _node$children2 === void 0 ? void 0 : _node$children2[0];
473
+ if (firstChild) focusNodeKey(firstChild.key);
474
+ }
475
+ break;
476
+ case KEYBOARD_KEY.ARROW_LEFT:
477
+ e.preventDefault();
478
+ if (hasChildren && isExpanded) onExpand(false, key, e);
479
+ else {
480
+ const parents = node.pathParentKeys;
481
+ if (parents.length) focusNodeKey(parents[parents.length - 1]);
482
+ }
483
+ break;
484
+ case KEYBOARD_KEY.ENTER:
485
+ case KEYBOARD_KEY.SPACE:
486
+ if (node.checkable && !node.disableCheckbox && !node.disabled) {
487
+ e.preventDefault();
488
+ onCheck(!mergedCheckedKeys.value.includes(key), key, e);
489
+ break;
490
+ }
491
+ if (node.selectable && !node.disabled) {
492
+ e.preventDefault();
493
+ onSelect(key, e);
494
+ }
495
+ break;
496
+ }
497
+ }
424
498
  function getPublicCheckedKeys(rawCheckedKeys, rawCheckedStrategy = checkedStrategy.value) {
425
499
  let publicCheckedKeys = [...rawCheckedKeys];
426
500
  if (rawCheckedStrategy === "parent") publicCheckedKeys = rawCheckedKeys.filter((_key) => {
@@ -717,6 +791,7 @@ var tree_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCompo
717
791
  expandedKeys: mergedExpandedKeys,
718
792
  loadingKeys,
719
793
  currentExpandKeys,
794
+ activeKey: effectiveActiveKey,
720
795
  onLoadMore: computed(() => (loadMore === null || loadMore === void 0 ? void 0 : loadMore.value) ? function() {
721
796
  var _ref = _asyncToGenerator(function* (key) {
722
797
  if (!isFunction(loadMore.value)) return;
@@ -744,6 +819,7 @@ var tree_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCompo
744
819
  onExpand,
745
820
  onExpandEnd,
746
821
  onNodeEvent,
822
+ onNodeKeydown,
747
823
  onNodeLongPress,
748
824
  onNodeSwipe,
749
825
  allowDrop(key, dropPosition) {
@@ -947,8 +1023,11 @@ var tree_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineCompo
947
1023
  });
948
1024
  return (_ctx, _cache) => {
949
1025
  return openBlock(), createElementBlock("div", {
1026
+ ref_key: "rootEl",
1027
+ ref: rootEl,
950
1028
  class: normalizeClass(classNames.value),
951
- style: normalizeStyle(treeStyle.value)
1029
+ style: normalizeStyle(treeStyle.value),
1030
+ role: "tree"
952
1031
  }, [unref(virtualListProps) ? (openBlock(), createBlock(unref(virtual_list_default), mergeProps({
953
1032
  key: virtualListKey.value,
954
1033
  ref_key: "virtualListRef",
@@ -525,6 +525,12 @@ var tree_select_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
525
525
  };
526
526
  const { tipVisible, show: showReadonlyTip } = useReadonlyTip(toRef(props, "readonly"), mergedDisabled);
527
527
  const readonlyTipText = useReadonlyTipText(toRef(props, "readonly"));
528
+ const triggerInputAttrs = computed(() => ({
529
+ "role": "combobox",
530
+ "aria-expanded": panelVisible.value,
531
+ "aria-haspopup": "listbox",
532
+ "aria-autocomplete": mergedAllowSearch.value ? "list" : "none"
533
+ }));
528
534
  const setPanelVisible = (visible) => {
529
535
  if (visible && props.readonly && !mergedDisabled.value) {
530
536
  showReadonlyTip();
@@ -603,6 +609,7 @@ var tree_select_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
603
609
  "popup-container": __props.popupContainer,
604
610
  "click-to-close": !Boolean(unref(mergedAllowSearch)),
605
611
  "auto-fit-transform-origin": "",
612
+ "aria-has-popup": "listbox",
606
613
  onPopupVisibleChange: unref(onVisibleChange)
607
614
  }), {
608
615
  content: withCtx(() => [createElementVNode("div", {
@@ -671,7 +678,8 @@ var tree_select_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
671
678
  error: __props.error,
672
679
  bordered: __props.border,
673
680
  placeholder: __props.placeholder,
674
- multiple: isMultiple.value
681
+ multiple: isMultiple.value,
682
+ "input-attrs": triggerInputAttrs.value
675
683
  }, _ctx.$attrs, {
676
684
  onInputValueChange: unref(onSearchValueChange),
677
685
  onClear: onInnerClear,
@@ -711,6 +719,7 @@ var tree_select_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
711
719
  "bordered",
712
720
  "placeholder",
713
721
  "multiple",
722
+ "input-attrs",
714
723
  "onInputValueChange"
715
724
  ])])]),
716
725
  _: 3
@@ -145,6 +145,18 @@ declare const Trigger: {
145
145
  type: NumberConstructor;
146
146
  default: number;
147
147
  };
148
+ escToClose: {
149
+ type: BooleanConstructor;
150
+ default: boolean;
151
+ };
152
+ ariaHasPopup: {
153
+ type: import("vue").PropType<boolean | "menu" | "listbox" | "tree" | "grid" | "dialog">;
154
+ default: undefined;
155
+ };
156
+ ariaDescribedbyPopup: {
157
+ type: BooleanConstructor;
158
+ default: boolean;
159
+ };
148
160
  }>> & Readonly<{
149
161
  onHide?: (() => any) | undefined;
150
162
  onResize?: (() => any) | undefined;
@@ -186,6 +198,9 @@ declare const Trigger: {
186
198
  preventFocus: boolean;
187
199
  scrollToClose: boolean;
188
200
  scrollToCloseDistance: number;
201
+ escToClose: boolean;
202
+ ariaHasPopup: boolean | "dialog" | "menu" | "listbox" | "tree" | "grid";
203
+ ariaDescribedbyPopup: boolean;
189
204
  }, true, {}, {}, import("vue").GlobalComponents, import("vue").GlobalDirectives, string, {}, any, import("vue").ComponentProvideOptions, {
190
205
  P: {};
191
206
  B: {};
@@ -336,6 +351,18 @@ declare const Trigger: {
336
351
  type: NumberConstructor;
337
352
  default: number;
338
353
  };
354
+ escToClose: {
355
+ type: BooleanConstructor;
356
+ default: boolean;
357
+ };
358
+ ariaHasPopup: {
359
+ type: import("vue").PropType<boolean | "menu" | "listbox" | "tree" | "grid" | "dialog">;
360
+ default: undefined;
361
+ };
362
+ ariaDescribedbyPopup: {
363
+ type: BooleanConstructor;
364
+ default: boolean;
365
+ };
339
366
  }>> & Readonly<{
340
367
  onHide?: (() => any) | undefined;
341
368
  onResize?: (() => any) | undefined;
@@ -371,6 +398,9 @@ declare const Trigger: {
371
398
  preventFocus: boolean;
372
399
  scrollToClose: boolean;
373
400
  scrollToCloseDistance: number;
401
+ escToClose: boolean;
402
+ ariaHasPopup: boolean | "dialog" | "menu" | "listbox" | "tree" | "grid";
403
+ ariaDescribedbyPopup: boolean;
374
404
  }>;
375
405
  __isFragment?: never;
376
406
  __isTeleport?: never;
@@ -518,6 +548,18 @@ declare const Trigger: {
518
548
  type: NumberConstructor;
519
549
  default: number;
520
550
  };
551
+ escToClose: {
552
+ type: BooleanConstructor;
553
+ default: boolean;
554
+ };
555
+ ariaHasPopup: {
556
+ type: import("vue").PropType<boolean | "menu" | "listbox" | "tree" | "grid" | "dialog">;
557
+ default: undefined;
558
+ };
559
+ ariaDescribedbyPopup: {
560
+ type: BooleanConstructor;
561
+ default: boolean;
562
+ };
521
563
  }>> & Readonly<{
522
564
  onHide?: (() => any) | undefined;
523
565
  onResize?: (() => any) | undefined;
@@ -559,6 +601,9 @@ declare const Trigger: {
559
601
  preventFocus: boolean;
560
602
  scrollToClose: boolean;
561
603
  scrollToCloseDistance: number;
604
+ escToClose: boolean;
605
+ ariaHasPopup: boolean | "dialog" | "menu" | "listbox" | "tree" | "grid";
606
+ ariaDescribedbyPopup: boolean;
562
607
  }, {}, string, {}, import("vue").GlobalComponents, import("vue").GlobalDirectives, string, import("vue").ComponentProvideOptions> & import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps & {
563
608
  install: (app: App, options?: SDOptions) => void;
564
609
  };
@@ -144,6 +144,18 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
144
144
  type: NumberConstructor;
145
145
  default: number;
146
146
  };
147
+ escToClose: {
148
+ type: BooleanConstructor;
149
+ default: boolean;
150
+ };
151
+ ariaHasPopup: {
152
+ type: PropType<boolean | "menu" | "listbox" | "tree" | "grid" | "dialog">;
153
+ default: undefined;
154
+ };
155
+ ariaDescribedbyPopup: {
156
+ type: BooleanConstructor;
157
+ default: boolean;
158
+ };
147
159
  }>, () => import("vue/jsx-runtime").JSX.Element, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
148
160
  'update:popupVisible': (_visible: boolean) => true;
149
161
  popupVisibleChange: (_visible: boolean) => true;
@@ -293,6 +305,18 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
293
305
  type: NumberConstructor;
294
306
  default: number;
295
307
  };
308
+ escToClose: {
309
+ type: BooleanConstructor;
310
+ default: boolean;
311
+ };
312
+ ariaHasPopup: {
313
+ type: PropType<boolean | "menu" | "listbox" | "tree" | "grid" | "dialog">;
314
+ default: undefined;
315
+ };
316
+ ariaDescribedbyPopup: {
317
+ type: BooleanConstructor;
318
+ default: boolean;
319
+ };
296
320
  }>> & Readonly<{
297
321
  onHide?: (() => any) | undefined;
298
322
  onResize?: (() => any) | undefined;
@@ -328,5 +352,8 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
328
352
  preventFocus: boolean;
329
353
  scrollToClose: boolean;
330
354
  scrollToCloseDistance: number;
355
+ escToClose: boolean;
356
+ ariaHasPopup: boolean | "dialog" | "menu" | "listbox" | "tree" | "grid";
357
+ ariaDescribedbyPopup: boolean;
331
358
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
332
359
  export default _default;
@@ -4,6 +4,7 @@ import { getPrefixCls } from "../_utils/global-config.js";
4
4
  import { isEmptyChildren, mergeFirstChild } from "../_utils/vue-utils.js";
5
5
  import { off, on } from "../_utils/dom.js";
6
6
  import { throttleByRaf } from "../_utils/throttle-by-raf.js";
7
+ import { KEYBOARD_KEY } from "../_utils/keyboard.js";
7
8
  import { omit } from "../_utils/omit.js";
8
9
  import client_only_default from "../_components/client-only.js";
9
10
  import { useFirstElement } from "../_hooks/use-first-element.js";
@@ -14,7 +15,7 @@ import { useResizeObserver as useResizeObserver$1 } from "../_hooks/use-resize-o
14
15
  import { useTeleportContainer } from "../_hooks/use-teleport-container.js";
15
16
  import { triggerInjectionKey } from "./context.js";
16
17
  import { getArrowStyle, getElementScrollRect, getPopupStyle, getScrollElements, getTransformOrigin } from "./utils.js";
17
- import { Fragment, Teleport, Transition, computed, createVNode, defineComponent, inject, mergeProps, nextTick, onBeforeUnmount, onDeactivated, onMounted, onUpdated, provide, reactive, ref, vShow, watch, withDirectives } from "vue";
18
+ import { Fragment, Teleport, Transition, computed, createVNode, defineComponent, getCurrentInstance, inject, mergeProps, nextTick, onBeforeUnmount, onDeactivated, onMounted, onUpdated, provide, reactive, ref, vShow, watch, withDirectives } from "vue";
18
19
  import { onClickOutside, useEventListener } from "@vueuse/core";
19
20
  //#region components/trigger/trigger.tsx
20
21
  var TRIGGER_EVENTS = [
@@ -301,6 +302,31 @@ var trigger_default = /* @__PURE__ */ defineComponent({
301
302
  scrollToCloseDistance: {
302
303
  type: Number,
303
304
  default: 0
305
+ },
306
+ /**
307
+ * @zh 是否支持 ESC 键关闭弹出层
308
+ * @en Whether to close the popup with the ESC key
309
+ */
310
+ escToClose: {
311
+ type: Boolean,
312
+ default: false
313
+ },
314
+ /**
315
+ * @zh 弹出层类型,用于触发器的 `aria-haspopup`。设置后会自动给触发器加 `aria-haspopup` / `aria-expanded` / `aria-controls`,并给弹出层加 id。
316
+ * @en Popup type for the trigger's `aria-haspopup`. When set, the trigger automatically gets `aria-haspopup` / `aria-expanded` / `aria-controls`, and the popup gets an id.
317
+ * @values true, 'menu', 'listbox', 'tree', 'grid', 'dialog'
318
+ */
319
+ ariaHasPopup: {
320
+ type: [Boolean, String],
321
+ default: void 0
322
+ },
323
+ /**
324
+ * @zh 是否给触发器加 `aria-describedby` 指向弹出层(tooltip 模式用)。弹出层显示时才挂。
325
+ * @en Whether to add `aria-describedby` on the trigger pointing to the popup (tooltip pattern). Only applied while the popup is visible.
326
+ */
327
+ ariaDescribedbyPopup: {
328
+ type: Boolean,
329
+ default: false
304
330
  }
305
331
  },
306
332
  emits: {
@@ -333,6 +359,7 @@ var trigger_default = /* @__PURE__ */ defineComponent({
333
359
  setup(props, { emit, slots, attrs }) {
334
360
  const triggerEventAttrs = attrs;
335
361
  const prefixCls = getPrefixCls("trigger");
362
+ const popupId = `${prefixCls}-popup-${getCurrentInstance().uid}`;
336
363
  const popupAttrs = computed(() => omit(attrs, TRIGGER_EVENTS));
337
364
  const configCtx = inject(configProviderInjectionKey, void 0);
338
365
  const themePopupContainer = inject(themePopupContainerInjectionKey, void 0);
@@ -361,6 +388,16 @@ var trigger_default = /* @__PURE__ */ defineComponent({
361
388
  var _props$popupVisible;
362
389
  return (_props$popupVisible = props.popupVisible) !== null && _props$popupVisible !== void 0 ? _props$popupVisible : popupVisible.value;
363
390
  });
391
+ const firstChildAria = computed(() => {
392
+ const aria = {};
393
+ if (props.ariaHasPopup !== void 0) {
394
+ aria["aria-haspopup"] = props.ariaHasPopup === true ? "true" : props.ariaHasPopup;
395
+ aria["aria-expanded"] = computedVisible.value;
396
+ aria["aria-controls"] = computedVisible.value ? popupId : void 0;
397
+ }
398
+ if (props.ariaDescribedbyPopup) aria["aria-describedby"] = computedVisible.value ? popupId : void 0;
399
+ return aria;
400
+ });
364
401
  const { teleportContainer, containerRef } = useTeleportContainer({
365
402
  popupContainer: mergedPopupContainer,
366
403
  visible: computedVisible,
@@ -551,7 +588,12 @@ var trigger_default = /* @__PURE__ */ defineComponent({
551
588
  if (getChildElements().some((element) => element.contains(target))) return;
552
589
  changeVisible(false);
553
590
  };
554
- useEventListener(computed(() => typeof document === "undefined" ? void 0 : document), "contextmenu", handleOutsideContextmenu, { capture: true });
591
+ const documentRef = computed(() => typeof document === "undefined" ? void 0 : document);
592
+ useEventListener(documentRef, "contextmenu", handleOutsideContextmenu, { capture: true });
593
+ const handleKeydown = (ev) => {
594
+ if (props.escToClose && computedVisible.value && ev.key === KEYBOARD_KEY.ESC) changeVisible(false);
595
+ };
596
+ useEventListener(documentRef, "keydown", handleKeydown);
555
597
  const isExceedThreshold = (oldPosition, element) => {
556
598
  const [scrollTop, scrollLeft] = oldPosition;
557
599
  const { scrollTop: newScrollTop, scrollLeft: newScrollLeft } = element;
@@ -663,19 +705,19 @@ var trigger_default = /* @__PURE__ */ defineComponent({
663
705
  return () => {
664
706
  var _slots$default, _slots$default2;
665
707
  children.value = (_slots$default = (_slots$default2 = slots.default) === null || _slots$default2 === void 0 ? void 0 : _slots$default2.call(slots)) !== null && _slots$default !== void 0 ? _slots$default : [];
666
- mergeFirstChild(children.value, {
667
- class: triggerCls.value,
708
+ mergeFirstChild(children.value, _objectSpread2(_objectSpread2({ class: triggerCls.value }, firstChildAria.value), {}, {
668
709
  onClick: handleClick,
669
710
  onMouseenter: handleMouseEnter,
670
711
  onMouseleave: handleMouseLeave,
671
712
  onFocusin: handleFocusin,
672
713
  onFocusout: handleFocusout,
673
714
  onContextmenu: handleContextmenuWithContext
674
- });
715
+ }));
675
716
  return createVNode(Fragment, null, [props.autoFixPosition ? createVNode(resize_observer_v2_default, { "onResize": onTargetResize }, { default: () => [children.value] }) : children.value, createVNode(client_only_default, null, { default: () => [createVNode(Teleport, {
676
717
  "to": teleportContainer.value,
677
718
  "disabled": !props.renderToBody
678
719
  }, { default: () => [(!props.unmountOnClose || computedVisible.value || mounted.value) && !hidePopup.value && createVNode(resize_observer_v2_default, { "onResize": handleResize }, { default: () => [createVNode("div", mergeProps({
720
+ "id": popupId,
679
721
  "ref": popupRef,
680
722
  "class": [`${prefixCls}-popup`, `${prefixCls}-position-${popupPosition.value}`],
681
723
  "style": _objectSpread2(_objectSpread2({}, popupStyle.value), {}, {