@xleddyl/443-components-vue 0.5.0 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) 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 +39 -7
  126. package/dist/components/overlays/Tooltip.vue +39 -14
  127. package/dist/components/overlays/types.d.ts +6 -0
  128. package/dist/components/templates/AccountMenu.vue.d.ts +2 -2
  129. package/dist/components/templates/AppearanceSettings.vue +83 -77
  130. package/dist/components/templates/AppearanceSettings.vue.d.ts +2 -2
  131. package/dist/components/templates/AuthLayout.vue +2 -2
  132. package/dist/components/templates/Brand.vue.d.ts +2 -2
  133. package/dist/components/templates/DashboardLayout.vue +3 -7
  134. package/dist/components/templates/DashboardLayout.vue.d.ts +8 -18
  135. package/dist/components/templates/DetailPage.vue +3 -1
  136. package/dist/components/templates/DetailPage.vue.d.ts +2 -2
  137. package/dist/components/templates/ErrorPage.vue +11 -5
  138. package/dist/components/templates/ErrorPage.vue.d.ts +10 -6
  139. package/dist/components/templates/FormPage.vue +16 -3
  140. package/dist/components/templates/ListPage.vue +19 -6
  141. package/dist/components/templates/ListPage.vue.d.ts +1 -0
  142. package/dist/components/templates/NotFoundPage.vue +2 -0
  143. package/dist/components/templates/NotFoundPage.vue.d.ts +4 -0
  144. package/dist/components/templates/SaveBar.vue +18 -3
  145. package/dist/components/templates/SaveBar.vue.d.ts +5 -5
  146. package/dist/components/templates/SettingsGroup.vue +1 -1
  147. package/dist/components/templates/SettingsGroup.vue.d.ts +3 -1
  148. package/dist/components/templates/SettingsModal.vue +73 -46
  149. package/dist/components/templates/SettingsModal.vue.d.ts +9 -11
  150. package/dist/components/templates/SettingsPage.vue.d.ts +2 -2
  151. package/dist/components/templates/SettingsSection.vue.d.ts +4 -2
  152. package/dist/components/templates/types.d.ts +4 -0
  153. package/dist/composables/useAlert.mjs +5 -10
  154. package/dist/composables/useConfirm.mjs +5 -5
  155. package/dist/composables/useField.d.ts +4 -0
  156. package/dist/composables/useField.mjs +16 -5
  157. package/dist/composables/useFileDrop.mjs +2 -1
  158. package/dist/composables/useOverlay.mjs +2 -1
  159. package/dist/composables/usePreset.mjs +4 -10
  160. package/dist/composables/usePrompt.mjs +6 -13
  161. package/dist/composables/useScrollLock.mjs +4 -3
  162. package/dist/composables/useTheme.mjs +3 -11
  163. package/dist/composables/useToast.mjs +2 -1
  164. package/dist/editor/RichTextEditor.vue +31 -6
  165. package/dist/editor/RichTextEditor.vue.d.ts +2 -2
  166. package/dist/editor/rich-text-editor.css +9 -4
  167. package/dist/grid/DataGrid.vue +72 -12
  168. package/dist/grid/GridToolbar.vue +1 -1
  169. package/dist/grid/GridToolbar.vue.d.ts +2 -2
  170. package/dist/grid/cells/BadgeCell.vue +3 -1
  171. package/dist/grid/cells/BadgeCell.vue.d.ts +17 -3
  172. package/dist/grid/cells/DateCell.vue +3 -1
  173. package/dist/grid/cells/DateCell.vue.d.ts +17 -3
  174. package/dist/grid/cells/EmptyCell.vue +15 -0
  175. package/dist/grid/cells/EmptyCell.vue.d.ts +392 -0
  176. package/dist/grid/cells/LinkCell.vue +9 -2
  177. package/dist/grid/cells/LinkCell.vue.d.ts +17 -3
  178. package/dist/grid/data-grid.css +5 -5
  179. package/dist/grid/types.d.ts +2 -0
  180. package/dist/internal/core/ButtonContent.vue +3 -0
  181. package/dist/internal/core/LiveRegion.vue +26 -0
  182. package/dist/internal/core/LiveRegion.vue.d.ts +393 -0
  183. package/dist/internal/core/copy.d.ts +6 -0
  184. package/dist/internal/core/copy.mjs +14 -0
  185. package/dist/internal/core/focus.d.ts +6 -0
  186. package/dist/internal/core/focus.mjs +46 -0
  187. package/dist/internal/core/intl.d.ts +4 -2
  188. package/dist/internal/core/intl.mjs +23 -22
  189. package/dist/internal/core/live.d.ts +6 -0
  190. package/dist/internal/core/live.mjs +22 -0
  191. package/dist/internal/core/preset.d.ts +0 -1
  192. package/dist/internal/core/preset.mjs +4 -14
  193. package/dist/internal/core/resize.d.ts +1 -0
  194. package/dist/internal/core/resize.mjs +11 -0
  195. package/dist/internal/core/roving.d.ts +7 -0
  196. package/dist/internal/core/roving.mjs +19 -1
  197. package/dist/internal/core/scroll-edges.d.ts +5 -0
  198. package/dist/internal/core/scroll-edges.mjs +63 -0
  199. package/dist/internal/core/storage.d.ts +2 -0
  200. package/dist/internal/core/storage.mjs +8 -0
  201. package/dist/internal/core/theme.d.ts +0 -1
  202. package/dist/internal/core/theme.mjs +4 -13
  203. package/dist/internal/core/tone.d.ts +1 -0
  204. package/dist/internal/core/tone.mjs +4 -0
  205. package/dist/internal/core/transition.d.ts +1 -0
  206. package/dist/internal/core/transition.mjs +20 -0
  207. package/dist/internal/data/rows.mjs +6 -5
  208. package/dist/internal/data/tree.d.ts +2 -3
  209. package/dist/internal/feedback/LoadingHost.vue +16 -6
  210. package/dist/internal/feedback/loading.mjs +2 -1
  211. package/dist/internal/feedback/progress.d.ts +12 -0
  212. package/dist/internal/feedback/progress.mjs +13 -0
  213. package/dist/internal/floating/layer.d.ts +1 -1
  214. package/dist/internal/floating/layer.mjs +17 -10
  215. package/dist/internal/forms/keys.d.ts +4 -0
  216. package/dist/internal/forms/keys.mjs +1 -0
  217. package/dist/internal/forms/name.d.ts +2 -0
  218. package/dist/internal/forms/name.mjs +12 -0
  219. package/dist/internal/forms/standard-schema.d.ts +0 -2
  220. package/dist/internal/forms/standard-schema.mjs +0 -18
  221. package/dist/internal/layout/NavGroup.vue +104 -0
  222. package/dist/internal/layout/NavGroup.vue.d.ts +412 -0
  223. package/dist/internal/overlays/DialogFrame.vue +53 -6
  224. package/dist/internal/overlays/DialogFrame.vue.d.ts +5 -2
  225. package/dist/internal/overlays/MenuList.vue +4 -11
  226. package/dist/internal/overlays/MenuList.vue.d.ts +6 -6
  227. package/dist/internal/overlays/OverlayView.vue +2 -0
  228. package/dist/internal/overlays/OverlayView.vue.d.ts +8 -6
  229. package/dist/internal/overlays/confirm.d.ts +6 -1
  230. package/dist/internal/overlays/confirm.mjs +5 -2
  231. package/dist/internal/overlays/dialog.d.ts +1 -0
  232. package/dist/internal/overlays/dialog.mjs +9 -9
  233. package/dist/internal/overlays/hover.d.ts +1 -0
  234. package/dist/internal/overlays/hover.mjs +20 -3
  235. package/dist/internal/overlays/menu.d.ts +9 -0
  236. package/dist/internal/overlays/menu.mjs +15 -0
  237. package/dist/internal/overlays/stack.d.ts +1 -0
  238. package/dist/locale/en.mjs +70 -18
  239. package/dist/locale/index.d.ts +1 -1
  240. package/dist/locale/index.mjs +5 -11
  241. package/dist/locale/it.mjs +70 -18
  242. package/dist/locale/types.d.ts +54 -2
  243. package/dist/nuxt/runtime/RouteAnnouncer.vue +21 -0
  244. package/dist/nuxt/runtime/RouteAnnouncer.vue.d.ts +3 -0
  245. package/dist/nuxt/runtime/layout-head.d.ts +2 -0
  246. package/dist/nuxt/runtime/layout-head.mjs +13 -0
  247. package/dist/nuxt/runtime/layouts/auth.vue +4 -0
  248. package/dist/nuxt/runtime/layouts/auth.vue.d.ts +2 -2
  249. package/dist/nuxt/runtime/layouts/dashboard.vue +4 -0
  250. package/dist/nuxt/runtime/layouts/dashboard.vue.d.ts +2 -2
  251. package/dist/nuxt/runtime/locale.mjs +9 -1
  252. package/dist/nuxt/runtime/theme.mjs +17 -12
  253. package/dist/styles/base.css +0 -13
  254. package/dist/styles/core/button.css +8 -8
  255. package/dist/styles/core/field-message.css +2 -2
  256. package/dist/styles/core/form-field.css +11 -2
  257. package/dist/styles/core/input.css +4 -7
  258. package/dist/styles/core/kbd.css +0 -1
  259. package/dist/styles/data/badge.css +8 -4
  260. package/dist/styles/data/description-list.css +2 -2
  261. package/dist/styles/data/filter-pills.css +5 -8
  262. package/dist/styles/data/pagination.css +2 -2
  263. package/dist/styles/data/stat.css +3 -3
  264. package/dist/styles/data/table.css +2 -2
  265. package/dist/styles/data/tag.css +1 -2
  266. package/dist/styles/data/timeline.css +1 -1
  267. package/dist/styles/data/tree.css +31 -10
  268. package/dist/styles/feedback/alert.css +0 -3
  269. package/dist/styles/feedback/loading-host.css +4 -0
  270. package/dist/styles/feedback/loading-overlay.css +4 -0
  271. package/dist/styles/forced-colors.css +215 -0
  272. package/dist/styles/forms/calendar.css +2 -2
  273. package/dist/styles/forms/choice.css +2 -2
  274. package/dist/styles/forms/color-input.css +1 -1
  275. package/dist/styles/forms/combobox.css +2 -24
  276. package/dist/styles/forms/date-input.css +2 -2
  277. package/dist/styles/forms/date-picker.css +3 -7
  278. package/dist/styles/forms/file-input.css +4 -3
  279. package/dist/styles/forms/input-group.css +6 -0
  280. package/dist/styles/forms/number-input.css +2 -2
  281. package/dist/styles/forms/password-input.css +5 -2
  282. package/dist/styles/forms/pin-input.css +4 -2
  283. package/dist/styles/forms/segmented.css +2 -2
  284. package/dist/styles/forms/select.css +6 -6
  285. package/dist/styles/forms/slider.css +5 -4
  286. package/dist/styles/forms/switch.css +5 -1
  287. package/dist/styles/index.css +1 -0
  288. package/dist/styles/layout/app-shell.css +15 -3
  289. package/dist/styles/layout/copy-button.css +1 -1
  290. package/dist/styles/layout/nav-link.css +1 -33
  291. package/dist/styles/layout/separator.css +1 -1
  292. package/dist/styles/layout/sidebar-nav.css +15 -4
  293. package/dist/styles/layout/sidebar.css +20 -6
  294. package/dist/styles/layout/tabs.css +9 -4
  295. package/dist/styles/layout/theme-switch.css +0 -6
  296. package/dist/styles/overlays/command.css +9 -15
  297. package/dist/styles/overlays/confirm.css +1 -1
  298. package/dist/styles/overlays/drawer.css +0 -1
  299. package/dist/styles/overlays/menu.css +2 -17
  300. package/dist/styles/overlays/modal.css +29 -6
  301. package/dist/styles/overlays/toast.css +1 -2
  302. package/dist/styles/presets.css +4 -4
  303. package/dist/styles/shared.css +96 -3
  304. package/dist/styles/templates/account-menu.css +3 -3
  305. package/dist/styles/templates/auth-layout.css +1 -1
  306. package/dist/styles/templates/brand.css +3 -3
  307. package/dist/styles/templates/empty-page.css +1 -1
  308. package/dist/styles/templates/form-page.css +10 -0
  309. package/dist/styles/templates/save-bar.css +10 -0
  310. package/dist/styles/templates/settings-modal.css +42 -44
  311. package/dist/styles/templates/settings-page.css +3 -3
  312. package/dist/styles/tokens.css +12 -2
  313. package/package.json +1 -1
  314. package/dist/internal/overlays/focus.d.ts +0 -1
  315. package/dist/internal/overlays/focus.mjs +0 -24
@@ -410,9 +410,9 @@ declare const __VLS_base: import("vue").DefineComponent<{
410
410
  ref_key?: string | undefined | undefined;
411
411
  }> & Readonly<{}>, {
412
412
  value: number | null;
413
+ tone: Tone;
413
414
  max: number;
414
415
  size: number | "sm" | "md" | "lg";
415
- tone: Tone;
416
416
  thickness: number;
417
417
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
418
418
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -4,28 +4,33 @@
4
4
  :class="{ 'is-range': range, 'is-disabled': disabled, 'is-readonly': readonly }"
5
5
  >
6
6
  <div class="k-calendar-header">
7
- <Button
8
- size="xs"
9
- variant="ghost"
10
- tone="neutral"
11
- icon="chevron-left"
7
+ <button
8
+ type="button"
9
+ class="k-btn k-btn-xs k-btn-neutral k-btn-ghost is-icon"
12
10
  :aria-label="prevText"
13
11
  :title="prevText"
14
- @click="shiftMonth(-1)"
15
- :disabled="!canGoPrev || disabled"
16
- />
17
- <h2 :id="headingId" class="k-calendar-heading" aria-live="polite">{{ heading }}</h2>
18
- <Button
19
- size="xs"
20
- variant="ghost"
21
- tone="neutral"
22
- icon="chevron-right"
12
+ :aria-disabled="!canGoPrev ? 'true' : void 0"
13
+ :disabled="disabled || void 0"
14
+ @click="onShift(-1)"
15
+ >
16
+ <Icon name="chevron-left" />
17
+ </button>
18
+ <component :is="`h${level}`" :id="headingId" class="k-calendar-heading">{{
19
+ heading
20
+ }}</component>
21
+ <button
22
+ type="button"
23
+ class="k-btn k-btn-xs k-btn-neutral k-btn-ghost is-icon"
23
24
  :aria-label="nextText"
24
25
  :title="nextText"
25
- @click="shiftMonth(1)"
26
- :disabled="!canGoNext || disabled"
27
- />
26
+ :aria-disabled="!canGoNext ? 'true' : void 0"
27
+ :disabled="disabled || void 0"
28
+ @click="onShift(1)"
29
+ >
30
+ <Icon name="chevron-right" />
31
+ </button>
28
32
  </div>
33
+ <LiveRegion :message="live.message.value" />
29
34
  <table
30
35
  ref="gridRef"
31
36
  role="grid"
@@ -99,7 +104,9 @@ import {
99
104
  weekdayNames
100
105
  } from "../../internal/forms/dates";
101
106
  import { useLocale } from "../../composables/useLocale";
102
- import Button from "../core/Button.vue";
107
+ import Icon from "../core/Icon.vue";
108
+ import LiveRegion from "../../internal/core/LiveRegion.vue";
109
+ import { useLiveMessage } from "../../internal/core/live";
103
110
  const props = defineProps({
104
111
  range: { type: Boolean, required: false },
105
112
  min: { type: String, required: false },
@@ -110,7 +117,8 @@ const props = defineProps({
110
117
  prevLabel: { type: String, required: false },
111
118
  nextLabel: { type: String, required: false },
112
119
  disabled: { type: Boolean, required: false },
113
- readonly: { type: Boolean, required: false }
120
+ readonly: { type: Boolean, required: false },
121
+ level: { type: Number, required: false, default: 2 }
114
122
  });
115
123
  const { locale: appLocale, t } = useLocale();
116
124
  const resolvedLocale = computed(() => props.locale ?? appLocale.value.code);
@@ -161,6 +169,18 @@ function isUnavailable(iso) {
161
169
  if (props.max && iso > props.max) return true;
162
170
  return Boolean(props.isDateDisabled?.(iso));
163
171
  }
172
+ function dayLabel(iso, start, end) {
173
+ const label = formatIso(iso, resolvedLocale.value, {
174
+ weekday: "long",
175
+ year: "numeric",
176
+ month: "long",
177
+ day: "numeric"
178
+ });
179
+ if (!props.range || !start) return label;
180
+ if (iso === start) return `${label}, ${t("calendar.rangeStart")}`;
181
+ if (iso === end) return `${label}, ${t("calendar.rangeEnd")}`;
182
+ return label;
183
+ }
164
184
  const weeks = computed(() => {
165
185
  const currentMonth = monthKey(focusedDate.value);
166
186
  const { start, end } = selection.value;
@@ -175,12 +195,7 @@ const weeks = computed(() => {
175
195
  iso,
176
196
  inMonth,
177
197
  number: Number(iso.slice(8)),
178
- label: formatIso(iso, resolvedLocale.value, {
179
- weekday: "long",
180
- year: "numeric",
181
- month: "long",
182
- day: "numeric"
183
- }),
198
+ label: dayLabel(iso, start, end),
184
199
  unavailable: isUnavailable(iso),
185
200
  selected: selected || Boolean(props.range && start && end && iso > start && iso < end),
186
201
  rangeStart: Boolean(props.range && start && end && iso === start && start !== end),
@@ -199,8 +214,14 @@ function moveFocus(iso, fromKeyboard) {
199
214
  function focusCell() {
200
215
  gridRef.value?.querySelector(`[data-date="${focusedDate.value}"]`)?.focus({ preventScroll: false });
201
216
  }
202
- function shiftMonth(delta) {
217
+ const live = useLiveMessage();
218
+ function announceMonth() {
219
+ nextTick(() => live.announce(heading.value));
220
+ }
221
+ function onShift(delta) {
222
+ if (props.disabled || (delta < 0 ? !canGoPrev.value : !canGoNext.value)) return;
203
223
  moveFocus(addMonths(focusedDate.value, delta), false);
224
+ announceMonth();
204
225
  }
205
226
  function pick(iso) {
206
227
  if (props.disabled || props.readonly || isUnavailable(iso)) return;
@@ -256,7 +277,9 @@ function onKeydown(event) {
256
277
  return;
257
278
  }
258
279
  event.preventDefault();
280
+ const before = monthKey(current);
259
281
  moveFocus(next, true);
282
+ if (event.key.startsWith("Page") && monthKey(focusedDate.value) !== before) announceMonth();
260
283
  if (props.range) hoverDate.value = focusedDate.value;
261
284
  }
262
285
  watch(focusedDate, (iso) => {
@@ -1,7 +1,7 @@
1
1
  import type { CalendarDateDisabled, CalendarRange } from './types';
2
- declare var __VLS_18: {};
2
+ declare var __VLS_25: {};
3
3
  type __VLS_Slots = {} & {
4
- footer?: (props: typeof __VLS_18) => any;
4
+ footer?: (props: typeof __VLS_25) => any;
5
5
  };
6
6
  declare const __VLS_base: import("vue").DefineComponent<{
7
7
  range?: boolean;
@@ -14,6 +14,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
14
14
  nextLabel?: string;
15
15
  disabled?: boolean;
16
16
  readonly?: boolean;
17
+ level?: 1 | 2 | 3 | 4 | 5 | 6;
17
18
  modelValue?: string | CalendarRange | null | undefined;
18
19
  month?: string | undefined;
19
20
  key?: PropertyKey | undefined;
@@ -22,6 +23,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
22
23
  style?: import("vue").StyleValue;
23
24
  results?: (string | number) | undefined;
24
25
  placeholder?: string | undefined | undefined;
26
+ dir?: string | undefined | undefined;
25
27
  class?: import("vue").ClassValue;
26
28
  role?: string | undefined | undefined;
27
29
  'aria-label'?: string | undefined | undefined;
@@ -176,7 +178,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
176
178
  accesskey?: string | undefined | undefined;
177
179
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
178
180
  contextmenu?: string | undefined | undefined;
179
- dir?: string | undefined | undefined;
180
181
  draggable?: (boolean | "true" | "false") | undefined;
181
182
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
182
183
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
@@ -225,6 +226,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
225
226
  nextLabel?: string;
226
227
  disabled?: boolean;
227
228
  readonly?: boolean;
229
+ level?: 1 | 2 | 3 | 4 | 5 | 6;
228
230
  modelValue?: string | CalendarRange | null | undefined;
229
231
  month?: string | undefined;
230
232
  key?: PropertyKey | undefined;
@@ -233,6 +235,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
233
235
  style?: import("vue").StyleValue;
234
236
  results?: (string | number) | undefined;
235
237
  placeholder?: string | undefined | undefined;
238
+ dir?: string | undefined | undefined;
236
239
  class?: import("vue").ClassValue;
237
240
  role?: string | undefined | undefined;
238
241
  'aria-label'?: string | undefined | undefined;
@@ -387,7 +390,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
387
390
  accesskey?: string | undefined | undefined;
388
391
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
389
392
  contextmenu?: string | undefined | undefined;
390
- dir?: string | undefined | undefined;
391
393
  draggable?: (boolean | "true" | "false") | undefined;
392
394
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
393
395
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
@@ -422,7 +424,9 @@ declare const __VLS_base: import("vue").DefineComponent<{
422
424
  onSelect?: ((iso: string) => any) | undefined;
423
425
  "onUpdate:modelValue"?: ((value: string | CalendarRange | null | undefined) => any) | undefined;
424
426
  "onUpdate:month"?: ((value: string | undefined) => any) | undefined;
425
- }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
427
+ }>, {
428
+ level: 1 | 2 | 4 | 3 | 5 | 6;
429
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
426
430
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
427
431
  declare const _default: typeof __VLS_export;
428
432
  export default _default;
@@ -2,7 +2,7 @@
2
2
  <fieldset
3
3
  :id="control.id.value"
4
4
  data-k-shake
5
- :aria-labelledby="!legend && control.field ? control.field.labelId : void 0"
5
+ :aria-labelledby="hasLegend ? void 0 : control.labelledBy.value"
6
6
  v-bind="$attrs"
7
7
  :disabled="control.disabled.value || void 0"
8
8
  :aria-describedby="joinIds($attrs['aria-describedby'], control.describedBy.value)"
@@ -12,8 +12,8 @@
12
12
  { 'is-invalid': control.invalid.value, 'is-disabled': control.disabled.value }
13
13
  ]"
14
14
  >
15
- <legend v-if="legend || $slots.legend" class="k-choice-group-legend">
16
- <slot name="legend">{{ legend }}</slot>
15
+ <legend v-if="hasLegend" class="k-choice-group-legend">
16
+ <slot name="legend">{{ legendText }}</slot>
17
17
  </legend>
18
18
  <div class="k-choice-group-items">
19
19
  <slot>
@@ -31,14 +31,16 @@
31
31
  </template>
32
32
 
33
33
  <script setup>
34
- import { computed, provide } from "vue";
34
+ import { computed, provide, useAttrs, useSlots } from "vue";
35
35
  import { useFieldControl } from "../../composables/useField";
36
36
  import { joinIds } from "../../internal/forms/control";
37
+ import { hasNameAttrs, warnUnnamed } from "../../internal/forms/name";
37
38
  import { CHECKBOX_GROUP_KEY } from "../../internal/forms/keys";
38
39
  import Checkbox from "./Checkbox.vue";
39
40
  defineOptions({ inheritAttrs: false });
40
41
  const props = defineProps({
41
42
  options: { type: Array, required: false, default: () => [] },
43
+ label: { type: String, required: false },
42
44
  legend: { type: String, required: false },
43
45
  orientation: { type: String, required: false, default: "vertical" },
44
46
  size: { type: String, required: false, default: "md" },
@@ -55,6 +57,14 @@ const control = useFieldControl({
55
57
  required: () => props.required,
56
58
  labelable: false
57
59
  });
60
+ const slots = useSlots();
61
+ const attrs = useAttrs();
62
+ const legendText = computed(() => props.label ?? props.legend);
63
+ const hasLegend = computed(() => Boolean(legendText.value || slots.legend));
64
+ warnUnnamed(
65
+ "CheckboxGroup",
66
+ () => hasLegend.value || Boolean(control.labelledBy.value) || hasNameAttrs(attrs)
67
+ );
58
68
  provide(CHECKBOX_GROUP_KEY, {
59
69
  name: computed(() => props.name ?? control.field?.name.value),
60
70
  size: computed(() => props.size),
@@ -3,6 +3,7 @@ import type { ChoiceOption, ChoiceOrientation, ChoiceValue } from './types';
3
3
  declare const __VLS_export: <T extends ChoiceValue>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_exposed?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
4
4
  props: import("vue").PublicProps & __VLS_PrettifyLocal<({
5
5
  options?: ChoiceOption<T>[];
6
+ label?: string;
6
7
  legend?: string;
7
8
  orientation?: ChoiceOrientation;
8
9
  size?: FieldSize;
@@ -22,8 +22,14 @@
22
22
  v-bind="$attrs"
23
23
  :disabled="control.disabled.value || void 0"
24
24
  :required="control.required.value || void 0"
25
- :aria-invalid="control.invalid.value ? 'true' : void 0"
26
- :aria-describedby="joinIds($attrs['aria-describedby'], control.describedBy.value)"
25
+ :aria-invalid="control.invalid.value || draftInvalid ? 'true' : void 0"
26
+ :aria-describedby="
27
+ joinIds(
28
+ $attrs['aria-describedby'],
29
+ control.describedBy.value,
30
+ localError ? errorId : void 0
31
+ )
32
+ "
27
33
  type="text"
28
34
  :class="[
29
35
  'k-field',
@@ -43,33 +49,42 @@
43
49
  @keydown.enter="commit"
44
50
  />
45
51
  </div>
52
+ <FieldMessage v-if="localError" :id="errorId" :message="invalidText" />
53
+ <LiveRegion v-if="!control.field" :message="localError ? invalidText : ''" />
46
54
  <div
47
- v-if="swatches.length"
55
+ v-if="presets.length"
56
+ ref="swatchesRef"
48
57
  class="k-color-input-swatches"
49
- role="group"
58
+ role="radiogroup"
50
59
  :aria-label="swatchesText"
60
+ @keydown="onSwatchKeydown"
51
61
  >
52
62
  <button
53
- v-for="color in normalizedSwatches"
54
- :key="color"
63
+ v-for="(preset, index) in presets"
64
+ :key="preset.value"
55
65
  type="button"
66
+ role="radio"
56
67
  class="k-color-input-preset"
57
- :style="{ '--k-swatch': color }"
58
- :aria-label="color"
59
- :title="color"
60
- :aria-pressed="color === normalized ? 'true' : 'false'"
68
+ :style="{ '--k-swatch': preset.value }"
69
+ :aria-label="preset.label"
70
+ :title="preset.label"
71
+ :aria-checked="preset.value === normalized ? 'true' : 'false'"
72
+ :tabindex="index === tabStop ? 0 : -1"
61
73
  :disabled="control.disabled.value || readonly || void 0"
62
- @click="model = color"
74
+ @click="model = preset.value"
63
75
  />
64
76
  </div>
65
77
  </div>
66
78
  </template>
67
79
 
68
80
  <script setup>
69
- import { computed, ref, useTemplateRef, watch } from "vue";
81
+ import { computed, ref, useId, useTemplateRef, watch } from "vue";
70
82
  import { useFieldControl } from "../../composables/useField";
71
83
  import { useLocale } from "../../composables/useLocale";
72
84
  import { joinIds } from "../../internal/forms/control";
85
+ import { rovingIndex } from "../../internal/core/roving";
86
+ import LiveRegion from "../../internal/core/LiveRegion.vue";
87
+ import FieldMessage from "../core/FieldMessage.vue";
73
88
  defineOptions({ inheritAttrs: false });
74
89
  const props = defineProps({
75
90
  swatches: { type: Array, required: false, default: () => [] },
@@ -77,6 +92,7 @@ const props = defineProps({
77
92
  placeholder: { type: String, required: false, default: "#000000" },
78
93
  pickerLabel: { type: String, required: false },
79
94
  swatchesLabel: { type: String, required: false },
95
+ invalidText: { type: String, required: false },
80
96
  invalid: { type: Boolean, required: false, default: void 0 },
81
97
  disabled: { type: Boolean, required: false },
82
98
  readonly: { type: Boolean, required: false },
@@ -87,8 +103,11 @@ const props = defineProps({
87
103
  const { t } = useLocale();
88
104
  const pickerText = computed(() => props.pickerLabel ?? t("colorInput.pick"));
89
105
  const swatchesText = computed(() => props.swatchesLabel ?? t("colorInput.swatches"));
106
+ const invalidText = computed(() => props.invalidText ?? t("colorInput.invalid"));
90
107
  const model = defineModel({ type: null });
91
108
  const inputRef = useTemplateRef("inputRef");
109
+ const swatchesRef = useTemplateRef("swatchesRef");
110
+ const errorId = `${useId()}-error`;
92
111
  const control = useFieldControl({
93
112
  invalid: () => props.invalid,
94
113
  disabled: () => props.disabled,
@@ -103,11 +122,42 @@ function normalizeHex(value) {
103
122
  return null;
104
123
  }
105
124
  const normalized = computed(() => normalizeHex(model.value));
106
- const normalizedSwatches = computed(
107
- () => props.swatches.map(normalizeHex).filter((color) => Boolean(color))
125
+ const presets = computed(
126
+ () => props.swatches.flatMap((swatch) => {
127
+ const entry = typeof swatch === "string" ? { value: swatch } : swatch;
128
+ const value = normalizeHex(entry.value);
129
+ return value ? [{ value, label: entry.label || value }] : [];
130
+ })
108
131
  );
132
+ const tabStop = computed(() => {
133
+ const index = presets.value.findIndex((preset) => preset.value === normalized.value);
134
+ return index >= 0 ? index : 0;
135
+ });
109
136
  const draft = ref(normalized.value ?? "");
110
137
  const draftInvalid = computed(() => draft.value.trim() !== "" && !normalizeHex(draft.value));
138
+ const committedInvalid = ref(false);
139
+ const localError = computed(() => committedInvalid.value && !control.field);
140
+ watch(draftInvalid, (value) => {
141
+ if (!value) committedInvalid.value = false;
142
+ });
143
+ watch(
144
+ () => committedInvalid.value && draftInvalid.value,
145
+ (value) => control.setControlError(value ? invalidText.value : void 0)
146
+ );
147
+ function onSwatchKeydown(event) {
148
+ const list = [
149
+ ...swatchesRef.value?.querySelectorAll('[role="radio"]') ?? []
150
+ ];
151
+ const index = list.indexOf(document.activeElement);
152
+ if (index === -1) return;
153
+ const next = rovingIndex(event.key, index, list.length, "both");
154
+ if (next === null) return;
155
+ event.preventDefault();
156
+ const preset = presets.value[next];
157
+ if (!preset) return;
158
+ model.value = preset.value;
159
+ list[next]?.focus();
160
+ }
111
161
  const swatchColor = computed(() => normalized.value ?? "transparent");
112
162
  watch(normalized, (value) => {
113
163
  if (normalizeHex(draft.value) !== value) draft.value = value ?? "";
@@ -126,7 +176,10 @@ function commit() {
126
176
  return;
127
177
  }
128
178
  const parsed = normalizeHex(draft.value);
129
- if (!parsed) return;
179
+ if (!parsed) {
180
+ committedInvalid.value = true;
181
+ return;
182
+ }
130
183
  model.value = parsed;
131
184
  draft.value = parsed;
132
185
  }
@@ -1,10 +1,12 @@
1
1
  import type { FieldSize } from '../core/types';
2
+ import type { ColorSwatch } from './types';
2
3
  declare const __VLS_export: import("vue").DefineComponent<{
3
- swatches?: string[];
4
+ swatches?: ColorSwatch[];
4
5
  size?: string | number | undefined;
5
6
  placeholder?: string | undefined;
6
7
  pickerLabel?: string;
7
8
  swatchesLabel?: string;
9
+ invalidText?: string;
8
10
  invalid?: boolean;
9
11
  disabled?: (boolean | "true" | "false") | undefined;
10
12
  readonly?: (boolean | "true" | "false") | undefined;
@@ -19,10 +21,13 @@ declare const __VLS_export: import("vue").DefineComponent<{
19
21
  min?: (string | number) | undefined;
20
22
  max?: (string | number) | undefined;
21
23
  pattern?: string | undefined | undefined;
24
+ checked?: any[] | Set<any> | (boolean | "true" | "false") | undefined;
25
+ indeterminate?: boolean | undefined | undefined;
22
26
  title?: string | undefined | undefined;
23
27
  list?: string | undefined | undefined;
24
28
  results?: (string | number) | undefined;
25
29
  name?: string | undefined | undefined;
30
+ dir?: string | undefined | undefined;
26
31
  role?: string | undefined | undefined;
27
32
  'aria-label'?: string | undefined | undefined;
28
33
  'aria-hidden'?: (boolean | "true" | "false") | undefined;
@@ -181,7 +186,6 @@ declare const __VLS_export: import("vue").DefineComponent<{
181
186
  accesskey?: string | undefined | undefined;
182
187
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
183
188
  contextmenu?: string | undefined | undefined;
184
- dir?: string | undefined | undefined;
185
189
  draggable?: (boolean | "true" | "false") | undefined;
186
190
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
187
191
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
@@ -211,7 +215,7 @@ declare const __VLS_export: import("vue").DefineComponent<{
211
215
  is?: string | undefined | undefined;
212
216
  exportparts?: string | undefined;
213
217
  part?: string | undefined;
214
- popover?: (import("../..").PopoverMode | "" | boolean) | undefined;
218
+ popover?: (import("../../index.ts").PopoverMode | "" | boolean) | undefined;
215
219
  autofocus?: (boolean | "true" | "false") | undefined;
216
220
  formaction?: string | undefined | undefined;
217
221
  formenctype?: string | undefined | undefined;
@@ -219,14 +223,12 @@ declare const __VLS_export: import("vue").DefineComponent<{
219
223
  formnovalidate?: (boolean | "true" | "false") | undefined;
220
224
  formtarget?: string | undefined | undefined;
221
225
  popovertarget?: string | undefined;
222
- popovertargetaction?: import("../..").PopoverTargetAction | undefined;
226
+ popovertargetaction?: import("../../index.ts").PopoverTargetAction | undefined;
223
227
  autocomplete?: import("vue").InputAutoCompleteAttribute | undefined;
224
228
  accept?: string | undefined | undefined;
225
229
  alt?: string | undefined | undefined;
226
230
  capture?: boolean | "user" | "environment" | undefined | undefined;
227
- checked?: any[] | Set<any> | (boolean | "true" | "false") | undefined;
228
231
  crossorigin?: string | undefined | undefined;
229
- indeterminate?: boolean | undefined | undefined;
230
232
  maxlength?: (string | number) | undefined;
231
233
  minlength?: (string | number) | undefined;
232
234
  multiple?: (boolean | "true" | "false") | undefined;
@@ -238,11 +240,12 @@ declare const __VLS_export: import("vue").DefineComponent<{
238
240
  }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
239
241
  "update:modelValue": (value: string | null | undefined) => any;
240
242
  }, string, import("vue").PublicProps, Readonly<{
241
- swatches?: string[];
243
+ swatches?: ColorSwatch[];
242
244
  size?: string | number | undefined;
243
245
  placeholder?: string | undefined;
244
246
  pickerLabel?: string;
245
247
  swatchesLabel?: string;
248
+ invalidText?: string;
246
249
  invalid?: boolean;
247
250
  disabled?: (boolean | "true" | "false") | undefined;
248
251
  readonly?: (boolean | "true" | "false") | undefined;
@@ -257,10 +260,13 @@ declare const __VLS_export: import("vue").DefineComponent<{
257
260
  min?: (string | number) | undefined;
258
261
  max?: (string | number) | undefined;
259
262
  pattern?: string | undefined | undefined;
263
+ checked?: any[] | Set<any> | (boolean | "true" | "false") | undefined;
264
+ indeterminate?: boolean | undefined | undefined;
260
265
  title?: string | undefined | undefined;
261
266
  list?: string | undefined | undefined;
262
267
  results?: (string | number) | undefined;
263
268
  name?: string | undefined | undefined;
269
+ dir?: string | undefined | undefined;
264
270
  role?: string | undefined | undefined;
265
271
  'aria-label'?: string | undefined | undefined;
266
272
  'aria-hidden'?: (boolean | "true" | "false") | undefined;
@@ -419,7 +425,6 @@ declare const __VLS_export: import("vue").DefineComponent<{
419
425
  accesskey?: string | undefined | undefined;
420
426
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
421
427
  contextmenu?: string | undefined | undefined;
422
- dir?: string | undefined | undefined;
423
428
  draggable?: (boolean | "true" | "false") | undefined;
424
429
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
425
430
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
@@ -449,7 +454,7 @@ declare const __VLS_export: import("vue").DefineComponent<{
449
454
  is?: string | undefined | undefined;
450
455
  exportparts?: string | undefined;
451
456
  part?: string | undefined;
452
- popover?: (import("../..").PopoverMode | "" | boolean) | undefined;
457
+ popover?: (import("../../index.ts").PopoverMode | "" | boolean) | undefined;
453
458
  autofocus?: (boolean | "true" | "false") | undefined;
454
459
  formaction?: string | undefined | undefined;
455
460
  formenctype?: string | undefined | undefined;
@@ -457,14 +462,12 @@ declare const __VLS_export: import("vue").DefineComponent<{
457
462
  formnovalidate?: (boolean | "true" | "false") | undefined;
458
463
  formtarget?: string | undefined | undefined;
459
464
  popovertarget?: string | undefined;
460
- popovertargetaction?: import("../..").PopoverTargetAction | undefined;
465
+ popovertargetaction?: import("../../index.ts").PopoverTargetAction | undefined;
461
466
  autocomplete?: import("vue").InputAutoCompleteAttribute | undefined;
462
467
  accept?: string | undefined | undefined;
463
468
  alt?: string | undefined | undefined;
464
469
  capture?: boolean | "user" | "environment" | undefined | undefined;
465
- checked?: any[] | Set<any> | (boolean | "true" | "false") | undefined;
466
470
  crossorigin?: string | undefined | undefined;
467
- indeterminate?: boolean | undefined | undefined;
468
471
  maxlength?: (string | number) | undefined;
469
472
  minlength?: (string | number) | undefined;
470
473
  multiple?: (boolean | "true" | "false") | undefined;
@@ -474,7 +477,7 @@ declare const __VLS_export: import("vue").DefineComponent<{
474
477
  "onUpdate:modelValue"?: ((value: string | null | undefined) => any) | undefined;
475
478
  }>, {
476
479
  invalid: boolean;
477
- swatches: string[];
480
+ swatches: ColorSwatch[];
478
481
  placeholder: string;
479
482
  size: FieldSize;
480
483
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
@@ -35,7 +35,7 @@
35
35
  v-if="interactive"
36
36
  type="button"
37
37
  class="k-combobox-tag-remove"
38
- :aria-label="`${removeText} ${labelFor(value)}`"
38
+ :aria-label="removeText(labelFor(value))"
39
39
  @click.stop="remove(value)"
40
40
  >
41
41
  <Icon name="x-mark" />
@@ -167,7 +167,7 @@
167
167
  <slot name="empty" :query="query">{{ emptyLabel }}</slot>
168
168
  </div>
169
169
  </div>
170
- <span class="k-visually-hidden" role="status" aria-live="polite">{{ statusText }}</span>
170
+ <LiveRegion :message="live.message.value" />
171
171
  <template v-if="formName">
172
172
  <input
173
173
  v-for="value in selectedValues"
@@ -197,7 +197,10 @@ import { useLocale } from "../../composables/useLocale";
197
197
  import { useFloatingLayer } from "../../internal/floating/layer";
198
198
  import { nextEnabledIndex } from "../../internal/core/roving";
199
199
  import { useAsyncSearch } from "../../internal/core/search";
200
+ import LiveRegion from "../../internal/core/LiveRegion.vue";
201
+ import { useLiveMessage } from "../../internal/core/live";
200
202
  import { normalizeSearch } from "../../internal/core/text";
203
+ import { translateOr } from "../../locale";
201
204
  import { joinIds } from "../../internal/forms/control";
202
205
  import Icon from "../core/Icon.vue";
203
206
  import Spinner from "../core/Spinner.vue";
@@ -233,12 +236,14 @@ const props = defineProps({
233
236
  class: { type: null, required: false },
234
237
  style: { type: null, required: false }
235
238
  });
236
- const { t } = useLocale();
239
+ const { locale, t } = useLocale();
237
240
  const emptyLabel = computed(() => props.emptyText ?? t("common.noResults"));
238
241
  const loadingLabel = computed(() => props.loadingText ?? t("common.loading"));
239
242
  const clearText = computed(() => props.clearLabel ?? t("combobox.clear"));
240
243
  const toggleText = computed(() => props.toggleLabel ?? t("combobox.toggle"));
241
- const removeText = computed(() => props.removeLabel ?? t("common.remove"));
244
+ function removeText(label) {
245
+ return translateOr(locale.value, props.removeLabel, "common.removeItem", { label });
246
+ }
242
247
  const listText = computed(() => props.listLabel ?? t("combobox.list"));
243
248
  function buildCreateText(text) {
244
249
  return props.createText ? props.createText(text) : t("combobox.create", { query: text });
@@ -363,6 +368,11 @@ const statusText = computed(() => {
363
368
  const count = items.value.length;
364
369
  return props.resultsText ? props.resultsText(count) : t("combobox.results", { count });
365
370
  });
371
+ const live = useLiveMessage();
372
+ watch([statusText, query], ([text]) => {
373
+ if (text) live.announce(text);
374
+ else live.clear();
375
+ });
366
376
  function keyOf(value) {
367
377
  return String(value);
368
378
  }
@@ -500,6 +510,10 @@ function onKeydown(event) {
500
510
  } else if (query.value) {
501
511
  event.preventDefault();
502
512
  resetQuery();
513
+ } else if (showClear.value && !props.multiple) {
514
+ event.preventDefault();
515
+ event.stopPropagation();
516
+ clear();
503
517
  }
504
518
  break;
505
519
  case "Backspace":