@xleddyl/443-components-vue 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +8 -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
@@ -20,7 +20,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
20
20
  label?: string;
21
21
  collapsible?: boolean;
22
22
  collapseLabel?: string;
23
- expandLabel?: string;
24
23
  innerHTML?: string | undefined | undefined;
25
24
  class?: import("vue").ClassValue;
26
25
  style?: import("vue").StyleValue;
@@ -217,7 +216,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
217
216
  label?: string;
218
217
  collapsible?: boolean;
219
218
  collapseLabel?: string;
220
- expandLabel?: string;
221
219
  innerHTML?: string | undefined | undefined;
222
220
  class?: import("vue").ClassValue;
223
221
  style?: import("vue").StyleValue;
@@ -5,42 +5,21 @@
5
5
  :label="section.label"
6
6
  >
7
7
  <template v-for="(item, index) in section.items" :key="itemKey(item, index)">
8
- <div
8
+ <NavGroup
9
9
  v-if="item.children?.length"
10
- class="k-navgroup"
11
- :class="{ 'is-open': isOpen(item, sectionIndex, index) }"
10
+ :item="item"
11
+ :open="isOpen(item, sectionIndex, index)"
12
+ :rail="rail"
13
+ :child-active="hasActiveChild(item)"
14
+ :panel-id="groupId(sectionIndex, index)"
15
+ @toggle="toggleGroup(sectionIndex, index)"
12
16
  >
13
- <button
14
- type="button"
15
- class="k-navlink k-navgroup-trigger"
16
- :class="{ 'is-child-active': hasActiveChild(item), 'is-disabled': item.disabled }"
17
- :disabled="item.disabled"
18
- :aria-expanded="isOpen(item, sectionIndex, index) ? 'true' : 'false'"
19
- :aria-controls="groupId(sectionIndex, index)"
20
- :title="shell?.collapsed.value ? item.label : void 0"
21
- @click="toggleGroup(sectionIndex, index)"
22
- >
23
- <span v-if="item.icon" class="k-navlink-icon" aria-hidden="true">
24
- <Icon :name="item.icon" />
25
- </span>
26
- <span class="k-navlink-label">{{ item.label }}</span>
27
- <span v-if="hasBadge(item)" class="k-navlink-badge">{{ item.badge }}</span>
28
- <Icon name="chevron-right" class="k-navgroup-chevron" />
29
- </button>
30
- <div
31
- :id="groupId(sectionIndex, index)"
32
- class="k-navgroup-panel"
33
- :inert="isOpen(item, sectionIndex, index) ? void 0 : true"
34
- >
35
- <div class="k-navgroup-list">
36
- <NavLink
37
- v-for="(child, childIndex) in item.children"
38
- :key="itemKey(child, childIndex)"
39
- v-bind="linkProps(child)"
40
- />
41
- </div>
42
- </div>
43
- </div>
17
+ <NavLink
18
+ v-for="(child, childIndex) in item.children"
19
+ :key="itemKey(child, childIndex)"
20
+ v-bind="linkProps(child)"
21
+ />
22
+ </NavGroup>
44
23
  <NavLink v-else v-bind="linkProps(item)" />
45
24
  </template>
46
25
  </SidebarSection>
@@ -51,7 +30,7 @@ import { computed, ref, useId, watch } from "vue";
51
30
  import { useAppShell } from "../../composables/useAppShell";
52
31
  import { isNavItemActive, navTarget, toNavSections } from "../../internal/layout/navigation";
53
32
  import { useCurrentPath } from "../../internal/layout/route";
54
- import Icon from "../core/Icon.vue";
33
+ import NavGroup from "../../internal/layout/NavGroup.vue";
55
34
  import NavLink from "./NavLink.vue";
56
35
  import SidebarSection from "./SidebarSection.vue";
57
36
  const props = defineProps({
@@ -69,17 +48,15 @@ function itemKey(item, index) {
69
48
  function groupId(sectionIndex, index) {
70
49
  return `${baseId}-group-${sectionIndex}-${index}`;
71
50
  }
72
- function hasBadge(item) {
73
- return item.badge !== void 0 && item.badge !== "";
74
- }
75
51
  function isActive(item) {
76
52
  return isNavItemActive(item, path.value);
77
53
  }
78
54
  function hasActiveChild(item) {
79
55
  return Boolean(item.children?.some((child) => isActive(child) === true || hasActiveChild(child)));
80
56
  }
57
+ const rail = computed(() => Boolean(shell?.collapsed.value && !shell.mobile.value));
81
58
  function isOpen(item, sectionIndex, index) {
82
- if (shell?.collapsed.value && !shell.mobile.value) return false;
59
+ if (rail.value) return false;
83
60
  const explicit = toggled.value.get(groupId(sectionIndex, index));
84
61
  return explicit ?? hasActiveChild(item);
85
62
  }
@@ -88,11 +65,6 @@ function toggleGroup(sectionIndex, index) {
88
65
  const section = sections.value[sectionIndex];
89
66
  const item = section?.items[index];
90
67
  if (!item) return;
91
- if (shell?.collapsed.value && !shell.mobile.value) {
92
- shell.toggleCollapsed();
93
- toggled.value.set(id, true);
94
- return;
95
- }
96
68
  toggled.value.set(id, !isOpen(item, sectionIndex, index));
97
69
  }
98
70
  function linkProps(item) {
@@ -20,6 +20,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
20
20
  results?: (string | number) | undefined;
21
21
  placeholder?: string | undefined;
22
22
  bind?: Record<string, unknown>;
23
+ dir?: string | undefined;
23
24
  class?: import("vue").ClassValue;
24
25
  role?: string | undefined;
25
26
  'aria-label'?: string | undefined;
@@ -179,7 +180,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
179
180
  accesskey?: string | undefined;
180
181
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
181
182
  contextmenu?: string | undefined;
182
- dir?: string | undefined;
183
183
  draggable?: (boolean | "true" | "false") | undefined;
184
184
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
185
185
  enterKeyHint?: import("vue").HTMLAttributes["enterkeyhint"];
@@ -236,6 +236,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
236
236
  results?: (string | number) | undefined;
237
237
  placeholder?: string | undefined;
238
238
  bind?: Record<string, unknown>;
239
+ dir?: string | undefined;
239
240
  class?: import("vue").ClassValue;
240
241
  role?: string | undefined;
241
242
  'aria-label'?: string | undefined;
@@ -395,7 +396,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
395
396
  accesskey?: string | undefined;
396
397
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
397
398
  contextmenu?: string | undefined;
398
- dir?: string | undefined;
399
399
  draggable?: (boolean | "true" | "false") | undefined;
400
400
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
401
401
  enterKeyHint?: import("vue").HTMLAttributes["enterkeyhint"];
@@ -23,9 +23,7 @@
23
23
  role="tab"
24
24
  class="k-tab"
25
25
  :aria-selected="isSelected(item) ? 'true' : 'false'"
26
- :aria-controls="
27
- singlePanel ? isSelected(item) ? singlePanelId : void 0 : panelId(index)
28
- "
26
+ :aria-controls="controlsId(item, index)"
29
27
  :tabindex="index === focusIndex ? 0 : -1"
30
28
  :disabled="item.disabled"
31
29
  @click="select(item)"
@@ -75,16 +73,8 @@
75
73
  </template>
76
74
 
77
75
  <script setup>
78
- import {
79
- computed,
80
- nextTick,
81
- onBeforeUnmount,
82
- onMounted,
83
- ref,
84
- useId,
85
- useTemplateRef,
86
- watch
87
- } from "vue";
76
+ import { computed, nextTick, onMounted, ref, useId, useTemplateRef, warn, watch } from "vue";
77
+ import { useResizeObserver } from "../../internal/core/resize";
88
78
  import Icon from "../core/Icon.vue";
89
79
  import { rovingIndex } from "../../internal/core/roving";
90
80
  const props = defineProps({
@@ -140,6 +130,10 @@ function tabId(index) {
140
130
  function panelId(index) {
141
131
  return `${baseId}-panel-${index}`;
142
132
  }
133
+ function controlsId(item, index) {
134
+ if (singlePanel.value) return isSelected(item) ? singlePanelId : void 0;
135
+ return !props.lazy || visited.value.has(item.value) ? panelId(index) : void 0;
136
+ }
143
137
  function tabElement(index) {
144
138
  return list.value?.querySelector(`#${CSS.escape(tabId(index))}`) ?? null;
145
139
  }
@@ -170,12 +164,10 @@ function measure() {
170
164
  if (!tab || !list.value) return;
171
165
  indicator.value = { x: tab.offsetLeft, width: tab.offsetWidth };
172
166
  }
173
- let observer;
174
167
  onMounted(() => {
168
+ if (!props.label && !list.value?.hasAttribute("aria-labelledby"))
169
+ warn("[@xleddyl/443-components-vue] Tabs needs a label to name the tab list.");
175
170
  measure();
176
- if (typeof ResizeObserver === "undefined" || !list.value) return;
177
- observer = new ResizeObserver(() => measure());
178
- observer.observe(list.value);
179
171
  });
180
- onBeforeUnmount(() => observer?.disconnect());
172
+ useResizeObserver(() => [list.value], measure);
181
173
  </script>
@@ -29,6 +29,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
29
29
  style?: import("vue").StyleValue;
30
30
  results?: (string | number) | undefined;
31
31
  placeholder?: string | undefined | undefined;
32
+ dir?: string | undefined | undefined;
32
33
  class?: import("vue").ClassValue;
33
34
  role?: string | undefined | undefined;
34
35
  'aria-label'?: string | undefined | undefined;
@@ -184,7 +185,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
184
185
  accesskey?: string | undefined | undefined;
185
186
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
186
187
  contextmenu?: string | undefined | undefined;
187
- dir?: string | undefined | undefined;
188
188
  draggable?: (boolean | "true" | "false") | undefined;
189
189
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
190
190
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
@@ -235,6 +235,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
235
235
  style?: import("vue").StyleValue;
236
236
  results?: (string | number) | undefined;
237
237
  placeholder?: string | undefined | undefined;
238
+ dir?: string | undefined | undefined;
238
239
  class?: import("vue").ClassValue;
239
240
  role?: string | undefined | undefined;
240
241
  'aria-label'?: string | undefined | undefined;
@@ -390,7 +391,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
390
391
  accesskey?: string | undefined | undefined;
391
392
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
392
393
  contextmenu?: string | undefined | undefined;
393
- dir?: string | undefined | undefined;
394
394
  draggable?: (boolean | "true" | "false") | undefined;
395
395
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
396
396
  enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
@@ -3,9 +3,9 @@
3
3
  ref="root"
4
4
  class="k-toolbar"
5
5
  :class="[`k-toolbar-${orientation}`, { 'is-bordered': bordered }]"
6
- role="toolbar"
6
+ :role="roving ? 'toolbar' : 'group'"
7
7
  :aria-label="label"
8
- :aria-orientation="orientation"
8
+ :aria-orientation="roving ? orientation : void 0"
9
9
  @keydown="onKeydown"
10
10
  @focusin="onFocusIn"
11
11
  >
@@ -14,14 +14,20 @@
14
14
  </template>
15
15
 
16
16
  <script setup>
17
- import { useTemplateRef } from "vue";
17
+ import { onMounted, useAttrs, useTemplateRef, warn } from "vue";
18
18
  import { useRovingTabStops } from "../../internal/core/roving";
19
+ import { hasNameAttrs } from "../../internal/forms/name";
19
20
  const props = defineProps({
20
21
  label: { type: String, required: false },
21
22
  orientation: { type: String, required: false, default: "horizontal" },
22
- roving: { type: Boolean, required: false },
23
+ roving: { type: Boolean, required: false, default: true },
23
24
  bordered: { type: Boolean, required: false }
24
25
  });
26
+ const attrs = useAttrs();
27
+ onMounted(() => {
28
+ if (!props.label && !hasNameAttrs(attrs))
29
+ warn("[@xleddyl/443-components-vue] Toolbar needs a label (or aria-labelledby).");
30
+ });
25
31
  const { onKeydown, onFocusIn } = useRovingTabStops(useTemplateRef("root"), {
26
32
  selector: "button:not(:disabled), a[href], input:not(:disabled), select:not(:disabled), [data-k-toolbar-item]",
27
33
  orientation: () => props.orientation,
@@ -398,6 +398,7 @@ declare const __VLS_base: import("vue").DefineComponent<{
398
398
  ref_key?: string | undefined | undefined;
399
399
  }> & Readonly<{}>, {
400
400
  orientation: "horizontal" | "vertical";
401
+ roving: boolean;
401
402
  }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
402
403
  declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
403
404
  declare const _default: typeof __VLS_export;
@@ -43,6 +43,7 @@ export type AccordionVariant = 'separated' | 'plain' | 'card' | 'outline';
43
43
  export type AccordionContentVariant = 'text' | 'neutral';
44
44
  export type HeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;
45
45
  export interface AppShellContext {
46
+ sidebarId: string;
46
47
  collapsed: Readonly<{
47
48
  value: boolean;
48
49
  }>;
@@ -137,7 +137,7 @@
137
137
  <span><Kbd size="sm">↵</Kbd> {{ selectText }}</span>
138
138
  <span><Kbd size="sm">Esc</Kbd> {{ closeText }}</span>
139
139
  </div>
140
- <p class="k-visually-hidden" aria-live="polite">{{ status }}</p>
140
+ <LiveRegion :message="status" />
141
141
  </div>
142
142
  </dialog>
143
143
  </template>
@@ -153,6 +153,7 @@ import { matchesSearch } from "../../internal/core/text";
153
153
  import { readStorageJson, writeStorageJson } from "../../internal/core/storage";
154
154
  import { useRouterLike } from "../../internal/layout/route";
155
155
  import { ButtonElement } from "../../internal/core/ButtonElement";
156
+ import LiveRegion from "../../internal/core/LiveRegion.vue";
156
157
  import Icon from "../core/Icon.vue";
157
158
  import Kbd from "../core/Kbd.vue";
158
159
  import Spinner from "../core/Spinner.vue";
@@ -287,8 +288,11 @@ const search = useAsyncSearch({
287
288
  onResults: (groups) => remote.value = groups,
288
289
  onError: () => remote.value = []
289
290
  });
291
+ function firstEnabled() {
292
+ return Math.max(0, nextEnabledIndex(flat.value.length, 0, 1, isDisabled));
293
+ }
290
294
  watch(term, (value) => {
291
- active.value = 0;
295
+ active.value = firstEnabled();
292
296
  if (!props.search) return;
293
297
  if (!value || value.length < props.minQueryLength) {
294
298
  search.cancel();
@@ -298,7 +302,7 @@ watch(term, (value) => {
298
302
  search.schedule(value, props.debounce);
299
303
  });
300
304
  watch(flat, (items) => {
301
- if (active.value >= items.length) active.value = 0;
305
+ if (active.value >= items.length || isDisabled(active.value)) active.value = firstEnabled();
302
306
  });
303
307
  watch(active, (index) => {
304
308
  nextTick(() => {
@@ -370,7 +374,7 @@ const { present, onCancel, onClose, onPointerDown, onClick } = useModalDialog({
370
374
  dismissible: () => true,
371
375
  onOpen: () => {
372
376
  readRecent();
373
- active.value = 0;
377
+ active.value = firstEnabled();
374
378
  inputRef.value?.select();
375
379
  emit("open");
376
380
  },
@@ -1,4 +1,4 @@
1
- import type { CommandEmptyText, CommandGroup, CommandItem, CommandSearch } from './types';
1
+ import type { CommandEmptyText, CommandGroup, CommandGroupLabelSlotProps, CommandItem, CommandSearch } from './types';
2
2
  declare const __VLS_export: <T = unknown>(__VLS_props: NonNullable<Awaited<typeof __VLS_setup>>["props"], __VLS_ctx?: __VLS_PrettifyLocal<Pick<NonNullable<Awaited<typeof __VLS_setup>>, "attrs" | "emit" | "slots">>, __VLS_exposed?: NonNullable<Awaited<typeof __VLS_setup>>["expose"], __VLS_setup?: Promise<{
3
3
  props: import("vue").PublicProps & __VLS_PrettifyLocal<({
4
4
  groups?: CommandGroup<T>[];
@@ -44,6 +44,7 @@ declare const __VLS_export: <T = unknown>(__VLS_props: NonNullable<Awaited<typeo
44
44
  readonly results?: (string | number) | undefined;
45
45
  readonly placeholder?: string | undefined | undefined;
46
46
  readonly name?: string | undefined | undefined;
47
+ readonly dir?: string | undefined | undefined;
47
48
  readonly class?: import("vue").ClassValue;
48
49
  readonly role?: string | undefined | undefined;
49
50
  readonly 'aria-label'?: string | undefined | undefined;
@@ -196,7 +197,6 @@ declare const __VLS_export: <T = unknown>(__VLS_props: NonNullable<Awaited<typeo
196
197
  readonly accesskey?: string | undefined | undefined;
197
198
  readonly contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
198
199
  readonly contextmenu?: string | undefined | undefined;
199
- readonly dir?: string | undefined | undefined;
200
200
  readonly draggable?: (boolean | "true" | "false") | undefined;
201
201
  readonly enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
202
202
  readonly enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
@@ -248,12 +248,7 @@ declare const __VLS_export: <T = unknown>(__VLS_props: NonNullable<Awaited<typeo
248
248
  empty?: (props: {
249
249
  query: string;
250
250
  }) => unknown;
251
- 'group-label'?: (props: {
252
- group?: CommandGroup<T>;
253
- label?: string;
254
- description?: string;
255
- recent: boolean;
256
- }) => unknown;
251
+ 'group-label'?: (props: CommandGroupLabelSlotProps<T>) => unknown;
257
252
  item?: (props: {
258
253
  item: CommandItem<T>;
259
254
  active: boolean;
@@ -25,11 +25,13 @@
25
25
  </div>
26
26
  </div>
27
27
  </template>
28
- <slot />
29
- <p v-if="error" class="k-confirm-error" role="alert">
30
- <Icon name="exclamation-circle" />
31
- <span>{{ error }}</span>
32
- </p>
28
+ <template #default="{ titleId }">
29
+ <slot :title-id="titleId" />
30
+ <p v-if="error" class="k-confirm-error" role="alert">
31
+ <Icon name="exclamation-circle" />
32
+ <span>{{ error }}</span>
33
+ </p>
34
+ </template>
33
35
  <template #footer>
34
36
  <Button
35
37
  v-if="!hideCancel"
@@ -2,9 +2,11 @@ import type { Tone } from '../core/types';
2
2
  import type { IconName } from '../../composables/useIcons';
3
3
  declare function confirm(): Promise<void>;
4
4
  declare function cancel(): void;
5
- declare var __VLS_17: {};
5
+ declare var __VLS_18: {
6
+ titleId: string;
7
+ };
6
8
  type __VLS_Slots = {} & {
7
- default?: (props: typeof __VLS_17) => any;
9
+ default?: (props: typeof __VLS_18) => any;
8
10
  };
9
11
  declare const __VLS_base: import("vue").DefineComponent<{
10
12
  title?: string | undefined;
@@ -19,10 +21,12 @@ declare const __VLS_base: import("vue").DefineComponent<{
19
21
  key?: PropertyKey | undefined;
20
22
  loading?: boolean;
21
23
  prefix?: "k-modal" | "k-drawer" | undefined;
24
+ label?: string;
22
25
  style?: import("vue").StyleValue;
23
26
  results?: (string | number) | undefined;
24
27
  placeholder?: string | undefined;
25
28
  size?: import("./types.ts").ModalSize;
29
+ dir?: string | undefined;
26
30
  class?: import("vue").ClassValue;
27
31
  role?: string | undefined;
28
32
  'aria-label'?: string | undefined;
@@ -178,7 +182,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
178
182
  accesskey?: string | undefined;
179
183
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
180
184
  contextmenu?: string | undefined;
181
- dir?: string | undefined;
182
185
  draggable?: (boolean | "true" | "false") | undefined;
183
186
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
184
187
  enterKeyHint?: import("vue").HTMLAttributes["enterkeyhint"];
@@ -216,13 +219,13 @@ declare const __VLS_base: import("vue").DefineComponent<{
216
219
  onVnodeUpdated?: (((vnode: import("vue").VNode, oldVNode: import("vue").VNode) => void) | ((vnode: import("vue").VNode, oldVNode: import("vue").VNode) => void)[]) | undefined;
217
220
  onVnodeBeforeUnmount?: (((vnode: import("vue").VNode) => void) | ((vnode: import("vue").VNode) => void)[]) | undefined;
218
221
  onVnodeUnmounted?: (((vnode: import("vue").VNode) => void) | ((vnode: import("vue").VNode) => void)[]) | undefined;
219
- onClose?: (() => any) | undefined;
220
222
  flush?: boolean;
223
+ onClose?: (() => any) | undefined;
221
224
  sheet?: boolean;
222
225
  onOpen?: (() => any) | undefined;
226
+ closeLabel?: string;
223
227
  rootClass?: unknown;
224
228
  hideClose?: boolean;
225
- closeLabel?: string;
226
229
  beforeClose?: import("./types.ts").DialogBeforeClose;
227
230
  closedby?: import("../../index.ts").DialogClosedBy;
228
231
  }, {
@@ -246,10 +249,12 @@ declare const __VLS_base: import("vue").DefineComponent<{
246
249
  key?: PropertyKey | undefined;
247
250
  loading?: boolean;
248
251
  prefix?: "k-modal" | "k-drawer" | undefined;
252
+ label?: string;
249
253
  style?: import("vue").StyleValue;
250
254
  results?: (string | number) | undefined;
251
255
  placeholder?: string | undefined;
252
256
  size?: import("./types.ts").ModalSize;
257
+ dir?: string | undefined;
253
258
  class?: import("vue").ClassValue;
254
259
  role?: string | undefined;
255
260
  'aria-label'?: string | undefined;
@@ -405,7 +410,6 @@ declare const __VLS_base: import("vue").DefineComponent<{
405
410
  accesskey?: string | undefined;
406
411
  contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
407
412
  contextmenu?: string | undefined;
408
- dir?: string | undefined;
409
413
  draggable?: (boolean | "true" | "false") | undefined;
410
414
  enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined;
411
415
  enterKeyHint?: import("vue").HTMLAttributes["enterkeyhint"];
@@ -443,13 +447,13 @@ declare const __VLS_base: import("vue").DefineComponent<{
443
447
  onVnodeUpdated?: (((vnode: import("vue").VNode, oldVNode: import("vue").VNode) => void) | ((vnode: import("vue").VNode, oldVNode: import("vue").VNode) => void)[]) | undefined;
444
448
  onVnodeBeforeUnmount?: (((vnode: import("vue").VNode) => void) | ((vnode: import("vue").VNode) => void)[]) | undefined;
445
449
  onVnodeUnmounted?: (((vnode: import("vue").VNode) => void) | ((vnode: import("vue").VNode) => void)[]) | undefined;
446
- onClose?: (() => any) | undefined;
447
450
  flush?: boolean;
451
+ onClose?: (() => any) | undefined;
448
452
  sheet?: boolean;
449
453
  onOpen?: (() => any) | undefined;
454
+ closeLabel?: string;
450
455
  rootClass?: unknown;
451
456
  hideClose?: boolean;
452
- closeLabel?: string;
453
457
  beforeClose?: import("./types.ts").DialogBeforeClose;
454
458
  closedby?: import("../../index.ts").DialogClosedBy;
455
459
  }> & Readonly<{
@@ -15,26 +15,29 @@
15
15
  @resolve="onResolve"
16
16
  @after-leave="onAfterLeave"
17
17
  >
18
- <component
19
- :is="current.body"
20
- v-if="current && current.kind !== 'prompt' && current.body"
21
- @close="dialogRef?.cancel()"
22
- />
23
- <FormField
24
- v-else-if="current?.kind === 'prompt'"
25
- :label="current.label"
26
- :required="current.required"
27
- :error="promptError || void 0"
28
- >
29
- <Input
30
- v-model="promptValue"
31
- :type="current.type ?? 'text'"
32
- :placeholder="current.placeholder"
33
- autofocus
34
- @keydown.enter.prevent="dialogRef?.confirm()"
35
- @update:model-value="promptError = ''"
18
+ <template #default="{ titleId }">
19
+ <component
20
+ :is="current.body"
21
+ v-if="current && current.kind !== 'prompt' && current.body"
22
+ @close="dialogRef?.cancel()"
36
23
  />
37
- </FormField>
24
+ <FormField
25
+ v-else-if="current?.kind === 'prompt'"
26
+ :label="current.label"
27
+ :required="current.required"
28
+ :error="promptError || void 0"
29
+ >
30
+ <Input
31
+ v-model="promptValue"
32
+ :type="current.type ?? 'text'"
33
+ :placeholder="current.placeholder"
34
+ :aria-labelledby="current.label ? void 0 : titleId"
35
+ autofocus
36
+ @keydown.enter.prevent="dialogRef?.confirm()"
37
+ @update:model-value="promptError = ''"
38
+ />
39
+ </FormField>
40
+ </template>
38
41
  </ConfirmDialog>
39
42
  </template>
40
43
 
@@ -11,10 +11,12 @@ declare const __VLS_export: import("vue").DefineComponent<Partial<NonNullable<{
11
11
  readonly key?: PropertyKey | undefined;
12
12
  readonly loading?: boolean | undefined;
13
13
  readonly prefix?: "k-modal" | "k-drawer" | undefined;
14
+ readonly label?: string | undefined;
14
15
  readonly style?: import("vue").StyleValue;
15
16
  readonly results?: (string | number) | undefined;
16
17
  readonly placeholder?: string | undefined | undefined;
17
18
  readonly size?: import("./types.ts").ModalSize | undefined;
19
+ readonly dir?: string | undefined | undefined;
18
20
  readonly class?: import("vue").ClassValue;
19
21
  readonly role?: string | undefined | undefined;
20
22
  readonly 'aria-label'?: string | undefined | undefined;
@@ -170,7 +172,6 @@ declare const __VLS_export: import("vue").DefineComponent<Partial<NonNullable<{
170
172
  readonly accesskey?: string | undefined | undefined;
171
173
  readonly contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
172
174
  readonly contextmenu?: string | undefined | undefined;
173
- readonly dir?: string | undefined | undefined;
174
175
  readonly draggable?: (boolean | "true" | "false") | undefined;
175
176
  readonly enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
176
177
  readonly enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
@@ -208,13 +209,13 @@ declare const __VLS_export: import("vue").DefineComponent<Partial<NonNullable<{
208
209
  readonly onVnodeUpdated?: (((vnode: import("vue").VNode, oldVNode: import("vue").VNode) => void) | ((vnode: import("vue").VNode, oldVNode: import("vue").VNode) => void)[]) | undefined;
209
210
  readonly onVnodeBeforeUnmount?: (((vnode: import("vue").VNode) => void) | ((vnode: import("vue").VNode) => void)[]) | undefined;
210
211
  readonly onVnodeUnmounted?: (((vnode: import("vue").VNode) => void) | ((vnode: import("vue").VNode) => void)[]) | undefined;
211
- readonly onClose?: (() => any) | undefined;
212
212
  readonly flush?: boolean | undefined;
213
+ readonly onClose?: (() => any) | undefined;
213
214
  readonly sheet?: boolean | undefined;
214
215
  readonly onOpen?: (() => any) | undefined;
216
+ readonly closeLabel?: string | undefined;
215
217
  readonly rootClass?: unknown;
216
218
  readonly hideClose?: boolean | undefined;
217
- readonly closeLabel?: string | undefined;
218
219
  readonly beforeClose?: import("./types.ts").DialogBeforeClose | undefined;
219
220
  readonly closedby?: import("../../index.ts").DialogClosedBy | undefined;
220
221
  readonly onCancel?: (() => any) | undefined;
@@ -234,10 +235,12 @@ declare const __VLS_export: import("vue").DefineComponent<Partial<NonNullable<{
234
235
  readonly key?: PropertyKey | undefined;
235
236
  readonly loading?: boolean | undefined;
236
237
  readonly prefix?: "k-modal" | "k-drawer" | undefined;
238
+ readonly label?: string | undefined;
237
239
  readonly style?: import("vue").StyleValue;
238
240
  readonly results?: (string | number) | undefined;
239
241
  readonly placeholder?: string | undefined | undefined;
240
242
  readonly size?: import("./types.ts").ModalSize | undefined;
243
+ readonly dir?: string | undefined | undefined;
241
244
  readonly class?: import("vue").ClassValue;
242
245
  readonly role?: string | undefined | undefined;
243
246
  readonly 'aria-label'?: string | undefined | undefined;
@@ -393,7 +396,6 @@ declare const __VLS_export: import("vue").DefineComponent<Partial<NonNullable<{
393
396
  readonly accesskey?: string | undefined | undefined;
394
397
  readonly contenteditable?: (boolean | "true" | "false") | "inherit" | "plaintext-only" | undefined;
395
398
  readonly contextmenu?: string | undefined | undefined;
396
- readonly dir?: string | undefined | undefined;
397
399
  readonly draggable?: (boolean | "true" | "false") | undefined;
398
400
  readonly enterkeyhint?: "enter" | "done" | "go" | "next" | "previous" | "search" | "send" | undefined | undefined;
399
401
  readonly enterKeyHint?: "search" | "done" | "previous" | "next" | "enter" | "go" | "send" | undefined;
@@ -431,13 +433,13 @@ declare const __VLS_export: import("vue").DefineComponent<Partial<NonNullable<{
431
433
  readonly onVnodeUpdated?: (((vnode: import("vue").VNode, oldVNode: import("vue").VNode) => void) | ((vnode: import("vue").VNode, oldVNode: import("vue").VNode) => void)[]) | undefined;
432
434
  readonly onVnodeBeforeUnmount?: (((vnode: import("vue").VNode) => void) | ((vnode: import("vue").VNode) => void)[]) | undefined;
433
435
  readonly onVnodeUnmounted?: (((vnode: import("vue").VNode) => void) | ((vnode: import("vue").VNode) => void)[]) | undefined;
434
- readonly onClose?: (() => any) | undefined;
435
436
  readonly flush?: boolean | undefined;
437
+ readonly onClose?: (() => any) | undefined;
436
438
  readonly sheet?: boolean | undefined;
437
439
  readonly onOpen?: (() => any) | undefined;
440
+ readonly closeLabel?: string | undefined;
438
441
  readonly rootClass?: unknown;
439
442
  readonly hideClose?: boolean | undefined;
440
- readonly closeLabel?: string | undefined;
441
443
  readonly beforeClose?: import("./types.ts").DialogBeforeClose | undefined;
442
444
  readonly closedby?: import("../../index.ts").DialogClosedBy | undefined;
443
445
  readonly onCancel?: (() => any) | undefined;
@@ -18,14 +18,15 @@
18
18
  :offset="2"
19
19
  :label="menuText"
20
20
  manual-positioning
21
- @open-change="onOpenChange"
21
+ @open-change="isOpen = $event"
22
22
  @select="(item, event) => emit('select', item, event)"
23
23
  />
24
24
  </template>
25
25
 
26
26
  <script setup>
27
- import { computed, ref, shallowRef, useTemplateRef, watch } from "vue";
27
+ import { computed, ref, shallowRef, useTemplateRef } from "vue";
28
28
  import { useLocale } from "../../composables/useLocale";
29
+ import { syncOpenModel } from "../../internal/floating/layer";
29
30
  import MenuList from "../../internal/overlays/MenuList.vue";
30
31
  defineOptions({ inheritAttrs: false });
31
32
  const props = defineProps({
@@ -91,15 +92,12 @@ function onKeydown(event) {
91
92
  openFromElement(document.activeElement);
92
93
  }
93
94
  }
94
- function onOpenChange(value) {
95
- isOpen.value = value;
96
- if (open.value !== value) open.value = value;
97
- }
98
- watch(open, (value) => {
99
- if (value === isOpen.value) return;
100
- if (value) openFromElement(targetRef.value);
101
- else menuRef.value?.hide();
102
- });
95
+ syncOpenModel(
96
+ open,
97
+ isOpen,
98
+ () => openFromElement(targetRef.value),
99
+ () => menuRef.value?.hide()
100
+ );
103
101
  defineExpose({
104
102
  openAt: (x, y) => openAt(pointAt(x, y), "first"),
105
103
  hide: () => menuRef.value?.hide()