@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
@@ -3,11 +3,16 @@ export interface ChartSeries {
3
3
  data: (number | null)[];
4
4
  color?: string;
5
5
  }
6
+ export type ChartPointStyle = 'circle' | 'rect' | 'triangle' | 'rectRot' | 'star' | 'crossRot';
7
+ export type ChartBarPattern = 'solid' | 'diagonal' | 'reverse' | 'horizontal' | 'dots' | 'cross';
6
8
  export interface ChartLegendItem {
7
9
  label: string;
8
10
  color: string;
9
11
  hidden?: boolean;
10
12
  value?: string;
13
+ dash?: number[];
14
+ point?: ChartPointStyle;
15
+ pattern?: ChartBarPattern;
11
16
  }
12
17
  export type ChartLegendPosition = 'bottom' | 'right';
13
18
  export type ChartValueFormatter = (value: number) => string;
@@ -4,7 +4,7 @@ const fallbackColors = {
4
4
  text: "rgb(17, 17, 20)",
5
5
  textToned: "rgb(59, 59, 66)",
6
6
  textMuted: "rgb(107, 107, 117)",
7
- textDimmed: "rgb(157, 157, 167)",
7
+ textDimmed: "rgb(133, 133, 142)",
8
8
  grid: "rgb(231, 231, 234)",
9
9
  line: "rgb(216, 216, 221)",
10
10
  surface: "rgb(255, 255, 255)",
@@ -31,9 +31,11 @@
31
31
  v-else
32
32
  v-bind="$attrs"
33
33
  :type="type"
34
- :disabled="inactive || void 0"
34
+ :disabled="disabled || void 0"
35
+ :aria-disabled="busy && !disabled ? 'true' : ariaDisabledAttr"
35
36
  :aria-busy="busy ? 'true' : void 0"
36
37
  :class="classes"
38
+ @click.capture="onBusyClick"
37
39
  >
38
40
  <ButtonContent v-bind="contentProps"
39
41
  ><slot>{{ label }}</slot></ButtonContent
@@ -88,6 +90,14 @@ const classes = computed(() => [
88
90
  `k-btn-${props.variant}`,
89
91
  { "is-block": props.block, "is-icon": iconOnly.value, "is-loading": busy.value }
90
92
  ]);
93
+ const ariaDisabledAttr = computed(
94
+ () => attrs["aria-disabled"]
95
+ );
96
+ function onBusyClick(event) {
97
+ if (!busy.value) return;
98
+ event.preventDefault();
99
+ event.stopImmediatePropagation();
100
+ }
91
101
  const contentProps = computed(() => ({
92
102
  busy: busy.value,
93
103
  hasLabel: hasLabel.value,
@@ -459,9 +459,9 @@ declare const __VLS_base: import("vue").DefineComponent<{
459
459
  popovertarget?: string | undefined;
460
460
  popovertargetaction?: import("../../index.ts").PopoverTargetAction | undefined;
461
461
  }> & Readonly<{}>, {
462
+ tone: Tone;
462
463
  size: ButtonSize;
463
464
  type: "submit" | "button" | "reset";
464
- tone: Tone;
465
465
  variant: ButtonVariant;
466
466
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
467
467
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
@@ -7,6 +7,7 @@
7
7
  >
8
8
  <Icon v-if="resolvedIcon" :name="resolvedIcon" class="k-field-message-icon" />
9
9
  <span class="k-field-message-text"
10
+ ><span v-if="prefix" class="k-visually-hidden">{{ prefix }}: </span
10
11
  ><slot>{{ message }}</slot></span
11
12
  >
12
13
  </p>
@@ -14,6 +15,7 @@
14
15
 
15
16
  <script setup>
16
17
  import { computed } from "vue";
18
+ import { useLocale } from "../../composables/useLocale";
17
19
  import { toneIcons } from "../../internal/core/tone";
18
20
  import Icon from "./Icon.vue";
19
21
  const props = defineProps({
@@ -22,6 +24,10 @@ const props = defineProps({
22
24
  icon: { type: [String, Object, Boolean], required: false, skipCheck: true, default: void 0 },
23
25
  id: { type: String, required: false }
24
26
  });
27
+ const { t } = useLocale();
28
+ const prefix = computed(
29
+ () => props.tone === "danger" ? t("tone.danger") : props.tone === "warning" ? t("tone.warning") : ""
30
+ );
25
31
  const resolvedIcon = computed(
26
32
  () => props.icon === false ? void 0 : props.icon ?? toneIcons[props.tone]
27
33
  );
@@ -397,7 +397,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
397
397
  ref_key?: string | undefined | undefined;
398
398
  }> & Readonly<{}>, {
399
399
  icon: false | IconName;
400
- tone: "neutral" | "warning" | "danger";
400
+ tone: "danger" | "warning" | "neutral";
401
401
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
402
402
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
403
403
  declare const _default: typeof __VLS_export;
@@ -101,10 +101,27 @@ async function submit() {
101
101
  if (!props.focusOnError) return false;
102
102
  await nextTick();
103
103
  const control = rootRef.value?.querySelector('[aria-invalid="true"]');
104
- if (control) control.focus();
104
+ if (control) focusControl(control);
105
105
  else rootRef.value?.querySelector(".k-form-alerts")?.focus();
106
106
  return false;
107
107
  }
108
+ const FOCUS_TARGETS = [
109
+ "input:checked:not(:disabled)",
110
+ '[aria-checked="true"]:not(:disabled, [aria-disabled="true"])',
111
+ '[aria-selected="true"]:not(:disabled, [aria-disabled="true"])',
112
+ '[tabindex="0"]:not(:disabled, [aria-disabled="true"])',
113
+ 'input:not([type="hidden"], :disabled), select:not(:disabled), textarea:not(:disabled), button:not(:disabled), [contenteditable="true"], [tabindex]:not([tabindex="-1"])'
114
+ ];
115
+ function focusControl(control) {
116
+ control.focus();
117
+ if (document.activeElement === control) return;
118
+ for (const selector of FOCUS_TARGETS) {
119
+ const target = control.querySelector(selector);
120
+ if (!target) continue;
121
+ target.focus();
122
+ if (document.activeElement === target) return;
123
+ }
124
+ }
108
125
  function reset() {
109
126
  props.form.reset();
110
127
  emit("reset");
@@ -1,30 +1,68 @@
1
1
  <template>
2
- <div v-if="errorList.length || warningList.length" class="k-form-alerts" tabindex="-1">
2
+ <div
3
+ v-if="errorList.length || warningList.length"
4
+ ref="root"
5
+ v-bind="$attrs"
6
+ class="k-form-alerts"
7
+ tabindex="-1"
8
+ >
3
9
  <Alert
4
10
  v-for="message in errorList"
5
11
  :key="`error:${message}`"
6
12
  tone="danger"
13
+ role="none"
7
14
  :description="message"
8
15
  />
9
16
  <Alert
10
17
  v-for="message in warningList"
11
18
  :key="`warning:${message}`"
12
19
  tone="warning"
13
- role="status"
20
+ role="none"
14
21
  :description="message"
15
22
  />
16
23
  </div>
24
+ <LiveRegion :message="warningMessage" />
25
+ <LiveRegion :message="errorLive.message.value" assertive />
17
26
  </template>
18
27
 
19
28
  <script setup>
20
- import { computed } from "vue";
29
+ import { computed, nextTick, onBeforeUnmount, useTemplateRef, watch } from "vue";
21
30
  import { useFormContext } from "../../composables/useForm";
31
+ import { useLocale } from "../../composables/useLocale";
32
+ import { hasFocusWithin } from "../../internal/core/focus";
33
+ import LiveRegion from "../../internal/core/LiveRegion.vue";
34
+ import { LIVE_DELAY, useLiveMessage } from "../../internal/core/live";
22
35
  import Alert from "../feedback/Alert.vue";
36
+ defineOptions({ inheritAttrs: false });
23
37
  const props = defineProps({
24
38
  errors: { type: Array, required: false },
25
39
  warnings: { type: Array, required: false }
26
40
  });
27
41
  const form = useFormContext();
42
+ const { t } = useLocale();
28
43
  const errorList = computed(() => props.errors ?? form?.rootErrors?.value ?? []);
29
44
  const warningList = computed(() => props.warnings ?? form?.rootWarnings?.value ?? []);
45
+ const root = useTemplateRef("root");
46
+ const errorLive = useLiveMessage();
47
+ let errorTimer;
48
+ watch(
49
+ () => errorList.value.join("\n"),
50
+ async (text) => {
51
+ clearTimeout(errorTimer);
52
+ errorLive.clear();
53
+ if (!text) return;
54
+ await nextTick();
55
+ errorTimer = setTimeout(() => {
56
+ if (hasFocusWithin(root.value)) return;
57
+ errorLive.announce(
58
+ errorList.value.map((message) => `${t("tone.danger")}: ${message}`).join(" ")
59
+ );
60
+ }, LIVE_DELAY);
61
+ },
62
+ { flush: "post" }
63
+ );
64
+ onBeforeUnmount(() => clearTimeout(errorTimer));
65
+ const warningMessage = computed(
66
+ () => errorList.value.length || !warningList.value.length ? "" : warningList.value.map((message) => `${t("tone.warning")}: ${message}`).join(" ")
67
+ );
30
68
  </script>
@@ -22,6 +22,9 @@
22
22
  ><slot name="label">{{ label }}</slot></span
23
23
  >
24
24
  <span v-if="isRequired" class="k-form-field-required" aria-hidden="true">*</span>
25
+ <span v-if="isRequired && showRequiredHint" class="k-visually-hidden">{{
26
+ t("form.requiredHint")
27
+ }}</span>
25
28
  </label>
26
29
  <span v-if="hint || $slots.hint" :id="hintId" class="k-form-field-hint">
27
30
  <slot name="hint">{{ hint }}</slot>
@@ -36,28 +39,32 @@
36
39
  >
37
40
  <slot name="description">{{ description }}</slot>
38
41
  </p>
39
- <FieldMessage
40
- v-if="errorMessage"
41
- :id="messageId"
42
- key="error"
43
- tone="danger"
44
- class="k-form-field-error"
45
- :message="errorMessage"
46
- />
47
- <FieldMessage
48
- v-else-if="warningMessage"
49
- :id="messageId"
50
- key="warning"
51
- tone="warning"
52
- class="k-form-field-warning"
53
- :message="warningMessage"
54
- />
42
+ <div class="k-form-field-messages" aria-live="polite">
43
+ <FieldMessage
44
+ v-if="errorMessage"
45
+ :id="messageId"
46
+ key="error"
47
+ tone="danger"
48
+ class="k-form-field-error"
49
+ :message="errorMessage"
50
+ />
51
+ <FieldMessage
52
+ v-else-if="warningMessage"
53
+ :id="messageId"
54
+ key="warning"
55
+ tone="warning"
56
+ class="k-form-field-warning"
57
+ :message="warningMessage"
58
+ />
59
+ </div>
55
60
  </div>
56
61
  </template>
57
62
 
58
63
  <script setup>
59
64
  import { computed, provide, ref, shallowReactive, useId, useSlots, watch } from "vue";
60
65
  import { useFormContext } from "../../composables/useForm";
66
+ import { useLocale } from "../../composables/useLocale";
67
+ import { joinIds } from "../../internal/forms/control";
61
68
  import { FIELD_KEY, FIELD_ROLE_KEY } from "../../internal/keys";
62
69
  import FieldMessage from "./FieldMessage.vue";
63
70
  import Icon from "./Icon.vue";
@@ -75,6 +82,7 @@ const props = defineProps({
75
82
  });
76
83
  const slots = useSlots();
77
84
  const form = useFormContext();
85
+ const { t } = useLocale();
78
86
  const baseId = useId();
79
87
  const id = computed(() => props.id ?? `${baseId}-control`);
80
88
  const labelId = `${baseId}-label`;
@@ -96,6 +104,14 @@ function setLabelable(labelable, source) {
96
104
  const labelFor = computed(
97
105
  () => [...labelables.values()].some((labelable) => !labelable) ? void 0 : id.value
98
106
  );
107
+ const requiredHints = shallowReactive(/* @__PURE__ */ new Map());
108
+ function setRequiredHint(hint, source) {
109
+ if (hint === void 0) requiredHints.delete(source);
110
+ else requiredHints.set(source, hint);
111
+ }
112
+ const showRequiredHint = computed(
113
+ () => labelFor.value === void 0 || [...requiredHints.values()].some(Boolean)
114
+ );
99
115
  const errorMessage = computed(() => {
100
116
  if (props.error) return props.error;
101
117
  const formError = props.error !== false && props.name ? form?.errors[props.name] : void 0;
@@ -109,28 +125,31 @@ const warningMessage = computed(() => {
109
125
  const isRequired = computed(
110
126
  () => props.required || Boolean(props.name && form?.isRequired(props.name))
111
127
  );
128
+ const hasLabel = computed(() => Boolean(props.label || slots.label));
112
129
  const hasLabelRow = computed(
113
130
  () => Boolean(props.label || props.hint || slots.label || slots.hint || slots["label-actions"])
114
131
  );
115
- const describedBy = computed(() => {
116
- const ids = [];
117
- if (props.hint || slots.hint) ids.push(hintId);
118
- if (props.description || slots.description) ids.push(descriptionId);
119
- if (errorMessage.value || warningMessage.value) ids.push(messageId);
120
- return ids.length ? ids.join(" ") : void 0;
121
- });
132
+ const describedBy = computed(
133
+ () => joinIds(
134
+ (props.hint || slots.hint) && hintId,
135
+ (props.description || slots.description) && descriptionId,
136
+ (errorMessage.value || warningMessage.value) && messageId
137
+ )
138
+ );
122
139
  const context = {
123
140
  get id() {
124
141
  return id.value;
125
142
  },
126
143
  labelId,
144
+ hasLabel,
127
145
  name: computed(() => props.name),
128
146
  describedBy,
129
147
  invalid: computed(() => Boolean(errorMessage.value)),
130
148
  required: isRequired,
131
149
  disabled: computed(() => Boolean(props.disabled)),
132
150
  setControlError,
133
- setLabelable
151
+ setLabelable,
152
+ setRequiredHint
134
153
  };
135
154
  provide(FIELD_KEY, context);
136
155
  provide(FIELD_ROLE_KEY, "primary");
@@ -29,11 +29,14 @@ declare const __VLS_base: import("vue").DefineComponent<{
29
29
  min?: (string | number) | undefined;
30
30
  max?: (string | number) | undefined;
31
31
  pattern?: string | undefined | undefined;
32
+ checked?: any[] | Set<any> | (boolean | "true" | "false") | undefined;
33
+ indeterminate?: boolean | undefined | undefined;
32
34
  title?: string | undefined | undefined;
33
35
  list?: string | undefined | undefined;
34
36
  results?: (string | number) | undefined;
35
37
  placeholder?: string | undefined | undefined;
36
38
  name?: string | undefined | undefined;
39
+ dir?: string | undefined | undefined;
37
40
  role?: string | undefined | undefined;
38
41
  'aria-label'?: string | undefined | undefined;
39
42
  'aria-hidden'?: (boolean | "true" | "false") | undefined;
@@ -191,7 +194,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
191
194
  accesskey?: string | undefined | undefined;
192
195
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
193
196
  contextmenu?: string | undefined | undefined;
194
- dir?: string | undefined | undefined;
195
197
  draggable?: (boolean | "true" | "false") | undefined;
196
198
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
197
199
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
@@ -234,9 +236,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
234
236
  accept?: string | undefined | undefined;
235
237
  alt?: string | undefined | undefined;
236
238
  capture?: boolean | "user" | "environment" | undefined | undefined;
237
- checked?: any[] | Set<any> | (boolean | "true" | "false") | undefined;
238
239
  crossorigin?: string | undefined | undefined;
239
- indeterminate?: boolean | undefined | undefined;
240
240
  maxlength?: (string | number) | undefined;
241
241
  minlength?: (string | number) | undefined;
242
242
  multiple?: (boolean | "true" | "false") | undefined;
@@ -272,11 +272,14 @@ declare const __VLS_base: import("vue").DefineComponent<{
272
272
  min?: (string | number) | undefined;
273
273
  max?: (string | number) | undefined;
274
274
  pattern?: string | undefined | undefined;
275
+ checked?: any[] | Set<any> | (boolean | "true" | "false") | undefined;
276
+ indeterminate?: boolean | undefined | undefined;
275
277
  title?: string | undefined | undefined;
276
278
  list?: string | undefined | undefined;
277
279
  results?: (string | number) | undefined;
278
280
  placeholder?: string | undefined | undefined;
279
281
  name?: string | undefined | undefined;
282
+ dir?: string | undefined | undefined;
280
283
  role?: string | undefined | undefined;
281
284
  'aria-label'?: string | undefined | undefined;
282
285
  'aria-hidden'?: (boolean | "true" | "false") | undefined;
@@ -434,7 +437,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
434
437
  accesskey?: string | undefined | undefined;
435
438
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
436
439
  contextmenu?: string | undefined | undefined;
437
- dir?: string | undefined | undefined;
438
440
  draggable?: (boolean | "true" | "false") | undefined;
439
441
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
440
442
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
@@ -477,9 +479,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
477
479
  accept?: string | undefined | undefined;
478
480
  alt?: string | undefined | undefined;
479
481
  capture?: boolean | "user" | "environment" | undefined | undefined;
480
- checked?: any[] | Set<any> | (boolean | "true" | "false") | undefined;
481
482
  crossorigin?: string | undefined | undefined;
482
- indeterminate?: boolean | undefined | undefined;
483
483
  maxlength?: (string | number) | undefined;
484
484
  minlength?: (string | number) | undefined;
485
485
  multiple?: (boolean | "true" | "false") | undefined;
@@ -5,6 +5,8 @@
5
5
  class="k-root"
6
6
  :data-theme="dataTheme"
7
7
  :data-preset="dataPreset"
8
+ :lang="lang"
9
+ :dir="dir"
8
10
  :style="rootStyle"
9
11
  >
10
12
  <slot />
@@ -16,7 +18,7 @@ import { Polymorphic } from "../../internal/core/Polymorphic";
16
18
  import { computed, inject, provide } from "vue";
17
19
  import { resolvePresetStore } from "../../internal/core/preset";
18
20
  import { resolveThemeStore } from "../../internal/core/theme";
19
- import { ROOT_KEY } from "../../internal/keys";
21
+ import { LOCALE_KEY, ROOT_KEY } from "../../internal/keys";
20
22
  defineOptions({ inheritAttrs: false });
21
23
  const props = defineProps({
22
24
  theme: { type: String, required: false },
@@ -33,6 +35,9 @@ const store = resolveThemeStore();
33
35
  const presetStore = resolvePresetStore();
34
36
  const nested = inject(ROOT_KEY, false);
35
37
  provide(ROOT_KEY, true);
38
+ const locale = inject(LOCALE_KEY, null);
39
+ const lang = computed(() => nested ? void 0 : locale?.value.code);
40
+ const dir = computed(() => nested ? void 0 : locale?.value.dir);
36
41
  const dataTheme = computed(() => props.theme ?? (nested ? void 0 : store.value));
37
42
  const dataPreset = computed(() => props.preset ?? (nested ? void 0 : presetStore.value));
38
43
  const rootStyle = computed(() => {
@@ -24,6 +24,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
24
24
  results?: (string | number) | undefined;
25
25
  placeholder?: string | undefined;
26
26
  bind?: Record<string, unknown>;
27
+ dir?: string | undefined;
27
28
  class?: import("vue").ClassValue;
28
29
  role?: string | undefined;
29
30
  'aria-label'?: string | undefined;
@@ -183,7 +184,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
183
184
  accesskey?: string | undefined;
184
185
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
185
186
  contextmenu?: string | undefined;
186
- dir?: string | undefined;
187
187
  draggable?: (boolean | "true" | "false") | undefined;
188
188
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
189
189
  enterKeyHint?: import("vue").HTMLAttributes["enterkeyhint"];
@@ -242,6 +242,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
242
242
  results?: (string | number) | undefined;
243
243
  placeholder?: string | undefined;
244
244
  bind?: Record<string, unknown>;
245
+ dir?: string | undefined;
245
246
  class?: import("vue").ClassValue;
246
247
  role?: string | undefined;
247
248
  'aria-label'?: string | undefined;
@@ -401,7 +402,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
401
402
  accesskey?: string | undefined;
402
403
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
403
404
  contextmenu?: string | undefined;
404
- dir?: string | undefined;
405
405
  draggable?: (boolean | "true" | "false") | undefined;
406
406
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
407
407
  enterKeyHint?: import("vue").HTMLAttributes["enterkeyhint"];
@@ -1,27 +1,22 @@
1
1
  <template>
2
- <div
3
- v-if="block"
4
- class="k-spinner-block"
5
- :role="decorative ? void 0 : 'status'"
6
- :aria-hidden="decorative ? 'true' : void 0"
7
- >
2
+ <div v-if="block" class="k-spinner-block" :aria-hidden="decorative ? 'true' : void 0">
8
3
  <span class="k-spinner" :class="`k-spinner-${size}`" aria-hidden="true" />
9
- <span v-if="label" class="k-spinner-label">{{ label }}</span>
10
- <span v-else-if="!decorative" class="k-visually-hidden">{{ text }}</span>
4
+ <span v-if="label" class="k-spinner-label" aria-hidden="true">{{ label }}</span>
5
+ <LiveRegion v-if="!decorative" :message="text" />
11
6
  </div>
12
7
  <span
13
8
  v-else
14
9
  class="k-spinner"
15
10
  :class="`k-spinner-${size}`"
16
- :role="decorative ? void 0 : 'status'"
17
- :aria-label="decorative ? void 0 : text"
18
11
  :aria-hidden="decorative ? 'true' : void 0"
19
- />
12
+ ><LiveRegion v-if="!decorative" :message="text"
13
+ /></span>
20
14
  </template>
21
15
 
22
16
  <script setup>
23
17
  import { computed } from "vue";
24
18
  import { useLocale } from "../../composables/useLocale";
19
+ import LiveRegion from "../../internal/core/LiveRegion.vue";
25
20
  const props = defineProps({
26
21
  size: { type: String, required: false, default: "md" },
27
22
  label: { type: String, required: false },
@@ -48,7 +48,7 @@ declare const __VLS_export: import("vue").DefineComponent<{
48
48
  is?: string | undefined | undefined;
49
49
  exportparts?: string | undefined;
50
50
  part?: string | undefined;
51
- popover?: (import("../..").PopoverMode | "" | boolean) | undefined;
51
+ popover?: (import("../../index.ts").PopoverMode | "" | boolean) | undefined;
52
52
  'aria-activedescendant'?: string | undefined | undefined;
53
53
  'aria-atomic'?: (boolean | "true" | "false") | undefined;
54
54
  'aria-autocomplete'?: "none" | "inline" | "list" | "both" | undefined | undefined;
@@ -245,7 +245,7 @@ declare const __VLS_export: import("vue").DefineComponent<{
245
245
  is?: string | undefined | undefined;
246
246
  exportparts?: string | undefined;
247
247
  part?: string | undefined;
248
- popover?: (import("../..").PopoverMode | "" | boolean) | undefined;
248
+ popover?: (import("../../index.ts").PopoverMode | "" | boolean) | undefined;
249
249
  'aria-activedescendant'?: string | undefined | undefined;
250
250
  'aria-atomic'?: (boolean | "true" | "false") | undefined;
251
251
  'aria-autocomplete'?: "none" | "inline" | "list" | "both" | undefined | undefined;
@@ -25,6 +25,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
25
25
  results?: (string | number) | undefined;
26
26
  placeholder?: string | undefined | undefined;
27
27
  name?: string | undefined | undefined;
28
+ dir?: string | undefined | undefined;
28
29
  role?: string | undefined | undefined;
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;
@@ -244,6 +244,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
244
244
  results?: (string | number) | undefined;
245
245
  placeholder?: string | undefined | undefined;
246
246
  name?: string | undefined | undefined;
247
+ dir?: string | undefined | undefined;
247
248
  role?: string | undefined | undefined;
248
249
  'aria-label'?: string | undefined | undefined;
249
250
  'aria-hidden'?: (boolean | "true" | "false") | undefined;
@@ -398,7 +399,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
398
399
  accesskey?: string | undefined | undefined;
399
400
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
400
401
  contextmenu?: string | undefined | undefined;
401
- dir?: string | undefined | undefined;
402
402
  draggable?: (boolean | "true" | "false") | undefined;
403
403
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
404
404
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
@@ -14,6 +14,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
14
14
  results?: (string | number) | undefined;
15
15
  placeholder?: string | undefined;
16
16
  bind?: Record<string, unknown>;
17
+ dir?: string | undefined;
17
18
  class?: import("vue").ClassValue;
18
19
  role?: string | undefined;
19
20
  'aria-label'?: string | undefined;
@@ -173,7 +174,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
173
174
  accesskey?: string | undefined;
174
175
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
175
176
  contextmenu?: string | undefined;
176
- dir?: string | undefined;
177
177
  draggable?: (boolean | "true" | "false") | undefined;
178
178
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
179
179
  enterKeyHint?: import("vue").HTMLAttributes["enterkeyhint"];
@@ -225,6 +225,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
225
225
  results?: (string | number) | undefined;
226
226
  placeholder?: string | undefined;
227
227
  bind?: Record<string, unknown>;
228
+ dir?: string | undefined;
228
229
  class?: import("vue").ClassValue;
229
230
  role?: string | undefined;
230
231
  'aria-label'?: string | undefined;
@@ -384,7 +385,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
384
385
  accesskey?: string | undefined;
385
386
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
386
387
  contextmenu?: string | undefined;
387
- dir?: string | undefined;
388
388
  draggable?: (boolean | "true" | "false") | undefined;
389
389
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
390
390
  enterKeyHint?: import("vue").HTMLAttributes["enterkeyhint"];
@@ -2,9 +2,9 @@
2
2
  <span
3
3
  class="k-avatar"
4
4
  :class="[`k-avatar-${size}`, `k-avatar-${shape}`, { 'has-image': showImage }]"
5
- :role="decorative ? void 0 : 'img'"
6
- :aria-label="decorative ? void 0 : accessibleName"
7
- :aria-hidden="decorative ? 'true' : void 0"
5
+ :role="hidden ? void 0 : 'img'"
6
+ :aria-label="hidden ? void 0 : accessibleName"
7
+ :aria-hidden="hidden ? 'true' : void 0"
8
8
  >
9
9
  <span class="k-avatar-fallback" aria-hidden="true">
10
10
  <slot name="fallback">
@@ -48,9 +48,12 @@ const failed = ref(false);
48
48
  const loaded = ref(false);
49
49
  const showImage = computed(() => Boolean(props.src && !failed.value));
50
50
  const accessibleName = computed(() => {
51
- const base = props.alt ?? props.name ?? t("avatar.label");
52
- return props.status ? `${base} (${t(`avatar.${props.status}`)})` : base;
51
+ const base = props.alt ?? props.name ?? "";
52
+ const status = props.status ? t(`avatar.${props.status}`) : "";
53
+ if (base && status) return `${base} (${status})`;
54
+ return base || status;
53
55
  });
56
+ const hidden = computed(() => props.decorative || !accessibleName.value);
54
57
  const initials = computed(() => {
55
58
  const words = (props.name ?? "").trim().split(/\s+/).filter(Boolean);
56
59
  if (!words.length) return "";
@@ -15,7 +15,7 @@
15
15
  class="k-avatar k-avatar-more"
16
16
  :class="[`k-avatar-${size}`, `k-avatar-${shape}`]"
17
17
  role="img"
18
- :aria-label="`${hidden} ${moreText}`"
18
+ :aria-label="moreText"
19
19
  >
20
20
  <span class="k-avatar-fallback" aria-hidden="true">+{{ hidden }}</span>
21
21
  </span>
@@ -26,6 +26,7 @@
26
26
  <script setup>
27
27
  import { computed } from "vue";
28
28
  import { useLocale } from "../../composables/useLocale";
29
+ import { translateOr } from "../../locale";
29
30
  import Avatar from "./Avatar.vue";
30
31
  const props = defineProps({
31
32
  items: { type: Array, required: false, default: () => [] },
@@ -35,10 +36,12 @@ const props = defineProps({
35
36
  label: { type: String, required: false },
36
37
  moreLabel: { type: String, required: false }
37
38
  });
38
- const { t } = useLocale();
39
- const moreText = computed(() => props.moreLabel ?? t("avatarGroup.more"));
39
+ const { locale } = useLocale();
40
40
  const visible = computed(
41
41
  () => props.max && props.items.length > props.max ? props.items.slice(0, props.max) : props.items
42
42
  );
43
43
  const hidden = computed(() => props.items.length - visible.value.length);
44
+ const moreText = computed(
45
+ () => translateOr(locale.value, props.moreLabel, "avatarGroup.more", { count: hidden.value })
46
+ );
44
47
  </script>
@@ -406,8 +406,8 @@ declare const __VLS_base: import("vue").DefineComponent<{
406
406
  ref_for?: boolean | undefined | undefined;
407
407
  ref_key?: string | undefined | undefined;
408
408
  }> & Readonly<{}>, {
409
- size: BadgeSize;
410
409
  tone: Tone;
410
+ size: BadgeSize;
411
411
  variant: BadgeVariant;
412
412
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
413
413
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;