vuetify 3.6.15 → 3.7.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 (158) hide show
  1. package/dist/json/attributes.json +182 -26
  2. package/dist/json/importMap-labs.json +30 -30
  3. package/dist/json/importMap.json +150 -150
  4. package/dist/json/tags.json +44 -5
  5. package/dist/json/web-types.json +445 -42
  6. package/dist/vuetify-labs.css +2359 -2344
  7. package/dist/vuetify-labs.d.ts +690 -341
  8. package/dist/vuetify-labs.esm.js +253 -211
  9. package/dist/vuetify-labs.esm.js.map +1 -1
  10. package/dist/vuetify-labs.js +252 -210
  11. package/dist/vuetify-labs.min.css +2 -2
  12. package/dist/vuetify.css +2553 -2538
  13. package/dist/vuetify.d.ts +559 -315
  14. package/dist/vuetify.esm.js +189 -127
  15. package/dist/vuetify.esm.js.map +1 -1
  16. package/dist/vuetify.js +188 -126
  17. package/dist/vuetify.js.map +1 -1
  18. package/dist/vuetify.min.css +2 -2
  19. package/dist/vuetify.min.js +160 -156
  20. package/dist/vuetify.min.js.map +1 -1
  21. package/lib/components/VApp/VApp.mjs +2 -5
  22. package/lib/components/VApp/VApp.mjs.map +1 -1
  23. package/lib/components/VApp/index.d.mts +6 -6
  24. package/lib/components/VAppBar/VAppBar.mjs +5 -5
  25. package/lib/components/VAppBar/VAppBar.mjs.map +1 -1
  26. package/lib/components/VAppBar/index.d.mts +8 -2
  27. package/lib/components/VAutocomplete/VAutocomplete.mjs +15 -8
  28. package/lib/components/VAutocomplete/VAutocomplete.mjs.map +1 -1
  29. package/lib/components/VAutocomplete/index.d.mts +78 -49
  30. package/lib/components/VAvatar/VAvatar.css +9 -0
  31. package/lib/components/VAvatar/VAvatar.mjs +6 -1
  32. package/lib/components/VAvatar/VAvatar.mjs.map +1 -1
  33. package/lib/components/VAvatar/VAvatar.sass +1 -0
  34. package/lib/components/VAvatar/_variables.scss +13 -0
  35. package/lib/components/VAvatar/index.d.mts +6 -0
  36. package/lib/components/VBottomNavigation/VBottomNavigation.mjs +2 -3
  37. package/lib/components/VBottomNavigation/VBottomNavigation.mjs.map +1 -1
  38. package/lib/components/VBottomNavigation/index.d.mts +2 -2
  39. package/lib/components/VBreadcrumbs/index.d.mts +8 -8
  40. package/lib/components/VBtn/VBtn.css +0 -4
  41. package/lib/components/VBtn/VBtn.mjs +3 -1
  42. package/lib/components/VBtn/VBtn.mjs.map +1 -1
  43. package/lib/components/VBtn/VBtn.sass +0 -6
  44. package/lib/components/VBtn/_variables.scss +0 -1
  45. package/lib/components/VBtn/index.d.mts +6 -0
  46. package/lib/components/VCard/VCard.css +1 -0
  47. package/lib/components/VCard/VCard.sass +1 -0
  48. package/lib/components/VCard/_variables.scss +7 -3
  49. package/lib/components/VCarousel/index.d.mts +9 -0
  50. package/lib/components/VCheckbox/index.d.mts +7 -6
  51. package/lib/components/VCombobox/VCombobox.mjs +15 -8
  52. package/lib/components/VCombobox/VCombobox.mjs.map +1 -1
  53. package/lib/components/VCombobox/index.d.mts +78 -49
  54. package/lib/components/VDialog/index.d.mts +3 -3
  55. package/lib/components/VExpansionPanel/VExpansionPanelTitle.mjs +7 -2
  56. package/lib/components/VExpansionPanel/VExpansionPanelTitle.mjs.map +1 -1
  57. package/lib/components/VExpansionPanel/index.d.mts +72 -0
  58. package/lib/components/VFab/index.d.mts +6 -0
  59. package/lib/components/VFileInput/index.d.mts +19 -18
  60. package/lib/components/VFooter/VFooter.mjs +1 -3
  61. package/lib/components/VFooter/VFooter.mjs.map +1 -1
  62. package/lib/components/VFooter/index.d.mts +3 -3
  63. package/lib/components/VForm/index.d.mts +10 -9
  64. package/lib/components/VGrid/VContainer.mjs +6 -1
  65. package/lib/components/VGrid/VContainer.mjs.map +1 -1
  66. package/lib/components/VGrid/index.d.mts +36 -0
  67. package/lib/components/VImg/VImg.css +9 -0
  68. package/lib/components/VImg/VImg.mjs +2 -0
  69. package/lib/components/VImg/VImg.mjs.map +1 -1
  70. package/lib/components/VImg/VImg.sass +9 -0
  71. package/lib/components/VImg/index.d.mts +9 -0
  72. package/lib/components/VInput/index.d.mts +7 -6
  73. package/lib/components/VLayout/VLayout.mjs +2 -5
  74. package/lib/components/VLayout/VLayout.mjs.map +1 -1
  75. package/lib/components/VLayout/VLayoutItem.mjs +4 -6
  76. package/lib/components/VLayout/VLayoutItem.mjs.map +1 -1
  77. package/lib/components/VLayout/index.d.mts +9 -9
  78. package/lib/components/VList/VListItem.css +2 -2
  79. package/lib/components/VList/VListItem.mjs +3 -1
  80. package/lib/components/VList/VListItem.mjs.map +1 -1
  81. package/lib/components/VList/VListItem.sass +1 -1
  82. package/lib/components/VList/index.d.mts +19 -18
  83. package/lib/components/VMain/VMain.mjs +2 -3
  84. package/lib/components/VMain/VMain.mjs.map +1 -1
  85. package/lib/components/VMain/index.d.mts +2 -2
  86. package/lib/components/VMenu/VMenu.mjs +26 -8
  87. package/lib/components/VMenu/VMenu.mjs.map +1 -1
  88. package/lib/components/VMenu/index.d.mts +30 -15
  89. package/lib/components/VNavigationDrawer/VNavigationDrawer.mjs +3 -4
  90. package/lib/components/VNavigationDrawer/VNavigationDrawer.mjs.map +1 -1
  91. package/lib/components/VOverlay/VOverlay.mjs +5 -4
  92. package/lib/components/VOverlay/VOverlay.mjs.map +1 -1
  93. package/lib/components/VOverlay/locationStrategies.mjs +0 -6
  94. package/lib/components/VOverlay/locationStrategies.mjs.map +1 -1
  95. package/lib/components/VOverlay/useActivator.mjs +3 -2
  96. package/lib/components/VOverlay/useActivator.mjs.map +1 -1
  97. package/lib/components/VRadioGroup/index.d.mts +7 -6
  98. package/lib/components/VRangeSlider/index.d.mts +7 -6
  99. package/lib/components/VSelect/VSelect.mjs +15 -13
  100. package/lib/components/VSelect/VSelect.mjs.map +1 -1
  101. package/lib/components/VSelect/index.d.mts +78 -49
  102. package/lib/components/VSelect/useScrolling.mjs +3 -3
  103. package/lib/components/VSelect/useScrolling.mjs.map +1 -1
  104. package/lib/components/VSlideGroup/VSlideGroup.mjs +3 -1
  105. package/lib/components/VSlideGroup/VSlideGroup.mjs.map +1 -1
  106. package/lib/components/VSlideGroup/index.d.mts +6 -0
  107. package/lib/components/VSlider/index.d.mts +7 -6
  108. package/lib/components/VSnackbar/index.d.mts +3 -3
  109. package/lib/components/VSpeedDial/VSpeedDial.mjs +1 -1
  110. package/lib/components/VSpeedDial/VSpeedDial.mjs.map +1 -1
  111. package/lib/components/VSpeedDial/index.d.mts +28 -13
  112. package/lib/components/VSwitch/index.d.mts +7 -6
  113. package/lib/components/VTabs/index.d.mts +21 -3
  114. package/lib/components/VTextField/index.d.mts +19 -18
  115. package/lib/components/VTextarea/index.d.mts +19 -18
  116. package/lib/components/VTooltip/index.d.mts +3 -3
  117. package/lib/components/VValidation/index.d.mts +7 -6
  118. package/lib/components/VVirtualScroll/VVirtualScroll.mjs +2 -0
  119. package/lib/components/VVirtualScroll/VVirtualScroll.mjs.map +1 -1
  120. package/lib/components/VVirtualScroll/index.d.mts +3 -0
  121. package/lib/components/index.d.mts +504 -259
  122. package/lib/composables/layout.mjs +37 -14
  123. package/lib/composables/layout.mjs.map +1 -1
  124. package/lib/composables/nested/nested.mjs +3 -3
  125. package/lib/composables/nested/nested.mjs.map +1 -1
  126. package/lib/composables/nested/openStrategies.mjs +4 -2
  127. package/lib/composables/nested/openStrategies.mjs.map +1 -1
  128. package/lib/composables/nested/selectStrategies.mjs +5 -5
  129. package/lib/composables/nested/selectStrategies.mjs.map +1 -1
  130. package/lib/composables/validation.mjs +8 -6
  131. package/lib/composables/validation.mjs.map +1 -1
  132. package/lib/composables/virtual.mjs +1 -0
  133. package/lib/composables/virtual.mjs.map +1 -1
  134. package/lib/entry-bundler.mjs +1 -1
  135. package/lib/entry-bundler.mjs.map +1 -1
  136. package/lib/framework.mjs +1 -1
  137. package/lib/framework.mjs.map +1 -1
  138. package/lib/index.d.mts +55 -56
  139. package/lib/labs/VDateInput/index.d.mts +7 -6
  140. package/lib/labs/VNumberInput/index.d.mts +43 -42
  141. package/lib/labs/VPullToRefresh/VPullToRefresh.mjs +4 -3
  142. package/lib/labs/VPullToRefresh/VPullToRefresh.mjs.map +1 -1
  143. package/lib/labs/VPullToRefresh/index.d.mts +9 -0
  144. package/lib/labs/VSnackbarQueue/index.d.mts +3 -3
  145. package/lib/labs/VStepperVertical/index.d.mts +36 -0
  146. package/lib/labs/VTreeview/VTreeview.mjs +21 -6
  147. package/lib/labs/VTreeview/VTreeview.mjs.map +1 -1
  148. package/lib/labs/VTreeview/VTreeviewChildren.mjs +33 -10
  149. package/lib/labs/VTreeview/VTreeviewChildren.mjs.map +1 -1
  150. package/lib/labs/VTreeview/VTreeviewItem.css +1 -1
  151. package/lib/labs/VTreeview/VTreeviewItem.mjs +14 -74
  152. package/lib/labs/VTreeview/VTreeviewItem.mjs.map +1 -1
  153. package/lib/labs/VTreeview/VTreeviewItem.sass +2 -5
  154. package/lib/labs/VTreeview/index.d.mts +133 -95
  155. package/lib/labs/components.d.mts +193 -109
  156. package/lib/util/helpers.mjs +5 -0
  157. package/lib/util/helpers.mjs.map +1 -1
  158. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.6.15
2
+ * Vuetify v3.7.0
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -543,16 +543,6 @@
543
543
  const timeoutId = window.setTimeout(cb, timeout);
544
544
  return () => window.clearTimeout(timeoutId);
545
545
  }
546
- function eagerComputed(fn, options) {
547
- const result = vue.shallowRef();
548
- vue.watchEffect(() => {
549
- result.value = fn();
550
- }, {
551
- flush: 'sync',
552
- ...options
553
- });
554
- return vue.readonly(result);
555
- }
556
546
  function isClickInsideElement(event, targetDiv) {
557
547
  const mouseX = event.clientX;
558
548
  const mouseY = event.clientY;
@@ -579,6 +569,11 @@
579
569
  });
580
570
  return fn;
581
571
  }
572
+ function checkPrintable(e) {
573
+ const isPrintableChar = e.key.length === 1;
574
+ const noModifier = !e.ctrlKey && !e.metaKey && !e.altKey;
575
+ return isPrintableChar && noModifier;
576
+ }
582
577
 
583
578
  // Utilities
584
579
  const block = ['top', 'bottom'];
@@ -1647,9 +1642,7 @@
1647
1642
  function useLayout() {
1648
1643
  const layout = vue.inject(VuetifyLayoutKey);
1649
1644
  if (!layout) throw new Error('[Vuetify] Could not find injected layout');
1650
- const layoutIsReady = vue.nextTick();
1651
1645
  return {
1652
- layoutIsReady,
1653
1646
  getLayoutItem: layout.getLayoutItem,
1654
1647
  mainRect: layout.mainRect,
1655
1648
  mainStyles: layout.mainStyles
@@ -1666,7 +1659,6 @@
1666
1659
  const isKeptAlive = vue.shallowRef(false);
1667
1660
  vue.onDeactivated(() => isKeptAlive.value = true);
1668
1661
  vue.onActivated(() => isKeptAlive.value = false);
1669
- const layoutIsReady = vue.nextTick();
1670
1662
  const {
1671
1663
  layoutItemStyles,
1672
1664
  layoutItemScrimStyles
@@ -1679,8 +1671,7 @@
1679
1671
  return {
1680
1672
  layoutItemStyles,
1681
1673
  layoutRect: layout.layoutRect,
1682
- layoutItemScrimStyles,
1683
- layoutIsReady
1674
+ layoutItemScrimStyles
1684
1675
  };
1685
1676
  }
1686
1677
  const generateLayers = (layout, positions, layoutSizes, activeItems) => {
@@ -1726,7 +1717,29 @@
1726
1717
  resizeRef,
1727
1718
  contentRect: layoutRect
1728
1719
  } = useResizeObserver();
1729
- const layers = eagerComputed(() => {
1720
+ const computedOverlaps = vue.computed(() => {
1721
+ const map = new Map();
1722
+ const overlaps = props.overlaps ?? [];
1723
+ for (const overlap of overlaps.filter(item => item.includes(':'))) {
1724
+ const [top, bottom] = overlap.split(':');
1725
+ if (!registered.value.includes(top) || !registered.value.includes(bottom)) continue;
1726
+ const topPosition = positions.get(top);
1727
+ const bottomPosition = positions.get(bottom);
1728
+ const topAmount = layoutSizes.get(top);
1729
+ const bottomAmount = layoutSizes.get(bottom);
1730
+ if (!topPosition || !bottomPosition || !topAmount || !bottomAmount) continue;
1731
+ map.set(bottom, {
1732
+ position: topPosition.value,
1733
+ amount: parseInt(topAmount.value, 10)
1734
+ });
1735
+ map.set(top, {
1736
+ position: bottomPosition.value,
1737
+ amount: -parseInt(bottomAmount.value, 10)
1738
+ });
1739
+ }
1740
+ return map;
1741
+ });
1742
+ const layers = vue.computed(() => {
1730
1743
  const uniquePriorities = [...new Set([...priorities.values()].map(p => p.value))].sort((a, b) => a - b);
1731
1744
  const layout = [];
1732
1745
  for (const p of uniquePriorities) {
@@ -1752,7 +1765,7 @@
1752
1765
  })
1753
1766
  };
1754
1767
  });
1755
- const items = eagerComputed(() => {
1768
+ const items = vue.computed(() => {
1756
1769
  return layers.value.slice(1).map((_ref, index) => {
1757
1770
  let {
1758
1771
  id
@@ -1774,7 +1787,10 @@
1774
1787
  return items.value.find(item => item.id === id);
1775
1788
  };
1776
1789
  const rootVm = getCurrentInstance('createLayout');
1777
- const layoutIsReady = vue.nextTick();
1790
+ const isMounted = vue.shallowRef(false);
1791
+ vue.onMounted(() => {
1792
+ isMounted.value = true;
1793
+ });
1778
1794
  vue.provide(VuetifyLayoutKey, {
1779
1795
  register: (vm, _ref2) => {
1780
1796
  let {
@@ -1812,9 +1828,13 @@
1812
1828
  transition: 'none'
1813
1829
  })
1814
1830
  };
1815
- if (index.value < 0) throw new Error(`Layout item "${id}" is missing`);
1831
+ if (!isMounted.value) return styles;
1816
1832
  const item = items.value[index.value];
1817
1833
  if (!item) throw new Error(`[Vuetify] Could not find layout item "${id}"`);
1834
+ const overlap = computedOverlaps.value.get(id);
1835
+ if (overlap) {
1836
+ item[overlap.position] += overlap.amount;
1837
+ }
1818
1838
  return {
1819
1839
  ...styles,
1820
1840
  height: isHorizontal ? `calc(100% - ${item.top}px - ${item.bottom}px)` : elementSize.value ? `${elementSize.value}px` : undefined,
@@ -1847,8 +1867,7 @@
1847
1867
  getLayoutItem,
1848
1868
  items,
1849
1869
  layoutRect,
1850
- rootZIndex,
1851
- layoutIsReady
1870
+ rootZIndex
1852
1871
  });
1853
1872
  const layoutClasses = vue.computed(() => ['v-layout', {
1854
1873
  'v-layout--full-height': props.fullHeight
@@ -1864,7 +1883,6 @@
1864
1883
  getLayoutItem,
1865
1884
  items,
1866
1885
  layoutRect,
1867
- layoutIsReady,
1868
1886
  layoutRef: resizeRef
1869
1887
  };
1870
1888
  }
@@ -2561,9 +2579,7 @@
2561
2579
  "style": [props.style]
2562
2580
  }, [vue.createVNode("div", {
2563
2581
  "class": "v-application__wrap"
2564
- }, [vue.createVNode(vue.Suspense, null, {
2565
- default: () => [vue.createVNode(vue.Fragment, null, [slots.default?.()])]
2566
- })])]));
2582
+ }, [slots.default?.()])]));
2567
2583
  return {
2568
2584
  getLayoutItem,
2569
2585
  items,
@@ -3252,6 +3268,7 @@
3252
3268
  // not intended for public use, this is passed in by vuetify-loader
3253
3269
 
3254
3270
  const makeVImgProps = propsFactory({
3271
+ absolute: Boolean,
3255
3272
  alt: String,
3256
3273
  cover: Boolean,
3257
3274
  color: String,
@@ -3508,6 +3525,7 @@
3508
3525
  const responsiveProps = VResponsive.filterProps(props);
3509
3526
  return vue.withDirectives(vue.createVNode(VResponsive, vue.mergeProps({
3510
3527
  "class": ['v-img', {
3528
+ 'v-img--absolute': props.absolute,
3511
3529
  'v-img--booting': !isBooted.value
3512
3530
  }, backgroundColorClasses.value, roundedClasses.value, props.class],
3513
3531
  "style": [{
@@ -3920,8 +3938,9 @@
3920
3938
  const isFlat = vue.computed(() => props.flat || scrollBehavior.value.fullyHide && !isActive.value || scrollBehavior.value.elevate && (scrollBehavior.value.inverted ? currentScroll.value > 0 : currentScroll.value === 0));
3921
3939
  const opacity = vue.computed(() => scrollBehavior.value.fadeImage ? scrollBehavior.value.inverted ? 1 - scrollRatio.value : scrollRatio.value : undefined);
3922
3940
  const height = vue.computed(() => {
3923
- const height = Number(vToolbarRef.value?.contentHeight ?? props.height);
3924
- const extensionHeight = Number(vToolbarRef.value?.extensionHeight ?? 0);
3941
+ if (scrollBehavior.value.hide && scrollBehavior.value.inverted) return 0;
3942
+ const height = vToolbarRef.value?.contentHeight ?? 0;
3943
+ const extensionHeight = vToolbarRef.value?.extensionHeight ?? 0;
3925
3944
  if (!canHide.value) return height + extensionHeight;
3926
3945
  return currentScroll.value < scrollThreshold.value || scrollBehavior.value.fullyHide ? height + extensionHeight : height;
3927
3946
  });
@@ -3942,8 +3961,7 @@
3942
3961
  ssrBootStyles
3943
3962
  } = useSsrBoot();
3944
3963
  const {
3945
- layoutItemStyles,
3946
- layoutIsReady
3964
+ layoutItemStyles
3947
3965
  } = useLayoutItem({
3948
3966
  id: props.name,
3949
3967
  order: vue.computed(() => parseInt(props.order, 10)),
@@ -3971,7 +3989,7 @@
3971
3989
  "flat": isFlat.value
3972
3990
  }), slots);
3973
3991
  });
3974
- return layoutIsReady;
3992
+ return {};
3975
3993
  }
3976
3994
  });
3977
3995
 
@@ -5515,6 +5533,7 @@
5515
5533
  type: Boolean,
5516
5534
  default: undefined
5517
5535
  },
5536
+ activeColor: String,
5518
5537
  baseColor: String,
5519
5538
  symbol: {
5520
5539
  type: null,
@@ -5606,10 +5625,11 @@
5606
5625
  }
5607
5626
  return group?.isSelected.value;
5608
5627
  });
5628
+ const color = vue.computed(() => isActive.value ? props.activeColor ?? props.color : props.color);
5609
5629
  const variantProps = vue.computed(() => {
5610
5630
  const showColor = group?.isSelected.value && (!link.isLink.value || link.isActive?.value) || !group || link.isActive?.value;
5611
5631
  return {
5612
- color: showColor ? props.color ?? props.baseColor : props.baseColor,
5632
+ color: showColor ? color.value ?? props.baseColor : props.baseColor,
5613
5633
  variant: props.variant
5614
5634
  };
5615
5635
  });
@@ -5950,6 +5970,7 @@
5950
5970
  icon: IconValue,
5951
5971
  image: String,
5952
5972
  text: String,
5973
+ ...makeBorderProps(),
5953
5974
  ...makeComponentProps(),
5954
5975
  ...makeDensityProps(),
5955
5976
  ...makeRoundedProps(),
@@ -5970,6 +5991,9 @@
5970
5991
  const {
5971
5992
  themeClasses
5972
5993
  } = provideTheme(props);
5994
+ const {
5995
+ borderClasses
5996
+ } = useBorder(props);
5973
5997
  const {
5974
5998
  colorClasses,
5975
5999
  colorStyles,
@@ -5989,7 +6013,7 @@
5989
6013
  "class": ['v-avatar', {
5990
6014
  'v-avatar--start': props.start,
5991
6015
  'v-avatar--end': props.end
5992
- }, themeClasses.value, colorClasses.value, densityClasses.value, roundedClasses.value, sizeClasses.value, variantClasses.value, props.class],
6016
+ }, themeClasses.value, borderClasses.value, colorClasses.value, densityClasses.value, roundedClasses.value, sizeClasses.value, variantClasses.value, props.class],
5993
6017
  "style": [colorStyles.value, sizeStyles.value, props.style]
5994
6018
  }, {
5995
6019
  default: () => [!slots.default ? props.image ? vue.createVNode(VImg, {
@@ -6689,12 +6713,14 @@
6689
6713
  const validateOn = vue.computed(() => {
6690
6714
  let value = (props.validateOn ?? form?.validateOn.value) || 'input';
6691
6715
  if (value === 'lazy') value = 'input lazy';
6716
+ if (value === 'eager') value = 'input eager';
6692
6717
  const set = new Set(value?.split(' ') ?? []);
6693
6718
  return {
6694
- blur: set.has('blur') || set.has('input'),
6695
6719
  input: set.has('input'),
6696
- submit: set.has('submit'),
6697
- lazy: set.has('lazy')
6720
+ blur: set.has('blur') || set.has('input') || set.has('invalid-input'),
6721
+ invalidInput: set.has('invalid-input'),
6722
+ lazy: set.has('lazy'),
6723
+ eager: set.has('eager')
6698
6724
  };
6699
6725
  });
6700
6726
  const isValid = vue.computed(() => {
@@ -6731,11 +6757,11 @@
6731
6757
  });
6732
6758
  vue.onMounted(async () => {
6733
6759
  if (!validateOn.value.lazy) {
6734
- await validate(true);
6760
+ await validate(!validateOn.value.eager);
6735
6761
  }
6736
6762
  form?.update(uid.value, isValid.value, errorMessages.value);
6737
6763
  });
6738
- useToggleScope(() => validateOn.value.input, () => {
6764
+ useToggleScope(() => validateOn.value.input || validateOn.value.invalidInput && isValid.value === false, () => {
6739
6765
  vue.watch(validationModel, () => {
6740
6766
  if (validationModel.value != null) {
6741
6767
  validate();
@@ -6763,7 +6789,7 @@
6763
6789
  async function resetValidation() {
6764
6790
  isPristine.value = true;
6765
6791
  if (!validateOn.value.lazy) {
6766
- await validate(true);
6792
+ await validate(!validateOn.value.eager);
6767
6793
  } else {
6768
6794
  internalErrorMessages.value = [];
6769
6795
  }
@@ -7703,7 +7729,9 @@
7703
7729
  selected: group.selected,
7704
7730
  scrollTo,
7705
7731
  scrollOffset,
7706
- focus
7732
+ focus,
7733
+ hasPrev,
7734
+ hasNext
7707
7735
  };
7708
7736
  }
7709
7737
  });
@@ -8173,6 +8201,7 @@
8173
8201
  return strategy;
8174
8202
  };
8175
8203
 
8204
+ // Utilities
8176
8205
  const singleOpenStrategy = {
8177
8206
  open: _ref => {
8178
8207
  let {
@@ -8206,11 +8235,11 @@
8206
8235
  parents
8207
8236
  } = _ref2;
8208
8237
  if (value) {
8209
- let parent = parents.get(id);
8238
+ let parent = vue.toRaw(parents.get(id));
8210
8239
  opened.add(id);
8211
8240
  while (parent != null && parent !== id) {
8212
8241
  opened.add(parent);
8213
- parent = parents.get(parent);
8242
+ parent = vue.toRaw(parents.get(parent));
8214
8243
  }
8215
8244
  return opened;
8216
8245
  } else {
@@ -8381,18 +8410,18 @@
8381
8410
  const items = [id];
8382
8411
  while (items.length) {
8383
8412
  const item = items.shift();
8384
- selected.set(item, value ? 'on' : 'off');
8413
+ selected.set(vue.toRaw(item), value ? 'on' : 'off');
8385
8414
  if (children.has(item)) {
8386
8415
  items.push(...children.get(item));
8387
8416
  }
8388
8417
  }
8389
- let parent = parents.get(id);
8418
+ let parent = vue.toRaw(parents.get(id));
8390
8419
  while (parent) {
8391
8420
  const childrenIds = children.get(parent);
8392
- const everySelected = childrenIds.every(cid => selected.get(cid) === 'on');
8393
- const noneSelected = childrenIds.every(cid => !selected.has(cid) || selected.get(cid) === 'off');
8421
+ const everySelected = childrenIds.every(cid => selected.get(vue.toRaw(cid)) === 'on');
8422
+ const noneSelected = childrenIds.every(cid => !selected.has(vue.toRaw(cid)) || selected.get(vue.toRaw(cid)) === 'off');
8394
8423
  selected.set(parent, everySelected ? 'on' : noneSelected ? 'off' : 'indeterminate');
8395
- parent = parents.get(parent);
8424
+ parent = vue.toRaw(parents.get(parent));
8396
8425
  }
8397
8426
 
8398
8427
  // If mandatory and planned deselect results in no selected
@@ -8470,7 +8499,7 @@
8470
8499
  let isUnmounted = false;
8471
8500
  const children = vue.ref(new Map());
8472
8501
  const parents = vue.ref(new Map());
8473
- const opened = useProxiedModel(props, 'opened', props.opened, v => new Set(v), v => [...v.values()]);
8502
+ const opened = useProxiedModel(props, 'opened', props.opened, v => new Set(vue.toRaw(v)), v => [...v.values()]);
8474
8503
  const activeStrategy = vue.computed(() => {
8475
8504
  if (typeof props.activeStrategy === 'object') return props.activeStrategy;
8476
8505
  if (typeof props.activeStrategy === 'function') return props.activeStrategy(props.mandatory);
@@ -8643,9 +8672,9 @@
8643
8672
  const item = {
8644
8673
  ...parent,
8645
8674
  id: computedId,
8646
- open: (open, e) => parent.root.open(computedId.value, open, e),
8675
+ open: (open, e) => parent.root.open(vue.toRaw(computedId.value), open, e),
8647
8676
  openOnSelect: (open, e) => parent.root.openOnSelect(computedId.value, open, e),
8648
- isOpen: vue.computed(() => parent.root.opened.value.has(computedId.value)),
8677
+ isOpen: vue.computed(() => parent.root.opened.value.has(vue.toRaw(computedId.value))),
8649
8678
  parent: vue.computed(() => parent.root.parents.value.get(computedId.value)),
8650
8679
  activate: (activated, e) => parent.root.activate(computedId.value, activated, e),
8651
8680
  isActivated: vue.computed(() => parent.root.activated.value.has(vue.toRaw(computedId.value))),
@@ -8869,6 +8898,7 @@
8869
8898
  activate,
8870
8899
  isActivated,
8871
8900
  select,
8901
+ isOpen,
8872
8902
  isSelected,
8873
8903
  isIndeterminate,
8874
8904
  isGroupActivator,
@@ -8923,6 +8953,7 @@
8923
8953
  const slotProps = vue.computed(() => ({
8924
8954
  isActive: isActive.value,
8925
8955
  select,
8956
+ isOpen: isOpen.value,
8926
8957
  isSelected: isSelected.value,
8927
8958
  isIndeterminate: isIndeterminate.value
8928
8959
  }));
@@ -8942,7 +8973,7 @@
8942
8973
  function onKeyDown(e) {
8943
8974
  if (e.key === 'Enter' || e.key === ' ') {
8944
8975
  e.preventDefault();
8945
- onClick(e);
8976
+ e.target.dispatchEvent(new MouseEvent('click', e));
8946
8977
  }
8947
8978
  }
8948
8979
  useRender(() => {
@@ -9732,12 +9763,6 @@
9732
9763
  // el.style.removeProperty('max-width')
9733
9764
  // el.style.removeProperty('max-height')
9734
9765
 
9735
- if (isRtl) {
9736
- el.style.removeProperty('left');
9737
- } else {
9738
- el.style.removeProperty('right');
9739
- }
9740
-
9741
9766
  /* eslint-disable-next-line sonarjs/prefer-immediate-return */
9742
9767
  const contentBox = nullifyTransforms(el);
9743
9768
  if (isRtl) {
@@ -10265,7 +10290,8 @@
10265
10290
  function useActivator(props, _ref) {
10266
10291
  let {
10267
10292
  isActive,
10268
- isTop
10293
+ isTop,
10294
+ contentEl
10269
10295
  } = _ref;
10270
10296
  const vm = getCurrentInstance('useActivator');
10271
10297
  const activatorEl = vue.ref();
@@ -10382,7 +10408,7 @@
10382
10408
  return events;
10383
10409
  });
10384
10410
  vue.watch(isTop, val => {
10385
- if (val && (props.openOnHover && !isHovered && (!openOnFocus.value || !isFocused) || openOnFocus.value && !isFocused && (!props.openOnHover || !isHovered))) {
10411
+ if (val && (props.openOnHover && !isHovered && (!openOnFocus.value || !isFocused) || openOnFocus.value && !isFocused && (!props.openOnHover || !isHovered)) && !contentEl.value?.contains(document.activeElement)) {
10386
10412
  isActive.value = false;
10387
10413
  }
10388
10414
  });
@@ -10792,6 +10818,9 @@
10792
10818
  emit
10793
10819
  } = _ref;
10794
10820
  const vm = getCurrentInstance('VOverlay');
10821
+ const root = vue.ref();
10822
+ const scrimEl = vue.ref();
10823
+ const contentEl = vue.ref();
10795
10824
  const model = useProxiedModel(props, 'modelValue');
10796
10825
  const isActive = vue.computed({
10797
10826
  get: () => model.value,
@@ -10829,7 +10858,8 @@
10829
10858
  scrimEvents
10830
10859
  } = useActivator(props, {
10831
10860
  isActive,
10832
- isTop: localTop
10861
+ isTop: localTop,
10862
+ contentEl
10833
10863
  });
10834
10864
  const {
10835
10865
  teleportTarget
@@ -10850,9 +10880,6 @@
10850
10880
  vue.watch(() => props.disabled, v => {
10851
10881
  if (v) isActive.value = false;
10852
10882
  });
10853
- const root = vue.ref();
10854
- const scrimEl = vue.ref();
10855
- const contentEl = vue.ref();
10856
10883
  const {
10857
10884
  contentStyles,
10858
10885
  updateLocation
@@ -11103,10 +11130,12 @@
11103
11130
  // TODO
11104
11131
  // disableKeys: Boolean,
11105
11132
  id: String,
11133
+ submenu: Boolean,
11106
11134
  ...omit(makeVOverlayProps({
11107
11135
  closeDelay: 250,
11108
11136
  closeOnContentClick: true,
11109
11137
  locationStrategy: 'connected',
11138
+ location: undefined,
11110
11139
  openDelay: 300,
11111
11140
  scrim: false,
11112
11141
  scrollStrategy: 'reposition',
@@ -11129,27 +11158,32 @@
11129
11158
  const {
11130
11159
  scopeId
11131
11160
  } = useScopeId();
11161
+ const {
11162
+ isRtl
11163
+ } = useRtl();
11132
11164
  const uid = getUid();
11133
11165
  const id = vue.computed(() => props.id || `v-menu-${uid}`);
11134
11166
  const overlay = vue.ref();
11135
11167
  const parent = vue.inject(VMenuSymbol, null);
11136
- const openChildren = vue.shallowRef(0);
11168
+ const openChildren = vue.shallowRef(new Set());
11137
11169
  vue.provide(VMenuSymbol, {
11138
11170
  register() {
11139
- ++openChildren.value;
11171
+ openChildren.value.add(uid);
11140
11172
  },
11141
11173
  unregister() {
11142
- --openChildren.value;
11174
+ openChildren.value.delete(uid);
11143
11175
  },
11144
11176
  closeParents(e) {
11145
11177
  setTimeout(() => {
11146
- if (!openChildren.value && !props.persistent && (e == null || overlay.value?.contentEl && !isClickInsideElement(e, overlay.value.contentEl))) {
11178
+ if (!openChildren.value.size && !props.persistent && (e == null || overlay.value?.contentEl && !isClickInsideElement(e, overlay.value.contentEl))) {
11147
11179
  isActive.value = false;
11148
11180
  parent?.closeParents();
11149
11181
  }
11150
11182
  }, 40);
11151
11183
  }
11152
11184
  });
11185
+ vue.onBeforeUnmount(() => parent?.unregister());
11186
+ vue.onDeactivated(() => isActive.value = false);
11153
11187
  async function onFocusIn(e) {
11154
11188
  const before = e.relatedTarget;
11155
11189
  const after = e.target;
@@ -11189,9 +11223,9 @@
11189
11223
  isActive.value = false;
11190
11224
  overlay.value?.activatorEl?.focus();
11191
11225
  }
11192
- } else if (['Enter', ' '].includes(e.key) && props.closeOnContentClick) {
11226
+ } else if (props.submenu && e.key === (isRtl.value ? 'ArrowRight' : 'ArrowLeft')) {
11193
11227
  isActive.value = false;
11194
- parent?.closeParents();
11228
+ overlay.value?.activatorEl?.focus();
11195
11229
  }
11196
11230
  }
11197
11231
  function onActivatorKeydown(e) {
@@ -11200,12 +11234,21 @@
11200
11234
  if (el && isActive.value) {
11201
11235
  if (e.key === 'ArrowDown') {
11202
11236
  e.preventDefault();
11237
+ e.stopImmediatePropagation();
11203
11238
  focusChild(el, 'next');
11204
11239
  } else if (e.key === 'ArrowUp') {
11205
11240
  e.preventDefault();
11241
+ e.stopImmediatePropagation();
11206
11242
  focusChild(el, 'prev');
11243
+ } else if (props.submenu) {
11244
+ if (e.key === (isRtl.value ? 'ArrowRight' : 'ArrowLeft')) {
11245
+ isActive.value = false;
11246
+ } else if (e.key === (isRtl.value ? 'ArrowLeft' : 'ArrowRight')) {
11247
+ e.preventDefault();
11248
+ focusChild(el, 'first');
11249
+ }
11207
11250
  }
11208
- } else if (['ArrowDown', 'ArrowUp'].includes(e.key)) {
11251
+ } else if (props.submenu ? e.key === (isRtl.value ? 'ArrowLeft' : 'ArrowRight') : ['ArrowDown', 'ArrowUp'].includes(e.key)) {
11209
11252
  isActive.value = true;
11210
11253
  e.preventDefault();
11211
11254
  setTimeout(() => setTimeout(() => onActivatorKeydown(e)));
@@ -11229,6 +11272,7 @@
11229
11272
  "onUpdate:modelValue": $event => isActive.value = $event,
11230
11273
  "absolute": true,
11231
11274
  "activatorProps": activatorProps.value,
11275
+ "location": props.location ?? (props.submenu ? 'end' : 'bottom'),
11232
11276
  "onClick:outside": onClickOutside,
11233
11277
  "onKeydown": onKeydown
11234
11278
  }, scopeId), {
@@ -12061,6 +12105,7 @@
12061
12105
  deep: true
12062
12106
  });
12063
12107
  return {
12108
+ calculateVisibleItems,
12064
12109
  containerRef,
12065
12110
  markerRef,
12066
12111
  computedItems,
@@ -12124,6 +12169,7 @@
12124
12169
  dimensionStyles
12125
12170
  } = useDimension(props);
12126
12171
  const {
12172
+ calculateVisibleItems,
12127
12173
  containerRef,
12128
12174
  markerRef,
12129
12175
  handleScroll,
@@ -12195,6 +12241,7 @@
12195
12241
  }, [children])]);
12196
12242
  });
12197
12243
  return {
12244
+ calculateVisibleItems,
12198
12245
  scrollToIndex
12199
12246
  };
12200
12247
  }
@@ -12263,9 +12310,9 @@
12263
12310
  }
12264
12311
  }
12265
12312
  return {
12266
- onListScroll,
12267
- onListKeydown
12268
- };
12313
+ onScrollPassive: onListScroll,
12314
+ onKeydown: onListKeydown
12315
+ }; // typescript doesn't know about vue's event merging
12269
12316
  }
12270
12317
 
12271
12318
  // Types
@@ -12340,7 +12387,7 @@
12340
12387
  const menu = vue.computed({
12341
12388
  get: () => _menu.value,
12342
12389
  set: v => {
12343
- if (_menu.value && !v && vMenuRef.value?.ΨopenChildren) return;
12390
+ if (_menu.value && !v && vMenuRef.value?.ΨopenChildren.size) return;
12344
12391
  _menu.value = v;
12345
12392
  }
12346
12393
  });
@@ -12379,10 +12426,7 @@
12379
12426
  };
12380
12427
  });
12381
12428
  const listRef = vue.ref();
12382
- const {
12383
- onListScroll,
12384
- onListKeydown
12385
- } = useScrolling(listRef, vTextFieldRef);
12429
+ const listEvents = useScrolling(listRef, vTextFieldRef);
12386
12430
  function onClear(e) {
12387
12431
  if (props.openOnClear) {
12388
12432
  menu.value = true;
@@ -12392,6 +12436,11 @@
12392
12436
  if (menuDisabled.value) return;
12393
12437
  menu.value = !menu.value;
12394
12438
  }
12439
+ function onListKeydown(e) {
12440
+ if (checkPrintable(e)) {
12441
+ onKeydown(e);
12442
+ }
12443
+ }
12395
12444
  function onKeydown(e) {
12396
12445
  if (!e.key || props.readonly || form?.isReadonly.value) return;
12397
12446
  if (['Enter', ' ', 'ArrowDown', 'ArrowUp', 'Home', 'End'].includes(e.key)) {
@@ -12412,11 +12461,6 @@
12412
12461
  // html select hotkeys
12413
12462
  const KEYBOARD_LOOKUP_THRESHOLD = 1000; // milliseconds
12414
12463
 
12415
- function checkPrintable(e) {
12416
- const isPrintableChar = e.key.length === 1;
12417
- const noModifier = !e.ctrlKey && !e.metaKey && !e.altKey;
12418
- return isPrintableChar && noModifier;
12419
- }
12420
12464
  if (props.multiple || !checkPrintable(e)) return;
12421
12465
  const now = performance.now();
12422
12466
  if (now - keyboardLookupLastTime > KEYBOARD_LOOKUP_THRESHOLD) {
@@ -12461,6 +12505,11 @@
12461
12505
  menu.value = false;
12462
12506
  }
12463
12507
  }
12508
+ function onAfterEnter() {
12509
+ if (props.eager) {
12510
+ vVirtualScrollRef.value?.calculateVisibleItems();
12511
+ }
12512
+ }
12464
12513
  function onAfterLeave() {
12465
12514
  if (isFocused.value) {
12466
12515
  vTextFieldRef.value?.focus();
@@ -12539,6 +12588,7 @@
12539
12588
  "openOnClick": false,
12540
12589
  "closeOnContentClick": false,
12541
12590
  "transition": props.transition,
12591
+ "onAfterEnter": onAfterEnter,
12542
12592
  "onAfterLeave": onAfterLeave
12543
12593
  }, computedMenuProps.value), {
12544
12594
  default: () => [hasList && vue.createVNode(VList, vue.mergeProps({
@@ -12548,11 +12598,10 @@
12548
12598
  "onMousedown": e => e.preventDefault(),
12549
12599
  "onKeydown": onListKeydown,
12550
12600
  "onFocusin": onFocusin,
12551
- "onScrollPassive": onListScroll,
12552
12601
  "tabindex": "-1",
12553
12602
  "aria-live": "polite",
12554
12603
  "color": props.itemColor ?? props.color
12555
- }, props.listProps), {
12604
+ }, listEvents, props.listProps), {
12556
12605
  default: () => [slots['prepend-item']?.(), !displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? vue.createVNode(VListItem, {
12557
12606
  "title": t(props.noDataText)
12558
12607
  }, null)), vue.createVNode(VVirtualScroll, {
@@ -12847,7 +12896,7 @@
12847
12896
  const menu = vue.computed({
12848
12897
  get: () => _menu.value,
12849
12898
  set: v => {
12850
- if (_menu.value && !v && vMenuRef.value?.ΨopenChildren) return;
12899
+ if (_menu.value && !v && vMenuRef.value?.ΨopenChildren.size) return;
12851
12900
  _menu.value = v;
12852
12901
  }
12853
12902
  });
@@ -12891,10 +12940,7 @@
12891
12940
  });
12892
12941
  const menuDisabled = vue.computed(() => props.hideNoData && !displayItems.value.length || props.readonly || form?.isReadonly.value);
12893
12942
  const listRef = vue.ref();
12894
- const {
12895
- onListScroll,
12896
- onListKeydown
12897
- } = useScrolling(listRef, vTextFieldRef);
12943
+ const listEvents = useScrolling(listRef, vTextFieldRef);
12898
12944
  function onClear(e) {
12899
12945
  if (props.openOnClear) {
12900
12946
  menu.value = true;
@@ -12913,6 +12959,11 @@
12913
12959
  }
12914
12960
  menu.value = !menu.value;
12915
12961
  }
12962
+ function onListKeydown(e) {
12963
+ if (checkPrintable(e)) {
12964
+ vTextFieldRef.value?.focus();
12965
+ }
12966
+ }
12916
12967
  function onKeydown(e) {
12917
12968
  if (props.readonly || form?.isReadonly.value) return;
12918
12969
  const selectionStart = vTextFieldRef.value.selectionStart;
@@ -12977,6 +13028,11 @@
12977
13028
  }
12978
13029
  }
12979
13030
  }
13031
+ function onAfterEnter() {
13032
+ if (props.eager) {
13033
+ vVirtualScrollRef.value?.calculateVisibleItems();
13034
+ }
13035
+ }
12980
13036
  function onAfterLeave() {
12981
13037
  if (isFocused.value) {
12982
13038
  isPristine.value = true;
@@ -13105,6 +13161,7 @@
13105
13161
  "openOnClick": false,
13106
13162
  "closeOnContentClick": false,
13107
13163
  "transition": props.transition,
13164
+ "onAfterEnter": onAfterEnter,
13108
13165
  "onAfterLeave": onAfterLeave
13109
13166
  }, props.menuProps), {
13110
13167
  default: () => [hasList && vue.createVNode(VList, vue.mergeProps({
@@ -13115,11 +13172,10 @@
13115
13172
  "onKeydown": onListKeydown,
13116
13173
  "onFocusin": onFocusin,
13117
13174
  "onFocusout": onFocusout,
13118
- "onScrollPassive": onListScroll,
13119
13175
  "tabindex": "-1",
13120
13176
  "aria-live": "polite",
13121
13177
  "color": props.itemColor ?? props.color
13122
- }, props.listProps), {
13178
+ }, listEvents, props.listProps), {
13123
13179
  default: () => [slots['prepend-item']?.(), !displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? vue.createVNode(VListItem, {
13124
13180
  "title": t(props.noDataText)
13125
13181
  }, null)), vue.createVNode(VVirtualScroll, {
@@ -13569,8 +13625,7 @@
13569
13625
  const height = vue.computed(() => Number(props.height) - (props.density === 'comfortable' ? 8 : 0) - (props.density === 'compact' ? 16 : 0));
13570
13626
  const isActive = useProxiedModel(props, 'active', props.active);
13571
13627
  const {
13572
- layoutItemStyles,
13573
- layoutIsReady
13628
+ layoutItemStyles
13574
13629
  } = useLayoutItem({
13575
13630
  id: props.name,
13576
13631
  order: vue.computed(() => parseInt(props.order, 10)),
@@ -13608,7 +13663,7 @@
13608
13663
  }, [slots.default()])]
13609
13664
  });
13610
13665
  });
13611
- return layoutIsReady;
13666
+ return {};
13612
13667
  }
13613
13668
  });
13614
13669
 
@@ -16680,7 +16735,7 @@
16680
16735
  const menu = vue.computed({
16681
16736
  get: () => _menu.value,
16682
16737
  set: v => {
16683
- if (_menu.value && !v && vMenuRef.value?.ΨopenChildren) return;
16738
+ if (_menu.value && !v && vMenuRef.value?.ΨopenChildren.size) return;
16684
16739
  _menu.value = v;
16685
16740
  }
16686
16741
  });
@@ -16763,10 +16818,7 @@
16763
16818
  });
16764
16819
  const menuDisabled = vue.computed(() => props.hideNoData && !displayItems.value.length || props.readonly || form?.isReadonly.value);
16765
16820
  const listRef = vue.ref();
16766
- const {
16767
- onListScroll,
16768
- onListKeydown
16769
- } = useScrolling(listRef, vTextFieldRef);
16821
+ const listEvents = useScrolling(listRef, vTextFieldRef);
16770
16822
  function onClear(e) {
16771
16823
  cleared = true;
16772
16824
  if (props.openOnClear) {
@@ -16785,6 +16837,11 @@
16785
16837
  }
16786
16838
  menu.value = !menu.value;
16787
16839
  }
16840
+ function onListKeydown(e) {
16841
+ if (checkPrintable(e)) {
16842
+ vTextFieldRef.value?.focus();
16843
+ }
16844
+ }
16788
16845
  // eslint-disable-next-line complexity
16789
16846
  function onKeydown(e) {
16790
16847
  if (isComposingIgnoreKey(e) || props.readonly || form?.isReadonly.value) return;
@@ -16849,6 +16906,11 @@
16849
16906
  }
16850
16907
  }
16851
16908
  }
16909
+ function onAfterEnter() {
16910
+ if (props.eager) {
16911
+ vVirtualScrollRef.value?.calculateVisibleItems();
16912
+ }
16913
+ }
16852
16914
  function onAfterLeave() {
16853
16915
  if (isFocused.value) {
16854
16916
  isPristine.value = true;
@@ -16973,6 +17035,7 @@
16973
17035
  "openOnClick": false,
16974
17036
  "closeOnContentClick": false,
16975
17037
  "transition": props.transition,
17038
+ "onAfterEnter": onAfterEnter,
16976
17039
  "onAfterLeave": onAfterLeave
16977
17040
  }, props.menuProps), {
16978
17041
  default: () => [hasList && vue.createVNode(VList, vue.mergeProps({
@@ -16983,11 +17046,10 @@
16983
17046
  "onKeydown": onListKeydown,
16984
17047
  "onFocusin": onFocusin,
16985
17048
  "onFocusout": onFocusout,
16986
- "onScrollPassive": onListScroll,
16987
17049
  "tabindex": "-1",
16988
17050
  "aria-live": "polite",
16989
17051
  "color": props.itemColor ?? props.color
16990
- }, props.listProps), {
17052
+ }, listEvents, props.listProps), {
16991
17053
  default: () => [slots['prepend-item']?.(), !displayItems.value.length && !props.hideNoData && (slots['no-data']?.() ?? vue.createVNode(VListItem, {
16992
17054
  "title": t(props.noDataText)
16993
17055
  }, null)), vue.createVNode(VVirtualScroll, {
@@ -20931,6 +20993,7 @@
20931
20993
  default: false
20932
20994
  },
20933
20995
  ...makeComponentProps(),
20996
+ ...makeDimensionProps(),
20934
20997
  ...makeTagProps()
20935
20998
  }, 'VContainer');
20936
20999
  const VContainer = genericComponent()({
@@ -20943,11 +21006,14 @@
20943
21006
  const {
20944
21007
  rtlClasses
20945
21008
  } = useRtl();
21009
+ const {
21010
+ dimensionStyles
21011
+ } = useDimension(props);
20946
21012
  useRender(() => vue.createVNode(props.tag, {
20947
21013
  "class": ['v-container', {
20948
21014
  'v-container--fluid': props.fluid
20949
21015
  }, rtlClasses.value, props.class],
20950
- "style": props.style
21016
+ "style": [dimensionStyles.value, props.style]
20951
21017
  }, slots));
20952
21018
  return {};
20953
21019
  }
@@ -22369,7 +22435,8 @@
22369
22435
  default: false
22370
22436
  },
22371
22437
  readonly: Boolean,
22372
- ...makeComponentProps()
22438
+ ...makeComponentProps(),
22439
+ ...makeDimensionProps()
22373
22440
  }, 'VExpansionPanelTitle');
22374
22441
  const VExpansionPanelTitle = genericComponent()({
22375
22442
  name: 'VExpansionPanelTitle',
@@ -22387,6 +22454,9 @@
22387
22454
  backgroundColorClasses,
22388
22455
  backgroundColorStyles
22389
22456
  } = useBackgroundColor(props, 'color');
22457
+ const {
22458
+ dimensionStyles
22459
+ } = useDimension(props);
22390
22460
  const slotProps = vue.computed(() => ({
22391
22461
  collapseIcon: props.collapseIcon,
22392
22462
  disabled: expansionPanel.disabled.value,
@@ -22401,7 +22471,7 @@
22401
22471
  'v-expansion-panel-title--focusable': props.focusable,
22402
22472
  'v-expansion-panel-title--static': props.static
22403
22473
  }, backgroundColorClasses.value, props.class],
22404
- "style": [backgroundColorStyles.value, props.style],
22474
+ "style": [backgroundColorStyles.value, dimensionStyles.value, props.style],
22405
22475
  "type": "button",
22406
22476
  "tabindex": expansionPanel.disabled.value ? -1 : undefined,
22407
22477
  "disabled": expansionPanel.disabled.value,
@@ -22924,7 +22994,6 @@
22924
22994
  slots
22925
22995
  } = _ref;
22926
22996
  const layoutItemStyles = vue.ref();
22927
- const layoutIsReady = vue.shallowRef();
22928
22997
  const {
22929
22998
  themeClasses
22930
22999
  } = provideTheme(props);
@@ -22961,7 +23030,6 @@
22961
23030
  });
22962
23031
  vue.watchEffect(() => {
22963
23032
  layoutItemStyles.value = layout.layoutItemStyles.value;
22964
- layoutIsReady.value = layout.layoutIsReady;
22965
23033
  });
22966
23034
  });
22967
23035
  useRender(() => vue.createVNode(props.tag, {
@@ -22971,7 +23039,7 @@
22971
23039
  height: convertToUnit(props.height)
22972
23040
  }, props.style]
22973
23041
  }, slots));
22974
- return props.app ? layoutIsReady.value : {};
23042
+ return {};
22975
23043
  }
22976
23044
  });
22977
23045
 
@@ -23398,9 +23466,7 @@
23398
23466
  "ref": layoutRef,
23399
23467
  "class": [layoutClasses.value, props.class],
23400
23468
  "style": [dimensionStyles.value, layoutStyles.value, props.style]
23401
- }, [vue.createVNode(vue.Suspense, null, {
23402
- default: () => [vue.createVNode(vue.Fragment, null, [slots.default?.()])]
23403
- })]));
23469
+ }, [slots.default?.()]));
23404
23470
  return {
23405
23471
  getLayoutItem,
23406
23472
  items
@@ -23431,8 +23497,7 @@
23431
23497
  slots
23432
23498
  } = _ref;
23433
23499
  const {
23434
- layoutItemStyles,
23435
- layoutIsReady
23500
+ layoutItemStyles
23436
23501
  } = useLayoutItem({
23437
23502
  id: props.name,
23438
23503
  order: vue.computed(() => parseInt(props.order, 10)),
@@ -23442,11 +23507,10 @@
23442
23507
  active: vue.toRef(props, 'modelValue'),
23443
23508
  absolute: vue.toRef(props, 'absolute')
23444
23509
  });
23445
- useRender(() => vue.createVNode("div", {
23510
+ return () => vue.createVNode("div", {
23446
23511
  "class": ['v-layout-item', props.class],
23447
23512
  "style": [layoutItemStyles.value, props.style]
23448
- }, [slots.default?.()]));
23449
- return layoutIsReady;
23513
+ }, [slots.default?.()]);
23450
23514
  }
23451
23515
  });
23452
23516
 
@@ -23557,8 +23621,7 @@
23557
23621
  dimensionStyles
23558
23622
  } = useDimension(props);
23559
23623
  const {
23560
- mainStyles,
23561
- layoutIsReady
23624
+ mainStyles
23562
23625
  } = useLayout();
23563
23626
  const {
23564
23627
  ssrBootStyles
@@ -23573,7 +23636,7 @@
23573
23636
  "class": "v-main__scroller"
23574
23637
  }, [slots.default?.()]) : slots.default?.()]
23575
23638
  }));
23576
- return layoutIsReady;
23639
+ return {};
23577
23640
  }
23578
23641
  });
23579
23642
 
@@ -24043,8 +24106,7 @@
24043
24106
  const elementSize = vue.computed(() => ['top', 'bottom'].includes(props.location) ? 0 : width.value);
24044
24107
  const {
24045
24108
  layoutItemStyles,
24046
- layoutItemScrimStyles,
24047
- layoutIsReady
24109
+ layoutItemScrimStyles
24048
24110
  } = useLayoutItem({
24049
24111
  id: props.name,
24050
24112
  order: vue.computed(() => parseInt(props.order, 10)),
@@ -24140,9 +24202,9 @@
24140
24202
  }, scopeId), null)]
24141
24203
  })]);
24142
24204
  });
24143
- return layoutIsReady.then(() => ({
24205
+ return {
24144
24206
  isStuck
24145
- }));
24207
+ };
24146
24208
  }
24147
24209
  });
24148
24210
 
@@ -25831,7 +25893,7 @@
25831
25893
  const model = useProxiedModel(props, 'modelValue');
25832
25894
  const menuRef = vue.ref();
25833
25895
  const location = vue.computed(() => {
25834
- const [y, x = 'center'] = props.location.split(' ');
25896
+ const [y, x = 'center'] = props.location?.split(' ') ?? [];
25835
25897
  return `${y} ${x}`;
25836
25898
  });
25837
25899
  const locationClasses = vue.computed(() => ({
@@ -28570,6 +28632,7 @@
28570
28632
  const VPullToRefresh = genericComponent()({
28571
28633
  name: 'VPullToRefresh',
28572
28634
  props: {
28635
+ disabled: Boolean,
28573
28636
  pullDownThreshold: {
28574
28637
  type: Number,
28575
28638
  default: 64
@@ -28593,19 +28656,19 @@
28593
28656
  const canRefresh = vue.computed(() => touchDiff.value >= props.pullDownThreshold && !refreshing.value);
28594
28657
  const topOffset = vue.computed(() => clamp(touchDiff.value, 0, props.pullDownThreshold));
28595
28658
  function onTouchstart(e) {
28596
- if (refreshing.value) return;
28659
+ if (refreshing.value || props.disabled) return;
28597
28660
  touching.value = true;
28598
28661
  touchstartY = 'clientY' in e ? e.clientY : e.touches[0].clientY;
28599
28662
  }
28600
28663
  function onTouchmove(e) {
28601
- if (refreshing.value || !touching.value) return;
28664
+ if (refreshing.value || !touching.value || props.disabled) return;
28602
28665
  const touchY = 'clientY' in e ? e.clientY : e.touches[0].clientY;
28603
28666
  if (scrollParents.length && !scrollParents[0].scrollTop) {
28604
28667
  touchDiff.value = touchY - touchstartY;
28605
28668
  }
28606
28669
  }
28607
28670
  function onTouchend(e) {
28608
- if (refreshing.value) return;
28671
+ if (refreshing.value || props.disabled) return;
28609
28672
  touching.value = false;
28610
28673
  if (canRefresh.value) {
28611
28674
  function done() {
@@ -29473,6 +29536,7 @@
29473
29536
 
29474
29537
  const makeVTreeviewItemProps = propsFactory({
29475
29538
  loading: Boolean,
29539
+ onToggleExpand: EventProp(),
29476
29540
  toggleIcon: IconValue,
29477
29541
  ...makeVListItemProps({
29478
29542
  slim: true
@@ -29493,24 +29557,12 @@
29493
29557
  const {
29494
29558
  activate,
29495
29559
  isActivated,
29496
- select,
29497
- isSelected,
29498
- isIndeterminate,
29499
29560
  isGroupActivator,
29500
29561
  root,
29501
29562
  id
29502
29563
  } = useNestedItem(rawId, false);
29503
29564
  const isActivatableGroupActivator = vue.computed(() => root.activatable.value && isGroupActivator);
29504
- const {
29505
- densityClasses
29506
- } = useDensity(props, 'v-list-item');
29507
- const slotProps = vue.computed(() => ({
29508
- isActive: isActivated.value,
29509
- select,
29510
- isSelected: isSelected.value,
29511
- isIndeterminate: isIndeterminate.value
29512
- }));
29513
- const isClickable = vue.computed(() => !props.disabled && props.link !== false && (props.link || link.isClickable.value || props.value != null && !!vListItemRef.value?.list));
29565
+ const isClickable = vue.computed(() => !props.disabled && props.link !== false && (props.link || link.isClickable.value || props.value != null && !!vListItemRef.value?.list || isActivatableGroupActivator.value));
29514
29566
  function activateItem(e) {
29515
29567
  if (!isClickable.value || !isActivatableGroupActivator.value && isGroupActivator) return;
29516
29568
  if (root.activatable.value) {
@@ -29521,68 +29573,20 @@
29521
29573
  }
29522
29574
  }
29523
29575
  }
29524
- function onKeyDown(e) {
29525
- if (e.key === 'Enter' || e.key === ' ') {
29526
- e.preventDefault();
29527
- activateItem(e);
29528
- }
29529
- }
29530
29576
  const visibleIds = vue.inject(VTreeviewSymbol, {
29531
29577
  visibleIds: vue.ref()
29532
29578
  }).visibleIds;
29533
29579
  useRender(() => {
29534
- const hasTitle = slots.title || props.title != null;
29535
- const hasSubtitle = slots.subtitle || props.subtitle != null;
29536
- const listItemProps = VListItem.filterProps(props);
29580
+ const listItemProps = omit(VListItem.filterProps(props), ['onClick']);
29537
29581
  const hasPrepend = slots.prepend || props.toggleIcon;
29538
- return isActivatableGroupActivator.value ? vue.withDirectives(vue.createVNode("div", {
29539
- "class": ['v-list-item', 'v-list-item--one-line', 'v-treeview-item', 'v-treeview-item--activetable-group-activator', {
29540
- 'v-list-item--active': isActivated.value || isSelected.value,
29541
- 'v-treeview-item--filtered': visibleIds.value && !visibleIds.value.has(id.value)
29542
- }, densityClasses.value, props.class],
29543
- "onClick": activateItem
29544
- }, [vue.createVNode(vue.Fragment, null, [genOverlays(isActivated.value || isSelected.value, 'v-list-item'), props.toggleIcon && vue.createVNode(VListItemAction, {
29545
- "start": false
29546
- }, {
29547
- default: () => [vue.createVNode(VBtn, {
29548
- "density": "compact",
29549
- "icon": props.toggleIcon,
29550
- "loading": props.loading,
29551
- "variant": "text",
29552
- "onClick": props.onClick
29553
- }, {
29554
- loader() {
29555
- return vue.createVNode(VProgressCircular, {
29556
- "indeterminate": "disable-shrink",
29557
- "size": "20",
29558
- "width": "2"
29559
- }, null);
29560
- }
29561
- })]
29562
- })]), vue.createVNode("div", {
29563
- "class": "v-list-item__content",
29564
- "data-no-activator": ""
29565
- }, [hasTitle && vue.createVNode(VListItemTitle, {
29566
- "key": "title"
29567
- }, {
29568
- default: () => [slots.title?.({
29569
- title: props.title
29570
- }) ?? props.title]
29571
- }), hasSubtitle && vue.createVNode(VListItemSubtitle, {
29572
- "key": "subtitle"
29573
- }, {
29574
- default: () => [slots.subtitle?.({
29575
- subtitle: props.subtitle
29576
- }) ?? props.subtitle]
29577
- }), slots.default?.(slotProps.value)])]), [[vue.resolveDirective("ripple"), isClickable.value && props.ripple]]) : vue.createVNode(VListItem, vue.mergeProps({
29578
- "ref": vListItemRef
29579
- }, listItemProps, {
29582
+ return vue.createVNode(VListItem, vue.mergeProps(listItemProps, {
29583
+ "active": isActivated.value,
29580
29584
  "class": ['v-treeview-item', {
29585
+ 'v-treeview-item--activatable-group-activator': isActivatableGroupActivator.value,
29581
29586
  'v-treeview-item--filtered': visibleIds.value && !visibleIds.value.has(id.value)
29582
29587
  }, props.class],
29583
- "value": id.value,
29584
- "onClick": activateItem,
29585
- "onKeydown": isClickable.value && onKeyDown
29588
+ "ripple": false,
29589
+ "onClick": props.onClick ?? activateItem
29586
29590
  }), {
29587
29591
  ...slots,
29588
29592
  prepend: hasPrepend ? slotProps => {
@@ -29593,7 +29597,8 @@
29593
29597
  "density": "compact",
29594
29598
  "icon": props.toggleIcon,
29595
29599
  "loading": props.loading,
29596
- "variant": "text"
29600
+ "variant": "text",
29601
+ "onClick": props.onToggleExpand
29597
29602
  }, {
29598
29603
  loader() {
29599
29604
  return vue.createVNode(VProgressCircular, {
@@ -29620,7 +29625,19 @@
29620
29625
  default: '$loading'
29621
29626
  },
29622
29627
  items: Array,
29628
+ openOnClick: {
29629
+ type: Boolean,
29630
+ default: undefined
29631
+ },
29632
+ indeterminateIcon: {
29633
+ type: IconValue,
29634
+ default: '$checkboxIndeterminate'
29635
+ },
29636
+ falseIcon: IconValue,
29637
+ trueIcon: IconValue,
29638
+ returnObject: Boolean,
29623
29639
  selectable: Boolean,
29640
+ selectedColor: String,
29624
29641
  selectStrategy: [String, Function, Object]
29625
29642
  }, 'VTreeviewChildren');
29626
29643
  const VTreeviewChildren = genericComponent()({
@@ -29632,6 +29649,7 @@
29632
29649
  slots
29633
29650
  } = _ref;
29634
29651
  const isLoading = vue.shallowRef(null);
29652
+ const isClickOnOpen = vue.computed(() => props.openOnClick != null ? props.openOnClick : props.selectable);
29635
29653
  function checkChildren(item) {
29636
29654
  return new Promise(resolve => {
29637
29655
  if (!props.items?.length || !props.loadChildren) return resolve();
@@ -29662,7 +29680,11 @@
29662
29680
  "key": item.value,
29663
29681
  "modelValue": slotProps.isSelected,
29664
29682
  "loading": loading,
29683
+ "color": props.selectedColor,
29665
29684
  "indeterminate": slotProps.isIndeterminate,
29685
+ "indeterminateIcon": props.indeterminateIcon,
29686
+ "falseIcon": props.falseIcon,
29687
+ "trueIcon": props.trueIcon,
29666
29688
  "onClick": vue.withModifiers(() => selectItem(slotProps.select, slotProps.isSelected), ['stop']),
29667
29689
  "onKeydown": e => {
29668
29690
  if (!['Enter', 'Space'].includes(e.key)) return;
@@ -29684,9 +29706,9 @@
29684
29706
  };
29685
29707
  const treeviewGroupProps = VTreeviewGroup.filterProps(itemProps);
29686
29708
  const treeviewChildrenProps = VTreeviewChildren.filterProps(props);
29687
- return children ? vue.createVNode(VTreeviewGroup, vue.mergeProps({
29688
- "value": itemProps?.value
29689
- }, treeviewGroupProps), {
29709
+ return children ? vue.createVNode(VTreeviewGroup, vue.mergeProps(treeviewGroupProps, {
29710
+ "value": props.returnObject ? item : treeviewGroupProps?.value
29711
+ }), {
29690
29712
  activator: _ref3 => {
29691
29713
  let {
29692
29714
  props: activatorProps
@@ -29694,19 +29716,24 @@
29694
29716
  const listItemProps = {
29695
29717
  ...itemProps,
29696
29718
  ...activatorProps,
29697
- value: itemProps?.value
29719
+ value: itemProps?.value,
29720
+ onToggleExpand: activatorProps.onClick,
29721
+ onClick: isClickOnOpen.value ? [() => checkChildren(item), activatorProps.onClick] : undefined
29698
29722
  };
29699
29723
  return vue.createVNode(VTreeviewItem, vue.mergeProps(listItemProps, {
29700
- "loading": loading,
29701
- "onClick": () => checkChildren(item)
29724
+ "value": props.returnObject ? vue.toRaw(item) : itemProps.value,
29725
+ "loading": loading
29702
29726
  }), slotsWithItem);
29703
29727
  },
29704
29728
  default: () => vue.createVNode(VTreeviewChildren, vue.mergeProps(treeviewChildrenProps, {
29705
- "items": children
29729
+ "items": children,
29730
+ "returnObject": props.returnObject
29706
29731
  }), slots)
29707
29732
  }) : slots.item?.({
29708
29733
  props: itemProps
29709
- }) ?? vue.createVNode(VTreeviewItem, itemProps, slotsWithItem);
29734
+ }) ?? vue.createVNode(VTreeviewItem, vue.mergeProps(itemProps, {
29735
+ "value": props.returnObject ? vue.toRaw(item) : itemProps.value
29736
+ }), slotsWithItem);
29710
29737
  });
29711
29738
  }
29712
29739
  });
@@ -29730,7 +29757,11 @@
29730
29757
  collapseIcon: '$treeviewCollapse',
29731
29758
  expandIcon: '$treeviewExpand',
29732
29759
  slim: true
29733
- }), ['itemType', 'nav'])
29760
+ }), ['itemType', 'nav', 'openStrategy']),
29761
+ modelValue: {
29762
+ type: Array,
29763
+ default: () => []
29764
+ }
29734
29765
  }, 'VTreeview');
29735
29766
  const VTreeview = genericComponent()({
29736
29767
  name: 'VTreeview',
@@ -29739,6 +29770,7 @@
29739
29770
  'update:opened': val => true,
29740
29771
  'update:activated': val => true,
29741
29772
  'update:selected': val => true,
29773
+ 'update:modelValue': val => true,
29742
29774
  'click:open': value => true,
29743
29775
  'click:select': value => true
29744
29776
  },
@@ -29753,7 +29785,15 @@
29753
29785
  const baseColor = vue.toRef(props, 'baseColor');
29754
29786
  const color = vue.toRef(props, 'color');
29755
29787
  const activated = useProxiedModel(props, 'activated');
29756
- const selected = useProxiedModel(props, 'selected');
29788
+ const model = useProxiedModel(props, 'modelValue');
29789
+ const _selected = useProxiedModel(props, 'selected', props.modelValue);
29790
+ const selected = vue.computed({
29791
+ get: () => _selected.value,
29792
+ set(val) {
29793
+ _selected.value = val;
29794
+ model.value = val;
29795
+ }
29796
+ });
29757
29797
  const vListRef = vue.ref();
29758
29798
  const opened = vue.computed(() => props.openAll ? openAll(items.value) : props.opened);
29759
29799
  const flatItems = vue.computed(() => flatten(items.value));
@@ -29789,11 +29829,11 @@
29789
29829
  }
29790
29830
  return arr;
29791
29831
  }
29792
- function openAll(item) {
29832
+ function openAll(items) {
29793
29833
  let ids = [];
29794
- for (const i of item) {
29834
+ for (const i of items) {
29795
29835
  if (!i.children) continue;
29796
- ids.push(i.value);
29836
+ ids.push(props.returnObject ? vue.toRaw(i.raw) : i.value);
29797
29837
  if (i.children) {
29798
29838
  ids = ids.concat(openAll(i.children));
29799
29839
  }
@@ -29829,6 +29869,7 @@
29829
29869
  "ref": vListRef
29830
29870
  }, listProps, {
29831
29871
  "class": ['v-treeview', props.class],
29872
+ "open-strategy": "multiple",
29832
29873
  "style": props.style,
29833
29874
  "opened": opened.value,
29834
29875
  "activated": activated.value,
@@ -29837,6 +29878,7 @@
29837
29878
  "onUpdate:selected": $event => selected.value = $event
29838
29879
  }), {
29839
29880
  default: () => [vue.createVNode(VTreeviewChildren, vue.mergeProps(treeviewChildrenProps, {
29881
+ "returnObject": props.returnObject,
29840
29882
  "items": items.value
29841
29883
  }), slots)]
29842
29884
  });
@@ -30340,7 +30382,7 @@
30340
30382
  goTo
30341
30383
  };
30342
30384
  }
30343
- const version$1 = "3.6.15";
30385
+ const version$1 = "3.7.0";
30344
30386
  createVuetify$1.version = version$1;
30345
30387
 
30346
30388
  // Vue's inject() can only be used in setup
@@ -30593,7 +30635,7 @@
30593
30635
 
30594
30636
  /* eslint-disable local-rules/sort-imports */
30595
30637
 
30596
- const version = "3.6.15";
30638
+ const version = "3.7.0";
30597
30639
 
30598
30640
  /* eslint-disable local-rules/sort-imports */
30599
30641