vuetify 3.9.0-beta.0 → 3.9.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 (337) hide show
  1. package/dist/_component-variables-labs.sass +1 -0
  2. package/dist/json/attributes.json +3590 -3502
  3. package/dist/json/importMap-labs.json +16 -12
  4. package/dist/json/importMap.json +186 -186
  5. package/dist/json/tags.json +31 -4
  6. package/dist/json/web-types.json +6626 -6392
  7. package/dist/vuetify-labs.cjs +1082 -195
  8. package/dist/vuetify-labs.css +4654 -4339
  9. package/dist/vuetify-labs.d.ts +2027 -493
  10. package/dist/vuetify-labs.esm.js +1082 -196
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +1082 -195
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +663 -170
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +4744 -4671
  17. package/dist/vuetify.d.ts +1575 -267
  18. package/dist/vuetify.esm.js +663 -171
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +663 -170
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1182 -1126
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VAutocomplete/VAutocomplete.d.ts +39 -14
  26. package/lib/components/VAutocomplete/VAutocomplete.js +2 -2
  27. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  28. package/lib/components/VBtn/VBtn.sass +3 -1
  29. package/lib/components/VCarousel/VCarousel.css +0 -1
  30. package/lib/components/VCarousel/VCarousel.js +1 -0
  31. package/lib/components/VCarousel/VCarousel.js.map +1 -1
  32. package/lib/components/VCarousel/VCarousel.sass +0 -1
  33. package/lib/components/VCombobox/VCombobox.d.ts +39 -14
  34. package/lib/components/VCombobox/VCombobox.js +2 -2
  35. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  36. package/lib/components/VDataIterator/composables/items.d.ts +2 -1
  37. package/lib/components/VDataIterator/composables/items.js.map +1 -1
  38. package/lib/components/VDataTable/VDataTable.css +12 -1
  39. package/lib/components/VDataTable/VDataTable.d.ts +20 -38
  40. package/lib/components/VDataTable/VDataTable.sass +12 -2
  41. package/lib/components/VDataTable/VDataTableColumn.d.ts +9 -3
  42. package/lib/components/VDataTable/VDataTableColumn.js +12 -4
  43. package/lib/components/VDataTable/VDataTableColumn.js.map +1 -1
  44. package/lib/components/VDataTable/VDataTableHeaders.d.ts +0 -13
  45. package/lib/components/VDataTable/VDataTableHeaders.js +10 -9
  46. package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
  47. package/lib/components/VDataTable/VDataTableRow.js +2 -0
  48. package/lib/components/VDataTable/VDataTableRow.js.map +1 -1
  49. package/lib/components/VDataTable/VDataTableServer.d.ts +10 -23
  50. package/lib/components/VDataTable/VDataTableVirtual.d.ts +10 -23
  51. package/lib/components/VDataTable/composables/headers.d.ts +22 -14
  52. package/lib/components/VDataTable/composables/headers.js +51 -22
  53. package/lib/components/VDataTable/composables/headers.js.map +1 -1
  54. package/lib/components/VDataTable/composables/sort.js +2 -1
  55. package/lib/components/VDataTable/composables/sort.js.map +1 -1
  56. package/lib/components/VDataTable/types.d.ts +4 -2
  57. package/lib/components/VDataTable/types.js.map +1 -1
  58. package/lib/components/VDatePicker/VDatePicker.js +2 -1
  59. package/lib/components/VDatePicker/VDatePicker.js.map +1 -1
  60. package/lib/components/VDatePicker/VDatePickerControls.css +1 -0
  61. package/lib/components/VDatePicker/VDatePickerControls.sass +1 -0
  62. package/lib/components/VDatePicker/VDatePickerMonth.css +3 -8
  63. package/lib/components/VDatePicker/VDatePickerMonth.js +7 -3
  64. package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
  65. package/lib/components/VDatePicker/VDatePickerMonth.sass +3 -8
  66. package/lib/components/VField/VField.js +2 -10
  67. package/lib/components/VField/VField.js.map +1 -1
  68. package/lib/components/VKbd/VKbd.css +14 -5
  69. package/lib/components/VKbd/VKbd.js.map +1 -1
  70. package/lib/components/VKbd/VKbd.scss +26 -0
  71. package/lib/components/VKbd/_variables.scss +12 -6
  72. package/lib/components/VKbd/index.js.map +1 -1
  73. package/lib/components/VList/VList.d.ts +24 -27
  74. package/lib/components/VList/VList.js +1 -5
  75. package/lib/components/VList/VList.js.map +1 -1
  76. package/lib/components/VList/VListGroup.d.ts +13 -0
  77. package/lib/components/VList/VListGroup.js +2 -1
  78. package/lib/components/VList/VListGroup.js.map +1 -1
  79. package/lib/components/VList/VListItem.d.ts +6 -3
  80. package/lib/components/VList/VListItem.js +1 -1
  81. package/lib/components/VList/VListItem.js.map +1 -1
  82. package/lib/components/VNumberInput/VNumberInput.js +4 -10
  83. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  84. package/lib/components/VNumberInput/hold.js +4 -0
  85. package/lib/components/VNumberInput/hold.js.map +1 -1
  86. package/lib/components/VOtpInput/VOtpInput.js +17 -14
  87. package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
  88. package/lib/components/VOverlay/locationStrategies.js +1 -1
  89. package/lib/components/VOverlay/locationStrategies.js.map +1 -1
  90. package/lib/components/VSelect/VSelect.d.ts +58 -22
  91. package/lib/components/VSelect/VSelect.js +2 -2
  92. package/lib/components/VSelect/VSelect.js.map +1 -1
  93. package/lib/components/VTextField/VTextField.js +1 -1
  94. package/lib/components/VTextField/VTextField.js.map +1 -1
  95. package/lib/components/VTimePicker/VTimePicker.css +1 -6
  96. package/lib/components/VTimePicker/VTimePicker.sass +1 -6
  97. package/lib/components/VTimePicker/VTimePickerClock.css +5 -4
  98. package/lib/components/VTimePicker/VTimePickerClock.sass +5 -4
  99. package/lib/components/VTimePicker/VTimePickerControls.css +2 -1
  100. package/lib/components/VTimePicker/VTimePickerControls.sass +2 -3
  101. package/lib/components/VTreeview/VTreeview.d.ts +235 -188
  102. package/lib/components/VTreeview/VTreeview.js +13 -12
  103. package/lib/components/VTreeview/VTreeview.js.map +1 -1
  104. package/lib/components/VTreeview/VTreeviewChildren.d.ts +94 -10
  105. package/lib/components/VTreeview/VTreeviewChildren.js +61 -17
  106. package/lib/components/VTreeview/VTreeviewChildren.js.map +1 -1
  107. package/lib/components/VTreeview/VTreeviewGroup.d.ts +13 -0
  108. package/lib/components/VTreeview/VTreeviewItem.css +57 -0
  109. package/lib/components/VTreeview/VTreeviewItem.d.ts +1334 -97
  110. package/lib/components/VTreeview/VTreeviewItem.js +25 -16
  111. package/lib/components/VTreeview/VTreeviewItem.js.map +1 -1
  112. package/lib/components/VTreeview/VTreeviewItem.sass +60 -0
  113. package/lib/components/VTreeview/_variables.scss +15 -0
  114. package/lib/composables/calendar.d.ts +2 -1
  115. package/lib/composables/calendar.js +8 -8
  116. package/lib/composables/calendar.js.map +1 -1
  117. package/lib/composables/date/adapters/vuetify.js +1 -1
  118. package/lib/composables/date/adapters/vuetify.js.map +1 -1
  119. package/lib/composables/filter.d.ts +1 -0
  120. package/lib/composables/filter.js +1 -1
  121. package/lib/composables/filter.js.map +1 -1
  122. package/lib/composables/hotkey/hotkey-parsing.d.ts +15 -0
  123. package/lib/composables/hotkey/hotkey-parsing.js +154 -0
  124. package/lib/composables/hotkey/hotkey-parsing.js.map +1 -0
  125. package/lib/composables/hotkey/hotkey.d.ts +9 -0
  126. package/lib/composables/{hotkey.js → hotkey/hotkey.js} +31 -39
  127. package/lib/composables/hotkey/hotkey.js.map +1 -0
  128. package/lib/composables/hotkey/index.d.ts +1 -0
  129. package/lib/composables/hotkey/index.js +2 -0
  130. package/lib/composables/hotkey/index.js.map +1 -0
  131. package/lib/composables/hotkey/key-aliases.d.ts +14 -0
  132. package/lib/composables/hotkey/key-aliases.js +38 -0
  133. package/lib/composables/hotkey/key-aliases.js.map +1 -0
  134. package/lib/composables/icons.d.ts +11 -0
  135. package/lib/composables/icons.js.map +1 -1
  136. package/lib/composables/index.d.ts +1 -0
  137. package/lib/composables/index.js +1 -0
  138. package/lib/composables/index.js.map +1 -1
  139. package/lib/composables/list-items.d.ts +14 -1
  140. package/lib/composables/list-items.js +9 -3
  141. package/lib/composables/list-items.js.map +1 -1
  142. package/lib/composables/nested/nested.d.ts +7 -4
  143. package/lib/composables/nested/nested.js +24 -14
  144. package/lib/composables/nested/nested.js.map +1 -1
  145. package/lib/composables/nested/selectStrategies.d.ts +2 -1
  146. package/lib/composables/nested/selectStrategies.js +22 -11
  147. package/lib/composables/nested/selectStrategies.js.map +1 -1
  148. package/lib/composables/virtual.js +1 -1
  149. package/lib/composables/virtual.js.map +1 -1
  150. package/lib/entry-bundler.js +1 -1
  151. package/lib/entry-bundler.js.map +1 -1
  152. package/lib/framework.d.ts +91 -66
  153. package/lib/framework.js +1 -1
  154. package/lib/framework.js.map +1 -1
  155. package/lib/iconsets/fa.js +12 -1
  156. package/lib/iconsets/fa.js.map +1 -1
  157. package/lib/iconsets/fa4.js +12 -1
  158. package/lib/iconsets/fa4.js.map +1 -1
  159. package/lib/iconsets/md.js +12 -1
  160. package/lib/iconsets/md.js.map +1 -1
  161. package/lib/iconsets/mdi-svg.js +12 -1
  162. package/lib/iconsets/mdi-svg.js.map +1 -1
  163. package/lib/iconsets/mdi.js +12 -1
  164. package/lib/iconsets/mdi.js.map +1 -1
  165. package/lib/labs/VCalendar/VCalendar.d.ts +33 -33
  166. package/lib/labs/VCalendar/VCalendar.js +10 -10
  167. package/lib/labs/VCalendar/VCalendar.js.map +1 -1
  168. package/lib/labs/VCalendar/VCalendarDay.d.ts +33 -33
  169. package/lib/labs/VCalendar/VCalendarDay.js +1 -1
  170. package/lib/labs/VCalendar/VCalendarDay.js.map +1 -1
  171. package/lib/labs/VCalendar/VCalendarInterval.d.ts +36 -36
  172. package/lib/labs/VCalendar/VCalendarInterval.js +9 -9
  173. package/lib/labs/VCalendar/VCalendarInterval.js.map +1 -1
  174. package/lib/labs/VCalendar/VCalendarIntervalEvent.d.ts +12 -12
  175. package/lib/labs/VCalendar/VCalendarIntervalEvent.js +1 -1
  176. package/lib/labs/VCalendar/VCalendarIntervalEvent.js.map +1 -1
  177. package/lib/labs/VCalendar/VCalendarMonthDay.d.ts +36 -36
  178. package/lib/labs/VCalendar/VCalendarMonthDay.js +4 -4
  179. package/lib/labs/VCalendar/VCalendarMonthDay.js.map +1 -1
  180. package/lib/labs/VHotkey/VHotkey.css +242 -0
  181. package/lib/labs/VHotkey/VHotkey.d.ts +387 -0
  182. package/lib/labs/VHotkey/VHotkey.js +432 -0
  183. package/lib/labs/VHotkey/VHotkey.js.map +1 -0
  184. package/lib/labs/VHotkey/VHotkey.scss +253 -0
  185. package/lib/labs/VHotkey/_variables.scss +43 -0
  186. package/lib/labs/VHotkey/index.d.ts +1 -0
  187. package/lib/labs/VHotkey/index.js +2 -0
  188. package/lib/labs/VHotkey/index.js.map +1 -0
  189. package/lib/labs/VIconBtn/VIconBtn.js +1 -0
  190. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  191. package/lib/labs/VPicker/VPicker.css +4 -0
  192. package/lib/labs/VPicker/VPicker.sass +4 -0
  193. package/lib/labs/components.d.ts +1 -0
  194. package/lib/labs/components.js +1 -0
  195. package/lib/labs/components.js.map +1 -1
  196. package/lib/locale/af.d.ts +18 -0
  197. package/lib/locale/af.js +18 -0
  198. package/lib/locale/af.js.map +1 -1
  199. package/lib/locale/ar.d.ts +18 -0
  200. package/lib/locale/ar.js +18 -0
  201. package/lib/locale/ar.js.map +1 -1
  202. package/lib/locale/az.d.ts +18 -0
  203. package/lib/locale/az.js +18 -0
  204. package/lib/locale/az.js.map +1 -1
  205. package/lib/locale/bg.d.ts +18 -0
  206. package/lib/locale/bg.js +18 -0
  207. package/lib/locale/bg.js.map +1 -1
  208. package/lib/locale/ca.d.ts +18 -0
  209. package/lib/locale/ca.js +18 -0
  210. package/lib/locale/ca.js.map +1 -1
  211. package/lib/locale/ckb.d.ts +18 -0
  212. package/lib/locale/ckb.js +18 -0
  213. package/lib/locale/ckb.js.map +1 -1
  214. package/lib/locale/cs.d.ts +18 -0
  215. package/lib/locale/cs.js +18 -0
  216. package/lib/locale/cs.js.map +1 -1
  217. package/lib/locale/da.d.ts +18 -0
  218. package/lib/locale/da.js +18 -0
  219. package/lib/locale/da.js.map +1 -1
  220. package/lib/locale/de.d.ts +18 -0
  221. package/lib/locale/de.js +18 -0
  222. package/lib/locale/de.js.map +1 -1
  223. package/lib/locale/el.d.ts +18 -0
  224. package/lib/locale/el.js +18 -0
  225. package/lib/locale/el.js.map +1 -1
  226. package/lib/locale/en.d.ts +18 -0
  227. package/lib/locale/en.js +18 -0
  228. package/lib/locale/en.js.map +1 -1
  229. package/lib/locale/es.d.ts +18 -0
  230. package/lib/locale/es.js +18 -0
  231. package/lib/locale/es.js.map +1 -1
  232. package/lib/locale/et.d.ts +18 -0
  233. package/lib/locale/et.js +18 -0
  234. package/lib/locale/et.js.map +1 -1
  235. package/lib/locale/fa.d.ts +18 -0
  236. package/lib/locale/fa.js +18 -0
  237. package/lib/locale/fa.js.map +1 -1
  238. package/lib/locale/fi.d.ts +18 -0
  239. package/lib/locale/fi.js +18 -0
  240. package/lib/locale/fi.js.map +1 -1
  241. package/lib/locale/fr.d.ts +18 -0
  242. package/lib/locale/fr.js +18 -0
  243. package/lib/locale/fr.js.map +1 -1
  244. package/lib/locale/he.d.ts +18 -0
  245. package/lib/locale/he.js +18 -0
  246. package/lib/locale/he.js.map +1 -1
  247. package/lib/locale/hr.d.ts +18 -0
  248. package/lib/locale/hr.js +18 -0
  249. package/lib/locale/hr.js.map +1 -1
  250. package/lib/locale/hu.d.ts +18 -0
  251. package/lib/locale/hu.js +18 -0
  252. package/lib/locale/hu.js.map +1 -1
  253. package/lib/locale/id.d.ts +18 -0
  254. package/lib/locale/id.js +18 -0
  255. package/lib/locale/id.js.map +1 -1
  256. package/lib/locale/it.d.ts +18 -0
  257. package/lib/locale/it.js +18 -0
  258. package/lib/locale/it.js.map +1 -1
  259. package/lib/locale/ja.d.ts +18 -0
  260. package/lib/locale/ja.js +18 -0
  261. package/lib/locale/ja.js.map +1 -1
  262. package/lib/locale/km.d.ts +18 -0
  263. package/lib/locale/km.js +18 -0
  264. package/lib/locale/km.js.map +1 -1
  265. package/lib/locale/ko.d.ts +18 -0
  266. package/lib/locale/ko.js +18 -0
  267. package/lib/locale/ko.js.map +1 -1
  268. package/lib/locale/lt.d.ts +18 -0
  269. package/lib/locale/lt.js +18 -0
  270. package/lib/locale/lt.js.map +1 -1
  271. package/lib/locale/lv.d.ts +18 -0
  272. package/lib/locale/lv.js +18 -0
  273. package/lib/locale/lv.js.map +1 -1
  274. package/lib/locale/nl.d.ts +18 -0
  275. package/lib/locale/nl.js +18 -0
  276. package/lib/locale/nl.js.map +1 -1
  277. package/lib/locale/no.d.ts +18 -0
  278. package/lib/locale/no.js +18 -0
  279. package/lib/locale/no.js.map +1 -1
  280. package/lib/locale/pl.d.ts +18 -0
  281. package/lib/locale/pl.js +18 -0
  282. package/lib/locale/pl.js.map +1 -1
  283. package/lib/locale/pt.d.ts +18 -0
  284. package/lib/locale/pt.js +18 -0
  285. package/lib/locale/pt.js.map +1 -1
  286. package/lib/locale/ro.d.ts +18 -0
  287. package/lib/locale/ro.js +18 -0
  288. package/lib/locale/ro.js.map +1 -1
  289. package/lib/locale/ru.d.ts +18 -0
  290. package/lib/locale/ru.js +18 -0
  291. package/lib/locale/ru.js.map +1 -1
  292. package/lib/locale/sk.d.ts +18 -0
  293. package/lib/locale/sk.js +18 -0
  294. package/lib/locale/sk.js.map +1 -1
  295. package/lib/locale/sl.d.ts +18 -0
  296. package/lib/locale/sl.js +18 -0
  297. package/lib/locale/sl.js.map +1 -1
  298. package/lib/locale/sr-Cyrl.d.ts +18 -0
  299. package/lib/locale/sr-Cyrl.js +18 -0
  300. package/lib/locale/sr-Cyrl.js.map +1 -1
  301. package/lib/locale/sr-Latn.d.ts +18 -0
  302. package/lib/locale/sr-Latn.js +18 -0
  303. package/lib/locale/sr-Latn.js.map +1 -1
  304. package/lib/locale/sv.d.ts +18 -0
  305. package/lib/locale/sv.js +18 -0
  306. package/lib/locale/sv.js.map +1 -1
  307. package/lib/locale/th.d.ts +18 -0
  308. package/lib/locale/th.js +18 -0
  309. package/lib/locale/th.js.map +1 -1
  310. package/lib/locale/tr.d.ts +18 -0
  311. package/lib/locale/tr.js +18 -0
  312. package/lib/locale/tr.js.map +1 -1
  313. package/lib/locale/uk.d.ts +18 -0
  314. package/lib/locale/uk.js +18 -0
  315. package/lib/locale/uk.js.map +1 -1
  316. package/lib/locale/vi.d.ts +18 -0
  317. package/lib/locale/vi.js +18 -0
  318. package/lib/locale/vi.js.map +1 -1
  319. package/lib/locale/zh-Hans.d.ts +18 -0
  320. package/lib/locale/zh-Hans.js +18 -0
  321. package/lib/locale/zh-Hans.js.map +1 -1
  322. package/lib/locale/zh-Hant.d.ts +18 -0
  323. package/lib/locale/zh-Hant.js +18 -0
  324. package/lib/locale/zh-Hant.js.map +1 -1
  325. package/lib/util/helpers.d.ts +3 -0
  326. package/lib/util/helpers.js +4 -0
  327. package/lib/util/helpers.js.map +1 -1
  328. package/lib/util/indentLines.d.ts +17 -0
  329. package/lib/util/indentLines.js +34 -0
  330. package/lib/util/indentLines.js.map +1 -0
  331. package/lib/util/index.d.ts +1 -0
  332. package/lib/util/index.js +1 -0
  333. package/lib/util/index.js.map +1 -1
  334. package/package.json +2 -2
  335. package/lib/components/VKbd/VKbd.sass +0 -15
  336. package/lib/composables/hotkey.d.ts +0 -9
  337. package/lib/composables/hotkey.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.9.0-beta.0
2
+ * Vuetify v3.9.0
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -469,6 +469,10 @@ function ensureValidVNode(vnodes) {
469
469
  return child.type !== Fragment || ensureValidVNode(child.children);
470
470
  }) ? vnodes : null;
471
471
  }
472
+ function renderSlot(slot, props, fallback) {
473
+ // TODO: check if slot returns elements: #18308
474
+ return slot?.(props) ?? fallback?.(props);
475
+ }
472
476
  function defer(timeout, cb) {
473
477
  if (!IN_BROWSER || timeout === 0) {
474
478
  cb();
@@ -1614,6 +1618,40 @@ function isPotentiallyScrollable(el) {
1614
1618
  return ['scroll', 'auto'].includes(style.overflowY);
1615
1619
  }
1616
1620
 
1621
+ // Types
1622
+
1623
+ function getIndentLines(_ref) {
1624
+ let {
1625
+ depth,
1626
+ isLast,
1627
+ isLastGroup,
1628
+ leafLinks,
1629
+ separateRoots,
1630
+ parentIndentLines,
1631
+ variant
1632
+ } = _ref;
1633
+ if (!parentIndentLines || !depth) {
1634
+ return {
1635
+ leaf: undefined,
1636
+ node: undefined,
1637
+ children: parentIndentLines
1638
+ };
1639
+ }
1640
+ if (variant === 'simple') {
1641
+ return {
1642
+ leaf: [...parentIndentLines, 'line'],
1643
+ node: [...parentIndentLines, 'line'],
1644
+ children: [...parentIndentLines, 'line']
1645
+ };
1646
+ }
1647
+ const isLastLeaf = isLast && (!isLastGroup || separateRoots || depth > 1);
1648
+ return {
1649
+ leaf: [...parentIndentLines, isLastLeaf ? 'last-leaf' : 'leaf', ...(leafLinks ? ['leaf-link'] : [])],
1650
+ node: [...parentIndentLines, isLastLeaf ? 'last-leaf' : 'leaf'],
1651
+ children: [...parentIndentLines, isLastLeaf ? 'none' : 'line']
1652
+ };
1653
+ }
1654
+
1617
1655
  function isFixedPosition(el) {
1618
1656
  while (el) {
1619
1657
  if (window.getComputedStyle(el).position === 'fixed') {
@@ -1832,7 +1870,18 @@ const aliases = {
1832
1870
  treeviewExpand: 'mdi-menu-right',
1833
1871
  eyeDropper: 'mdi-eyedropper',
1834
1872
  upload: 'mdi-cloud-upload',
1835
- color: 'mdi-palette'
1873
+ color: 'mdi-palette',
1874
+ command: 'mdi-apple-keyboard-command',
1875
+ ctrl: 'mdi-apple-keyboard-control',
1876
+ space: 'mdi-keyboard-space',
1877
+ shift: 'mdi-apple-keyboard-shift',
1878
+ alt: 'mdi-apple-keyboard-option',
1879
+ enter: 'mdi-keyboard-return',
1880
+ arrowup: 'mdi-arrow-up',
1881
+ arrowdown: 'mdi-arrow-down',
1882
+ arrowleft: 'mdi-arrow-left',
1883
+ arrowright: 'mdi-arrow-right',
1884
+ backspace: 'mdi-backspace'
1836
1885
  };
1837
1886
  const mdi = {
1838
1887
  // Not using mergeProps here, functional components merge props by default (?)
@@ -2628,6 +2677,24 @@ var en = {
2628
2677
  exclude: 'The {0} character is not allowed',
2629
2678
  notEmpty: 'Please choose at least one value',
2630
2679
  pattern: 'Invalid format'
2680
+ },
2681
+ hotkey: {
2682
+ then: 'then',
2683
+ ctrl: 'Ctrl',
2684
+ command: 'Command',
2685
+ space: 'Space',
2686
+ shift: 'Shift',
2687
+ alt: 'Alt',
2688
+ enter: 'Enter',
2689
+ escape: 'Escape',
2690
+ upArrow: 'Up Arrow',
2691
+ downArrow: 'Down Arrow',
2692
+ leftArrow: 'Left Arrow',
2693
+ rightArrow: 'Right Arrow',
2694
+ backspace: 'Backspace',
2695
+ option: 'Option',
2696
+ plus: 'plus',
2697
+ shortcut: 'Keyboard shortcut: {0}'
2631
2698
  }
2632
2699
  };
2633
2700
 
@@ -9071,7 +9138,7 @@ const independentSelectStrategy = mandatory => {
9071
9138
  selected.set(id, value ? 'on' : 'off');
9072
9139
  return selected;
9073
9140
  },
9074
- in: (v, children, parents) => {
9141
+ in: (v, children, parents, disabled) => {
9075
9142
  const map = new Map();
9076
9143
  for (const id of v || []) {
9077
9144
  strategy.select({
@@ -9079,7 +9146,8 @@ const independentSelectStrategy = mandatory => {
9079
9146
  value: true,
9080
9147
  selected: map,
9081
9148
  children,
9082
- parents
9149
+ parents,
9150
+ disabled
9083
9151
  });
9084
9152
  }
9085
9153
  return map;
@@ -9111,9 +9179,9 @@ const independentSingleSelectStrategy = mandatory => {
9111
9179
  selected: singleSelected
9112
9180
  });
9113
9181
  },
9114
- in: (v, children, parents) => {
9182
+ in: (v, children, parents, disabled) => {
9115
9183
  if (v?.length) {
9116
- return parentStrategy.in(v.slice(0, 1), children, parents);
9184
+ return parentStrategy.in(v.slice(0, 1), children, parents, disabled);
9117
9185
  }
9118
9186
  return new Map();
9119
9187
  },
@@ -9179,23 +9247,32 @@ const classicSelectStrategy = mandatory => {
9179
9247
  value,
9180
9248
  selected,
9181
9249
  children,
9182
- parents
9250
+ parents,
9251
+ disabled
9183
9252
  } = _ref6;
9184
9253
  id = toRaw(id);
9185
9254
  const original = new Map(selected);
9186
9255
  const items = [id];
9187
9256
  while (items.length) {
9188
9257
  const item = items.shift();
9189
- selected.set(toRaw(item), value ? 'on' : 'off');
9258
+ if (!disabled.has(item)) {
9259
+ selected.set(toRaw(item), value ? 'on' : 'off');
9260
+ }
9190
9261
  if (children.has(item)) {
9191
9262
  items.push(...children.get(item));
9192
9263
  }
9193
9264
  }
9194
9265
  let parent = toRaw(parents.get(id));
9195
9266
  while (parent) {
9196
- const childrenIds = children.get(parent);
9197
- const everySelected = childrenIds.every(cid => selected.get(toRaw(cid)) === 'on');
9198
- const noneSelected = childrenIds.every(cid => !selected.has(toRaw(cid)) || selected.get(toRaw(cid)) === 'off');
9267
+ let everySelected = true;
9268
+ let noneSelected = true;
9269
+ for (const child of children.get(parent)) {
9270
+ const cid = toRaw(child);
9271
+ if (disabled.has(cid)) continue;
9272
+ if (selected.get(cid) !== 'on') everySelected = false;
9273
+ if (selected.has(cid) && selected.get(cid) !== 'off') noneSelected = false;
9274
+ if (!everySelected && !noneSelected) break;
9275
+ }
9199
9276
  selected.set(parent, everySelected ? 'on' : noneSelected ? 'off' : 'indeterminate');
9200
9277
  parent = toRaw(parents.get(parent));
9201
9278
  }
@@ -9212,7 +9289,7 @@ const classicSelectStrategy = mandatory => {
9212
9289
  }
9213
9290
  return selected;
9214
9291
  },
9215
- in: (v, children, parents) => {
9292
+ in: (v, children, parents, disabled) => {
9216
9293
  let map = new Map();
9217
9294
  for (const id of v || []) {
9218
9295
  map = strategy.select({
@@ -9220,7 +9297,8 @@ const classicSelectStrategy = mandatory => {
9220
9297
  value: true,
9221
9298
  selected: map,
9222
9299
  children,
9223
- parents
9300
+ parents,
9301
+ disabled
9224
9302
  });
9225
9303
  }
9226
9304
  return map;
@@ -9267,8 +9345,9 @@ const emptyNested = {
9267
9345
  root: {
9268
9346
  register: () => null,
9269
9347
  unregister: () => null,
9270
- parents: ref(new Map()),
9271
9348
  children: ref(new Map()),
9349
+ parents: ref(new Map()),
9350
+ disabled: ref(new Set()),
9272
9351
  open: () => null,
9273
9352
  openOnSelect: () => null,
9274
9353
  activate: () => null,
@@ -9295,9 +9374,10 @@ const makeNestedProps = propsFactory({
9295
9374
  }, 'nested');
9296
9375
  const useNested = props => {
9297
9376
  let isUnmounted = false;
9298
- const children = ref(new Map());
9299
- const parents = ref(new Map());
9300
- const opened = useProxiedModel(props, 'opened', props.opened, v => new Set(v), v => [...v.values()]);
9377
+ const children = shallowRef(new Map());
9378
+ const parents = shallowRef(new Map());
9379
+ const disabled = shallowRef(new Set());
9380
+ const opened = useProxiedModel(props, 'opened', props.opened, v => new Set(Array.isArray(v) ? v.map(i => toRaw(i)) : v), v => [...v.values()]);
9301
9381
  const activeStrategy = computed(() => {
9302
9382
  if (typeof props.activeStrategy === 'object') return props.activeStrategy;
9303
9383
  if (typeof props.activeStrategy === 'function') return props.activeStrategy(props.mandatory);
@@ -9345,13 +9425,13 @@ const useNested = props => {
9345
9425
  }
9346
9426
  });
9347
9427
  const activated = useProxiedModel(props, 'activated', props.activated, v => activeStrategy.value.in(v, children.value, parents.value), v => activeStrategy.value.out(v, children.value, parents.value));
9348
- const selected = useProxiedModel(props, 'selected', props.selected, v => selectStrategy.value.in(v, children.value, parents.value), v => selectStrategy.value.out(v, children.value, parents.value));
9428
+ const selected = useProxiedModel(props, 'selected', props.selected, v => selectStrategy.value.in(v, children.value, parents.value, disabled.value), v => selectStrategy.value.out(v, children.value, parents.value));
9349
9429
  onBeforeUnmount(() => {
9350
9430
  isUnmounted = true;
9351
9431
  });
9352
9432
  function getPath(id) {
9353
9433
  const path = [];
9354
- let parent = id;
9434
+ let parent = toRaw(id);
9355
9435
  while (parent != null) {
9356
9436
  path.unshift(parent);
9357
9437
  parent = parents.value.get(parent);
@@ -9375,7 +9455,7 @@ const useNested = props => {
9375
9455
  }
9376
9456
  return arr;
9377
9457
  }),
9378
- register: (id, parentId, isGroup) => {
9458
+ register: (id, parentId, isDisabled, isGroup) => {
9379
9459
  if (nodeIds.has(id)) {
9380
9460
  const path = getPath(id).map(String).join(' -> ');
9381
9461
  const newPath = getPath(parentId).concat(id).map(String).join(' -> ');
@@ -9385,6 +9465,7 @@ const useNested = props => {
9385
9465
  nodeIds.add(id);
9386
9466
  }
9387
9467
  parentId && id !== parentId && parents.value.set(id, parentId);
9468
+ isDisabled && disabled.value.add(id);
9388
9469
  isGroup && children.value.set(id, []);
9389
9470
  if (parentId != null) {
9390
9471
  children.value.set(parentId, [...(children.value.get(parentId) || []), id]);
@@ -9394,6 +9475,7 @@ const useNested = props => {
9394
9475
  if (isUnmounted) return;
9395
9476
  nodeIds.delete(id);
9396
9477
  children.value.delete(id);
9478
+ disabled.value.delete(id);
9397
9479
  const parent = parents.value.get(id);
9398
9480
  if (parent) {
9399
9481
  const list = children.value.get(parent) ?? [];
@@ -9443,6 +9525,7 @@ const useNested = props => {
9443
9525
  selected: new Map(selected.value),
9444
9526
  children: children.value,
9445
9527
  parents: parents.value,
9528
+ disabled: disabled.value,
9446
9529
  event
9447
9530
  });
9448
9531
  newSelected && (selected.value = newSelected);
@@ -9485,16 +9568,17 @@ const useNested = props => {
9485
9568
  },
9486
9569
  children,
9487
9570
  parents,
9571
+ disabled,
9488
9572
  getPath
9489
9573
  }
9490
9574
  };
9491
9575
  provide(VNestedSymbol, nested);
9492
9576
  return nested.root;
9493
9577
  };
9494
- const useNestedItem = (id, isGroup) => {
9578
+ const useNestedItem = (id, isDisabled, isGroup) => {
9495
9579
  const parent = inject$1(VNestedSymbol, emptyNested);
9496
9580
  const uidSymbol = Symbol('nested item');
9497
- const computedId = computed(() => toValue(id) ?? uidSymbol);
9581
+ const computedId = computed(() => toRaw(toValue(id)) ?? uidSymbol);
9498
9582
  const item = {
9499
9583
  ...parent,
9500
9584
  id: computedId,
@@ -9503,18 +9587,22 @@ const useNestedItem = (id, isGroup) => {
9503
9587
  isOpen: computed(() => parent.root.opened.value.has(computedId.value)),
9504
9588
  parent: computed(() => parent.root.parents.value.get(computedId.value)),
9505
9589
  activate: (activated, e) => parent.root.activate(computedId.value, activated, e),
9506
- isActivated: computed(() => parent.root.activated.value.has(toRaw(computedId.value))),
9590
+ isActivated: computed(() => parent.root.activated.value.has(computedId.value)),
9507
9591
  select: (selected, e) => parent.root.select(computedId.value, selected, e),
9508
- isSelected: computed(() => parent.root.selected.value.get(toRaw(computedId.value)) === 'on'),
9509
- isIndeterminate: computed(() => parent.root.selected.value.get(toRaw(computedId.value)) === 'indeterminate'),
9592
+ isSelected: computed(() => parent.root.selected.value.get(computedId.value) === 'on'),
9593
+ isIndeterminate: computed(() => parent.root.selected.value.get(computedId.value) === 'indeterminate'),
9510
9594
  isLeaf: computed(() => !parent.root.children.value.get(computedId.value)),
9511
9595
  isGroupActivator: parent.isGroupActivator
9512
9596
  };
9513
9597
  onBeforeMount(() => {
9514
- !parent.isGroupActivator && parent.root.register(computedId.value, parent.id.value, isGroup);
9598
+ if (!parent.isGroupActivator) {
9599
+ parent.root.register(computedId.value, parent.id.value, toValue(isDisabled), isGroup);
9600
+ }
9515
9601
  });
9516
9602
  onBeforeUnmount(() => {
9517
- !parent.isGroupActivator && parent.root.unregister(computedId.value);
9603
+ if (!parent.isGroupActivator) {
9604
+ parent.root.unregister(computedId.value);
9605
+ }
9518
9606
  });
9519
9607
  isGroup && provide(VNestedSymbol, item);
9520
9608
  return item;
@@ -9546,6 +9634,7 @@ const makeVListGroupProps = propsFactory({
9546
9634
  type: IconValue,
9547
9635
  default: '$collapse'
9548
9636
  },
9637
+ disabled: Boolean,
9549
9638
  expandIcon: {
9550
9639
  type: IconValue,
9551
9640
  default: '$expand'
@@ -9571,7 +9660,7 @@ const VListGroup = genericComponent()({
9571
9660
  isOpen,
9572
9661
  open,
9573
9662
  id: _id
9574
- } = useNestedItem(() => props.value, true);
9663
+ } = useNestedItem(() => props.value, () => props.disabled, true);
9575
9664
  const id = computed(() => `v-list-group--id-${String(props.rawId ?? _id.value)}`);
9576
9665
  const list = useList();
9577
9666
  const {
@@ -9741,7 +9830,7 @@ const VListItem = genericComponent()({
9741
9830
  parent,
9742
9831
  openOnSelect,
9743
9832
  id: uid
9744
- } = useNestedItem(id, false);
9833
+ } = useNestedItem(id, () => props.disabled, false);
9745
9834
  const list = useList();
9746
9835
  const isActive = computed(() => props.active !== false && (props.active || link.isActive?.value || (root.activatable.value ? isActivated.value : isSelected.value)));
9747
9836
  const isLink = toRef(() => props.link !== false && link.isLink.value);
@@ -10093,6 +10182,10 @@ const makeItemsProps = propsFactory({
10093
10182
  type: [Boolean, String, Array, Function],
10094
10183
  default: 'props'
10095
10184
  },
10185
+ itemType: {
10186
+ type: [Boolean, String, Array, Function],
10187
+ default: 'type'
10188
+ },
10096
10189
  returnObject: Boolean,
10097
10190
  valueComparator: Function
10098
10191
  }, 'list-items');
@@ -10100,6 +10193,7 @@ function transformItem$3(props, item) {
10100
10193
  const title = getPropertyFromItem(item, props.itemTitle, item);
10101
10194
  const value = getPropertyFromItem(item, props.itemValue, title);
10102
10195
  const children = getPropertyFromItem(item, props.itemChildren);
10196
+ const type = getPropertyFromItem(item, props.itemType, 'item');
10103
10197
  const itemProps = props.itemProps === true ? typeof item === 'object' && item != null && !Array.isArray(item) ? 'children' in item ? omit(item, ['children']) : item : undefined : getPropertyFromItem(item, props.itemProps);
10104
10198
  const _props = {
10105
10199
  title,
@@ -10107,15 +10201,16 @@ function transformItem$3(props, item) {
10107
10201
  ...itemProps
10108
10202
  };
10109
10203
  return {
10204
+ type,
10110
10205
  title: String(_props.title ?? ''),
10111
10206
  value: _props.value,
10112
10207
  props: _props,
10113
- children: Array.isArray(children) ? transformItems$3(props, children) : undefined,
10208
+ children: type === 'item' && Array.isArray(children) ? transformItems$3(props, children) : undefined,
10114
10209
  raw: item
10115
10210
  };
10116
10211
  }
10117
10212
  function transformItems$3(props, items) {
10118
- const _props = pick(props, ['itemTitle', 'itemValue', 'itemChildren', 'itemProps', 'returnObject', 'valueComparator']);
10213
+ const _props = pick(props, ['itemTitle', 'itemValue', 'itemChildren', 'itemProps', 'itemType', 'returnObject', 'valueComparator']);
10119
10214
  const array = [];
10120
10215
  for (const item of items) {
10121
10216
  array.push(transformItem$3(_props, item));
@@ -10157,7 +10252,7 @@ function useItems(props) {
10157
10252
  const _returnObject = props.returnObject;
10158
10253
  const hasValueComparator = !!props.valueComparator;
10159
10254
  const valueComparator = props.valueComparator || deepEqual;
10160
- const _props = pick(props, ['itemTitle', 'itemValue', 'itemChildren', 'itemProps', 'returnObject', 'valueComparator']);
10255
+ const _props = pick(props, ['itemTitle', 'itemValue', 'itemChildren', 'itemProps', 'itemType', 'returnObject', 'valueComparator']);
10161
10256
  const returnValue = [];
10162
10257
  main: for (const v of value) {
10163
10258
  // When the model value is null, return an InternalItem
@@ -10219,7 +10314,7 @@ function useItems(props) {
10219
10314
  function transformItem$2(props, item) {
10220
10315
  const type = getPropertyFromItem(item, props.itemType, 'item');
10221
10316
  const title = isPrimitive(item) ? item : getPropertyFromItem(item, props.itemTitle);
10222
- const value = getPropertyFromItem(item, props.itemValue, undefined);
10317
+ const value = isPrimitive(item) ? item : getPropertyFromItem(item, props.itemValue, undefined);
10223
10318
  const children = getPropertyFromItem(item, props.itemChildren);
10224
10319
  const itemProps = props.itemProps === true ? omit(item, ['children']) : getPropertyFromItem(item, props.itemProps);
10225
10320
  const _props = {
@@ -10277,10 +10372,6 @@ const makeVListProps = propsFactory({
10277
10372
  ...makeDensityProps(),
10278
10373
  ...makeDimensionProps(),
10279
10374
  ...makeElevationProps(),
10280
- itemType: {
10281
- type: String,
10282
- default: 'type'
10283
- },
10284
10375
  ...makeItemsProps(),
10285
10376
  ...makeRoundedProps(),
10286
10377
  ...makeTagProps(),
@@ -10701,7 +10792,7 @@ function connectedLocationStrategy(data, props, contentStyles) {
10701
10792
  });
10702
10793
  if (flipped.isFull) {
10703
10794
  const values = flipped.values();
10704
- if (deepEqual(values.at(-1), values.at(-3))) {
10795
+ if (deepEqual(values.at(-1), values.at(-3)) && !deepEqual(values.at(-1), values.at(-2))) {
10705
10796
  // Flipping is causing a container resize loop
10706
10797
  return;
10707
10798
  }
@@ -12371,11 +12462,7 @@ const VField = genericComponent()({
12371
12462
  default: slots.loader
12372
12463
  }), hasPrepend && createElementVNode("div", {
12373
12464
  "key": "prepend",
12374
- "class": "v-field__prepend-inner",
12375
- "onMousedown": e => {
12376
- e.preventDefault();
12377
- e.stopPropagation();
12378
- }
12465
+ "class": "v-field__prepend-inner"
12379
12466
  }, [props.prependInnerIcon && createVNode(InputIcon, {
12380
12467
  "key": "prepend-icon",
12381
12468
  "name": "prependInner",
@@ -12444,11 +12531,7 @@ const VField = genericComponent()({
12444
12531
  })]), [[vShow, props.dirty]])]
12445
12532
  }), hasAppend && createElementVNode("div", {
12446
12533
  "key": "append",
12447
- "class": "v-field__append-inner",
12448
- "onMousedown": e => {
12449
- e.preventDefault();
12450
- e.stopPropagation();
12451
- }
12534
+ "class": "v-field__append-inner"
12452
12535
  }, [slots['append-inner']?.(slotProps.value), props.appendInnerIcon && createVNode(InputIcon, {
12453
12536
  "key": "append-icon",
12454
12537
  "name": "appendInner",
@@ -12559,7 +12642,7 @@ const VTextField = genericComponent()({
12559
12642
  if (!isFocused.value) focus();
12560
12643
  nextTick(() => {
12561
12644
  if (inputRef.value !== document.activeElement) {
12562
- inputRef.value?.focus();
12645
+ nextTick(() => inputRef.value?.focus());
12563
12646
  }
12564
12647
  });
12565
12648
  }
@@ -12898,7 +12981,7 @@ function useVirtual(props, items) {
12898
12981
  raf = requestAnimationFrame(_calculateVisibleItems);
12899
12982
  }
12900
12983
  function _calculateVisibleItems() {
12901
- if (!containerRef.value || !viewportHeight.value) return;
12984
+ if (!containerRef.value || !viewportHeight.value || !itemHeight.value) return;
12902
12985
  const scrollTop = lastScrollTop - markerOffset;
12903
12986
  const direction = Math.sign(scrollVelocity);
12904
12987
  const startPx = Math.max(0, scrollTop - BUFFER_PX);
@@ -13507,7 +13590,7 @@ const VSelect = genericComponent()({
13507
13590
  key: item.value,
13508
13591
  onClick: () => select(item, null)
13509
13592
  });
13510
- if (item.raw.type === 'divider') {
13593
+ if (item.type === 'divider') {
13511
13594
  return slots.divider?.({
13512
13595
  props: item.raw,
13513
13596
  index
@@ -13515,7 +13598,7 @@ const VSelect = genericComponent()({
13515
13598
  "key": `divider-${index}`
13516
13599
  }), null);
13517
13600
  }
13518
- if (item.raw.type === 'subheader') {
13601
+ if (item.type === 'subheader') {
13519
13602
  return slots.subheader?.({
13520
13603
  props: item.raw,
13521
13604
  index
@@ -13683,7 +13766,7 @@ function filterItems(items, query, options) {
13683
13766
  let match = -1;
13684
13767
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13685
13768
  if (typeof item === 'object') {
13686
- if (['divider', 'subheader'].includes(item.raw?.type)) {
13769
+ if (item.type === 'divider' || item.type === 'subheader') {
13687
13770
  continue;
13688
13771
  }
13689
13772
  const filterKeys = keys || Object.keys(transformed);
@@ -14125,7 +14208,7 @@ const VAutocomplete = genericComponent()({
14125
14208
  active: highlightFirst.value && index === 0 ? true : undefined,
14126
14209
  onClick: () => select(item, null)
14127
14210
  });
14128
- if (item.raw.type === 'divider') {
14211
+ if (item.type === 'divider') {
14129
14212
  return slots.divider?.({
14130
14213
  props: item.raw,
14131
14214
  index
@@ -14133,7 +14216,7 @@ const VAutocomplete = genericComponent()({
14133
14216
  "key": `divider-${index}`
14134
14217
  }), null);
14135
14218
  }
14136
- if (item.raw.type === 'subheader') {
14219
+ if (item.type === 'subheader') {
14137
14220
  return slots.subheader?.({
14138
14221
  props: item.raw,
14139
14222
  index
@@ -15694,6 +15777,7 @@ const VCarousel = genericComponent()({
15694
15777
  }) : createVNode(VBtn, mergeProps(item, props), null);
15695
15778
  })]
15696
15779
  })]), props.progress && createVNode(VProgressLinear, {
15780
+ "absolute": true,
15697
15781
  "class": "v-carousel__progress",
15698
15782
  "color": typeof props.progress === 'string' ? props.progress : undefined,
15699
15783
  "modelValue": (group.getItemIndex(model.value) + 1) / group.items.value.length * 100
@@ -17780,7 +17864,7 @@ function format(value, formatString, locale, formats) {
17780
17864
  case 'fullDate':
17781
17865
  options = {
17782
17866
  year: 'numeric',
17783
- month: 'long',
17867
+ month: 'short',
17784
17868
  day: 'numeric'
17785
17869
  };
17786
17870
  break;
@@ -18358,6 +18442,317 @@ function useDate() {
18358
18442
  return createInstance(options, locale);
18359
18443
  }
18360
18444
 
18445
+ /**
18446
+ * Centralized key alias mapping for consistent key normalization across the hotkey system.
18447
+ *
18448
+ * This maps various user-friendly aliases to canonical key names that match
18449
+ * KeyboardEvent.key values (in lowercase) where possible.
18450
+ */
18451
+ const keyAliasMap = {
18452
+ // Modifier aliases (from vue-use, other libraries, and current implementation)
18453
+ control: 'ctrl',
18454
+ command: 'cmd',
18455
+ option: 'alt',
18456
+ // Arrow key aliases (common abbreviations)
18457
+ up: 'arrowup',
18458
+ down: 'arrowdown',
18459
+ left: 'arrowleft',
18460
+ right: 'arrowright',
18461
+ // Other common key aliases
18462
+ esc: 'escape',
18463
+ spacebar: ' ',
18464
+ space: ' ',
18465
+ return: 'enter',
18466
+ del: 'delete',
18467
+ // Symbol aliases (existing from hotkey-parsing.ts)
18468
+ minus: '-',
18469
+ hyphen: '-'
18470
+ };
18471
+
18472
+ /**
18473
+ * Normalizes a key string to its canonical form using the alias map.
18474
+ *
18475
+ * @param key - The key string to normalize
18476
+ * @returns The canonical key name in lowercase
18477
+ */
18478
+ function normalizeKey(key) {
18479
+ const lowerKey = key.toLowerCase();
18480
+ return keyAliasMap[lowerKey] || lowerKey;
18481
+ }
18482
+
18483
+ // Utilities
18484
+
18485
+ /**
18486
+ * Splits a single combination string into individual key parts.
18487
+ *
18488
+ * A combination is a set of keys that must be pressed simultaneously.
18489
+ * e.g. `ctrl+k`, `shift--`
18490
+ */
18491
+ function splitKeyCombination(combination) {
18492
+ let isInternal = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
18493
+ if (!combination) {
18494
+ if (!isInternal) consoleWarn('Invalid hotkey combination: empty string provided');
18495
+ return [];
18496
+ }
18497
+
18498
+ // --- VALIDATION ---
18499
+ const startsWithPlusOrUnderscore = combination.startsWith('+') || combination.startsWith('_');
18500
+ const hasInvalidLeadingSeparator =
18501
+ // Starts with a single '+' or '_' followed by a non-separator character (e.g. '+a', '_a')
18502
+ startsWithPlusOrUnderscore && !(combination.startsWith('++') || combination.startsWith('__'));
18503
+ const hasInvalidStructure =
18504
+ // Invalid leading separator patterns
18505
+ combination.length > 1 && hasInvalidLeadingSeparator ||
18506
+ // Disallow literal + or _ keys (they require shift)
18507
+ combination.includes('++') || combination.includes('__') || combination === '+' || combination === '_' ||
18508
+ // Ends with a separator that is not part of a doubled literal
18509
+ combination.length > 1 && (combination.endsWith('+') || combination.endsWith('_')) && combination.at(-2) !== combination.at(-1) ||
18510
+ // Stand-alone doubled separators (dangling)
18511
+ combination === '++' || combination === '--' || combination === '__';
18512
+ if (hasInvalidStructure) {
18513
+ if (!isInternal) consoleWarn(`Invalid hotkey combination: "${combination}" has invalid structure`);
18514
+ return [];
18515
+ }
18516
+ const keys = [];
18517
+ let buffer = '';
18518
+ const flushBuffer = () => {
18519
+ if (buffer) {
18520
+ keys.push(normalizeKey(buffer));
18521
+ buffer = '';
18522
+ }
18523
+ };
18524
+ for (let i = 0; i < combination.length; i++) {
18525
+ const char = combination[i];
18526
+ const nextChar = combination[i + 1];
18527
+ if (char === '+' || char === '_' || char === '-') {
18528
+ if (char === nextChar) {
18529
+ flushBuffer();
18530
+ keys.push(char);
18531
+ i++;
18532
+ } else if (char === '+' || char === '_') {
18533
+ flushBuffer();
18534
+ } else {
18535
+ buffer += char;
18536
+ }
18537
+ } else {
18538
+ buffer += char;
18539
+ }
18540
+ }
18541
+ flushBuffer();
18542
+
18543
+ // Within a combination, `-` is only valid as a literal key (e.g., `ctrl+-`).
18544
+ // `-` cannot be part of a longer key name within a combination.
18545
+ const hasInvalidMinus = keys.some(key => key.length > 1 && key.includes('-') && key !== '--');
18546
+ if (hasInvalidMinus) {
18547
+ if (!isInternal) consoleWarn(`Invalid hotkey combination: "${combination}" has invalid structure`);
18548
+ return [];
18549
+ }
18550
+ if (keys.length === 0 && combination) {
18551
+ return [normalizeKey(combination)];
18552
+ }
18553
+ return keys;
18554
+ }
18555
+
18556
+ /**
18557
+ * Splits a hotkey string into its constituent combination groups.
18558
+ *
18559
+ * A sequence is a series of combinations that must be pressed in order.
18560
+ * e.g. `a-b`, `ctrl+k-p`
18561
+ */
18562
+ function splitKeySequence(str) {
18563
+ if (!str) {
18564
+ consoleWarn('Invalid hotkey sequence: empty string provided');
18565
+ return [];
18566
+ }
18567
+
18568
+ // A sequence is invalid if it starts or ends with a separator,
18569
+ // unless it is part of a combination (e.g., `shift+-`).
18570
+ const hasInvalidStart = str.startsWith('-') && !['---', '--+'].includes(str);
18571
+ const hasInvalidEnd = str.endsWith('-') && !str.endsWith('+-') && !str.endsWith('_-') && str !== '-' && str !== '---';
18572
+ if (hasInvalidStart || hasInvalidEnd) {
18573
+ consoleWarn(`Invalid hotkey sequence: "${str}" contains invalid combinations`);
18574
+ return [];
18575
+ }
18576
+ const result = [];
18577
+ let buffer = '';
18578
+ let i = 0;
18579
+ while (i < str.length) {
18580
+ const char = str[i];
18581
+ if (char === '-') {
18582
+ // Determine if this hyphen is part of the current combination
18583
+ const prevChar = str[i - 1];
18584
+ const prevPrevChar = i > 1 ? str[i - 2] : undefined;
18585
+ const precededBySinglePlusOrUnderscore = (prevChar === '+' || prevChar === '_') && prevPrevChar !== '+';
18586
+ if (precededBySinglePlusOrUnderscore) {
18587
+ // Treat as part of the combination (e.g., 'ctrl+-')
18588
+ buffer += char;
18589
+ i++;
18590
+ } else {
18591
+ // Treat as sequence separator
18592
+ if (buffer) {
18593
+ result.push(buffer);
18594
+ buffer = '';
18595
+ } else {
18596
+ // Empty buffer means we have a literal '-' key
18597
+ result.push('-');
18598
+ }
18599
+ i++;
18600
+ }
18601
+ } else {
18602
+ buffer += char;
18603
+ i++;
18604
+ }
18605
+ }
18606
+
18607
+ // Add final buffer if it exists
18608
+ if (buffer) {
18609
+ result.push(buffer);
18610
+ }
18611
+
18612
+ // Collapse runs of '-' so that every second '-' is removed
18613
+ const collapsed = [];
18614
+ let minusCount = 0;
18615
+ for (const part of result) {
18616
+ if (part === '-') {
18617
+ if (minusCount % 2 === 0) collapsed.push('-');
18618
+ minusCount++;
18619
+ } else {
18620
+ minusCount = 0;
18621
+ collapsed.push(part);
18622
+ }
18623
+ }
18624
+
18625
+ // Validate that each part of the sequence is a valid combination
18626
+ const areAllValid = collapsed.every(s => splitKeyCombination(s, true).length > 0);
18627
+ if (!areAllValid) {
18628
+ consoleWarn(`Invalid hotkey sequence: "${str}" contains invalid combinations`);
18629
+ return [];
18630
+ }
18631
+ return collapsed;
18632
+ }
18633
+
18634
+ // Composables
18635
+
18636
+ // Types
18637
+
18638
+ function useHotkey(keys, callback) {
18639
+ let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
18640
+ if (!IN_BROWSER) return function () {};
18641
+ const {
18642
+ event = 'keydown',
18643
+ inputs = false,
18644
+ preventDefault = true,
18645
+ sequenceTimeout = 1000
18646
+ } = options;
18647
+ const isMac = navigator?.userAgent?.includes('Macintosh') ?? false;
18648
+ let timeout = 0;
18649
+ let keyGroups;
18650
+ let isSequence = false;
18651
+ let groupIndex = 0;
18652
+ function clearTimer() {
18653
+ if (!timeout) return;
18654
+ clearTimeout(timeout);
18655
+ timeout = 0;
18656
+ }
18657
+ function isInputFocused() {
18658
+ if (toValue(inputs)) return false;
18659
+ const activeElement = document.activeElement;
18660
+ return activeElement && (activeElement.tagName === 'INPUT' || activeElement.tagName === 'TEXTAREA' || activeElement.isContentEditable || activeElement.contentEditable === 'true');
18661
+ }
18662
+ function resetSequence() {
18663
+ groupIndex = 0;
18664
+ clearTimer();
18665
+ }
18666
+ function handler(e) {
18667
+ const group = keyGroups[groupIndex];
18668
+ if (!group || isInputFocused()) return;
18669
+ if (!matchesKeyGroup(e, group)) {
18670
+ if (isSequence) resetSequence();
18671
+ return;
18672
+ }
18673
+ if (toValue(preventDefault)) e.preventDefault();
18674
+ if (!isSequence) {
18675
+ callback(e);
18676
+ return;
18677
+ }
18678
+ clearTimer();
18679
+ groupIndex++;
18680
+ if (groupIndex === keyGroups.length) {
18681
+ callback(e);
18682
+ resetSequence();
18683
+ return;
18684
+ }
18685
+ timeout = window.setTimeout(resetSequence, toValue(sequenceTimeout));
18686
+ }
18687
+ function cleanup() {
18688
+ window.removeEventListener(toValue(event), handler);
18689
+ clearTimer();
18690
+ }
18691
+ watch(() => toValue(keys), function (unrefKeys) {
18692
+ cleanup();
18693
+ if (unrefKeys) {
18694
+ const groups = splitKeySequence(unrefKeys.toLowerCase());
18695
+ isSequence = groups.length > 1;
18696
+ keyGroups = groups;
18697
+ resetSequence();
18698
+ window.addEventListener(toValue(event), handler);
18699
+ }
18700
+ }, {
18701
+ immediate: true
18702
+ });
18703
+
18704
+ // Watch for changes in the event type to re-register the listener
18705
+ watch(() => toValue(event), function (newEvent, oldEvent) {
18706
+ if (oldEvent && keyGroups && keyGroups.length > 0) {
18707
+ window.removeEventListener(oldEvent, handler);
18708
+ window.addEventListener(newEvent, handler);
18709
+ }
18710
+ });
18711
+ try {
18712
+ getCurrentInstance('useHotkey');
18713
+ onBeforeUnmount(cleanup);
18714
+ } catch {
18715
+ // Not in Vue setup context
18716
+ }
18717
+ function parseKeyGroup(group) {
18718
+ const MODIFIERS = ['ctrl', 'shift', 'alt', 'meta', 'cmd'];
18719
+
18720
+ // Use the shared combination splitting logic
18721
+ const parts = splitKeyCombination(group.toLowerCase());
18722
+
18723
+ // If the combination is invalid, return empty result
18724
+ if (parts.length === 0) {
18725
+ return {
18726
+ modifiers: Object.fromEntries(MODIFIERS.map(m => [m, false])),
18727
+ actualKey: undefined
18728
+ };
18729
+ }
18730
+ const modifiers = Object.fromEntries(MODIFIERS.map(m => [m, false]));
18731
+ let actualKey;
18732
+ for (const part of parts) {
18733
+ if (MODIFIERS.includes(part)) {
18734
+ modifiers[part] = true;
18735
+ } else {
18736
+ actualKey = part;
18737
+ }
18738
+ }
18739
+ return {
18740
+ modifiers,
18741
+ actualKey
18742
+ };
18743
+ }
18744
+ function matchesKeyGroup(e, group) {
18745
+ const {
18746
+ modifiers,
18747
+ actualKey
18748
+ } = parseKeyGroup(group);
18749
+ const expectCtrl = modifiers.ctrl || !isMac && (modifiers.cmd || modifiers.meta);
18750
+ const expectMeta = isMac && (modifiers.cmd || modifiers.meta);
18751
+ return e.ctrlKey === expectCtrl && e.metaKey === expectMeta && e.shiftKey === modifiers.shift && e.altKey === modifiers.alt && e.key.toLowerCase() === actualKey?.toLowerCase();
18752
+ }
18753
+ return cleanup;
18754
+ }
18755
+
18361
18756
  // Types
18362
18757
 
18363
18758
  const makeVColorPickerProps = propsFactory({
@@ -18904,7 +19299,7 @@ const VCombobox = genericComponent()({
18904
19299
  active: highlightFirst.value && index === 0 ? true : undefined,
18905
19300
  onClick: () => select(item, null)
18906
19301
  });
18907
- if (item.raw.type === 'divider') {
19302
+ if (item.type === 'divider') {
18908
19303
  return slots.divider?.({
18909
19304
  props: item.raw,
18910
19305
  index
@@ -18912,7 +19307,7 @@ const VCombobox = genericComponent()({
18912
19307
  "key": `divider-${index}`
18913
19308
  }), null);
18914
19309
  }
18915
- if (item.raw.type === 'subheader') {
19310
+ if (item.type === 'subheader') {
18916
19311
  return slots.subheader?.({
18917
19312
  props: item.raw,
18918
19313
  index
@@ -19786,7 +20181,8 @@ function sortItems(items, sortByItems, locale, options) {
19786
20181
 
19787
20182
  // Dates should be compared numerically
19788
20183
  if (sortA instanceof Date && sortB instanceof Date) {
19789
- return sortA.getTime() - sortB.getTime();
20184
+ sortA = sortA.getTime();
20185
+ sortB = sortB.getTime();
19790
20186
  }
19791
20187
  [sortA, sortB] = [sortA, sortB].map(s => s != null ? s.toString().toLocaleLowerCase() : s);
19792
20188
  if (sortA !== sortB) {
@@ -20495,10 +20891,15 @@ const VDataTableColumn = defineFunctionalComponent({
20495
20891
  type: String,
20496
20892
  default: 'start'
20497
20893
  },
20498
- fixed: Boolean,
20894
+ fixed: {
20895
+ type: [Boolean, String],
20896
+ default: false
20897
+ },
20499
20898
  fixedOffset: [Number, String],
20899
+ fixedEndOffset: [Number, String],
20500
20900
  height: [Number, String],
20501
20901
  lastFixed: Boolean,
20902
+ firstFixedEnd: Boolean,
20502
20903
  noPadding: Boolean,
20503
20904
  tag: String,
20504
20905
  width: [Number, String],
@@ -20509,11 +20910,13 @@ const VDataTableColumn = defineFunctionalComponent({
20509
20910
  slots
20510
20911
  } = _ref;
20511
20912
  const Tag = props.tag ?? 'td';
20913
+ const fixedSide = typeof props.fixed === 'string' ? props.fixed : props.fixed ? 'start' : 'none';
20512
20914
  return createVNode(Tag, {
20513
- "tabindex": "0",
20514
20915
  "class": normalizeClass(['v-data-table__td', {
20515
- 'v-data-table-column--fixed': props.fixed,
20916
+ 'v-data-table-column--fixed': fixedSide === 'start',
20917
+ 'v-data-table-column--fixed-end': fixedSide === 'end',
20516
20918
  'v-data-table-column--last-fixed': props.lastFixed,
20919
+ 'v-data-table-column--first-fixed-end': props.firstFixedEnd,
20517
20920
  'v-data-table-column--no-padding': props.noPadding,
20518
20921
  'v-data-table-column--nowrap': props.nowrap
20519
20922
  }, `v-data-table-column--align-${props.align}`]),
@@ -20521,7 +20924,8 @@ const VDataTableColumn = defineFunctionalComponent({
20521
20924
  height: convertToUnit(props.height),
20522
20925
  width: convertToUnit(props.width),
20523
20926
  maxWidth: convertToUnit(props.maxWidth),
20524
- left: convertToUnit(props.fixedOffset || null)
20927
+ left: fixedSide === 'start' ? convertToUnit(props.fixedOffset || null) : undefined,
20928
+ right: fixedSide === 'end' ? convertToUnit(props.fixedEndOffset || null) : undefined
20525
20929
  }
20526
20930
  }, {
20527
20931
  default: () => [slots.default?.()]
@@ -20618,20 +21022,28 @@ function getDepth(item) {
20618
21022
  }
20619
21023
  function parseFixedColumns(items) {
20620
21024
  let seenFixed = false;
20621
- function setFixed(item) {
20622
- let parentFixed = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
21025
+ function setFixed(item, side) {
21026
+ let parentFixedSide = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'none';
20623
21027
  if (!item) return;
20624
- if (parentFixed) {
20625
- item.fixed = true;
21028
+ if (parentFixedSide !== 'none') {
21029
+ item.fixed = parentFixedSide;
20626
21030
  }
20627
- if (item.fixed) {
20628
- if (item.children) {
20629
- for (let i = item.children.length - 1; i >= 0; i--) {
20630
- setFixed(item.children[i], true);
21031
+
21032
+ // normalize to simplify logic below
21033
+ if (item.fixed === true) {
21034
+ item.fixed = 'start';
21035
+ }
21036
+ const orderedChildren = side === 'start' ? item.children?.toReversed() : item.children;
21037
+ if (item.fixed === side) {
21038
+ if (orderedChildren) {
21039
+ for (const child of orderedChildren) {
21040
+ setFixed(child, side, side);
20631
21041
  }
20632
21042
  } else {
20633
- if (!seenFixed) {
21043
+ if (!seenFixed && side === 'start') {
20634
21044
  item.lastFixed = true;
21045
+ } else if (!seenFixed && side === 'end') {
21046
+ item.firstFixedEnd = true;
20635
21047
  } else if (isNaN(Number(item.width))) {
20636
21048
  consoleError(`Multiple fixed columns should have a static width (key: ${item.key})`);
20637
21049
  } else {
@@ -20640,36 +21052,57 @@ function parseFixedColumns(items) {
20640
21052
  seenFixed = true;
20641
21053
  }
20642
21054
  } else {
20643
- if (item.children) {
20644
- for (let i = item.children.length - 1; i >= 0; i--) {
20645
- setFixed(item.children[i]);
21055
+ if (orderedChildren) {
21056
+ for (const child of orderedChildren) {
21057
+ setFixed(child, side);
20646
21058
  }
20647
21059
  } else {
20648
21060
  seenFixed = false;
20649
21061
  }
20650
21062
  }
20651
21063
  }
20652
- for (let i = items.length - 1; i >= 0; i--) {
20653
- setFixed(items[i]);
21064
+ for (const item of items.toReversed()) {
21065
+ setFixed(item, 'start');
21066
+ }
21067
+ for (const item of items) {
21068
+ setFixed(item, 'end');
20654
21069
  }
20655
21070
  function setFixedOffset(item) {
20656
- let fixedOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
20657
- if (!item) return fixedOffset;
21071
+ let offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
21072
+ if (!item) return offset;
20658
21073
  if (item.children) {
20659
- item.fixedOffset = fixedOffset;
21074
+ item.fixedOffset = offset;
20660
21075
  for (const child of item.children) {
20661
- fixedOffset = setFixedOffset(child, fixedOffset);
21076
+ offset = setFixedOffset(child, offset);
20662
21077
  }
20663
- } else if (item.fixed) {
20664
- item.fixedOffset = fixedOffset;
20665
- fixedOffset += parseFloat(item.width || '0') || 0;
21078
+ } else if (item.fixed && item.fixed !== 'end') {
21079
+ item.fixedOffset = offset;
21080
+ offset += parseFloat(item.width || '0') || 0;
20666
21081
  }
20667
- return fixedOffset;
21082
+ return offset;
20668
21083
  }
20669
21084
  let fixedOffset = 0;
20670
21085
  for (const item of items) {
20671
21086
  fixedOffset = setFixedOffset(item, fixedOffset);
20672
21087
  }
21088
+ function setFixedEndOffset(item) {
21089
+ let offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
21090
+ if (!item) return offset;
21091
+ if (item.children) {
21092
+ item.fixedEndOffset = offset;
21093
+ for (const child of item.children) {
21094
+ offset = setFixedEndOffset(child, offset);
21095
+ }
21096
+ } else if (item.fixed === 'end') {
21097
+ item.fixedEndOffset = offset;
21098
+ offset += parseFloat(item.width || '0') || 0;
21099
+ }
21100
+ return offset;
21101
+ }
21102
+ let fixedEndOffset = 0;
21103
+ for (const item of items.toReversed()) {
21104
+ fixedEndOffset = setFixedEndOffset(item, fixedEndOffset);
21105
+ }
20673
21106
  }
20674
21107
  function parse(items, maxDepth) {
20675
21108
  const headers = [];
@@ -20802,7 +21235,6 @@ const makeVDataTableHeadersProps = propsFactory({
20802
21235
  color: String,
20803
21236
  disableSort: Boolean,
20804
21237
  fixedHeader: Boolean,
20805
- lastFixed: Boolean,
20806
21238
  multiSort: Boolean,
20807
21239
  sortAscIcon: {
20808
21240
  type: IconValue,
@@ -20849,11 +21281,12 @@ const VDataTableHeaders = genericComponent()({
20849
21281
  loaderClasses
20850
21282
  } = useLoader(props);
20851
21283
  function getFixedStyles(column, y) {
20852
- if (!(props.sticky || props.fixedHeader) && !(column.fixed || column.lastFixed)) return undefined;
21284
+ if (!(props.sticky || props.fixedHeader) && !column.fixed) return undefined;
21285
+ const fixedSide = typeof column.fixed === 'string' ? column.fixed : column.fixed ? 'start' : 'none';
20853
21286
  return {
20854
21287
  position: 'sticky',
20855
- left: column.fixed || column.lastFixed ? convertToUnit(column.fixedOffset) : undefined,
20856
- right: column.lastFixed ? convertToUnit(column.fixedOffset ?? 0) : undefined,
21288
+ left: fixedSide === 'start' ? convertToUnit(column.fixedOffset) : undefined,
21289
+ right: fixedSide === 'end' ? convertToUnit(column.fixedEndOffset) : undefined,
20857
21290
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
20858
21291
  };
20859
21292
  }
@@ -20913,14 +21346,15 @@ const VDataTableHeaders = genericComponent()({
20913
21346
  },
20914
21347
  "colspan": column.colspan,
20915
21348
  "rowspan": column.rowspan,
20916
- "onClick": column.sortable ? () => toggleSort(column) : undefined,
20917
21349
  "fixed": column.fixed,
20918
21350
  "nowrap": column.nowrap,
20919
21351
  "lastFixed": column.lastFixed,
20920
- "noPadding": noPadding
20921
- }, headerProps, {
20922
- "onKeydown": event => column.sortable && handleEnterKeyPress(event, column)
20923
- }), {
21352
+ "firstFixedEnd": column.firstFixedEnd,
21353
+ "noPadding": noPadding,
21354
+ "tabindex": column.sortable ? 0 : undefined,
21355
+ "onClick": column.sortable ? () => toggleSort(column) : undefined,
21356
+ "onKeydown": column.sortable ? event => handleEnterKeyPress(event, column) : undefined
21357
+ }, headerProps), {
20924
21358
  default: () => {
20925
21359
  const columnSlotName = `header.${column.key}`;
20926
21360
  const columnSlotProps = {
@@ -21196,7 +21630,9 @@ const VDataTableRow = genericComponent()({
21196
21630
  },
21197
21631
  "fixed": column.fixed,
21198
21632
  "fixedOffset": column.fixedOffset,
21633
+ "fixedEndOffset": column.fixedEndOffset,
21199
21634
  "lastFixed": column.lastFixed,
21635
+ "firstFixedEnd": column.firstFixedEnd,
21200
21636
  "maxWidth": !mobile.value ? column.maxWidth : undefined,
21201
21637
  "noPadding": column.key === 'data-table-select' || column.key === 'data-table-expand',
21202
21638
  "nowrap": column.nowrap,
@@ -22606,10 +23042,9 @@ function useCalendar(props) {
22606
23042
  const date = adapter.setYear(adapter.startOfMonth(adapter.date()), adapter.getYear(year.value));
22607
23043
  return adapter.setMonth(date, value);
22608
23044
  }, v => adapter.getMonth(v));
22609
- const weekDays = computed(() => {
23045
+ const weekdayLabels = computed(() => {
22610
23046
  const firstDayOfWeek = adapter.toJsDate(adapter.startOfWeek(adapter.date(), props.firstDayOfWeek)).getDay();
22611
- // Always generate all days, regardless of props.weekdays
22612
- return [0, 1, 2, 3, 4, 5, 6].map(day => (day + firstDayOfWeek) % 7);
23047
+ return adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).filter((_, i) => props.weekdays.includes((i + firstDayOfWeek) % 7));
22613
23048
  });
22614
23049
  const weeksInMonth = computed(() => {
22615
23050
  const weeks = adapter.getWeekArray(month.value, props.firstDayOfWeek);
@@ -22633,13 +23068,14 @@ function useCalendar(props) {
22633
23068
  });
22634
23069
  function genDays(days, today) {
22635
23070
  return days.filter(date => {
22636
- return weekDays.value.includes(adapter.toJsDate(date).getDay());
23071
+ return props.weekdays.includes(adapter.toJsDate(date).getDay());
22637
23072
  }).map((date, index) => {
22638
23073
  const isoDate = adapter.toISO(date);
22639
23074
  const isAdjacent = !adapter.isSameMonth(date, month.value);
22640
23075
  const isStart = adapter.isSameDay(date, adapter.startOfMonth(month.value));
22641
23076
  const isEnd = adapter.isSameDay(date, adapter.endOfMonth(month.value));
22642
23077
  const isSame = adapter.isSameDay(date, month.value);
23078
+ const weekdaysCount = props.weekdays.length;
22643
23079
  return {
22644
23080
  date,
22645
23081
  formatted: adapter.format(date, 'keyboardDate'),
@@ -22651,8 +23087,8 @@ function useCalendar(props) {
22651
23087
  isSelected: model.value.some(value => adapter.isSameDay(date, value)),
22652
23088
  isStart,
22653
23089
  isToday: adapter.isSameDay(date, today),
22654
- isWeekEnd: index % 7 === 6,
22655
- isWeekStart: index % 7 === 0,
23090
+ isWeekEnd: index % weekdaysCount === weekdaysCount - 1,
23091
+ isWeekStart: index % weekdaysCount === 0,
22656
23092
  isoDate,
22657
23093
  localized: adapter.format(date, 'dayOfMonth'),
22658
23094
  month: adapter.getMonth(date),
@@ -22690,7 +23126,7 @@ function useCalendar(props) {
22690
23126
  if (typeof props.allowedDates === 'function') {
22691
23127
  return !props.allowedDates(date);
22692
23128
  }
22693
- return !props.weekdays.includes(adapter.toJsDate(date).getDay());
23129
+ return false;
22694
23130
  }
22695
23131
  return {
22696
23132
  displayValue,
@@ -22699,7 +23135,7 @@ function useCalendar(props) {
22699
23135
  genDays,
22700
23136
  model,
22701
23137
  weeksInMonth,
22702
- weekDays,
23138
+ weekdayLabels,
22703
23139
  weekNumbers
22704
23140
  };
22705
23141
  }
@@ -22738,7 +23174,8 @@ const VDatePickerMonth = genericComponent()({
22738
23174
  const {
22739
23175
  daysInMonth,
22740
23176
  model,
22741
- weekNumbers
23177
+ weekNumbers,
23178
+ weekdayLabels
22742
23179
  } = useCalendar(props);
22743
23180
  const adapter = useDate();
22744
23181
  const rangeStart = shallowRef();
@@ -22810,7 +23247,10 @@ const VDatePickerMonth = genericComponent()({
22810
23247
  }
22811
23248
  }
22812
23249
  useRender(() => createElementVNode("div", {
22813
- "class": "v-date-picker-month"
23250
+ "class": "v-date-picker-month",
23251
+ "style": {
23252
+ '--v-date-picker-days-in-week': props.weekdays.length
23253
+ }
22814
23254
  }, [props.showWeek && createElementVNode("div", {
22815
23255
  "key": "weeks",
22816
23256
  "class": "v-date-picker-month__weeks"
@@ -22826,7 +23266,7 @@ const VDatePickerMonth = genericComponent()({
22826
23266
  "ref": daysRef,
22827
23267
  "key": daysInMonth.value[0].date?.toString(),
22828
23268
  "class": "v-date-picker-month__days"
22829
- }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => createElementVNode("div", {
23269
+ }, [!props.hideWeekdays && weekdayLabels.value.map(weekDay => createElementVNode("div", {
22830
23270
  "class": normalizeClass(['v-date-picker-month__day', 'v-date-picker-month__weekday'])
22831
23271
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22832
23272
  const slotProps = {
@@ -23209,7 +23649,8 @@ const VDatePicker = genericComponent()({
23209
23649
  }
23210
23650
  function allowedMonths(month) {
23211
23651
  if (typeof props.allowedDates === 'function') {
23212
- const startOfMonth = adapter.parseISO(`${year.value}-${month + 1}-01`);
23652
+ const monthTwoDigits = String(month + 1).padStart(2, '0');
23653
+ const startOfMonth = adapter.parseISO(`${year.value}-${monthTwoDigits}-01`);
23213
23654
  return isAllowedInRange(startOfMonth, adapter.endOfMonth(startOfMonth));
23214
23655
  }
23215
23656
  if (Array.isArray(props.allowedDates) && props.allowedDates.length) {
@@ -25506,6 +25947,8 @@ function useHold(_ref) {
25506
25947
  function holdStart(value) {
25507
25948
  holdStop();
25508
25949
  tick(value);
25950
+ window.addEventListener('pointerup', holdStop);
25951
+ document.addEventListener('blur', holdStop);
25509
25952
  timeout = window.setTimeout(() => {
25510
25953
  interval = window.setInterval(() => tick(value), HOLD_REPEAT);
25511
25954
  }, HOLD_DELAY);
@@ -25513,6 +25956,8 @@ function useHold(_ref) {
25513
25956
  function holdStop() {
25514
25957
  window.clearTimeout(timeout);
25515
25958
  window.clearInterval(interval);
25959
+ window.removeEventListener('pointerup', holdStop);
25960
+ document.removeEventListener('blur', holdStop);
25516
25961
  }
25517
25962
  function tick(value) {
25518
25963
  toggleUpDown(value === 'up');
@@ -25648,7 +26093,7 @@ const VNumberInput = genericComponent()({
25648
26093
  onClick: onControlClick,
25649
26094
  onPointerup: onControlMouseup,
25650
26095
  onPointerdown: onUpControlMousedown,
25651
- onPointercancel: onControlPointerCancel
26096
+ onPointercancel: onControlMouseup
25652
26097
  }
25653
26098
  };
25654
26099
  const decrementSlotProps = {
@@ -25656,7 +26101,7 @@ const VNumberInput = genericComponent()({
25656
26101
  onClick: onControlClick,
25657
26102
  onPointerup: onControlMouseup,
25658
26103
  onPointerdown: onDownControlMousedown,
25659
- onPointercancel: onControlPointerCancel
26104
+ onPointercancel: onControlMouseup
25660
26105
  }
25661
26106
  };
25662
26107
  watch(() => props.precision, () => formatInputValue());
@@ -25737,7 +26182,6 @@ const VNumberInput = genericComponent()({
25737
26182
  const el = e.currentTarget;
25738
26183
  el?.releasePointerCapture(e.pointerId);
25739
26184
  e.preventDefault();
25740
- e.stopPropagation();
25741
26185
  holdStop();
25742
26186
  }
25743
26187
  function onUpControlMousedown(e) {
@@ -25754,11 +26198,6 @@ const VNumberInput = genericComponent()({
25754
26198
  e.stopPropagation();
25755
26199
  holdStart('down');
25756
26200
  }
25757
- function onControlPointerCancel(e) {
25758
- const el = e.currentTarget;
25759
- el?.releasePointerCapture(e.pointerId);
25760
- holdStop();
25761
- }
25762
26201
  function clampModel() {
25763
26202
  if (controlsDisabled.value) return;
25764
26203
  if (!vTextFieldRef.value) return;
@@ -25805,7 +26244,7 @@ const VNumberInput = genericComponent()({
25805
26244
  "onClick": onControlClick,
25806
26245
  "onPointerdown": onUpControlMousedown,
25807
26246
  "onPointerup": onControlMouseup,
25808
- "onPointercancel": onControlPointerCancel,
26247
+ "onPointercancel": onControlMouseup,
25809
26248
  "size": controlNodeSize.value,
25810
26249
  "tabindex": "-1"
25811
26250
  }, null) : createVNode(VDefaultsProvider, {
@@ -25835,7 +26274,7 @@ const VNumberInput = genericComponent()({
25835
26274
  "onClick": onControlClick,
25836
26275
  "onPointerdown": onDownControlMousedown,
25837
26276
  "onPointerup": onControlMouseup,
25838
- "onPointercancel": onControlPointerCancel,
26277
+ "onPointercancel": onControlMouseup,
25839
26278
  "size": controlNodeSize.value,
25840
26279
  "tabindex": "-1"
25841
26280
  }, null) : createVNode(VDefaultsProvider, {
@@ -25982,19 +26421,21 @@ const VOtpInput = genericComponent()({
25982
26421
  const contentRef = ref();
25983
26422
  const inputRef = ref([]);
25984
26423
  const current = computed(() => inputRef.value[focusIndex.value]);
25985
- const intersectScope = effectScope();
25986
- intersectScope.run(() => {
25987
- const {
25988
- intersectionRef,
25989
- isIntersecting
25990
- } = useIntersectionObserver();
25991
- watch(isIntersecting, v => {
25992
- if (!v) return;
25993
- intersectionRef.value?.focus();
25994
- intersectScope.stop();
25995
- });
25996
- watchEffect(() => {
25997
- intersectionRef.value = inputRef.value[0];
26424
+ useToggleScope(() => props.autofocus, () => {
26425
+ const intersectScope = effectScope();
26426
+ intersectScope.run(() => {
26427
+ const {
26428
+ intersectionRef,
26429
+ isIntersecting
26430
+ } = useIntersectionObserver();
26431
+ watchEffect(() => {
26432
+ intersectionRef.value = inputRef.value[0];
26433
+ });
26434
+ watch(isIntersecting, v => {
26435
+ if (!v) return;
26436
+ intersectionRef.value?.focus();
26437
+ intersectScope.stop();
26438
+ });
25998
26439
  });
25999
26440
  });
26000
26441
  function onInput() {
@@ -30005,6 +30446,8 @@ const VTreeviewSymbol = Symbol.for('vuetify:v-treeview');
30005
30446
 
30006
30447
  const makeVTreeviewItemProps = propsFactory({
30007
30448
  loading: Boolean,
30449
+ hideActions: Boolean,
30450
+ indentLines: Array,
30008
30451
  toggleIcon: IconValue,
30009
30452
  ...makeVListItemProps({
30010
30453
  slim: true
@@ -30040,23 +30483,31 @@ const VTreeviewItem = genericComponent()({
30040
30483
  emit('toggleExpand', e);
30041
30484
  }
30042
30485
  useRender(() => {
30043
- const listItemProps = omit(VListItem.filterProps(props), ['onClick']);
30044
- const hasPrepend = slots.prepend || props.toggleIcon;
30486
+ const listItemProps = VListItem.filterProps(props);
30487
+ const hasPrepend = slots.prepend || props.toggleIcon || props.indentLines;
30045
30488
  return createVNode(VListItem, mergeProps({
30046
30489
  "ref": vListItemRef
30047
30490
  }, listItemProps, {
30048
- "active": vListItemRef.value?.isActivated,
30491
+ "active": vListItemRef.value?.isActivated || undefined,
30049
30492
  "class": ['v-treeview-item', {
30050
30493
  'v-treeview-item--activatable-group-activator': isActivatableGroupActivator.value,
30051
30494
  'v-treeview-item--filtered': isFiltered.value
30052
30495
  }, props.class],
30053
30496
  "ripple": false,
30054
- "onClick": props.onClick ?? activateGroupActivator
30497
+ "onClick": activateGroupActivator
30055
30498
  }), {
30056
30499
  ...slots,
30057
30500
  prepend: hasPrepend ? slotProps => {
30058
- return createElementVNode(Fragment, null, [createVNode(VListItemAction, {
30059
- "start": false
30501
+ return createElementVNode(Fragment, null, [props.indentLines && props.indentLines.length > 0 ? createElementVNode("div", {
30502
+ "key": "indent-lines",
30503
+ "class": "v-treeview-indent-lines",
30504
+ "style": {
30505
+ '--v-indent-parts': props.indentLines.length
30506
+ }
30507
+ }, [props.indentLines.map(type => createElementVNode("div", {
30508
+ "class": normalizeClass(`v-treeview-indent-line v-treeview-indent-line--${type}`)
30509
+ }, null))]) : '', !props.hideActions && createVNode(VListItemAction, {
30510
+ "start": true
30060
30511
  }, {
30061
30512
  default: () => [props.toggleIcon ? createVNode(VBtn, {
30062
30513
  "density": "compact",
@@ -30065,13 +30516,11 @@ const VTreeviewItem = genericComponent()({
30065
30516
  "variant": "text",
30066
30517
  "onClick": onClickAction
30067
30518
  }, {
30068
- loader() {
30069
- return createVNode(VProgressCircular, {
30070
- "indeterminate": "disable-shrink",
30071
- "size": "20",
30072
- "width": "2"
30073
- }, null);
30074
- }
30519
+ loader: () => createVNode(VProgressCircular, {
30520
+ "indeterminate": "disable-shrink",
30521
+ "size": "20",
30522
+ "width": "2"
30523
+ }, null)
30075
30524
  }) : createElementVNode("div", {
30076
30525
  "class": "v-treeview-item__level"
30077
30526
  }, null)]
@@ -30079,7 +30528,7 @@ const VTreeviewItem = genericComponent()({
30079
30528
  } : undefined
30080
30529
  });
30081
30530
  });
30082
- return {};
30531
+ return forwardRefs({}, vListItemRef);
30083
30532
  }
30084
30533
  });
30085
30534
 
@@ -30104,14 +30553,20 @@ const makeVTreeviewChildrenProps = propsFactory({
30104
30553
  falseIcon: IconValue,
30105
30554
  trueIcon: IconValue,
30106
30555
  returnObject: Boolean,
30556
+ activatable: Boolean,
30107
30557
  selectable: Boolean,
30108
30558
  selectedColor: String,
30109
30559
  selectStrategy: [String, Function, Object],
30110
30560
  index: Number,
30561
+ isLastGroup: Boolean,
30562
+ separateRoots: Boolean,
30563
+ parentIndentLines: Array,
30564
+ indentLinesVariant: String,
30111
30565
  path: {
30112
30566
  type: Array,
30113
30567
  default: () => []
30114
30568
  },
30569
+ ...pick(makeVTreeviewItemProps(), ['hideActions']),
30115
30570
  ...makeDensityProps()
30116
30571
  }, 'VTreeviewChildren');
30117
30572
  const VTreeviewChildren = genericComponent()({
@@ -30122,7 +30577,8 @@ const VTreeviewChildren = genericComponent()({
30122
30577
  slots
30123
30578
  } = _ref;
30124
30579
  const isLoading = reactive(new Set());
30125
- const isClickOnOpen = computed(() => !props.disabled && (props.openOnClick != null ? props.openOnClick : props.selectable));
30580
+ const activatorItems = ref([]);
30581
+ const isClickOnOpen = computed(() => !props.disabled && (props.openOnClick != null ? props.openOnClick : props.selectable && !props.activatable));
30126
30582
  async function checkChildren(item) {
30127
30583
  try {
30128
30584
  if (!props.items?.length || !props.loadChildren) return;
@@ -30136,22 +30592,35 @@ const VTreeviewChildren = genericComponent()({
30136
30592
  }
30137
30593
  function selectItem(select, isSelected) {
30138
30594
  if (props.selectable) {
30139
- select(!isSelected);
30595
+ select(isSelected);
30140
30596
  }
30141
30597
  }
30142
- return () => slots.default?.() ?? props.items?.map((item, index) => {
30598
+ return () => slots.default?.() ?? props.items?.map((item, index, items) => {
30143
30599
  const {
30144
30600
  children,
30145
30601
  props: itemProps
30146
30602
  } = item;
30147
30603
  const loading = isLoading.has(item.value);
30604
+ const nextItemHasChildren = !!items.at(index + 1)?.children;
30605
+ const depth = props.path?.length ?? 0;
30606
+ const isLast = items.length - 1 === index;
30148
30607
  const treeItemProps = {
30149
30608
  index,
30150
- depth: props.path?.length ?? 0,
30609
+ depth,
30151
30610
  isFirst: index === 0,
30152
- isLast: props.items ? props.items.length - 1 === index : false,
30153
- path: [...props.path, index]
30611
+ isLast,
30612
+ path: [...props.path, index],
30613
+ hideAction: props.hideActions
30154
30614
  };
30615
+ const indentLines = getIndentLines({
30616
+ depth,
30617
+ isLast,
30618
+ isLastGroup: props.isLastGroup,
30619
+ leafLinks: !props.hideActions,
30620
+ separateRoots: props.separateRoots,
30621
+ parentIndentLines: props.parentIndentLines,
30622
+ variant: props.indentLinesVariant
30623
+ });
30155
30624
  const slotsWithItem = {
30156
30625
  prepend: slotProps => createElementVNode(Fragment, null, [props.selectable && (!children || children && !['leaf', 'single-leaf'].includes(props.selectStrategy)) && createElementVNode("div", null, [createVNode(VCheckboxBtn, {
30157
30626
  "key": item.value,
@@ -30164,7 +30633,8 @@ const VTreeviewChildren = genericComponent()({
30164
30633
  "indeterminateIcon": props.indeterminateIcon,
30165
30634
  "falseIcon": props.falseIcon,
30166
30635
  "trueIcon": props.trueIcon,
30167
- "onClick": withModifiers(() => selectItem(slotProps.select, slotProps.isSelected), ['stop']),
30636
+ "onUpdate:modelValue": v => selectItem(slotProps.select, v),
30637
+ "onClick": e => e.stopPropagation(),
30168
30638
  "onKeydown": e => {
30169
30639
  if (!['Enter', 'Space'].includes(e.key)) return;
30170
30640
  e.stopPropagation();
@@ -30211,24 +30681,45 @@ const VTreeviewChildren = genericComponent()({
30211
30681
  ...activatorProps,
30212
30682
  value: itemProps?.value,
30213
30683
  onToggleExpand: [() => checkChildren(item), activatorProps.onClick],
30214
- onClick: isClickOnOpen.value ? [() => checkChildren(item), activatorProps.onClick] : undefined
30684
+ onClick: isClickOnOpen.value ? [() => checkChildren(item), activatorProps.onClick] : () => selectItem(activatorItems.value[index]?.select, !activatorItems.value[index]?.isSelected)
30215
30685
  };
30216
- return createVNode(VTreeviewItem, mergeProps(listItemProps, {
30686
+ return createVNode(VTreeviewItem, mergeProps({
30687
+ "ref": el => activatorItems.value[index] = el
30688
+ }, listItemProps, {
30689
+ "hideActions": props.hideActions,
30690
+ "indentLines": indentLines.node,
30217
30691
  "value": props.returnObject ? item.raw : itemProps.value,
30218
30692
  "loading": loading
30219
30693
  }), slotsWithItem);
30220
30694
  },
30221
30695
  default: () => createVNode(VTreeviewChildren, mergeProps(treeviewChildrenProps, {
30222
30696
  "items": children,
30697
+ "indentLinesVariant": props.indentLinesVariant,
30698
+ "parentIndentLines": indentLines.children,
30699
+ "isLastGroup": nextItemHasChildren,
30223
30700
  "returnObject": props.returnObject
30224
30701
  }), slots)
30225
- }) : slots.item?.({
30702
+ }) : renderSlot(slots.item, {
30226
30703
  props: itemProps,
30227
30704
  item: item.raw,
30228
30705
  internalItem: item
30229
- }) ?? createVNode(VTreeviewItem, mergeProps(itemProps, {
30230
- "value": props.returnObject ? toRaw(item.raw) : itemProps.value
30231
- }), slotsWithItem);
30706
+ }, () => {
30707
+ if (item.type === 'divider') {
30708
+ return renderSlot(slots.divider, {
30709
+ props: item.raw
30710
+ }, () => createVNode(VDivider, item.props, null));
30711
+ }
30712
+ if (item.type === 'subheader') {
30713
+ return renderSlot(slots.subheader, {
30714
+ props: item.raw
30715
+ }, () => createVNode(VListSubheader, item.props, null));
30716
+ }
30717
+ return createVNode(VTreeviewItem, mergeProps(itemProps, {
30718
+ "hideActions": props.hideActions,
30719
+ "indentLines": indentLines.leaf,
30720
+ "value": props.returnObject ? toRaw(item.raw) : itemProps.value
30721
+ }), slotsWithItem);
30722
+ });
30232
30723
  });
30233
30724
  }
30234
30725
  });
@@ -30244,20 +30735,18 @@ function flatten(items) {
30244
30735
  const makeVTreeviewProps = propsFactory({
30245
30736
  fluid: Boolean,
30246
30737
  openAll: Boolean,
30738
+ indentLines: [Boolean, String],
30247
30739
  search: String,
30248
30740
  ...makeFilterProps({
30249
30741
  filterKeys: ['title']
30250
30742
  }),
30251
- ...omit(makeVTreeviewChildrenProps(), ['index', 'path']),
30743
+ ...omit(makeVTreeviewChildrenProps(), ['index', 'path', 'indentLinesVariant', 'parentIndentLines', 'isLastGroup']),
30252
30744
  ...omit(makeVListProps({
30253
30745
  collapseIcon: '$treeviewCollapse',
30254
30746
  expandIcon: '$treeviewExpand',
30255
30747
  slim: true
30256
- }), ['itemType', 'nav', 'openStrategy']),
30257
- modelValue: {
30258
- type: Array,
30259
- default: () => []
30260
- }
30748
+ }), ['nav', 'openStrategy']),
30749
+ modelValue: Array
30261
30750
  }, 'VTreeview');
30262
30751
  const VTreeview = genericComponent()({
30263
30752
  name: 'VTreeview',
@@ -30272,7 +30761,8 @@ const VTreeview = genericComponent()({
30272
30761
  },
30273
30762
  setup(props, _ref) {
30274
30763
  let {
30275
- slots
30764
+ slots,
30765
+ emit
30276
30766
  } = _ref;
30277
30767
  const {
30278
30768
  items
@@ -30281,13 +30771,12 @@ const VTreeview = genericComponent()({
30281
30771
  const baseColor = toRef(() => props.baseColor);
30282
30772
  const color = toRef(() => props.color);
30283
30773
  const activated = useProxiedModel(props, 'activated');
30284
- const model = useProxiedModel(props, 'modelValue');
30285
- const _selected = useProxiedModel(props, 'selected', props.modelValue);
30774
+ const _selected = useProxiedModel(props, 'selected');
30286
30775
  const selected = computed({
30287
- get: () => _selected.value,
30776
+ get: () => props.modelValue ?? _selected.value,
30288
30777
  set(val) {
30289
30778
  _selected.value = val;
30290
- model.value = val;
30779
+ emit('update:modelValue', val);
30291
30780
  }
30292
30781
  });
30293
30782
  const vListRef = ref();
@@ -30353,6 +30842,7 @@ const VTreeview = genericComponent()({
30353
30842
  useRender(() => {
30354
30843
  const listProps = VList.filterProps(props);
30355
30844
  const treeviewChildrenProps = VTreeviewChildren.filterProps(props);
30845
+ const indentLinesVariant = typeof props.indentLines === 'boolean' ? 'default' : props.indentLines;
30356
30846
  return createVNode(VList, mergeProps({
30357
30847
  "ref": vListRef
30358
30848
  }, listProps, {
@@ -30370,7 +30860,9 @@ const VTreeview = genericComponent()({
30370
30860
  default: () => [createVNode(VTreeviewChildren, mergeProps(treeviewChildrenProps, {
30371
30861
  "density": props.density,
30372
30862
  "returnObject": props.returnObject,
30373
- "items": items.value
30863
+ "items": items.value,
30864
+ "parentIndentLines": props.indentLines ? [] : undefined,
30865
+ "indentLinesVariant": indentLinesVariant
30374
30866
  }), slots)]
30375
30867
  });
30376
30868
  });
@@ -30890,7 +31382,7 @@ function createVuetify$1() {
30890
31382
  };
30891
31383
  });
30892
31384
  }
30893
- const version$1 = "3.9.0-beta.0";
31385
+ const version$1 = "3.9.0";
30894
31386
  createVuetify$1.version = version$1;
30895
31387
 
30896
31388
  // Vue's inject() can only be used in setup
@@ -30915,8 +31407,8 @@ const createVuetify = function () {
30915
31407
  ...options
30916
31408
  });
30917
31409
  };
30918
- const version = "3.9.0-beta.0";
31410
+ const version = "3.9.0";
30919
31411
  createVuetify.version = version;
30920
31412
 
30921
- export { index as blueprints, components, createVuetify, directives, useDate, useDefaults, useDisplay, useGoTo, useLayout, useLocale, useRtl, useTheme, version };
31413
+ export { index as blueprints, components, createVuetify, directives, useDate, useDefaults, useDisplay, useGoTo, useHotkey, useLayout, useLocale, useRtl, useTheme, version };
30922
31414
  //# sourceMappingURL=vuetify.esm.js.map