vuetify 3.3.10 → 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 (207) 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/tags.json +79 -0
  5. package/dist/json/web-types.json +693 -34
  6. package/dist/vuetify-labs.css +1050 -885
  7. package/dist/vuetify-labs.d.ts +2802 -304
  8. package/dist/vuetify-labs.esm.js +719 -68
  9. package/dist/vuetify-labs.esm.js.map +1 -1
  10. package/dist/vuetify-labs.js +719 -68
  11. package/dist/vuetify-labs.min.css +2 -2
  12. package/dist/vuetify.css +187 -182
  13. package/dist/vuetify.d.ts +64 -29
  14. package/dist/vuetify.esm.js +137 -61
  15. package/dist/vuetify.esm.js.map +1 -1
  16. package/dist/vuetify.js +137 -61
  17. package/dist/vuetify.js.map +1 -1
  18. package/dist/vuetify.min.css +2 -2
  19. package/dist/vuetify.min.js +954 -947
  20. package/dist/vuetify.min.js.map +1 -1
  21. package/lib/blueprints/md1.mjs +5 -0
  22. package/lib/blueprints/md1.mjs.map +1 -1
  23. package/lib/blueprints/md2.mjs +5 -0
  24. package/lib/blueprints/md2.mjs.map +1 -1
  25. package/lib/blueprints/md3.mjs +5 -0
  26. package/lib/blueprints/md3.mjs.map +1 -1
  27. package/lib/components/VAutocomplete/VAutocomplete.mjs +13 -10
  28. package/lib/components/VAutocomplete/VAutocomplete.mjs.map +1 -1
  29. package/lib/components/VAutocomplete/index.d.mts +6 -0
  30. package/lib/components/VCarousel/index.d.mts +12 -10
  31. package/lib/components/VChip/VChip.mjs +3 -3
  32. package/lib/components/VChip/VChip.mjs.map +1 -1
  33. package/lib/components/VCombobox/VCombobox.mjs +10 -4
  34. package/lib/components/VCombobox/VCombobox.mjs.map +1 -1
  35. package/lib/components/VCombobox/index.d.mts +6 -0
  36. package/lib/components/VExpansionPanel/VExpansionPanel.mjs +8 -3
  37. package/lib/components/VExpansionPanel/VExpansionPanel.mjs.map +1 -1
  38. package/lib/components/VMenu/VMenu.mjs +29 -4
  39. package/lib/components/VMenu/VMenu.mjs.map +1 -1
  40. package/lib/components/VOverlay/useActivator.mjs +2 -2
  41. package/lib/components/VOverlay/useActivator.mjs.map +1 -1
  42. package/lib/components/VRangeSlider/VRangeSlider.mjs.map +1 -1
  43. package/lib/components/VRangeSlider/index.d.mts +8 -8
  44. package/lib/components/VRating/VRating.mjs +4 -2
  45. package/lib/components/VRating/VRating.mjs.map +1 -1
  46. package/lib/components/VSelect/VSelect.mjs +11 -4
  47. package/lib/components/VSelect/VSelect.mjs.map +1 -1
  48. package/lib/components/VSelect/index.d.mts +6 -0
  49. package/lib/components/VSelectionControl/VSelectionControl.mjs +2 -2
  50. package/lib/components/VSelectionControl/VSelectionControl.mjs.map +1 -1
  51. package/lib/components/VSlider/VSlider.mjs +2 -3
  52. package/lib/components/VSlider/VSlider.mjs.map +1 -1
  53. package/lib/components/VSlider/slider.mjs +1 -0
  54. package/lib/components/VSlider/slider.mjs.map +1 -1
  55. package/lib/components/VSwitch/VSwitch.css +3 -0
  56. package/lib/components/VSwitch/VSwitch.sass +3 -0
  57. package/lib/components/VSwitch/_variables.scss +1 -0
  58. package/lib/components/VTable/VTable.css +2 -0
  59. package/lib/components/VTable/VTable.sass +2 -0
  60. package/lib/components/VTimeline/VTimeline.css +2 -2
  61. package/lib/components/VTimeline/VTimeline.sass +2 -2
  62. package/lib/components/VWindow/VWindow.mjs +1 -0
  63. package/lib/components/VWindow/VWindow.mjs.map +1 -1
  64. package/lib/components/VWindow/VWindowItem.mjs +3 -1
  65. package/lib/components/VWindow/VWindowItem.mjs.map +1 -1
  66. package/lib/components/VWindow/index.d.mts +29 -11
  67. package/lib/components/index.d.mts +57 -29
  68. package/lib/composables/group.mjs +1 -1
  69. package/lib/composables/group.mjs.map +1 -1
  70. package/lib/composables/theme.mjs +12 -6
  71. package/lib/composables/theme.mjs.map +1 -1
  72. package/lib/entry-bundler.mjs +1 -1
  73. package/lib/framework.mjs +1 -1
  74. package/lib/index.d.mts +7 -0
  75. package/lib/labs/VDatePicker/VDatePicker.css +6 -5
  76. package/lib/labs/VDatePicker/VDatePicker.mjs +3 -3
  77. package/lib/labs/VDatePicker/VDatePicker.mjs.map +1 -1
  78. package/lib/labs/VDatePicker/VDatePicker.sass +8 -9
  79. package/lib/labs/VDateRangePicker/VDateRangePickerHeader.mjs +2 -2
  80. package/lib/labs/VDateRangePicker/VDateRangePickerHeader.mjs.map +1 -1
  81. package/lib/labs/VInfiniteScroll/VInfiniteScroll.mjs +4 -5
  82. package/lib/labs/VInfiniteScroll/VInfiniteScroll.mjs.map +1 -1
  83. package/lib/labs/VOtpInput/VOtpInput.css +53 -0
  84. package/lib/labs/VOtpInput/VOtpInput.mjs +213 -0
  85. package/lib/labs/VOtpInput/VOtpInput.mjs.map +1 -0
  86. package/lib/labs/VOtpInput/VOtpInput.sass +55 -0
  87. package/lib/labs/VOtpInput/_variables.scss +2 -0
  88. package/lib/labs/VOtpInput/index.d.mts +459 -0
  89. package/lib/labs/VOtpInput/index.mjs +2 -0
  90. package/lib/labs/VOtpInput/index.mjs.map +1 -0
  91. package/lib/labs/VPicker/VPicker.mjs +1 -1
  92. package/lib/labs/VPicker/VPicker.mjs.map +1 -1
  93. package/lib/labs/VStepper/VStepper.css +42 -0
  94. package/lib/labs/VStepper/VStepper.mjs +147 -0
  95. package/lib/labs/VStepper/VStepper.mjs.map +1 -0
  96. package/lib/labs/VStepper/VStepper.sass +44 -0
  97. package/lib/labs/VStepper/VStepperActions.mjs +61 -0
  98. package/lib/labs/VStepper/VStepperActions.mjs.map +1 -0
  99. package/lib/labs/VStepper/VStepperHeader.mjs +4 -0
  100. package/lib/labs/VStepper/VStepperHeader.mjs.map +1 -0
  101. package/lib/labs/VStepper/VStepperItem.css +67 -0
  102. package/lib/labs/VStepper/VStepperItem.mjs +114 -0
  103. package/lib/labs/VStepper/VStepperItem.mjs.map +1 -0
  104. package/lib/labs/VStepper/VStepperItem.sass +71 -0
  105. package/lib/labs/VStepper/VStepperWindow.mjs +50 -0
  106. package/lib/labs/VStepper/VStepperWindow.mjs.map +1 -0
  107. package/lib/labs/VStepper/VStepperWindowItem.mjs +24 -0
  108. package/lib/labs/VStepper/VStepperWindowItem.mjs.map +1 -0
  109. package/lib/labs/VStepper/_variables.scss +4 -0
  110. package/lib/labs/VStepper/index.d.mts +2051 -0
  111. package/lib/labs/VStepper/index.mjs +7 -0
  112. package/lib/labs/VStepper/index.mjs.map +1 -0
  113. package/lib/labs/components.d.mts +2751 -267
  114. package/lib/labs/components.mjs +2 -0
  115. package/lib/labs/components.mjs.map +1 -1
  116. package/lib/labs/date/adapters/vuetify.mjs +6 -7
  117. package/lib/labs/date/adapters/vuetify.mjs.map +1 -1
  118. package/lib/locale/af.mjs +6 -1
  119. package/lib/locale/af.mjs.map +1 -1
  120. package/lib/locale/ar.mjs +6 -1
  121. package/lib/locale/ar.mjs.map +1 -1
  122. package/lib/locale/az.mjs +6 -1
  123. package/lib/locale/az.mjs.map +1 -1
  124. package/lib/locale/bg.mjs +6 -1
  125. package/lib/locale/bg.mjs.map +1 -1
  126. package/lib/locale/ca.mjs +6 -1
  127. package/lib/locale/ca.mjs.map +1 -1
  128. package/lib/locale/ckb.mjs +6 -1
  129. package/lib/locale/ckb.mjs.map +1 -1
  130. package/lib/locale/cs.mjs +6 -1
  131. package/lib/locale/cs.mjs.map +1 -1
  132. package/lib/locale/da.mjs +6 -1
  133. package/lib/locale/da.mjs.map +1 -1
  134. package/lib/locale/de.mjs +6 -1
  135. package/lib/locale/de.mjs.map +1 -1
  136. package/lib/locale/el.mjs +6 -1
  137. package/lib/locale/el.mjs.map +1 -1
  138. package/lib/locale/en.mjs +6 -1
  139. package/lib/locale/en.mjs.map +1 -1
  140. package/lib/locale/es.mjs +6 -1
  141. package/lib/locale/es.mjs.map +1 -1
  142. package/lib/locale/et.mjs +6 -1
  143. package/lib/locale/et.mjs.map +1 -1
  144. package/lib/locale/fa.mjs +6 -1
  145. package/lib/locale/fa.mjs.map +1 -1
  146. package/lib/locale/fi.mjs +6 -1
  147. package/lib/locale/fi.mjs.map +1 -1
  148. package/lib/locale/fr.mjs +6 -1
  149. package/lib/locale/fr.mjs.map +1 -1
  150. package/lib/locale/he.mjs +6 -1
  151. package/lib/locale/he.mjs.map +1 -1
  152. package/lib/locale/hr.mjs +6 -1
  153. package/lib/locale/hr.mjs.map +1 -1
  154. package/lib/locale/hu.mjs +6 -1
  155. package/lib/locale/hu.mjs.map +1 -1
  156. package/lib/locale/id.mjs +6 -1
  157. package/lib/locale/id.mjs.map +1 -1
  158. package/lib/locale/index.d.mts +210 -0
  159. package/lib/locale/it.mjs +6 -1
  160. package/lib/locale/it.mjs.map +1 -1
  161. package/lib/locale/ja.mjs +6 -1
  162. package/lib/locale/ja.mjs.map +1 -1
  163. package/lib/locale/ko.mjs +6 -1
  164. package/lib/locale/ko.mjs.map +1 -1
  165. package/lib/locale/lt.mjs +6 -1
  166. package/lib/locale/lt.mjs.map +1 -1
  167. package/lib/locale/lv.mjs +6 -1
  168. package/lib/locale/lv.mjs.map +1 -1
  169. package/lib/locale/nl.mjs +6 -1
  170. package/lib/locale/nl.mjs.map +1 -1
  171. package/lib/locale/no.mjs +6 -1
  172. package/lib/locale/no.mjs.map +1 -1
  173. package/lib/locale/pl.mjs +6 -1
  174. package/lib/locale/pl.mjs.map +1 -1
  175. package/lib/locale/pt.mjs +6 -1
  176. package/lib/locale/pt.mjs.map +1 -1
  177. package/lib/locale/ro.mjs +23 -18
  178. package/lib/locale/ro.mjs.map +1 -1
  179. package/lib/locale/ru.mjs +6 -1
  180. package/lib/locale/ru.mjs.map +1 -1
  181. package/lib/locale/sk.mjs +6 -1
  182. package/lib/locale/sk.mjs.map +1 -1
  183. package/lib/locale/sl.mjs +6 -1
  184. package/lib/locale/sl.mjs.map +1 -1
  185. package/lib/locale/sr-Cyrl.mjs +6 -1
  186. package/lib/locale/sr-Cyrl.mjs.map +1 -1
  187. package/lib/locale/sr-Latn.mjs +6 -1
  188. package/lib/locale/sr-Latn.mjs.map +1 -1
  189. package/lib/locale/sv.mjs +6 -1
  190. package/lib/locale/sv.mjs.map +1 -1
  191. package/lib/locale/th.mjs +6 -1
  192. package/lib/locale/th.mjs.map +1 -1
  193. package/lib/locale/tr.mjs +6 -1
  194. package/lib/locale/tr.mjs.map +1 -1
  195. package/lib/locale/uk.mjs +6 -1
  196. package/lib/locale/uk.mjs.map +1 -1
  197. package/lib/locale/vi.mjs +6 -1
  198. package/lib/locale/vi.mjs.map +1 -1
  199. package/lib/locale/zh-Hans.mjs +6 -1
  200. package/lib/locale/zh-Hans.mjs.map +1 -1
  201. package/lib/locale/zh-Hant.mjs +6 -1
  202. package/lib/locale/zh-Hant.mjs.map +1 -1
  203. package/lib/util/globals.mjs +0 -1
  204. package/lib/util/globals.mjs.map +1 -1
  205. package/lib/util/helpers.mjs +32 -12
  206. package/lib/util/helpers.mjs.map +1 -1
  207. package/package.json +3 -2
package/dist/vuetify.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.3.10
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;
@@ -9817,8 +9844,30 @@
9817
9844
  }, 40);
9818
9845
  }
9819
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
+ }
9820
9861
  vue.watch(isActive, val => {
9821
- 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
+ }
9822
9871
  });
9823
9872
  function onClickOutside() {
9824
9873
  parent?.closeParents();
@@ -9826,8 +9875,11 @@
9826
9875
  function onKeydown(e) {
9827
9876
  if (props.disabled) return;
9828
9877
  if (e.key === 'Tab') {
9829
- isActive.value = false;
9830
- 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
+ }
9831
9883
  }
9832
9884
  }
9833
9885
  function onActivatorKeydown(e) {
@@ -10741,6 +10793,7 @@
10741
10793
  type: Function,
10742
10794
  default: deepEqual
10743
10795
  },
10796
+ itemColor: String,
10744
10797
  ...makeItemsProps({
10745
10798
  itemChildren: false
10746
10799
  })
@@ -10793,7 +10846,12 @@
10793
10846
  const form = useForm();
10794
10847
  const selections = vue.computed(() => {
10795
10848
  return model.value.map(v => {
10796
- 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;
10797
10855
  });
10798
10856
  });
10799
10857
  const selected = vue.computed(() => selections.value.map(selection => selection.props.value));
@@ -10887,7 +10945,7 @@
10887
10945
  isFocused.value = true;
10888
10946
  }
10889
10947
  function onModelUpdate(v) {
10890
- if (v == null) model.value = [];else if (vTextFieldRef.value?.matches(':autofill') || vTextFieldRef.value?.matches(':-webkit-autofill')) {
10948
+ if (v == null) model.value = [];else if (matchesSelector(vTextFieldRef.value, ':autofill') || matchesSelector(vTextFieldRef.value, ':-webkit-autofill')) {
10891
10949
  const item = items.value.find(item => item.title === v);
10892
10950
  if (item) {
10893
10951
  select(item);
@@ -10949,7 +11007,8 @@
10949
11007
  "onKeydown": onListKeydown,
10950
11008
  "onFocusin": onFocusin,
10951
11009
  "onScrollPassive": onListScroll,
10952
- "tabindex": "-1"
11010
+ "tabindex": "-1",
11011
+ "color": props.itemColor ?? props.color
10953
11012
  }, {
10954
11013
  default: () => [slots['prepend-item']?.(), !displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? vue.createVNode(VListItem, {
10955
11014
  "title": t(props.noDataText)
@@ -11211,7 +11270,7 @@
11211
11270
  const vTextFieldRef = vue.ref();
11212
11271
  const isFocused = vue.shallowRef(false);
11213
11272
  const isPristine = vue.shallowRef(true);
11214
- const listHasFocus = vue.ref(false);
11273
+ const listHasFocus = vue.shallowRef(false);
11215
11274
  const vMenuRef = vue.ref();
11216
11275
  const _menu = useProxiedModel(props, 'menu');
11217
11276
  const menu = vue.computed({
@@ -11244,7 +11303,12 @@
11244
11303
  } = useFilter(props, items, () => isPristine.value ? '' : search.value);
11245
11304
  const selections = vue.computed(() => {
11246
11305
  return model.value.map(v => {
11247
- 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;
11248
11312
  });
11249
11313
  });
11250
11314
  const displayItems = vue.computed(() => {
@@ -11296,11 +11360,8 @@
11296
11360
  if (['Escape'].includes(e.key)) {
11297
11361
  menu.value = false;
11298
11362
  }
11299
- if (['Enter', 'Escape', 'Tab'].includes(e.key)) {
11300
- if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key)) {
11301
- select(filteredItems.value[0]);
11302
- }
11303
- isPristine.value = true;
11363
+ if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key)) {
11364
+ select(filteredItems.value[0]);
11304
11365
  }
11305
11366
  if (e.key === 'ArrowDown' && highlightFirst.value) {
11306
11367
  listRef.value?.focus('next');
@@ -11342,7 +11403,7 @@
11342
11403
  search.value = e.target.value;
11343
11404
  }
11344
11405
  function onChange(e) {
11345
- if (vTextFieldRef.value?.matches(':autofill') || vTextFieldRef.value?.matches(':-webkit-autofill')) {
11406
+ if (matchesSelector(vTextFieldRef.value, ':autofill') || matchesSelector(vTextFieldRef.value, ':-webkit-autofill')) {
11346
11407
  const item = items.value.find(item => item.title === e.target.value);
11347
11408
  if (item) {
11348
11409
  select(item);
@@ -11466,7 +11527,8 @@
11466
11527
  "onFocusin": onFocusin,
11467
11528
  "onFocusout": onFocusout,
11468
11529
  "onScrollPassive": onListScroll,
11469
- "tabindex": "-1"
11530
+ "tabindex": "-1",
11531
+ "color": props.itemColor ?? props.color
11470
11532
  }, {
11471
11533
  default: () => [slots['prepend-item']?.(), !displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? vue.createVNode(VListItem, {
11472
11534
  "title": t(props.noDataText)
@@ -12514,6 +12576,7 @@
12514
12576
  },
12515
12577
  // TODO: mandatory should probably not be exposed but do this for now
12516
12578
  mandatory: {
12579
+ type: [Boolean, String],
12517
12580
  default: 'force'
12518
12581
  },
12519
12582
  ...makeComponentProps(),
@@ -12881,7 +12944,9 @@
12881
12944
  "style": props.style
12882
12945
  }, [hasContent.value && slots.default?.()]), [[vue.vShow, groupItem.isSelected.value]])]
12883
12946
  }));
12884
- return {};
12947
+ return {
12948
+ groupItem
12949
+ };
12885
12950
  }
12886
12951
  });
12887
12952
 
@@ -13435,6 +13500,7 @@
13435
13500
  const step = vue.computed(() => +props.step > 0 ? parseFloat(props.step) : 0);
13436
13501
  const decimals = vue.computed(() => Math.max(getDecimals(step.value), getDecimals(min.value)));
13437
13502
  function roundValue(value) {
13503
+ value = parseFloat(value);
13438
13504
  if (step.value <= 0) return value;
13439
13505
  const clamped = clamp(value, min.value, max.value);
13440
13506
  const offset = min.value % step.value;
@@ -13938,9 +14004,8 @@
13938
14004
  rtlClasses
13939
14005
  } = useRtl();
13940
14006
  const steps = useSteps(props);
13941
- const model = useProxiedModel(props, 'modelValue', undefined, v => {
13942
- const value = typeof v === 'string' ? parseFloat(v) : v == null ? steps.min.value : v;
13943
- return steps.roundValue(value);
14007
+ const model = useProxiedModel(props, 'modelValue', undefined, value => {
14008
+ return steps.roundValue(value == null ? steps.min.value : value);
13944
14009
  });
13945
14010
  const {
13946
14011
  min,
@@ -14734,7 +14799,7 @@
14734
14799
  const vTextFieldRef = vue.ref();
14735
14800
  const isFocused = vue.shallowRef(false);
14736
14801
  const isPristine = vue.shallowRef(true);
14737
- const listHasFocus = vue.ref(false);
14802
+ const listHasFocus = vue.shallowRef(false);
14738
14803
  const vMenuRef = vue.ref();
14739
14804
  const _menu = useProxiedModel(props, 'menu');
14740
14805
  const menu = vue.computed({
@@ -14806,7 +14871,12 @@
14806
14871
  } = useFilter(props, items, () => isPristine.value ? '' : search.value);
14807
14872
  const selections = vue.computed(() => {
14808
14873
  return model.value.map(v => {
14809
- 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;
14810
14880
  });
14811
14881
  });
14812
14882
  const displayItems = vue.computed(() => {
@@ -15015,7 +15085,8 @@
15015
15085
  "onFocusin": onFocusin,
15016
15086
  "onFocusout": onFocusout,
15017
15087
  "onScrollPassive": onListScroll,
15018
- "tabindex": "-1"
15088
+ "tabindex": "-1",
15089
+ "color": props.itemColor ?? props.color
15019
15090
  }, {
15020
15091
  default: () => [slots['prepend-item']?.(), !displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? vue.createVNode(VListItem, {
15021
15092
  "title": t(props.noDataText)
@@ -15433,6 +15504,11 @@
15433
15504
  return !groupItem.isSelected.value && selectedIndices.value.some(selectedIndex => selectedIndex - index === -1);
15434
15505
  });
15435
15506
  vue.provide(VExpansionPanelSymbol, groupItem);
15507
+ provideDefaults({
15508
+ VExpansionPanelText: {
15509
+ eager: vue.toRef(props, 'eager')
15510
+ }
15511
+ });
15436
15512
  useRender(() => {
15437
15513
  const hasText = !!(slots.text || props.text);
15438
15514
  const hasTitle = !!(slots.title || props.title);
@@ -15457,8 +15533,7 @@
15457
15533
  }, {
15458
15534
  default: () => [slots.title ? slots.title() : props.title]
15459
15535
  }), hasText && vue.createVNode(VExpansionPanelText, {
15460
- "key": "text",
15461
- "eager": props.eager
15536
+ "key": "text"
15462
15537
  }, {
15463
15538
  default: () => [slots.text ? slots.text() : props.text]
15464
15539
  }), slots.default?.()]
@@ -17800,7 +17875,9 @@
17800
17875
  value,
17801
17876
  index,
17802
17877
  rating: normalizedValue.value
17803
- }) : 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", {
17804
17881
  "class": "v-rating__hidden",
17805
17882
  "name": name.value,
17806
17883
  "id": id,
@@ -19867,12 +19944,11 @@
19867
19944
  function endOfMonth(date) {
19868
19945
  return new Date(date.getFullYear(), date.getMonth() + 1, 0);
19869
19946
  }
19870
- function formatYyyyMmDd(value) {
19871
- const formattedValue = value.split('-').map(d => d.padStart(2, '0')).join('-');
19872
- const offsetMin = new Date().getTimezoneOffset() / -60;
19873
- const offsetSign = offsetMin < 0 ? '-' : '+';
19874
- const offsetValue = Math.abs(offsetMin).toString().padStart(2, '0');
19875
- 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]);
19876
19952
  }
19877
19953
  const _YYYMMDD = /([12]\d{3}-([1-9]|0[1-9]|1[0-2])-([1-9]|0[1-9]|[12]\d|3[01]))/;
19878
19954
  function date(value) {
@@ -19881,7 +19957,7 @@
19881
19957
  if (typeof value === 'string') {
19882
19958
  let parsed;
19883
19959
  if (_YYYMMDD.test(value)) {
19884
- parsed = Date.parse(formatYyyyMmDd(value));
19960
+ return parseLocalDate(value);
19885
19961
  } else {
19886
19962
  parsed = Date.parse(value);
19887
19963
  }
@@ -20215,7 +20291,7 @@
20215
20291
  date
20216
20292
  };
20217
20293
  }
20218
- const version$1 = "3.3.10";
20294
+ const version$1 = "3.3.11";
20219
20295
  createVuetify$1.version = version$1;
20220
20296
 
20221
20297
  // Vue's inject() can only be used in setup
@@ -20240,7 +20316,7 @@
20240
20316
  ...options
20241
20317
  });
20242
20318
  };
20243
- const version = "3.3.10";
20319
+ const version = "3.3.11";
20244
20320
  createVuetify.version = version;
20245
20321
 
20246
20322
  exports.components = components;