@vuetify/nightly 3.0.0-beta.0 → 3.0.0-beta.2

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 (277) hide show
  1. package/CHANGELOG.md +53 -2
  2. package/dist/json/attributes.json +343 -195
  3. package/dist/json/importMap.json +20 -0
  4. package/dist/json/tags.json +106 -44
  5. package/dist/json/web-types.json +946 -549
  6. package/dist/vuetify.css +1486 -1085
  7. package/dist/vuetify.d.ts +9036 -8077
  8. package/dist/vuetify.esm.js +1511 -944
  9. package/dist/vuetify.esm.js.map +1 -1
  10. package/dist/vuetify.js +1510 -943
  11. package/dist/vuetify.js.map +1 -1
  12. package/dist/vuetify.min.css +3 -3
  13. package/dist/vuetify.min.js +825 -754
  14. package/dist/vuetify.min.js.map +1 -1
  15. package/lib/components/VAlert/VAlert.css +29 -8
  16. package/lib/components/VAlert/VAlert.mjs +31 -17
  17. package/lib/components/VAlert/VAlert.mjs.map +1 -1
  18. package/lib/components/VAlert/VAlert.sass +27 -7
  19. package/lib/components/VAlert/VAlertTitle.mjs +1 -0
  20. package/lib/components/VAlert/VAlertTitle.mjs.map +1 -1
  21. package/lib/components/VAlert/_variables.scss +14 -7
  22. package/lib/components/VApp/VApp.css +1 -0
  23. package/lib/components/VApp/VApp.sass +1 -0
  24. package/lib/components/VAppBar/VAppBar.mjs +7 -3
  25. package/lib/components/VAppBar/VAppBar.mjs.map +1 -1
  26. package/lib/components/VAppBar/VAppBarTitle.mjs.map +1 -1
  27. package/lib/components/VAutocomplete/VAutocomplete.mjs +82 -69
  28. package/lib/components/VAutocomplete/VAutocomplete.mjs.map +1 -1
  29. package/lib/components/VAvatar/VAvatar.mjs +15 -14
  30. package/lib/components/VAvatar/VAvatar.mjs.map +1 -1
  31. package/lib/components/VBanner/VBanner.css +82 -58
  32. package/lib/components/VBanner/VBanner.mjs +39 -43
  33. package/lib/components/VBanner/VBanner.mjs.map +1 -1
  34. package/lib/components/VBanner/VBanner.sass +61 -54
  35. package/lib/components/VBanner/VBannerActions.mjs +34 -2
  36. package/lib/components/VBanner/VBannerActions.mjs.map +1 -1
  37. package/lib/components/VBanner/VBannerAvatar.mjs +20 -0
  38. package/lib/components/VBanner/VBannerAvatar.mjs.map +1 -0
  39. package/lib/components/VBanner/VBannerIcon.mjs +20 -0
  40. package/lib/components/VBanner/VBannerIcon.mjs.map +1 -0
  41. package/lib/components/VBanner/_variables.scss +10 -14
  42. package/lib/components/VBanner/index.mjs +2 -0
  43. package/lib/components/VBanner/index.mjs.map +1 -1
  44. package/lib/components/VBreadcrumbs/VBreadcrumbs.mjs +2 -0
  45. package/lib/components/VBreadcrumbs/VBreadcrumbs.mjs.map +1 -1
  46. package/lib/components/VBreadcrumbs/VBreadcrumbsItem.mjs +10 -9
  47. package/lib/components/VBreadcrumbs/VBreadcrumbsItem.mjs.map +1 -1
  48. package/lib/components/VBtn/VBtn.css +20 -1
  49. package/lib/components/VBtn/VBtn.mjs +20 -7
  50. package/lib/components/VBtn/VBtn.mjs.map +1 -1
  51. package/lib/components/VBtn/VBtn.sass +15 -2
  52. package/lib/components/VBtn/_variables.scss +3 -0
  53. package/lib/components/VBtnGroup/VBtnGroup.css +14 -6
  54. package/lib/components/VBtnGroup/VBtnGroup.sass +14 -6
  55. package/lib/components/VCard/VCard.css +13 -11
  56. package/lib/components/VCard/VCard.mjs +5 -2
  57. package/lib/components/VCard/VCard.mjs.map +1 -1
  58. package/lib/components/VCard/VCard.sass +12 -9
  59. package/lib/components/VCard/VCardActions.mjs +1 -2
  60. package/lib/components/VCard/VCardActions.mjs.map +1 -1
  61. package/lib/components/VCard/VCardContent.mjs +3 -0
  62. package/lib/components/VCard/VCardContent.mjs.map +1 -0
  63. package/lib/components/VCard/_variables.scss +11 -5
  64. package/lib/components/VCard/index.mjs +1 -0
  65. package/lib/components/VCard/index.mjs.map +1 -1
  66. package/lib/components/VCarousel/VCarousel.mjs +1 -1
  67. package/lib/components/VCarousel/VCarousel.mjs.map +1 -1
  68. package/lib/components/VCheckbox/VCheckbox.mjs +2 -2
  69. package/lib/components/VCheckbox/VCheckbox.mjs.map +1 -1
  70. package/lib/components/VChip/VChip.css +3 -0
  71. package/lib/components/VChip/VChip.sass +3 -0
  72. package/lib/components/VChip/_variables.scss +3 -0
  73. package/lib/components/VColorPicker/VColorPickerCanvas.css +1 -1
  74. package/lib/components/VCombobox/VCombobox.mjs +92 -74
  75. package/lib/components/VCombobox/VCombobox.mjs.map +1 -1
  76. package/lib/components/VDialog/VDialog.css +31 -11
  77. package/lib/components/VDialog/VDialog.mjs +6 -9
  78. package/lib/components/VDialog/VDialog.mjs.map +1 -1
  79. package/lib/components/VDialog/VDialog.sass +27 -10
  80. package/lib/components/VDialog/_variables.scss +3 -6
  81. package/lib/components/VExpansionPanel/VExpansionPanel.css +3 -2
  82. package/lib/components/VExpansionPanel/VExpansionPanel.mjs +6 -2
  83. package/lib/components/VExpansionPanel/VExpansionPanel.mjs.map +1 -1
  84. package/lib/components/VExpansionPanel/VExpansionPanelTitle.mjs +5 -3
  85. package/lib/components/VExpansionPanel/VExpansionPanelTitle.mjs.map +1 -1
  86. package/lib/components/VExpansionPanel/VExpansionPanels.mjs +4 -0
  87. package/lib/components/VExpansionPanel/VExpansionPanels.mjs.map +1 -1
  88. package/lib/components/VField/VField.css +1 -1
  89. package/lib/components/VField/VField.mjs +3 -4
  90. package/lib/components/VField/VField.mjs.map +1 -1
  91. package/lib/components/VField/VField.sass +1 -1
  92. package/lib/components/VFileInput/VFileInput.mjs +2 -1
  93. package/lib/components/VFileInput/VFileInput.mjs.map +1 -1
  94. package/lib/components/VFooter/VFooter.mjs +32 -15
  95. package/lib/components/VFooter/VFooter.mjs.map +1 -1
  96. package/lib/components/VForm/VForm.mjs +25 -11
  97. package/lib/components/VForm/VForm.mjs.map +1 -1
  98. package/lib/components/VIcon/VIcon.css +27 -12
  99. package/lib/components/VIcon/VIcon.mjs +19 -16
  100. package/lib/components/VIcon/VIcon.mjs.map +1 -1
  101. package/lib/components/VIcon/VIcon.sass +27 -16
  102. package/lib/components/VIcon/_variables.scss +1 -0
  103. package/lib/components/VInput/VInput.css +3 -1
  104. package/lib/components/VInput/VInput.mjs +3 -4
  105. package/lib/components/VInput/VInput.mjs.map +1 -1
  106. package/lib/components/VInput/VInput.sass +3 -1
  107. package/lib/components/VInput/_variables.scss +4 -0
  108. package/lib/components/VList/VList.css +7 -6
  109. package/lib/components/VList/VList.mjs +36 -17
  110. package/lib/components/VList/VList.mjs.map +1 -1
  111. package/lib/components/VList/VList.sass +3 -2
  112. package/lib/components/VList/VListChildren.mjs +1 -1
  113. package/lib/components/VList/VListChildren.mjs.map +1 -1
  114. package/lib/components/VList/VListGroup.mjs +28 -10
  115. package/lib/components/VList/VListGroup.mjs.map +1 -1
  116. package/lib/components/VList/VListItem.css +119 -42
  117. package/lib/components/VList/VListItem.mjs +36 -32
  118. package/lib/components/VList/VListItem.mjs.map +1 -1
  119. package/lib/components/VList/VListItem.sass +76 -28
  120. package/lib/components/VList/VListItemAction.mjs +29 -0
  121. package/lib/components/VList/VListItemAction.mjs.map +1 -0
  122. package/lib/components/VList/VListItemAvatar.mjs +10 -16
  123. package/lib/components/VList/VListItemAvatar.mjs.map +1 -1
  124. package/lib/components/VList/VListItemIcon.mjs +23 -0
  125. package/lib/components/VList/VListItemIcon.mjs.map +1 -0
  126. package/lib/components/VList/VListItemMedia.mjs +4 -4
  127. package/lib/components/VList/VListItemMedia.mjs.map +1 -1
  128. package/lib/components/VList/_variables.scss +12 -3
  129. package/lib/components/VList/index.mjs +2 -0
  130. package/lib/components/VList/index.mjs.map +1 -1
  131. package/lib/components/VMenu/VMenu.css +2 -12
  132. package/lib/components/VMenu/VMenu.mjs +61 -31
  133. package/lib/components/VMenu/VMenu.mjs.map +1 -1
  134. package/lib/components/VMenu/VMenu.sass +3 -6
  135. package/lib/components/VMenu/shared.mjs +2 -0
  136. package/lib/components/VMenu/shared.mjs.map +1 -0
  137. package/lib/components/VNavigationDrawer/VNavigationDrawer.mjs +1 -1
  138. package/lib/components/VNavigationDrawer/VNavigationDrawer.mjs.map +1 -1
  139. package/lib/components/VOverlay/VOverlay.css +8 -0
  140. package/lib/components/VOverlay/VOverlay.mjs +16 -15
  141. package/lib/components/VOverlay/VOverlay.mjs.map +1 -1
  142. package/lib/components/VOverlay/VOverlay.sass +9 -0
  143. package/lib/components/VOverlay/_variables.scss +1 -0
  144. package/lib/components/VOverlay/positionStrategies.mjs +7 -3
  145. package/lib/components/VOverlay/positionStrategies.mjs.map +1 -1
  146. package/lib/components/VOverlay/scrollStrategies.mjs +9 -0
  147. package/lib/components/VOverlay/scrollStrategies.mjs.map +1 -1
  148. package/lib/components/VOverlay/useActivator.mjs +50 -14
  149. package/lib/components/VOverlay/useActivator.mjs.map +1 -1
  150. package/lib/components/VPagination/VPagination.mjs +10 -12
  151. package/lib/components/VPagination/VPagination.mjs.map +1 -1
  152. package/lib/components/VProgressLinear/VProgressLinear.css +1 -1
  153. package/lib/components/VRadio/VRadio.mjs +1 -2
  154. package/lib/components/VRadio/VRadio.mjs.map +1 -1
  155. package/lib/components/VRadioGroup/VRadioGroup.mjs +2 -2
  156. package/lib/components/VRadioGroup/VRadioGroup.mjs.map +1 -1
  157. package/lib/components/VRangeSlider/VRangeSlider.mjs +5 -2
  158. package/lib/components/VRangeSlider/VRangeSlider.mjs.map +1 -1
  159. package/lib/components/VRating/VRating.css +2 -2
  160. package/lib/components/VRating/VRating.mjs +13 -3
  161. package/lib/components/VRating/VRating.mjs.map +1 -1
  162. package/lib/components/VRating/VRating.sass +2 -2
  163. package/lib/components/VSelect/VSelect.mjs +70 -91
  164. package/lib/components/VSelect/VSelect.mjs.map +1 -1
  165. package/lib/components/VSelectionControl/VSelectionControl.mjs +2 -1
  166. package/lib/components/VSelectionControl/VSelectionControl.mjs.map +1 -1
  167. package/lib/components/VSelectionControlGroup/VSelectionControlGroup.mjs +2 -2
  168. package/lib/components/VSelectionControlGroup/VSelectionControlGroup.mjs.map +1 -1
  169. package/lib/components/VSlideGroup/VSlideGroup.css +0 -5
  170. package/lib/components/VSlideGroup/VSlideGroup.mjs +36 -14
  171. package/lib/components/VSlideGroup/VSlideGroup.mjs.map +1 -1
  172. package/lib/components/VSlideGroup/VSlideGroup.sass +0 -4
  173. package/lib/components/VSlideGroup/VSlideGroupItem.mjs +3 -1
  174. package/lib/components/VSlideGroup/VSlideGroupItem.mjs.map +1 -1
  175. package/lib/components/VSlider/VSlider.css +7 -2
  176. package/lib/components/VSlider/VSlider.sass +11 -5
  177. package/lib/components/VSlider/VSliderTrack.css +6 -6
  178. package/lib/components/VSlider/VSliderTrack.mjs +1 -1
  179. package/lib/components/VSlider/VSliderTrack.mjs.map +1 -1
  180. package/lib/components/VSlider/VSliderTrack.sass +7 -7
  181. package/lib/components/VSlider/_variables.scss +5 -2
  182. package/lib/components/VSnackbar/VSnackbar.css +14 -13
  183. package/lib/components/VSnackbar/VSnackbar.mjs +22 -10
  184. package/lib/components/VSnackbar/VSnackbar.mjs.map +1 -1
  185. package/lib/components/VSnackbar/VSnackbar.sass +15 -16
  186. package/lib/components/VSnackbar/_variables.scss +0 -4
  187. package/lib/components/VSwitch/VSwitch.mjs +8 -5
  188. package/lib/components/VSwitch/VSwitch.mjs.map +1 -1
  189. package/lib/components/VSystemBar/VSystemBar.css +0 -5
  190. package/lib/components/VSystemBar/VSystemBar.mjs +31 -14
  191. package/lib/components/VSystemBar/VSystemBar.mjs.map +1 -1
  192. package/lib/components/VSystemBar/VSystemBar.sass +0 -5
  193. package/lib/components/VSystemBar/_variables.scss +0 -3
  194. package/lib/components/VTabs/VTab.mjs +28 -32
  195. package/lib/components/VTabs/VTab.mjs.map +1 -1
  196. package/lib/components/VTabs/VTabs.css +6 -2
  197. package/lib/components/VTabs/VTabs.mjs +7 -8
  198. package/lib/components/VTabs/VTabs.mjs.map +1 -1
  199. package/lib/components/VTabs/VTabs.sass +6 -1
  200. package/lib/components/VTabs/shared.mjs +2 -0
  201. package/lib/components/VTabs/shared.mjs.map +1 -0
  202. package/lib/components/VTextField/VTextField.css +4 -4
  203. package/lib/components/VTextField/VTextField.mjs +5 -9
  204. package/lib/components/VTextField/VTextField.mjs.map +1 -1
  205. package/lib/components/VTextField/VTextField.sass +5 -5
  206. package/lib/components/VTextarea/VTextarea.css +7 -4
  207. package/lib/components/VTextarea/VTextarea.sass +9 -5
  208. package/lib/components/VTimeline/VTimeline.css +187 -48
  209. package/lib/components/VTimeline/VTimeline.mjs +27 -11
  210. package/lib/components/VTimeline/VTimeline.mjs.map +1 -1
  211. package/lib/components/VTimeline/VTimeline.sass +196 -51
  212. package/lib/components/VTimeline/VTimelineDivider.mjs +2 -1
  213. package/lib/components/VTimeline/VTimelineDivider.mjs.map +1 -1
  214. package/lib/components/VTimeline/_variables.scss +2 -1
  215. package/lib/components/VToolbar/VToolbar.css +8 -1
  216. package/lib/components/VToolbar/VToolbar.mjs +8 -11
  217. package/lib/components/VToolbar/VToolbar.mjs.map +1 -1
  218. package/lib/components/VToolbar/VToolbar.sass +2 -1
  219. package/lib/components/VToolbar/VToolbarItems.mjs +0 -1
  220. package/lib/components/VToolbar/VToolbarItems.mjs.map +1 -1
  221. package/lib/components/VToolbar/_variables.scss +13 -1
  222. package/lib/components/VWindow/VWindow.mjs +0 -8
  223. package/lib/components/VWindow/VWindow.mjs.map +1 -1
  224. package/lib/components/index.d.ts +9025 -8077
  225. package/lib/composables/defaults.mjs +2 -2
  226. package/lib/composables/defaults.mjs.map +1 -1
  227. package/lib/composables/form.mjs +18 -5
  228. package/lib/composables/form.mjs.map +1 -1
  229. package/lib/composables/forwardRef.mjs +10 -6
  230. package/lib/composables/forwardRef.mjs.map +1 -1
  231. package/lib/composables/group.mjs +14 -6
  232. package/lib/composables/group.mjs.map +1 -1
  233. package/lib/composables/index.mjs.map +1 -1
  234. package/lib/composables/items.mjs +56 -0
  235. package/lib/composables/items.mjs.map +1 -0
  236. package/lib/composables/layout.mjs +7 -3
  237. package/lib/composables/layout.mjs.map +1 -1
  238. package/lib/composables/loader.mjs.map +1 -1
  239. package/lib/composables/nested/nested.mjs +27 -14
  240. package/lib/composables/nested/nested.mjs.map +1 -1
  241. package/lib/composables/nested/openStrategies.mjs +63 -36
  242. package/lib/composables/nested/openStrategies.mjs.map +1 -1
  243. package/lib/composables/nested/selectStrategies.mjs +163 -122
  244. package/lib/composables/nested/selectStrategies.mjs.map +1 -1
  245. package/lib/composables/overlay.mjs +5 -1
  246. package/lib/composables/overlay.mjs.map +1 -1
  247. package/lib/composables/proxiedModel.mjs.map +1 -1
  248. package/lib/composables/resizeObserver.mjs +1 -9
  249. package/lib/composables/resizeObserver.mjs.map +1 -1
  250. package/lib/composables/router.mjs +17 -5
  251. package/lib/composables/router.mjs.map +1 -1
  252. package/lib/composables/selectLink.mjs +19 -0
  253. package/lib/composables/selectLink.mjs.map +1 -0
  254. package/lib/composables/stack.mjs +7 -4
  255. package/lib/composables/stack.mjs.map +1 -1
  256. package/lib/composables/validation.mjs +6 -3
  257. package/lib/composables/validation.mjs.map +1 -1
  258. package/lib/composables/variant.mjs +0 -3
  259. package/lib/composables/variant.mjs.map +1 -1
  260. package/lib/directives/ripple/index.mjs +15 -3
  261. package/lib/directives/ripple/index.mjs.map +1 -1
  262. package/lib/entry-bundler.mjs +1 -1
  263. package/lib/framework.mjs +12 -7
  264. package/lib/framework.mjs.map +1 -1
  265. package/lib/index.d.ts +18 -2
  266. package/lib/locale/ca.mjs +9 -9
  267. package/lib/locale/ca.mjs.map +1 -1
  268. package/lib/styles/generic/_colors.scss +0 -1
  269. package/lib/styles/main.css +400 -392
  270. package/lib/styles/settings/_utilities.scss +54 -26
  271. package/lib/styles/tools/_states.sass +2 -1
  272. package/lib/util/defineComponent.mjs +37 -6
  273. package/lib/util/defineComponent.mjs.map +1 -1
  274. package/lib/util/getCurrentInstance.mjs +1 -1
  275. package/lib/util/getCurrentInstance.mjs.map +1 -1
  276. package/lib/util/helpers.mjs.map +1 -1
  277. package/package.json +31 -29
package/dist/vuetify.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.0.0-beta.0
2
+ * Vuetify v3.0.0-beta.2
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -797,7 +797,7 @@
797
797
  return properties;
798
798
  }
799
799
 
800
- return mergeDeep(properties, properties.prev);
800
+ return mergeDeep(properties.prev, properties);
801
801
  });
802
802
  vue.provide(DefaultsSymbol, newDefaults);
803
803
  return newDefaults;
@@ -822,16 +822,33 @@
822
822
  }
823
823
 
824
824
  if (options._setup) {
825
+ var _options$props;
826
+
827
+ options.props = (_options$props = options.props) != null ? _options$props : {};
828
+ options.props._as = String;
829
+
825
830
  options.setup = function setup(props, ctx) {
826
831
  const vm = vue.getCurrentInstance();
827
832
  const defaults = useDefaults();
828
833
 
834
+ const _subcomponentDefaults = vue.shallowRef();
835
+
829
836
  const _props = vue.shallowReactive({ ...vue.toRaw(props)
830
837
  });
831
838
 
832
839
  vue.watchEffect(() => {
840
+ var _props$_as;
841
+
833
842
  const globalDefaults = defaults.value.global;
834
- const componentDefaults = defaults.value[options.name];
843
+ const componentDefaults = defaults.value[(_props$_as = props._as) != null ? _props$_as : options.name];
844
+
845
+ if (componentDefaults) {
846
+ const subComponents = Object.entries(componentDefaults).filter(_ref => {
847
+ let [key] = _ref;
848
+ return key.startsWith('V');
849
+ });
850
+ if (subComponents.length) _subcomponentDefaults.value = Object.fromEntries(subComponents);
851
+ }
835
852
 
836
853
  for (const prop of Object.keys(props)) {
837
854
  let newVal;
@@ -839,9 +856,9 @@
839
856
  if (propIsDefined(vm.vnode, prop)) {
840
857
  newVal = props[prop];
841
858
  } else {
842
- var _ref, _componentDefaults$pr;
859
+ var _ref2, _componentDefaults$pr;
843
860
 
844
- newVal = (_ref = (_componentDefaults$pr = componentDefaults == null ? void 0 : componentDefaults[prop]) != null ? _componentDefaults$pr : globalDefaults == null ? void 0 : globalDefaults[prop]) != null ? _ref : props[prop];
861
+ newVal = (_ref2 = (_componentDefaults$pr = componentDefaults == null ? void 0 : componentDefaults[prop]) != null ? _componentDefaults$pr : globalDefaults == null ? void 0 : globalDefaults[prop]) != null ? _ref2 : props[prop];
845
862
  }
846
863
 
847
864
  if (_props[prop] !== newVal) {
@@ -849,7 +866,21 @@
849
866
  }
850
867
  }
851
868
  });
852
- return options._setup(_props, ctx);
869
+
870
+ const setupBindings = options._setup(_props, ctx);
871
+
872
+ let scope;
873
+ vue.watch(_subcomponentDefaults, (val, oldVal) => {
874
+ if (!val && scope) scope.stop();else if (val && !oldVal) {
875
+ scope = vue.effectScope();
876
+ scope.run(() => {
877
+ provideDefaults(val);
878
+ });
879
+ }
880
+ }, {
881
+ immediate: true
882
+ });
883
+ return setupBindings;
853
884
  };
854
885
  }
855
886
 
@@ -1406,16 +1437,12 @@
1406
1437
  function useResizeObserver(callback) {
1407
1438
  const resizeRef = vue.ref();
1408
1439
  const contentRect = vue.ref();
1409
- const contentBoxSize = vue.ref();
1410
- const borderBoxSize = vue.ref();
1411
1440
 
1412
1441
  if (IN_BROWSER) {
1413
1442
  const observer = new ResizeObserver(entries => {
1414
1443
  callback == null ? void 0 : callback(entries, observer);
1415
1444
  if (!entries.length) return;
1416
1445
  contentRect.value = entries[0].contentRect;
1417
- contentBoxSize.value = entries[0].contentBoxSize[0];
1418
- borderBoxSize.value = entries[0].borderBoxSize[0];
1419
1446
  });
1420
1447
  vue.onBeforeUnmount(() => {
1421
1448
  observer.disconnect();
@@ -1424,8 +1451,6 @@
1424
1451
  if (oldValue) {
1425
1452
  observer.unobserve(oldValue);
1426
1453
  contentRect.value = undefined;
1427
- contentBoxSize.value = undefined;
1428
- borderBoxSize.value = undefined;
1429
1454
  }
1430
1455
 
1431
1456
  if (newValue) observer.observe(newValue);
@@ -1436,16 +1461,15 @@
1436
1461
 
1437
1462
  return {
1438
1463
  resizeRef,
1439
- contentRect: vue.readonly(contentRect),
1440
- contentBoxSize: vue.readonly(contentBoxSize),
1441
- borderBoxSize: vue.readonly(borderBoxSize)
1464
+ contentRect: vue.readonly(contentRect)
1442
1465
  };
1443
1466
  }
1444
1467
 
1445
1468
  // Composables
1446
1469
 
1447
1470
  const VuetifyLayoutKey = Symbol.for('vuetify:layout');
1448
- const ROOT_ZINDEX$1 = 1000;
1471
+ const VuetifyLayoutItemKey = Symbol.for('vuetify:layout-item');
1472
+ const ROOT_ZINDEX = 1000;
1449
1473
  const makeLayoutProps = propsFactory({
1450
1474
  overlaps: {
1451
1475
  type: Array,
@@ -1476,6 +1500,9 @@
1476
1500
  if (!layout) throw new Error('Could not find injected Vuetify layout');
1477
1501
  const id = (_options$id = options.id) != null ? _options$id : `layout-item-${getUid()}`;
1478
1502
  const vm = getCurrentInstance('useLayoutItem');
1503
+ vue.provide(VuetifyLayoutItemKey, {
1504
+ id
1505
+ });
1479
1506
  const isKeptAlive = vue.ref(false);
1480
1507
  vue.onDeactivated(() => isKeptAlive.value = true);
1481
1508
  vue.onActivated(() => isKeptAlive.value = false);
@@ -1527,7 +1554,7 @@
1527
1554
 
1528
1555
  function createLayout(props) {
1529
1556
  const parentLayout = vue.inject(VuetifyLayoutKey, null);
1530
- const rootZIndex = vue.computed(() => parentLayout ? parentLayout.rootZIndex.value - 100 : ROOT_ZINDEX$1);
1557
+ const rootZIndex = vue.computed(() => parentLayout ? parentLayout.rootZIndex.value - 100 : ROOT_ZINDEX);
1531
1558
  const registered = vue.ref([]);
1532
1559
  const positions = vue.reactive(new Map());
1533
1560
  const layoutSizes = vue.reactive(new Map());
@@ -1638,7 +1665,7 @@
1638
1665
  layoutSizes.set(id, layoutSize);
1639
1666
  activeItems.set(id, active);
1640
1667
  disableTransitions && disabledTransitions.set(id, disableTransitions);
1641
- const instances = findChildrenWithProvide(VuetifyLayoutKey, rootVm == null ? void 0 : rootVm.vnode);
1668
+ const instances = findChildrenWithProvide(VuetifyLayoutItemKey, rootVm == null ? void 0 : rootVm.vnode);
1642
1669
  const instanceIndex = instances.indexOf(vm);
1643
1670
  if (instanceIndex > -1) registered.value.splice(instanceIndex, 0, id);else registered.value.push(id);
1644
1671
  const index = vue.computed(() => items.value.findIndex(i => i.id === id));
@@ -1651,7 +1678,7 @@
1651
1678
  [position.value]: 0,
1652
1679
  zIndex: zIndex.value,
1653
1680
  transform: `translate${isHorizontal ? 'X' : 'Y'}(${(active.value ? 0 : -110) * (isOppositeHorizontal || isOppositeVertical ? -1 : 1)}%)`,
1654
- position: absolute.value || rootZIndex.value !== ROOT_ZINDEX$1 ? 'absolute' : 'fixed',
1681
+ position: absolute.value || rootZIndex.value !== ROOT_ZINDEX ? 'absolute' : 'fixed',
1655
1682
  ...(transitionsEnabled.value ? undefined : {
1656
1683
  transition: 'none'
1657
1684
  })
@@ -1667,17 +1694,17 @@
1667
1694
  }
1668
1695
 
1669
1696
  return { ...styles,
1670
- height: isHorizontal ? `calc(100% - ${item.top}px - ${item.bottom}px)` : `${elementSize.value}px`,
1697
+ height: isHorizontal ? `calc(100% - ${item.top}px - ${item.bottom}px)` : elementSize.value ? `${elementSize.value}px` : undefined,
1671
1698
  marginLeft: isOppositeHorizontal ? undefined : `${item.left}px`,
1672
1699
  marginRight: isOppositeHorizontal ? `${item.right}px` : undefined,
1673
1700
  marginTop: position.value !== 'bottom' ? `${item.top}px` : undefined,
1674
1701
  marginBottom: position.value !== 'top' ? `${item.bottom}px` : undefined,
1675
- width: !isHorizontal ? `calc(100% - ${item.left}px - ${item.right}px)` : `${elementSize.value}px`
1702
+ width: !isHorizontal ? `calc(100% - ${item.left}px - ${item.right}px)` : elementSize.value ? `${elementSize.value}px` : undefined
1676
1703
  };
1677
1704
  });
1678
1705
  const layoutItemScrimStyles = vue.computed(() => ({
1679
1706
  zIndex: zIndex.value - 1,
1680
- position: rootZIndex.value === ROOT_ZINDEX$1 ? 'fixed' : 'absolute'
1707
+ position: rootZIndex.value === ROOT_ZINDEX ? 'fixed' : 'absolute'
1681
1708
  }));
1682
1709
  return {
1683
1710
  layoutItemStyles,
@@ -2573,19 +2600,23 @@
2573
2600
 
2574
2601
  getOwnPropertyDescriptor(target, key) {
2575
2602
  const descriptor = Reflect.getOwnPropertyDescriptor(target, key);
2576
- if (descriptor) return descriptor;
2603
+ if (descriptor) return descriptor; // Check each ref's own properties
2577
2604
 
2578
2605
  for (const ref of refs) {
2579
2606
  if (!ref.value) continue;
2580
2607
  const descriptor = Reflect.getOwnPropertyDescriptor(ref.value, key);
2581
2608
  if (descriptor) return descriptor;
2582
- }
2609
+ } // Recursive search up each ref's prototype
2610
+
2583
2611
 
2584
2612
  for (const ref of refs) {
2585
- const obj = ref.value && Object.getPrototypeOf(ref.value);
2586
- if (!obj) continue;
2587
- const descriptor = Reflect.getOwnPropertyDescriptor(obj, key);
2588
- if (descriptor) return descriptor;
2613
+ let obj = ref.value && Object.getPrototypeOf(ref.value);
2614
+
2615
+ while (obj) {
2616
+ const descriptor = Reflect.getOwnPropertyDescriptor(obj, key);
2617
+ if (descriptor) return descriptor;
2618
+ obj = Object.getPrototypeOf(obj);
2619
+ }
2589
2620
  }
2590
2621
 
2591
2622
  return undefined;
@@ -2649,24 +2680,20 @@
2649
2680
  backgroundColorClasses,
2650
2681
  backgroundColorStyles
2651
2682
  } = useBackgroundColor(vue.toRef(props, 'color'));
2652
- const contentHeight = vue.computed(() => Number(props.height) + (props.density === 'prominent' ? Number(props.height) : 0) - (props.density === 'comfortable' ? 8 : 0) - (props.density === 'compact' ? 16 : 0));
2683
+ const isExtended = vue.computed(() => !!(props.extended || slots.extension));
2684
+ const contentHeight = vue.computed(() => parseInt(Number(props.height) + (props.density === 'prominent' ? Number(props.height) : 0) - (props.density === 'comfortable' ? 8 : 0) - (props.density === 'compact' ? 16 : 0), 10));
2685
+ const extensionHeight = vue.computed(() => isExtended.value ? parseInt(Number(props.extensionHeight) + (props.density === 'prominent' ? Number(props.extensionHeight) : 0) - (props.density === 'comfortable' ? 4 : 0) - (props.density === 'compact' ? 8 : 0), 10) : 0);
2653
2686
  provideDefaults({
2654
2687
  VBtn: {
2655
2688
  flat: true,
2656
2689
  variant: 'text'
2657
- },
2658
- VTextField: {
2659
- hideDetails: true
2660
2690
  }
2661
- }, {
2662
- scoped: true
2663
2691
  });
2664
2692
  useRender(() => {
2665
2693
  var _slots$image, _slots$prepend, _slots$default, _slots$append, _slots$extension;
2666
2694
 
2667
2695
  const hasTitle = !!(props.title || slots.title);
2668
2696
  const hasImage = !!(slots.image || props.image);
2669
- const isExtended = !!(props.extended || slots.extension);
2670
2697
  return vue.createVNode(props.tag, {
2671
2698
  "class": ['v-toolbar', {
2672
2699
  'v-toolbar--absolute': props.absolute,
@@ -2702,16 +2729,17 @@
2702
2729
  text: slots.title
2703
2730
  }), (_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots), slots.append && vue.createVNode("div", {
2704
2731
  "class": "v-toolbar__append"
2705
- }, [(_slots$append = slots.append) == null ? void 0 : _slots$append.call(slots)])]), isExtended && vue.createVNode("div", {
2732
+ }, [(_slots$append = slots.append) == null ? void 0 : _slots$append.call(slots)])]), isExtended.value && vue.createVNode("div", {
2706
2733
  "class": "v-toolbar__extension",
2707
2734
  "style": {
2708
- height: convertToUnit(props.extensionHeight)
2735
+ height: convertToUnit(extensionHeight.value)
2709
2736
  }
2710
2737
  }, [(_slots$extension = slots.extension) == null ? void 0 : _slots$extension.call(slots)])]
2711
2738
  });
2712
2739
  });
2713
2740
  return useForwardRef({
2714
- contentHeight
2741
+ contentHeight,
2742
+ extensionHeight
2715
2743
  });
2716
2744
  }
2717
2745
 
@@ -2789,9 +2817,11 @@
2789
2817
  const vToolbarRef = vue.ref();
2790
2818
  const isActive = useProxiedModel(props, 'modelValue');
2791
2819
  const height = vue.computed(() => {
2792
- var _vToolbarRef$value;
2820
+ var _vToolbarRef$value$co, _vToolbarRef$value, _vToolbarRef$value$ex, _vToolbarRef$value2;
2793
2821
 
2794
- return (_vToolbarRef$value = vToolbarRef.value) == null ? void 0 : _vToolbarRef$value.contentHeight;
2822
+ const height = (_vToolbarRef$value$co = (_vToolbarRef$value = vToolbarRef.value) == null ? void 0 : _vToolbarRef$value.contentHeight) != null ? _vToolbarRef$value$co : 0;
2823
+ const extensionHeight = (_vToolbarRef$value$ex = (_vToolbarRef$value2 = vToolbarRef.value) == null ? void 0 : _vToolbarRef$value2.extensionHeight) != null ? _vToolbarRef$value$ex : 0;
2824
+ return height + extensionHeight;
2795
2825
  });
2796
2826
  const {
2797
2827
  layoutItemStyles
@@ -2811,7 +2841,9 @@
2811
2841
  "class": ['v-app-bar', {
2812
2842
  'v-app-bar--bottom': props.position === 'bottom'
2813
2843
  }],
2814
- "style": layoutItemStyles.value
2844
+ "style": { ...layoutItemStyles.value,
2845
+ height: undefined
2846
+ }
2815
2847
  }, toolbarProps), slots);
2816
2848
  };
2817
2849
  }
@@ -2849,7 +2881,6 @@
2849
2881
  }
2850
2882
  const makeVariantProps = propsFactory({
2851
2883
  color: String,
2852
- textColor: String,
2853
2884
  variant: {
2854
2885
  type: String,
2855
2886
  default: 'contained',
@@ -2869,12 +2900,10 @@
2869
2900
  colorStyles
2870
2901
  } = useColor(vue.computed(() => {
2871
2902
  const {
2872
- textColor,
2873
2903
  variant,
2874
2904
  color
2875
2905
  } = vue.unref(props);
2876
2906
  return {
2877
- text: textColor,
2878
2907
  [['contained', 'contained-flat'].includes(variant) ? 'background' : 'text']: color
2879
2908
  };
2880
2909
  }));
@@ -2985,10 +3014,11 @@
2985
3014
  const isSelected = vue.computed(() => {
2986
3015
  return group.isSelected(id);
2987
3016
  });
2988
- const selectedClass = vue.computed(() => {
2989
- var _group$selectedClass$;
2990
-
2991
- return isSelected.value && ((_group$selectedClass$ = group.selectedClass.value) != null ? _group$selectedClass$ : props.selectedClass);
3017
+ const selectedClass = vue.computed(() => isSelected.value && [group.selectedClass.value, props.selectedClass]);
3018
+ vue.watch(isSelected, value => {
3019
+ vm.emit('group:selected', {
3020
+ value
3021
+ });
2992
3022
  });
2993
3023
  return {
2994
3024
  id,
@@ -3115,12 +3145,19 @@
3115
3145
  next: () => step(1),
3116
3146
  isSelected: id => selected.value.includes(id),
3117
3147
  selectedClass: vue.computed(() => props.selectedClass),
3118
- items: vue.computed(() => items)
3148
+ items: vue.computed(() => items),
3149
+ getItemIndex: value => getItemIndex(items, value)
3119
3150
  };
3120
3151
  vue.provide(injectKey, state);
3121
3152
  return state;
3122
3153
  }
3123
3154
 
3155
+ function getItemIndex(items, value) {
3156
+ const ids = getIds(items, [value]);
3157
+ if (!ids.length) return -1;
3158
+ return items.findIndex(item => item.id === ids[0]);
3159
+ }
3160
+
3124
3161
  function getIds(items, modelValue) {
3125
3162
  const ids = [];
3126
3163
 
@@ -3348,24 +3385,26 @@
3348
3385
  };
3349
3386
  };
3350
3387
 
3388
+ const makeVIconProps = propsFactory({
3389
+ color: String,
3390
+ start: Boolean,
3391
+ end: Boolean,
3392
+ icon: {
3393
+ type: [String, Object]
3394
+ },
3395
+ ...makeSizeProps(),
3396
+ ...makeTagProps({
3397
+ tag: 'i'
3398
+ }),
3399
+ ...makeThemeProps()
3400
+ }, 'v-icon');
3351
3401
  const VIcon = defineComponent({
3352
3402
  name: 'VIcon',
3353
- props: {
3354
- color: String,
3355
- left: Boolean,
3356
- right: Boolean,
3357
- icon: {
3358
- type: [String, Object]
3359
- },
3360
- ...makeSizeProps(),
3361
- ...makeTagProps({
3362
- tag: 'i'
3363
- }),
3364
- ...makeThemeProps()
3365
- },
3403
+ props: makeVIconProps(),
3366
3404
 
3367
3405
  setup(props, _ref) {
3368
3406
  let {
3407
+ attrs,
3369
3408
  slots
3370
3409
  } = _ref;
3371
3410
  let slotIcon;
@@ -3398,8 +3437,9 @@
3398
3437
  "tag": props.tag,
3399
3438
  "icon": iconData.value.icon,
3400
3439
  "class": ['v-icon', 'notranslate', sizeClasses.value, textColorClasses.value, themeClasses.value, {
3401
- 'v-icon--left': props.left,
3402
- 'v-icon--right': props.right
3440
+ 'v-icon--clickable': !!attrs.onClick,
3441
+ 'v-icon--start': props.start,
3442
+ 'v-icon--end': props.end
3403
3443
  }],
3404
3444
  "style": [!sizeClasses.value ? {
3405
3445
  fontSize: convertToUnit(props.size),
@@ -3489,21 +3529,33 @@
3489
3529
  replace: Boolean,
3490
3530
  to: [String, Object]
3491
3531
  }, 'router');
3532
+ let inTransition = false;
3492
3533
  function useBackButton(cb) {
3493
3534
  const router = useRouter();
3494
3535
  let popped = false;
3495
- let removeGuard;
3536
+ let removeBefore;
3537
+ let removeAfter;
3496
3538
  vue.onMounted(() => {
3497
3539
  window.addEventListener('popstate', onPopstate);
3498
- removeGuard = router == null ? void 0 : router.beforeEach((to, from, next) => {
3499
- setTimeout(() => popped ? cb(next) : next());
3540
+ removeBefore = router == null ? void 0 : router.beforeEach((to, from, next) => {
3541
+ if (!inTransition) {
3542
+ setTimeout(() => popped ? cb(next) : next());
3543
+ } else {
3544
+ popped ? cb(next) : next();
3545
+ }
3546
+
3547
+ inTransition = true;
3548
+ });
3549
+ removeAfter = router == null ? void 0 : router.afterEach(() => {
3550
+ inTransition = false;
3500
3551
  });
3501
3552
  });
3502
3553
  vue.onBeforeUnmount(() => {
3503
- var _removeGuard;
3554
+ var _removeBefore, _removeAfter;
3504
3555
 
3505
3556
  window.removeEventListener('popstate', onPopstate);
3506
- (_removeGuard = removeGuard) == null ? void 0 : _removeGuard();
3557
+ (_removeBefore = removeBefore) == null ? void 0 : _removeBefore();
3558
+ (_removeAfter = removeAfter) == null ? void 0 : _removeAfter();
3507
3559
  });
3508
3560
 
3509
3561
  function onPopstate(e) {
@@ -3515,9 +3567,27 @@
3515
3567
  }
3516
3568
  }
3517
3569
 
3570
+ // Utilities
3571
+
3572
+ function useSelectLink(link, select) {
3573
+ vue.watch(() => {
3574
+ var _link$isExactActive;
3575
+
3576
+ return (_link$isExactActive = link.isExactActive) == null ? void 0 : _link$isExactActive.value;
3577
+ }, isExactActive => {
3578
+ if (link.isLink.value && isExactActive && select) {
3579
+ vue.nextTick(() => {
3580
+ select(true);
3581
+ });
3582
+ }
3583
+ }, {
3584
+ immediate: true
3585
+ });
3586
+ }
3587
+
3518
3588
  // Styles
3519
3589
 
3520
- const rippleStop = Symbol('rippleStop');
3590
+ const stopSymbol = Symbol('rippleStop');
3521
3591
  const DELAY_RIPPLE = 80;
3522
3592
 
3523
3593
  function transform(el, value) {
@@ -3665,9 +3735,9 @@
3665
3735
  function rippleShow(e) {
3666
3736
  const value = {};
3667
3737
  const element = e.currentTarget;
3668
- if (!(element != null && element._ripple) || element._ripple.touched || e[rippleStop]) return; // Don't allow the event to trigger ripples on any other elements
3738
+ if (!(element != null && element._ripple) || element._ripple.touched || e[stopSymbol]) return; // Don't allow the event to trigger ripples on any other elements
3669
3739
 
3670
- e[rippleStop] = true;
3740
+ e[stopSymbol] = true;
3671
3741
 
3672
3742
  if (isTouchEvent(e)) {
3673
3743
  element._ripple.touched = true;
@@ -3708,6 +3778,10 @@
3708
3778
  }
3709
3779
  }
3710
3780
 
3781
+ function rippleStop(e) {
3782
+ e[stopSymbol] = true;
3783
+ }
3784
+
3711
3785
  function rippleHide(e) {
3712
3786
  const element = e.currentTarget;
3713
3787
  if (!element || !element._ripple) return;
@@ -3788,6 +3862,14 @@
3788
3862
  }
3789
3863
 
3790
3864
  if (enabled && !wasEnabled) {
3865
+ if (modifiers.stop) {
3866
+ el.addEventListener('touchstart', rippleStop, {
3867
+ passive: true
3868
+ });
3869
+ el.addEventListener('mousedown', rippleStop);
3870
+ return;
3871
+ }
3872
+
3791
3873
  el.addEventListener('touchstart', rippleShow, {
3792
3874
  passive: true
3793
3875
  });
@@ -3857,6 +3939,11 @@
3857
3939
  Ripple
3858
3940
  },
3859
3941
  props: {
3942
+ active: Boolean,
3943
+ symbol: {
3944
+ type: null,
3945
+ default: VBtnToggleSymbol
3946
+ },
3860
3947
  flat: Boolean,
3861
3948
  icon: [Boolean, String],
3862
3949
  prependIcon: String,
@@ -3920,21 +4007,22 @@
3920
4007
  const {
3921
4008
  sizeClasses
3922
4009
  } = useSize(props);
3923
- const group = useGroupItem(props, VBtnToggleSymbol, false);
4010
+ const group = useGroupItem(props, props.symbol, false);
3924
4011
  const link = useLink(props, attrs);
3925
4012
  const isDisabled = vue.computed(() => (group == null ? void 0 : group.disabled.value) || props.disabled);
3926
4013
  const isElevated = vue.computed(() => {
3927
4014
  return props.variant === 'contained' && !(props.disabled || props.flat || props.border);
3928
4015
  });
4016
+ useSelectLink(link, group == null ? void 0 : group.select);
3929
4017
  return () => {
3930
- var _link$isExactActive, _slots$default;
4018
+ var _slots$default;
3931
4019
 
3932
4020
  const Tag = link.isLink.value ? 'a' : props.tag;
3933
4021
  const hasColor = !group || group.isSelected.value;
3934
4022
  return vue.withDirectives(vue.createVNode(Tag, {
3935
4023
  "type": Tag === 'a' ? undefined : 'button',
3936
4024
  "class": ['v-btn', group == null ? void 0 : group.selectedClass.value, {
3937
- 'v-btn--active': (_link$isExactActive = link.isExactActive) == null ? void 0 : _link$isExactActive.value,
4025
+ 'v-btn--active': props.active,
3938
4026
  'v-btn--block': props.block,
3939
4027
  'v-btn--disabled': isDisabled.value,
3940
4028
  'v-btn--elevated': isElevated.value,
@@ -3945,12 +4033,18 @@
3945
4033
  "style": [hasColor ? colorStyles.value : undefined, dimensionStyles.value, positionStyles.value],
3946
4034
  "disabled": isDisabled.value || undefined,
3947
4035
  "href": link.href.value,
3948
- "onClick": isDisabled.value || link.navigate || (group == null ? void 0 : group.toggle)
4036
+ "onClick": e => {
4037
+ var _link$navigate;
4038
+
4039
+ if (isDisabled.value) return;
4040
+ (_link$navigate = link.navigate) == null ? void 0 : _link$navigate.call(link, e);
4041
+ group == null ? void 0 : group.toggle();
4042
+ }
3949
4043
  }, {
3950
4044
  default: () => [genOverlays(true, 'v-btn'), !props.icon && props.prependIcon && vue.createVNode(VIcon, {
3951
4045
  "class": "v-btn__icon",
3952
4046
  "icon": props.prependIcon,
3953
- "left": !props.stacked
4047
+ "start": true
3954
4048
  }, null), typeof props.icon === 'boolean' ? (_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots) : vue.createVNode(VIcon, {
3955
4049
  "class": "v-btn__icon",
3956
4050
  "icon": props.icon,
@@ -3958,7 +4052,7 @@
3958
4052
  }, null), !props.icon && props.appendIcon && vue.createVNode(VIcon, {
3959
4053
  "class": "v-btn__icon",
3960
4054
  "icon": props.appendIcon,
3961
- "right": !props.stacked
4055
+ "end": true
3962
4056
  }, null)]
3963
4057
  }), [[vue.resolveDirective("ripple"), !isDisabled.value && props.ripple, null]]);
3964
4058
  };
@@ -4008,7 +4102,6 @@
4008
4102
  provideDefaults({
4009
4103
  VBtn: {
4010
4104
  color: vue.toRef(props, 'color'),
4011
- textColor: vue.toRef(props, 'textColor'),
4012
4105
  variant: vue.toRef(props, 'variant')
4013
4106
  }
4014
4107
  });
@@ -4035,6 +4128,7 @@
4035
4128
 
4036
4129
  });
4037
4130
 
4131
+ // Utilities
4038
4132
  const VAlertTitle = createSimpleFunctional('v-alert-title');
4039
4133
 
4040
4134
  const allowedTypes = ['success', 'info', 'warning', 'error'];
@@ -4104,7 +4198,6 @@
4104
4198
 
4105
4199
  return {
4106
4200
  color: (_props$color = props.color) != null ? _props$color : props.type,
4107
- textColor: props.textColor,
4108
4201
  variant: props.variant
4109
4202
  };
4110
4203
  });
@@ -4144,9 +4237,10 @@
4144
4237
  return () => {
4145
4238
  var _slots$default;
4146
4239
 
4147
- const hasClose = !!(slots.close || props.closable);
4148
4240
  const hasPrepend = !!(slots.prepend || icon.value);
4149
4241
  const hasTitle = !!(slots.title || props.title);
4242
+ const hasText = !!(props.text || slots.text);
4243
+ const hasClose = !!(slots.close || props.closable);
4150
4244
  return isActive.value && vue.createVNode(props.tag, {
4151
4245
  "class": ['v-alert', props.border && {
4152
4246
  'v-alert--border': !!props.border,
@@ -4160,43 +4254,57 @@
4160
4254
  default: () => [genOverlays(false, 'v-alert'), props.border && vue.createVNode("div", {
4161
4255
  "class": ['v-alert__border', textColorClasses.value],
4162
4256
  "style": textColorStyles.value
4163
- }, null), hasPrepend && vue.createVNode("div", {
4164
- "class": "v-alert__prepend"
4165
- }, [slots.prepend ? slots.prepend() : vue.createVNode(VIcon, {
4166
- "icon": icon.value,
4167
- "size": props.prominent ? 'large' : 'default'
4168
- }, null)]), vue.createVNode("div", {
4257
+ }, null), hasPrepend && vue.createVNode(VDefaultsProvider, {
4258
+ "defaults": {
4259
+ VIcon: {
4260
+ density: props.density,
4261
+ icon: icon.value,
4262
+ size: props.prominent ? 44 : 'default'
4263
+ }
4264
+ }
4265
+ }, {
4266
+ default: () => [vue.createVNode("div", {
4267
+ "class": "v-alert__prepend"
4268
+ }, [slots.prepend ? slots.prepend() : icon.value && vue.createVNode(VIcon, null, null)])]
4269
+ }), vue.createVNode("div", {
4169
4270
  "class": "v-alert__content"
4170
4271
  }, [hasTitle && vue.createVNode(VAlertTitle, null, {
4171
4272
  default: () => [slots.title ? slots.title() : props.title]
4172
- }), slots.text ? slots.text() : props.text, (_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots)]), slots.append && vue.createVNode("div", {
4273
+ }), hasText && (slots.text ? slots.text() : props.text), (_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots)]), slots.append && vue.createVNode("div", {
4173
4274
  "class": "v-alert__append"
4174
- }, [slots.append()]), hasClose && vue.createVNode("div", {
4175
- "class": "v-alert__close",
4176
- "onClick": onCloseClick
4177
- }, [slots.close ? slots.close() : vue.createVNode(VIcon, {
4178
- "icon": props.closeIcon,
4179
- "size": "small"
4180
- }, null)])]
4275
+ }, [slots.append()]), hasClose && vue.createVNode(VDefaultsProvider, {
4276
+ "defaults": {
4277
+ VIcon: {
4278
+ icon: props.closeIcon,
4279
+ size: 'small'
4280
+ }
4281
+ }
4282
+ }, {
4283
+ default: () => [vue.createVNode("div", {
4284
+ "class": "v-alert__close",
4285
+ "onClick": onCloseClick
4286
+ }, [slots.close ? slots.close() : vue.createVNode(VIcon, null, null)])]
4287
+ })]
4181
4288
  });
4182
4289
  };
4183
4290
  }
4184
4291
 
4185
4292
  });
4186
4293
 
4294
+ const makeVAvatarProps = propsFactory({
4295
+ color: String,
4296
+ start: Boolean,
4297
+ end: Boolean,
4298
+ icon: String,
4299
+ image: String,
4300
+ ...makeDensityProps(),
4301
+ ...makeRoundedProps(),
4302
+ ...makeSizeProps(),
4303
+ ...makeTagProps()
4304
+ });
4187
4305
  const VAvatar = defineComponent({
4188
4306
  name: 'VAvatar',
4189
- props: {
4190
- color: String,
4191
- left: Boolean,
4192
- right: Boolean,
4193
- icon: String,
4194
- image: String,
4195
- ...makeDensityProps(),
4196
- ...makeRoundedProps(),
4197
- ...makeSizeProps(),
4198
- ...makeTagProps()
4199
- },
4307
+ props: makeVAvatarProps(),
4200
4308
 
4201
4309
  setup(props, _ref) {
4202
4310
  let {
@@ -4221,8 +4329,8 @@
4221
4329
 
4222
4330
  return vue.createVNode(props.tag, {
4223
4331
  "class": ['v-avatar', {
4224
- 'v-avatar--left': props.left,
4225
- 'v-avatar--right': props.right
4332
+ 'v-avatar--start': props.start,
4333
+ 'v-avatar--end': props.end
4226
4334
  }, backgroundColorClasses.value, densityClasses.value, roundedClasses.value, sizeClasses.value],
4227
4335
  "style": [backgroundColorStyles.value, sizeStyles.value]
4228
4336
  }, {
@@ -4851,139 +4959,109 @@
4851
4959
  return vue.inject(ListKey, null);
4852
4960
  }
4853
4961
 
4854
- const singleOpenStrategy = _ref => {
4855
- let {
4856
- id,
4857
- value,
4858
- opened,
4859
- parents
4860
- } = _ref;
4861
-
4862
- if (value) {
4863
- const newOpened = new Set();
4864
- newOpened.add(id);
4865
- let parent = parents.get(id);
4866
-
4867
- while (parent != null) {
4868
- newOpened.add(parent);
4869
- parent = parents.get(parent);
4870
- }
4962
+ const singleOpenStrategy = {
4963
+ open: _ref => {
4964
+ let {
4965
+ id,
4966
+ value,
4967
+ opened,
4968
+ parents
4969
+ } = _ref;
4871
4970
 
4872
- return newOpened;
4873
- } else {
4874
- opened.delete(id);
4875
- return opened;
4876
- }
4877
- };
4878
- const multipleOpenStrategy = _ref2 => {
4879
- let {
4880
- id,
4881
- value,
4882
- opened,
4883
- parents
4884
- } = _ref2;
4971
+ if (value) {
4972
+ const newOpened = new Set();
4973
+ newOpened.add(id);
4974
+ let parent = parents.get(id);
4885
4975
 
4886
- if (value) {
4887
- let parent = parents.get(id);
4888
- opened.add(id);
4976
+ while (parent != null) {
4977
+ newOpened.add(parent);
4978
+ parent = parents.get(parent);
4979
+ }
4889
4980
 
4890
- while (parent != null && parent !== id) {
4891
- opened.add(parent);
4892
- parent = parents.get(parent);
4981
+ return newOpened;
4982
+ } else {
4983
+ opened.delete(id);
4984
+ return opened;
4893
4985
  }
4894
-
4895
- return opened;
4896
- } else {
4897
- opened.delete(id);
4898
- }
4899
-
4900
- return opened;
4986
+ },
4987
+ select: () => null
4901
4988
  };
4902
-
4903
- const independentSelectStrategy = {
4904
- select: _ref => {
4989
+ const multipleOpenStrategy = {
4990
+ open: _ref2 => {
4905
4991
  let {
4906
4992
  id,
4907
4993
  value,
4908
- mandatory,
4909
- selected
4910
- } = _ref;
4911
- selected.set(id, value ? 'on' : mandatory && !Array.from(selected.entries()).find(_ref2 => {
4912
- let [key, value] = _ref2;
4913
- return value === 'on' && key !== id;
4914
- }) ? 'on' : 'off');
4915
- return selected;
4916
- },
4917
- in: (v, children, parents) => {
4918
- let map = new Map();
4994
+ opened,
4995
+ parents
4996
+ } = _ref2;
4919
4997
 
4920
- for (const id of v || []) {
4921
- map = independentSelectStrategy.select({
4922
- id,
4923
- value: true,
4924
- selected: new Map(map),
4925
- children,
4926
- parents
4927
- });
4928
- }
4998
+ if (value) {
4999
+ let parent = parents.get(id);
5000
+ opened.add(id);
4929
5001
 
4930
- return map;
4931
- },
4932
- out: v => {
4933
- const arr = [];
5002
+ while (parent != null && parent !== id) {
5003
+ opened.add(parent);
5004
+ parent = parents.get(parent);
5005
+ }
4934
5006
 
4935
- for (const [key, value] of v.entries()) {
4936
- if (value === 'on') arr.push(key);
5007
+ return opened;
5008
+ } else {
5009
+ opened.delete(id);
4937
5010
  }
4938
5011
 
4939
- return arr;
4940
- }
5012
+ return opened;
5013
+ },
5014
+ select: () => null
4941
5015
  };
4942
- const independentSingleSelectStrategy = {
5016
+ const listOpenStrategy = {
5017
+ open: multipleOpenStrategy.open,
4943
5018
  select: _ref3 => {
4944
5019
  let {
4945
5020
  id,
4946
5021
  value,
4947
- ...rest
5022
+ opened,
5023
+ parents
4948
5024
  } = _ref3;
4949
- return independentSelectStrategy.select({ ...rest,
4950
- id,
4951
- value,
4952
- selected: new Map()
4953
- });
4954
- },
4955
- in: (v, children, parents) => {
4956
- let map = new Map();
5025
+ if (!value) return opened;
5026
+ const path = [];
5027
+ let parent = parents.get(id);
4957
5028
 
4958
- if (v != null && v.length) {
4959
- map = independentSelectStrategy.in(v.slice(0, 1), children, parents);
5029
+ while (parent != null) {
5030
+ path.push(parent);
5031
+ parent = parents.get(parent);
4960
5032
  }
4961
5033
 
4962
- return map;
4963
- },
4964
- out: (v, children, parents) => {
4965
- return independentSelectStrategy.out(v, children, parents);
5034
+ return new Set(path);
4966
5035
  }
4967
5036
  };
4968
- const leafSelectStrategy = function () {
4969
- let single = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
5037
+
5038
+ /* eslint-disable sonarjs/no-identical-functions */
5039
+ const independentSelectStrategy = mandatory => {
4970
5040
  const strategy = {
4971
- select: _ref4 => {
5041
+ select: _ref => {
4972
5042
  let {
4973
5043
  id,
4974
5044
  value,
4975
- selected,
4976
- children
4977
- } = _ref4;
4978
- if (children.has(id)) return selected;
4979
- if (single) return new Map([[id, value ? 'on' : 'off']]);
5045
+ selected
5046
+ } = _ref;
5047
+
5048
+ // When mandatory and we're trying to deselect when id
5049
+ // is the only currently selected item then do nothing
5050
+ if (mandatory && !value) {
5051
+ const on = Array.from(selected.entries()).reduce((arr, _ref2) => {
5052
+ let [key, value] = _ref2;
5053
+ return value === 'on' ? [...arr, key] : arr;
5054
+ }, []);
5055
+ if (on.length === 1 && on[0] === id) return selected;
5056
+ }
5057
+
4980
5058
  selected.set(id, value ? 'on' : 'off');
4981
5059
  return selected;
4982
5060
  },
4983
5061
  in: (v, children, parents) => {
4984
5062
  let map = new Map();
4985
5063
 
4986
- for (const id of v != null ? v : []) {
5064
+ for (const id of v || []) {
4987
5065
  map = strategy.select({
4988
5066
  id,
4989
5067
  value: true,
@@ -4995,66 +5073,164 @@
4995
5073
 
4996
5074
  return map;
4997
5075
  },
4998
- out: independentSelectStrategy.out
5076
+ out: v => {
5077
+ const arr = [];
5078
+
5079
+ for (const [key, value] of v.entries()) {
5080
+ if (value === 'on') arr.push(key);
5081
+ }
5082
+
5083
+ return arr;
5084
+ }
4999
5085
  };
5000
5086
  return strategy;
5001
5087
  };
5002
- const classicSelectStrategy = {
5003
- select: _ref5 => {
5004
- let {
5005
- id,
5006
- value,
5007
- selected,
5008
- children,
5009
- parents
5010
- } = _ref5;
5011
- const items = [id];
5012
-
5013
- while (items.length) {
5014
- const item = items.shift();
5015
- selected.set(item, value ? 'on' : 'off');
5088
+ const independentSingleSelectStrategy = mandatory => {
5089
+ const parentStrategy = independentSelectStrategy(mandatory);
5090
+ const strategy = {
5091
+ select: _ref3 => {
5092
+ let {
5093
+ selected,
5094
+ id,
5095
+ ...rest
5096
+ } = _ref3;
5097
+ const singleSelected = selected.has(id) ? new Map([[id, selected.get(id)]]) : new Map();
5098
+ return parentStrategy.select({ ...rest,
5099
+ id,
5100
+ selected: singleSelected
5101
+ });
5102
+ },
5103
+ in: (v, children, parents) => {
5104
+ let map = new Map();
5016
5105
 
5017
- if (children.has(item)) {
5018
- items.push(...children.get(item));
5106
+ if (v != null && v.length) {
5107
+ map = parentStrategy.in(v.slice(0, 1), children, parents);
5019
5108
  }
5020
- }
5021
-
5022
- let parent = parents.get(id);
5023
5109
 
5024
- while (parent) {
5025
- const childrenIds = children.get(parent);
5026
- const everySelected = childrenIds.every(cid => selected.get(cid) === 'on');
5027
- const noneSelected = childrenIds.every(cid => !selected.has(cid) || selected.get(cid) === 'off');
5028
- selected.set(parent, everySelected ? 'on' : noneSelected ? 'off' : 'indeterminate');
5029
- parent = parents.get(parent);
5110
+ return map;
5111
+ },
5112
+ out: (v, children, parents) => {
5113
+ return parentStrategy.out(v, children, parents);
5030
5114
  }
5031
-
5032
- return selected;
5033
- },
5034
- in: (v, children, parents) => {
5035
- let map = new Map();
5036
-
5037
- for (const id of v || []) {
5038
- map = classicSelectStrategy.select({
5115
+ };
5116
+ return strategy;
5117
+ };
5118
+ const leafSelectStrategy = mandatory => {
5119
+ const parentStrategy = independentSelectStrategy(mandatory);
5120
+ const strategy = {
5121
+ select: _ref4 => {
5122
+ let {
5039
5123
  id,
5040
- value: true,
5041
- selected: new Map(map),
5124
+ selected,
5042
5125
  children,
5043
- parents
5126
+ ...rest
5127
+ } = _ref4;
5128
+ if (children.has(id)) return selected;
5129
+ return parentStrategy.select({
5130
+ id,
5131
+ selected,
5132
+ children,
5133
+ ...rest
5044
5134
  });
5045
- }
5135
+ },
5136
+ in: parentStrategy.in,
5137
+ out: parentStrategy.out
5138
+ };
5139
+ return strategy;
5140
+ };
5141
+ const leafSingleSelectStrategy = mandatory => {
5142
+ const parentStrategy = independentSingleSelectStrategy(mandatory);
5143
+ const strategy = {
5144
+ select: _ref5 => {
5145
+ let {
5146
+ id,
5147
+ selected,
5148
+ children,
5149
+ ...rest
5150
+ } = _ref5;
5151
+ if (children.has(id)) return selected;
5152
+ return parentStrategy.select({
5153
+ id,
5154
+ selected,
5155
+ children,
5156
+ ...rest
5157
+ });
5158
+ },
5159
+ in: parentStrategy.in,
5160
+ out: parentStrategy.out
5161
+ };
5162
+ return strategy;
5163
+ };
5164
+ const classicSelectStrategy = mandatory => {
5165
+ const strategy = {
5166
+ select: _ref6 => {
5167
+ let {
5168
+ id,
5169
+ value,
5170
+ selected,
5171
+ children,
5172
+ parents
5173
+ } = _ref6;
5174
+ const original = new Map(selected);
5175
+ const items = [id];
5046
5176
 
5047
- return map;
5048
- },
5049
- out: (v, children) => {
5050
- const arr = [];
5177
+ while (items.length) {
5178
+ const item = items.shift();
5179
+ selected.set(item, value ? 'on' : 'off');
5051
5180
 
5052
- for (const [key, value] of v.entries()) {
5053
- if (value === 'on' && !children.has(key)) arr.push(key);
5054
- }
5181
+ if (children.has(item)) {
5182
+ items.push(...children.get(item));
5183
+ }
5184
+ }
5055
5185
 
5056
- return arr;
5057
- }
5186
+ let parent = parents.get(id);
5187
+
5188
+ while (parent) {
5189
+ const childrenIds = children.get(parent);
5190
+ const everySelected = childrenIds.every(cid => selected.get(cid) === 'on');
5191
+ const noneSelected = childrenIds.every(cid => !selected.has(cid) || selected.get(cid) === 'off');
5192
+ selected.set(parent, everySelected ? 'on' : noneSelected ? 'off' : 'indeterminate');
5193
+ parent = parents.get(parent);
5194
+ } // If mandatory and planned deselect results in no selected
5195
+ // items then we can't do it, so return original state
5196
+
5197
+
5198
+ if (mandatory && !value) {
5199
+ const on = Array.from(selected.entries()).reduce((arr, _ref7) => {
5200
+ let [key, value] = _ref7;
5201
+ return value === 'on' ? [...arr, key] : arr;
5202
+ }, []);
5203
+ if (on.length === 0) return original;
5204
+ }
5205
+
5206
+ return selected;
5207
+ },
5208
+ in: (v, children, parents) => {
5209
+ let map = new Map();
5210
+
5211
+ for (const id of v || []) {
5212
+ map = strategy.select({
5213
+ id,
5214
+ value: true,
5215
+ selected: new Map(map),
5216
+ children,
5217
+ parents
5218
+ });
5219
+ }
5220
+
5221
+ return map;
5222
+ },
5223
+ out: (v, children) => {
5224
+ const arr = [];
5225
+
5226
+ for (const [key, value] of v.entries()) {
5227
+ if (value === 'on' && !children.has(key)) arr.push(key);
5228
+ }
5229
+
5230
+ return arr;
5231
+ }
5232
+ };
5233
+ return strategy;
5058
5234
  };
5059
5235
 
5060
5236
  const VNestedSymbol = Symbol.for('vuetify:nested');
@@ -5089,26 +5265,29 @@
5089
5265
 
5090
5266
  switch (props.selectStrategy) {
5091
5267
  case 'single-leaf':
5092
- return leafSelectStrategy(true);
5268
+ return leafSingleSelectStrategy(props.mandatory);
5093
5269
 
5094
5270
  case 'leaf':
5095
- return leafSelectStrategy();
5271
+ return leafSelectStrategy(props.mandatory);
5096
5272
 
5097
5273
  case 'independent':
5098
- return independentSelectStrategy;
5274
+ return independentSelectStrategy(props.mandatory);
5099
5275
 
5100
5276
  case 'single-independent':
5101
- return independentSingleSelectStrategy;
5277
+ return independentSingleSelectStrategy(props.mandatory);
5102
5278
 
5103
5279
  case 'classic':
5104
5280
  default:
5105
- return classicSelectStrategy;
5281
+ return classicSelectStrategy(props.mandatory);
5106
5282
  }
5107
5283
  });
5108
5284
  const openStrategy = vue.computed(() => {
5109
5285
  if (typeof props.openStrategy === 'function') return props.openStrategy;
5110
5286
 
5111
5287
  switch (props.openStrategy) {
5288
+ case 'list':
5289
+ return listOpenStrategy;
5290
+
5112
5291
  case 'single':
5113
5292
  return singleOpenStrategy;
5114
5293
 
@@ -5179,7 +5358,7 @@
5179
5358
  path: getPath(id),
5180
5359
  event
5181
5360
  });
5182
- const newOpened = openStrategy.value({
5361
+ const newOpened = openStrategy.value.open({
5183
5362
  id,
5184
5363
  value,
5185
5364
  opened: new Set(opened.value),
@@ -5202,10 +5381,19 @@
5202
5381
  selected: new Map(selected.value),
5203
5382
  children: children.value,
5204
5383
  parents: parents.value,
5205
- event,
5206
- mandatory: props.mandatory
5384
+ event
5207
5385
  });
5208
5386
  newSelected && (selected.value = newSelected);
5387
+ const newOpened = openStrategy.value.select({
5388
+ id,
5389
+ value,
5390
+ selected: new Map(selected.value),
5391
+ opened: new Set(opened.value),
5392
+ children: children.value,
5393
+ parents: parents.value,
5394
+ event
5395
+ });
5396
+ newOpened && (opened.value = newOpened);
5209
5397
  },
5210
5398
  children,
5211
5399
  parents
@@ -5229,11 +5417,12 @@
5229
5417
  select: (selected, e) => parent.root.select(computedId.value, selected, e),
5230
5418
  isSelected: vue.computed(() => parent.root.selected.value.get(computedId.value) === 'on'),
5231
5419
  isIndeterminate: vue.computed(() => parent.root.selected.value.get(computedId.value) === 'indeterminate'),
5232
- isLeaf: vue.computed(() => !parent.root.children.value.get(computedId.value))
5420
+ isLeaf: vue.computed(() => !parent.root.children.value.get(computedId.value)),
5421
+ isGroupActivator: parent.isGroupActivator
5233
5422
  };
5234
- !parent.skipRegister && parent.root.register(computedId.value, parent.id.value, isGroup);
5423
+ !parent.isGroupActivator && parent.root.register(computedId.value, parent.id.value, isGroup);
5235
5424
  vue.onBeforeUnmount(() => {
5236
- !parent.skipRegister && parent.root.unregister(computedId.value);
5425
+ !parent.isGroupActivator && parent.root.unregister(computedId.value);
5237
5426
  });
5238
5427
  isGroup && vue.provide(VNestedSymbol, item);
5239
5428
  return item;
@@ -5241,11 +5430,11 @@
5241
5430
  const useNestedGroupActivator = () => {
5242
5431
  const parent = vue.inject(VNestedSymbol, emptyNested);
5243
5432
  vue.provide(VNestedSymbol, { ...parent,
5244
- skipRegister: true
5433
+ isGroupActivator: true
5245
5434
  });
5246
5435
  };
5247
5436
 
5248
- const VListGroupActivator = vue.defineComponent({
5437
+ const VListGroupActivator = defineComponent({
5249
5438
  name: 'VListGroupActivator',
5250
5439
 
5251
5440
  setup(_, _ref) {
@@ -5264,6 +5453,8 @@
5264
5453
  const VListGroup = genericComponent()({
5265
5454
  name: 'VListGroup',
5266
5455
  props: {
5456
+ activeColor: String,
5457
+ color: String,
5267
5458
  collapseIcon: {
5268
5459
  type: String,
5269
5460
  default: '$collapse'
@@ -5290,11 +5481,17 @@
5290
5481
  open(!isOpen.value, e);
5291
5482
  };
5292
5483
 
5293
- const activatorProps = vue.computed(() => ({
5294
- onClick,
5295
- appendIcon: isOpen.value ? props.collapseIcon : props.expandIcon,
5296
- class: 'v-list-group__header'
5297
- }));
5484
+ const activatorProps = vue.computed(() => {
5485
+ var _props$activeColor;
5486
+
5487
+ return {
5488
+ onClick,
5489
+ active: isOpen.value,
5490
+ appendIcon: isOpen.value ? props.collapseIcon : props.expandIcon,
5491
+ class: 'v-list-group__header',
5492
+ color: isOpen.value ? (_props$activeColor = props.activeColor) != null ? _props$activeColor : props.color : undefined
5493
+ };
5494
+ });
5298
5495
  return () => {
5299
5496
  var _slots$default2;
5300
5497
 
@@ -5303,9 +5500,18 @@
5303
5500
  'v-list-group--prepend': list == null ? void 0 : list.hasPrepend.value
5304
5501
  }]
5305
5502
  }, {
5306
- default: () => [slots.activator && vue.createVNode(VListGroupActivator, null, {
5307
- default: () => [slots.activator({
5308
- props: activatorProps.value
5503
+ default: () => [slots.activator && vue.createVNode(VDefaultsProvider, {
5504
+ "defaults": {
5505
+ VListItemIcon: {
5506
+ color: activatorProps.value.color
5507
+ }
5508
+ }
5509
+ }, {
5510
+ default: () => [vue.createVNode(VListGroupActivator, null, {
5511
+ default: () => [slots.activator({
5512
+ props: activatorProps.value,
5513
+ isOpen
5514
+ })]
5309
5515
  })]
5310
5516
  }), vue.createVNode(VExpandTransition, null, {
5311
5517
  default: () => [vue.withDirectives(vue.createVNode("div", {
@@ -5320,30 +5526,42 @@
5320
5526
 
5321
5527
  const VListItemAvatar = defineComponent({
5322
5528
  name: 'VListItemAvatar',
5323
- props: {
5324
- left: Boolean,
5325
- right: Boolean,
5326
- ...makeTagProps()
5327
- },
5529
+ props: makeVAvatarProps(),
5328
5530
 
5329
5531
  setup(props, _ref) {
5330
5532
  let {
5331
5533
  slots
5332
5534
  } = _ref;
5333
- return () => {
5334
- return vue.createVNode(props.tag, {
5335
- "class": ['v-list-item-avatar', {
5336
- 'v-list-item-avatar--start': props.left,
5337
- 'v-list-item-avatar--end': props.right
5338
- }]
5339
- }, slots);
5340
- };
5535
+ return () => vue.createVNode(VAvatar, vue.mergeProps({
5536
+ "class": ['v-list-item-avatar', {
5537
+ 'v-list-item-avatar--start': props.start,
5538
+ 'v-list-item-avatar--end': props.end
5539
+ }]
5540
+ }, props), slots);
5341
5541
  }
5342
5542
 
5343
5543
  });
5344
5544
 
5345
5545
  const VListItemHeader = createSimpleFunctional('v-list-item-header');
5346
5546
 
5547
+ const VListItemIcon = defineComponent({
5548
+ name: 'VListItemIcon',
5549
+ props: makeVIconProps(),
5550
+
5551
+ setup(props, _ref) {
5552
+ let {
5553
+ slots
5554
+ } = _ref;
5555
+ return () => vue.createVNode(VIcon, vue.mergeProps({
5556
+ "class": ['v-list-item-icon', {
5557
+ 'v-list-item-icon--start': props.start,
5558
+ 'v-list-item-icon--end': props.end
5559
+ }]
5560
+ }, props), slots);
5561
+ }
5562
+
5563
+ });
5564
+
5347
5565
  const VListItemSubtitle = createSimpleFunctional('v-list-item-subtitle');
5348
5566
 
5349
5567
  const VListItemTitle = createSimpleFunctional('v-list-item-title');
@@ -5360,12 +5578,14 @@
5360
5578
  appendAvatar: String,
5361
5579
  appendIcon: String,
5362
5580
  disabled: Boolean,
5363
- link: Boolean,
5581
+ lines: String,
5582
+ nav: Boolean,
5364
5583
  prependAvatar: String,
5365
5584
  prependIcon: String,
5366
5585
  subtitle: String,
5367
5586
  title: String,
5368
5587
  value: null,
5588
+ link: Boolean,
5369
5589
  ...makeBorderProps(),
5370
5590
  ...makeDensityProps(),
5371
5591
  ...makeDimensionProps(),
@@ -5393,6 +5613,8 @@
5393
5613
  const {
5394
5614
  select,
5395
5615
  isSelected,
5616
+ isIndeterminate,
5617
+ isGroupActivator,
5396
5618
  root,
5397
5619
  parent
5398
5620
  } = useNestedItem(id, false);
@@ -5402,13 +5624,12 @@
5402
5624
 
5403
5625
  return props.active || ((_link$isExactActive = link.isExactActive) == null ? void 0 : _link$isExactActive.value) || isSelected.value;
5404
5626
  });
5627
+ const roundedProps = vue.computed(() => props.rounded || props.nav);
5405
5628
  const variantProps = vue.computed(() => {
5406
5629
  var _props$activeColor;
5407
5630
 
5408
- const activeColor = (_props$activeColor = props.activeColor) != null ? _props$activeColor : props.color;
5409
5631
  return {
5410
- color: isActive.value ? activeColor : props.color,
5411
- textColor: props.textColor,
5632
+ color: isActive.value ? (_props$activeColor = props.activeColor) != null ? _props$activeColor : props.color : props.color,
5412
5633
  variant: props.variant
5413
5634
  };
5414
5635
  });
@@ -5450,50 +5671,53 @@
5450
5671
  } = useElevation(props);
5451
5672
  const {
5452
5673
  roundedClasses
5453
- } = useRounded(props);
5674
+ } = useRounded(roundedProps);
5675
+ const lineClasses = vue.computed(() => props.lines ? `v-list-item--${props.lines}-line` : undefined);
5454
5676
  const slotProps = vue.computed(() => ({
5455
5677
  isActive: isActive.value,
5456
5678
  select,
5457
- isSelected: isSelected.value
5679
+ isSelected: isSelected.value,
5680
+ isIndeterminate: isIndeterminate.value
5458
5681
  }));
5459
5682
  useRender(() => {
5460
- var _slots$default;
5683
+ var _slots$prepend, _slots$default, _slots$append;
5461
5684
 
5462
5685
  const Tag = link.isLink.value ? 'a' : props.tag;
5686
+ const hasColor = !list || isSelected.value || isActive.value;
5463
5687
  const hasTitle = slots.title || props.title;
5464
5688
  const hasSubtitle = slots.subtitle || props.subtitle;
5465
5689
  const hasHeader = !!(hasTitle || hasSubtitle);
5466
5690
  const hasAppend = !!(slots.append || props.appendAvatar || props.appendIcon);
5467
5691
  const hasPrepend = !!(slots.prepend || props.prependAvatar || props.prependIcon);
5468
- const isClickable = !props.disabled && (link.isClickable.value || props.link || props.value != null);
5692
+ const isClickable = !props.disabled && (props.link || link.isClickable.value || props.value != null && !!list);
5469
5693
  list == null ? void 0 : list.updateHasPrepend(hasPrepend);
5470
5694
  return vue.withDirectives(vue.createVNode(Tag, {
5471
5695
  "class": ['v-list-item', {
5472
5696
  'v-list-item--active': isActive.value,
5473
5697
  'v-list-item--disabled': props.disabled,
5474
5698
  'v-list-item--link': isClickable,
5699
+ 'v-list-item--nav': props.nav,
5475
5700
  'v-list-item--prepend': !hasPrepend && (list == null ? void 0 : list.hasPrepend.value),
5476
- [`${props.activeClass}`]: isActive.value && props.activeClass
5477
- }, themeClasses.value, borderClasses.value, colorClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, variantClasses.value],
5478
- "style": [colorStyles.value, dimensionStyles.value],
5701
+ [`${props.activeClass}`]: isActive.value
5702
+ }, themeClasses.value, borderClasses.value, hasColor ? colorClasses.value : undefined, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, variantClasses.value],
5703
+ "style": [hasColor ? colorStyles.value : undefined, dimensionStyles.value],
5479
5704
  "href": link.href.value,
5480
5705
  "tabindex": isClickable ? 0 : undefined,
5481
5706
  "onClick": isClickable && (e => {
5482
5707
  var _link$navigate;
5483
5708
 
5709
+ if (isGroupActivator) return;
5484
5710
  (_link$navigate = link.navigate) == null ? void 0 : _link$navigate.call(link, e);
5485
- select(!isSelected.value, e);
5711
+ props.value != null && select(!isSelected.value, e);
5486
5712
  })
5487
5713
  }, {
5488
- default: () => [genOverlays(isClickable || isActive.value, 'v-list-item'), hasPrepend && (slots.prepend ? slots.prepend(slotProps.value) : vue.createVNode(VListItemAvatar, {
5489
- "left": true
5490
- }, {
5491
- default: () => [vue.createVNode(VAvatar, {
5492
- "density": props.density,
5493
- "icon": props.prependIcon,
5494
- "image": props.prependAvatar
5495
- }, null)]
5496
- })), hasHeader && vue.createVNode(VListItemHeader, null, {
5714
+ default: () => [genOverlays(isClickable || isActive.value, 'v-list-item'), hasPrepend && vue.createVNode(vue.Fragment, null, [props.prependAvatar && vue.createVNode(VListItemAvatar, {
5715
+ "image": props.prependAvatar,
5716
+ "start": true
5717
+ }, null), props.prependIcon && vue.createVNode(VListItemIcon, {
5718
+ "icon": props.prependIcon,
5719
+ "start": true
5720
+ }, null), (_slots$prepend = slots.prepend) == null ? void 0 : _slots$prepend.call(slots, slotProps.value)]), hasHeader && vue.createVNode(VListItemHeader, null, {
5497
5721
  default: () => [hasTitle && vue.createVNode(VListItemTitle, null, {
5498
5722
  default: () => [slots.title ? slots.title({
5499
5723
  title: props.title
@@ -5503,15 +5727,13 @@
5503
5727
  subtitle: props.subtitle
5504
5728
  }) : props.subtitle]
5505
5729
  })]
5506
- }), (_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots, slotProps.value), hasAppend && (slots.append ? slots.append(slotProps.value) : vue.createVNode(VListItemAvatar, {
5507
- "right": true
5508
- }, {
5509
- default: () => [vue.createVNode(VAvatar, {
5510
- "density": props.density,
5511
- "icon": props.appendIcon,
5512
- "image": props.appendAvatar
5513
- }, null)]
5514
- }))]
5730
+ }), (_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots, slotProps.value), hasAppend && vue.createVNode(vue.Fragment, null, [(_slots$append = slots.append) == null ? void 0 : _slots$append.call(slots, slotProps.value), props.appendAvatar && vue.createVNode(VListItemAvatar, {
5731
+ "image": props.appendAvatar,
5732
+ "end": true
5733
+ }, null), props.appendIcon && vue.createVNode(VListItemIcon, {
5734
+ "icon": props.appendIcon,
5735
+ "end": true
5736
+ }, null)])]
5515
5737
  }), [[vue.resolveDirective("ripple"), isClickable]]);
5516
5738
  });
5517
5739
  }
@@ -5589,7 +5811,7 @@
5589
5811
  } = _ref3;
5590
5812
  return slots.header ? slots.header({ ...itemProps,
5591
5813
  ...activatorProps
5592
- }) : vue.createVNode(VListItem, vue.mergeProps(itemProps, activatorProps), null);
5814
+ }) : vue.createVNode(VListItem, vue.mergeProps(itemProps, activatorProps), slots);
5593
5815
  },
5594
5816
  default: () => vue.createVNode(VListChildren, {
5595
5817
  "items": children
@@ -5633,17 +5855,19 @@
5633
5855
  const VList = genericComponent()({
5634
5856
  name: 'VList',
5635
5857
  props: {
5636
- color: String,
5858
+ activeColor: String,
5859
+ activeClass: String,
5860
+ bgColor: String,
5637
5861
  disabled: Boolean,
5638
5862
  lines: {
5639
- type: String,
5863
+ type: [Boolean, String],
5640
5864
  default: 'one'
5641
5865
  },
5642
5866
  nav: Boolean,
5643
5867
  items: Array,
5644
5868
  ...makeNestedProps({
5645
5869
  selectStrategy: 'single-leaf',
5646
- openStrategy: 'multiple'
5870
+ openStrategy: 'list'
5647
5871
  }),
5648
5872
  ...makeBorderProps(),
5649
5873
  ...makeDensityProps(),
@@ -5651,7 +5875,10 @@
5651
5875
  ...makeElevationProps(),
5652
5876
  ...makeRoundedProps(),
5653
5877
  ...makeTagProps(),
5654
- ...makeThemeProps()
5878
+ ...makeThemeProps(),
5879
+ ...makeVariantProps({
5880
+ variant: 'text'
5881
+ })
5655
5882
  },
5656
5883
  emits: {
5657
5884
  'update:selected': val => true,
@@ -5671,7 +5898,7 @@
5671
5898
  const {
5672
5899
  backgroundColorClasses,
5673
5900
  backgroundColorStyles
5674
- } = useBackgroundColor(vue.toRef(props, 'color'));
5901
+ } = useBackgroundColor(vue.toRef(props, 'bgColor'));
5675
5902
  const {
5676
5903
  borderClasses
5677
5904
  } = useBorder(props);
@@ -5691,25 +5918,37 @@
5691
5918
  open,
5692
5919
  select
5693
5920
  } = useNested(props);
5921
+ const lineClasses = vue.computed(() => props.lines ? `v-list--${props.lines}-line` : undefined);
5922
+ const activeColor = vue.toRef(props, 'activeColor');
5923
+ const color = vue.toRef(props, 'color');
5694
5924
  createList();
5925
+ provideDefaults({
5926
+ VListGroup: {
5927
+ activeColor,
5928
+ color
5929
+ },
5930
+ VListItem: {
5931
+ activeClass: vue.toRef(props, 'activeClass'),
5932
+ activeColor,
5933
+ color,
5934
+ density: vue.toRef(props, 'density'),
5935
+ disabled: vue.toRef(props, 'disabled'),
5936
+ lines: vue.toRef(props, 'lines'),
5937
+ nav: vue.toRef(props, 'nav'),
5938
+ variant: vue.toRef(props, 'variant')
5939
+ }
5940
+ });
5695
5941
  useRender(() => {
5696
5942
  return vue.createVNode(props.tag, {
5697
5943
  "class": ['v-list', {
5698
5944
  'v-list--disabled': props.disabled,
5699
- 'v-list--nav': props.nav,
5700
- [`v-list--${props.lines}-line`]: true
5701
- }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value],
5945
+ 'v-list--nav': props.nav
5946
+ }, themeClasses.value, backgroundColorClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value],
5702
5947
  "style": [backgroundColorStyles.value, dimensionStyles.value]
5703
5948
  }, {
5704
5949
  default: () => [vue.createVNode(VListChildren, {
5705
5950
  "items": items.value
5706
- }, {
5707
- default: slots.default,
5708
- item: slots.item,
5709
- title: slots.title,
5710
- subtitle: slots.subtitle,
5711
- header: slots.header
5712
- })]
5951
+ }, slots)]
5713
5952
  });
5714
5953
  });
5715
5954
  return {
@@ -5722,11 +5961,35 @@
5722
5961
 
5723
5962
  const VListImg = createSimpleFunctional('v-list-img');
5724
5963
 
5964
+ const VListItemAction = defineComponent({
5965
+ name: 'VListItemAction',
5966
+ props: {
5967
+ start: Boolean,
5968
+ end: Boolean,
5969
+ ...makeTagProps()
5970
+ },
5971
+
5972
+ setup(props, _ref) {
5973
+ let {
5974
+ slots
5975
+ } = _ref;
5976
+ return () => {
5977
+ return vue.createVNode(props.tag, {
5978
+ "class": ['v-list-item-action', {
5979
+ 'v-list-item-action--start': props.start,
5980
+ 'v-list-item-action--end': props.end
5981
+ }]
5982
+ }, slots);
5983
+ };
5984
+ }
5985
+
5986
+ });
5987
+
5725
5988
  const VListItemMedia = defineComponent({
5726
5989
  name: 'VListItemMedia',
5727
5990
  props: {
5728
- left: Boolean,
5729
- right: Boolean,
5991
+ start: Boolean,
5992
+ end: Boolean,
5730
5993
  ...makeTagProps()
5731
5994
  },
5732
5995
 
@@ -5737,8 +6000,8 @@
5737
6000
  return () => {
5738
6001
  return vue.createVNode(props.tag, {
5739
6002
  "class": ['v-list-item-media', {
5740
- 'v-list-item-media--start': props.left,
5741
- 'v-list-item-media--end': props.right
6003
+ 'v-list-item-media--start': props.start,
6004
+ 'v-list-item-media--end': props.end
5742
6005
  }]
5743
6006
  }, slots);
5744
6007
  };
@@ -5781,6 +6044,8 @@
5781
6044
  };
5782
6045
  }
5783
6046
 
6047
+ const VMenuSymbol = Symbol.for('vuetify:v-menu');
6048
+
5784
6049
  // Utilities
5785
6050
 
5786
6051
  const makeActivatorProps = propsFactory({
@@ -5798,9 +6063,14 @@
5798
6063
  type: Boolean,
5799
6064
  default: undefined
5800
6065
  },
6066
+ closeOnContentClick: Boolean,
5801
6067
  ...makeDelayProps()
5802
6068
  });
5803
- function useActivator(props, isActive) {
6069
+ function useActivator(props, _ref) {
6070
+ let {
6071
+ isActive,
6072
+ isTop
6073
+ } = _ref;
5804
6074
  const activatorEl = vue.ref();
5805
6075
  let isHovered = false;
5806
6076
  let isFocused = false;
@@ -5810,7 +6080,7 @@
5810
6080
  runOpenDelay,
5811
6081
  runCloseDelay
5812
6082
  } = useDelay(props, value => {
5813
- if (value === (props.openOnHover && isHovered || openOnFocus.value && isFocused)) {
6083
+ if (value === (props.openOnHover && isHovered || openOnFocus.value && isFocused) && !(props.openOnHover && isActive.value && !isTop.value)) {
5814
6084
  isActive.value = value;
5815
6085
  }
5816
6086
  });
@@ -5861,6 +6131,37 @@
5861
6131
 
5862
6132
  return events;
5863
6133
  });
6134
+ const contentEvents = vue.computed(() => {
6135
+ const events = {};
6136
+
6137
+ if (props.openOnHover) {
6138
+ events.mouseenter = () => {
6139
+ isHovered = true;
6140
+ runOpenDelay();
6141
+ };
6142
+
6143
+ events.mouseleave = () => {
6144
+ isHovered = false;
6145
+ runCloseDelay();
6146
+ };
6147
+ }
6148
+
6149
+ if (props.closeOnContentClick) {
6150
+ const menu = vue.inject(VMenuSymbol, null);
6151
+
6152
+ events.click = () => {
6153
+ isActive.value = false;
6154
+ menu == null ? void 0 : menu.closeParents();
6155
+ };
6156
+ }
6157
+
6158
+ return events;
6159
+ });
6160
+ vue.watch(isTop, val => {
6161
+ if (val && props.openOnHover && !isHovered) {
6162
+ isActive.value = false;
6163
+ }
6164
+ });
5864
6165
  const activatorRef = vue.ref();
5865
6166
  vue.watchEffect(() => {
5866
6167
  if (!activatorRef.value) return;
@@ -5869,14 +6170,14 @@
5869
6170
  activatorEl.value = isComponentInstance(activator) ? activator.$el : activator;
5870
6171
  });
5871
6172
  });
6173
+ const vm = getCurrentInstance('useActivator');
5872
6174
  let scope;
5873
6175
  vue.watch(() => !!props.activator, val => {
5874
6176
  if (val && IN_BROWSER) {
5875
6177
  scope = vue.effectScope();
5876
6178
  scope.run(() => {
5877
- _useActivator(props, {
6179
+ _useActivator(props, vm, {
5878
6180
  activatorEl,
5879
- activatorRef,
5880
6181
  activatorEvents
5881
6182
  });
5882
6183
  });
@@ -5890,15 +6191,16 @@
5890
6191
  return {
5891
6192
  activatorEl,
5892
6193
  activatorRef,
5893
- activatorEvents
6194
+ activatorEvents,
6195
+ contentEvents
5894
6196
  };
5895
6197
  }
5896
6198
 
5897
- function _useActivator(props, _ref) {
6199
+ function _useActivator(props, vm, _ref2) {
5898
6200
  let {
5899
6201
  activatorEl,
5900
6202
  activatorEvents
5901
- } = _ref;
6203
+ } = _ref2;
5902
6204
  vue.watch(() => props.activator, (val, oldVal) => {
5903
6205
  if (oldVal && val !== oldVal) {
5904
6206
  const activator = getActivator(oldVal);
@@ -5924,8 +6226,8 @@
5924
6226
  let _props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.activatorProps;
5925
6227
 
5926
6228
  if (!el) return;
5927
- Object.entries(activatorEvents.value).forEach(_ref2 => {
5928
- let [name, cb] = _ref2;
6229
+ Object.entries(activatorEvents.value).forEach(_ref3 => {
6230
+ let [name, cb] = _ref3;
5929
6231
  el.addEventListener(name, cb);
5930
6232
  });
5931
6233
  Object.keys(_props).forEach(k => {
@@ -5943,8 +6245,8 @@
5943
6245
  let _props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.activatorProps;
5944
6246
 
5945
6247
  if (!el) return;
5946
- Object.entries(activatorEvents.value).forEach(_ref3 => {
5947
- let [name, cb] = _ref3;
6248
+ Object.entries(activatorEvents.value).forEach(_ref4 => {
6249
+ let [name, cb] = _ref4;
5948
6250
  el.removeEventListener(name, cb);
5949
6251
  });
5950
6252
  Object.keys(_props).forEach(k => {
@@ -5952,8 +6254,6 @@
5952
6254
  });
5953
6255
  }
5954
6256
 
5955
- const vm = getCurrentInstance('useActivator');
5956
-
5957
6257
  function getActivator() {
5958
6258
  var _activator;
5959
6259
 
@@ -6190,6 +6490,8 @@
6190
6490
 
6191
6491
 
6192
6492
  function updatePosition() {
6493
+ var _props$maxWidth;
6494
+
6193
6495
  observe = false;
6194
6496
  requestAnimationFrame(() => {
6195
6497
  requestAnimationFrame(() => observe = true);
@@ -6230,13 +6532,15 @@
6230
6532
  el.scrollTo(...position);
6231
6533
  });
6232
6534
  }
6233
- const contentHeight = Math.min(configuredMaxHeight.value, contentBox.height);
6535
+ const contentHeight = Math.min(configuredMaxHeight.value, contentBox.height); // Regard undefined maxWidth as maximally occupying whole remaining space by default
6536
+
6537
+ const maxFreeSpaceWidth = props.maxWidth === undefined ? Number.MAX_VALUE : parseInt((_props$maxWidth = props.maxWidth) != null ? _props$maxWidth : 0, 10);
6234
6538
  const viewportMargin = 12;
6235
6539
  const freeSpace = {
6236
6540
  top: targetBox.top - viewportMargin,
6237
6541
  bottom: viewportHeight - targetBox.bottom - viewportMargin,
6238
- left: targetBox.left - viewportMargin,
6239
- right: viewportWidth - targetBox.right - viewportMargin
6542
+ left: Math.min(targetBox.left - viewportMargin, maxFreeSpaceWidth),
6543
+ right: Math.min(viewportWidth - targetBox.right - viewportMargin, maxFreeSpaceWidth)
6240
6544
  };
6241
6545
  const fitsY = preferredAnchor.value.side === 'bottom' && contentHeight <= freeSpace.bottom || preferredAnchor.value.side === 'top' && contentHeight <= freeSpace.top;
6242
6546
  const anchor = fitsY ? preferredAnchor.value : preferredAnchor.value.side === 'bottom' && freeSpace.top > freeSpace.bottom || preferredAnchor.value.side === 'top' && freeSpace.bottom > freeSpace.top ? oppositeAnchor(preferredAnchor.value) : preferredAnchor.value;
@@ -6308,6 +6612,7 @@
6308
6612
  // Utilities
6309
6613
 
6310
6614
  const scrollStrategies = {
6615
+ none: null,
6311
6616
  close: closeScrollStrategy,
6312
6617
  block: blockScrollStrategy,
6313
6618
  reposition: repositionScrollStrategy
@@ -6364,13 +6669,21 @@
6364
6669
  }
6365
6670
 
6366
6671
  scrollElements.forEach((el, i) => {
6672
+ el.style.setProperty('--v-body-scroll-x', convertToUnit(-el.scrollLeft));
6673
+ el.style.setProperty('--v-body-scroll-y', convertToUnit(-el.scrollTop));
6367
6674
  el.style.setProperty('--v-scrollbar-offset', convertToUnit(scrollbarWidth));
6368
6675
  el.classList.add('v-overlay-scroll-blocked');
6369
6676
  });
6370
6677
  vue.onScopeDispose(() => {
6371
6678
  scrollElements.forEach((el, i) => {
6679
+ const x = parseFloat(el.style.getPropertyValue('--v-body-scroll-x'));
6680
+ const y = parseFloat(el.style.getPropertyValue('--v-body-scroll-y'));
6681
+ el.style.removeProperty('--v-body-scroll-x');
6682
+ el.style.removeProperty('--v-body-scroll-y');
6372
6683
  el.style.removeProperty('--v-scrollbar-offset');
6373
6684
  el.classList.remove('v-overlay-scroll-blocked');
6685
+ el.scrollLeft = -x;
6686
+ el.scrollTop = -y;
6374
6687
  });
6375
6688
 
6376
6689
  if (scrollableParent) {
@@ -6500,39 +6813,14 @@
6500
6813
  }, {
6501
6814
  immediate: true
6502
6815
  });
6503
- const isTop = vue.computed(() => {
6504
- return vue.toRaw(stack.value[stack.value.length - 1]) === vm;
6505
- });
6506
- return {
6507
- isTop
6508
- };
6509
- }
6510
-
6511
- // Utilities
6816
+ const isTop = vue.ref(true);
6817
+ vue.watchEffect(() => {
6818
+ const _isTop = vue.toRaw(stack.value[stack.value.length - 1]) === vm;
6512
6819
 
6513
- const VuetifyOverlayKey = Symbol.for('vuetify:overlay');
6514
- const ROOT_ZINDEX = 2000;
6515
- function useOverlay(isActive) {
6516
- const {
6517
- zIndex,
6518
- overlays
6519
- } = vue.inject(VuetifyOverlayKey, {
6520
- zIndex: vue.ref(ROOT_ZINDEX),
6521
- overlays: vue.ref([])
6820
+ setTimeout(() => isTop.value = _isTop);
6522
6821
  });
6523
- const id = getUid();
6524
- vue.watch(isActive, value => {
6525
- if (value) {
6526
- overlays.value.push(id);
6527
- } else {
6528
- overlays.value = overlays.value.filter(x => x !== id);
6529
- }
6530
- }, {
6531
- immediate: true
6532
- });
6533
- const overlayZIndex = vue.computed(() => zIndex.value + overlays.value.indexOf(id) + 1);
6534
6822
  return {
6535
- overlayZIndex
6823
+ isTop: vue.readonly(isTop)
6536
6824
  };
6537
6825
  }
6538
6826
 
@@ -6706,17 +6994,21 @@
6706
6994
  const scrimColor = useBackgroundColor(vue.computed(() => {
6707
6995
  return typeof props.scrim === 'string' ? props.scrim : null;
6708
6996
  }));
6997
+ const {
6998
+ isTop
6999
+ } = useStack(isActive);
6709
7000
  const {
6710
7001
  activatorEl,
6711
7002
  activatorRef,
6712
- activatorEvents
6713
- } = useActivator(props, isActive);
7003
+ activatorEvents,
7004
+ contentEvents
7005
+ } = useActivator(props, {
7006
+ isActive,
7007
+ isTop
7008
+ });
6714
7009
  const {
6715
7010
  dimensionStyles
6716
7011
  } = useDimension(props);
6717
- const {
6718
- isTop
6719
- } = useStack(isActive);
6720
7012
  const root = vue.ref();
6721
7013
  const contentEl = vue.ref();
6722
7014
  const {
@@ -6797,9 +7089,6 @@
6797
7089
  });
6798
7090
  }
6799
7091
 
6800
- const {
6801
- overlayZIndex
6802
- } = useOverlay(isActive);
6803
7092
  useRender(() => {
6804
7093
  var _slots$activator, _slots$default;
6805
7094
 
@@ -6819,8 +7108,7 @@
6819
7108
  'v-overlay--contained': props.contained
6820
7109
  }, themeClasses.value, rtlClasses.value],
6821
7110
  "style": {
6822
- top: convertToUnit(top.value),
6823
- zIndex: overlayZIndex.value
7111
+ top: convertToUnit(top.value)
6824
7112
  },
6825
7113
  "ref": root
6826
7114
  }, attrs), [vue.createVNode(Scrim, {
@@ -6836,11 +7124,11 @@
6836
7124
  emit('afterLeave');
6837
7125
  }
6838
7126
  }, {
6839
- default: () => [vue.withDirectives(vue.createVNode("div", {
7127
+ default: () => [vue.withDirectives(vue.createVNode("div", vue.mergeProps({
6840
7128
  "ref": contentEl,
6841
7129
  "class": ['v-overlay__content', props.contentClass],
6842
7130
  "style": [dimensionStyles.value, contentStyles.value]
6843
- }, [(_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots, {
7131
+ }, vue.toHandlers(contentEvents.value)), [(_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots, {
6844
7132
  isActive
6845
7133
  })]), [[vue.vShow, isActive.value], [vue.resolveDirective("click-outside"), {
6846
7134
  handler: onClickOutside,
@@ -6853,7 +7141,9 @@
6853
7141
  return {
6854
7142
  animateClick,
6855
7143
  contentEl,
6856
- activatorEl
7144
+ activatorEl,
7145
+ isTop,
7146
+ updatePosition
6857
7147
  };
6858
7148
  }
6859
7149
 
@@ -6864,15 +7154,7 @@
6864
7154
  inheritAttrs: false,
6865
7155
  props: {
6866
7156
  // TODO
6867
- // closeOnClick: {
6868
- // type: Boolean,
6869
- // default: true,
6870
- // },
6871
- // closeOnContentClick: {
6872
- // type: Boolean,
6873
- // default: true,
6874
- // },
6875
- disableKeys: Boolean,
7157
+ // disableKeys: Boolean,
6876
7158
  modelValue: Boolean,
6877
7159
  id: String,
6878
7160
  ...makeTransitionProps({
@@ -6893,26 +7175,62 @@
6893
7175
  const isActive = useProxiedModel(props, 'modelValue');
6894
7176
  const uid = getUid();
6895
7177
  const id = vue.computed(() => props.id || `v-menu-${uid}`);
6896
- return () => {
6897
- return vue.createVNode(VOverlay, vue.mergeProps({
6898
- "modelValue": isActive.value,
6899
- "onUpdate:modelValue": $event => isActive.value = $event,
6900
- "class": ['v-menu'],
6901
- "transition": props.transition,
6902
- "absolute": true,
6903
- "positionStrategy": "connected",
6904
- "scrollStrategy": "reposition",
6905
- "scrim": false,
6906
- "activatorProps": {
6907
- 'aria-haspopup': 'menu',
6908
- 'aria-expanded': String(isActive.value),
6909
- 'aria-owns': id.value
6910
- }
6911
- }, attrs), {
6912
- default: slots.default,
6913
- activator: slots.activator
6914
- });
6915
- };
7178
+ const overlay = vue.ref();
7179
+ const parent = vue.inject(VMenuSymbol, null);
7180
+ let openChildren = 0;
7181
+ vue.provide(VMenuSymbol, {
7182
+ register() {
7183
+ ++openChildren;
7184
+ },
7185
+
7186
+ unregister() {
7187
+ --openChildren;
7188
+ },
7189
+
7190
+ closeParents() {
7191
+ setTimeout(() => {
7192
+ if (!openChildren) {
7193
+ isActive.value = false;
7194
+ parent == null ? void 0 : parent.closeParents();
7195
+ }
7196
+ }, 40);
7197
+ }
7198
+
7199
+ });
7200
+ vue.watch(isActive, val => {
7201
+ val ? parent == null ? void 0 : parent.register() : parent == null ? void 0 : parent.unregister();
7202
+ });
7203
+
7204
+ function onClickOutside() {
7205
+ parent == null ? void 0 : parent.closeParents();
7206
+ }
7207
+
7208
+ useRender(() => vue.createVNode(VOverlay, vue.mergeProps({
7209
+ "ref": overlay,
7210
+ "modelValue": isActive.value,
7211
+ "onUpdate:modelValue": $event => isActive.value = $event,
7212
+ "class": ['v-menu'],
7213
+ "transition": props.transition,
7214
+ "absolute": true,
7215
+ "closeOnContentClick": true,
7216
+ "positionStrategy": "connected",
7217
+ "scrollStrategy": "reposition",
7218
+ "scrim": false,
7219
+ "openDelay": "300",
7220
+ "closeDelay": "250",
7221
+ "activatorProps": {
7222
+ 'aria-haspopup': 'menu',
7223
+ 'aria-expanded': String(isActive.value),
7224
+ 'aria-owns': id.value
7225
+ },
7226
+ "onClick:outside": onClickOutside
7227
+ }, attrs), {
7228
+ default: slots.default,
7229
+ activator: slots.activator
7230
+ }));
7231
+ return useForwardRef({
7232
+ id
7233
+ }, overlay);
6916
7234
  }
6917
7235
 
6918
7236
  });
@@ -6986,7 +7304,6 @@
6986
7304
  const results = [];
6987
7305
  let valid = true;
6988
7306
  errorMessages.value = [];
6989
- model.value = null;
6990
7307
  isValidating.value = true;
6991
7308
 
6992
7309
  for (const item of items.value) {
@@ -7004,7 +7321,6 @@
7004
7321
  }
7005
7322
 
7006
7323
  errorMessages.value = results;
7007
- model.value = valid;
7008
7324
  isValidating.value = false;
7009
7325
  return {
7010
7326
  valid,
@@ -7023,8 +7339,21 @@
7023
7339
  model.value = null;
7024
7340
  }
7025
7341
 
7342
+ vue.watch(items, () => {
7343
+ let valid = null;
7344
+
7345
+ if (items.value.some(item => item.isValid === false)) {
7346
+ valid = false;
7347
+ } else if (items.value.every(item => item.isValid === true)) {
7348
+ valid = true;
7349
+ }
7350
+
7351
+ model.value = valid;
7352
+ }, {
7353
+ deep: true
7354
+ });
7026
7355
  vue.provide(FormKey, {
7027
- register: (id, validate, reset, resetValidation) => {
7356
+ register: (id, validate, reset, resetValidation, isValid) => {
7028
7357
  if (items.value.some(item => item.id === id)) {
7029
7358
  consoleWarn(`Duplicate input name "${id}"`);
7030
7359
  }
@@ -7033,7 +7362,9 @@
7033
7362
  id,
7034
7363
  validate,
7035
7364
  reset,
7036
- resetValidation
7365
+ resetValidation,
7366
+ isValid: isValid // TODO: Better way to type this unwrapping?
7367
+
7037
7368
  });
7038
7369
  },
7039
7370
  unregister: id => {
@@ -7088,7 +7419,7 @@
7088
7419
  const form = useForm();
7089
7420
  const internalErrorMessages = vue.ref([]);
7090
7421
  const isPristine = vue.ref(true);
7091
- const isDirty = vue.computed(() => wrapInArray(model.value || []).length > 0);
7422
+ const isDirty = vue.computed(() => wrapInArray(model.value === '' ? null : model.value).length > 0);
7092
7423
  const isDisabled = vue.computed(() => !!(props.disabled || form != null && form.isDisabled.value));
7093
7424
  const isReadonly = vue.computed(() => !!(props.readonly || form != null && form.isReadonly.value));
7094
7425
  const errorMessages = vue.computed(() => {
@@ -7113,11 +7444,14 @@
7113
7444
  return (_props$name = props.name) != null ? _props$name : getUid();
7114
7445
  });
7115
7446
  vue.onBeforeMount(() => {
7116
- form == null ? void 0 : form.register(uid.value, validate, reset, resetValidation);
7447
+ form == null ? void 0 : form.register(uid.value, validate, reset, resetValidation, isValid);
7117
7448
  });
7118
7449
  vue.onBeforeUnmount(() => {
7119
7450
  form == null ? void 0 : form.unregister(uid.value);
7120
7451
  });
7452
+ vue.watch(model, () => {
7453
+ if (model.value != null) validate();
7454
+ });
7121
7455
 
7122
7456
  function reset() {
7123
7457
  resetValidation();
@@ -7194,13 +7528,12 @@
7194
7528
  props: { ...makeVInputProps()
7195
7529
  },
7196
7530
  emits: {
7197
- 'click:prepend': e => true,
7198
- 'click:append': e => true,
7199
7531
  'update:modelValue': val => true
7200
7532
  },
7201
7533
 
7202
7534
  setup(props, _ref) {
7203
7535
  let {
7536
+ attrs,
7204
7537
  slots,
7205
7538
  emit
7206
7539
  } = _ref;
@@ -7246,14 +7579,14 @@
7246
7579
  }, [hasPrepend && vue.createVNode("div", {
7247
7580
  "class": "v-input__prepend"
7248
7581
  }, [slots == null ? void 0 : (_slots$prepend = slots.prepend) == null ? void 0 : _slots$prepend.call(slots, slotProps.value), props.prependIcon && vue.createVNode(VIcon, {
7249
- "onClick": e => emit('click:prepend', e),
7582
+ "onClick": attrs['onClick:prepend'],
7250
7583
  "icon": props.prependIcon
7251
7584
  }, null)]), slots.default && vue.createVNode("div", {
7252
7585
  "class": "v-input__control"
7253
7586
  }, [(_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots, slotProps.value)]), hasAppend && vue.createVNode("div", {
7254
7587
  "class": "v-input__append"
7255
7588
  }, [slots == null ? void 0 : (_slots$append = slots.append) == null ? void 0 : _slots$append.call(slots, slotProps.value), props.appendIcon && vue.createVNode(VIcon, {
7256
- "onClick": e => emit('click:append', e),
7589
+ "onClick": attrs['onClick:append'],
7257
7590
  "icon": props.appendIcon
7258
7591
  }, null)]), hasDetails && vue.createVNode("div", {
7259
7592
  "class": "v-input__details"
@@ -7603,8 +7936,6 @@
7603
7936
  },
7604
7937
  emits: {
7605
7938
  'click:clear': e => true,
7606
- 'click:prepend-inner': e => true,
7607
- 'click:append-inner': e => true,
7608
7939
  'click:control': e => true,
7609
7940
  'update:focused': focused => true,
7610
7941
  'update:modelValue': val => true
@@ -7719,6 +8050,7 @@
7719
8050
  'v-field--prepended': hasPrepend,
7720
8051
  'v-field--reverse': props.reverse,
7721
8052
  'v-field--single-line': props.singleLine,
8053
+ 'v-field--has-label': !!label,
7722
8054
  [`v-field--variant-${props.variant}`]: true
7723
8055
  }, themeClasses.value, backgroundColorClasses.value, focusClasses.value, loaderClasses.value],
7724
8056
  "style": [backgroundColorStyles.value, textColorStyles.value],
@@ -7734,7 +8066,7 @@
7734
8066
  }), hasPrepend && vue.createVNode("div", {
7735
8067
  "class": "v-field__prepend-inner"
7736
8068
  }, [props.prependInnerIcon && vue.createVNode(VIcon, {
7737
- "onClick": e => emit('click:prepend-inner', e),
8069
+ "onClick": attrs['onClick:prependInner'],
7738
8070
  "icon": props.prependInnerIcon
7739
8071
  }, null), slots == null ? void 0 : (_slots$prependInner = slots.prependInner) == null ? void 0 : _slots$prependInner.call(slots, slotProps.value)]), vue.createVNode("div", {
7740
8072
  "class": "v-field__field"
@@ -7766,7 +8098,7 @@
7766
8098
  }), hasAppend && vue.createVNode("div", {
7767
8099
  "class": "v-field__append-inner"
7768
8100
  }, [slots == null ? void 0 : (_slots$appendInner = slots.appendInner) == null ? void 0 : _slots$appendInner.call(slots, slotProps.value), props.appendInnerIcon && vue.createVNode(VIcon, {
7769
- "onClick": e => emit('click:append-inner', e),
8101
+ "onClick": attrs['onClick:appendInner'],
7770
8102
  "icon": props.appendInnerIcon
7771
8103
  }, null)]), vue.createVNode("div", {
7772
8104
  "class": ['v-field__outline', textColorClasses.value]
@@ -7866,13 +8198,9 @@
7866
8198
  ...makeVFieldProps()
7867
8199
  },
7868
8200
  emits: {
7869
- 'click:append': e => true,
7870
- 'click:append-inner': e => true,
7871
8201
  'click:clear': e => true,
7872
8202
  'click:control': e => true,
7873
8203
  'click:input': e => true,
7874
- 'click:prepend': e => true,
7875
- 'click:prepend-inner': e => true,
7876
8204
  'update:modelValue': val => true
7877
8205
  },
7878
8206
 
@@ -7947,13 +8275,12 @@
7947
8275
  "modelValue": model.value,
7948
8276
  "onUpdate:modelValue": $event => model.value = $event,
7949
8277
  "class": ['v-text-field', {
7950
- 'v-text-field--persistent-placeholder': props.persistentPlaceholder,
7951
8278
  'v-text-field--prefixed': props.prefix,
7952
8279
  'v-text-field--suffixed': props.suffix,
7953
8280
  'v-text-field--flush-details': ['plain', 'underlined'].includes(props.variant)
7954
8281
  }],
7955
- "onClick:prepend": e => emit('click:prepend', e),
7956
- "onClick:append": e => emit('click:append', e)
8282
+ "onClick:prepend": attrs['onClick:prepend'],
8283
+ "onClick:append": attrs['onClick:append']
7957
8284
  }, rootAttrs, inputProps, {
7958
8285
  "messages": messages.value
7959
8286
  }), { ...slots,
@@ -7972,8 +8299,8 @@
7972
8299
  },
7973
8300
  "onClick:control": onControlClick,
7974
8301
  "onClick:clear": onClear,
7975
- "onClick:prependInner": e => emit('click:prepend-inner', e),
7976
- "onClick:appendInner": e => emit('click:append-inner', e),
8302
+ "onClick:prependInner": attrs['onClick:prependInner'],
8303
+ "onClick:appendInner": attrs['onClick:prependInner'],
7977
8304
  "role": "textbox"
7978
8305
  }, fieldProps, {
7979
8306
  "active": isActive.value || isDirty.value,
@@ -8001,6 +8328,7 @@
8001
8328
  "autofocus": props.autofocus,
8002
8329
  "readonly": isReadonly.value,
8003
8330
  "disabled": isDisabled.value,
8331
+ "name": props.name,
8004
8332
  "placeholder": props.placeholder,
8005
8333
  "size": 1,
8006
8334
  "type": props.type,
@@ -8028,6 +8356,60 @@
8028
8356
 
8029
8357
  });
8030
8358
 
8359
+ // Utilities
8360
+
8361
+ // Composables
8362
+ const makeItemsProps = propsFactory({
8363
+ items: {
8364
+ type: Array,
8365
+ default: () => []
8366
+ },
8367
+ itemTitle: {
8368
+ type: [String, Array, Function],
8369
+ default: 'title'
8370
+ },
8371
+ itemValue: {
8372
+ type: [String, Array, Function],
8373
+ default: 'value'
8374
+ },
8375
+ itemChildren: {
8376
+ type: String,
8377
+ default: 'children'
8378
+ },
8379
+ itemProps: {
8380
+ type: Function,
8381
+ default: item => ({})
8382
+ }
8383
+ }, 'item');
8384
+ function transformItem(props, item) {
8385
+ var _props$itemProps;
8386
+
8387
+ const title = getPropertyFromItem(item, props.itemTitle, item);
8388
+ const value = getPropertyFromItem(item, props.itemValue, title);
8389
+ const children = getObjectValueByPath(item, props.itemChildren);
8390
+ return {
8391
+ title,
8392
+ value,
8393
+ children: Array.isArray(children) ? transformItems(props, children) : undefined,
8394
+ ...((_props$itemProps = props.itemProps) == null ? void 0 : _props$itemProps.call(props, item))
8395
+ };
8396
+ }
8397
+ function transformItems(props, items) {
8398
+ const array = [];
8399
+
8400
+ for (const item of items) {
8401
+ array.push(transformItem(props, item));
8402
+ }
8403
+
8404
+ return array;
8405
+ }
8406
+ function useItems(props) {
8407
+ const items = vue.computed(() => transformItems(props, props.items));
8408
+ return {
8409
+ items
8410
+ };
8411
+ }
8412
+
8031
8413
  const LocaleAdapterSymbol = Symbol.for('vuetify:locale-adapter');
8032
8414
  const VuetifyLocaleSymbol = Symbol.for('vuetify:locale');
8033
8415
  function provideLocale(props) {
@@ -8162,24 +8544,12 @@
8162
8544
  };
8163
8545
  }
8164
8546
 
8165
- function genItem(item) {
8166
- var _ref;
8167
-
8168
- return {
8169
- title: String((_ref = typeof item === 'object' ? item.title : item) != null ? _ref : ''),
8170
- value: typeof item === 'object' ? item.value : item
8171
- };
8172
- }
8173
8547
  const makeSelectProps = propsFactory({
8174
8548
  chips: Boolean,
8175
8549
  closableChips: Boolean,
8176
8550
  eager: Boolean,
8177
8551
  hideNoData: Boolean,
8178
8552
  hideSelected: Boolean,
8179
- items: {
8180
- type: Array,
8181
- default: () => []
8182
- },
8183
8553
  menuIcon: {
8184
8554
  type: String,
8185
8555
  default: '$dropdown'
@@ -8193,7 +8563,8 @@
8193
8563
  type: String,
8194
8564
  default: '$vuetify.noDataText'
8195
8565
  },
8196
- openOnClear: Boolean
8566
+ openOnClear: Boolean,
8567
+ ...makeItemsProps()
8197
8568
  }, 'select');
8198
8569
  const VSelect = genericComponent()({
8199
8570
  name: 'VSelect',
@@ -8206,36 +8577,21 @@
8206
8577
  'update:modelValue': val => true
8207
8578
  },
8208
8579
 
8209
- setup(props, _ref2) {
8580
+ setup(props, _ref) {
8210
8581
  let {
8211
8582
  slots
8212
- } = _ref2;
8583
+ } = _ref;
8213
8584
  const {
8214
8585
  t
8215
8586
  } = useLocale();
8216
8587
  const vTextFieldRef = vue.ref();
8217
8588
  const activator = vue.ref();
8218
8589
  const menu = vue.ref(false);
8219
- const items = vue.computed(() => props.items.map(genItem));
8590
+ const {
8591
+ items
8592
+ } = useItems(props);
8220
8593
  const model = useProxiedModel(props, 'modelValue', [], v => wrapInArray(v), v => props.multiple ? v : v[0]);
8221
- const selections = vue.computed(() => {
8222
- const array = [];
8223
- let index = 0;
8224
-
8225
- for (const unwrapped of model.value) {
8226
- const item = genItem(unwrapped);
8227
- const found = array.find(selection => selection.value === item.value);
8228
-
8229
- if (found == null) {
8230
- array.push({ ...item,
8231
- index
8232
- });
8233
- index++;
8234
- }
8235
- }
8236
-
8237
- return array;
8238
- });
8594
+ const selections = vue.computed(() => items.value.filter(item => model.value.includes(item.value)));
8239
8595
  const selected = vue.computed(() => selections.value.map(selection => selection.value));
8240
8596
 
8241
8597
  function onClear(e) {
@@ -8263,12 +8619,14 @@
8263
8619
 
8264
8620
  function select(item) {
8265
8621
  if (props.multiple) {
8266
- const index = selections.value.findIndex(selection => selection.value === item.value);
8622
+ const index = selected.value.findIndex(selection => selection === item.value);
8267
8623
 
8268
8624
  if (index === -1) {
8269
- model.value.push(item.value);
8625
+ model.value = [...model.value, item.value];
8270
8626
  } else {
8271
- model.value = selected.value.filter(selection => selection !== item.value);
8627
+ const value = [...model.value];
8628
+ value.splice(index, 1);
8629
+ model.value = value;
8272
8630
  }
8273
8631
  } else {
8274
8632
  model.value = [item.value];
@@ -8297,62 +8655,64 @@
8297
8655
  "modelValue": model.value.join(', '),
8298
8656
  "onKeydown": onKeydown
8299
8657
  }, { ...slots,
8300
- default: () => vue.createVNode(vue.Fragment, null, [activator.value && vue.createVNode(VMenu, {
8301
- "modelValue": menu.value,
8302
- "onUpdate:modelValue": $event => menu.value = $event,
8303
- "activator": activator.value,
8304
- "contentClass": "v-select__content",
8305
- "eager": props.eager,
8306
- "openOnClick": false,
8307
- "transition": props.transition
8308
- }, {
8309
- default: () => [vue.createVNode(VList, {
8310
- "selected": selected.value,
8311
- "selectStrategy": props.multiple ? 'independent' : 'single-independent'
8658
+ default: () => {
8659
+ var _slots$noData, _slots$noData2;
8660
+
8661
+ return vue.createVNode(vue.Fragment, null, [activator.value && vue.createVNode(VMenu, {
8662
+ "modelValue": menu.value,
8663
+ "onUpdate:modelValue": $event => menu.value = $event,
8664
+ "activator": activator.value,
8665
+ "contentClass": "v-select__content",
8666
+ "eager": props.eager,
8667
+ "openOnClick": false,
8668
+ "transition": props.transition
8312
8669
  }, {
8313
- default: () => [!items.value.length && !props.hideNoData && vue.createVNode(VListItem, {
8314
- "title": t(props.noDataText)
8315
- }, null), items.value.map(item => vue.createVNode(VListItem, {
8316
- "title": item.title,
8317
- "value": item.value,
8318
- "onMousedown": e => e.preventDefault(),
8319
- "onClick": () => select(item)
8320
- }, null))]
8321
- })]
8322
- }), selections.value.map((selection, index) => {
8323
- function onChipClose(e) {
8324
- e.stopPropagation();
8325
- e.preventDefault();
8326
- select(selection);
8327
- }
8670
+ default: () => [vue.createVNode(VList, {
8671
+ "selected": selected.value,
8672
+ "selectStrategy": props.multiple ? 'independent' : 'single-independent'
8673
+ }, {
8674
+ default: () => [!items.value.length && !props.hideNoData && ((_slots$noData = (_slots$noData2 = slots['no-data']) == null ? void 0 : _slots$noData2.call(slots)) != null ? _slots$noData : vue.createVNode(VListItem, {
8675
+ "title": t(props.noDataText)
8676
+ }, null)), items.value.map(item => vue.createVNode(VListItem, vue.mergeProps(item, {
8677
+ "onMousedown": e => e.preventDefault(),
8678
+ "onClick": () => select(item)
8679
+ }), null))]
8680
+ })]
8681
+ }), selections.value.map((selection, index) => {
8682
+ function onChipClose(e) {
8683
+ e.stopPropagation();
8684
+ e.preventDefault();
8685
+ select(selection);
8686
+ }
8328
8687
 
8329
- const slotProps = {
8330
- 'onClick:close': onChipClose,
8331
- modelValue: true
8332
- };
8333
- return vue.createVNode("div", {
8334
- "class": "v-select__selection"
8335
- }, [hasChips && vue.createVNode(VDefaultsProvider, {
8336
- "defaults": {
8337
- VChip: {
8338
- closable: props.closableChips,
8339
- size: 'small',
8340
- text: selection.title
8688
+ const slotProps = {
8689
+ 'onClick:close': onChipClose,
8690
+ modelValue: true
8691
+ };
8692
+ return vue.createVNode("div", {
8693
+ "class": "v-select__selection"
8694
+ }, [hasChips && vue.createVNode(VDefaultsProvider, {
8695
+ "defaults": {
8696
+ VChip: {
8697
+ closable: props.closableChips,
8698
+ size: 'small',
8699
+ text: selection.title
8700
+ }
8341
8701
  }
8342
- }
8343
- }, {
8344
- default: () => [slots.chip ? slots.chip({
8345
- props: slotProps,
8702
+ }, {
8703
+ default: () => [slots.chip ? slots.chip({
8704
+ props: slotProps,
8705
+ selection
8706
+ }) : vue.createVNode(VChip, slotProps, null)]
8707
+ }), !hasChips && (slots.selection ? slots.selection({
8346
8708
  selection
8347
- }) : vue.createVNode(VChip, slotProps, null)]
8348
- }), !hasChips && (slots.selection ? slots.selection({
8349
- selection
8350
- }) : vue.createVNode("span", {
8351
- "class": "v-select__selection-text"
8352
- }, [selection.title, props.multiple && index < selections.value.length - 1 && vue.createVNode("span", {
8353
- "class": "v-select__selection-comma"
8354
- }, [vue.createTextVNode(",")])]))]);
8355
- })])
8709
+ }) : vue.createVNode("span", {
8710
+ "class": "v-select__selection-text"
8711
+ }, [selection.title, props.multiple && index < selections.value.length - 1 && vue.createVNode("span", {
8712
+ "class": "v-select__selection-comma"
8713
+ }, [vue.createTextVNode(",")])]))]);
8714
+ })]);
8715
+ }
8356
8716
  });
8357
8717
  });
8358
8718
  return useForwardRef({}, vTextFieldRef);
@@ -8485,7 +8845,9 @@
8485
8845
  const isFocused = vue.ref(false);
8486
8846
  const isPristine = vue.ref(true);
8487
8847
  const menu = vue.ref(false);
8488
- const items = vue.computed(() => props.items.map(genItem));
8848
+ const {
8849
+ items
8850
+ } = useItems(props);
8489
8851
  const search = useProxiedModel(props, 'search', '');
8490
8852
  const model = useProxiedModel(props, 'modelValue', [], v => wrapInArray(v || []), v => props.multiple ? v : v[0]);
8491
8853
  const {
@@ -8496,7 +8858,7 @@
8496
8858
  let index = 0;
8497
8859
 
8498
8860
  for (const unwrapped of model.value) {
8499
- const item = genItem(unwrapped);
8861
+ const item = transformItem(props, unwrapped);
8500
8862
  const found = array.find(selection => selection.value === item.value);
8501
8863
 
8502
8864
  if (found == null) {
@@ -8540,6 +8902,10 @@
8540
8902
  }
8541
8903
  }
8542
8904
 
8905
+ function onInput(e) {
8906
+ search.value = e.target.value;
8907
+ }
8908
+
8543
8909
  function onAfterLeave() {
8544
8910
  if (isFocused.value) isPristine.value = true;
8545
8911
  }
@@ -8548,12 +8914,14 @@
8548
8914
 
8549
8915
  function select(item) {
8550
8916
  if (props.multiple) {
8551
- const index = selections.value.findIndex(selection => selection.value === item.value);
8917
+ const index = selected.value.findIndex(selection => selection === item.value);
8552
8918
 
8553
8919
  if (index === -1) {
8554
- model.value.push(item.value);
8920
+ model.value = [...model.value, item.value];
8555
8921
  } else {
8556
- model.value = selected.value.filter(selection => selection !== item.value);
8922
+ const value = [...model.value];
8923
+ value.splice(index, 1);
8924
+ model.value = value;
8557
8925
  }
8558
8926
  } else {
8559
8927
  model.value = [item.value];
@@ -8591,7 +8959,7 @@
8591
8959
  return vue.createVNode(VTextField, {
8592
8960
  "ref": vTextFieldRef,
8593
8961
  "modelValue": search.value,
8594
- "onUpdate:modelValue": $event => search.value = $event,
8962
+ "onInput": onInput,
8595
8963
  "class": ['v-autocomplete', {
8596
8964
  'v-autocomplete--active-menu': menu.value,
8597
8965
  'v-autocomplete--chips': !!props.chips,
@@ -8606,74 +8974,78 @@
8606
8974
  "onBlur": () => isFocused.value = false,
8607
8975
  "onKeydown": onKeydown
8608
8976
  }, { ...slots,
8609
- default: () => vue.createVNode(vue.Fragment, null, [activator.value && vue.createVNode(VMenu, {
8610
- "modelValue": menu.value,
8611
- "onUpdate:modelValue": $event => menu.value = $event,
8612
- "activator": activator.value,
8613
- "contentClass": "v-autocomplete__content",
8614
- "eager": props.eager,
8615
- "openOnClick": false,
8616
- "transition": props.transition,
8617
- "onAfterLeave": onAfterLeave
8618
- }, {
8619
- default: () => [vue.createVNode(VList, {
8620
- "selected": selected.value,
8621
- "selectStrategy": props.multiple ? 'independent' : 'single-independent'
8977
+ default: () => {
8978
+ var _slots$noData, _slots$noData2;
8979
+
8980
+ return vue.createVNode(vue.Fragment, null, [activator.value && vue.createVNode(VMenu, {
8981
+ "modelValue": menu.value,
8982
+ "onUpdate:modelValue": $event => menu.value = $event,
8983
+ "activator": activator.value,
8984
+ "contentClass": "v-autocomplete__content",
8985
+ "eager": props.eager,
8986
+ "openOnClick": false,
8987
+ "transition": props.transition,
8988
+ "onAfterLeave": onAfterLeave
8622
8989
  }, {
8623
- default: () => [!filteredItems.value.length && !props.hideNoData && vue.createVNode(VListItem, {
8624
- "title": t(props.noDataText)
8625
- }, null), filteredItems.value.map(_ref2 => {
8626
- let {
8627
- item,
8628
- matches
8629
- } = _ref2;
8630
- return vue.createVNode(VListItem, {
8631
- "value": item.value,
8632
- "onMousedown": e => e.preventDefault(),
8633
- "onClick": () => select(item)
8634
- }, {
8635
- title: () => {
8636
- var _search$value$length, _search$value;
8637
-
8638
- return isPristine.value ? item.title : highlightResult$1(item.title, matches.title, (_search$value$length = (_search$value = search.value) == null ? void 0 : _search$value.length) != null ? _search$value$length : 0);
8639
- }
8640
- });
8990
+ default: () => [vue.createVNode(VList, {
8991
+ "selected": selected.value,
8992
+ "selectStrategy": props.multiple ? 'independent' : 'single-independent'
8993
+ }, {
8994
+ default: () => [!filteredItems.value.length && !props.hideNoData && ((_slots$noData = (_slots$noData2 = slots['no-data']) == null ? void 0 : _slots$noData2.call(slots)) != null ? _slots$noData : vue.createVNode(VListItem, {
8995
+ "title": t(props.noDataText)
8996
+ }, null)), filteredItems.value.map(_ref2 => {
8997
+ let {
8998
+ item,
8999
+ matches
9000
+ } = _ref2;
9001
+ return vue.createVNode(VListItem, {
9002
+ "value": item.value,
9003
+ "onMousedown": e => e.preventDefault(),
9004
+ "onClick": () => select(item)
9005
+ }, {
9006
+ title: () => {
9007
+ var _search$value$length, _search$value;
9008
+
9009
+ return isPristine.value ? item.title : highlightResult$1(item.title, matches.title, (_search$value$length = (_search$value = search.value) == null ? void 0 : _search$value.length) != null ? _search$value$length : 0);
9010
+ }
9011
+ });
9012
+ })]
8641
9013
  })]
8642
- })]
8643
- }), selections.value.map((selection, index) => {
8644
- function onChipClose(e) {
8645
- e.stopPropagation();
8646
- e.preventDefault();
8647
- select(selection);
8648
- }
9014
+ }), selections.value.map((selection, index) => {
9015
+ function onChipClose(e) {
9016
+ e.stopPropagation();
9017
+ e.preventDefault();
9018
+ select(selection);
9019
+ }
8649
9020
 
8650
- const slotProps = {
8651
- 'onClick:close': onChipClose,
8652
- modelValue: true
8653
- };
8654
- return vue.createVNode("div", {
8655
- "class": "v-autocomplete__selection"
8656
- }, [hasChips && vue.createVNode(VDefaultsProvider, {
8657
- "defaults": {
8658
- VChip: {
8659
- closable: props.closableChips,
8660
- size: 'small',
8661
- text: selection.title
9021
+ const slotProps = {
9022
+ 'onClick:close': onChipClose,
9023
+ modelValue: true
9024
+ };
9025
+ return vue.createVNode("div", {
9026
+ "class": "v-autocomplete__selection"
9027
+ }, [hasChips && vue.createVNode(VDefaultsProvider, {
9028
+ "defaults": {
9029
+ VChip: {
9030
+ closable: props.closableChips,
9031
+ size: 'small',
9032
+ text: selection.title
9033
+ }
8662
9034
  }
8663
- }
8664
- }, {
8665
- default: () => [slots.chip ? slots.chip({
8666
- props: slotProps,
9035
+ }, {
9036
+ default: () => [slots.chip ? slots.chip({
9037
+ props: slotProps,
9038
+ selection
9039
+ }) : vue.createVNode(VChip, slotProps, null)]
9040
+ }), !hasChips && (slots.selection ? slots.selection({
8667
9041
  selection
8668
- }) : vue.createVNode(VChip, slotProps, null)]
8669
- }), !hasChips && (slots.selection ? slots.selection({
8670
- selection
8671
- }) : vue.createVNode("span", {
8672
- "class": "v-autocomplete__selection-text"
8673
- }, [selection.title, props.multiple && index < selections.value.length - 1 && vue.createVNode("span", {
8674
- "class": "v-autocomplete__selection-comma"
8675
- }, [vue.createTextVNode(",")])]))]);
8676
- })])
9042
+ }) : vue.createVNode("span", {
9043
+ "class": "v-autocomplete__selection-text"
9044
+ }, [selection.title, props.multiple && index < selections.value.length - 1 && vue.createVNode("span", {
9045
+ "class": "v-autocomplete__selection-comma"
9046
+ }, [vue.createTextVNode(",")])]))]);
9047
+ })]);
9048
+ }
8677
9049
  });
8678
9050
  });
8679
9051
  return useForwardRef({
@@ -8808,7 +9180,65 @@
8808
9180
 
8809
9181
  });
8810
9182
 
8811
- const VBannerActions = createSimpleFunctional('v-banner-actions');
9183
+ const VBannerActions = defineComponent({
9184
+ name: 'VBannerActions',
9185
+ props: {
9186
+ color: String,
9187
+ density: String
9188
+ },
9189
+
9190
+ setup(props, _ref) {
9191
+ let {
9192
+ slots
9193
+ } = _ref;
9194
+ provideDefaults({
9195
+ VBtn: {
9196
+ color: props.color,
9197
+ density: props.density,
9198
+ variant: 'text'
9199
+ }
9200
+ });
9201
+ useRender(() => {
9202
+ var _slots$default;
9203
+
9204
+ return vue.createVNode("div", {
9205
+ "class": "v-banner-actions"
9206
+ }, [slots == null ? void 0 : (_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots)]);
9207
+ });
9208
+ return {};
9209
+ }
9210
+
9211
+ });
9212
+
9213
+ const VBannerAvatar = defineComponent({
9214
+ name: 'VBannerAvatar',
9215
+ props: makeVAvatarProps(),
9216
+
9217
+ setup(props, _ref) {
9218
+ let {
9219
+ slots
9220
+ } = _ref;
9221
+ return () => vue.createVNode(VAvatar, vue.mergeProps({
9222
+ "class": "v-banner-avatar"
9223
+ }, props), slots);
9224
+ }
9225
+
9226
+ });
9227
+
9228
+ const VBannerIcon = defineComponent({
9229
+ name: 'VBannerIcon',
9230
+ props: makeVAvatarProps(),
9231
+
9232
+ setup(props, _ref) {
9233
+ let {
9234
+ slots
9235
+ } = _ref;
9236
+ return () => vue.createVNode(VAvatar, vue.mergeProps({
9237
+ "class": "v-banner-icon"
9238
+ }, props), slots);
9239
+ }
9240
+
9241
+ });
8812
9242
 
8813
9243
  const VBannerText = createSimpleFunctional('v-banner-text');
8814
9244
 
@@ -8948,6 +9378,7 @@
8948
9378
  color: String,
8949
9379
  icon: String,
8950
9380
  lines: String,
9381
+ stacked: Boolean,
8951
9382
  sticky: Boolean,
8952
9383
  text: String,
8953
9384
  ...makeBorderProps(),
@@ -8964,21 +9395,18 @@
8964
9395
  let {
8965
9396
  slots
8966
9397
  } = _ref;
8967
- const {
8968
- themeClasses
8969
- } = provideTheme(props);
8970
9398
  const {
8971
9399
  borderClasses
8972
9400
  } = useBorder(props);
8973
9401
  const {
8974
9402
  densityClasses
8975
9403
  } = useDensity(props);
8976
- const {
8977
- dimensionStyles
8978
- } = useDimension(props);
8979
9404
  const {
8980
9405
  mobile
8981
9406
  } = useDisplay();
9407
+ const {
9408
+ dimensionStyles
9409
+ } = useDimension(props);
8982
9410
  const {
8983
9411
  elevationClasses
8984
9412
  } = useElevation(props);
@@ -8989,50 +9417,46 @@
8989
9417
  const {
8990
9418
  roundedClasses
8991
9419
  } = useRounded(props);
9420
+ const {
9421
+ themeClasses
9422
+ } = provideTheme(props);
9423
+ const color = vue.toRef(props, 'color');
9424
+ const density = vue.toRef(props, 'density');
9425
+ provideDefaults({
9426
+ VBannerActions: {
9427
+ color,
9428
+ density
9429
+ },
9430
+ VBannerAvatar: {
9431
+ density,
9432
+ image: vue.toRef(props, 'avatar')
9433
+ },
9434
+ VBannerIcon: {
9435
+ color,
9436
+ density,
9437
+ icon: vue.toRef(props, 'icon')
9438
+ }
9439
+ });
8992
9440
  useRender(() => {
8993
9441
  var _slots$default;
8994
9442
 
8995
- const hasAvatar = !!(props.avatar || props.icon || slots.avatar || slots.icon);
8996
9443
  const hasText = !!(props.text || slots.text);
8997
- const hasContent = hasAvatar || hasText || slots.default;
9444
+ const hasPrepend = !!(slots.prepend || props.avatar || props.icon);
8998
9445
  return vue.createVNode(props.tag, {
8999
9446
  "class": ['v-banner', {
9000
- 'v-banner--mobile': mobile.value,
9447
+ 'v-banner--stacked': props.stacked || mobile.value,
9001
9448
  'v-banner--sticky': props.sticky,
9002
- [`v-banner--${props.lines}-line`]: true
9449
+ [`v-banner--${props.lines}-line`]: !!props.lines
9003
9450
  }, borderClasses.value, densityClasses.value, elevationClasses.value, positionClasses.value, roundedClasses.value, themeClasses.value],
9004
9451
  "style": [dimensionStyles.value, positionStyles.value],
9005
9452
  "role": "banner"
9006
9453
  }, {
9007
- default: () => [hasContent && vue.createVNode("div", {
9008
- "class": "v-banner__content"
9009
- }, [hasAvatar && vue.createVNode(VDefaultsProvider, {
9010
- "defaults": {
9011
- VAvatar: {
9012
- color: props.color,
9013
- density: props.density,
9014
- icon: props.icon,
9015
- image: props.avatar
9016
- }
9017
- }
9018
- }, {
9019
- default: () => [vue.createVNode("div", {
9020
- "class": "v-banner__avatar"
9021
- }, [slots.avatar ? slots.avatar() : vue.createVNode(VAvatar, null, null)])]
9022
- }), hasText && vue.createVNode(VBannerText, null, {
9454
+ default: () => [hasPrepend && vue.createVNode(vue.Fragment, null, [slots.prepend ? vue.createVNode("div", {
9455
+ "class": "v-banner__prepend"
9456
+ }, [slots.prepend()]) : props.avatar ? vue.createVNode(VBannerAvatar, null, null) : props.icon ? vue.createVNode(VBannerIcon, null, null) : undefined]), hasText && vue.createVNode(VBannerText, null, {
9023
9457
  default: () => [slots.text ? slots.text() : props.text]
9024
- }), (_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots)]), slots.actions && vue.createVNode(VDefaultsProvider, {
9025
- "defaults": {
9026
- VBtn: {
9027
- color: props.color,
9028
- density: props.density,
9029
- variant: 'text'
9030
- }
9031
- }
9032
- }, {
9033
- default: () => [vue.createVNode(VBannerActions, null, {
9034
- default: slots.actions
9035
- })]
9458
+ }), (_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots), slots.actions && vue.createVNode(VBannerActions, null, {
9459
+ default: () => [slots.actions()]
9036
9460
  })]
9037
9461
  });
9038
9462
  });
@@ -9162,30 +9586,31 @@
9162
9586
  slots,
9163
9587
  attrs
9164
9588
  } = _ref;
9165
- const {
9166
- isExactActive,
9167
- isLink,
9168
- navigate
9169
- } = useLink(props, attrs);
9170
- const isActive = vue.computed(() => props.active || (isExactActive == null ? void 0 : isExactActive.value));
9589
+ const link = useLink(props, attrs);
9590
+ const isActive = vue.computed(() => {
9591
+ var _link$isExactActive;
9592
+
9593
+ return props.active || ((_link$isExactActive = link.isExactActive) == null ? void 0 : _link$isExactActive.value);
9594
+ });
9171
9595
  const color = vue.computed(() => isActive.value ? props.activeColor : props.color);
9172
9596
  const {
9173
9597
  textColorClasses,
9174
9598
  textColorStyles
9175
9599
  } = useTextColor(color);
9176
9600
  useRender(() => {
9177
- const Tag = isLink.value ? 'a' : props.tag;
9601
+ const Tag = link.isLink.value ? 'a' : props.tag;
9178
9602
  const hasText = !!(slots.default || props.text);
9179
9603
  return vue.createVNode(Tag, {
9180
9604
  "class": ['v-breadcrumbs-item', {
9181
9605
  'v-breadcrumbs-item--active': isActive.value,
9182
9606
  'v-breadcrumbs-item--disabled': props.disabled,
9183
- 'v-breadcrumbs-item--link': isLink.value,
9607
+ 'v-breadcrumbs-item--link': link.isLink.value,
9184
9608
  [`${props.activeClass}`]: isActive.value && props.activeClass
9185
9609
  }, textColorClasses.value],
9186
9610
  "style": [textColorStyles.value],
9611
+ "href": link.href.value,
9187
9612
  "aria-current": isActive.value ? 'page' : undefined,
9188
- "onClick": isActive.value && navigate
9613
+ "onClick": link.navigate
9189
9614
  }, {
9190
9615
  default: hasText ? () => {
9191
9616
  var _slots$default, _slots$default2;
@@ -9205,6 +9630,7 @@
9205
9630
  name: 'VBreadcrumbs',
9206
9631
  props: {
9207
9632
  activeClass: String,
9633
+ activeColor: String,
9208
9634
  bgColor: String,
9209
9635
  color: String,
9210
9636
  disabled: Boolean,
@@ -9241,6 +9667,7 @@
9241
9667
  provideDefaults({
9242
9668
  VBreadcrumbsItem: {
9243
9669
  activeClass: vue.toRef(props, 'activeClass'),
9670
+ activeColor: vue.toRef(props, 'activeColor'),
9244
9671
  color: vue.toRef(props, 'color'),
9245
9672
  disabled: vue.toRef(props, 'disabled')
9246
9673
  }
@@ -9286,7 +9713,7 @@
9286
9713
 
9287
9714
  });
9288
9715
 
9289
- const VCardActions = vue.defineComponent({
9716
+ const VCardActions = defineComponent({
9290
9717
  name: 'VCardActions',
9291
9718
 
9292
9719
  setup(_, _ref) {
@@ -9312,6 +9739,8 @@
9312
9739
 
9313
9740
  const VCardAvatar = createSimpleFunctional('v-card-avatar');
9314
9741
 
9742
+ const VCardContent = createSimpleFunctional('v-card-content');
9743
+
9315
9744
  const VCardHeader = createSimpleFunctional('v-card-header');
9316
9745
 
9317
9746
  const VCardHeaderText = createSimpleFunctional('v-card-header-text');
@@ -9391,7 +9820,7 @@
9391
9820
  } = useRounded(props);
9392
9821
  const link = useLink(props, attrs);
9393
9822
  return () => {
9394
- var _slots$image, _slots$media, _slots$default;
9823
+ var _slots$image, _slots$media, _slots$headerText, _slots$default;
9395
9824
 
9396
9825
  const Tag = link.isLink.value ? 'a' : props.tag;
9397
9826
  const hasTitle = !!(slots.title || props.title);
@@ -9445,7 +9874,7 @@
9445
9874
  default: () => [slots.title ? slots.title() : props.title]
9446
9875
  }), hasSubtitle && vue.createVNode(VCardSubtitle, null, {
9447
9876
  default: () => [slots.subtitle ? slots.subtitle() : props.subtitle]
9448
- })]
9877
+ }), (_slots$headerText = slots.headerText) == null ? void 0 : _slots$headerText.call(slots)]
9449
9878
  }), hasAppend && vue.createVNode(VDefaultsProvider, {
9450
9879
  "defaults": {
9451
9880
  VAvatar: {
@@ -9461,6 +9890,8 @@
9461
9890
  })]
9462
9891
  }), hasText && vue.createVNode(VCardText, null, {
9463
9892
  default: () => [slots.text ? slots.text() : props.text]
9893
+ }), slots.content && vue.createVNode(VCardContent, null, {
9894
+ default: slots.content
9464
9895
  }), (_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots), slots.actions && vue.createVNode(VCardActions, null, {
9465
9896
  default: slots.actions
9466
9897
  })]
@@ -9702,13 +10133,6 @@
9702
10133
  canMoveForward.value && group.next();
9703
10134
  }
9704
10135
 
9705
- provideDefaults({
9706
- VBtn: {
9707
- variant: 'text'
9708
- }
9709
- }, {
9710
- scoped: true
9711
- });
9712
10136
  const arrows = vue.computed(() => {
9713
10137
  const arrows = [];
9714
10138
  const prevProps = {
@@ -10010,7 +10434,7 @@
10010
10434
  })]), props.progress && vue.createVNode(VProgressLinear, {
10011
10435
  "class": "v-carousel__progress",
10012
10436
  "color": typeof props.progress === 'string' ? props.progress : undefined,
10013
- "modelValue": (+model.value + 1) / group.items.value.length * 100
10437
+ "modelValue": (group.getItemIndex(model.value) + 1) / group.items.value.length * 100
10014
10438
  }, null)]);
10015
10439
  },
10016
10440
  prev: slots.prev,
@@ -10043,7 +10467,7 @@
10043
10467
  });
10044
10468
 
10045
10469
  const VSelectionControlGroupSymbol = Symbol.for('vuetify:selection-control-group');
10046
- const VSelectionControlGroup = vue.defineComponent({
10470
+ const VSelectionControlGroup = defineComponent({
10047
10471
  name: 'VSelectionControlGroup',
10048
10472
  props: {
10049
10473
  disabled: Boolean,
@@ -10144,6 +10568,7 @@
10144
10568
  },
10145
10569
 
10146
10570
  set(val) {
10571
+ if (props.readonly) return;
10147
10572
  const currentValue = val ? trueValue.value : falseValue.value;
10148
10573
  let newVal = currentValue;
10149
10574
 
@@ -10258,7 +10683,7 @@
10258
10683
  "id": id.value,
10259
10684
  "onBlur": onBlur,
10260
10685
  "onFocus": onFocus,
10261
- "readonly": props.readonly,
10686
+ "aria-readonly": props.readonly,
10262
10687
  "type": type,
10263
10688
  "value": trueValue.value,
10264
10689
  "name": (_group$name$value = group == null ? void 0 : group.name.value) != null ? _group$name$value : props.name,
@@ -10351,7 +10776,7 @@
10351
10776
  "aria-checked": indeterminate.value ? 'mixed' : undefined,
10352
10777
  "disabled": isDisabled.value,
10353
10778
  "readonly": isReadonly.value
10354
- }, controlAttrs), null);
10779
+ }, controlAttrs), slots);
10355
10780
  }
10356
10781
  });
10357
10782
  });
@@ -10917,7 +11342,7 @@
10917
11342
  return ticks.map((tick, index) => {
10918
11343
  var _slots$tickLabel, _slots$tickLabel2;
10919
11344
 
10920
- const directionProperty = vertical.value ? 'inset-block-end' : 'margin-inline-start';
11345
+ const directionProperty = vertical.value ? 'bottom' : 'margin-inline-start';
10921
11346
  return vue.createVNode("div", {
10922
11347
  "key": tick.value,
10923
11348
  "class": ['v-slider-track__tick', {
@@ -12120,11 +12545,13 @@
12120
12545
  })
12121
12546
  },
12122
12547
  emits: {
12123
- 'update:modelValue': val => true
12548
+ 'update:modelValue': val => true,
12549
+ 'update:searchInput': val => true
12124
12550
  },
12125
12551
 
12126
12552
  setup(props, _ref) {
12127
12553
  let {
12554
+ emit,
12128
12555
  slots
12129
12556
  } = _ref;
12130
12557
  const {
@@ -12141,7 +12568,9 @@
12141
12568
 
12142
12569
  return (_vTextFieldRef$value = vTextFieldRef.value) == null ? void 0 : _vTextFieldRef$value.color;
12143
12570
  });
12144
- const items = vue.computed(() => props.items.map(genItem));
12571
+ const {
12572
+ items
12573
+ } = useItems(props);
12145
12574
  const {
12146
12575
  textColorClasses,
12147
12576
  textColorStyles
@@ -12151,7 +12580,7 @@
12151
12580
  const _search = vue.ref('');
12152
12581
 
12153
12582
  const search = vue.computed({
12154
- get: () => props.multiple ? _search.value : genItem(model.value[0]).value,
12583
+ get: () => props.multiple ? _search.value : transformItem(props, model.value[0]).value,
12155
12584
  set: val => {
12156
12585
  var _props$delimiters;
12157
12586
 
@@ -12180,6 +12609,9 @@
12180
12609
  isPristine.value = !val;
12181
12610
  }
12182
12611
  });
12612
+ vue.watch(_search, value => {
12613
+ emit('update:searchInput', value);
12614
+ });
12183
12615
  const {
12184
12616
  filteredItems
12185
12617
  } = useFilter(props, items, vue.computed(() => isPristine.value ? undefined : search.value));
@@ -12188,7 +12620,7 @@
12188
12620
  let index = 0;
12189
12621
 
12190
12622
  for (const unwrapped of model.value) {
12191
- const item = genItem(unwrapped);
12623
+ const item = transformItem(props, unwrapped);
12192
12624
  const found = array.find(selection => selection.value === item.value);
12193
12625
 
12194
12626
  if (found == null) {
@@ -12282,18 +12714,24 @@
12282
12714
  }
12283
12715
  }
12284
12716
 
12717
+ function onInput(e) {
12718
+ search.value = e.target.value;
12719
+ }
12720
+
12285
12721
  function onAfterLeave() {
12286
12722
  if (isFocused.value) isPristine.value = true;
12287
12723
  }
12288
12724
 
12289
12725
  function select(item) {
12290
12726
  if (props.multiple) {
12291
- const index = selections.value.findIndex(selection => selection.value === item.value);
12727
+ const index = selected.value.findIndex(selection => selection === item.value);
12292
12728
 
12293
12729
  if (index === -1) {
12294
- model.value.push(item.value);
12730
+ model.value = [...model.value, item.value];
12295
12731
  } else {
12296
- model.value = selected.value.filter(selection => selection !== item.value);
12732
+ const value = [...model.value];
12733
+ value.splice(index, 1);
12734
+ model.value = value;
12297
12735
  }
12298
12736
 
12299
12737
  search.value = '';
@@ -12319,7 +12757,7 @@
12319
12757
  } else {
12320
12758
  menu.value = false;
12321
12759
  if (!props.multiple || !search.value) return;
12322
- model.value.push(search.value);
12760
+ model.value = [...model.value, search.value];
12323
12761
  search.value = '';
12324
12762
  }
12325
12763
  });
@@ -12328,7 +12766,7 @@
12328
12766
  return vue.createVNode(VTextField, {
12329
12767
  "ref": vTextFieldRef,
12330
12768
  "modelValue": search.value,
12331
- "onUpdate:modelValue": $event => search.value = $event,
12769
+ "onInput": onInput,
12332
12770
  "class": ['v-combobox', {
12333
12771
  'v-combobox--active-menu': menu.value,
12334
12772
  'v-combobox--chips': !!props.chips,
@@ -12344,75 +12782,79 @@
12344
12782
  "onBlur": () => isFocused.value = false,
12345
12783
  "onKeydown": onKeydown
12346
12784
  }, { ...slots,
12347
- default: () => vue.createVNode(vue.Fragment, null, [activator.value && vue.createVNode(VMenu, {
12348
- "modelValue": menu.value,
12349
- "onUpdate:modelValue": $event => menu.value = $event,
12350
- "activator": activator.value,
12351
- "contentClass": "v-combobox__content",
12352
- "eager": props.eager,
12353
- "openOnClick": false,
12354
- "transition": props.transition,
12355
- "onAfterLeave": onAfterLeave
12356
- }, {
12357
- default: () => [vue.createVNode(VList, {
12358
- "selected": selected.value,
12359
- "selectStrategy": props.multiple ? 'independent' : 'single-independent'
12785
+ default: () => {
12786
+ var _slots$noData, _slots$noData2;
12787
+
12788
+ return vue.createVNode(vue.Fragment, null, [activator.value && vue.createVNode(VMenu, {
12789
+ "modelValue": menu.value,
12790
+ "onUpdate:modelValue": $event => menu.value = $event,
12791
+ "activator": activator.value,
12792
+ "contentClass": "v-combobox__content",
12793
+ "eager": props.eager,
12794
+ "openOnClick": false,
12795
+ "transition": props.transition,
12796
+ "onAfterLeave": onAfterLeave
12360
12797
  }, {
12361
- default: () => [!filteredItems.value.length && !props.hideNoData && vue.createVNode(VListItem, {
12362
- "title": t(props.noDataText)
12363
- }, null), filteredItems.value.map(_ref2 => {
12364
- let {
12365
- item,
12366
- matches
12367
- } = _ref2;
12368
- return vue.createVNode(VListItem, {
12369
- "value": item.value,
12370
- "onMousedown": e => e.preventDefault(),
12371
- "onClick": () => select(item)
12372
- }, {
12373
- title: () => {
12374
- var _search$value$length, _search$value;
12375
-
12376
- return isPristine.value ? item.title : highlightResult(item.title, matches.title, (_search$value$length = (_search$value = search.value) == null ? void 0 : _search$value.length) != null ? _search$value$length : 0);
12377
- }
12378
- });
12798
+ default: () => [vue.createVNode(VList, {
12799
+ "selected": selected.value,
12800
+ "selectStrategy": props.multiple ? 'independent' : 'single-independent'
12801
+ }, {
12802
+ default: () => [!filteredItems.value.length && !props.hideNoData && ((_slots$noData = (_slots$noData2 = slots['no-data']) == null ? void 0 : _slots$noData2.call(slots)) != null ? _slots$noData : vue.createVNode(VListItem, {
12803
+ "title": t(props.noDataText)
12804
+ }, null)), filteredItems.value.map(_ref2 => {
12805
+ let {
12806
+ item,
12807
+ matches
12808
+ } = _ref2;
12809
+ return vue.createVNode(VListItem, {
12810
+ "value": item.value,
12811
+ "onMousedown": e => e.preventDefault(),
12812
+ "onClick": () => select(item)
12813
+ }, {
12814
+ title: () => {
12815
+ var _search$value$length, _search$value;
12816
+
12817
+ return isPristine.value ? item.title : highlightResult(item.title, matches.title, (_search$value$length = (_search$value = search.value) == null ? void 0 : _search$value.length) != null ? _search$value$length : 0);
12818
+ }
12819
+ });
12820
+ })]
12379
12821
  })]
12380
- })]
12381
- }), selections.value.map((selection, index) => {
12382
- function onChipClose(e) {
12383
- e.stopPropagation();
12384
- e.preventDefault();
12385
- select(selection);
12386
- }
12822
+ }), selections.value.map((selection, index) => {
12823
+ function onChipClose(e) {
12824
+ e.stopPropagation();
12825
+ e.preventDefault();
12826
+ select(selection);
12827
+ }
12387
12828
 
12388
- const slotProps = {
12389
- 'onClick:close': onChipClose,
12390
- modelValue: true
12391
- };
12392
- return vue.createVNode("div", {
12393
- "class": ['v-combobox__selection', selection.selected && ['v-combobox__selection--selected', textColorClasses.value]],
12394
- "style": selection.selected ? textColorStyles.value : {}
12395
- }, [hasChips && vue.createVNode(VDefaultsProvider, {
12396
- "defaults": {
12397
- VChip: {
12398
- closable: props.closableChips,
12399
- size: 'small',
12400
- text: selection.title
12829
+ const slotProps = {
12830
+ 'onClick:close': onChipClose,
12831
+ modelValue: true
12832
+ };
12833
+ return vue.createVNode("div", {
12834
+ "class": ['v-combobox__selection', selection.selected && ['v-combobox__selection--selected', textColorClasses.value]],
12835
+ "style": selection.selected ? textColorStyles.value : {}
12836
+ }, [hasChips && vue.createVNode(VDefaultsProvider, {
12837
+ "defaults": {
12838
+ VChip: {
12839
+ closable: props.closableChips,
12840
+ size: 'small',
12841
+ text: selection.title
12842
+ }
12401
12843
  }
12402
- }
12403
- }, {
12404
- default: () => [slots.chip ? slots.chip({
12405
- props: slotProps,
12844
+ }, {
12845
+ default: () => [slots.chip ? slots.chip({
12846
+ props: slotProps,
12847
+ selection
12848
+ }) : vue.createVNode(VChip, slotProps, null)]
12849
+ }), !hasChips && (slots.selection ? slots.selection({
12406
12850
  selection
12407
- }) : vue.createVNode(VChip, slotProps, null)]
12408
- }), !hasChips && (slots.selection ? slots.selection({
12409
- selection
12410
- }) : vue.createVNode("span", {
12411
- "class": "v-combobox__selection-text"
12412
- }, [selection.title, props.multiple && index < selections.value.length - 1 && vue.createVNode("span", {
12413
- "class": "v-combobox__selection-comma"
12414
- }, [vue.createTextVNode(",")])]))]);
12415
- })])
12851
+ }) : vue.createVNode("span", {
12852
+ "class": "v-combobox__selection-text"
12853
+ }, [selection.title, props.multiple && index < selections.value.length - 1 && vue.createVNode("span", {
12854
+ "class": "v-combobox__selection-comma"
12855
+ }, [vue.createTextVNode(",")])]))]);
12856
+ })]);
12857
+ }
12416
12858
  });
12417
12859
  });
12418
12860
  return useForwardRef({
@@ -12468,19 +12910,15 @@
12468
12910
  const overlay = vue.ref();
12469
12911
 
12470
12912
  function onFocusin(e) {
12471
- var _overlay$value;
12913
+ var _overlay$value, _overlay$value2;
12472
12914
 
12473
12915
  const before = e.relatedTarget;
12474
12916
  const after = e.target;
12475
12917
 
12476
- if (before !== after && (_overlay$value = overlay.value) != null && _overlay$value.contentEl && // It isn't the document or the dialog body
12918
+ if (before !== after && (_overlay$value = overlay.value) != null && _overlay$value.contentEl && // We're the topmost dialog
12919
+ (_overlay$value2 = overlay.value) != null && _overlay$value2.isTop && // It isn't the document or the dialog body
12477
12920
  ![document, overlay.value.contentEl].includes(after) && // It isn't inside the dialog body
12478
- !overlay.value.contentEl.contains(after) // We're the topmost dialog
12479
- // TODO: this.activeZIndex >= this.getMaxZIndex() &&
12480
- // It isn't inside a dependent element (like a menu)
12481
- // TODO: !this.getOpenDependentElements().some(el => el.contains(target))
12482
- // So we must have focused something outside the dialog and its children
12483
- ) {
12921
+ !overlay.value.contentEl.contains(after)) {
12484
12922
  const focusable = [...overlay.value.contentEl.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])')].filter(el => !el.hasAttribute('disabled'));
12485
12923
  if (!focusable.length) return;
12486
12924
  const firstElement = focusable[0];
@@ -12524,7 +12962,8 @@
12524
12962
  "modelValue": isActive.value,
12525
12963
  "onUpdate:modelValue": $event => isActive.value = $event,
12526
12964
  "class": ['v-dialog', {
12527
- 'v-dialog--fullscreen': props.fullscreen
12965
+ 'v-dialog--fullscreen': props.fullscreen,
12966
+ 'v-dialog--scrollable': props.scrollable
12528
12967
  }],
12529
12968
  "style": dimensionStyles.value,
12530
12969
  "transition": props.transition,
@@ -12555,6 +12994,7 @@
12555
12994
  default: 'default',
12556
12995
  validator: v => allowedVariants.includes(v)
12557
12996
  },
12997
+ readonly: Boolean,
12558
12998
  ...makeGroupProps(),
12559
12999
  ...makeTagProps(),
12560
13000
  ...makeThemeProps()
@@ -12575,6 +13015,9 @@
12575
13015
  provideDefaults({
12576
13016
  VExpansionPanel: {
12577
13017
  color: vue.toRef(props, 'color')
13018
+ },
13019
+ VExpansionPanelTitle: {
13020
+ readonly: vue.toRef(props, 'readonly')
12578
13021
  }
12579
13022
  });
12580
13023
  useRender(() => vue.createVNode(props.tag, {
@@ -12599,7 +13042,8 @@
12599
13042
  ripple: {
12600
13043
  type: [Boolean, Object],
12601
13044
  default: false
12602
- }
13045
+ },
13046
+ readonly: Boolean
12603
13047
  });
12604
13048
  const VExpansionPanelTitle = defineComponent({
12605
13049
  name: 'VExpansionPanelTitle',
@@ -12623,7 +13067,8 @@
12623
13067
  collapseIcon: props.collapseIcon,
12624
13068
  disabled: expansionPanel.disabled.value,
12625
13069
  expanded: expansionPanel.isSelected.value,
12626
- expandIcon: props.expandIcon
13070
+ expandIcon: props.expandIcon,
13071
+ readonly: props.readonly
12627
13072
  }));
12628
13073
  useRender(() => {
12629
13074
  var _slots$default;
@@ -12637,7 +13082,7 @@
12637
13082
  "tabindex": expansionPanel.disabled.value ? -1 : undefined,
12638
13083
  "disabled": expansionPanel.disabled.value,
12639
13084
  "aria-expanded": expansionPanel.isSelected.value,
12640
- "onClick": expansionPanel.toggle
13085
+ "onClick": !props.readonly ? expansionPanel.toggle : undefined
12641
13086
  }, [vue.createVNode("div", {
12642
13087
  "class": "v-expansion-panel-title__overlay"
12643
13088
  }, null), (_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots, slotProps.value), !props.hideActions && vue.createVNode("div", {
@@ -12714,13 +13159,17 @@
12714
13159
  roundedClasses
12715
13160
  } = useRounded(props);
12716
13161
  const isDisabled = vue.computed(() => (groupItem == null ? void 0 : groupItem.disabled.value) || props.disabled);
13162
+ const selectedIndices = vue.computed(() => groupItem.group.items.value.reduce((arr, item, index) => {
13163
+ if (groupItem.group.selected.value.includes(item.id)) arr.push(index);
13164
+ return arr;
13165
+ }, []));
12717
13166
  const isBeforeSelected = vue.computed(() => {
12718
13167
  const index = groupItem.group.items.value.findIndex(item => item.id === groupItem.id);
12719
- return !groupItem.isSelected.value && groupItem.group.selected.value.some(id => groupItem.group.items.value.indexOf(id) - index === 1);
13168
+ return !groupItem.isSelected.value && selectedIndices.value.some(selectedIndex => selectedIndex - index === 1);
12720
13169
  });
12721
13170
  const isAfterSelected = vue.computed(() => {
12722
13171
  const index = groupItem.group.items.value.findIndex(item => item.id === groupItem.id);
12723
- return !groupItem.isSelected.value && groupItem.group.selected.value.some(id => groupItem.group.items.value.indexOf(id) - index === -1);
13172
+ return !groupItem.isSelected.value && selectedIndices.value.some(selectedIndex => selectedIndex - index === -1);
12724
13173
  });
12725
13174
  vue.provide(VExpansionPanelSymbol, groupItem);
12726
13175
  useRender(() => {
@@ -12888,7 +13337,7 @@
12888
13337
  }
12889
13338
 
12890
13339
  useRender(() => {
12891
- const hasCounter = !!(slots.counter || props.counter || counterValue.value);
13340
+ const hasCounter = !!(slots.counter || props.counter);
12892
13341
  const [rootAttrs, inputAttrs] = filterInputAttrs(attrs);
12893
13342
  const [{
12894
13343
  modelValue: _,
@@ -12966,6 +13415,7 @@
12966
13415
  });
12967
13416
  },
12968
13417
  details: hasCounter ? () => vue.createVNode(vue.Fragment, null, [vue.createVNode("span", null, null), vue.createVNode(VCounter, {
13418
+ "active": !!model.value.length,
12969
13419
  "value": counterValue.value
12970
13420
  }, slots.counter)]) : undefined
12971
13421
  });
@@ -12978,11 +13428,15 @@
12978
13428
  const VFooter = defineComponent({
12979
13429
  name: 'VFooter',
12980
13430
  props: {
13431
+ app: Boolean,
12981
13432
  color: String,
13433
+ height: {
13434
+ type: [Number, String],
13435
+ default: 'auto'
13436
+ },
12982
13437
  ...makeBorderProps(),
12983
- ...makeDimensionProps(),
12984
13438
  ...makeElevationProps(),
12985
- ...makePositionProps(),
13439
+ ...makeLayoutItemProps(),
12986
13440
  ...makeRoundedProps(),
12987
13441
  ...makeTagProps({
12988
13442
  tag: 'footer'
@@ -13004,22 +13458,35 @@
13004
13458
  const {
13005
13459
  borderClasses
13006
13460
  } = useBorder(props);
13007
- const {
13008
- dimensionStyles
13009
- } = useDimension(props);
13010
13461
  const {
13011
13462
  elevationClasses
13012
13463
  } = useElevation(props);
13013
13464
  const {
13014
- positionClasses,
13015
- positionStyles
13016
- } = usePosition(props);
13465
+ roundedClasses
13466
+ } = useRounded(props);
13467
+ const autoHeight = vue.ref(32);
13468
+ const {
13469
+ resizeRef
13470
+ } = useResizeObserver(entries => {
13471
+ if (!entries.length) return;
13472
+ autoHeight.value = entries[0].target.clientHeight;
13473
+ });
13474
+ const height = vue.computed(() => props.height === 'auto' ? autoHeight.value : parseInt(props.height, 10));
13017
13475
  const {
13018
- roundedClasses
13019
- } = useRounded(props);
13476
+ layoutItemStyles
13477
+ } = useLayoutItem({
13478
+ id: props.name,
13479
+ priority: vue.computed(() => parseInt(props.priority, 10)),
13480
+ position: vue.computed(() => 'bottom'),
13481
+ layoutSize: height,
13482
+ elementSize: vue.computed(() => props.height === 'auto' ? undefined : height.value),
13483
+ active: vue.computed(() => props.app),
13484
+ absolute: vue.toRef(props, 'absolute')
13485
+ });
13020
13486
  return () => vue.createVNode(props.tag, {
13021
- "class": ['v-footer', themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, positionClasses.value, roundedClasses.value],
13022
- "style": [backgroundColorStyles, dimensionStyles.value, positionStyles.value]
13487
+ "ref": resizeRef,
13488
+ "class": ['v-footer', themeClasses.value, backgroundColorClasses.value, borderClasses.value, elevationClasses.value, roundedClasses.value],
13489
+ "style": [backgroundColorStyles, props.app ? layoutItemStyles.value : undefined]
13023
13490
  }, slots);
13024
13491
  }
13025
13492
 
@@ -13047,17 +13514,29 @@
13047
13514
  form.reset();
13048
13515
  }
13049
13516
 
13050
- function onSubmit(e) {
13051
- e.preventDefault();
13052
- form.validate().then(_ref2 => {
13053
- let {
13054
- valid
13055
- } = _ref2;
13517
+ function onSubmit(_e) {
13518
+ const e = _e;
13519
+ const ready = form.validate();
13520
+ e.then = ready.then.bind(ready);
13521
+ e.catch = ready.catch.bind(ready);
13522
+ e.finally = ready.finally.bind(ready);
13523
+ emit('submit', e);
13056
13524
 
13057
- if (valid) {
13058
- emit('submit', e);
13059
- }
13060
- });
13525
+ if (!e.defaultPrevented) {
13526
+ ready.then(_ref2 => {
13527
+ let {
13528
+ valid
13529
+ } = _ref2;
13530
+
13531
+ if (valid) {
13532
+ var _formRef$value;
13533
+
13534
+ (_formRef$value = formRef.value) == null ? void 0 : _formRef$value.submit();
13535
+ }
13536
+ });
13537
+ }
13538
+
13539
+ e.preventDefault();
13061
13540
  }
13062
13541
 
13063
13542
  useRender(() => {
@@ -13071,7 +13550,7 @@
13071
13550
  "onSubmit": onSubmit
13072
13551
  }, [(_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots, form)]);
13073
13552
  });
13074
- return form;
13553
+ return useForwardRef(form, formRef);
13075
13554
  }
13076
13555
 
13077
13556
  });
@@ -14030,7 +14509,7 @@
14030
14509
  roundedClasses
14031
14510
  } = useRounded(props);
14032
14511
  const router = useRouter();
14033
- const isActive = useProxiedModel(props, 'modelValue');
14512
+ const isActive = useProxiedModel(props, 'modelValue', null, v => !!v);
14034
14513
  const isHovering = vue.ref(false);
14035
14514
  const width = vue.computed(() => {
14036
14515
  return props.rail && props.expandOnHover && isHovering.value ? Number(props.width) : Number(props.rail ? props.railWidth : props.width);
@@ -14319,27 +14798,25 @@
14319
14798
  });
14320
14799
  const range = vue.computed(() => {
14321
14800
  if (length.value <= 0) return [];
14801
+ if (totalVisible.value <= 2) return [page.value];
14322
14802
 
14323
- if (totalVisible.value <= 3) {
14324
- return [Math.min(Math.max(start.value, page.value), start.value + length.value)];
14325
- }
14326
-
14327
- if (props.length <= totalVisible.value) {
14803
+ if (length.value <= totalVisible.value) {
14328
14804
  return createRange(length.value, start.value);
14329
14805
  }
14330
14806
 
14331
- const middle = Math.ceil(totalVisible.value / 2);
14332
- const left = middle;
14807
+ const even = totalVisible.value % 2 === 0;
14808
+ const middle = even ? totalVisible.value / 2 : Math.floor(totalVisible.value / 2);
14809
+ const left = even ? middle : middle + 1;
14333
14810
  const right = length.value - middle;
14334
14811
 
14335
- if (page.value < left) {
14336
- return [...createRange(Math.max(1, totalVisible.value - 2), start.value), props.ellipsis, length.value];
14337
- } else if (page.value > right) {
14338
- const rangeLength = totalVisible.value - 2;
14812
+ if (left - page.value >= 0) {
14813
+ return [...createRange(Math.max(1, totalVisible.value - 1), start.value), props.ellipsis, length.value];
14814
+ } else if (page.value - right >= 0) {
14815
+ const rangeLength = totalVisible.value - 1;
14339
14816
  const rangeStart = length.value - rangeLength + start.value;
14340
14817
  return [start.value, props.ellipsis, ...createRange(rangeLength, rangeStart)];
14341
14818
  } else {
14342
- const rangeLength = Math.max(1, totalVisible.value - 4);
14819
+ const rangeLength = Math.max(1, totalVisible.value - 3);
14343
14820
  const rangeStart = rangeLength === 1 ? page.value : page.value - Math.ceil(rangeLength / 2) + start.value;
14344
14821
  return [start.value, props.ellipsis, ...createRange(rangeLength, rangeStart), props.ellipsis, length.value];
14345
14822
  }
@@ -14682,7 +15159,7 @@
14682
15159
 
14683
15160
  });
14684
15161
 
14685
- const VRadio = vue.defineComponent({
15162
+ const VRadio = defineComponent({
14686
15163
  name: 'VRadio',
14687
15164
  props: {
14688
15165
  falseIcon: {
@@ -14710,7 +15187,7 @@
14710
15187
 
14711
15188
  });
14712
15189
 
14713
- const VRadioGroup = vue.defineComponent({
15190
+ const VRadioGroup = defineComponent({
14714
15191
  name: 'VRadioGroup',
14715
15192
  inheritAttrs: false,
14716
15193
  props: {
@@ -14779,7 +15256,7 @@
14779
15256
 
14780
15257
  });
14781
15258
 
14782
- const VRangeSlider = vue.defineComponent({
15259
+ const VRangeSlider = defineComponent({
14783
15260
  name: 'VRangeSlider',
14784
15261
  props: { ...makeFocusProps(),
14785
15262
  ...makeVInputProps(),
@@ -15166,6 +15643,12 @@
15166
15643
  }, null)]);
15167
15644
  }
15168
15645
 
15646
+ function createLabel(labelProps) {
15647
+ if (slots['item-label']) return slots['item-label'](labelProps);
15648
+ if (labelProps.label) return vue.createVNode("span", null, [labelProps.label]);
15649
+ return vue.createVNode("span", null, [vue.createTextVNode("\xA0")]);
15650
+ }
15651
+
15169
15652
  return () => {
15170
15653
  var _props$itemLabels;
15171
15654
 
@@ -15185,11 +15668,11 @@
15185
15668
 
15186
15669
  return vue.createVNode("div", {
15187
15670
  "class": "v-rating__wrapper"
15188
- }, [!hasLabels ? undefined : slots['item-label'] ? slots['item-label']({
15671
+ }, [hasLabels && props.itemLabelPosition === 'top' ? createLabel({
15189
15672
  value,
15190
15673
  index: i,
15191
15674
  label: (_props$itemLabels2 = props.itemLabels) == null ? void 0 : _props$itemLabels2[i]
15192
- }) : (_props$itemLabels3 = props.itemLabels) != null && _props$itemLabels3[i] ? vue.createVNode("span", null, [props.itemLabels[i]]) : vue.createVNode("span", null, [vue.createTextVNode("\xA0")]), vue.createVNode("div", {
15675
+ }) : undefined, vue.createVNode("div", {
15193
15676
  "class": ['v-rating__item', {
15194
15677
  'v-rating__item--focused': Math.ceil(focusIndex.value) === value
15195
15678
  }]
@@ -15202,7 +15685,11 @@
15202
15685
  }, null)]) : vue.createVNode(VRatingItem, {
15203
15686
  "value": value,
15204
15687
  "index": i
15205
- }, null)])]);
15688
+ }, null)]), hasLabels && props.itemLabelPosition === 'bottom' ? createLabel({
15689
+ value,
15690
+ index: i,
15691
+ label: (_props$itemLabels3 = props.itemLabels) == null ? void 0 : _props$itemLabels3[i]
15692
+ }) : undefined]);
15206
15693
  })]
15207
15694
  });
15208
15695
  };
@@ -15268,10 +15755,6 @@
15268
15755
  const VSlideGroup = defineComponent({
15269
15756
  name: 'VSlideGroup',
15270
15757
  props: {
15271
- activeClass: {
15272
- type: String,
15273
- default: 'v-slide-item--active'
15274
- },
15275
15758
  centerActive: Boolean,
15276
15759
  direction: {
15277
15760
  type: String,
@@ -15294,7 +15777,9 @@
15294
15777
  validator: v => typeof v === 'boolean' || ['always', 'desktop', 'mobile'].includes(v)
15295
15778
  },
15296
15779
  ...makeTagProps(),
15297
- ...makeGroupProps()
15780
+ ...makeGroupProps({
15781
+ selectedClass: 'v-slide-group-item--active'
15782
+ })
15298
15783
  },
15299
15784
  emits: {
15300
15785
  'update:modelValue': value => true
@@ -15320,21 +15805,31 @@
15320
15805
  resizeRef: containerRef,
15321
15806
  contentRect: containerRect
15322
15807
  } = useResizeObserver();
15323
- const contentRef = vue.ref();
15808
+ const {
15809
+ resizeRef: contentRef,
15810
+ contentRect
15811
+ } = useResizeObserver();
15324
15812
  vue.watchEffect(() => {
15325
- if (!containerRect.value || !contentRef.value) return;
15813
+ if (!containerRect.value || !contentRect.value) return;
15326
15814
  const sizeProperty = isHorizontal.value ? 'width' : 'height';
15327
15815
  containerSize.value = containerRect.value[sizeProperty];
15328
- contentSize.value = contentRef.value.getBoundingClientRect()[sizeProperty];
15816
+ contentSize.value = contentRect.value[sizeProperty];
15329
15817
  isOverflowing.value = containerSize.value + 1 < contentSize.value;
15330
15818
  });
15331
- vue.watch(group.selected, selected => {
15332
- if (!selected.length || !contentRef.value) return;
15333
- const index = group.items.value.findIndex(item => item.id === selected[selected.length - 1]); // TODO: Is this too naive? Should we store element references in group composable?
15819
+ const firstSelectedIndex = vue.computed(() => {
15820
+ if (!group.selected.value.length) return -1;
15821
+ return group.items.value.findIndex(item => item.id === group.selected.value[0]);
15822
+ });
15823
+ const lastSelectedIndex = vue.computed(() => {
15824
+ if (!group.selected.value.length) return -1;
15825
+ return group.items.value.findIndex(item => item.id === group.selected.value[group.selected.value.length - 1]);
15826
+ });
15827
+ vue.watch(group.selected, () => {
15828
+ if (firstSelectedIndex.value < 0 || !contentRef.value) return; // TODO: Is this too naive? Should we store element references in group composable?
15334
15829
 
15335
- const selectedElement = contentRef.value.children[index];
15830
+ const selectedElement = contentRef.value.children[lastSelectedIndex.value];
15336
15831
 
15337
- if (index === 0 || !isOverflowing.value) {
15832
+ if (firstSelectedIndex.value === 0 || !isOverflowing.value) {
15338
15833
  scrollOffset.value = 0;
15339
15834
  } else if (props.centerActive) {
15340
15835
  scrollOffset.value = calculateCenteredOffset({
@@ -15355,6 +15850,20 @@
15355
15850
  });
15356
15851
  }
15357
15852
  });
15853
+ let firstOverflow = true;
15854
+ vue.watch(isOverflowing, () => {
15855
+ if (!firstOverflow || !contentRef.value || firstSelectedIndex.value < 0) return;
15856
+ firstOverflow = false; // TODO: Is this too naive? Should we store element references in group composable?
15857
+
15858
+ const selectedElement = contentRef.value.children[firstSelectedIndex.value];
15859
+ scrollOffset.value = calculateCenteredOffset({
15860
+ selectedElement,
15861
+ containerSize: containerSize.value,
15862
+ contentSize: contentSize.value,
15863
+ isRtl: isRtl.value,
15864
+ isHorizontal: isHorizontal.value
15865
+ });
15866
+ });
15358
15867
  const disableTransition = vue.ref(false);
15359
15868
  let startTouch = 0;
15360
15869
  let startOffset = 0;
@@ -15502,7 +16011,7 @@
15502
16011
  // Always show arrows on desktop
15503
16012
 
15504
16013
  case 'desktop':
15505
- return mobile.value;
16014
+ return !mobile.value;
15506
16015
  // Show arrows on mobile when overflowing.
15507
16016
  // This matches the default 2.2 behavior
15508
16017
 
@@ -15601,7 +16110,9 @@
15601
16110
 
15602
16111
  return (_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots, {
15603
16112
  isSelected: slideGroupItem.isSelected.value,
15604
- select: slideGroupItem.select
16113
+ select: slideGroupItem.select,
16114
+ toggle: slideGroupItem.toggle,
16115
+ selectedClass: slideGroupItem.selectedClass.value
15605
16116
  });
15606
16117
  };
15607
16118
  }
@@ -15625,6 +16136,7 @@
15625
16136
  vertical: Boolean,
15626
16137
  modelValue: Boolean,
15627
16138
  ...makePositionProps(),
16139
+ ...makeRoundedProps(),
15628
16140
  ...makeVariantProps(),
15629
16141
  ...makeTransitionProps({
15630
16142
  transition: 'v-snackbar-transition'
@@ -15648,6 +16160,9 @@
15648
16160
  colorStyles,
15649
16161
  variantClasses
15650
16162
  } = useVariant(props);
16163
+ const {
16164
+ roundedClasses
16165
+ } = useRounded(props);
15651
16166
  vue.watch(isActive, startTimeout);
15652
16167
  vue.watch(() => props.timeout, startTimeout);
15653
16168
  vue.onMounted(() => {
@@ -15671,7 +16186,9 @@
15671
16186
  useRender(() => {
15672
16187
  var _slots$default, _slots$actions;
15673
16188
 
15674
- return vue.createVNode("div", {
16189
+ return vue.createVNode(VOverlay, {
16190
+ "modelValue": isActive.value,
16191
+ "onUpdate:modelValue": $event => isActive.value = $event,
15675
16192
  "class": ['v-snackbar', {
15676
16193
  'v-snackbar--active': isActive.value,
15677
16194
  'v-snackbar--bottom': props.bottom || !props.top,
@@ -15682,12 +16199,15 @@
15682
16199
  'v-snackbar--top': props.top,
15683
16200
  'v-snackbar--vertical': props.vertical
15684
16201
  }, positionClasses.value],
15685
- "style": [colorStyles.value, positionStyles.value]
15686
- }, [vue.createVNode(MaybeTransition, {
16202
+ "style": [colorStyles.value, positionStyles.value],
16203
+ "persistent": true,
16204
+ "noClickAnimation": true,
16205
+ "scrim": false,
16206
+ "scrollStrategy": "none",
15687
16207
  "transition": props.transition
15688
16208
  }, {
15689
- default: () => [vue.withDirectives(vue.createVNode("div", {
15690
- "class": ['v-snackbar__wrapper', colorClasses.value, variantClasses.value],
16209
+ default: () => [vue.createVNode("div", {
16210
+ "class": ['v-snackbar__wrapper', colorClasses.value, roundedClasses.value, variantClasses.value],
15691
16211
  "onPointerenter": onPointerenter,
15692
16212
  "onPointerleave": startTimeout
15693
16213
  }, [genOverlays(false, 'v-snackbar'), slots.default && vue.createVNode("div", {
@@ -15705,21 +16225,25 @@
15705
16225
  default: () => [vue.createVNode("div", {
15706
16226
  "class": "v-snackbar__actions"
15707
16227
  }, [(_slots$actions = slots.actions) == null ? void 0 : _slots$actions.call(slots)])]
15708
- })]), [[vue.vShow, isActive.value]])]
15709
- })]);
16228
+ })])],
16229
+ activator: slots.activator
16230
+ });
15710
16231
  });
15711
16232
  }
15712
16233
 
15713
16234
  });
15714
16235
 
15715
- const VSwitch = vue.defineComponent({
16236
+ const VSwitch = defineComponent({
15716
16237
  name: 'VSwitch',
15717
16238
  inheritAttrs: false,
15718
16239
  props: {
15719
16240
  indeterminate: Boolean,
15720
16241
  inset: Boolean,
15721
16242
  flat: Boolean,
15722
- ...makeLoaderProps(),
16243
+ loading: {
16244
+ type: [Boolean, String],
16245
+ default: false
16246
+ },
15723
16247
  ...makeVInputProps(),
15724
16248
  ...makeSelectionControlProps()
15725
16249
  },
@@ -15779,7 +16303,7 @@
15779
16303
  "aria-checked": indeterminate.value ? 'mixed' : undefined,
15780
16304
  "disabled": isDisabled.value,
15781
16305
  "readonly": isReadonly.value
15782
- }, controlAttrs), {
16306
+ }, controlAttrs), { ...slots,
15783
16307
  default: () => vue.createVNode("div", {
15784
16308
  "class": "v-switch__track",
15785
16309
  "onClick": onClick
@@ -15817,10 +16341,10 @@
15817
16341
  name: 'VSystemBar',
15818
16342
  props: {
15819
16343
  color: String,
16344
+ height: [Number, String],
15820
16345
  window: Boolean,
15821
- ...makeDimensionProps(),
15822
16346
  ...makeElevationProps(),
15823
- ...makePositionProps(),
16347
+ ...makeLayoutItemProps(),
15824
16348
  ...makeRoundedProps(),
15825
16349
  ...makeTagProps(),
15826
16350
  ...makeThemeProps()
@@ -15837,29 +16361,48 @@
15837
16361
  backgroundColorClasses,
15838
16362
  backgroundColorStyles
15839
16363
  } = useBackgroundColor(vue.toRef(props, 'color'));
15840
- const {
15841
- dimensionStyles
15842
- } = useDimension(props);
15843
16364
  const {
15844
16365
  elevationClasses
15845
16366
  } = useElevation(props);
15846
- const {
15847
- positionClasses,
15848
- positionStyles
15849
- } = usePosition(props);
15850
16367
  const {
15851
16368
  roundedClasses
15852
16369
  } = useRounded(props);
16370
+ const height = vue.computed(() => {
16371
+ var _props$height;
16372
+
16373
+ return ((_props$height = props.height) != null ? _props$height : props.window) ? 32 : 24;
16374
+ });
16375
+ const {
16376
+ layoutItemStyles
16377
+ } = useLayoutItem({
16378
+ id: props.name,
16379
+ priority: vue.computed(() => parseInt(props.priority, 10)),
16380
+ position: vue.ref('top'),
16381
+ layoutSize: height,
16382
+ elementSize: height,
16383
+ active: vue.computed(() => true),
16384
+ absolute: vue.toRef(props, 'absolute')
16385
+ });
16386
+ provideDefaults({
16387
+ VBtn: {
16388
+ variant: 'text',
16389
+ density: 'compact'
16390
+ }
16391
+ }, {
16392
+ scoped: true
16393
+ });
15853
16394
  return () => vue.createVNode(props.tag, {
15854
16395
  "class": ['v-system-bar', {
15855
16396
  'v-system-bar--window': props.window
15856
- }, themeClasses.value, backgroundColorClasses.value, elevationClasses.value, positionClasses.value, roundedClasses.value],
15857
- "style": [backgroundColorStyles.value, dimensionStyles.value, positionStyles.value]
16397
+ }, themeClasses.value, backgroundColorClasses.value, elevationClasses.value, roundedClasses.value],
16398
+ "style": [backgroundColorStyles.value, layoutItemStyles.value]
15858
16399
  }, slots);
15859
16400
  }
15860
16401
 
15861
16402
  });
15862
16403
 
16404
+ const VTabsSymbol = Symbol.for('vuetify:v-tabs');
16405
+
15863
16406
  const VTab = defineComponent({
15864
16407
  name: 'VTab',
15865
16408
  props: {
@@ -15893,31 +16436,22 @@
15893
16436
  slots,
15894
16437
  attrs
15895
16438
  } = _ref;
15896
- const {
15897
- isSelected,
15898
- select,
15899
- selectedClass
15900
- } = useGroupItem(props, VTabsSymbol);
15901
16439
  const {
15902
16440
  textColorClasses: sliderColorClasses,
15903
16441
  textColorStyles: sliderColorStyles
15904
16442
  } = useTextColor(props, 'sliderColor');
15905
16443
  const isHorizontal = vue.computed(() => props.direction === 'horizontal');
15906
- provideDefaults({
15907
- VBtn: {
15908
- block: vue.toRef(props, 'fixed'),
15909
- maxWidth: vue.computed(() => props.fixed ? 300 : undefined),
15910
- color: vue.computed(() => isSelected.value ? props.color : undefined),
15911
- variant: 'text',
15912
- rounded: 0
15913
- }
15914
- }, {
15915
- scoped: true
15916
- });
16444
+ const isSelected = vue.ref(false);
15917
16445
  const rootEl = vue.ref();
15918
16446
  const sliderEl = vue.ref();
15919
- vue.watch(isSelected, isSelected => {
15920
- if (isSelected) {
16447
+
16448
+ function updateSlider(_ref2) {
16449
+ let {
16450
+ value
16451
+ } = _ref2;
16452
+ isSelected.value = value;
16453
+
16454
+ if (value) {
15921
16455
  var _rootEl$value, _rootEl$value$$el$par;
15922
16456
 
15923
16457
  const prevEl = (_rootEl$value = rootEl.value) == null ? void 0 : (_rootEl$value$$el$par = _rootEl$value.$el.parentElement) == null ? void 0 : _rootEl$value$$el$par.querySelector('.v-tab--selected .v-tab__slider');
@@ -15947,17 +16481,25 @@
15947
16481
  easing: standardEasing
15948
16482
  });
15949
16483
  }
15950
- });
16484
+ }
16485
+
15951
16486
  useRender(() => {
15952
- const [btnProps] = pick(props, ['href', 'to', 'replace', 'icon', 'stacked', 'prependIcon', 'appendIcon', 'ripple', 'theme', 'disabled']);
16487
+ const [btnProps] = pick(props, ['href', 'to', 'replace', 'icon', 'stacked', 'prependIcon', 'appendIcon', 'ripple', 'theme', 'disabled', 'selectedClass', 'value', 'color']);
15953
16488
  return vue.createVNode(VBtn, vue.mergeProps({
16489
+ "_as": "VTab",
16490
+ "symbol": VTabsSymbol,
15954
16491
  "ref": rootEl,
15955
- "class": ['v-tab', selectedClass.value],
16492
+ "class": ['v-tab'],
15956
16493
  "tabindex": isSelected.value ? 0 : -1,
15957
16494
  "role": "tab",
15958
16495
  "aria-selected": String(isSelected.value),
15959
- "onClick": () => !props.disabled && select(!isSelected.value)
15960
- }, btnProps, attrs), {
16496
+ "block": props.fixed,
16497
+ "maxWidth": props.fixed ? 300 : undefined,
16498
+ "variant": "text",
16499
+ "rounded": 0
16500
+ }, btnProps, attrs, {
16501
+ "onGroup:selected": updateSlider
16502
+ }), {
15961
16503
  default: () => [slots.default ? slots.default() : props.title, !props.hideSlider && vue.createVNode("div", {
15962
16504
  "ref": sliderEl,
15963
16505
  "class": ['v-tab__slider', sliderColorClasses.value],
@@ -15965,9 +16507,7 @@
15965
16507
  }, null)]
15966
16508
  });
15967
16509
  });
15968
- return {
15969
- isSelected
15970
- };
16510
+ return {};
15971
16511
  }
15972
16512
 
15973
16513
  });
@@ -15983,7 +16523,6 @@
15983
16523
  });
15984
16524
  }
15985
16525
 
15986
- const VTabsSymbol = Symbol.for('vuetify:v-tabs');
15987
16526
  const VTabs = defineComponent({
15988
16527
  name: 'VTabs',
15989
16528
  props: {
@@ -16008,7 +16547,7 @@
16008
16547
  },
16009
16548
  hideSlider: Boolean,
16010
16549
  optional: Boolean,
16011
- right: Boolean,
16550
+ end: Boolean,
16012
16551
  sliderColor: String,
16013
16552
  modelValue: null,
16014
16553
  ...makeDensityProps(),
@@ -16047,7 +16586,7 @@
16047
16586
  'v-tabs--centered': props.centered,
16048
16587
  'v-tabs--fixed-tabs': props.fixedTabs,
16049
16588
  'v-tabs--grow': props.grow,
16050
- 'v-tabs--right': props.right,
16589
+ 'v-tabs--end': props.end,
16051
16590
  'v-tabs--stacked': props.stacked
16052
16591
  }, densityClasses.value, backgroundColorClasses.value],
16053
16592
  "style": backgroundColorStyles.value,
@@ -16361,7 +16900,96 @@
16361
16900
 
16362
16901
  const VTimelineSymbol = Symbol.for('vuetify:timeline');
16363
16902
 
16364
- const VTimelineDivider = vue.defineComponent({
16903
+ const VTimeline = defineComponent({
16904
+ name: 'VTimeline',
16905
+ props: {
16906
+ align: {
16907
+ type: String,
16908
+ default: 'center',
16909
+ validator: v => ['center', 'start'].includes(v)
16910
+ },
16911
+ direction: {
16912
+ type: String,
16913
+ default: 'vertical',
16914
+ validator: v => ['vertical', 'horizontal'].includes(v)
16915
+ },
16916
+ side: {
16917
+ type: String,
16918
+ validator: v => v == null || ['start', 'end'].includes(v)
16919
+ },
16920
+ lineInset: {
16921
+ type: [String, Number],
16922
+ default: 0
16923
+ },
16924
+ lineThickness: {
16925
+ type: [String, Number],
16926
+ default: 2
16927
+ },
16928
+ lineColor: String,
16929
+ truncateLine: {
16930
+ type: String,
16931
+ validator: v => ['start', 'end', 'both'].includes(v)
16932
+ },
16933
+ ...makeDensityProps(),
16934
+ ...makeTagProps(),
16935
+ ...makeThemeProps()
16936
+ },
16937
+
16938
+ setup(props, _ref) {
16939
+ let {
16940
+ slots
16941
+ } = _ref;
16942
+ const {
16943
+ themeClasses
16944
+ } = provideTheme(props);
16945
+ const {
16946
+ densityClasses
16947
+ } = useDensity(props);
16948
+ vue.provide(VTimelineSymbol, {
16949
+ density: vue.toRef(props, 'density'),
16950
+ lineColor: vue.toRef(props, 'lineColor')
16951
+ });
16952
+ const sideClass = vue.computed(() => {
16953
+ const side = props.side ? props.side : props.density !== 'default' ? 'end' : null;
16954
+ return side && `v-timeline--side-${side}`;
16955
+ });
16956
+ const truncateClasses = vue.computed(() => {
16957
+ const classes = ['v-timeline--truncate-line-start', 'v-timeline--truncate-line-end'];
16958
+
16959
+ switch (props.truncateLine) {
16960
+ case 'both':
16961
+ return classes;
16962
+
16963
+ case 'start':
16964
+ return classes[0];
16965
+
16966
+ case 'end':
16967
+ return classes[1];
16968
+
16969
+ default:
16970
+ return null;
16971
+ }
16972
+ });
16973
+ return () => {
16974
+ var _slots$default;
16975
+
16976
+ return vue.createVNode(props.tag, {
16977
+ "class": ['v-timeline', `v-timeline--${props.direction}`, `v-timeline--align-${props.align}`, !props.lineInset && truncateClasses.value, {
16978
+ 'v-timeline--inset-line': !!props.lineInset
16979
+ }, themeClasses.value, densityClasses.value, sideClass.value],
16980
+ "style": {
16981
+ '--v-timeline-line-thickness': convertToUnit(props.lineThickness),
16982
+ '--v-timeline-line-inset': convertToUnit(props.lineInset)
16983
+ }
16984
+ }, {
16985
+ default: () => [(_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots)]
16986
+ });
16987
+ };
16988
+ }
16989
+
16990
+ });
16991
+
16992
+ const VTimelineDivider = defineComponent({
16365
16993
  name: 'VTimelineDivider',
16366
16994
  props: {
16367
16995
  hideDot: Boolean,
@@ -16496,77 +17124,6 @@
16496
17124
 
16497
17125
  });
16498
17126
 
16499
- const VTimeline = defineComponent({
16500
- name: 'VTimeline',
16501
- props: {
16502
- direction: {
16503
- type: String,
16504
- default: 'vertical',
16505
- validator: v => ['vertical', 'horizontal'].includes(v)
16506
- },
16507
- side: {
16508
- type: String,
16509
- validator: v => v == null || ['start', 'end'].includes(v)
16510
- },
16511
- lineInset: {
16512
- type: [String, Number],
16513
- default: 0
16514
- },
16515
- lineThickness: {
16516
- type: [String, Number],
16517
- default: 2
16518
- },
16519
- lineColor: String,
16520
- truncateLine: {
16521
- type: String,
16522
- default: 'start',
16523
- validator: v => ['none', 'start', 'end', 'both'].includes(v)
16524
- },
16525
- ...makeDensityProps(),
16526
- ...makeTagProps(),
16527
- ...makeThemeProps()
16528
- },
16529
-
16530
- setup(props, _ref) {
16531
- let {
16532
- slots
16533
- } = _ref;
16534
- const {
16535
- themeClasses
16536
- } = provideTheme(props);
16537
- const {
16538
- densityClasses
16539
- } = useDensity(props);
16540
- vue.provide(VTimelineSymbol, {
16541
- density: vue.toRef(props, 'density'),
16542
- lineColor: vue.toRef(props, 'lineColor')
16543
- });
16544
- const sideClass = vue.computed(() => {
16545
- const side = props.side ? props.side : props.density !== 'default' ? 'end' : null;
16546
- return side && `v-timeline--side-${side}`;
16547
- });
16548
- return () => {
16549
- var _slots$default;
16550
-
16551
- return vue.createVNode(props.tag, {
16552
- "class": ['v-timeline', `v-timeline--${props.direction}`, {
16553
- 'v-timeline--inset-line': !!props.lineInset,
16554
- 'v-timeline--truncate-line-end': props.truncateLine === 'end' || props.truncateLine === 'both'
16555
- }, themeClasses.value, densityClasses.value, sideClass.value],
16556
- "style": {
16557
- '--v-timeline-line-thickness': convertToUnit(props.lineThickness),
16558
- '--v-timeline-line-inset': convertToUnit(props.lineInset)
16559
- }
16560
- }, {
16561
- default: () => [(props.truncateLine === 'none' || props.truncateLine === 'end') && vue.createVNode(VTimelineItem, {
16562
- "hideDot": true
16563
- }, null), (_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots)]
16564
- });
16565
- };
16566
- }
16567
-
16568
- });
16569
-
16570
17127
  const VTooltip = genericComponent()({
16571
17128
  name: 'VTooltip',
16572
17129
  inheritAttrs: false,
@@ -16684,6 +17241,8 @@
16684
17241
  VBadge: VBadge,
16685
17242
  VBanner: VBanner,
16686
17243
  VBannerActions: VBannerActions,
17244
+ VBannerAvatar: VBannerAvatar,
17245
+ VBannerIcon: VBannerIcon,
16687
17246
  VBannerText: VBannerText,
16688
17247
  VBottomNavigation: VBottomNavigation,
16689
17248
  VBreadcrumbs: VBreadcrumbs,
@@ -16695,6 +17254,7 @@
16695
17254
  VCard: VCard,
16696
17255
  VCardActions: VCardActions,
16697
17256
  VCardAvatar: VCardAvatar,
17257
+ VCardContent: VCardContent,
16698
17258
  VCardHeader: VCardHeader,
16699
17259
  VCardHeaderText: VCardHeaderText,
16700
17260
  VCardImg: VCardImg,
@@ -16745,8 +17305,10 @@
16745
17305
  VListSubheader: VListSubheader,
16746
17306
  VListImg: VListImg,
16747
17307
  VListItem: VListItem,
17308
+ VListItemAction: VListItemAction,
16748
17309
  VListItemAvatar: VListItemAvatar,
16749
17310
  VListItemHeader: VListItemHeader,
17311
+ VListItemIcon: VListItemIcon,
16750
17312
  VListItemMedia: VListItemMedia,
16751
17313
  VListItemSubtitle: VListItemSubtitle,
16752
17314
  VListItemTitle: VListItemTitle,
@@ -17016,19 +17578,24 @@
17016
17578
 
17017
17579
  const install = app => {
17018
17580
  const {
17581
+ aliases: aliases$1 = {},
17019
17582
  components = {},
17020
17583
  directives = {},
17021
17584
  icons = {}
17022
17585
  } = options;
17023
17586
 
17024
17587
  for (const key in directives) {
17025
- const directive = directives[key];
17026
- app.directive(key, directive);
17588
+ app.directive(key, directives[key]);
17027
17589
  }
17028
17590
 
17029
17591
  for (const key in components) {
17030
- const component = components[key];
17031
- app.component(key, component);
17592
+ app.component(key, components[key]);
17593
+ }
17594
+
17595
+ for (const key in aliases$1) {
17596
+ app.component(key, defineComponent({ ...aliases$1[key],
17597
+ name: key
17598
+ }));
17032
17599
  }
17033
17600
 
17034
17601
  app.provide(DefaultsSymbol, createDefaults(options.defaults));
@@ -17039,7 +17606,7 @@
17039
17606
  sets: { ...defaultSets,
17040
17607
  mdi
17041
17608
  },
17042
- aliases
17609
+ aliases: aliases
17043
17610
  }, icons));
17044
17611
  const {
17045
17612
  adapter,
@@ -17089,7 +17656,7 @@
17089
17656
  ...options
17090
17657
  });
17091
17658
  };
17092
- const version = "3.0.0-beta.0";
17659
+ const version = "3.0.0-beta.2";
17093
17660
 
17094
17661
  exports.components = components;
17095
17662
  exports.createVuetify = createVuetify;