vuetify 3.3.9 → 3.3.11

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 (221) hide show
  1. package/dist/_component-variables-labs.sass +3 -1
  2. package/dist/json/attributes.json +221 -33
  3. package/dist/json/importMap-labs.json +28 -0
  4. package/dist/json/importMap.json +4 -4
  5. package/dist/json/tags.json +79 -0
  6. package/dist/json/web-types.json +693 -34
  7. package/dist/vuetify-labs.css +305 -138
  8. package/dist/vuetify-labs.d.ts +2804 -305
  9. package/dist/vuetify-labs.esm.js +755 -72
  10. package/dist/vuetify-labs.esm.js.map +1 -1
  11. package/dist/vuetify-labs.js +755 -72
  12. package/dist/vuetify-labs.min.css +2 -2
  13. package/dist/vuetify.css +48 -41
  14. package/dist/vuetify.d.ts +67 -31
  15. package/dist/vuetify.esm.js +173 -65
  16. package/dist/vuetify.esm.js.map +1 -1
  17. package/dist/vuetify.js +173 -65
  18. package/dist/vuetify.js.map +1 -1
  19. package/dist/vuetify.min.css +2 -2
  20. package/dist/vuetify.min.js +959 -946
  21. package/dist/vuetify.min.js.map +1 -1
  22. package/lib/blueprints/md1.mjs +5 -0
  23. package/lib/blueprints/md1.mjs.map +1 -1
  24. package/lib/blueprints/md2.mjs +5 -0
  25. package/lib/blueprints/md2.mjs.map +1 -1
  26. package/lib/blueprints/md3.mjs +5 -0
  27. package/lib/blueprints/md3.mjs.map +1 -1
  28. package/lib/components/VAutocomplete/VAutocomplete.mjs +21 -9
  29. package/lib/components/VAutocomplete/VAutocomplete.mjs.map +1 -1
  30. package/lib/components/VAutocomplete/index.d.mts +6 -0
  31. package/lib/components/VCarousel/index.d.mts +12 -10
  32. package/lib/components/VChip/VChip.mjs +3 -3
  33. package/lib/components/VChip/VChip.mjs.map +1 -1
  34. package/lib/components/VCombobox/VCombobox.mjs +10 -4
  35. package/lib/components/VCombobox/VCombobox.mjs.map +1 -1
  36. package/lib/components/VCombobox/index.d.mts +6 -0
  37. package/lib/components/VExpansionPanel/VExpansionPanel.mjs +8 -3
  38. package/lib/components/VExpansionPanel/VExpansionPanel.mjs.map +1 -1
  39. package/lib/components/VFileInput/VFileInput.mjs +1 -0
  40. package/lib/components/VFileInput/VFileInput.mjs.map +1 -1
  41. package/lib/components/VMenu/VMenu.mjs +29 -4
  42. package/lib/components/VMenu/VMenu.mjs.map +1 -1
  43. package/lib/components/VNavigationDrawer/sticky.mjs +1 -1
  44. package/lib/components/VNavigationDrawer/sticky.mjs.map +1 -1
  45. package/lib/components/VOverlay/useActivator.mjs +2 -2
  46. package/lib/components/VOverlay/useActivator.mjs.map +1 -1
  47. package/lib/components/VRangeSlider/VRangeSlider.mjs.map +1 -1
  48. package/lib/components/VRangeSlider/index.d.mts +8 -8
  49. package/lib/components/VRating/VRating.mjs +4 -2
  50. package/lib/components/VRating/VRating.mjs.map +1 -1
  51. package/lib/components/VSelect/VSelect.css +1 -0
  52. package/lib/components/VSelect/VSelect.mjs +23 -8
  53. package/lib/components/VSelect/VSelect.mjs.map +1 -1
  54. package/lib/components/VSelect/VSelect.sass +1 -0
  55. package/lib/components/VSelect/index.d.mts +6 -0
  56. package/lib/components/VSelectionControl/VSelectionControl.mjs +2 -2
  57. package/lib/components/VSelectionControl/VSelectionControl.mjs.map +1 -1
  58. package/lib/components/VSlider/VSlider.mjs +2 -3
  59. package/lib/components/VSlider/VSlider.mjs.map +1 -1
  60. package/lib/components/VSlider/slider.mjs +1 -0
  61. package/lib/components/VSlider/slider.mjs.map +1 -1
  62. package/lib/components/VSwitch/VSwitch.css +3 -0
  63. package/lib/components/VSwitch/VSwitch.sass +3 -0
  64. package/lib/components/VSwitch/_variables.scss +1 -0
  65. package/lib/components/VTable/VTable.css +10 -4
  66. package/lib/components/VTable/VTable.sass +6 -4
  67. package/lib/components/VTextarea/VTextarea.css +0 -3
  68. package/lib/components/VTextarea/VTextarea.sass +0 -4
  69. package/lib/components/VTimeline/VTimeline.css +2 -2
  70. package/lib/components/VTimeline/VTimeline.sass +2 -2
  71. package/lib/components/VWindow/VWindow.mjs +1 -0
  72. package/lib/components/VWindow/VWindow.mjs.map +1 -1
  73. package/lib/components/VWindow/VWindowItem.mjs +3 -1
  74. package/lib/components/VWindow/VWindowItem.mjs.map +1 -1
  75. package/lib/components/VWindow/index.d.mts +29 -11
  76. package/lib/components/index.d.mts +57 -29
  77. package/lib/composables/defaults.mjs.map +1 -1
  78. package/lib/composables/forwardRefs.mjs +14 -0
  79. package/lib/composables/forwardRefs.mjs.map +1 -1
  80. package/lib/composables/group.mjs +1 -1
  81. package/lib/composables/group.mjs.map +1 -1
  82. package/lib/composables/theme.mjs +12 -6
  83. package/lib/composables/theme.mjs.map +1 -1
  84. package/lib/entry-bundler.mjs +1 -1
  85. package/lib/entry-bundler.mjs.map +1 -1
  86. package/lib/framework.mjs +1 -1
  87. package/lib/framework.mjs.map +1 -1
  88. package/lib/index.d.mts +10 -2
  89. package/lib/labs/VDatePicker/VDatePicker.css +6 -5
  90. package/lib/labs/VDatePicker/VDatePicker.mjs +3 -3
  91. package/lib/labs/VDatePicker/VDatePicker.mjs.map +1 -1
  92. package/lib/labs/VDatePicker/VDatePicker.sass +8 -9
  93. package/lib/labs/VDateRangePicker/VDateRangePickerHeader.mjs +2 -2
  94. package/lib/labs/VDateRangePicker/VDateRangePickerHeader.mjs.map +1 -1
  95. package/lib/labs/VInfiniteScroll/VInfiniteScroll.mjs +4 -5
  96. package/lib/labs/VInfiniteScroll/VInfiniteScroll.mjs.map +1 -1
  97. package/lib/labs/VOtpInput/VOtpInput.css +53 -0
  98. package/lib/labs/VOtpInput/VOtpInput.mjs +213 -0
  99. package/lib/labs/VOtpInput/VOtpInput.mjs.map +1 -0
  100. package/lib/labs/VOtpInput/VOtpInput.sass +55 -0
  101. package/lib/labs/VOtpInput/_variables.scss +2 -0
  102. package/lib/labs/VOtpInput/index.d.mts +459 -0
  103. package/lib/labs/VOtpInput/index.mjs +2 -0
  104. package/lib/labs/VOtpInput/index.mjs.map +1 -0
  105. package/lib/labs/VPicker/VPicker.mjs +1 -1
  106. package/lib/labs/VPicker/VPicker.mjs.map +1 -1
  107. package/lib/labs/VStepper/VStepper.css +42 -0
  108. package/lib/labs/VStepper/VStepper.mjs +147 -0
  109. package/lib/labs/VStepper/VStepper.mjs.map +1 -0
  110. package/lib/labs/VStepper/VStepper.sass +44 -0
  111. package/lib/labs/VStepper/VStepperActions.mjs +61 -0
  112. package/lib/labs/VStepper/VStepperActions.mjs.map +1 -0
  113. package/lib/labs/VStepper/VStepperHeader.mjs +4 -0
  114. package/lib/labs/VStepper/VStepperHeader.mjs.map +1 -0
  115. package/lib/labs/VStepper/VStepperItem.css +67 -0
  116. package/lib/labs/VStepper/VStepperItem.mjs +114 -0
  117. package/lib/labs/VStepper/VStepperItem.mjs.map +1 -0
  118. package/lib/labs/VStepper/VStepperItem.sass +71 -0
  119. package/lib/labs/VStepper/VStepperWindow.mjs +50 -0
  120. package/lib/labs/VStepper/VStepperWindow.mjs.map +1 -0
  121. package/lib/labs/VStepper/VStepperWindowItem.mjs +24 -0
  122. package/lib/labs/VStepper/VStepperWindowItem.mjs.map +1 -0
  123. package/lib/labs/VStepper/_variables.scss +4 -0
  124. package/lib/labs/VStepper/index.d.mts +2051 -0
  125. package/lib/labs/VStepper/index.mjs +7 -0
  126. package/lib/labs/VStepper/index.mjs.map +1 -0
  127. package/lib/labs/components.d.mts +2751 -267
  128. package/lib/labs/components.mjs +2 -0
  129. package/lib/labs/components.mjs.map +1 -1
  130. package/lib/labs/date/adapters/vuetify.mjs +6 -7
  131. package/lib/labs/date/adapters/vuetify.mjs.map +1 -1
  132. package/lib/locale/af.mjs +6 -1
  133. package/lib/locale/af.mjs.map +1 -1
  134. package/lib/locale/ar.mjs +6 -1
  135. package/lib/locale/ar.mjs.map +1 -1
  136. package/lib/locale/az.mjs +6 -1
  137. package/lib/locale/az.mjs.map +1 -1
  138. package/lib/locale/bg.mjs +6 -1
  139. package/lib/locale/bg.mjs.map +1 -1
  140. package/lib/locale/ca.mjs +6 -1
  141. package/lib/locale/ca.mjs.map +1 -1
  142. package/lib/locale/ckb.mjs +6 -1
  143. package/lib/locale/ckb.mjs.map +1 -1
  144. package/lib/locale/cs.mjs +6 -1
  145. package/lib/locale/cs.mjs.map +1 -1
  146. package/lib/locale/da.mjs +6 -1
  147. package/lib/locale/da.mjs.map +1 -1
  148. package/lib/locale/de.mjs +6 -1
  149. package/lib/locale/de.mjs.map +1 -1
  150. package/lib/locale/el.mjs +6 -1
  151. package/lib/locale/el.mjs.map +1 -1
  152. package/lib/locale/en.mjs +6 -1
  153. package/lib/locale/en.mjs.map +1 -1
  154. package/lib/locale/es.mjs +6 -1
  155. package/lib/locale/es.mjs.map +1 -1
  156. package/lib/locale/et.mjs +6 -1
  157. package/lib/locale/et.mjs.map +1 -1
  158. package/lib/locale/fa.mjs +6 -1
  159. package/lib/locale/fa.mjs.map +1 -1
  160. package/lib/locale/fi.mjs +6 -1
  161. package/lib/locale/fi.mjs.map +1 -1
  162. package/lib/locale/fr.mjs +6 -1
  163. package/lib/locale/fr.mjs.map +1 -1
  164. package/lib/locale/he.mjs +6 -1
  165. package/lib/locale/he.mjs.map +1 -1
  166. package/lib/locale/hr.mjs +6 -1
  167. package/lib/locale/hr.mjs.map +1 -1
  168. package/lib/locale/hu.mjs +6 -1
  169. package/lib/locale/hu.mjs.map +1 -1
  170. package/lib/locale/id.mjs +6 -1
  171. package/lib/locale/id.mjs.map +1 -1
  172. package/lib/locale/index.d.mts +210 -0
  173. package/lib/locale/it.mjs +6 -1
  174. package/lib/locale/it.mjs.map +1 -1
  175. package/lib/locale/ja.mjs +6 -1
  176. package/lib/locale/ja.mjs.map +1 -1
  177. package/lib/locale/ko.mjs +6 -1
  178. package/lib/locale/ko.mjs.map +1 -1
  179. package/lib/locale/lt.mjs +6 -1
  180. package/lib/locale/lt.mjs.map +1 -1
  181. package/lib/locale/lv.mjs +6 -1
  182. package/lib/locale/lv.mjs.map +1 -1
  183. package/lib/locale/nl.mjs +6 -1
  184. package/lib/locale/nl.mjs.map +1 -1
  185. package/lib/locale/no.mjs +6 -1
  186. package/lib/locale/no.mjs.map +1 -1
  187. package/lib/locale/pl.mjs +6 -1
  188. package/lib/locale/pl.mjs.map +1 -1
  189. package/lib/locale/pt.mjs +6 -1
  190. package/lib/locale/pt.mjs.map +1 -1
  191. package/lib/locale/ro.mjs +23 -18
  192. package/lib/locale/ro.mjs.map +1 -1
  193. package/lib/locale/ru.mjs +6 -1
  194. package/lib/locale/ru.mjs.map +1 -1
  195. package/lib/locale/sk.mjs +6 -1
  196. package/lib/locale/sk.mjs.map +1 -1
  197. package/lib/locale/sl.mjs +6 -1
  198. package/lib/locale/sl.mjs.map +1 -1
  199. package/lib/locale/sr-Cyrl.mjs +6 -1
  200. package/lib/locale/sr-Cyrl.mjs.map +1 -1
  201. package/lib/locale/sr-Latn.mjs +6 -1
  202. package/lib/locale/sr-Latn.mjs.map +1 -1
  203. package/lib/locale/sv.mjs +6 -1
  204. package/lib/locale/sv.mjs.map +1 -1
  205. package/lib/locale/th.mjs +6 -1
  206. package/lib/locale/th.mjs.map +1 -1
  207. package/lib/locale/tr.mjs +6 -1
  208. package/lib/locale/tr.mjs.map +1 -1
  209. package/lib/locale/uk.mjs +6 -1
  210. package/lib/locale/uk.mjs.map +1 -1
  211. package/lib/locale/vi.mjs +6 -1
  212. package/lib/locale/vi.mjs.map +1 -1
  213. package/lib/locale/zh-Hans.mjs +6 -1
  214. package/lib/locale/zh-Hans.mjs.map +1 -1
  215. package/lib/locale/zh-Hant.mjs +6 -1
  216. package/lib/locale/zh-Hant.mjs.map +1 -1
  217. package/lib/util/globals.mjs +0 -1
  218. package/lib/util/globals.mjs.map +1 -1
  219. package/lib/util/helpers.mjs +32 -12
  220. package/lib/util/helpers.mjs.map +1 -1
  221. package/package.json +3 -2
package/dist/vuetify.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.3.9
2
+ * Vuetify v3.3.11
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -75,6 +75,10 @@
75
75
  }
76
76
  }, 'component');
77
77
 
78
+ const IN_BROWSER = typeof window !== 'undefined';
79
+ const SUPPORTS_INTERSECTION = IN_BROWSER && 'IntersectionObserver' in window;
80
+ const SUPPORTS_TOUCH = IN_BROWSER && ('ontouchstart' in window || window.navigator.maxTouchPoints > 0);
81
+
78
82
  function _classPrivateFieldInitSpec(obj, privateMap, value) { _checkPrivateRedeclaration(obj, privateMap); privateMap.set(obj, value); }
79
83
  function _checkPrivateRedeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { throw new TypeError("Cannot initialize the same private elements twice on an object"); } }
80
84
  function _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, "set"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }
@@ -407,12 +411,22 @@
407
411
  }
408
412
  }
409
413
  function focusableChildren(el) {
410
- const targets = ['button', '[href]', 'input:not([type="hidden"])', 'select', 'textarea', '[tabindex]'].map(s => `${s}:not([tabindex="-1"]):not([disabled])`).join(', ');
414
+ let filterByTabIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
415
+ const targets = ['button', '[href]', 'input:not([type="hidden"])', 'select', 'textarea', '[tabindex]'].map(s => `${s}${filterByTabIndex ? ':not([tabindex="-1"])' : ''}:not([disabled])`).join(', ');
411
416
  return [...el.querySelectorAll(targets)];
412
417
  }
418
+ function getNextElement(elements, location, condition) {
419
+ let _el;
420
+ let idx = elements.indexOf(document.activeElement);
421
+ const inc = location === 'next' ? 1 : -1;
422
+ do {
423
+ idx += inc;
424
+ _el = elements[idx];
425
+ } while ((!_el || _el.offsetParent == null || !(condition?.(_el) ?? true)) && idx < elements.length && idx >= 0);
426
+ return _el;
427
+ }
413
428
  function focusChild(el, location) {
414
429
  const focusable = focusableChildren(el);
415
- const idx = focusable.indexOf(document.activeElement);
416
430
  if (!location) {
417
431
  if (el === document.activeElement || !el.contains(document.activeElement)) {
418
432
  focusable[0]?.focus();
@@ -421,19 +435,26 @@
421
435
  focusable[0]?.focus();
422
436
  } else if (location === 'last') {
423
437
  focusable.at(-1)?.focus();
438
+ } else if (typeof location === 'number') {
439
+ focusable[location]?.focus();
424
440
  } else {
425
- let _el;
426
- let idxx = idx;
427
- const inc = location === 'next' ? 1 : -1;
428
- do {
429
- idxx += inc;
430
- _el = focusable[idxx];
431
- } while ((!_el || _el.offsetParent == null) && idxx < focusable.length && idxx >= 0);
441
+ const _el = getNextElement(focusable, location);
432
442
  if (_el) _el.focus();else focusChild(el, location === 'next' ? 'first' : 'last');
433
443
  }
434
444
  }
435
445
  function noop() {}
436
446
 
447
+ /** Returns null if the selector is not supported or we can't check */
448
+ function matchesSelector(el, selector) {
449
+ const supportsSelector = IN_BROWSER && typeof CSS !== 'undefined' && typeof CSS.supports !== 'undefined' && CSS.supports(`selector(${selector})`);
450
+ if (!supportsSelector) return null;
451
+ try {
452
+ return !!el && el.matches(selector);
453
+ } catch (err) {
454
+ return null;
455
+ }
456
+ }
457
+
437
458
  // Utilities
438
459
  const block = ['top', 'bottom'];
439
460
  const inline = ['start', 'end', 'left', 'right'];
@@ -1279,11 +1300,6 @@
1279
1300
  return ['scroll', 'auto'].includes(style.overflowY);
1280
1301
  }
1281
1302
 
1282
- const IN_BROWSER = typeof window !== 'undefined';
1283
- const SUPPORTS_INTERSECTION = IN_BROWSER && 'IntersectionObserver' in window;
1284
- const SUPPORTS_TOUCH = IN_BROWSER && ('ontouchstart' in window || window.navigator.maxTouchPoints > 0);
1285
- const SUPPORTS_FOCUS_VISIBLE = IN_BROWSER && typeof CSS !== 'undefined' && typeof CSS.supports !== 'undefined' && CSS.supports('selector(:focus-visible)');
1286
-
1287
1303
  // Utilities
1288
1304
 
1289
1305
  // Types
@@ -1685,7 +1701,8 @@
1685
1701
  input: {
1686
1702
  clear: 'Clear {0}',
1687
1703
  prependAction: '{0} prepended action',
1688
- appendAction: '{0} appended action'
1704
+ appendAction: '{0} appended action',
1705
+ otp: 'Please enter OTP character {0}'
1689
1706
  },
1690
1707
  fileInput: {
1691
1708
  counter: '{0} files',
@@ -1706,6 +1723,10 @@
1706
1723
  last: 'Last page'
1707
1724
  }
1708
1725
  },
1726
+ stepper: {
1727
+ next: 'Next',
1728
+ prev: 'Previous'
1729
+ },
1709
1730
  rating: {
1710
1731
  ariaLabel: {
1711
1732
  item: 'Rating {0} of {1}'
@@ -2244,9 +2265,11 @@
2244
2265
  if (head) {
2245
2266
  if (head.push) {
2246
2267
  const entry = head.push(getHead);
2247
- vue.watch(styles, () => {
2248
- entry.patch(getHead);
2249
- });
2268
+ if (IN_BROWSER) {
2269
+ vue.watch(styles, () => {
2270
+ entry.patch(getHead);
2271
+ });
2272
+ }
2250
2273
  } else {
2251
2274
  if (IN_BROWSER) {
2252
2275
  head.addHeadObjs(vue.computed(getHead));
@@ -2257,9 +2280,13 @@
2257
2280
  }
2258
2281
  } else {
2259
2282
  let styleEl = IN_BROWSER ? document.getElementById('vuetify-theme-stylesheet') : null;
2260
- vue.watch(styles, updateStyles, {
2261
- immediate: true
2262
- });
2283
+ if (IN_BROWSER) {
2284
+ vue.watch(styles, updateStyles, {
2285
+ immediate: true
2286
+ });
2287
+ } else {
2288
+ updateStyles();
2289
+ }
2263
2290
  function updateStyles() {
2264
2291
  if (typeof document !== 'undefined' && !styleEl) {
2265
2292
  const el = document.createElement('style');
@@ -3864,7 +3891,7 @@
3864
3891
  throw new Error(`[Vuetify] Could not find useGroup injection with symbol ${injectKey.description}`);
3865
3892
  }
3866
3893
  const value = vue.toRef(props, 'value');
3867
- const disabled = vue.computed(() => group.disabled.value || props.disabled);
3894
+ const disabled = vue.computed(() => !!(group.disabled.value || props.disabled));
3868
3895
  group.register({
3869
3896
  id,
3870
3897
  value,
@@ -5799,7 +5826,7 @@
5799
5826
  });
5800
5827
  function onFocus(e) {
5801
5828
  isFocused.value = true;
5802
- if (!SUPPORTS_FOCUS_VISIBLE || SUPPORTS_FOCUS_VISIBLE && e.target.matches(':focus-visible')) {
5829
+ if (matchesSelector(e.target, ':focus-visible') !== false) {
5803
5830
  isFocusVisible.value = true;
5804
5831
  }
5805
5832
  }
@@ -6808,7 +6835,7 @@
6808
6835
  }, [!slots.filter ? vue.createVNode(VIcon, {
6809
6836
  "key": "filter-icon",
6810
6837
  "icon": props.filterIcon
6811
- }, null) : vue.withDirectives(vue.createVNode(VDefaultsProvider, {
6838
+ }, null) : vue.createVNode(VDefaultsProvider, {
6812
6839
  "key": "filter-defaults",
6813
6840
  "disabled": !props.filterIcon,
6814
6841
  "defaults": {
@@ -6816,7 +6843,7 @@
6816
6843
  icon: props.filterIcon
6817
6844
  }
6818
6845
  }
6819
- }, null), [[vue.resolveDirective("slot"), slots.filter, "default"]])]), [[vue.vShow, group.isSelected.value]])]
6846
+ }, slots.filter)]), [[vue.vShow, group.isSelected.value]])]
6820
6847
  }), hasPrepend && vue.createVNode("div", {
6821
6848
  "key": "prepend",
6822
6849
  "class": "v-chip__prepend"
@@ -8897,7 +8924,7 @@
8897
8924
  runCloseDelay();
8898
8925
  },
8899
8926
  onFocus: e => {
8900
- if (SUPPORTS_FOCUS_VISIBLE && !e.target.matches(':focus-visible')) return;
8927
+ if (matchesSelector(e.target, ':focus-visible') === false) return;
8901
8928
  isFocused = true;
8902
8929
  e.stopPropagation();
8903
8930
  activatorEl.value = e.currentTarget || e.target;
@@ -9718,6 +9745,20 @@
9718
9745
  }
9719
9746
  return false;
9720
9747
  },
9748
+ set(target, key, value) {
9749
+ if (Reflect.has(target, key)) {
9750
+ return Reflect.set(target, key, value);
9751
+ }
9752
+
9753
+ // Skip internal properties
9754
+ if (typeof key === 'symbol' || key.startsWith('__')) return false;
9755
+ for (const ref of refs) {
9756
+ if (ref.value && Reflect.has(ref.value, key)) {
9757
+ return Reflect.set(ref.value, key, value);
9758
+ }
9759
+ }
9760
+ return false;
9761
+ },
9721
9762
  getOwnPropertyDescriptor(target, key) {
9722
9763
  const descriptor = Reflect.getOwnPropertyDescriptor(target, key);
9723
9764
  if (descriptor) return descriptor;
@@ -9803,8 +9844,30 @@
9803
9844
  }, 40);
9804
9845
  }
9805
9846
  });
9847
+ function onFocusIn(e) {
9848
+ const before = e.relatedTarget;
9849
+ const after = e.target;
9850
+ if (before !== after && overlay.value?.contentEl &&
9851
+ // We're the topmost menu
9852
+ overlay.value?.globalTop &&
9853
+ // It isn't the document or the menu body
9854
+ ![document, overlay.value.contentEl].includes(after) &&
9855
+ // It isn't inside the menu body
9856
+ !overlay.value.contentEl.contains(after)) {
9857
+ const focusable = focusableChildren(overlay.value.contentEl);
9858
+ focusable[0]?.focus();
9859
+ }
9860
+ }
9806
9861
  vue.watch(isActive, val => {
9807
- val ? parent?.register() : parent?.unregister();
9862
+ if (val) {
9863
+ parent?.register();
9864
+ document.addEventListener('focusin', onFocusIn, {
9865
+ once: true
9866
+ });
9867
+ } else {
9868
+ parent?.unregister();
9869
+ document.removeEventListener('focusin', onFocusIn);
9870
+ }
9808
9871
  });
9809
9872
  function onClickOutside() {
9810
9873
  parent?.closeParents();
@@ -9812,8 +9875,11 @@
9812
9875
  function onKeydown(e) {
9813
9876
  if (props.disabled) return;
9814
9877
  if (e.key === 'Tab') {
9815
- isActive.value = false;
9816
- overlay.value?.activatorEl?.focus();
9878
+ const nextElement = getNextElement(focusableChildren(overlay.value?.contentEl, false), e.shiftKey ? 'prev' : 'next', el => el.tabIndex >= 0);
9879
+ if (!nextElement) {
9880
+ isActive.value = false;
9881
+ overlay.value?.activatorEl?.focus();
9882
+ }
9817
9883
  }
9818
9884
  }
9819
9885
  function onActivatorKeydown(e) {
@@ -10727,6 +10793,7 @@
10727
10793
  type: Function,
10728
10794
  default: deepEqual
10729
10795
  },
10796
+ itemColor: String,
10730
10797
  ...makeItemsProps({
10731
10798
  itemChildren: false
10732
10799
  })
@@ -10779,7 +10846,12 @@
10779
10846
  const form = useForm();
10780
10847
  const selections = vue.computed(() => {
10781
10848
  return model.value.map(v => {
10782
- return items.value.find(item => props.valueComparator(item.value, v.value)) || v;
10849
+ return items.value.find(item => {
10850
+ const itemRawValue = getPropertyFromItem(item.raw, props.itemValue);
10851
+ const modelRawValue = getPropertyFromItem(v.raw, props.itemValue);
10852
+ if (itemRawValue === undefined || modelRawValue === undefined) return false;
10853
+ return props.returnObject ? props.valueComparator(itemRawValue, modelRawValue) : props.valueComparator(item.value, v.value);
10854
+ }) || v;
10783
10855
  });
10784
10856
  });
10785
10857
  const selected = vue.computed(() => selections.value.map(selection => selection.props.value));
@@ -10808,7 +10880,7 @@
10808
10880
  menu.value = !menu.value;
10809
10881
  }
10810
10882
  function onKeydown(e) {
10811
- if (props.readonly || form?.isReadonly.value) return;
10883
+ if (!e.key || props.readonly || form?.isReadonly.value) return;
10812
10884
  if (['Enter', ' ', 'ArrowDown', 'ArrowUp', 'Home', 'End'].includes(e.key)) {
10813
10885
  e.preventDefault();
10814
10886
  }
@@ -10872,6 +10944,16 @@
10872
10944
  function onFocusin(e) {
10873
10945
  isFocused.value = true;
10874
10946
  }
10947
+ function onModelUpdate(v) {
10948
+ if (v == null) model.value = [];else if (matchesSelector(vTextFieldRef.value, ':autofill') || matchesSelector(vTextFieldRef.value, ':-webkit-autofill')) {
10949
+ const item = items.value.find(item => item.title === v);
10950
+ if (item) {
10951
+ select(item);
10952
+ }
10953
+ } else if (vTextFieldRef.value) {
10954
+ vTextFieldRef.value.value = '';
10955
+ }
10956
+ }
10875
10957
  useRender(() => {
10876
10958
  const hasChips = !!(props.chips || slots.chip);
10877
10959
  const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']);
@@ -10882,9 +10964,7 @@
10882
10964
  "ref": vTextFieldRef
10883
10965
  }, textFieldProps, {
10884
10966
  "modelValue": model.value.map(v => v.props.value).join(', '),
10885
- "onUpdate:modelValue": v => {
10886
- if (v == null) model.value = [];
10887
- },
10967
+ "onUpdate:modelValue": onModelUpdate,
10888
10968
  "focused": isFocused.value,
10889
10969
  "onUpdate:focused": $event => isFocused.value = $event,
10890
10970
  "validationValue": model.externalValue,
@@ -10897,7 +10977,7 @@
10897
10977
  'v-select--selection-slot': !!slots.selection
10898
10978
  }, props.class],
10899
10979
  "style": props.style,
10900
- "readonly": true,
10980
+ "inputmode": "none",
10901
10981
  "placeholder": placeholder,
10902
10982
  "onClick:clear": onClear,
10903
10983
  "onMousedown:control": onMousedownControl,
@@ -10927,7 +11007,8 @@
10927
11007
  "onKeydown": onListKeydown,
10928
11008
  "onFocusin": onFocusin,
10929
11009
  "onScrollPassive": onListScroll,
10930
- "tabindex": "-1"
11010
+ "tabindex": "-1",
11011
+ "color": props.itemColor ?? props.color
10931
11012
  }, {
10932
11013
  default: () => [slots['prepend-item']?.(), !displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? vue.createVNode(VListItem, {
10933
11014
  "title": t(props.noDataText)
@@ -11189,7 +11270,7 @@
11189
11270
  const vTextFieldRef = vue.ref();
11190
11271
  const isFocused = vue.shallowRef(false);
11191
11272
  const isPristine = vue.shallowRef(true);
11192
- const listHasFocus = vue.ref(false);
11273
+ const listHasFocus = vue.shallowRef(false);
11193
11274
  const vMenuRef = vue.ref();
11194
11275
  const _menu = useProxiedModel(props, 'menu');
11195
11276
  const menu = vue.computed({
@@ -11222,7 +11303,12 @@
11222
11303
  } = useFilter(props, items, () => isPristine.value ? '' : search.value);
11223
11304
  const selections = vue.computed(() => {
11224
11305
  return model.value.map(v => {
11225
- return items.value.find(item => props.valueComparator(item.value, v.value)) || v;
11306
+ return items.value.find(item => {
11307
+ const itemRawValue = getPropertyFromItem(item.raw, props.itemValue);
11308
+ const modelRawValue = getPropertyFromItem(v.raw, props.itemValue);
11309
+ if (itemRawValue === undefined || modelRawValue === undefined) return false;
11310
+ return props.returnObject ? props.valueComparator(itemRawValue, modelRawValue) : props.valueComparator(item.value, v.value);
11311
+ }) || v;
11226
11312
  });
11227
11313
  });
11228
11314
  const displayItems = vue.computed(() => {
@@ -11274,11 +11360,8 @@
11274
11360
  if (['Escape'].includes(e.key)) {
11275
11361
  menu.value = false;
11276
11362
  }
11277
- if (['Enter', 'Escape', 'Tab'].includes(e.key)) {
11278
- if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key)) {
11279
- select(filteredItems.value[0]);
11280
- }
11281
- isPristine.value = true;
11363
+ if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key)) {
11364
+ select(filteredItems.value[0]);
11282
11365
  }
11283
11366
  if (e.key === 'ArrowDown' && highlightFirst.value) {
11284
11367
  listRef.value?.focus('next');
@@ -11319,6 +11402,14 @@
11319
11402
  function onInput(e) {
11320
11403
  search.value = e.target.value;
11321
11404
  }
11405
+ function onChange(e) {
11406
+ if (matchesSelector(vTextFieldRef.value, ':autofill') || matchesSelector(vTextFieldRef.value, ':-webkit-autofill')) {
11407
+ const item = items.value.find(item => item.title === e.target.value);
11408
+ if (item) {
11409
+ select(item);
11410
+ }
11411
+ }
11412
+ }
11322
11413
  function onAfterLeave() {
11323
11414
  if (isFocused.value) {
11324
11415
  isPristine.value = true;
@@ -11398,6 +11489,7 @@
11398
11489
  "validationValue": model.externalValue,
11399
11490
  "dirty": isDirty,
11400
11491
  "onInput": onInput,
11492
+ "onChange": onChange,
11401
11493
  "class": ['v-autocomplete', `v-autocomplete--${props.multiple ? 'multiple' : 'single'}`, {
11402
11494
  'v-autocomplete--active-menu': menu.value,
11403
11495
  'v-autocomplete--chips': !!props.chips,
@@ -11435,7 +11527,8 @@
11435
11527
  "onFocusin": onFocusin,
11436
11528
  "onFocusout": onFocusout,
11437
11529
  "onScrollPassive": onListScroll,
11438
- "tabindex": "-1"
11530
+ "tabindex": "-1",
11531
+ "color": props.itemColor ?? props.color
11439
11532
  }, {
11440
11533
  default: () => [slots['prepend-item']?.(), !displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? vue.createVNode(VListItem, {
11441
11534
  "title": t(props.noDataText)
@@ -12483,6 +12576,7 @@
12483
12576
  },
12484
12577
  // TODO: mandatory should probably not be exposed but do this for now
12485
12578
  mandatory: {
12579
+ type: [Boolean, String],
12486
12580
  default: 'force'
12487
12581
  },
12488
12582
  ...makeComponentProps(),
@@ -12850,7 +12944,9 @@
12850
12944
  "style": props.style
12851
12945
  }, [hasContent.value && slots.default?.()]), [[vue.vShow, groupItem.isSelected.value]])]
12852
12946
  }));
12853
- return {};
12947
+ return {
12948
+ groupItem
12949
+ };
12854
12950
  }
12855
12951
  });
12856
12952
 
@@ -13404,6 +13500,7 @@
13404
13500
  const step = vue.computed(() => +props.step > 0 ? parseFloat(props.step) : 0);
13405
13501
  const decimals = vue.computed(() => Math.max(getDecimals(step.value), getDecimals(min.value)));
13406
13502
  function roundValue(value) {
13503
+ value = parseFloat(value);
13407
13504
  if (step.value <= 0) return value;
13408
13505
  const clamped = clamp(value, min.value, max.value);
13409
13506
  const offset = min.value % step.value;
@@ -13907,9 +14004,8 @@
13907
14004
  rtlClasses
13908
14005
  } = useRtl();
13909
14006
  const steps = useSteps(props);
13910
- const model = useProxiedModel(props, 'modelValue', undefined, v => {
13911
- const value = typeof v === 'string' ? parseFloat(v) : v == null ? steps.min.value : v;
13912
- return steps.roundValue(value);
14007
+ const model = useProxiedModel(props, 'modelValue', undefined, value => {
14008
+ return steps.roundValue(value == null ? steps.min.value : value);
13913
14009
  });
13914
14010
  const {
13915
14011
  min,
@@ -14703,7 +14799,7 @@
14703
14799
  const vTextFieldRef = vue.ref();
14704
14800
  const isFocused = vue.shallowRef(false);
14705
14801
  const isPristine = vue.shallowRef(true);
14706
- const listHasFocus = vue.ref(false);
14802
+ const listHasFocus = vue.shallowRef(false);
14707
14803
  const vMenuRef = vue.ref();
14708
14804
  const _menu = useProxiedModel(props, 'menu');
14709
14805
  const menu = vue.computed({
@@ -14775,7 +14871,12 @@
14775
14871
  } = useFilter(props, items, () => isPristine.value ? '' : search.value);
14776
14872
  const selections = vue.computed(() => {
14777
14873
  return model.value.map(v => {
14778
- return items.value.find(item => props.valueComparator(item.value, v.value)) || v;
14874
+ return items.value.find(item => {
14875
+ const itemRawValue = getPropertyFromItem(item.raw, props.itemValue);
14876
+ const modelRawValue = getPropertyFromItem(v.raw, props.itemValue);
14877
+ if (itemRawValue === undefined || modelRawValue === undefined) return false;
14878
+ return props.returnObject ? props.valueComparator(itemRawValue, modelRawValue) : props.valueComparator(item.value, v.value);
14879
+ }) || v;
14779
14880
  });
14780
14881
  });
14781
14882
  const displayItems = vue.computed(() => {
@@ -14984,7 +15085,8 @@
14984
15085
  "onFocusin": onFocusin,
14985
15086
  "onFocusout": onFocusout,
14986
15087
  "onScrollPassive": onListScroll,
14987
- "tabindex": "-1"
15088
+ "tabindex": "-1",
15089
+ "color": props.itemColor ?? props.color
14988
15090
  }, {
14989
15091
  default: () => [slots['prepend-item']?.(), !displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? vue.createVNode(VListItem, {
14990
15092
  "title": t(props.noDataText)
@@ -15402,6 +15504,11 @@
15402
15504
  return !groupItem.isSelected.value && selectedIndices.value.some(selectedIndex => selectedIndex - index === -1);
15403
15505
  });
15404
15506
  vue.provide(VExpansionPanelSymbol, groupItem);
15507
+ provideDefaults({
15508
+ VExpansionPanelText: {
15509
+ eager: vue.toRef(props, 'eager')
15510
+ }
15511
+ });
15405
15512
  useRender(() => {
15406
15513
  const hasText = !!(slots.text || props.text);
15407
15514
  const hasTitle = !!(slots.title || props.title);
@@ -15426,8 +15533,7 @@
15426
15533
  }, {
15427
15534
  default: () => [slots.title ? slots.title() : props.title]
15428
15535
  }), hasText && vue.createVNode(VExpansionPanelText, {
15429
- "key": "text",
15430
- "eager": props.eager
15536
+ "key": "text"
15431
15537
  }, {
15432
15538
  default: () => [slots.text ? slots.text() : props.text]
15433
15539
  }), slots.default?.()]
@@ -15615,6 +15721,7 @@
15615
15721
  "name": props.name,
15616
15722
  "onClick": e => {
15617
15723
  e.stopPropagation();
15724
+ if (isReadonly.value) e.preventDefault();
15618
15725
  onFocus();
15619
15726
  },
15620
15727
  "onChange": e => {
@@ -16387,7 +16494,7 @@
16387
16494
  });
16388
16495
  });
16389
16496
  vue.onBeforeUnmount(() => {
16390
- document.removeEventListener('scroll', onScroll);
16497
+ window.removeEventListener('scroll', onScroll);
16391
16498
  });
16392
16499
  let lastScrollTop = 0;
16393
16500
  function onScroll() {
@@ -17768,7 +17875,9 @@
17768
17875
  value,
17769
17876
  index,
17770
17877
  rating: normalizedValue.value
17771
- }) : vue.createVNode(VBtn, btnProps, null)]), vue.createVNode("input", {
17878
+ }) : vue.createVNode(VBtn, vue.mergeProps({
17879
+ "aria-label": t(props.itemAriaLabel, value, props.length)
17880
+ }, btnProps), null)]), vue.createVNode("input", {
17772
17881
  "class": "v-rating__hidden",
17773
17882
  "name": name.value,
17774
17883
  "id": id,
@@ -19835,12 +19944,11 @@
19835
19944
  function endOfMonth(date) {
19836
19945
  return new Date(date.getFullYear(), date.getMonth() + 1, 0);
19837
19946
  }
19838
- function formatYyyyMmDd(value) {
19839
- const formattedValue = value.split('-').map(d => d.padStart(2, '0')).join('-');
19840
- const offsetMin = new Date().getTimezoneOffset() / -60;
19841
- const offsetSign = offsetMin < 0 ? '-' : '+';
19842
- const offsetValue = Math.abs(offsetMin).toString().padStart(2, '0');
19843
- return `${formattedValue}T00:00:00.000${offsetSign}${offsetValue}:00`;
19947
+ function parseLocalDate(value) {
19948
+ const parts = value.split('-').map(Number);
19949
+
19950
+ // new Date() uses local time zone when passing individual date component values
19951
+ return new Date(parts[0], parts[1] - 1, parts[2]);
19844
19952
  }
19845
19953
  const _YYYMMDD = /([12]\d{3}-([1-9]|0[1-9]|1[0-2])-([1-9]|0[1-9]|[12]\d|3[01]))/;
19846
19954
  function date(value) {
@@ -19849,7 +19957,7 @@
19849
19957
  if (typeof value === 'string') {
19850
19958
  let parsed;
19851
19959
  if (_YYYMMDD.test(value)) {
19852
- parsed = Date.parse(formatYyyyMmDd(value));
19960
+ return parseLocalDate(value);
19853
19961
  } else {
19854
19962
  parsed = Date.parse(value);
19855
19963
  }
@@ -20183,7 +20291,7 @@
20183
20291
  date
20184
20292
  };
20185
20293
  }
20186
- const version$1 = "3.3.9";
20294
+ const version$1 = "3.3.11";
20187
20295
  createVuetify$1.version = version$1;
20188
20296
 
20189
20297
  // Vue's inject() can only be used in setup
@@ -20208,7 +20316,7 @@
20208
20316
  ...options
20209
20317
  });
20210
20318
  };
20211
- const version = "3.3.9";
20319
+ const version = "3.3.11";
20212
20320
  createVuetify.version = version;
20213
20321
 
20214
20322
  exports.components = components;