@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
@@ -41,6 +41,7 @@ declare const __VLS_export: <T extends object>(__VLS_props: NonNullable<Awaited<
41
41
  errorTitle?: string;
42
42
  retryLabel?: string;
43
43
  selectedText?: (count: number) => string;
44
+ resultsText?: (count: number) => string;
44
45
  } & {
45
46
  page?: number;
46
47
  pageSize?: number;
@@ -11,6 +11,7 @@
11
11
  :brand-icon="brandIcon"
12
12
  :brand-logo="brandLogo"
13
13
  :fill="fill"
14
+ :level="level"
14
15
  :on-home="onHome"
15
16
  >
16
17
  <template v-if="$slots.actions" #actions><slot name="actions" /></template>
@@ -31,6 +32,7 @@ defineProps({
31
32
  brandIcon: { type: null, required: false },
32
33
  brandLogo: { type: String, required: false },
33
34
  fill: { type: Boolean, required: false, default: true },
35
+ level: { type: Number, required: false, default: 1 },
34
36
  onHome: { type: Function, required: false }
35
37
  });
36
38
  </script>
@@ -1,5 +1,6 @@
1
1
  import type { IconName } from '../../composables/useIcons';
2
2
  import type { LinkTarget } from '../core/types';
3
+ import type { HeadingLevel } from '../layout/types';
3
4
  declare var __VLS_8: {}, __VLS_11: {}, __VLS_13: {};
4
5
  type __VLS_Slots = {} & {
5
6
  actions?: (props: typeof __VLS_8) => any;
@@ -18,6 +19,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
18
19
  brandIcon?: IconName;
19
20
  brandLogo?: string;
20
21
  fill?: boolean;
22
+ level?: HeadingLevel;
21
23
  onHome?: () => void;
22
24
  error?: import("./types.ts").ErrorLike | null;
23
25
  statusCode?: number;
@@ -230,6 +232,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
230
232
  brandIcon?: IconName;
231
233
  brandLogo?: string;
232
234
  fill?: boolean;
235
+ level?: HeadingLevel;
233
236
  onHome?: () => void;
234
237
  error?: import("./types.ts").ErrorLike | null;
235
238
  statusCode?: number;
@@ -436,6 +439,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
436
439
  fill: boolean;
437
440
  message: string;
438
441
  title: string;
442
+ level: HeadingLevel;
439
443
  backLabel: string | false;
440
444
  homeTo: LinkTarget;
441
445
  homeLabel: string | false;
@@ -1,8 +1,9 @@
1
1
  <template>
2
- <div class="k-savebar-slot" :class="{ 'is-visible': visible }">
3
- <p class="k-visually-hidden" role="status">{{ visible ? messageText : "" }}</p>
2
+ <div ref="slotRef" class="k-savebar-slot" :class="{ 'is-visible': visible }" tabindex="-1">
3
+ <LiveRegion :message="visible ? messageText : ''" />
4
4
  <div
5
5
  v-if="visible"
6
+ ref="barRef"
6
7
  class="k-savebar"
7
8
  role="region"
8
9
  :aria-label="labelText"
@@ -38,8 +39,10 @@
38
39
  </template>
39
40
 
40
41
  <script setup>
41
- import { computed } from "vue";
42
+ import { computed, useTemplateRef, watch } from "vue";
42
43
  import { useLocale } from "../../composables/useLocale";
44
+ import { focusStable, hasFocusWithin } from "../../internal/core/focus";
45
+ import LiveRegion from "../../internal/core/LiveRegion.vue";
43
46
  import Button from "../core/Button.vue";
44
47
  const props = defineProps({
45
48
  visible: { type: Boolean, required: false, default: true },
@@ -58,4 +61,16 @@ const discardText = computed(
58
61
  () => props.discardLabel === void 0 ? t("common.discard") : props.discardLabel
59
62
  );
60
63
  const emit = defineEmits(["save", "discard"]);
64
+ const slotRef = useTemplateRef("slotRef");
65
+ const barRef = useTemplateRef("barRef");
66
+ watch(
67
+ () => props.visible,
68
+ (visible) => {
69
+ if (visible || !hasFocusWithin(barRef.value)) return;
70
+ const form = props.form ? document.getElementById(props.form) : null;
71
+ const target = form ?? slotRef.value;
72
+ if (target) focusStable(target);
73
+ },
74
+ { flush: "pre" }
75
+ );
61
76
  </script>
@@ -1,8 +1,8 @@
1
- declare var __VLS_1: {}, __VLS_3: {};
1
+ declare var __VLS_6: {}, __VLS_8: {};
2
2
  type __VLS_Slots = {} & {
3
- default?: (props: typeof __VLS_1) => any;
3
+ default?: (props: typeof __VLS_6) => any;
4
4
  } & {
5
- actions?: (props: typeof __VLS_3) => any;
5
+ actions?: (props: typeof __VLS_8) => any;
6
6
  };
7
7
  declare const __VLS_base: import("vue").DefineComponent<{
8
8
  visible?: boolean;
@@ -18,6 +18,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
18
18
  style?: import("vue").StyleValue;
19
19
  results?: (string | number) | undefined;
20
20
  placeholder?: string | undefined | undefined;
21
+ dir?: string | undefined | undefined;
21
22
  class?: import("vue").ClassValue;
22
23
  role?: string | undefined | undefined;
23
24
  'aria-label'?: string | undefined | undefined;
@@ -173,7 +174,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
173
174
  accesskey?: string | undefined | undefined;
174
175
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
175
176
  contextmenu?: string | undefined | undefined;
176
- dir?: string | undefined | undefined;
177
177
  draggable?: (boolean | "true" | "false") | undefined;
178
178
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
179
179
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
@@ -221,6 +221,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
221
221
  style?: import("vue").StyleValue;
222
222
  results?: (string | number) | undefined;
223
223
  placeholder?: string | undefined | undefined;
224
+ dir?: string | undefined | undefined;
224
225
  class?: import("vue").ClassValue;
225
226
  role?: string | undefined | undefined;
226
227
  'aria-label'?: string | undefined | undefined;
@@ -376,7 +377,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
376
377
  accesskey?: string | undefined | undefined;
377
378
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
378
379
  contextmenu?: string | undefined | undefined;
379
- dir?: string | undefined | undefined;
380
380
  draggable?: (boolean | "true" | "false") | undefined;
381
381
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
382
382
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
@@ -14,7 +14,7 @@
14
14
  </div>
15
15
  </div>
16
16
  <div v-if="$slots.default" class="k-settings-group-body">
17
- <slot />
17
+ <slot :heading-id="headingId" />
18
18
  </div>
19
19
  </section>
20
20
  </template>
@@ -1,4 +1,6 @@
1
- declare var __VLS_7: {}, __VLS_9: {}, __VLS_11: {}, __VLS_13: {};
1
+ declare var __VLS_7: {}, __VLS_9: {}, __VLS_11: {}, __VLS_13: {
2
+ headingId: string;
3
+ };
2
4
  type __VLS_Slots = {} & {
3
5
  label?: (props: typeof __VLS_7) => any;
4
6
  } & {
@@ -6,7 +6,7 @@
6
6
  flush
7
7
  hide-close
8
8
  :sheet="false"
9
- :aria-label="titleText"
9
+ :label="titleText"
10
10
  :before-close="beforeClose"
11
11
  @open="emit('open')"
12
12
  @close="emit('close')"
@@ -14,7 +14,7 @@
14
14
  >
15
15
  <template #default="{ close }">
16
16
  <div class="k-settings-modal-frame">
17
- <nav class="k-settings-modal-nav" :aria-label="navText">
17
+ <div class="k-settings-modal-nav">
18
18
  <Button
19
19
  class="k-settings-modal-close"
20
20
  icon="x-mark"
@@ -24,7 +24,15 @@
24
24
  :aria-label="closeText"
25
25
  @click="close"
26
26
  />
27
- <div class="k-settings-modal-nav-list">
27
+ <nav
28
+ ref="navList"
29
+ class="k-settings-modal-nav-list"
30
+ :aria-label="navText"
31
+ :class="{
32
+ 'is-overflow-top': navEdges.overflowTop.value,
33
+ 'is-overflow-bottom': navEdges.overflowBottom.value
34
+ }"
35
+ >
28
36
  <div
29
37
  v-for="group in navGroups"
30
38
  :key="group.key"
@@ -71,7 +79,7 @@
71
79
  </button>
72
80
  </template>
73
81
  </div>
74
- </div>
82
+ </nav>
75
83
  <template v-if="onSignOut">
76
84
  <hr class="k-settings-modal-divider" />
77
85
  <button type="button" class="k-settings-modal-tab is-danger" @click="signOut">
@@ -79,7 +87,7 @@
79
87
  <span class="k-settings-modal-tab-label">{{ signOutText }}</span>
80
88
  </button>
81
89
  </template>
82
- </nav>
90
+ </div>
83
91
 
84
92
  <section
85
93
  v-if="active"
@@ -101,47 +109,61 @@
101
109
  <slot :name="`actions-${active.id}`" :section="active" :close="close" />
102
110
  </div>
103
111
  </header>
104
- <slot :name="`section-${active.id}`" :section="active" :close="close">
105
- <template v-if="active.id === 'account' && account">
106
- <div class="k-settings-modal-account">
107
- <Avatar :name="account.name" :src="account.avatar" size="lg" decorative />
108
- <div class="k-settings-modal-account-text">
109
- <span class="k-settings-modal-account-name">{{ account.name }}</span>
110
- <span v-if="account.email" class="k-settings-modal-account-email">
111
- {{ account.email }}
112
- </span>
112
+ <div
113
+ ref="contentBody"
114
+ class="k-settings-modal-body"
115
+ :class="{
116
+ 'is-overflow-top': contentEdges.overflowTop.value,
117
+ 'is-overflow-bottom': contentEdges.overflowBottom.value
118
+ }"
119
+ >
120
+ <slot :name="`section-${active.id}`" :section="active" :close="close">
121
+ <template v-if="active.id === 'account' && account">
122
+ <div class="k-settings-modal-account">
123
+ <Avatar
124
+ :name="account.name"
125
+ :src="account.avatar"
126
+ size="lg"
127
+ decorative
128
+ />
129
+ <div class="k-settings-modal-account-text">
130
+ <span class="k-settings-modal-account-name">{{ account.name }}</span>
131
+ <span v-if="account.email" class="k-settings-modal-account-email">
132
+ {{ account.email }}
133
+ </span>
134
+ </div>
135
+ <Badge v-if="account.role" :label="account.role" />
113
136
  </div>
114
- <Badge v-if="account.role" :label="account.role" />
115
- </div>
116
- <slot name="account-fields" :account="account" :close="close" />
117
- <SettingsGroup
118
- v-if="onSignOut && !hideSession"
119
- :label="sessionLabelText"
120
- :description="sessionDescriptionText"
121
- row
122
- >
123
- <template #actions>
124
- <Button
125
- variant="soft"
126
- tone="danger"
127
- size="sm"
128
- icon="arrow-left-start-on-rectangle"
129
- @click="signOut"
130
- >
131
- {{ signOutText }}
132
- </Button>
133
- </template>
134
- </SettingsGroup>
135
- </template>
136
- <AppearanceSettings
137
- v-else-if="active.id === 'appearance'"
138
- :presets="presets"
139
- :theme-label="themeLabel"
140
- :theme-text="themeText"
141
- :preset-label="presetLabel"
142
- :preset-text="presetText"
143
- />
144
- </slot>
137
+ <slot name="account-fields" :account="account" :close="close" />
138
+ <SettingsGroup
139
+ v-if="onSignOut && !hideSession"
140
+ :label="sessionLabelText"
141
+ :description="sessionDescriptionText"
142
+ row
143
+ >
144
+ <template #actions>
145
+ <Button
146
+ variant="soft"
147
+ tone="danger"
148
+ size="sm"
149
+ icon="arrow-left-start-on-rectangle"
150
+ @click="signOut"
151
+ >
152
+ {{ signOutText }}
153
+ </Button>
154
+ </template>
155
+ </SettingsGroup>
156
+ </template>
157
+ <AppearanceSettings
158
+ v-else-if="active.id === 'appearance'"
159
+ :presets="presets"
160
+ :theme-label="themeLabel"
161
+ :theme-text="themeText"
162
+ :preset-label="presetLabel"
163
+ :preset-text="presetText"
164
+ />
165
+ </slot>
166
+ </div>
145
167
  </section>
146
168
  </div>
147
169
  </template>
@@ -149,10 +171,11 @@
149
171
  </template>
150
172
 
151
173
  <script setup>
152
- import { computed, useId } from "vue";
174
+ import { computed, useId, useTemplateRef } from "vue";
153
175
  import { THEME_PRESETS } from "../../composables/usePreset";
154
176
  import { useLocale } from "../../composables/useLocale";
155
177
  import { useLinkResolver } from "../../internal/core/link";
178
+ import { useScrollEdges } from "../../internal/core/scroll-edges";
156
179
  import Button from "../core/Button.vue";
157
180
  import Icon from "../core/Icon.vue";
158
181
  import Avatar from "../data/Avatar.vue";
@@ -194,6 +217,10 @@ const signOutText = computed(() => props.signOutLabel ?? t("settings.signOut"));
194
217
  const sessionLabelText = computed(() => props.sessionLabel ?? t("settings.session"));
195
218
  const sessionDescriptionText = computed(() => props.sessionText ?? t("settings.sessionDescription"));
196
219
  const baseId = useId();
220
+ const navList = useTemplateRef("navList");
221
+ const contentBody = useTemplateRef("contentBody");
222
+ const navEdges = useScrollEdges(() => navList.value);
223
+ const contentEdges = useScrollEdges(() => contentBody.value);
197
224
  const panelId = `${baseId}-panel`;
198
225
  const { resolveLink } = useLinkResolver();
199
226
  const sectionList = computed(() => {
@@ -1,18 +1,14 @@
1
1
  import type { ThemePreset } from '../../composables/usePreset';
2
2
  import type { DialogBeforeClose } from '../overlays/types';
3
- import type { SettingsModalAccount, SettingsModalSection } from './types';
4
- type SectionScope = {
5
- section: SettingsModalSection;
6
- close: () => void;
7
- };
3
+ import type { SettingsModalAccount, SettingsModalSection, SettingsSectionSlotProps } from './types';
8
4
  type __VLS_Slots = {
9
5
  'account-fields'?: (props: {
10
6
  account: SettingsModalAccount;
11
7
  close: () => void;
12
8
  }) => unknown;
13
9
  } & {
14
- [key: `section-${string}`]: ((props: SectionScope) => unknown) | undefined;
15
- [key: `actions-${string}`]: ((props: SectionScope) => unknown) | undefined;
10
+ [key: `section-${string}`]: ((props: SettingsSectionSlotProps) => unknown) | undefined;
11
+ [key: `actions-${string}`]: ((props: SettingsSectionSlotProps) => unknown) | undefined;
16
12
  };
17
13
  declare const __VLS_base: import("vue").DefineComponent<{
18
14
  sections?: SettingsModalSection[];
@@ -40,11 +36,13 @@ declare const __VLS_base: import("vue").DefineComponent<{
40
36
  key?: PropertyKey | undefined;
41
37
  loading?: boolean;
42
38
  prefix?: "k-modal" | "k-drawer" | undefined;
39
+ label?: string;
43
40
  style?: import("vue").StyleValue;
44
41
  results?: (string | number) | undefined;
45
42
  placeholder?: string | undefined;
46
43
  description?: string;
47
44
  size?: import("../overlays/types").ModalSize;
45
+ dir?: string | undefined;
48
46
  class?: import("vue").ClassValue;
49
47
  role?: string | undefined;
50
48
  'aria-label'?: string | undefined;
@@ -200,7 +198,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
200
198
  accesskey?: string | undefined;
201
199
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
202
200
  contextmenu?: string | undefined;
203
- dir?: string | undefined;
204
201
  draggable?: (boolean | "true" | "false") | undefined;
205
202
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
206
203
  enterKeyHint?: import("vue").HTMLAttributes["enterkeyhint"];
@@ -238,8 +235,8 @@ declare const __VLS_base: import("vue").DefineComponent<{
238
235
  onVnodeUpdated?: (((vnode: import("vue").VNode, oldVNode: import("vue").VNode) => void) | ((vnode: import("vue").VNode, oldVNode: import("vue").VNode) => void)[]) | undefined;
239
236
  onVnodeBeforeUnmount?: (((vnode: import("vue").VNode) => void) | ((vnode: import("vue").VNode) => void)[]) | undefined;
240
237
  onVnodeUnmounted?: (((vnode: import("vue").VNode) => void) | ((vnode: import("vue").VNode) => void)[]) | undefined;
241
- onCancel?: ((payload: Event) => void) | undefined;
242
238
  flush?: boolean;
239
+ onCancel?: ((payload: Event) => void) | undefined;
243
240
  sheet?: boolean;
244
241
  rootClass?: unknown;
245
242
  hideClose?: boolean;
@@ -276,11 +273,13 @@ declare const __VLS_base: import("vue").DefineComponent<{
276
273
  key?: PropertyKey | undefined;
277
274
  loading?: boolean;
278
275
  prefix?: "k-modal" | "k-drawer" | undefined;
276
+ label?: string;
279
277
  style?: import("vue").StyleValue;
280
278
  results?: (string | number) | undefined;
281
279
  placeholder?: string | undefined;
282
280
  description?: string;
283
281
  size?: import("../overlays/types").ModalSize;
282
+ dir?: string | undefined;
284
283
  class?: import("vue").ClassValue;
285
284
  role?: string | undefined;
286
285
  'aria-label'?: string | undefined;
@@ -436,7 +435,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
436
435
  accesskey?: string | undefined;
437
436
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
438
437
  contextmenu?: string | undefined;
439
- dir?: string | undefined;
440
438
  draggable?: (boolean | "true" | "false") | undefined;
441
439
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
442
440
  enterKeyHint?: import("vue").HTMLAttributes["enterkeyhint"];
@@ -474,8 +472,8 @@ declare const __VLS_base: import("vue").DefineComponent<{
474
472
  onVnodeUpdated?: (((vnode: import("vue").VNode, oldVNode: import("vue").VNode) => void) | ((vnode: import("vue").VNode, oldVNode: import("vue").VNode) => void)[]) | undefined;
475
473
  onVnodeBeforeUnmount?: (((vnode: import("vue").VNode) => void) | ((vnode: import("vue").VNode) => void)[]) | undefined;
476
474
  onVnodeUnmounted?: (((vnode: import("vue").VNode) => void) | ((vnode: import("vue").VNode) => void)[]) | undefined;
477
- onCancel?: ((payload: Event) => void) | undefined;
478
475
  flush?: boolean;
476
+ onCancel?: ((payload: Event) => void) | undefined;
479
477
  sheet?: boolean;
480
478
  rootClass?: unknown;
481
479
  hideClose?: boolean;
@@ -34,6 +34,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
34
34
  style?: import("vue").StyleValue;
35
35
  results?: (string | number) | undefined;
36
36
  placeholder?: string | undefined | undefined;
37
+ dir?: string | undefined | undefined;
37
38
  class?: import("vue").ClassValue;
38
39
  role?: string | undefined | undefined;
39
40
  'aria-label'?: string | undefined | undefined;
@@ -189,7 +190,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
189
190
  accesskey?: string | undefined | undefined;
190
191
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
191
192
  contextmenu?: string | undefined | undefined;
192
- dir?: string | undefined | undefined;
193
193
  draggable?: (boolean | "true" | "false") | undefined;
194
194
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
195
195
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
@@ -246,6 +246,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
246
246
  style?: import("vue").StyleValue;
247
247
  results?: (string | number) | undefined;
248
248
  placeholder?: string | undefined | undefined;
249
+ dir?: string | undefined | undefined;
249
250
  class?: import("vue").ClassValue;
250
251
  role?: string | undefined | undefined;
251
252
  'aria-label'?: string | undefined | undefined;
@@ -401,7 +402,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
401
402
  accesskey?: string | undefined | undefined;
402
403
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
403
404
  contextmenu?: string | undefined | undefined;
404
- dir?: string | undefined | undefined;
405
405
  draggable?: (boolean | "true" | "false") | undefined;
406
406
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
407
407
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
@@ -24,10 +24,12 @@ declare const __VLS_base: import("vue").DefineComponent<{
24
24
  key?: PropertyKey | undefined;
25
25
  prefix?: string | undefined;
26
26
  selected?: boolean;
27
+ label?: string;
27
28
  style?: import("vue").StyleValue;
28
29
  results?: (string | number) | undefined;
29
30
  placeholder?: string | undefined;
30
31
  bind?: Record<string, unknown>;
32
+ dir?: string | undefined;
31
33
  class?: import("vue").ClassValue;
32
34
  role?: string | undefined;
33
35
  'aria-label'?: string | undefined;
@@ -188,7 +190,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
188
190
  accesskey?: string | undefined;
189
191
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
190
192
  contextmenu?: string | undefined;
191
- dir?: string | undefined;
192
193
  draggable?: (boolean | "true" | "false") | undefined;
193
194
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
194
195
  enterKeyHint?: import("vue").HTMLAttributes["enterkeyhint"];
@@ -251,10 +252,12 @@ declare const __VLS_base: import("vue").DefineComponent<{
251
252
  key?: PropertyKey | undefined;
252
253
  prefix?: string | undefined;
253
254
  selected?: boolean;
255
+ label?: string;
254
256
  style?: import("vue").StyleValue;
255
257
  results?: (string | number) | undefined;
256
258
  placeholder?: string | undefined;
257
259
  bind?: Record<string, unknown>;
260
+ dir?: string | undefined;
258
261
  class?: import("vue").ClassValue;
259
262
  role?: string | undefined;
260
263
  'aria-label'?: string | undefined;
@@ -415,7 +418,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
415
418
  accesskey?: string | undefined;
416
419
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
417
420
  contextmenu?: string | undefined;
418
- dir?: string | undefined;
419
421
  draggable?: (boolean | "true" | "false") | undefined;
420
422
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
421
423
  enterKeyHint?: import("vue").HTMLAttributes["enterkeyhint"];
@@ -30,6 +30,10 @@ export interface SettingsModalSection {
30
30
  badge?: string | number;
31
31
  disabled?: boolean;
32
32
  }
33
+ export interface SettingsSectionSlotProps {
34
+ section: SettingsModalSection;
35
+ close: () => void;
36
+ }
33
37
  export interface SettingsModalAccount {
34
38
  name: string;
35
39
  email?: string;
@@ -1,22 +1,17 @@
1
1
  import { useLocale } from "./useLocale.mjs";
2
- import { confirmQueue, hasConfirmHost, nextConfirmId } from "../internal/overlays/confirm.mjs";
2
+ import { isClient } from "../internal/core/env.mjs";
3
+ import { enqueueDialog, hasConfirmHost, nativeDialogMessage } from "../internal/overlays/confirm.mjs";
3
4
  export function useAlert() {
4
5
  const { t } = useLocale();
5
6
  return function alert(input = {}) {
6
7
  const options = typeof input === "string" ? { description: input } : input;
7
- if (typeof window === "undefined") return Promise.resolve();
8
+ if (!isClient()) return Promise.resolve();
8
9
  if (!hasConfirmHost()) {
9
- window.alert([options.title, options.description].filter(Boolean).join("\n\n"));
10
+ window.alert(nativeDialogMessage(options));
10
11
  return Promise.resolve();
11
12
  }
12
13
  return new Promise((resolve) => {
13
- confirmQueue.push({
14
- title: t("alert.title"),
15
- ...options,
16
- kind: "alert",
17
- id: nextConfirmId(),
18
- resolve
19
- });
14
+ enqueueDialog({ title: t("alert.title"), ...options, kind: "alert", resolve });
20
15
  });
21
16
  };
22
17
  }
@@ -1,8 +1,8 @@
1
1
  import { useLocale } from "./useLocale.mjs";
2
- import { confirmQueue, hasConfirmHost, nextConfirmId } from "../internal/overlays/confirm.mjs";
2
+ import { isClient } from "../internal/core/env.mjs";
3
+ import { enqueueDialog, hasConfirmHost, nativeDialogMessage } from "../internal/overlays/confirm.mjs";
3
4
  async function nativeConfirm(options, fallback) {
4
- const message = [options.title, options.description].filter(Boolean).join("\n\n");
5
- if (!window.confirm(message || fallback)) return false;
5
+ if (!window.confirm(nativeDialogMessage(options) || fallback)) return false;
6
6
  try {
7
7
  await options.onConfirm?.();
8
8
  return true;
@@ -14,10 +14,10 @@ export function useConfirm() {
14
14
  const { t } = useLocale();
15
15
  return function confirm(input = {}) {
16
16
  const options = typeof input === "string" ? { description: input } : input;
17
- if (typeof window === "undefined") return Promise.resolve(false);
17
+ if (!isClient()) return Promise.resolve(false);
18
18
  if (!hasConfirmHost()) return nativeConfirm(options, t("common.areYouSure"));
19
19
  return new Promise((resolve) => {
20
- confirmQueue.push({ ...options, kind: "confirm", id: nextConfirmId(), resolve });
20
+ enqueueDialog({ ...options, kind: "confirm", resolve });
21
21
  });
22
22
  };
23
23
  }
@@ -2,6 +2,7 @@ import type { ComputedRef, MaybeRefOrGetter } from 'vue';
2
2
  export interface FieldContext {
3
3
  id: string;
4
4
  labelId: string;
5
+ hasLabel?: ComputedRef<boolean>;
5
6
  name: ComputedRef<string | undefined>;
6
7
  describedBy: ComputedRef<string | undefined>;
7
8
  invalid: ComputedRef<boolean>;
@@ -9,6 +10,7 @@ export interface FieldContext {
9
10
  disabled: ComputedRef<boolean>;
10
11
  setControlError: (message: string | undefined, source?: object) => void;
11
12
  setLabelable?: (labelable: boolean | undefined, source: object) => void;
13
+ setRequiredHint?: (hint: boolean | undefined, source: object) => void;
12
14
  }
13
15
  export type FieldControlRole = 'primary' | 'auxiliary';
14
16
  export declare function useField(): FieldContext | null;
@@ -20,6 +22,7 @@ export interface FieldControlOptions {
20
22
  describedBy?: MaybeRefOrGetter<string | undefined>;
21
23
  role?: MaybeRefOrGetter<FieldControlRole | undefined>;
22
24
  labelable?: MaybeRefOrGetter<boolean | undefined>;
25
+ requiredHint?: MaybeRefOrGetter<boolean | undefined>;
23
26
  }
24
27
  export declare function useFieldControl(options?: FieldControlOptions): {
25
28
  readonly field: FieldContext | null;
@@ -28,6 +31,7 @@ export declare function useFieldControl(options?: FieldControlOptions): {
28
31
  required: ComputedRef<boolean>;
29
32
  disabled: ComputedRef<boolean>;
30
33
  describedBy: ComputedRef<string | undefined>;
34
+ labelledBy: ComputedRef<string | undefined>;
31
35
  attrs: ComputedRef<{
32
36
  id: string | undefined;
33
37
  name: string | undefined;
@@ -1,5 +1,6 @@
1
1
  import { computed, getCurrentScope, inject, onScopeDispose, toValue, watch } from "vue";
2
2
  import { FIELD_KEY, FIELD_ROLE_KEY } from "../internal/keys.mjs";
3
+ import { joinIds } from "../internal/forms/control.mjs";
3
4
  export function useField() {
4
5
  return inject(FIELD_KEY, null);
5
6
  }
@@ -14,16 +15,18 @@ export function useFieldControl(options = {}) {
14
15
  () => Boolean(toValue(options.required) || field.value?.required.value)
15
16
  );
16
17
  const disabled = computed(() => Boolean(toValue(options.disabled) || parent?.disabled.value));
17
- const describedBy = computed(() => {
18
- const ids = [toValue(options.describedBy), field.value?.describedBy.value].filter(Boolean);
19
- return ids.length ? ids.join(" ") : void 0;
20
- });
18
+ const describedBy = computed(
19
+ () => joinIds(toValue(options.describedBy), field.value?.describedBy.value)
20
+ );
21
+ const labelledBy = computed(
22
+ () => field.value?.hasLabel?.value === false ? void 0 : field.value?.labelId
23
+ );
21
24
  const attrs = computed(() => ({
22
25
  id: id.value,
23
26
  name: field.value?.name.value,
24
27
  "aria-invalid": invalid.value ? "true" : void 0,
25
28
  "aria-describedby": describedBy.value,
26
- "aria-required": required.value ? "true" : void 0,
29
+ "aria-required": required.value && !toValue(options.requiredHint) ? "true" : void 0,
27
30
  disabled: disabled.value || void 0
28
31
  }));
29
32
  const source = {};
@@ -35,9 +38,16 @@ export function useFieldControl(options = {}) {
35
38
  (labelable) => parent.setLabelable?.(labelable, source),
36
39
  { immediate: true }
37
40
  );
41
+ if (parent.setRequiredHint && options.requiredHint !== void 0)
42
+ watch(
43
+ () => auxiliary.value ? void 0 : toValue(options.requiredHint),
44
+ (hint) => parent.setRequiredHint?.(hint, source),
45
+ { immediate: true }
46
+ );
38
47
  onScopeDispose(() => {
39
48
  parent.setControlError(void 0, source);
40
49
  parent.setLabelable?.(void 0, source);
50
+ parent.setRequiredHint?.(void 0, source);
41
51
  });
42
52
  }
43
53
  return {
@@ -49,6 +59,7 @@ export function useFieldControl(options = {}) {
49
59
  required,
50
60
  disabled,
51
61
  describedBy,
62
+ labelledBy,
52
63
  attrs,
53
64
  auxiliary,
54
65
  setControlError