vuetify 3.1.2 → 3.1.3

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 (105) hide show
  1. package/dist/json/attributes.json +450 -450
  2. package/dist/json/importMap.json +44 -44
  3. package/dist/json/tags.json +1 -1
  4. package/dist/json/web-types.json +815 -805
  5. package/dist/vuetify-labs.css +250 -246
  6. package/dist/vuetify-labs.d.ts +205 -174
  7. package/dist/vuetify-labs.esm.js +244 -170
  8. package/dist/vuetify-labs.esm.js.map +1 -1
  9. package/dist/vuetify-labs.js +243 -169
  10. package/dist/vuetify-labs.min.css +2 -2
  11. package/dist/vuetify.css +29 -25
  12. package/dist/vuetify.d.ts +206 -186
  13. package/dist/vuetify.esm.js +221 -162
  14. package/dist/vuetify.esm.js.map +1 -1
  15. package/dist/vuetify.js +220 -161
  16. package/dist/vuetify.js.map +1 -1
  17. package/dist/vuetify.min.css +2 -2
  18. package/dist/vuetify.min.js +700 -692
  19. package/dist/vuetify.min.js.map +1 -1
  20. package/lib/blueprints/index.d.ts +2 -2
  21. package/lib/blueprints/md1.d.ts +2 -2
  22. package/lib/blueprints/md2.d.ts +2 -2
  23. package/lib/blueprints/md3.d.ts +2 -2
  24. package/lib/components/VAutocomplete/VAutocomplete.mjs +3 -2
  25. package/lib/components/VAutocomplete/VAutocomplete.mjs.map +1 -1
  26. package/lib/components/VAutocomplete/index.d.ts +43 -20
  27. package/lib/components/VBtn/VBtn.mjs +8 -3
  28. package/lib/components/VBtn/VBtn.mjs.map +1 -1
  29. package/lib/components/VCombobox/VCombobox.mjs +3 -3
  30. package/lib/components/VCombobox/VCombobox.mjs.map +1 -1
  31. package/lib/components/VCombobox/index.d.ts +43 -20
  32. package/lib/components/VDefaultsProvider/index.d.ts +5 -4
  33. package/lib/components/VDialog/VDialog.mjs +6 -5
  34. package/lib/components/VDialog/VDialog.mjs.map +1 -1
  35. package/lib/components/VDialog/index.d.ts +57 -34
  36. package/lib/components/VDivider/VDivider.mjs +6 -6
  37. package/lib/components/VDivider/VDivider.mjs.map +1 -1
  38. package/lib/components/VField/VField.mjs +28 -26
  39. package/lib/components/VField/VField.mjs.map +1 -1
  40. package/lib/components/VFileInput/VFileInput.mjs +7 -4
  41. package/lib/components/VFileInput/VFileInput.mjs.map +1 -1
  42. package/lib/components/VForm/index.d.ts +0 -3
  43. package/lib/components/VList/VList.mjs +4 -1
  44. package/lib/components/VList/VList.mjs.map +1 -1
  45. package/lib/components/VList/VListItem.mjs +29 -19
  46. package/lib/components/VList/VListItem.mjs.map +1 -1
  47. package/lib/components/VMenu/VMenu.mjs +6 -5
  48. package/lib/components/VMenu/VMenu.mjs.map +1 -1
  49. package/lib/components/VMenu/index.d.ts +57 -34
  50. package/lib/components/VNavigationDrawer/VNavigationDrawer.css +4 -0
  51. package/lib/components/VNavigationDrawer/VNavigationDrawer.mjs +1 -1
  52. package/lib/components/VNavigationDrawer/VNavigationDrawer.mjs.map +1 -1
  53. package/lib/components/VNavigationDrawer/VNavigationDrawer.sass +4 -0
  54. package/lib/components/VNavigationDrawer/index.d.ts +3 -3
  55. package/lib/components/VNavigationDrawer/touch.mjs +7 -6
  56. package/lib/components/VNavigationDrawer/touch.mjs.map +1 -1
  57. package/lib/components/VOverlay/index.d.ts +34 -11
  58. package/lib/components/VOverlay/locationStrategies.mjs +40 -29
  59. package/lib/components/VOverlay/locationStrategies.mjs.map +1 -1
  60. package/lib/components/VOverlay/scrollStrategies.mjs +25 -16
  61. package/lib/components/VOverlay/scrollStrategies.mjs.map +1 -1
  62. package/lib/components/VPagination/VPagination.mjs +1 -1
  63. package/lib/components/VPagination/VPagination.mjs.map +1 -1
  64. package/lib/components/VSelect/VSelect.mjs +3 -4
  65. package/lib/components/VSelect/VSelect.mjs.map +1 -1
  66. package/lib/components/VSelect/index.d.ts +43 -20
  67. package/lib/components/VSnackbar/index.d.ts +42 -19
  68. package/lib/components/VTable/VTable.css +4 -4
  69. package/lib/components/VTable/VTable.sass +2 -2
  70. package/lib/components/VTooltip/VTooltip.mjs +4 -3
  71. package/lib/components/VTooltip/VTooltip.mjs.map +1 -1
  72. package/lib/components/VTooltip/index.d.ts +57 -34
  73. package/lib/components/index.d.ts +195 -174
  74. package/lib/composables/defaults.mjs +1 -1
  75. package/lib/composables/defaults.mjs.map +1 -1
  76. package/lib/composables/form.mjs +0 -1
  77. package/lib/composables/form.mjs.map +1 -1
  78. package/lib/composables/toggleScope.mjs +14 -7
  79. package/lib/composables/toggleScope.mjs.map +1 -1
  80. package/lib/entry-bundler.mjs +1 -1
  81. package/lib/framework.mjs +1 -1
  82. package/lib/index.d.ts +14 -14
  83. package/lib/labs/VDataTable/VDataTable.mjs +2 -1
  84. package/lib/labs/VDataTable/VDataTable.mjs.map +1 -1
  85. package/lib/labs/VDataTable/VDataTableRows.mjs +1 -1
  86. package/lib/labs/VDataTable/VDataTableRows.mjs.map +1 -1
  87. package/lib/labs/VDataTable/VDataTableServer.mjs +19 -6
  88. package/lib/labs/VDataTable/VDataTableServer.mjs.map +1 -1
  89. package/lib/labs/VDataTable/VDataTableVirtual.mjs +2 -1
  90. package/lib/labs/VDataTable/VDataTableVirtual.mjs.map +1 -1
  91. package/lib/labs/VDataTable/composables/options.mjs +4 -2
  92. package/lib/labs/VDataTable/composables/options.mjs.map +1 -1
  93. package/lib/labs/VDataTable/index.d.ts +11 -0
  94. package/lib/labs/components.d.ts +11 -0
  95. package/lib/locale/adapters/vue-i18n.mjs +12 -2
  96. package/lib/locale/adapters/vue-i18n.mjs.map +1 -1
  97. package/lib/locale/en.mjs +2 -2
  98. package/lib/locale/en.mjs.map +1 -1
  99. package/lib/locale/sv.mjs +7 -7
  100. package/lib/locale/sv.mjs.map +1 -1
  101. package/lib/util/defineComponent.mjs +21 -18
  102. package/lib/util/defineComponent.mjs.map +1 -1
  103. package/lib/util/helpers.mjs +5 -1
  104. package/lib/util/helpers.mjs.map +1 -1
  105. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.1.2
2
+ * Vuetify v3.1.3
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -262,8 +262,12 @@
262
262
  }
263
263
  function toKebabCase() {
264
264
  let str = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
265
- return str.replace(/[^a-z]/gi, '-').replace(/\B([A-Z])/g, '-$1').toLowerCase();
265
+ if (toKebabCase.cache.has(str)) return toKebabCase.cache.get(str);
266
+ const kebab = str.replace(/[^a-z]/gi, '-').replace(/\B([A-Z])/g, '-$1').toLowerCase();
267
+ toKebabCase.cache.set(str, kebab);
268
+ return kebab;
266
269
  }
270
+ toKebabCase.cache = new Map();
267
271
  function findChildrenWithProvide(key, vnode) {
268
272
  if (!vnode || typeof vnode !== 'object') return [];
269
273
  if (Array.isArray(vnode)) {
@@ -890,7 +894,7 @@
890
894
 
891
895
  const DefaultsSymbol = Symbol.for('vuetify:defaults');
892
896
  function createDefaults(options) {
893
- return vue.ref(options ?? {});
897
+ return vue.ref(options);
894
898
  }
895
899
  function useDefaults() {
896
900
  const defaults = vue.inject(DefaultsSymbol);
@@ -922,23 +926,30 @@
922
926
  return newDefaults;
923
927
  }
924
928
 
925
- function useToggleScope(source, cb) {
929
+ function useToggleScope(source, fn) {
926
930
  let scope;
931
+ function start() {
932
+ scope = vue.effectScope();
933
+ scope.run(() => fn.length ? fn(() => {
934
+ var _scope;
935
+ (_scope = scope) == null ? void 0 : _scope.stop();
936
+ start();
937
+ }) : fn());
938
+ }
927
939
  vue.watch(source, active => {
928
940
  if (active && !scope) {
929
- scope = vue.effectScope();
930
- scope.run(cb);
941
+ start();
931
942
  } else if (!active) {
932
- var _scope;
933
- (_scope = scope) == null ? void 0 : _scope.stop();
943
+ var _scope2;
944
+ (_scope2 = scope) == null ? void 0 : _scope2.stop();
934
945
  scope = undefined;
935
946
  }
936
947
  }, {
937
948
  immediate: true
938
949
  });
939
950
  vue.onScopeDispose(() => {
940
- var _scope2;
941
- (_scope2 = scope) == null ? void 0 : _scope2.stop();
951
+ var _scope3;
952
+ (_scope3 = scope) == null ? void 0 : _scope3.stop();
942
953
  });
943
954
  }
944
955
 
@@ -1007,33 +1018,36 @@
1007
1018
  options.props = propsFactory(options.props, toKebabCase(options.name))();
1008
1019
  options.props._as = String;
1009
1020
  options.setup = function setup(props, ctx) {
1010
- const vm = vue.getCurrentInstance();
1011
1021
  const defaults = useDefaults();
1012
- const _subcomponentDefaults = vue.shallowRef();
1013
- const _props = vue.shallowReactive({
1014
- ...vue.toRaw(props)
1022
+
1023
+ // Skip props proxy if defaults are not provided
1024
+ if (!defaults.value) return options._setup(props, ctx);
1025
+ const vm = vue.getCurrentInstance();
1026
+ const componentDefaults = vue.computed(() => defaults.value[props._as ?? options.name]);
1027
+ const _props = new Proxy(props, {
1028
+ get(target, prop) {
1029
+ if (!propIsDefined(vm.vnode, prop)) {
1030
+ var _componentDefaults$va, _global;
1031
+ return ((_componentDefaults$va = componentDefaults.value) == null ? void 0 : _componentDefaults$va[prop]) ?? ((_global = defaults.value.global) == null ? void 0 : _global[prop]) ?? target[prop];
1032
+ }
1033
+ return Reflect.get(target, prop);
1034
+ }
1015
1035
  });
1036
+ const _subcomponentDefaults = vue.shallowRef();
1016
1037
  vue.watchEffect(() => {
1017
- const globalDefaults = defaults.value.global;
1018
- const componentDefaults = defaults.value[props._as ?? options.name];
1019
- if (componentDefaults) {
1020
- const subComponents = Object.entries(componentDefaults).filter(_ref => {
1038
+ if (componentDefaults.value) {
1039
+ const subComponents = Object.entries(componentDefaults.value).filter(_ref => {
1021
1040
  let [key] = _ref;
1022
1041
  return key.startsWith(key[0].toUpperCase());
1023
1042
  });
1024
1043
  if (subComponents.length) _subcomponentDefaults.value = Object.fromEntries(subComponents);
1025
1044
  }
1026
- for (const prop of Object.keys(props)) {
1027
- let newVal = props[prop];
1028
- if (!propIsDefined(vm.vnode, prop)) {
1029
- newVal = (componentDefaults == null ? void 0 : componentDefaults[prop]) ?? (globalDefaults == null ? void 0 : globalDefaults[prop]) ?? props[prop];
1030
- }
1031
- if (_props[prop] !== newVal) {
1032
- _props[prop] = newVal;
1033
- }
1034
- }
1035
1045
  });
1036
1046
  const setupBindings = options._setup(_props, ctx);
1047
+
1048
+ // If subcomponent defaults are provided, override any
1049
+ // subcomponents provided by the component's setup function.
1050
+ // This uses injectSelf so must be done after the original setup to work.
1037
1051
  useToggleScope(_subcomponentDefaults, () => {
1038
1052
  var _injectSelf;
1039
1053
  provideDefaults(mergeDeep(((_injectSelf = injectSelf(DefaultsSymbol)) == null ? void 0 : _injectSelf.value) ?? {}, _subcomponentDefaults.value));
@@ -1896,8 +1910,8 @@
1896
1910
  root: 'Pagination Navigation',
1897
1911
  next: 'Next page',
1898
1912
  previous: 'Previous page',
1899
- page: 'Goto Page {0}',
1900
- currentPage: 'Page {0}, Current Page',
1913
+ page: 'Go to page {0}',
1914
+ currentPage: 'Page {0}, Current page',
1901
1915
  first: 'First page',
1902
1916
  last: 'Last page'
1903
1917
  }
@@ -4861,14 +4875,18 @@
4861
4875
  const isElevated = vue.computed(() => {
4862
4876
  return props.variant === 'elevated' && !(props.disabled || props.flat || props.border);
4863
4877
  });
4878
+ const valueAttr = vue.computed(() => {
4879
+ if (props.value === undefined) return undefined;
4880
+ return Object(props.value) === props.value ? JSON.stringify(props.value, null, 0) : props.value;
4881
+ });
4864
4882
  useSelectLink(link, group == null ? void 0 : group.select);
4865
4883
  useRender(() => {
4866
- var _slots$prepend, _slots$default, _slots$append, _slots$loader;
4884
+ var _link$isActive2, _link$isActive3, _slots$prepend, _slots$default, _slots$append, _slots$loader;
4867
4885
  const Tag = link.isLink.value ? 'a' : props.tag;
4868
- const hasColor = !group || isActive.value;
4869
4886
  const hasPrepend = !!(props.prependIcon || slots.prepend);
4870
4887
  const hasAppend = !!(props.appendIcon || slots.append);
4871
4888
  const hasIcon = !!(props.icon && props.icon !== true);
4889
+ const hasColor = (group == null ? void 0 : group.isSelected.value) && (!link.isLink.value || ((_link$isActive2 = link.isActive) == null ? void 0 : _link$isActive2.value)) || !group || ((_link$isActive3 = link.isActive) == null ? void 0 : _link$isActive3.value);
4872
4890
  return vue.withDirectives(vue.createVNode(Tag, {
4873
4891
  "type": Tag === 'a' ? undefined : 'button',
4874
4892
  "class": ['v-btn', group == null ? void 0 : group.selectedClass.value, {
@@ -4889,7 +4907,8 @@
4889
4907
  if (isDisabled.value) return;
4890
4908
  (_link$navigate = link.navigate) == null ? void 0 : _link$navigate.call(link, e);
4891
4909
  group == null ? void 0 : group.toggle();
4892
- }
4910
+ },
4911
+ "value": valueAttr.value
4893
4912
  }, {
4894
4913
  default: () => [genOverlays(true, 'v-btn'), !props.icon && hasPrepend && vue.createVNode(VDefaultsProvider, {
4895
4914
  "key": "prepend",
@@ -5363,32 +5382,34 @@
5363
5382
  if (hasLabel.value) {
5364
5383
  const el = labelRef.value.$el;
5365
5384
  const targetEl = floatingLabelRef.value.$el;
5366
- const rect = nullifyTransforms(el);
5367
- const targetRect = targetEl.getBoundingClientRect();
5368
- const x = targetRect.x - rect.x;
5369
- const y = targetRect.y - rect.y - (rect.height / 2 - targetRect.height / 2);
5370
- const targetWidth = targetRect.width / 0.75;
5371
- const width = Math.abs(targetWidth - rect.width) > 1 ? {
5372
- maxWidth: convertToUnit(targetWidth)
5373
- } : undefined;
5374
- const style = getComputedStyle(el);
5375
- const targetStyle = getComputedStyle(targetEl);
5376
- const duration = parseFloat(style.transitionDuration) * 1000 || 150;
5377
- const scale = parseFloat(targetStyle.getPropertyValue('--v-field-label-scale'));
5378
- const color = targetStyle.getPropertyValue('color');
5379
- el.style.visibility = 'visible';
5380
- targetEl.style.visibility = 'hidden';
5381
- animate(el, {
5382
- transform: `translate(${x}px, ${y}px) scale(${scale})`,
5383
- color,
5384
- ...width
5385
- }, {
5386
- duration,
5387
- easing: standardEasing,
5388
- direction: val ? 'normal' : 'reverse'
5389
- }).finished.then(() => {
5390
- el.style.removeProperty('visibility');
5391
- targetEl.style.removeProperty('visibility');
5385
+ requestAnimationFrame(() => {
5386
+ const rect = nullifyTransforms(el);
5387
+ const targetRect = targetEl.getBoundingClientRect();
5388
+ const x = targetRect.x - rect.x;
5389
+ const y = targetRect.y - rect.y - (rect.height / 2 - targetRect.height / 2);
5390
+ const targetWidth = targetRect.width / 0.75;
5391
+ const width = Math.abs(targetWidth - rect.width) > 1 ? {
5392
+ maxWidth: convertToUnit(targetWidth)
5393
+ } : undefined;
5394
+ const style = getComputedStyle(el);
5395
+ const targetStyle = getComputedStyle(targetEl);
5396
+ const duration = parseFloat(style.transitionDuration) * 1000 || 150;
5397
+ const scale = parseFloat(targetStyle.getPropertyValue('--v-field-label-scale'));
5398
+ const color = targetStyle.getPropertyValue('color');
5399
+ el.style.visibility = 'visible';
5400
+ targetEl.style.visibility = 'hidden';
5401
+ animate(el, {
5402
+ transform: `translate(${x}px, ${y}px) scale(${scale})`,
5403
+ color,
5404
+ ...width
5405
+ }, {
5406
+ duration,
5407
+ easing: standardEasing,
5408
+ direction: val ? 'normal' : 'reverse'
5409
+ }).finished.then(() => {
5410
+ el.style.removeProperty('visibility');
5411
+ targetEl.style.removeProperty('visibility');
5412
+ });
5392
5413
  });
5393
5414
  }
5394
5415
  }, {
@@ -5577,7 +5598,6 @@
5577
5598
  const makeFormProps = propsFactory({
5578
5599
  disabled: Boolean,
5579
5600
  fastFail: Boolean,
5580
- lazyValidation: Boolean,
5581
5601
  readonly: Boolean,
5582
5602
  modelValue: {
5583
5603
  type: Boolean,
@@ -6981,9 +7001,9 @@
6981
7001
  themeClasses
6982
7002
  } = provideTheme(props);
6983
7003
  const {
6984
- backgroundColorClasses,
6985
- backgroundColorStyles
6986
- } = useBackgroundColor(vue.toRef(props, 'color'));
7004
+ textColorClasses,
7005
+ textColorStyles
7006
+ } = useTextColor(vue.toRef(props, 'color'));
6987
7007
  const dividerStyles = vue.computed(() => {
6988
7008
  const styles = {};
6989
7009
  if (props.length) {
@@ -6999,8 +7019,8 @@
6999
7019
  'v-divider': true,
7000
7020
  'v-divider--inset': props.inset,
7001
7021
  'v-divider--vertical': props.vertical
7002
- }, themeClasses.value, backgroundColorClasses.value],
7003
- "style": [dividerStyles.value, backgroundColorStyles.value],
7022
+ }, themeClasses.value, textColorClasses.value],
7023
+ "style": [dividerStyles.value, textColorStyles.value],
7004
7024
  "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
7005
7025
  "role": `${attrs.role || 'separator'}`
7006
7026
  }, null));
@@ -7710,7 +7730,7 @@
7710
7730
  }
7711
7731
  }
7712
7732
  useRender(() => {
7713
- var _slots$prepend, _slots$title, _slots$subtitle, _slots$default, _slots$append;
7733
+ var _slots$title, _slots$subtitle, _slots$default;
7714
7734
  const Tag = isLink.value ? 'a' : props.tag;
7715
7735
  const hasColor = !list || isSelected.value || isActive.value;
7716
7736
  const hasTitle = slots.title || props.title;
@@ -7733,7 +7753,18 @@
7733
7753
  "onClick": onClick,
7734
7754
  "onKeydown": isClickable.value && !isLink.value && onKeyDown
7735
7755
  }, {
7736
- default: () => [genOverlays(isClickable.value || isActive.value, 'v-list-item'), hasPrepend && vue.createVNode(VDefaultsProvider, {
7756
+ default: () => [genOverlays(isClickable.value || isActive.value, 'v-list-item'), hasPrepend && vue.createVNode("div", {
7757
+ "key": "prepend",
7758
+ "class": "v-list-item__prepend"
7759
+ }, [props.prependAvatar && vue.createVNode(VAvatar, {
7760
+ "key": "prepend-avatar",
7761
+ "density": props.density,
7762
+ "image": props.prependAvatar
7763
+ }, null), props.prependIcon && vue.createVNode(VIcon, {
7764
+ "key": "prepend-icon",
7765
+ "density": props.density,
7766
+ "icon": props.prependIcon
7767
+ }, null), slots.prepend && vue.createVNode(VDefaultsProvider, {
7737
7768
  "key": "prepend",
7738
7769
  "defaults": {
7739
7770
  VAvatar: {
@@ -7749,14 +7780,8 @@
7749
7780
  }
7750
7781
  }
7751
7782
  }, {
7752
- default: () => [vue.createVNode("div", {
7753
- "class": "v-list-item__prepend"
7754
- }, [props.prependAvatar && vue.createVNode(VAvatar, {
7755
- "key": "prepend-avatar"
7756
- }, null), props.prependIcon && vue.createVNode(VIcon, {
7757
- "key": "prepend-icon"
7758
- }, null), (_slots$prepend = slots.prepend) == null ? void 0 : _slots$prepend.call(slots, slotProps.value)])]
7759
- }), vue.createVNode("div", {
7783
+ default: () => [slots.prepend(slotProps.value)]
7784
+ })]), vue.createVNode("div", {
7760
7785
  "class": "v-list-item__content",
7761
7786
  "data-no-activator": ""
7762
7787
  }, [hasTitle && vue.createVNode(VListItemTitle, {
@@ -7771,7 +7796,10 @@
7771
7796
  default: () => [((_slots$subtitle = slots.subtitle) == null ? void 0 : _slots$subtitle.call(slots, {
7772
7797
  subtitle: props.subtitle
7773
7798
  })) ?? props.subtitle]
7774
- }), (_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots, slotProps.value)]), hasAppend && vue.createVNode(VDefaultsProvider, {
7799
+ }), (_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots, slotProps.value)]), hasAppend && vue.createVNode("div", {
7800
+ "key": "append",
7801
+ "class": "v-list-item__append"
7802
+ }, [slots.append && vue.createVNode(VDefaultsProvider, {
7775
7803
  "key": "append",
7776
7804
  "defaults": {
7777
7805
  VAvatar: {
@@ -7787,14 +7815,16 @@
7787
7815
  }
7788
7816
  }
7789
7817
  }, {
7790
- default: () => [vue.createVNode("div", {
7791
- "class": "v-list-item__append"
7792
- }, [(_slots$append = slots.append) == null ? void 0 : _slots$append.call(slots, slotProps.value), props.appendIcon && vue.createVNode(VIcon, {
7793
- "key": "append-icon"
7794
- }, null), props.appendAvatar && vue.createVNode(VAvatar, {
7795
- "key": "append-avatar"
7796
- }, null)])]
7797
- })]
7818
+ default: () => [slots.append(slotProps.value)]
7819
+ }), props.appendIcon && vue.createVNode(VIcon, {
7820
+ "key": "append-icon",
7821
+ "density": props.density,
7822
+ "icon": props.appendIcon
7823
+ }, null), props.appendAvatar && vue.createVNode(VAvatar, {
7824
+ "key": "append-avatar",
7825
+ "density": props.density,
7826
+ "image": props.appendAvatar
7827
+ }, null)])]
7798
7828
  }), [[vue.resolveDirective("ripple"), isClickable.value && props.ripple]]);
7799
7829
  });
7800
7830
  return {};
@@ -8008,9 +8038,12 @@
8008
8038
 
8009
8039
  // Types
8010
8040
 
8041
+ function isPrimitive(value) {
8042
+ return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
8043
+ }
8011
8044
  function transformItem(props, item) {
8012
8045
  const type = getPropertyFromItem(item, props.itemType, 'item');
8013
- const title = typeof item === 'string' ? item : getPropertyFromItem(item, props.itemTitle);
8046
+ const title = isPrimitive(item) ? item : getPropertyFromItem(item, props.itemTitle);
8014
8047
  const value = getPropertyFromItem(item, props.itemValue, undefined);
8015
8048
  const children = getPropertyFromItem(item, props.itemChildren);
8016
8049
  const itemProps = props.itemProps === true ? pick(item, ['children'])[1] : getPropertyFromItem(item, props.itemProps);
@@ -8636,17 +8669,12 @@
8636
8669
  function useLocationStrategies(props, data) {
8637
8670
  const contentStyles = vue.ref({});
8638
8671
  const updateLocation = vue.ref();
8639
- let scope;
8640
- vue.watchEffect(async () => {
8641
- var _scope;
8642
- (_scope = scope) == null ? void 0 : _scope.stop();
8643
- updateLocation.value = undefined;
8644
- if (!(IN_BROWSER && data.isActive.value && props.locationStrategy)) return;
8645
- scope = vue.effectScope();
8646
- if (!(props.locationStrategy === 'connected')) {
8647
- await vue.nextTick();
8648
- }
8649
- scope.run(() => {
8672
+ if (IN_BROWSER) {
8673
+ useToggleScope(() => !!(data.isActive.value && props.locationStrategy), reset => {
8674
+ vue.watch(() => props.locationStrategy, reset);
8675
+ vue.onScopeDispose(() => {
8676
+ updateLocation.value = undefined;
8677
+ });
8650
8678
  if (typeof props.locationStrategy === 'function') {
8651
8679
  var _props$locationStrate;
8652
8680
  updateLocation.value = (_props$locationStrate = props.locationStrategy(data, props, contentStyles)) == null ? void 0 : _props$locationStrate.updateLocation;
@@ -8655,16 +8683,14 @@
8655
8683
  updateLocation.value = (_locationStrategies$p = locationStrategies[props.locationStrategy](data, props, contentStyles)) == null ? void 0 : _locationStrategies$p.updateLocation;
8656
8684
  }
8657
8685
  });
8658
- });
8659
- IN_BROWSER && window.addEventListener('resize', onResize, {
8660
- passive: true
8661
- });
8662
- vue.onScopeDispose(() => {
8663
- var _scope2;
8664
- IN_BROWSER && window.removeEventListener('resize', onResize);
8665
- updateLocation.value = undefined;
8666
- (_scope2 = scope) == null ? void 0 : _scope2.stop();
8667
- });
8686
+ window.addEventListener('resize', onResize, {
8687
+ passive: true
8688
+ });
8689
+ vue.onScopeDispose(() => {
8690
+ window.removeEventListener('resize', onResize);
8691
+ updateLocation.value = undefined;
8692
+ });
8693
+ }
8668
8694
  function onResize(e) {
8669
8695
  var _updateLocation$value;
8670
8696
  (_updateLocation$value = updateLocation.value) == null ? void 0 : _updateLocation$value.call(updateLocation, e);
@@ -8958,13 +8984,30 @@
8958
8984
  maxWidth: convertToUnit(pixelCeil(clamp(available.x, minWidth.value === Infinity ? 0 : minWidth.value, maxWidth.value))),
8959
8985
  maxHeight: convertToUnit(pixelCeil(clamp(available.y, minHeight.value === Infinity ? 0 : minHeight.value, maxHeight.value)))
8960
8986
  });
8987
+ return {
8988
+ available,
8989
+ contentBox
8990
+ };
8961
8991
  }
8962
- vue.watch(() => [preferredAnchor.value, preferredOrigin.value, props.offset, props.minWidth, props.minHeight, props.maxWidth, props.maxHeight], () => updateLocation(), {
8963
- immediate: !activatorFixed
8964
- });
8965
- if (activatorFixed) vue.nextTick(() => updateLocation());
8966
- requestAnimationFrame(() => {
8967
- if (contentStyles.value.maxHeight) updateLocation();
8992
+ vue.watch(() => [preferredAnchor.value, preferredOrigin.value, props.offset, props.minWidth, props.minHeight, props.maxWidth, props.maxHeight], () => updateLocation());
8993
+ vue.nextTick(() => {
8994
+ const result = updateLocation();
8995
+
8996
+ // TODO: overflowing content should only require a single updateLocation call
8997
+ // Icky hack to make sure the content is positioned consistently
8998
+ if (!result) return;
8999
+ const {
9000
+ available,
9001
+ contentBox
9002
+ } = result;
9003
+ if (contentBox.height > available.y) {
9004
+ requestAnimationFrame(() => {
9005
+ updateLocation();
9006
+ requestAnimationFrame(() => {
9007
+ updateLocation();
9008
+ });
9009
+ });
9010
+ }
8968
9011
  });
8969
9012
  return {
8970
9013
  updateLocation
@@ -9032,10 +9075,10 @@
9032
9075
  await vue.nextTick();
9033
9076
  scope.run(() => {
9034
9077
  if (typeof props.scrollStrategy === 'function') {
9035
- props.scrollStrategy(data, props);
9078
+ props.scrollStrategy(data, props, scope);
9036
9079
  } else {
9037
9080
  var _scrollStrategies$pro;
9038
- (_scrollStrategies$pro = scrollStrategies[props.scrollStrategy]) == null ? void 0 : _scrollStrategies$pro.call(scrollStrategies, data, props);
9081
+ (_scrollStrategies$pro = scrollStrategies[props.scrollStrategy]) == null ? void 0 : _scrollStrategies$pro.call(scrollStrategies, data, props, scope);
9039
9082
  }
9040
9083
  });
9041
9084
  });
@@ -9081,9 +9124,10 @@
9081
9124
  }
9082
9125
  });
9083
9126
  }
9084
- function repositionScrollStrategy(data) {
9127
+ function repositionScrollStrategy(data, props, scope) {
9085
9128
  let slow = false;
9086
9129
  let raf = -1;
9130
+ let ric = -1;
9087
9131
  function update(e) {
9088
9132
  requestNewFrame(() => {
9089
9133
  var _data$updateLocation$, _data$updateLocation;
@@ -9093,21 +9137,29 @@
9093
9137
  slow = time / (1000 / 60) > 2;
9094
9138
  });
9095
9139
  }
9096
- bindScroll(data.activatorEl.value ?? data.contentEl.value, e => {
9097
- if (slow) {
9098
- // If the position calculation is slow,
9099
- // defer updates until scrolling is finished.
9100
- // Browsers usually fire one scroll event per frame so
9101
- // we just wait until we've got two frames without an event
9102
- cancelAnimationFrame(raf);
9103
- raf = requestAnimationFrame(() => {
9104
- raf = requestAnimationFrame(() => {
9140
+ ric = requestIdleCallback(() => {
9141
+ scope.run(() => {
9142
+ bindScroll(data.activatorEl.value ?? data.contentEl.value, e => {
9143
+ if (slow) {
9144
+ // If the position calculation is slow,
9145
+ // defer updates until scrolling is finished.
9146
+ // Browsers usually fire one scroll event per frame so
9147
+ // we just wait until we've got two frames without an event
9148
+ cancelAnimationFrame(raf);
9149
+ raf = requestAnimationFrame(() => {
9150
+ raf = requestAnimationFrame(() => {
9151
+ update(e);
9152
+ });
9153
+ });
9154
+ } else {
9105
9155
  update(e);
9106
- });
9156
+ }
9107
9157
  });
9108
- } else {
9109
- update(e);
9110
- }
9158
+ });
9159
+ });
9160
+ vue.onScopeDispose(() => {
9161
+ cancelIdleCallback(ric);
9162
+ cancelAnimationFrame(raf);
9111
9163
  });
9112
9164
  }
9113
9165
 
@@ -9750,6 +9802,11 @@
9750
9802
  function onClickOutside() {
9751
9803
  parent == null ? void 0 : parent.closeParents();
9752
9804
  }
9805
+ const activatorProps = vue.computed(() => vue.mergeProps({
9806
+ 'aria-haspopup': 'menu',
9807
+ 'aria-expanded': String(isActive.value),
9808
+ 'aria-owns': id.value
9809
+ }, props.activatorProps));
9753
9810
  useRender(() => {
9754
9811
  const [overlayProps] = filterVOverlayProps(props);
9755
9812
  return vue.createVNode(VOverlay, vue.mergeProps({
@@ -9759,11 +9816,7 @@
9759
9816
  "modelValue": isActive.value,
9760
9817
  "onUpdate:modelValue": $event => isActive.value = $event,
9761
9818
  "absolute": true,
9762
- "activatorProps": vue.mergeProps({
9763
- 'aria-haspopup': 'menu',
9764
- 'aria-expanded': String(isActive.value),
9765
- 'aria-owns': id.value
9766
- }, props.activatorProps),
9819
+ "activatorProps": activatorProps.value,
9767
9820
  "onClick:outside": onClickOutside
9768
9821
  }, scopeId), {
9769
9822
  activator: slots.activator,
@@ -9877,8 +9930,10 @@
9877
9930
  }
9878
9931
  function onKeydown(e) {
9879
9932
  if (props.readonly || form != null && form.isReadonly.value) return;
9880
- if (['Enter', 'ArrowDown', ' '].includes(e.key)) {
9933
+ if (['Enter', ' ', 'ArrowDown', 'ArrowUp', 'Home', 'End'].includes(e.key)) {
9881
9934
  e.preventDefault();
9935
+ }
9936
+ if (['Enter', 'ArrowDown', ' '].includes(e.key)) {
9882
9937
  menu.value = true;
9883
9938
  }
9884
9939
  if (['Escape', 'Tab'].includes(e.key)) {
@@ -9889,15 +9944,12 @@
9889
9944
  (_listRef$value = listRef.value) == null ? void 0 : _listRef$value.focus('next');
9890
9945
  } else if (e.key === 'ArrowUp') {
9891
9946
  var _listRef$value2;
9892
- e.preventDefault();
9893
9947
  (_listRef$value2 = listRef.value) == null ? void 0 : _listRef$value2.focus('prev');
9894
9948
  } else if (e.key === 'Home') {
9895
9949
  var _listRef$value3;
9896
- e.preventDefault();
9897
9950
  (_listRef$value3 = listRef.value) == null ? void 0 : _listRef$value3.focus('first');
9898
9951
  } else if (e.key === 'End') {
9899
9952
  var _listRef$value4;
9900
- e.preventDefault();
9901
9953
  (_listRef$value4 = listRef.value) == null ? void 0 : _listRef$value4.focus('last');
9902
9954
  }
9903
9955
  }
@@ -10241,6 +10293,9 @@
10241
10293
  }
10242
10294
  function onKeydown(e) {
10243
10295
  if (props.readonly || form != null && form.isReadonly.value) return;
10296
+ if (['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) {
10297
+ e.preventDefault();
10298
+ }
10244
10299
  if (['Enter', 'ArrowDown'].includes(e.key)) {
10245
10300
  menu.value = true;
10246
10301
  }
@@ -10252,11 +10307,9 @@
10252
10307
  }
10253
10308
  if (e.key === 'ArrowDown') {
10254
10309
  var _listRef$value;
10255
- e.preventDefault();
10256
10310
  (_listRef$value = listRef.value) == null ? void 0 : _listRef$value.focus('next');
10257
10311
  } else if (e.key === 'ArrowUp') {
10258
10312
  var _listRef$value2;
10259
- e.preventDefault();
10260
10313
  (_listRef$value2 = listRef.value) == null ? void 0 : _listRef$value2.focus('prev');
10261
10314
  }
10262
10315
  }
@@ -13585,7 +13638,9 @@
13585
13638
  if (props.readonly || form != null && form.isReadonly.value) return;
13586
13639
  const selectionStart = vTextFieldRef.value.selectionStart;
13587
13640
  const length = selected.value.length;
13588
- if (selectionIndex.value > -1) e.preventDefault();
13641
+ if (selectionIndex.value > -1 || ['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) {
13642
+ e.preventDefault();
13643
+ }
13589
13644
  if (['Enter', 'ArrowDown'].includes(e.key)) {
13590
13645
  menu.value = true;
13591
13646
  }
@@ -13597,11 +13652,9 @@
13597
13652
  }
13598
13653
  if (e.key === 'ArrowDown') {
13599
13654
  var _listRef$value;
13600
- e.preventDefault();
13601
13655
  (_listRef$value = listRef.value) == null ? void 0 : _listRef$value.focus('next');
13602
13656
  } else if (e.key === 'ArrowUp') {
13603
13657
  var _listRef$value2;
13604
- e.preventDefault();
13605
13658
  (_listRef$value2 = listRef.value) == null ? void 0 : _listRef$value2.focus('prev');
13606
13659
  }
13607
13660
  if (!props.multiple) return;
@@ -13896,6 +13949,10 @@
13896
13949
  });
13897
13950
  }
13898
13951
  });
13952
+ const activatorProps = vue.computed(() => vue.mergeProps({
13953
+ 'aria-haspopup': 'dialog',
13954
+ 'aria-expanded': String(isActive.value)
13955
+ }, props.activatorProps));
13899
13956
  useRender(() => {
13900
13957
  const [overlayProps] = filterVOverlayProps(props);
13901
13958
  return vue.createVNode(VOverlay, vue.mergeProps({
@@ -13909,10 +13966,7 @@
13909
13966
  "onUpdate:modelValue": $event => isActive.value = $event,
13910
13967
  "aria-role": "dialog",
13911
13968
  "aria-modal": "true",
13912
- "activatorProps": vue.mergeProps({
13913
- 'aria-haspopup': 'dialog',
13914
- 'aria-expanded': String(isActive.value)
13915
- }, props.activatorProps)
13969
+ "activatorProps": activatorProps.value
13916
13970
  }, scopeId), {
13917
13971
  activator: slots.activator,
13918
13972
  default: function () {
@@ -14261,12 +14315,15 @@
14261
14315
  onFocus();
14262
14316
  vue.nextTick(() => {
14263
14317
  model.value = [];
14264
- if (inputRef != null && inputRef.value) {
14265
- inputRef.value.value = '';
14266
- }
14267
14318
  callEvent(props['onClick:clear'], e);
14268
14319
  });
14269
14320
  }
14321
+ vue.watch(model, newValue => {
14322
+ const hasModelReset = !Array.isArray(newValue) || !newValue.length;
14323
+ if (hasModelReset && inputRef.value) {
14324
+ inputRef.value.value = '';
14325
+ }
14326
+ });
14270
14327
  useRender(() => {
14271
14328
  const hasCounter = !!(slots.counter || props.counter);
14272
14329
  const hasDetails = !!(hasCounter || slots.details);
@@ -15257,7 +15314,7 @@
15257
15314
  window.removeEventListener('touchmove', onTouchmove);
15258
15315
  window.removeEventListener('touchend', onTouchend);
15259
15316
  });
15260
- const isHorizontal = vue.computed(() => position.value !== 'bottom');
15317
+ const isHorizontal = vue.computed(() => ['left', 'right'].includes(position.value));
15261
15318
  const {
15262
15319
  addMovement,
15263
15320
  endTouch,
@@ -15269,11 +15326,11 @@
15269
15326
  const offset = vue.ref(0);
15270
15327
  let start;
15271
15328
  function getOffset(pos, active) {
15272
- return (position.value === 'left' ? pos : position.value === 'right' ? document.documentElement.clientWidth - pos : position.value === 'bottom' ? document.documentElement.clientHeight - pos : oops()) - (active ? width.value : 0);
15329
+ return (position.value === 'left' ? pos : position.value === 'right' ? document.documentElement.clientWidth - pos : position.value === 'top' ? pos : position.value === 'bottom' ? document.documentElement.clientHeight - pos : oops()) - (active ? width.value : 0);
15273
15330
  }
15274
15331
  function getProgress(pos) {
15275
15332
  let limit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
15276
- const progress = position.value === 'left' ? (pos - offset.value) / width.value : position.value === 'right' ? (document.documentElement.clientWidth - pos - offset.value) / width.value : position.value === 'bottom' ? (document.documentElement.clientHeight - pos - offset.value) / width.value : oops();
15333
+ const progress = position.value === 'left' ? (pos - offset.value) / width.value : position.value === 'right' ? (document.documentElement.clientWidth - pos - offset.value) / width.value : position.value === 'top' ? (pos - offset.value) / width.value : position.value === 'bottom' ? (document.documentElement.clientHeight - pos - offset.value) / width.value : oops();
15277
15334
  return limit ? Math.max(0, Math.min(1, progress)) : progress;
15278
15335
  }
15279
15336
  function onTouchstart(e) {
@@ -15281,8 +15338,8 @@
15281
15338
  const touchX = e.changedTouches[0].clientX;
15282
15339
  const touchY = e.changedTouches[0].clientY;
15283
15340
  const touchZone = 25;
15284
- const inTouchZone = position.value === 'left' ? touchX < touchZone : position.value === 'right' ? touchX > document.documentElement.clientWidth - touchZone : position.value === 'bottom' ? touchY > document.documentElement.clientHeight - touchZone : oops();
15285
- const inElement = isActive.value && (position.value === 'left' ? touchX < width.value : position.value === 'right' ? touchX > document.documentElement.clientWidth - width.value : position.value === 'bottom' ? touchY > document.documentElement.clientHeight - width.value : oops());
15341
+ const inTouchZone = position.value === 'left' ? touchX < touchZone : position.value === 'right' ? touchX > document.documentElement.clientWidth - touchZone : position.value === 'top' ? touchY < touchZone : position.value === 'bottom' ? touchY > document.documentElement.clientHeight - touchZone : oops();
15342
+ const inElement = isActive.value && (position.value === 'left' ? touchX < width.value : position.value === 'right' ? touchX > document.documentElement.clientWidth - width.value : position.value === 'top' ? touchY < width.value : position.value === 'bottom' ? touchY > document.documentElement.clientHeight - width.value : oops());
15286
15343
  if (inTouchZone || inElement || isActive.value && isTemporary.value) {
15287
15344
  maybeDragging = true;
15288
15345
  start = [touchX, touchY];
@@ -15334,6 +15391,7 @@
15334
15391
  isActive.value = velocity.direction === ({
15335
15392
  left: 'right',
15336
15393
  right: 'left',
15394
+ top: 'down',
15337
15395
  bottom: 'up'
15338
15396
  }[position.value] || oops());
15339
15397
  } else {
@@ -15342,7 +15400,7 @@
15342
15400
  }
15343
15401
  const dragStyles = vue.computed(() => {
15344
15402
  return isDragging.value ? {
15345
- transform: position.value === 'left' ? `translateX(calc(-100% + ${dragProgress.value * width.value}px))` : position.value === 'right' ? `translateX(calc(100% - ${dragProgress.value * width.value}px))` : position.value === 'bottom' ? `translateY(calc(100% - ${dragProgress.value * width.value}px))` : oops(),
15403
+ transform: position.value === 'left' ? `translateX(calc(-100% + ${dragProgress.value * width.value}px))` : position.value === 'right' ? `translateX(calc(100% - ${dragProgress.value * width.value}px))` : position.value === 'top' ? `translateY(calc(-100% + ${dragProgress.value * width.value}px))` : position.value === 'bottom' ? `translateY(calc(100% - ${dragProgress.value * width.value}px))` : oops(),
15346
15404
  transition: 'none'
15347
15405
  } : undefined;
15348
15406
  });
@@ -15358,7 +15416,7 @@
15358
15416
 
15359
15417
  // Types
15360
15418
 
15361
- const locations = ['start', 'end', 'left', 'right', 'bottom'];
15419
+ const locations = ['start', 'end', 'left', 'right', 'top', 'bottom'];
15362
15420
  const VNavigationDrawer = defineComponent({
15363
15421
  name: 'VNavigationDrawer',
15364
15422
  props: {
@@ -15815,7 +15873,7 @@
15815
15873
  disabled: !!props.disabled || props.length < 2,
15816
15874
  color: isActive ? props.activeColor : props.color,
15817
15875
  ariaCurrent: isActive,
15818
- ariaLabel: t(isActive ? props.currentPageAriaLabel : props.pageAriaLabel, index + 1),
15876
+ ariaLabel: t(isActive ? props.currentPageAriaLabel : props.pageAriaLabel, item),
15819
15877
  onClick: e => setValue(e, item)
15820
15878
  }
15821
15879
  };
@@ -17994,6 +18052,9 @@
17994
18052
  if (props.transition) return props.transition;
17995
18053
  return isActive.value ? 'scale-transition' : 'fade-transition';
17996
18054
  });
18055
+ const activatorProps = vue.computed(() => vue.mergeProps({
18056
+ 'aria-describedby': id.value
18057
+ }, props.activatorProps));
17997
18058
  useRender(() => {
17998
18059
  const [overlayProps] = filterVOverlayProps(props);
17999
18060
  return vue.createVNode(VOverlay, vue.mergeProps({
@@ -18010,9 +18071,7 @@
18010
18071
  "persistent": true,
18011
18072
  "role": "tooltip",
18012
18073
  "eager": true,
18013
- "activatorProps": vue.mergeProps({
18014
- 'aria-describedby': id.value
18015
- }, props.activatorProps),
18074
+ "activatorProps": activatorProps.value,
18016
18075
  "_disableGlobalStack": true
18017
18076
  }, scopeId), {
18018
18077
  activator: slots.activator,
@@ -18961,7 +19020,7 @@
18961
19020
  });
18962
19021
  },
18963
19022
  "item": item
18964
- }, slots), isExpanded(item.value) && ((_slots$expandedRow = slots['expanded-row']) == null ? void 0 : _slots$expandedRow.call(slots, {
19023
+ }, slots), isExpanded(item) && ((_slots$expandedRow = slots['expanded-row']) == null ? void 0 : _slots$expandedRow.call(slots, {
18965
19024
  item,
18966
19025
  columns: columns.value
18967
19026
  }))]);
@@ -19172,7 +19231,8 @@
19172
19231
  sortBy,
19173
19232
  startIndex,
19174
19233
  stopIndex,
19175
- pageCount
19234
+ pageCount,
19235
+ groupBy
19176
19236
  } = _ref;
19177
19237
  const vm = getCurrentInstance('VDataTable');
19178
19238
  const options = vue.computed(() => ({
@@ -19181,7 +19241,8 @@
19181
19241
  startIndex: startIndex.value,
19182
19242
  stopIndex: stopIndex.value,
19183
19243
  pageCount: pageCount.value,
19184
- sortBy: sortBy.value
19244
+ sortBy: sortBy.value,
19245
+ groupBy: groupBy.value
19185
19246
  }));
19186
19247
 
19187
19248
  // Reset page when sorting changes
@@ -19298,7 +19359,8 @@
19298
19359
  sortBy,
19299
19360
  pageCount,
19300
19361
  startIndex,
19301
- stopIndex
19362
+ stopIndex,
19363
+ groupBy
19302
19364
  });
19303
19365
  provideDefaults({
19304
19366
  VDataTableRows: {
@@ -19495,7 +19557,8 @@
19495
19557
  startIndex: vue.ref(0),
19496
19558
  stopIndex: vue.computed(() => flatItems.value.length - 1),
19497
19559
  pageCount: vue.ref(1),
19498
- itemsPerPage: vue.ref(-1)
19560
+ itemsPerPage: vue.ref(-1),
19561
+ groupBy
19499
19562
  });
19500
19563
  provideDefaults({
19501
19564
  VDataTableRows: {
@@ -19571,7 +19634,8 @@
19571
19634
  ...makeDataTableItemProps(),
19572
19635
  ...makeDataTableSelectProps(),
19573
19636
  ...makeDataTableSortProps(),
19574
- ...makeDataTablePaginateProps()
19637
+ ...makeDataTablePaginateProps(),
19638
+ ...makeDataTableGroupProps()
19575
19639
  },
19576
19640
  emits: {
19577
19641
  'update:modelValue': value => true,
@@ -19580,6 +19644,7 @@
19580
19644
  'update:sortBy': sortBy => true,
19581
19645
  'update:options': options => true,
19582
19646
  'update:expanded': options => true,
19647
+ 'update:groupBy': value => true,
19583
19648
  'click:row': (event, value) => true
19584
19649
  },
19585
19650
  setup(props, _ref) {
@@ -19587,10 +19652,12 @@
19587
19652
  emit,
19588
19653
  slots
19589
19654
  } = _ref;
19655
+ const groupBy = useProxiedModel(props, 'groupBy');
19590
19656
  createExpanded(props);
19591
19657
  const {
19592
19658
  columns
19593
19659
  } = createHeaders(props, {
19660
+ groupBy,
19594
19661
  showSelect: vue.toRef(props, 'showSelect'),
19595
19662
  showExpand: vue.toRef(props, 'showExpand')
19596
19663
  });
@@ -19601,6 +19668,9 @@
19601
19668
  sortBy,
19602
19669
  toggleSort
19603
19670
  } = createSort(props);
19671
+ const {
19672
+ opened
19673
+ } = createGroupBy(props, groupBy, sortBy);
19604
19674
  const {
19605
19675
  page,
19606
19676
  itemsPerPage,
@@ -19608,6 +19678,9 @@
19608
19678
  stopIndex,
19609
19679
  pageCount
19610
19680
  } = createPagination(props, items);
19681
+ const {
19682
+ flatItems
19683
+ } = useGroupedItems(items, groupBy, opened);
19611
19684
  createSelection(props, items);
19612
19685
  useOptions({
19613
19686
  page,
@@ -19615,7 +19688,8 @@
19615
19688
  sortBy,
19616
19689
  startIndex,
19617
19690
  stopIndex,
19618
- pageCount
19691
+ pageCount,
19692
+ groupBy
19619
19693
  });
19620
19694
  vue.provide('v-data-table', {
19621
19695
  toggleSort,
@@ -19651,7 +19725,7 @@
19651
19725
  "class": "v-data-table__tbody",
19652
19726
  "role": "rowgroup"
19653
19727
  }, [slots.body ? slots.body() : vue.createVNode(VDataTableRows, {
19654
- "items": items.value,
19728
+ "items": flatItems.value,
19655
19729
  "onClick:row": (event, value) => emit('click:row', event, value)
19656
19730
  }, slots)]), (_slots$tbody = slots.tbody) == null ? void 0 : _slots$tbody.call(slots), (_slots$tfoot = slots.tfoot) == null ? void 0 : _slots$tfoot.call(slots)]);
19657
19731
  }),
@@ -20157,7 +20231,7 @@
20157
20231
  locale
20158
20232
  };
20159
20233
  }
20160
- const version$1 = "3.1.2";
20234
+ const version$1 = "3.1.3";
20161
20235
  createVuetify$1.version = version$1;
20162
20236
 
20163
20237
  // Vue's inject() can only be used in setup
@@ -20170,7 +20244,7 @@
20170
20244
  }
20171
20245
  }
20172
20246
 
20173
- const version = "3.1.2";
20247
+ const version = "3.1.3";
20174
20248
 
20175
20249
  const createVuetify = function () {
20176
20250
  let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};