vuetify 3.1.3 → 3.1.4

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 (120) hide show
  1. package/LICENSE.md +1 -1
  2. package/dist/json/attributes.json +682 -642
  3. package/dist/json/importMap-labs.json +4 -0
  4. package/dist/json/importMap.json +34 -34
  5. package/dist/json/tags.json +18 -3
  6. package/dist/json/web-types.json +943 -830
  7. package/dist/vuetify-labs.css +2987 -2985
  8. package/dist/vuetify-labs.d.ts +211 -50
  9. package/dist/vuetify-labs.esm.js +97 -79
  10. package/dist/vuetify-labs.esm.js.map +1 -1
  11. package/dist/vuetify-labs.js +96 -78
  12. package/dist/vuetify-labs.min.css +2 -2
  13. package/dist/vuetify.css +43 -40
  14. package/dist/vuetify.d.ts +144 -13
  15. package/dist/vuetify.esm.js +40 -31
  16. package/dist/vuetify.esm.js.map +1 -1
  17. package/dist/vuetify.js +40 -31
  18. package/dist/vuetify.js.map +1 -1
  19. package/dist/vuetify.min.css +2 -2
  20. package/dist/vuetify.min.js +487 -484
  21. package/dist/vuetify.min.js.map +1 -1
  22. package/lib/components/VAppBar/VAppBarTitle.mjs +3 -4
  23. package/lib/components/VAppBar/VAppBarTitle.mjs.map +1 -1
  24. package/lib/components/VAppBar/index.d.ts +14 -2
  25. package/lib/components/VBottomSheet/VBottomSheet.mjs +1 -4
  26. package/lib/components/VBottomSheet/VBottomSheet.mjs.map +1 -1
  27. package/lib/components/VBtn/VBtn.css +7 -7
  28. package/lib/components/VBtnGroup/VBtnGroup.mjs +15 -11
  29. package/lib/components/VBtnGroup/VBtnGroup.mjs.map +1 -1
  30. package/lib/components/VBtnGroup/index.d.ts +2 -1
  31. package/lib/components/VBtnToggle/VBtnToggle.mjs +9 -5
  32. package/lib/components/VBtnToggle/VBtnToggle.mjs.map +1 -1
  33. package/lib/components/VBtnToggle/index.d.ts +122 -1
  34. package/lib/components/VCalendar/VCalendar.mjs +3 -0
  35. package/lib/components/VCalendar/VCalendar.mjs.map +1 -1
  36. package/lib/components/VCalendar/VCalendarCategory.sass +9 -3
  37. package/lib/components/VCalendar/VCalendarDaily.mjs +20 -8
  38. package/lib/components/VCalendar/VCalendarDaily.mjs.map +1 -1
  39. package/lib/components/VCalendar/VCalendarWeekly.mjs +25 -5
  40. package/lib/components/VCalendar/VCalendarWeekly.mjs.map +1 -1
  41. package/lib/components/VCalendar/mixins/calendar-with-events.mjs +20 -16
  42. package/lib/components/VCalendar/mixins/calendar-with-events.mjs.map +1 -1
  43. package/lib/components/VCalendar/mixins/mouse.mjs +16 -30
  44. package/lib/components/VCalendar/mixins/mouse.mjs.map +1 -1
  45. package/lib/components/VCard/VCard.css +7 -7
  46. package/lib/components/VChip/VChip.css +7 -7
  47. package/lib/components/VChip/VChip.mjs +6 -1
  48. package/lib/components/VChip/VChip.mjs.map +1 -1
  49. package/lib/components/VData/VData.mjs +2 -4
  50. package/lib/components/VData/VData.mjs.map +1 -1
  51. package/lib/components/VDatePicker/VDatePicker.mjs +7 -5
  52. package/lib/components/VDatePicker/VDatePicker.mjs.map +1 -1
  53. package/lib/components/VExpansionPanel/VExpansionPanel.css +7 -7
  54. package/lib/components/VField/VField.css +2 -2
  55. package/lib/components/VField/VField.sass +2 -2
  56. package/lib/components/VList/VListItem.css +7 -7
  57. package/lib/components/VOtpInput/VOtpInput.mjs +22 -46
  58. package/lib/components/VOtpInput/VOtpInput.mjs.map +1 -1
  59. package/lib/components/VOverflowBtn/VOverflowBtn.mjs +3 -0
  60. package/lib/components/VOverflowBtn/VOverflowBtn.mjs.map +1 -1
  61. package/lib/components/VSelectionControl/VSelectionControl.css +2 -2
  62. package/lib/components/VSkeletonLoader/VSkeletonLoader.sass +1 -1
  63. package/lib/components/VStepper/VStepper.sass +6 -6
  64. package/lib/components/VStepper/VStepperStep.mjs +12 -2
  65. package/lib/components/VStepper/VStepperStep.mjs.map +1 -1
  66. package/lib/components/VTimePicker/VTimePicker.mjs.map +1 -1
  67. package/lib/components/VTimeline/_mixins.sass +1 -1
  68. package/lib/components/VToolbar/VToolbarTitle.mjs +6 -5
  69. package/lib/components/VToolbar/VToolbarTitle.mjs.map +1 -1
  70. package/lib/components/VTreeview/VTreeview.mjs +1 -1
  71. package/lib/components/VTreeview/VTreeview.mjs.map +1 -1
  72. package/lib/components/index.d.ts +135 -4
  73. package/lib/composables/nested/nested.mjs +2 -1
  74. package/lib/composables/nested/nested.mjs.map +1 -1
  75. package/lib/directives/ripple/VRipple.css +3 -0
  76. package/lib/directives/ripple/VRipple.sass +3 -0
  77. package/lib/directives/ripple/_variables.scss +1 -1
  78. package/lib/directives/ripple/index.mjs +2 -7
  79. package/lib/directives/ripple/index.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 +9 -9
  83. package/lib/labs/VDataTable/VDataTable.mjs +1 -5
  84. package/lib/labs/VDataTable/VDataTable.mjs.map +1 -1
  85. package/lib/labs/VDataTable/VDataTableFooter.mjs +1 -1
  86. package/lib/labs/VDataTable/VDataTableFooter.mjs.map +1 -1
  87. package/lib/labs/VDataTable/VDataTableServer.mjs +1 -7
  88. package/lib/labs/VDataTable/VDataTableServer.mjs.map +1 -1
  89. package/lib/labs/VDataTable/VDataTableVirtual.mjs +0 -3
  90. package/lib/labs/VDataTable/VDataTableVirtual.mjs.map +1 -1
  91. package/lib/labs/VDataTable/composables/options.mjs +0 -6
  92. package/lib/labs/VDataTable/composables/options.mjs.map +1 -1
  93. package/lib/labs/VDataTable/composables/paginate.mjs +1 -1
  94. package/lib/labs/VDataTable/composables/paginate.mjs.map +1 -1
  95. package/lib/labs/VDataTable/index.d.ts +60 -1
  96. package/lib/labs/VDataTable/index.mjs +1 -0
  97. package/lib/labs/VDataTable/index.mjs.map +1 -1
  98. package/lib/labs/VVirtualScroll/VVirtualScroll.css +0 -1
  99. package/lib/labs/VVirtualScroll/VVirtualScroll.mjs +40 -22
  100. package/lib/labs/VVirtualScroll/VVirtualScroll.mjs.map +1 -1
  101. package/lib/labs/VVirtualScroll/VVirtualScroll.sass +0 -1
  102. package/lib/labs/VVirtualScroll/VVirtualScrollItem.mjs +20 -8
  103. package/lib/labs/VVirtualScroll/VVirtualScrollItem.mjs.map +1 -1
  104. package/lib/labs/VVirtualScroll/index.d.ts +15 -46
  105. package/lib/labs/components.d.ts +75 -47
  106. package/lib/locale/ar.mjs +20 -20
  107. package/lib/locale/ar.mjs.map +1 -1
  108. package/lib/locale/es.mjs +3 -3
  109. package/lib/locale/es.mjs.map +1 -1
  110. package/lib/locale/fi.mjs +5 -5
  111. package/lib/locale/fi.mjs.map +1 -1
  112. package/lib/locale/it.mjs +6 -6
  113. package/lib/locale/it.mjs.map +1 -1
  114. package/lib/locale/sv.mjs +7 -7
  115. package/lib/locale/sv.mjs.map +1 -1
  116. package/lib/styles/settings/_variables.scss +6 -6
  117. package/lib/styles/tools/_states.sass +3 -3
  118. package/lib/util/helpers.mjs +0 -18
  119. package/lib/util/helpers.mjs.map +1 -1
  120. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.1.3
2
+ * Vuetify v3.1.4
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -2929,12 +2929,13 @@
2929
2929
 
2930
2930
  // Types
2931
2931
 
2932
+ const makeVToolbarTitleProps = propsFactory({
2933
+ text: String,
2934
+ ...makeTagProps()
2935
+ }, 'v-toolbar-title');
2932
2936
  const VToolbarTitle = genericComponent()({
2933
2937
  name: 'VToolbarTitle',
2934
- props: {
2935
- text: String,
2936
- ...makeTagProps()
2937
- },
2938
+ props: makeVToolbarTitleProps(),
2938
2939
  setup(props, _ref) {
2939
2940
  let {
2940
2941
  slots
@@ -3386,18 +3387,21 @@
3386
3387
  };
3387
3388
  }
3388
3389
 
3390
+ // Types
3391
+
3392
+ const makeVBtnGroupProps = propsFactory({
3393
+ divided: Boolean,
3394
+ ...makeBorderProps(),
3395
+ ...makeDensityProps(),
3396
+ ...makeElevationProps(),
3397
+ ...makeRoundedProps(),
3398
+ ...makeTagProps(),
3399
+ ...makeThemeProps(),
3400
+ ...makeVariantProps()
3401
+ }, 'v-btn-group');
3389
3402
  const VBtnGroup = defineComponent({
3390
3403
  name: 'VBtnGroup',
3391
- props: {
3392
- divided: Boolean,
3393
- ...makeBorderProps(),
3394
- ...makeDensityProps(),
3395
- ...makeElevationProps(),
3396
- ...makeRoundedProps(),
3397
- ...makeTagProps(),
3398
- ...makeThemeProps(),
3399
- ...makeVariantProps()
3400
- },
3404
+ props: makeVBtnGroupProps(),
3401
3405
  setup(props, _ref) {
3402
3406
  let {
3403
3407
  slots
@@ -3435,6 +3439,9 @@
3435
3439
  });
3436
3440
  }
3437
3441
  });
3442
+ function filterVBtnGroupProps(props) {
3443
+ return pick(props, Object.keys(VBtnGroup.props));
3444
+ }
3438
3445
 
3439
3446
  // Composables
3440
3447
 
@@ -3642,7 +3649,10 @@
3642
3649
  const VBtnToggleSymbol = Symbol.for('vuetify:v-btn-toggle');
3643
3650
  const VBtnToggle = genericComponent()({
3644
3651
  name: 'VBtnToggle',
3645
- props: makeGroupProps(),
3652
+ props: {
3653
+ ...makeVBtnGroupProps(),
3654
+ ...makeGroupProps()
3655
+ },
3646
3656
  emits: {
3647
3657
  'update:modelValue': value => true
3648
3658
  },
@@ -3659,9 +3669,10 @@
3659
3669
  } = useGroup(props, VBtnToggleSymbol);
3660
3670
  useRender(() => {
3661
3671
  var _slots$default;
3662
- return vue.createVNode(VBtnGroup, {
3672
+ const [btnGroupProps] = filterVBtnGroupProps(props);
3673
+ return vue.createVNode(VBtnGroup, vue.mergeProps({
3663
3674
  "class": "v-btn-toggle"
3664
- }, {
3675
+ }, btnGroupProps), {
3665
3676
  default: () => [(_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots, {
3666
3677
  isSelected,
3667
3678
  next,
@@ -4116,9 +4127,6 @@
4116
4127
  el.style.transform = value;
4117
4128
  el.style.webkitTransform = value;
4118
4129
  }
4119
- function opacity(el, value) {
4120
- el.style.opacity = `calc(${value} * var(--v-theme-overlay-multiplier))`;
4121
- }
4122
4130
  function isTouchEvent(e) {
4123
4131
  return e.constructor.name === 'TouchEvent';
4124
4132
  }
@@ -4194,13 +4202,11 @@
4194
4202
  animation.classList.add('v-ripple__animation--enter');
4195
4203
  animation.classList.add('v-ripple__animation--visible');
4196
4204
  transform(animation, `translate(${x}, ${y}) scale3d(${scale},${scale},${scale})`);
4197
- opacity(animation, 0);
4198
4205
  animation.dataset.activated = String(performance.now());
4199
4206
  setTimeout(() => {
4200
4207
  animation.classList.remove('v-ripple__animation--enter');
4201
4208
  animation.classList.add('v-ripple__animation--in');
4202
4209
  transform(animation, `translate(${centerX}, ${centerY}) scale3d(1,1,1)`);
4203
- opacity(animation, 0.08);
4204
4210
  }, 0);
4205
4211
  },
4206
4212
  hide(el) {
@@ -4215,14 +4221,14 @@
4215
4221
  setTimeout(() => {
4216
4222
  animation.classList.remove('v-ripple__animation--in');
4217
4223
  animation.classList.add('v-ripple__animation--out');
4218
- opacity(animation, 0);
4219
4224
  setTimeout(() => {
4225
+ var _animation$parentNode;
4220
4226
  const ripples = el.getElementsByClassName('v-ripple__animation');
4221
4227
  if (ripples.length === 1 && el.dataset.previousPosition) {
4222
4228
  el.style.position = el.dataset.previousPosition;
4223
4229
  delete el.dataset.previousPosition;
4224
4230
  }
4225
- animation.parentNode && el.removeChild(animation.parentNode);
4231
+ if (((_animation$parentNode = animation.parentNode) == null ? void 0 : _animation$parentNode.parentNode) === el) el.removeChild(animation.parentNode);
4226
4232
  }, 300);
4227
4233
  }, delay);
4228
4234
  }
@@ -5009,9 +5015,7 @@
5009
5015
 
5010
5016
  const VAppBarTitle = defineComponent({
5011
5017
  name: 'VAppBarTitle',
5012
- props: {
5013
- ...VToolbarTitle.props
5014
- },
5018
+ props: makeVToolbarTitleProps(),
5015
5019
  setup(props, _ref) {
5016
5020
  let {
5017
5021
  slots
@@ -6837,6 +6841,9 @@
6837
6841
  emit,
6838
6842
  slots
6839
6843
  } = _ref;
6844
+ const {
6845
+ t
6846
+ } = useLocale();
6840
6847
  const {
6841
6848
  borderClasses
6842
6849
  } = useBorder(props);
@@ -6973,6 +6980,7 @@
6973
6980
  }, {
6974
6981
  default: () => [vue.createVNode("div", {
6975
6982
  "class": "v-chip__close",
6983
+ "aria-label": t(props.closeLabel),
6976
6984
  "onClick": onCloseClick
6977
6985
  }, [slots.close ? slots.close() : vue.createVNode(VIcon, null, null)])]
6978
6986
  })]
@@ -7458,7 +7466,8 @@
7458
7466
  };
7459
7467
  const useNestedItem = (id, isGroup) => {
7460
7468
  const parent = vue.inject(VNestedSymbol, emptyNested);
7461
- const computedId = vue.computed(() => id.value ?? Symbol(getUid()));
7469
+ const uidSymbol = Symbol(getUid());
7470
+ const computedId = vue.computed(() => id.value ?? uidSymbol);
7462
7471
  const item = {
7463
7472
  ...parent,
7464
7473
  id: computedId,
@@ -19058,7 +19067,7 @@
19058
19067
  return Math.min(itemsLength.value, startIndex.value + itemsPerPage.value);
19059
19068
  });
19060
19069
  const pageCount = vue.computed(() => {
19061
- if (itemsPerPage.value === -1) return 1;
19070
+ if (itemsPerPage.value === -1 || itemsLength.value === 0) return 1;
19062
19071
  return Math.ceil(itemsLength.value / itemsPerPage.value);
19063
19072
  });
19064
19073
  vue.watchEffect(() => {
@@ -19161,7 +19170,7 @@
19161
19170
  "hide-details": true
19162
19171
  }, null)]), vue.createVNode("div", {
19163
19172
  "class": "v-data-table-footer__info"
19164
- }, [vue.createVNode("div", null, [(startIndex.value ?? -1) + 1, vue.createTextVNode(" - "), stopIndex.value ?? 0, vue.createTextVNode(" of "), itemsLength.value ?? 0])]), vue.createVNode("div", {
19173
+ }, [vue.createVNode("div", null, [!itemsLength.value ? 0 : startIndex.value + 1, vue.createTextVNode(" - "), stopIndex.value, vue.createTextVNode(" of "), itemsLength.value])]), vue.createVNode("div", {
19165
19174
  "class": "v-data-table-footer__pagination"
19166
19175
  }, [vue.createVNode(VBtn, {
19167
19176
  "icon": props.firstIcon,
@@ -19229,18 +19238,12 @@
19229
19238
  page,
19230
19239
  itemsPerPage,
19231
19240
  sortBy,
19232
- startIndex,
19233
- stopIndex,
19234
- pageCount,
19235
19241
  groupBy
19236
19242
  } = _ref;
19237
19243
  const vm = getCurrentInstance('VDataTable');
19238
19244
  const options = vue.computed(() => ({
19239
19245
  page: page.value,
19240
19246
  itemsPerPage: itemsPerPage.value,
19241
- startIndex: startIndex.value,
19242
- stopIndex: stopIndex.value,
19243
- pageCount: pageCount.value,
19244
19247
  sortBy: sortBy.value,
19245
19248
  groupBy: groupBy.value
19246
19249
  }));
@@ -19344,8 +19347,7 @@
19344
19347
  page,
19345
19348
  itemsPerPage,
19346
19349
  startIndex,
19347
- stopIndex,
19348
- pageCount
19350
+ stopIndex
19349
19351
  } = createPagination(props, flatItems);
19350
19352
  const {
19351
19353
  paginatedItems
@@ -19357,9 +19359,6 @@
19357
19359
  page,
19358
19360
  itemsPerPage,
19359
19361
  sortBy,
19360
- pageCount,
19361
- startIndex,
19362
- stopIndex,
19363
19362
  groupBy
19364
19363
  });
19365
19364
  provideDefaults({
@@ -19554,9 +19553,6 @@
19554
19553
  useOptions({
19555
19554
  sortBy,
19556
19555
  page: vue.ref(1),
19557
- startIndex: vue.ref(0),
19558
- stopIndex: vue.computed(() => flatItems.value.length - 1),
19559
- pageCount: vue.ref(1),
19560
19556
  itemsPerPage: vue.ref(-1),
19561
19557
  groupBy
19562
19558
  });
@@ -19673,10 +19669,7 @@
19673
19669
  } = createGroupBy(props, groupBy, sortBy);
19674
19670
  const {
19675
19671
  page,
19676
- itemsPerPage,
19677
- startIndex,
19678
- stopIndex,
19679
- pageCount
19672
+ itemsPerPage
19680
19673
  } = createPagination(props, items);
19681
19674
  const {
19682
19675
  flatItems
@@ -19686,9 +19679,6 @@
19686
19679
  page,
19687
19680
  itemsPerPage,
19688
19681
  sortBy,
19689
- startIndex,
19690
- stopIndex,
19691
- pageCount,
19692
19682
  groupBy
19693
19683
  });
19694
19684
  vue.provide('v-data-table', {
@@ -19750,12 +19740,23 @@
19750
19740
  slots
19751
19741
  } = _ref;
19752
19742
  const {
19753
- resizeRef
19754
- } = useResizeObserver(entries => {
19755
- if (!entries.length) return;
19756
- const contentRect = entries[0].contentRect;
19757
- emit('update:height', contentRect.height);
19743
+ resizeRef,
19744
+ contentRect
19745
+ } = useResizeObserver();
19746
+ useToggleScope(() => props.dynamicHeight, () => {
19747
+ vue.watch(() => {
19748
+ var _contentRect$value;
19749
+ return (_contentRect$value = contentRect.value) == null ? void 0 : _contentRect$value.height;
19750
+ }, height => {
19751
+ if (height != null) emit('update:height', height);
19752
+ });
19758
19753
  });
19754
+ function updateHeight() {
19755
+ if (props.dynamicHeight && contentRect.value) {
19756
+ emit('update:height', contentRect.value.height);
19757
+ }
19758
+ }
19759
+ vue.onUpdated(updateHeight);
19759
19760
  useRender(() => {
19760
19761
  var _slots$default;
19761
19762
  return vue.createVNode("div", {
@@ -19777,15 +19778,8 @@
19777
19778
  type: Array,
19778
19779
  default: () => []
19779
19780
  },
19780
- itemKey: {
19781
- type: String,
19782
- default: 'value'
19783
- },
19784
19781
  itemHeight: [Number, String],
19785
- visibleItems: {
19786
- type: [Number, String],
19787
- default: 30
19788
- },
19782
+ visibleItems: [Number, String],
19789
19783
  ...makeDimensionProps()
19790
19784
  },
19791
19785
  setup(props, _ref) {
@@ -19800,15 +19794,23 @@
19800
19794
  baseItemHeight.value = val;
19801
19795
  }
19802
19796
  });
19803
- const visibleItems = vue.computed(() => parseInt(props.visibleItems, 10));
19804
19797
  const rootEl = vue.ref();
19805
- const ids = new Map(props.items.map((item, index) => [getPropertyFromItem(item, props.itemKey, item), index]));
19798
+ const {
19799
+ resizeRef,
19800
+ contentRect
19801
+ } = useResizeObserver();
19802
+ vue.watchEffect(() => {
19803
+ resizeRef.value = rootEl.value;
19804
+ });
19805
+ const display = useDisplay();
19806
19806
  const sizes = createRange(props.items.length).map(() => itemHeight.value);
19807
- function handleItemResize(item, height) {
19808
- const index = ids.get(getPropertyFromItem(item, props.itemKey, item));
19809
- if (!index) return;
19807
+ const visibleItems = vue.computed(() => {
19808
+ var _contentRect$value;
19809
+ return props.visibleItems ? parseInt(props.visibleItems, 10) : Math.max(12, Math.ceil((((_contentRect$value = contentRect.value) == null ? void 0 : _contentRect$value.height) ?? display.height.value) / itemHeight.value * 1.7 + 1));
19810
+ });
19811
+ function handleItemResize(index, height) {
19812
+ itemHeight.value = Math.max(itemHeight.value, height);
19810
19813
  sizes[index] = height;
19811
- if (!itemHeight.value) itemHeight.value = height;
19812
19814
  }
19813
19815
  function calculateOffset(index) {
19814
19816
  return sizes.slice(0, index).reduce((curr, value) => curr + (value || itemHeight.value), 0);
@@ -19831,18 +19833,24 @@
19831
19833
  }
19832
19834
  let lastScrollTop = 0;
19833
19835
  function handleScroll() {
19834
- if (!rootEl.value) return;
19836
+ if (!rootEl.value || !contentRect.value) return;
19837
+ const height = contentRect.value.height;
19835
19838
  const scrollTop = rootEl.value.scrollTop;
19836
19839
  const direction = scrollTop < lastScrollTop ? UP : DOWN;
19837
- const midPointIndex = calculateMidPointIndex(scrollTop);
19840
+ const midPointIndex = calculateMidPointIndex(scrollTop + height / 2);
19838
19841
  const buffer = Math.round(visibleItems.value / 3);
19839
- if (direction === UP && midPointIndex <= first.value) {
19842
+ if (direction === UP && midPointIndex <= first.value + buffer * 2 - 1) {
19840
19843
  first.value = Math.max(midPointIndex - buffer, 0);
19841
- } else if (direction === DOWN && midPointIndex >= first.value + buffer * 2) {
19844
+ } else if (direction === DOWN && midPointIndex >= first.value + buffer * 2 - 1) {
19842
19845
  first.value = Math.min(Math.max(0, midPointIndex - buffer), props.items.length - visibleItems.value);
19843
19846
  }
19844
19847
  lastScrollTop = rootEl.value.scrollTop;
19845
19848
  }
19849
+ function scrollToIndex(index) {
19850
+ if (!rootEl.value) return;
19851
+ const offset = calculateOffset(index);
19852
+ rootEl.value.scrollTop = offset;
19853
+ }
19846
19854
  const last = vue.computed(() => Math.min(props.items.length, first.value + visibleItems.value));
19847
19855
  const computedItems = vue.computed(() => props.items.slice(first.value, last.value));
19848
19856
  const paddingTop = vue.computed(() => calculateOffset(first.value));
@@ -19850,6 +19858,12 @@
19850
19858
  const {
19851
19859
  dimensionStyles
19852
19860
  } = useDimension(props);
19861
+ vue.onMounted(() => {
19862
+ if (!itemHeight.value) {
19863
+ // If itemHeight prop is not set, then calculate an estimated height from the average of inital items
19864
+ itemHeight.value = sizes.slice(first.value, last.value).reduce((curr, height) => curr + height, 0) / visibleItems.value;
19865
+ }
19866
+ });
19853
19867
  useRender(() => vue.createVNode("div", {
19854
19868
  "ref": rootEl,
19855
19869
  "class": "v-virtual-scroll",
@@ -19866,7 +19880,7 @@
19866
19880
  return vue.createVNode(VVirtualScrollItem, {
19867
19881
  "key": index,
19868
19882
  "dynamicHeight": !props.itemHeight,
19869
- "onUpdate:height": height => handleItemResize(item, height)
19883
+ "onUpdate:height": height => handleItemResize(index + first.value, height)
19870
19884
  }, {
19871
19885
  default: () => [(_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots, {
19872
19886
  item,
@@ -19874,6 +19888,9 @@
19874
19888
  })]
19875
19889
  });
19876
19890
  })])]));
19891
+ return {
19892
+ scrollToIndex
19893
+ };
19877
19894
  }
19878
19895
  });
19879
19896
 
@@ -20016,6 +20033,7 @@
20016
20033
  VDataTableRow: VDataTableRow,
20017
20034
  VDataTableVirtual: VDataTableVirtual,
20018
20035
  VDataTableServer: VDataTableServer,
20036
+ VDataTableFooter: VDataTableFooter,
20019
20037
  VVirtualScroll: VVirtualScroll
20020
20038
  });
20021
20039
 
@@ -20231,7 +20249,7 @@
20231
20249
  locale
20232
20250
  };
20233
20251
  }
20234
- const version$1 = "3.1.3";
20252
+ const version$1 = "3.1.4";
20235
20253
  createVuetify$1.version = version$1;
20236
20254
 
20237
20255
  // Vue's inject() can only be used in setup
@@ -20244,7 +20262,7 @@
20244
20262
  }
20245
20263
  }
20246
20264
 
20247
- const version = "3.1.3";
20265
+ const version = "3.1.4";
20248
20266
 
20249
20267
  const createVuetify = function () {
20250
20268
  let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};