@xleddyl/443-components-vue 0.4.0 → 0.6.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 (323) hide show
  1. package/README.md +25 -6
  2. package/dist/chart/BarChart.vue +11 -4
  3. package/dist/chart/BarChart.vue.d.ts +2 -0
  4. package/dist/chart/ChartLegend.vue +43 -4
  5. package/dist/chart/ChartLegend.vue.d.ts +4 -2
  6. package/dist/chart/ChartPanel.vue +10 -10
  7. package/dist/chart/ChartPanel.vue.d.ts +11 -8
  8. package/dist/chart/ChartSummary.vue +8 -3
  9. package/dist/chart/ChartSummary.vue.d.ts +3 -1
  10. package/dist/chart/DoughnutChart.vue +11 -4
  11. package/dist/chart/LineChart.vue +8 -2
  12. package/dist/chart/LineChart.vue.d.ts +2 -0
  13. package/dist/chart/chart.css +19 -0
  14. package/dist/chart/patterns.d.ts +6 -0
  15. package/dist/chart/patterns.mjs +79 -0
  16. package/dist/chart/types.d.ts +5 -0
  17. package/dist/chart/useChartColors.mjs +1 -1
  18. package/dist/components/core/Button.vue +11 -1
  19. package/dist/components/core/Button.vue.d.ts +1 -1
  20. package/dist/components/core/FieldMessage.vue +6 -0
  21. package/dist/components/core/FieldMessage.vue.d.ts +1 -1
  22. package/dist/components/core/Form.vue +18 -1
  23. package/dist/components/core/FormAlerts.vue +41 -3
  24. package/dist/components/core/FormField.vue +43 -24
  25. package/dist/components/core/Input.vue.d.ts +6 -6
  26. package/dist/components/core/Root.vue +6 -1
  27. package/dist/components/core/Root.vue.d.ts +2 -2
  28. package/dist/components/core/Spinner.vue +6 -11
  29. package/dist/components/core/Spinner.vue.d.ts +2 -2
  30. package/dist/components/core/Textarea.vue.d.ts +2 -2
  31. package/dist/components/core/VisuallyHidden.vue.d.ts +2 -2
  32. package/dist/components/data/Avatar.vue +8 -5
  33. package/dist/components/data/AvatarGroup.vue +6 -3
  34. package/dist/components/data/Badge.vue.d.ts +1 -1
  35. package/dist/components/data/FilterPills.vue +18 -2
  36. package/dist/components/data/Pagination.vue +24 -18
  37. package/dist/components/data/Pagination.vue.d.ts +2 -2
  38. package/dist/components/data/SelectionBar.vue +32 -3
  39. package/dist/components/data/Stat.vue +7 -1
  40. package/dist/components/data/Stat.vue.d.ts +2 -2
  41. package/dist/components/data/Table.vue +62 -14
  42. package/dist/components/data/Tag.vue +24 -4
  43. package/dist/components/data/Tag.vue.d.ts +3 -3
  44. package/dist/components/data/Timeline.vue +12 -1
  45. package/dist/components/data/Tree.vue +137 -36
  46. package/dist/components/data/Tree.vue.d.ts +13 -14
  47. package/dist/components/data/types.d.ts +2 -1
  48. package/dist/components/feedback/Alert.vue +18 -9
  49. package/dist/components/feedback/Alert.vue.d.ts +2 -2
  50. package/dist/components/feedback/LoadingOverlay.vue +35 -3
  51. package/dist/components/feedback/Meter.vue +28 -3
  52. package/dist/components/feedback/Progress.vue +2 -7
  53. package/dist/components/feedback/Progress.vue.d.ts +1 -1
  54. package/dist/components/feedback/ProgressRing.vue +2 -6
  55. package/dist/components/feedback/ProgressRing.vue.d.ts +1 -1
  56. package/dist/components/forms/Calendar.vue +49 -26
  57. package/dist/components/forms/Calendar.vue.d.ts +9 -5
  58. package/dist/components/forms/CheckboxGroup.vue +14 -4
  59. package/dist/components/forms/CheckboxGroup.vue.d.ts +1 -0
  60. package/dist/components/forms/ColorInput.vue +68 -15
  61. package/dist/components/forms/ColorInput.vue.d.ts +16 -13
  62. package/dist/components/forms/Combobox.vue +18 -4
  63. package/dist/components/forms/DateInput.vue.d.ts +6 -6
  64. package/dist/components/forms/DatePicker.vue +23 -7
  65. package/dist/components/forms/DatePicker.vue.d.ts +4 -2
  66. package/dist/components/forms/FileInput.vue +31 -13
  67. package/dist/components/forms/FileInput.vue.d.ts +2 -2
  68. package/dist/components/forms/InputAddon.vue +18 -2
  69. package/dist/components/forms/InputGroup.vue +27 -0
  70. package/dist/components/forms/InputGroup.vue.d.ts +2 -0
  71. package/dist/components/forms/NumberInput.vue +6 -7
  72. package/dist/components/forms/NumberInput.vue.d.ts +6 -6
  73. package/dist/components/forms/PasswordInput.vue +12 -6
  74. package/dist/components/forms/PasswordInput.vue.d.ts +6 -7
  75. package/dist/components/forms/PinInput.vue +11 -1
  76. package/dist/components/forms/PinInput.vue.d.ts +8 -6
  77. package/dist/components/forms/RadioGroup.vue +15 -5
  78. package/dist/components/forms/RadioGroup.vue.d.ts +1 -0
  79. package/dist/components/forms/SegmentedControl.vue +15 -10
  80. package/dist/components/forms/SegmentedControl.vue.d.ts +1 -0
  81. package/dist/components/forms/Slider.vue +9 -0
  82. package/dist/components/forms/Slider.vue.d.ts +8 -6
  83. package/dist/components/forms/Switch.vue +7 -0
  84. package/dist/components/forms/Switch.vue.d.ts +2 -2
  85. package/dist/components/forms/TimeInput.vue.d.ts +6 -6
  86. package/dist/components/forms/types.d.ts +4 -0
  87. package/dist/components/layout/Accordion.vue.d.ts +2 -2
  88. package/dist/components/layout/AppShell.vue +40 -18
  89. package/dist/components/layout/AppShell.vue.d.ts +11 -9
  90. package/dist/components/layout/Card.vue +50 -16
  91. package/dist/components/layout/Card.vue.d.ts +13 -11
  92. package/dist/components/layout/CopyButton.vue +13 -5
  93. package/dist/components/layout/CopyButton.vue.d.ts +3 -3
  94. package/dist/components/layout/NavLink.vue +10 -1
  95. package/dist/components/layout/NavLink.vue.d.ts +2 -2
  96. package/dist/components/layout/PageHeader.vue +2 -2
  97. package/dist/components/layout/Separator.vue +6 -3
  98. package/dist/components/layout/Sidebar.vue +14 -7
  99. package/dist/components/layout/Sidebar.vue.d.ts +0 -2
  100. package/dist/components/layout/SidebarNav.vue +16 -44
  101. package/dist/components/layout/Stack.vue.d.ts +2 -2
  102. package/dist/components/layout/Tabs.vue +10 -18
  103. package/dist/components/layout/Tabs.vue.d.ts +2 -2
  104. package/dist/components/layout/Toolbar.vue +10 -4
  105. package/dist/components/layout/Toolbar.vue.d.ts +1 -0
  106. package/dist/components/layout/types.d.ts +1 -0
  107. package/dist/components/overlays/CommandPalette.vue +8 -4
  108. package/dist/components/overlays/CommandPalette.vue.d.ts +3 -8
  109. package/dist/components/overlays/ConfirmDialog.vue +7 -5
  110. package/dist/components/overlays/ConfirmDialog.vue.d.ts +12 -8
  111. package/dist/components/overlays/ConfirmHost.vue +22 -19
  112. package/dist/components/overlays/ConfirmHost.vue.d.ts +8 -6
  113. package/dist/components/overlays/ContextMenu.vue +9 -11
  114. package/dist/components/overlays/ContextMenu.vue.d.ts +2 -2
  115. package/dist/components/overlays/Drawer.vue +2 -0
  116. package/dist/components/overlays/Drawer.vue.d.ts +4 -2
  117. package/dist/components/overlays/DropdownMenu.vue +13 -21
  118. package/dist/components/overlays/DropdownMenu.vue.d.ts +2 -2
  119. package/dist/components/overlays/HoverCard.vue +8 -2
  120. package/dist/components/overlays/HoverCard.vue.d.ts +2 -2
  121. package/dist/components/overlays/Modal.vue +2 -0
  122. package/dist/components/overlays/Modal.vue.d.ts +4 -2
  123. package/dist/components/overlays/Popover.vue +19 -4
  124. package/dist/components/overlays/Popover.vue.d.ts +2 -2
  125. package/dist/components/overlays/Toaster.vue +71 -8
  126. package/dist/components/overlays/Toaster.vue.d.ts +3 -0
  127. package/dist/components/overlays/Tooltip.vue +39 -14
  128. package/dist/components/overlays/types.d.ts +7 -0
  129. package/dist/components/templates/AccountMenu.vue.d.ts +2 -2
  130. package/dist/components/templates/AppearanceSettings.vue +83 -77
  131. package/dist/components/templates/AppearanceSettings.vue.d.ts +2 -2
  132. package/dist/components/templates/AuthLayout.vue +2 -2
  133. package/dist/components/templates/Brand.vue.d.ts +2 -2
  134. package/dist/components/templates/DashboardLayout.vue +3 -7
  135. package/dist/components/templates/DashboardLayout.vue.d.ts +8 -18
  136. package/dist/components/templates/DetailPage.vue +3 -1
  137. package/dist/components/templates/DetailPage.vue.d.ts +2 -2
  138. package/dist/components/templates/ErrorPage.vue +11 -5
  139. package/dist/components/templates/ErrorPage.vue.d.ts +10 -6
  140. package/dist/components/templates/FormPage.vue +16 -3
  141. package/dist/components/templates/ListPage.vue +19 -6
  142. package/dist/components/templates/ListPage.vue.d.ts +1 -0
  143. package/dist/components/templates/NotFoundPage.vue +2 -0
  144. package/dist/components/templates/NotFoundPage.vue.d.ts +4 -0
  145. package/dist/components/templates/SaveBar.vue +18 -3
  146. package/dist/components/templates/SaveBar.vue.d.ts +5 -5
  147. package/dist/components/templates/SettingsGroup.vue +1 -1
  148. package/dist/components/templates/SettingsGroup.vue.d.ts +3 -1
  149. package/dist/components/templates/SettingsModal.vue +73 -46
  150. package/dist/components/templates/SettingsModal.vue.d.ts +9 -11
  151. package/dist/components/templates/SettingsPage.vue.d.ts +2 -2
  152. package/dist/components/templates/SettingsSection.vue.d.ts +4 -2
  153. package/dist/components/templates/types.d.ts +4 -0
  154. package/dist/composables/useAlert.mjs +5 -10
  155. package/dist/composables/useConfirm.mjs +5 -5
  156. package/dist/composables/useField.d.ts +4 -0
  157. package/dist/composables/useField.mjs +16 -5
  158. package/dist/composables/useFileDrop.mjs +2 -1
  159. package/dist/composables/useOverlay.mjs +2 -1
  160. package/dist/composables/usePreset.mjs +4 -10
  161. package/dist/composables/usePrompt.mjs +6 -13
  162. package/dist/composables/useScrollLock.mjs +4 -3
  163. package/dist/composables/useTheme.mjs +3 -11
  164. package/dist/composables/useToast.mjs +2 -1
  165. package/dist/editor/RichTextEditor.vue +31 -6
  166. package/dist/editor/RichTextEditor.vue.d.ts +2 -2
  167. package/dist/editor/rich-text-editor.css +9 -4
  168. package/dist/grid/DataGrid.vue +72 -12
  169. package/dist/grid/GridToolbar.vue +1 -1
  170. package/dist/grid/GridToolbar.vue.d.ts +2 -2
  171. package/dist/grid/cells/BadgeCell.vue +3 -1
  172. package/dist/grid/cells/BadgeCell.vue.d.ts +17 -3
  173. package/dist/grid/cells/DateCell.vue +3 -1
  174. package/dist/grid/cells/DateCell.vue.d.ts +17 -3
  175. package/dist/grid/cells/EmptyCell.vue +15 -0
  176. package/dist/grid/cells/EmptyCell.vue.d.ts +392 -0
  177. package/dist/grid/cells/LinkCell.vue +9 -2
  178. package/dist/grid/cells/LinkCell.vue.d.ts +17 -3
  179. package/dist/grid/data-grid.css +5 -5
  180. package/dist/grid/types.d.ts +2 -0
  181. package/dist/internal/core/ButtonContent.vue +3 -0
  182. package/dist/internal/core/LiveRegion.vue +26 -0
  183. package/dist/internal/core/LiveRegion.vue.d.ts +393 -0
  184. package/dist/internal/core/copy.d.ts +6 -0
  185. package/dist/internal/core/copy.mjs +14 -0
  186. package/dist/internal/core/focus.d.ts +6 -0
  187. package/dist/internal/core/focus.mjs +46 -0
  188. package/dist/internal/core/intl.d.ts +4 -2
  189. package/dist/internal/core/intl.mjs +23 -22
  190. package/dist/internal/core/live.d.ts +6 -0
  191. package/dist/internal/core/live.mjs +22 -0
  192. package/dist/internal/core/preset.d.ts +0 -1
  193. package/dist/internal/core/preset.mjs +4 -14
  194. package/dist/internal/core/resize.d.ts +1 -0
  195. package/dist/internal/core/resize.mjs +11 -0
  196. package/dist/internal/core/roving.d.ts +7 -0
  197. package/dist/internal/core/roving.mjs +19 -1
  198. package/dist/internal/core/scroll-edges.d.ts +5 -0
  199. package/dist/internal/core/scroll-edges.mjs +63 -0
  200. package/dist/internal/core/storage.d.ts +2 -0
  201. package/dist/internal/core/storage.mjs +8 -0
  202. package/dist/internal/core/theme.d.ts +0 -1
  203. package/dist/internal/core/theme.mjs +4 -13
  204. package/dist/internal/core/tone.d.ts +1 -0
  205. package/dist/internal/core/tone.mjs +4 -0
  206. package/dist/internal/core/transition.d.ts +1 -0
  207. package/dist/internal/core/transition.mjs +20 -0
  208. package/dist/internal/data/rows.mjs +6 -5
  209. package/dist/internal/data/tree.d.ts +2 -3
  210. package/dist/internal/feedback/LoadingHost.vue +16 -6
  211. package/dist/internal/feedback/loading.mjs +2 -1
  212. package/dist/internal/feedback/progress.d.ts +12 -0
  213. package/dist/internal/feedback/progress.mjs +13 -0
  214. package/dist/internal/floating/layer.d.ts +1 -1
  215. package/dist/internal/floating/layer.mjs +17 -10
  216. package/dist/internal/forms/keys.d.ts +4 -0
  217. package/dist/internal/forms/keys.mjs +1 -0
  218. package/dist/internal/forms/name.d.ts +2 -0
  219. package/dist/internal/forms/name.mjs +12 -0
  220. package/dist/internal/forms/standard-schema.d.ts +0 -2
  221. package/dist/internal/forms/standard-schema.mjs +0 -18
  222. package/dist/internal/layout/NavGroup.vue +104 -0
  223. package/dist/internal/layout/NavGroup.vue.d.ts +412 -0
  224. package/dist/internal/layout/route.mjs +1 -1
  225. package/dist/internal/overlays/DialogFrame.vue +53 -6
  226. package/dist/internal/overlays/DialogFrame.vue.d.ts +5 -2
  227. package/dist/internal/overlays/MenuList.vue +4 -11
  228. package/dist/internal/overlays/MenuList.vue.d.ts +6 -6
  229. package/dist/internal/overlays/OverlayView.vue +2 -0
  230. package/dist/internal/overlays/OverlayView.vue.d.ts +8 -6
  231. package/dist/internal/overlays/confirm.d.ts +6 -1
  232. package/dist/internal/overlays/confirm.mjs +5 -2
  233. package/dist/internal/overlays/dialog.d.ts +1 -0
  234. package/dist/internal/overlays/dialog.mjs +9 -9
  235. package/dist/internal/overlays/hover.d.ts +1 -0
  236. package/dist/internal/overlays/hover.mjs +20 -3
  237. package/dist/internal/overlays/menu.d.ts +9 -0
  238. package/dist/internal/overlays/menu.mjs +15 -0
  239. package/dist/internal/overlays/stack.d.ts +1 -0
  240. package/dist/locale/en.mjs +72 -19
  241. package/dist/locale/index.d.ts +1 -1
  242. package/dist/locale/index.mjs +5 -11
  243. package/dist/locale/it.mjs +72 -19
  244. package/dist/locale/types.d.ts +55 -2
  245. package/dist/nuxt/module.mjs +1 -1
  246. package/dist/nuxt/runtime/RouteAnnouncer.vue +21 -0
  247. package/dist/nuxt/runtime/RouteAnnouncer.vue.d.ts +3 -0
  248. package/dist/nuxt/runtime/layout-head.d.ts +2 -0
  249. package/dist/nuxt/runtime/layout-head.mjs +13 -0
  250. package/dist/nuxt/runtime/layouts/auth.vue +4 -0
  251. package/dist/nuxt/runtime/layouts/auth.vue.d.ts +2 -2
  252. package/dist/nuxt/runtime/layouts/dashboard.vue +4 -0
  253. package/dist/nuxt/runtime/layouts/dashboard.vue.d.ts +2 -2
  254. package/dist/nuxt/runtime/locale.mjs +8 -1
  255. package/dist/nuxt/runtime/theme.mjs +17 -12
  256. package/dist/styles/base.css +0 -13
  257. package/dist/styles/core/button.css +8 -8
  258. package/dist/styles/core/field-message.css +2 -2
  259. package/dist/styles/core/form-field.css +13 -4
  260. package/dist/styles/core/input.css +4 -7
  261. package/dist/styles/core/kbd.css +0 -1
  262. package/dist/styles/data/badge.css +8 -4
  263. package/dist/styles/data/description-list.css +7 -5
  264. package/dist/styles/data/filter-pills.css +5 -8
  265. package/dist/styles/data/pagination.css +2 -2
  266. package/dist/styles/data/stat.css +3 -3
  267. package/dist/styles/data/table.css +3 -2
  268. package/dist/styles/data/tag.css +1 -2
  269. package/dist/styles/data/timeline.css +2 -1
  270. package/dist/styles/data/tree.css +31 -10
  271. package/dist/styles/feedback/alert.css +1 -3
  272. package/dist/styles/feedback/empty-state.css +6 -4
  273. package/dist/styles/feedback/loading-host.css +4 -0
  274. package/dist/styles/feedback/loading-overlay.css +4 -0
  275. package/dist/styles/forced-colors.css +215 -0
  276. package/dist/styles/forms/calendar.css +2 -2
  277. package/dist/styles/forms/choice.css +2 -2
  278. package/dist/styles/forms/color-input.css +1 -1
  279. package/dist/styles/forms/combobox.css +2 -24
  280. package/dist/styles/forms/date-input.css +2 -2
  281. package/dist/styles/forms/date-picker.css +3 -7
  282. package/dist/styles/forms/file-input.css +4 -3
  283. package/dist/styles/forms/input-group.css +6 -0
  284. package/dist/styles/forms/number-input.css +2 -2
  285. package/dist/styles/forms/password-input.css +5 -2
  286. package/dist/styles/forms/pin-input.css +4 -2
  287. package/dist/styles/forms/segmented.css +2 -2
  288. package/dist/styles/forms/select.css +6 -6
  289. package/dist/styles/forms/slider.css +5 -4
  290. package/dist/styles/forms/switch.css +5 -1
  291. package/dist/styles/index.css +1 -0
  292. package/dist/styles/layout/accordion.css +1 -1
  293. package/dist/styles/layout/app-shell.css +15 -3
  294. package/dist/styles/layout/card.css +12 -2
  295. package/dist/styles/layout/copy-button.css +1 -1
  296. package/dist/styles/layout/nav-link.css +1 -33
  297. package/dist/styles/layout/page-header.css +2 -1
  298. package/dist/styles/layout/separator.css +1 -1
  299. package/dist/styles/layout/sidebar-nav.css +15 -4
  300. package/dist/styles/layout/sidebar.css +20 -6
  301. package/dist/styles/layout/tabs.css +9 -4
  302. package/dist/styles/layout/theme-switch.css +0 -6
  303. package/dist/styles/overlays/command.css +9 -15
  304. package/dist/styles/overlays/confirm.css +1 -1
  305. package/dist/styles/overlays/drawer.css +23 -3
  306. package/dist/styles/overlays/menu.css +2 -17
  307. package/dist/styles/overlays/modal.css +33 -9
  308. package/dist/styles/overlays/toast.css +1 -2
  309. package/dist/styles/presets.css +4 -4
  310. package/dist/styles/shared.css +96 -3
  311. package/dist/styles/templates/account-menu.css +3 -3
  312. package/dist/styles/templates/auth-layout.css +5 -1
  313. package/dist/styles/templates/brand.css +3 -3
  314. package/dist/styles/templates/empty-page.css +5 -1
  315. package/dist/styles/templates/error-page.css +4 -0
  316. package/dist/styles/templates/form-page.css +10 -0
  317. package/dist/styles/templates/save-bar.css +10 -0
  318. package/dist/styles/templates/settings-modal.css +46 -45
  319. package/dist/styles/templates/settings-page.css +3 -3
  320. package/dist/styles/tokens.css +12 -2
  321. package/package.json +1 -1
  322. package/dist/internal/overlays/focus.d.ts +0 -1
  323. package/dist/internal/overlays/focus.mjs +0 -24
@@ -17,6 +17,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
17
17
  style?: import("vue").StyleValue;
18
18
  results?: (string | number) | undefined;
19
19
  placeholder?: string | undefined;
20
+ dir?: string | undefined;
20
21
  class?: import("vue").ClassValue;
21
22
  role?: string | undefined;
22
23
  'aria-label'?: string | undefined;
@@ -172,7 +173,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
172
173
  accesskey?: string | undefined;
173
174
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
174
175
  contextmenu?: string | undefined;
175
- dir?: string | undefined;
176
176
  draggable?: (boolean | "true" | "false") | undefined;
177
177
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
178
178
  enterKeyHint?: import("vue").HTMLAttributes["enterkeyhint"];
@@ -232,6 +232,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
232
232
  style?: import("vue").StyleValue;
233
233
  results?: (string | number) | undefined;
234
234
  placeholder?: string | undefined;
235
+ dir?: string | undefined;
235
236
  class?: import("vue").ClassValue;
236
237
  role?: string | undefined;
237
238
  'aria-label'?: string | undefined;
@@ -387,7 +388,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
387
388
  accesskey?: string | undefined;
388
389
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
389
390
  contextmenu?: string | undefined;
390
- dir?: string | undefined;
391
391
  draggable?: (boolean | "true" | "false") | undefined;
392
392
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
393
393
  enterKeyHint?: import("vue").HTMLAttributes["enterkeyhint"];
@@ -6,6 +6,7 @@
6
6
  :root-class="[`k-drawer-${side}`, `k-drawer-${size}`]"
7
7
  :title="title"
8
8
  :description="description"
9
+ :label="label"
9
10
  :dismissible="dismissible"
10
11
  :hide-close="hideClose"
11
12
  :close-label="closeLabel"
@@ -28,6 +29,7 @@ import DialogFrame from "../../internal/overlays/DialogFrame.vue";
28
29
  defineProps({
29
30
  title: { type: String, required: false },
30
31
  description: { type: String, required: false },
32
+ label: { type: String, required: false },
31
33
  side: { type: String, required: false, default: "right" },
32
34
  size: { type: String, required: false, default: "md" },
33
35
  dismissible: { type: Boolean, required: false, default: true },
@@ -4,6 +4,7 @@ type __VLS_Slots = DialogFrameSlots;
4
4
  declare const __VLS_base: import("vue").DefineComponent<{
5
5
  title?: string | undefined;
6
6
  description?: string;
7
+ label?: string;
7
8
  side?: DrawerSide;
8
9
  size?: DrawerSize;
9
10
  dismissible?: boolean | undefined;
@@ -18,6 +19,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
18
19
  style?: import("vue").StyleValue;
19
20
  results?: (string | number) | undefined;
20
21
  placeholder?: string | undefined;
22
+ dir?: string | undefined;
21
23
  class?: import("vue").ClassValue;
22
24
  role?: string | undefined;
23
25
  'aria-label'?: string | undefined;
@@ -173,7 +175,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
173
175
  accesskey?: string | undefined;
174
176
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
175
177
  contextmenu?: string | undefined;
176
- dir?: string | undefined;
177
178
  draggable?: (boolean | "true" | "false") | undefined;
178
179
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
179
180
  enterKeyHint?: import("vue").HTMLAttributes["enterkeyhint"];
@@ -224,6 +225,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
224
225
  }, string, import("vue").PublicProps, Readonly<{
225
226
  title?: string | undefined;
226
227
  description?: string;
228
+ label?: string;
227
229
  side?: DrawerSide;
228
230
  size?: DrawerSize;
229
231
  dismissible?: boolean | undefined;
@@ -238,6 +240,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
238
240
  style?: import("vue").StyleValue;
239
241
  results?: (string | number) | undefined;
240
242
  placeholder?: string | undefined;
243
+ dir?: string | undefined;
241
244
  class?: import("vue").ClassValue;
242
245
  role?: string | undefined;
243
246
  'aria-label'?: string | undefined;
@@ -393,7 +396,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
393
396
  accesskey?: string | undefined;
394
397
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
395
398
  contextmenu?: string | undefined;
396
- dir?: string | undefined;
397
399
  draggable?: (boolean | "true" | "false") | undefined;
398
400
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
399
401
  enterKeyHint?: import("vue").HTMLAttributes["enterkeyhint"];
@@ -11,14 +11,16 @@
11
11
  :offset="offset"
12
12
  :label="label"
13
13
  :labelledby="label ? void 0 : triggerId"
14
- @open-change="onOpenChange"
14
+ @open-change="isOpen = $event"
15
15
  @select="(item, event) => emit('select', item, event)"
16
16
  />
17
17
  </template>
18
18
 
19
19
  <script setup>
20
20
  import { computed, onBeforeUnmount, ref, useId, useTemplateRef, watch } from "vue";
21
+ import { syncOpenModel } from "../../internal/floating/layer";
21
22
  import MenuList from "../../internal/overlays/MenuList.vue";
23
+ import { menuTriggerHandlers } from "../../internal/overlays/menu";
22
24
  import { setAttributes, useInvoker, useSlotTrigger } from "../../internal/floating/trigger";
23
25
  defineOptions({ inheritAttrs: false });
24
26
  const props = defineProps({
@@ -39,26 +41,16 @@ const triggerId = computed(() => trigger.value?.id || `${generatedId}-trigger`);
39
41
  useInvoker(trigger, menuElement, () => {
40
42
  menuRef.value?.toggle("first", trigger.value);
41
43
  });
42
- function onOpenChange(value) {
43
- isOpen.value = value;
44
- if (open.value !== value) open.value = value;
45
- }
46
- watch(open, (value) => {
47
- if (value === isOpen.value) return;
48
- if (value) menuRef.value?.show("first", trigger.value);
49
- else menuRef.value?.hide();
50
- });
51
- function onTriggerKeydown(event) {
52
- if (event.key === "ArrowDown" || event.key === "ArrowUp") {
53
- event.preventDefault();
54
- menuRef.value?.show(event.key === "ArrowDown" ? "first" : "last", trigger.value);
55
- return;
56
- }
57
- if (event.key === "Enter" || event.key === " ") menuRef.value?.setPendingFocus("first");
58
- }
59
- function onTriggerPointerDown(event) {
60
- menuRef.value?.setPendingFocus(event.pointerType === "mouse" ? "menu" : "first");
61
- }
44
+ syncOpenModel(
45
+ open,
46
+ isOpen,
47
+ () => menuRef.value?.show("first", trigger.value),
48
+ () => menuRef.value?.hide()
49
+ );
50
+ const { onKeydown: onTriggerKeydown, onPointerDown: onTriggerPointerDown } = menuTriggerHandlers(
51
+ () => menuRef.value,
52
+ () => trigger.value
53
+ );
62
54
  watch(
63
55
  [trigger, isOpen],
64
56
  ([element, expanded], previous) => {
@@ -18,6 +18,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
18
18
  style?: import("vue").StyleValue;
19
19
  results?: (string | number) | undefined;
20
20
  placeholder?: string | undefined;
21
+ dir?: string | undefined;
21
22
  class?: import("vue").ClassValue;
22
23
  role?: string | undefined;
23
24
  'aria-label'?: string | undefined;
@@ -172,7 +173,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
172
173
  accesskey?: string | undefined;
173
174
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
174
175
  contextmenu?: string | undefined;
175
- dir?: string | undefined;
176
176
  draggable?: (boolean | "true" | "false") | undefined;
177
177
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
178
178
  enterKeyHint?: import("vue").HTMLAttributes["enterkeyhint"];
@@ -232,6 +232,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
232
232
  style?: import("vue").StyleValue;
233
233
  results?: (string | number) | undefined;
234
234
  placeholder?: string | undefined;
235
+ dir?: string | undefined;
235
236
  class?: import("vue").ClassValue;
236
237
  role?: string | undefined;
237
238
  'aria-label'?: string | undefined;
@@ -386,7 +387,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
386
387
  accesskey?: string | undefined;
387
388
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
388
389
  contextmenu?: string | undefined;
389
- dir?: string | undefined;
390
390
  draggable?: (boolean | "true" | "false") | undefined;
391
391
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
392
392
  enterKeyHint?: import("vue").HTMLAttributes["enterkeyhint"];
@@ -51,7 +51,13 @@ useHoverTrigger({
51
51
  hide: layer.hide,
52
52
  openDelay: () => props.openDelay,
53
53
  closeDelay: () => props.closeDelay,
54
- enabled: () => !props.disabled
54
+ enabled: () => !props.disabled,
55
+ touch: true
55
56
  });
56
- syncOpenModel(open, layer, () => trigger.value);
57
+ syncOpenModel(
58
+ open,
59
+ layer.isOpen,
60
+ () => layer.show(trigger.value),
61
+ () => layer.hide()
62
+ );
57
63
  </script>
@@ -21,6 +21,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
21
21
  style?: import("vue").StyleValue;
22
22
  results?: (string | number) | undefined;
23
23
  placeholder?: string | undefined | undefined;
24
+ dir?: string | undefined | undefined;
24
25
  class?: import("vue").ClassValue;
25
26
  role?: string | undefined | undefined;
26
27
  'aria-label'?: string | undefined | undefined;
@@ -176,7 +177,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
176
177
  accesskey?: string | undefined | undefined;
177
178
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
178
179
  contextmenu?: string | undefined | undefined;
179
- dir?: string | undefined | undefined;
180
180
  draggable?: (boolean | "true" | "false") | undefined;
181
181
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
182
182
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
@@ -223,6 +223,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
223
223
  style?: import("vue").StyleValue;
224
224
  results?: (string | number) | undefined;
225
225
  placeholder?: string | undefined | undefined;
226
+ dir?: string | undefined | undefined;
226
227
  class?: import("vue").ClassValue;
227
228
  role?: string | undefined | undefined;
228
229
  'aria-label'?: string | undefined | undefined;
@@ -378,7 +379,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
378
379
  accesskey?: string | undefined | undefined;
379
380
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
380
381
  contextmenu?: string | undefined | undefined;
381
- dir?: string | undefined | undefined;
382
382
  draggable?: (boolean | "true" | "false") | undefined;
383
383
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
384
384
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
@@ -6,6 +6,7 @@
6
6
  :root-class="[`k-modal-${size}`, { 'is-sheet': sheet && size !== 'fullscreen' }]"
7
7
  :title="title"
8
8
  :description="description"
9
+ :label="label"
9
10
  :dismissible="dismissible"
10
11
  :hide-close="hideClose"
11
12
  :close-label="closeLabel"
@@ -28,6 +29,7 @@ import DialogFrame from "../../internal/overlays/DialogFrame.vue";
28
29
  defineProps({
29
30
  title: { type: String, required: false },
30
31
  description: { type: String, required: false },
32
+ label: { type: String, required: false },
31
33
  size: { type: String, required: false, default: "md" },
32
34
  dismissible: { type: Boolean, required: false, default: true },
33
35
  hideClose: { type: Boolean, required: false },
@@ -4,6 +4,7 @@ type __VLS_Slots = DialogFrameSlots;
4
4
  declare const __VLS_base: import("vue").DefineComponent<{
5
5
  title?: string | undefined;
6
6
  description?: string;
7
+ label?: string;
7
8
  size?: ModalSize;
8
9
  dismissible?: boolean | undefined;
9
10
  hideClose?: boolean;
@@ -18,6 +19,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
18
19
  style?: import("vue").StyleValue;
19
20
  results?: (string | number) | undefined;
20
21
  placeholder?: string | undefined;
22
+ dir?: string | undefined;
21
23
  class?: import("vue").ClassValue;
22
24
  role?: string | undefined;
23
25
  'aria-label'?: string | undefined;
@@ -173,7 +175,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
173
175
  accesskey?: string | undefined;
174
176
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
175
177
  contextmenu?: string | undefined;
176
- dir?: string | undefined;
177
178
  draggable?: (boolean | "true" | "false") | undefined;
178
179
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
179
180
  enterKeyHint?: import("vue").HTMLAttributes["enterkeyhint"];
@@ -224,6 +225,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
224
225
  }, string, import("vue").PublicProps, Readonly<{
225
226
  title?: string | undefined;
226
227
  description?: string;
228
+ label?: string;
227
229
  size?: ModalSize;
228
230
  dismissible?: boolean | undefined;
229
231
  hideClose?: boolean;
@@ -238,6 +240,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
238
240
  style?: import("vue").StyleValue;
239
241
  results?: (string | number) | undefined;
240
242
  placeholder?: string | undefined;
243
+ dir?: string | undefined;
241
244
  class?: import("vue").ClassValue;
242
245
  role?: string | undefined;
243
246
  'aria-label'?: string | undefined;
@@ -393,7 +396,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
393
396
  accesskey?: string | undefined;
394
397
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
395
398
  contextmenu?: string | undefined;
396
- dir?: string | undefined;
397
399
  draggable?: (boolean | "true" | "false") | undefined;
398
400
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
399
401
  enterKeyHint?: import("vue").HTMLAttributes["enterkeyhint"];
@@ -12,6 +12,7 @@
12
12
  :class="{ 'has-arrow': arrow }"
13
13
  :role="role"
14
14
  :aria-label="label"
15
+ :aria-labelledby="fallbackLabelledBy"
15
16
  tabindex="-1"
16
17
  >
17
18
  <span v-if="arrow" class="k-floating-arrow" aria-hidden="true" />
@@ -20,11 +21,12 @@
20
21
  </template>
21
22
 
22
23
  <script setup>
23
- import { useId, useTemplateRef, watch } from "vue";
24
+ import { computed, ref, useAttrs, useId, useTemplateRef, watch } from "vue";
24
25
  import FieldBoundary from "../core/FieldBoundary.vue";
25
- import { focusFirst } from "../../internal/overlays/focus";
26
+ import { focusFirst, hasFocusWithin } from "../../internal/core/focus";
26
27
  import { ARROW_OFFSET, syncOpenModel, useFloatingLayer } from "../../internal/floating/layer";
27
28
  import { setAttributes, useInvoker, useSlotTrigger } from "../../internal/floating/trigger";
29
+ import { hasNameAttrs } from "../../internal/forms/name";
28
30
  defineOptions({ inheritAttrs: false });
29
31
  const props = defineProps({
30
32
  placement: { type: null, required: false, default: "bottom-start" },
@@ -40,6 +42,12 @@ const contentId = `${useId()}-popover`;
40
42
  const triggerRef = useTemplateRef("triggerRef");
41
43
  const floatingRef = useTemplateRef("floatingRef");
42
44
  const trigger = useSlotTrigger(triggerRef);
45
+ const attrs = useAttrs();
46
+ const triggerId = ref();
47
+ const fallbackLabelledBy = computed(() => {
48
+ if (props.label || hasNameAttrs(attrs)) return void 0;
49
+ return props.role === "dialog" ? triggerId.value : void 0;
50
+ });
43
51
  const layer = useFloatingLayer({
44
52
  floating: floatingRef,
45
53
  anchor: () => trigger.value,
@@ -50,16 +58,23 @@ const layer = useFloatingLayer({
50
58
  onOpen: () => {
51
59
  const element = floatingRef.value;
52
60
  if (!props.initialFocus || !element) return;
53
- if (element.contains(document.activeElement)) return;
61
+ if (hasFocusWithin(element)) return;
54
62
  if (!focusFirst(element)) element.focus({ preventScroll: true });
55
63
  }
56
64
  });
57
65
  useInvoker(trigger, floatingRef, () => layer.toggle(trigger.value));
58
- syncOpenModel(open, layer, () => trigger.value);
66
+ syncOpenModel(
67
+ open,
68
+ layer.isOpen,
69
+ () => layer.show(trigger.value),
70
+ () => layer.hide()
71
+ );
59
72
  watch(
60
73
  [trigger, layer.isOpen],
61
74
  ([element, isOpen]) => {
62
75
  if (!element) return;
76
+ if (!element.id) element.id = `${contentId}-trigger`;
77
+ triggerId.value = element.id;
63
78
  setAttributes(element, {
64
79
  "aria-haspopup": props.haspopup,
65
80
  "aria-expanded": String(isOpen),
@@ -25,6 +25,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
25
25
  style?: import("vue").StyleValue;
26
26
  results?: (string | number) | undefined;
27
27
  placeholder?: string | undefined | undefined;
28
+ dir?: string | undefined | undefined;
28
29
  class?: import("vue").ClassValue;
29
30
  'aria-label'?: string | undefined | undefined;
30
31
  'aria-hidden'?: (boolean | "true" | "false") | undefined;
@@ -179,7 +180,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
179
180
  accesskey?: string | undefined | undefined;
180
181
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
181
182
  contextmenu?: string | undefined | undefined;
182
- dir?: string | undefined | undefined;
183
183
  draggable?: (boolean | "true" | "false") | undefined;
184
184
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
185
185
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
@@ -231,6 +231,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
231
231
  style?: import("vue").StyleValue;
232
232
  results?: (string | number) | undefined;
233
233
  placeholder?: string | undefined | undefined;
234
+ dir?: string | undefined | undefined;
234
235
  class?: import("vue").ClassValue;
235
236
  'aria-label'?: string | undefined | undefined;
236
237
  'aria-hidden'?: (boolean | "true" | "false") | undefined;
@@ -385,7 +386,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
385
386
  accesskey?: string | undefined | undefined;
386
387
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
387
388
  contextmenu?: string | undefined | undefined;
388
- dir?: string | undefined | undefined;
389
389
  draggable?: (boolean | "true" | "false") | undefined;
390
390
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
391
391
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
@@ -18,8 +18,9 @@
18
18
  tabindex="-1"
19
19
  @pointerenter="onPointerEnter"
20
20
  @pointerleave="onPointerLeave"
21
- @focusin="focusInside = true"
21
+ @focusin="onFocusIn"
22
22
  @focusout="onFocusOut"
23
+ @keydown.esc="onEscape"
23
24
  >
24
25
  <ol class="k-toaster-list">
25
26
  <li
@@ -79,7 +80,7 @@
79
80
  variant="ghost"
80
81
  tone="neutral"
81
82
  :aria-label="dismissText"
82
- @click="dismiss(entry.id)"
83
+ @click="dismissFromToast(entry.id)"
83
84
  />
84
85
  </div>
85
86
  <span
@@ -112,9 +113,11 @@ import { useLocale } from "../../composables/useLocale";
112
113
  import { toast } from "../../composables/useToast";
113
114
  import { toastList } from "../../internal/overlays/toast";
114
115
  import { isPopoverOpen, supportsPopover } from "../../internal/floating/support";
115
- import { toneIcons } from "../../internal/core/tone";
116
+ import { spokenToneKey, toneIcons } from "../../internal/core/tone";
116
117
  import { modalStack } from "../../internal/overlays/dialog";
117
118
  import { useHostClaim } from "../../internal/overlays/host";
119
+ import { LIVE_DELAY } from "../../internal/core/live";
120
+ import { activeElement } from "../../internal/core/focus";
118
121
  import Button from "../core/Button.vue";
119
122
  import Icon from "../core/Icon.vue";
120
123
  import Spinner from "../core/Spinner.vue";
@@ -122,6 +125,7 @@ const props = defineProps({
122
125
  position: { type: String, required: false, default: "bottom-right" },
123
126
  max: { type: Number, required: false, default: 4 },
124
127
  duration: { type: Number, required: false, default: 4e3 },
128
+ actionDuration: { type: Number, required: false, default: 1e4 },
125
129
  gap: { type: Number, required: false, default: 8 },
126
130
  expand: { type: Boolean, required: false },
127
131
  progress: { type: Boolean, required: false },
@@ -274,7 +278,8 @@ function syncEntries() {
274
278
  }
275
279
  const timers = /* @__PURE__ */ new Map();
276
280
  function durationOf(item) {
277
- return item.duration ?? props.duration;
281
+ if (item.duration !== void 0) return item.duration;
282
+ return item.action ? Math.max(props.duration, props.actionDuration) : props.duration;
278
283
  }
279
284
  function hasTimer(item) {
280
285
  const duration = durationOf(item);
@@ -343,11 +348,32 @@ function resumeTimers() {
343
348
  for (const [id, timer] of timers) if (timer.handle === void 0) run(id, timer);
344
349
  }
345
350
  watch(paused, (value) => value ? pauseTimers() : resumeTimers());
351
+ function actionHint(item) {
352
+ if (!item.action || !props.hotkey) return "";
353
+ return t("toaster.actionHint", {
354
+ hotkey: ariaKeyShortcuts(props.hotkey, false),
355
+ action: item.action.label
356
+ });
357
+ }
358
+ function toneText(item) {
359
+ const key = spokenToneKey(item.tone);
360
+ return key ? t(key) : "";
361
+ }
362
+ const pending = { polite: [], assertive: [] };
363
+ const flushTimers = {};
346
364
  function announce(item) {
347
- const text = [item.title, ...descriptionLines(item)].filter(Boolean).join(". ");
348
- const target = item.tone === "danger" ? assertiveMessage : politeMessage;
365
+ const text = [toneText(item), item.title, ...descriptionLines(item), actionHint(item)].filter(Boolean).join(". ");
366
+ if (!text) return;
367
+ const kind = item.tone === "danger" ? "assertive" : "polite";
368
+ const target = kind === "assertive" ? assertiveMessage : politeMessage;
369
+ pending[kind].push(text);
370
+ clearTimeout(flushTimers[kind]);
349
371
  target.value = "";
350
- nextTick(() => target.value = text);
372
+ flushTimers[kind] = setTimeout(() => {
373
+ flushTimers[kind] = void 0;
374
+ target.value = pending[kind].join(" ");
375
+ pending[kind] = [];
376
+ }, LIVE_DELAY);
351
377
  }
352
378
  function raise() {
353
379
  const element = toasterRef.value;
@@ -408,9 +434,29 @@ watch(active, async (value) => {
408
434
  function dismiss(id) {
409
435
  toast.dismiss(id);
410
436
  }
437
+ let returnFocus = null;
438
+ function focusInToaster() {
439
+ const active2 = document.activeElement;
440
+ return Boolean(active2 && toasterRef.value?.contains(active2));
441
+ }
442
+ function restoreFocus() {
443
+ const target = returnFocus;
444
+ returnFocus = null;
445
+ const next = toasterRef.value?.querySelector(
446
+ '.k-toast[data-visible="true"]:not([data-removed="true"]) button'
447
+ );
448
+ if (target?.isConnected) target.focus({ preventScroll: true });
449
+ else if (next) next.focus({ preventScroll: true });
450
+ if (!focusInToaster()) focusInside.value = false;
451
+ }
452
+ function dismissFromToast(id) {
453
+ const hadFocus = focusInToaster();
454
+ dismiss(id);
455
+ if (hadFocus) nextTick(restoreFocus);
456
+ }
411
457
  function runAction(item, event) {
412
458
  item.action?.onClick(event);
413
- if (!item.action?.keepOpen) dismiss(item.id);
459
+ if (!item.action?.keepOpen) dismissFromToast(item.id);
414
460
  }
415
461
  function onPointerEnter(event) {
416
462
  if (event.pointerType === "mouse") hovered.value = true;
@@ -418,9 +464,23 @@ function onPointerEnter(event) {
418
464
  function onPointerLeave() {
419
465
  hovered.value = false;
420
466
  }
467
+ function onFocusIn(event) {
468
+ focusInside.value = true;
469
+ const previous = event.relatedTarget;
470
+ if (previous instanceof HTMLElement && !toasterRef.value?.contains(previous))
471
+ returnFocus = previous;
472
+ }
473
+ function onEscape(event) {
474
+ const target = returnFocus;
475
+ if (!target?.isConnected) return;
476
+ event.preventDefault();
477
+ returnFocus = null;
478
+ target.focus({ preventScroll: true });
479
+ }
421
480
  function onFocusOut(event) {
422
481
  const next = event.relatedTarget;
423
482
  if (next && toasterRef.value?.contains(next)) return;
483
+ if (next) returnFocus = null;
424
484
  focusInside.value = false;
425
485
  }
426
486
  function onSwipeStart(event, item) {
@@ -451,6 +511,7 @@ function onVisibilityChange() {
451
511
  useHotkey(
452
512
  () => props.hotkey ? [props.hotkey] : [],
453
513
  () => {
514
+ if (!focusInToaster()) returnFocus = activeElement();
454
515
  const first = toasterRef.value?.querySelector(
455
516
  '.k-toast[data-visible="true"] button'
456
517
  );
@@ -468,5 +529,7 @@ onBeforeUnmount(() => {
468
529
  resizeObserver?.disconnect();
469
530
  for (const timer of timers.values()) clearTimeout(timer.handle);
470
531
  timers.clear();
532
+ clearTimeout(flushTimers.polite);
533
+ clearTimeout(flushTimers.assertive);
471
534
  });
472
535
  </script>
@@ -3,6 +3,7 @@ declare const __VLS_export: import("vue").DefineComponent<{
3
3
  position?: ToasterPosition;
4
4
  max?: number;
5
5
  duration?: number;
6
+ actionDuration?: number;
6
7
  gap?: number;
7
8
  expand?: boolean;
8
9
  progress?: boolean;
@@ -214,6 +215,7 @@ declare const __VLS_export: import("vue").DefineComponent<{
214
215
  position?: ToasterPosition;
215
216
  max?: number;
216
217
  duration?: number;
218
+ actionDuration?: number;
217
219
  gap?: number;
218
220
  expand?: boolean;
219
221
  progress?: boolean;
@@ -426,6 +428,7 @@ declare const __VLS_export: import("vue").DefineComponent<{
426
428
  duration: number;
427
429
  position: ToasterPosition;
428
430
  gap: number;
431
+ actionDuration: number;
429
432
  hotkey: string | false;
430
433
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
431
434
  declare const _default: typeof __VLS_export;
@@ -25,8 +25,8 @@
25
25
  </template>
26
26
 
27
27
  <script setup>
28
- import { onBeforeUnmount, useId, useTemplateRef, watch } from "vue";
29
- import { formatHotkey } from "../../composables/useHotkey";
28
+ import { computed, onBeforeUnmount, useId, useSlots, useTemplateRef, watch } from "vue";
29
+ import { ariaKeyShortcuts, formatHotkey } from "../../composables/useHotkey";
30
30
  import { useHoverTrigger } from "../../internal/overlays/hover";
31
31
  import { ARROW_OFFSET, useFloatingLayer } from "../../internal/floating/layer";
32
32
  import { useApplePlatform } from "../../internal/core/env";
@@ -65,29 +65,54 @@ useHoverTrigger({
65
65
  hide: layer.hide,
66
66
  openDelay: () => props.openDelay,
67
67
  closeDelay: () => props.closeDelay,
68
- enabled: () => !props.disabled && Boolean(props.text || props.shortcut),
68
+ enabled: () => !props.disabled && Boolean(props.text || props.shortcut || slots.content),
69
69
  warmup: true
70
70
  });
71
+ const slots = useSlots();
72
+ const hasContent = computed(() => Boolean(props.text || slots.content));
73
+ let shortcutOwner = null;
74
+ function accessibleName(element) {
75
+ return (element.getAttribute("aria-label") ?? element.textContent ?? "").trim();
76
+ }
77
+ function release(element) {
78
+ removeToken(element, "aria-describedby", tooltipId);
79
+ if (shortcutOwner === element) {
80
+ element.removeAttribute("aria-keyshortcuts");
81
+ shortcutOwner = null;
82
+ }
83
+ }
84
+ function sync(element) {
85
+ if (!element) return;
86
+ if (props.disabled) {
87
+ release(element);
88
+ return;
89
+ }
90
+ const duplicate = !slots.content && Boolean(props.text) && props.text.trim() === accessibleName(element);
91
+ if (hasContent.value && !duplicate) addToken(element, "aria-describedby", tooltipId);
92
+ else removeToken(element, "aria-describedby", tooltipId);
93
+ if (props.shortcut && (shortcutOwner === element || !element.hasAttribute("aria-keyshortcuts"))) {
94
+ element.setAttribute("aria-keyshortcuts", ariaKeyShortcuts(props.shortcut, apple.value));
95
+ shortcutOwner = element;
96
+ } else if (!props.shortcut && shortcutOwner === element) {
97
+ element.removeAttribute("aria-keyshortcuts");
98
+ shortcutOwner = null;
99
+ }
100
+ }
71
101
  watch(
72
- trigger,
73
- (element, previous) => {
74
- if (previous) removeToken(previous, "aria-describedby", tooltipId);
75
- if (element && !props.disabled) addToken(element, "aria-describedby", tooltipId);
102
+ [trigger, () => props.disabled, () => props.text, () => props.shortcut, hasContent, apple],
103
+ ([element], [previous]) => {
104
+ if (previous && previous !== element) release(previous);
105
+ sync(element);
76
106
  },
77
107
  { flush: "post" }
78
108
  );
79
109
  watch(
80
110
  () => props.disabled,
81
111
  (disabled) => {
82
- const element = trigger.value;
83
- if (!element) return;
84
- if (disabled) {
85
- removeToken(element, "aria-describedby", tooltipId);
86
- layer.hide();
87
- } else addToken(element, "aria-describedby", tooltipId);
112
+ if (disabled) layer.hide();
88
113
  }
89
114
  );
90
115
  onBeforeUnmount(() => {
91
- if (trigger.value) removeToken(trigger.value, "aria-describedby", tooltipId);
116
+ if (trigger.value) release(trigger.value);
92
117
  });
93
118
  </script>