@vuetify/nightly 3.2.0-next-20230118.0 → 4.0.0-dev-20230211.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/CHANGELOG.md +207 -15
  2. package/dist/json/attributes.json +7202 -0
  3. package/dist/json/importMap-labs.json +4 -0
  4. package/dist/json/importMap.json +102 -102
  5. package/dist/json/tags.json +2492 -0
  6. package/dist/json/web-types.json +24081 -0
  7. package/dist/vuetify-labs.css +163 -147
  8. package/dist/vuetify-labs.d.ts +441 -176
  9. package/dist/vuetify-labs.esm.js +328 -225
  10. package/dist/vuetify-labs.esm.js.map +1 -1
  11. package/dist/vuetify-labs.js +327 -224
  12. package/dist/vuetify-labs.min.css +2 -2
  13. package/dist/vuetify.css +53 -46
  14. package/dist/vuetify.d.ts +342 -203
  15. package/dist/vuetify.esm.js +249 -185
  16. package/dist/vuetify.esm.js.map +1 -1
  17. package/dist/vuetify.js +248 -184
  18. package/dist/vuetify.js.map +1 -1
  19. package/dist/vuetify.min.css +2 -2
  20. package/dist/vuetify.min.js +696 -685
  21. package/dist/vuetify.min.js.map +1 -1
  22. package/lib/blueprints/index.d.ts +2 -2
  23. package/lib/blueprints/md1.d.ts +2 -2
  24. package/lib/blueprints/md2.d.ts +2 -2
  25. package/lib/blueprints/md3.d.ts +2 -2
  26. package/lib/components/VAutocomplete/VAutocomplete.mjs +3 -2
  27. package/lib/components/VAutocomplete/VAutocomplete.mjs.map +1 -1
  28. package/lib/components/VAutocomplete/index.d.ts +43 -20
  29. package/lib/components/VBottomSheet/VBottomSheet.mjs +1 -4
  30. package/lib/components/VBottomSheet/VBottomSheet.mjs.map +1 -1
  31. package/lib/components/VBtn/VBtn.css +7 -7
  32. package/lib/components/VBtn/VBtn.mjs +8 -3
  33. package/lib/components/VBtn/VBtn.mjs.map +1 -1
  34. package/lib/components/VBtnGroup/VBtnGroup.mjs +15 -11
  35. package/lib/components/VBtnGroup/VBtnGroup.mjs.map +1 -1
  36. package/lib/components/VBtnGroup/index.d.ts +2 -1
  37. package/lib/components/VBtnToggle/VBtnToggle.mjs +9 -5
  38. package/lib/components/VBtnToggle/VBtnToggle.mjs.map +1 -1
  39. package/lib/components/VBtnToggle/index.d.ts +122 -1
  40. package/lib/components/VCalendar/VCalendar.mjs +3 -0
  41. package/lib/components/VCalendar/VCalendar.mjs.map +1 -1
  42. package/lib/components/VCalendar/VCalendarCategory.sass +9 -3
  43. package/lib/components/VCalendar/VCalendarDaily.mjs +20 -8
  44. package/lib/components/VCalendar/VCalendarDaily.mjs.map +1 -1
  45. package/lib/components/VCalendar/VCalendarWeekly.mjs +25 -5
  46. package/lib/components/VCalendar/VCalendarWeekly.mjs.map +1 -1
  47. package/lib/components/VCalendar/mixins/calendar-with-events.mjs +20 -16
  48. package/lib/components/VCalendar/mixins/calendar-with-events.mjs.map +1 -1
  49. package/lib/components/VCalendar/mixins/mouse.mjs +16 -30
  50. package/lib/components/VCalendar/mixins/mouse.mjs.map +1 -1
  51. package/lib/components/VCard/VCard.css +7 -7
  52. package/lib/components/VChip/VChip.css +7 -7
  53. package/lib/components/VCombobox/VCombobox.mjs +3 -3
  54. package/lib/components/VCombobox/VCombobox.mjs.map +1 -1
  55. package/lib/components/VCombobox/index.d.ts +43 -20
  56. package/lib/components/VData/VData.mjs +2 -4
  57. package/lib/components/VData/VData.mjs.map +1 -1
  58. package/lib/components/VDatePicker/VDatePicker.mjs +7 -5
  59. package/lib/components/VDatePicker/VDatePicker.mjs.map +1 -1
  60. package/lib/components/VDefaultsProvider/index.d.ts +5 -4
  61. package/lib/components/VDialog/VDialog.mjs +6 -5
  62. package/lib/components/VDialog/VDialog.mjs.map +1 -1
  63. package/lib/components/VDialog/index.d.ts +57 -34
  64. package/lib/components/VDivider/VDivider.mjs +6 -6
  65. package/lib/components/VDivider/VDivider.mjs.map +1 -1
  66. package/lib/components/VExpansionPanel/VExpansionPanel.css +7 -7
  67. package/lib/components/VField/VField.css +2 -2
  68. package/lib/components/VField/VField.mjs +28 -26
  69. package/lib/components/VField/VField.mjs.map +1 -1
  70. package/lib/components/VField/VField.sass +2 -2
  71. package/lib/components/VFileInput/VFileInput.mjs +7 -4
  72. package/lib/components/VFileInput/VFileInput.mjs.map +1 -1
  73. package/lib/components/VForm/index.d.ts +0 -3
  74. package/lib/components/VList/VList.mjs +4 -1
  75. package/lib/components/VList/VList.mjs.map +1 -1
  76. package/lib/components/VList/VListItem.css +7 -7
  77. package/lib/components/VList/VListItem.mjs +29 -19
  78. package/lib/components/VList/VListItem.mjs.map +1 -1
  79. package/lib/components/VMenu/VMenu.mjs +6 -5
  80. package/lib/components/VMenu/VMenu.mjs.map +1 -1
  81. package/lib/components/VMenu/index.d.ts +57 -34
  82. package/lib/components/VNavigationDrawer/VNavigationDrawer.css +4 -0
  83. package/lib/components/VNavigationDrawer/VNavigationDrawer.mjs +1 -1
  84. package/lib/components/VNavigationDrawer/VNavigationDrawer.mjs.map +1 -1
  85. package/lib/components/VNavigationDrawer/VNavigationDrawer.sass +4 -0
  86. package/lib/components/VNavigationDrawer/index.d.ts +3 -3
  87. package/lib/components/VNavigationDrawer/touch.mjs +7 -6
  88. package/lib/components/VNavigationDrawer/touch.mjs.map +1 -1
  89. package/lib/components/VOtpInput/VOtpInput.mjs +22 -46
  90. package/lib/components/VOtpInput/VOtpInput.mjs.map +1 -1
  91. package/lib/components/VOverflowBtn/VOverflowBtn.mjs +3 -0
  92. package/lib/components/VOverflowBtn/VOverflowBtn.mjs.map +1 -1
  93. package/lib/components/VOverlay/index.d.ts +34 -11
  94. package/lib/components/VOverlay/locationStrategies.mjs +40 -29
  95. package/lib/components/VOverlay/locationStrategies.mjs.map +1 -1
  96. package/lib/components/VOverlay/scrollStrategies.mjs +25 -16
  97. package/lib/components/VOverlay/scrollStrategies.mjs.map +1 -1
  98. package/lib/components/VPagination/VPagination.mjs +1 -1
  99. package/lib/components/VPagination/VPagination.mjs.map +1 -1
  100. package/lib/components/VSelect/VSelect.mjs +3 -4
  101. package/lib/components/VSelect/VSelect.mjs.map +1 -1
  102. package/lib/components/VSelect/index.d.ts +43 -20
  103. package/lib/components/VSelectionControl/VSelectionControl.css +2 -2
  104. package/lib/components/VSkeletonLoader/VSkeletonLoader.sass +1 -1
  105. package/lib/components/VSnackbar/index.d.ts +42 -19
  106. package/lib/components/VStepper/VStepper.sass +6 -6
  107. package/lib/components/VStepper/VStepperStep.mjs +12 -2
  108. package/lib/components/VStepper/VStepperStep.mjs.map +1 -1
  109. package/lib/components/VTable/VTable.css +4 -4
  110. package/lib/components/VTable/VTable.sass +2 -2
  111. package/lib/components/VTimePicker/VTimePicker.mjs.map +1 -1
  112. package/lib/components/VTimeline/_mixins.sass +1 -1
  113. package/lib/components/VTooltip/VTooltip.mjs +4 -3
  114. package/lib/components/VTooltip/VTooltip.mjs.map +1 -1
  115. package/lib/components/VTooltip/index.d.ts +57 -34
  116. package/lib/components/VTreeview/VTreeview.mjs +1 -1
  117. package/lib/components/VTreeview/VTreeview.mjs.map +1 -1
  118. package/lib/components/index.d.ts +316 -176
  119. package/lib/composables/defaults.mjs +1 -1
  120. package/lib/composables/defaults.mjs.map +1 -1
  121. package/lib/composables/filter.mjs +3 -3
  122. package/lib/composables/filter.mjs.map +1 -1
  123. package/lib/composables/form.mjs +0 -1
  124. package/lib/composables/form.mjs.map +1 -1
  125. package/lib/composables/toggleScope.mjs +14 -7
  126. package/lib/composables/toggleScope.mjs.map +1 -1
  127. package/lib/directives/ripple/VRipple.css +3 -0
  128. package/lib/directives/ripple/VRipple.sass +3 -0
  129. package/lib/directives/ripple/_variables.scss +1 -1
  130. package/lib/directives/ripple/index.mjs +2 -7
  131. package/lib/directives/ripple/index.mjs.map +1 -1
  132. package/lib/entry-bundler.mjs +1 -1
  133. package/lib/entry-bundler.mjs.map +1 -1
  134. package/lib/framework.mjs +1 -1
  135. package/lib/framework.mjs.map +1 -1
  136. package/lib/index.d.ts +29 -29
  137. package/lib/labs/VDataTable/VDataTable.mjs +6 -6
  138. package/lib/labs/VDataTable/VDataTable.mjs.map +1 -1
  139. package/lib/labs/VDataTable/VDataTableFooter.css +9 -0
  140. package/lib/labs/VDataTable/VDataTableFooter.mjs +51 -13
  141. package/lib/labs/VDataTable/VDataTableFooter.mjs.map +1 -1
  142. package/lib/labs/VDataTable/VDataTableFooter.sass +7 -0
  143. package/lib/labs/VDataTable/VDataTableRows.mjs +1 -1
  144. package/lib/labs/VDataTable/VDataTableRows.mjs.map +1 -1
  145. package/lib/labs/VDataTable/VDataTableServer.mjs +19 -12
  146. package/lib/labs/VDataTable/VDataTableServer.mjs.map +1 -1
  147. package/lib/labs/VDataTable/VDataTableVirtual.mjs +6 -5
  148. package/lib/labs/VDataTable/VDataTableVirtual.mjs.map +1 -1
  149. package/lib/labs/VDataTable/composables/options.mjs +3 -7
  150. package/lib/labs/VDataTable/composables/options.mjs.map +1 -1
  151. package/lib/labs/VDataTable/composables/paginate.mjs +1 -1
  152. package/lib/labs/VDataTable/composables/paginate.mjs.map +1 -1
  153. package/lib/labs/VDataTable/index.d.ts +125 -1
  154. package/lib/labs/VDataTable/index.mjs +1 -0
  155. package/lib/labs/VDataTable/index.mjs.map +1 -1
  156. package/lib/labs/components.d.ts +125 -1
  157. package/lib/locale/adapters/vue-i18n.mjs +12 -2
  158. package/lib/locale/adapters/vue-i18n.mjs.map +1 -1
  159. package/lib/locale/ar.mjs +20 -20
  160. package/lib/locale/ar.mjs.map +1 -1
  161. package/lib/locale/en.mjs +2 -2
  162. package/lib/locale/en.mjs.map +1 -1
  163. package/lib/locale/es.mjs +3 -3
  164. package/lib/locale/es.mjs.map +1 -1
  165. package/lib/locale/fi.mjs +5 -5
  166. package/lib/locale/fi.mjs.map +1 -1
  167. package/lib/locale/it.mjs +6 -6
  168. package/lib/locale/it.mjs.map +1 -1
  169. package/lib/locale/sv.mjs +13 -13
  170. package/lib/locale/sv.mjs.map +1 -1
  171. package/lib/styles/settings/_variables.scss +6 -6
  172. package/lib/styles/tools/_states.sass +3 -3
  173. package/lib/util/defineComponent.mjs +21 -18
  174. package/lib/util/defineComponent.mjs.map +1 -1
  175. package/lib/util/helpers.mjs +5 -19
  176. package/lib/util/helpers.mjs.map +1 -1
  177. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.2.0-next-20230118.0
2
+ * Vuetify v4.0.0-dev-20230211.0
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
  }
@@ -3372,18 +3386,21 @@
3372
3386
  };
3373
3387
  }
3374
3388
 
3389
+ // Types
3390
+
3391
+ const makeVBtnGroupProps = propsFactory({
3392
+ divided: Boolean,
3393
+ ...makeBorderProps(),
3394
+ ...makeDensityProps(),
3395
+ ...makeElevationProps(),
3396
+ ...makeRoundedProps(),
3397
+ ...makeTagProps(),
3398
+ ...makeThemeProps(),
3399
+ ...makeVariantProps()
3400
+ }, 'v-btn-group');
3375
3401
  const VBtnGroup = defineComponent({
3376
3402
  name: 'VBtnGroup',
3377
- props: {
3378
- divided: Boolean,
3379
- ...makeBorderProps(),
3380
- ...makeDensityProps(),
3381
- ...makeElevationProps(),
3382
- ...makeRoundedProps(),
3383
- ...makeTagProps(),
3384
- ...makeThemeProps(),
3385
- ...makeVariantProps()
3386
- },
3403
+ props: makeVBtnGroupProps(),
3387
3404
  setup(props, _ref) {
3388
3405
  let {
3389
3406
  slots
@@ -3421,6 +3438,9 @@
3421
3438
  });
3422
3439
  }
3423
3440
  });
3441
+ function filterVBtnGroupProps(props) {
3442
+ return pick(props, Object.keys(VBtnGroup.props));
3443
+ }
3424
3444
 
3425
3445
  // Composables
3426
3446
 
@@ -3628,7 +3648,10 @@
3628
3648
  const VBtnToggleSymbol = Symbol.for('vuetify:v-btn-toggle');
3629
3649
  const VBtnToggle = genericComponent()({
3630
3650
  name: 'VBtnToggle',
3631
- props: makeGroupProps(),
3651
+ props: {
3652
+ ...makeVBtnGroupProps(),
3653
+ ...makeGroupProps()
3654
+ },
3632
3655
  emits: {
3633
3656
  'update:modelValue': value => true
3634
3657
  },
@@ -3645,9 +3668,10 @@
3645
3668
  } = useGroup(props, VBtnToggleSymbol);
3646
3669
  useRender(() => {
3647
3670
  var _slots$default;
3648
- return vue.createVNode(VBtnGroup, {
3671
+ const [btnGroupProps] = filterVBtnGroupProps(props);
3672
+ return vue.createVNode(VBtnGroup, vue.mergeProps({
3649
3673
  "class": "v-btn-toggle"
3650
- }, {
3674
+ }, btnGroupProps), {
3651
3675
  default: () => [(_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots, {
3652
3676
  isSelected,
3653
3677
  next,
@@ -4102,9 +4126,6 @@
4102
4126
  el.style.transform = value;
4103
4127
  el.style.webkitTransform = value;
4104
4128
  }
4105
- function opacity(el, value) {
4106
- el.style.opacity = `calc(${value} * var(--v-theme-overlay-multiplier))`;
4107
- }
4108
4129
  function isTouchEvent(e) {
4109
4130
  return e.constructor.name === 'TouchEvent';
4110
4131
  }
@@ -4180,13 +4201,11 @@
4180
4201
  animation.classList.add('v-ripple__animation--enter');
4181
4202
  animation.classList.add('v-ripple__animation--visible');
4182
4203
  transform(animation, `translate(${x}, ${y}) scale3d(${scale},${scale},${scale})`);
4183
- opacity(animation, 0);
4184
4204
  animation.dataset.activated = String(performance.now());
4185
4205
  setTimeout(() => {
4186
4206
  animation.classList.remove('v-ripple__animation--enter');
4187
4207
  animation.classList.add('v-ripple__animation--in');
4188
4208
  transform(animation, `translate(${centerX}, ${centerY}) scale3d(1,1,1)`);
4189
- opacity(animation, 0.08);
4190
4209
  }, 0);
4191
4210
  },
4192
4211
  hide(el) {
@@ -4201,14 +4220,14 @@
4201
4220
  setTimeout(() => {
4202
4221
  animation.classList.remove('v-ripple__animation--in');
4203
4222
  animation.classList.add('v-ripple__animation--out');
4204
- opacity(animation, 0);
4205
4223
  setTimeout(() => {
4224
+ var _animation$parentNode;
4206
4225
  const ripples = el.getElementsByClassName('v-ripple__animation');
4207
4226
  if (ripples.length === 1 && el.dataset.previousPosition) {
4208
4227
  el.style.position = el.dataset.previousPosition;
4209
4228
  delete el.dataset.previousPosition;
4210
4229
  }
4211
- animation.parentNode && el.removeChild(animation.parentNode);
4230
+ if (((_animation$parentNode = animation.parentNode) == null ? void 0 : _animation$parentNode.parentNode) === el) el.removeChild(animation.parentNode);
4212
4231
  }, 300);
4213
4232
  }, delay);
4214
4233
  }
@@ -4861,14 +4880,18 @@
4861
4880
  const isElevated = vue.computed(() => {
4862
4881
  return props.variant === 'elevated' && !(props.disabled || props.flat || props.border);
4863
4882
  });
4883
+ const valueAttr = vue.computed(() => {
4884
+ if (props.value === undefined) return undefined;
4885
+ return Object(props.value) === props.value ? JSON.stringify(props.value, null, 0) : props.value;
4886
+ });
4864
4887
  useSelectLink(link, group == null ? void 0 : group.select);
4865
4888
  useRender(() => {
4866
- var _slots$prepend, _slots$default, _slots$append, _slots$loader;
4889
+ var _link$isActive2, _link$isActive3, _slots$prepend, _slots$default, _slots$append, _slots$loader;
4867
4890
  const Tag = link.isLink.value ? 'a' : props.tag;
4868
- const hasColor = !group || isActive.value;
4869
4891
  const hasPrepend = !!(props.prependIcon || slots.prepend);
4870
4892
  const hasAppend = !!(props.appendIcon || slots.append);
4871
4893
  const hasIcon = !!(props.icon && props.icon !== true);
4894
+ 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
4895
  return vue.withDirectives(vue.createVNode(Tag, {
4873
4896
  "type": Tag === 'a' ? undefined : 'button',
4874
4897
  "class": ['v-btn', group == null ? void 0 : group.selectedClass.value, {
@@ -4889,7 +4912,8 @@
4889
4912
  if (isDisabled.value) return;
4890
4913
  (_link$navigate = link.navigate) == null ? void 0 : _link$navigate.call(link, e);
4891
4914
  group == null ? void 0 : group.toggle();
4892
- }
4915
+ },
4916
+ "value": valueAttr.value
4893
4917
  }, {
4894
4918
  default: () => [genOverlays(true, 'v-btn'), !props.icon && hasPrepend && vue.createVNode(VDefaultsProvider, {
4895
4919
  "key": "prepend",
@@ -5363,32 +5387,34 @@
5363
5387
  if (hasLabel.value) {
5364
5388
  const el = labelRef.value.$el;
5365
5389
  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');
5390
+ requestAnimationFrame(() => {
5391
+ const rect = nullifyTransforms(el);
5392
+ const targetRect = targetEl.getBoundingClientRect();
5393
+ const x = targetRect.x - rect.x;
5394
+ const y = targetRect.y - rect.y - (rect.height / 2 - targetRect.height / 2);
5395
+ const targetWidth = targetRect.width / 0.75;
5396
+ const width = Math.abs(targetWidth - rect.width) > 1 ? {
5397
+ maxWidth: convertToUnit(targetWidth)
5398
+ } : undefined;
5399
+ const style = getComputedStyle(el);
5400
+ const targetStyle = getComputedStyle(targetEl);
5401
+ const duration = parseFloat(style.transitionDuration) * 1000 || 150;
5402
+ const scale = parseFloat(targetStyle.getPropertyValue('--v-field-label-scale'));
5403
+ const color = targetStyle.getPropertyValue('color');
5404
+ el.style.visibility = 'visible';
5405
+ targetEl.style.visibility = 'hidden';
5406
+ animate(el, {
5407
+ transform: `translate(${x}px, ${y}px) scale(${scale})`,
5408
+ color,
5409
+ ...width
5410
+ }, {
5411
+ duration,
5412
+ easing: standardEasing,
5413
+ direction: val ? 'normal' : 'reverse'
5414
+ }).finished.then(() => {
5415
+ el.style.removeProperty('visibility');
5416
+ targetEl.style.removeProperty('visibility');
5417
+ });
5392
5418
  });
5393
5419
  }
5394
5420
  }, {
@@ -5577,7 +5603,6 @@
5577
5603
  const makeFormProps = propsFactory({
5578
5604
  disabled: Boolean,
5579
5605
  fastFail: Boolean,
5580
- lazyValidation: Boolean,
5581
5606
  readonly: Boolean,
5582
5607
  modelValue: {
5583
5608
  type: Boolean,
@@ -6981,9 +7006,9 @@
6981
7006
  themeClasses
6982
7007
  } = provideTheme(props);
6983
7008
  const {
6984
- backgroundColorClasses,
6985
- backgroundColorStyles
6986
- } = useBackgroundColor(vue.toRef(props, 'color'));
7009
+ textColorClasses,
7010
+ textColorStyles
7011
+ } = useTextColor(vue.toRef(props, 'color'));
6987
7012
  const dividerStyles = vue.computed(() => {
6988
7013
  const styles = {};
6989
7014
  if (props.length) {
@@ -6999,8 +7024,8 @@
6999
7024
  'v-divider': true,
7000
7025
  'v-divider--inset': props.inset,
7001
7026
  'v-divider--vertical': props.vertical
7002
- }, themeClasses.value, backgroundColorClasses.value],
7003
- "style": [dividerStyles.value, backgroundColorStyles.value],
7027
+ }, themeClasses.value, textColorClasses.value],
7028
+ "style": [dividerStyles.value, textColorStyles.value],
7004
7029
  "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
7005
7030
  "role": `${attrs.role || 'separator'}`
7006
7031
  }, null));
@@ -7710,7 +7735,7 @@
7710
7735
  }
7711
7736
  }
7712
7737
  useRender(() => {
7713
- var _slots$prepend, _slots$title, _slots$subtitle, _slots$default, _slots$append;
7738
+ var _slots$title, _slots$subtitle, _slots$default;
7714
7739
  const Tag = isLink.value ? 'a' : props.tag;
7715
7740
  const hasColor = !list || isSelected.value || isActive.value;
7716
7741
  const hasTitle = slots.title || props.title;
@@ -7733,7 +7758,18 @@
7733
7758
  "onClick": onClick,
7734
7759
  "onKeydown": isClickable.value && !isLink.value && onKeyDown
7735
7760
  }, {
7736
- default: () => [genOverlays(isClickable.value || isActive.value, 'v-list-item'), hasPrepend && vue.createVNode(VDefaultsProvider, {
7761
+ default: () => [genOverlays(isClickable.value || isActive.value, 'v-list-item'), hasPrepend && vue.createVNode("div", {
7762
+ "key": "prepend",
7763
+ "class": "v-list-item__prepend"
7764
+ }, [props.prependAvatar && vue.createVNode(VAvatar, {
7765
+ "key": "prepend-avatar",
7766
+ "density": props.density,
7767
+ "image": props.prependAvatar
7768
+ }, null), props.prependIcon && vue.createVNode(VIcon, {
7769
+ "key": "prepend-icon",
7770
+ "density": props.density,
7771
+ "icon": props.prependIcon
7772
+ }, null), slots.prepend && vue.createVNode(VDefaultsProvider, {
7737
7773
  "key": "prepend",
7738
7774
  "defaults": {
7739
7775
  VAvatar: {
@@ -7749,14 +7785,8 @@
7749
7785
  }
7750
7786
  }
7751
7787
  }, {
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", {
7788
+ default: () => [slots.prepend(slotProps.value)]
7789
+ })]), vue.createVNode("div", {
7760
7790
  "class": "v-list-item__content",
7761
7791
  "data-no-activator": ""
7762
7792
  }, [hasTitle && vue.createVNode(VListItemTitle, {
@@ -7771,7 +7801,10 @@
7771
7801
  default: () => [((_slots$subtitle = slots.subtitle) == null ? void 0 : _slots$subtitle.call(slots, {
7772
7802
  subtitle: props.subtitle
7773
7803
  })) ?? props.subtitle]
7774
- }), (_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots, slotProps.value)]), hasAppend && vue.createVNode(VDefaultsProvider, {
7804
+ }), (_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots, slotProps.value)]), hasAppend && vue.createVNode("div", {
7805
+ "key": "append",
7806
+ "class": "v-list-item__append"
7807
+ }, [slots.append && vue.createVNode(VDefaultsProvider, {
7775
7808
  "key": "append",
7776
7809
  "defaults": {
7777
7810
  VAvatar: {
@@ -7787,14 +7820,16 @@
7787
7820
  }
7788
7821
  }
7789
7822
  }, {
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
- })]
7823
+ default: () => [slots.append(slotProps.value)]
7824
+ }), props.appendIcon && vue.createVNode(VIcon, {
7825
+ "key": "append-icon",
7826
+ "density": props.density,
7827
+ "icon": props.appendIcon
7828
+ }, null), props.appendAvatar && vue.createVNode(VAvatar, {
7829
+ "key": "append-avatar",
7830
+ "density": props.density,
7831
+ "image": props.appendAvatar
7832
+ }, null)])]
7798
7833
  }), [[vue.resolveDirective("ripple"), isClickable.value && props.ripple]]);
7799
7834
  });
7800
7835
  return {};
@@ -8008,9 +8043,12 @@
8008
8043
 
8009
8044
  // Types
8010
8045
 
8046
+ function isPrimitive(value) {
8047
+ return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
8048
+ }
8011
8049
  function transformItem(props, item) {
8012
8050
  const type = getPropertyFromItem(item, props.itemType, 'item');
8013
- const title = typeof item === 'string' ? item : getPropertyFromItem(item, props.itemTitle);
8051
+ const title = isPrimitive(item) ? item : getPropertyFromItem(item, props.itemTitle);
8014
8052
  const value = getPropertyFromItem(item, props.itemValue, undefined);
8015
8053
  const children = getPropertyFromItem(item, props.itemChildren);
8016
8054
  const itemProps = props.itemProps === true ? pick(item, ['children'])[1] : getPropertyFromItem(item, props.itemProps);
@@ -8636,17 +8674,12 @@
8636
8674
  function useLocationStrategies(props, data) {
8637
8675
  const contentStyles = vue.ref({});
8638
8676
  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(() => {
8677
+ if (IN_BROWSER) {
8678
+ useToggleScope(() => !!(data.isActive.value && props.locationStrategy), reset => {
8679
+ vue.watch(() => props.locationStrategy, reset);
8680
+ vue.onScopeDispose(() => {
8681
+ updateLocation.value = undefined;
8682
+ });
8650
8683
  if (typeof props.locationStrategy === 'function') {
8651
8684
  var _props$locationStrate;
8652
8685
  updateLocation.value = (_props$locationStrate = props.locationStrategy(data, props, contentStyles)) == null ? void 0 : _props$locationStrate.updateLocation;
@@ -8655,16 +8688,14 @@
8655
8688
  updateLocation.value = (_locationStrategies$p = locationStrategies[props.locationStrategy](data, props, contentStyles)) == null ? void 0 : _locationStrategies$p.updateLocation;
8656
8689
  }
8657
8690
  });
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
- });
8691
+ window.addEventListener('resize', onResize, {
8692
+ passive: true
8693
+ });
8694
+ vue.onScopeDispose(() => {
8695
+ window.removeEventListener('resize', onResize);
8696
+ updateLocation.value = undefined;
8697
+ });
8698
+ }
8668
8699
  function onResize(e) {
8669
8700
  var _updateLocation$value;
8670
8701
  (_updateLocation$value = updateLocation.value) == null ? void 0 : _updateLocation$value.call(updateLocation, e);
@@ -8958,13 +8989,30 @@
8958
8989
  maxWidth: convertToUnit(pixelCeil(clamp(available.x, minWidth.value === Infinity ? 0 : minWidth.value, maxWidth.value))),
8959
8990
  maxHeight: convertToUnit(pixelCeil(clamp(available.y, minHeight.value === Infinity ? 0 : minHeight.value, maxHeight.value)))
8960
8991
  });
8992
+ return {
8993
+ available,
8994
+ contentBox
8995
+ };
8961
8996
  }
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();
8997
+ vue.watch(() => [preferredAnchor.value, preferredOrigin.value, props.offset, props.minWidth, props.minHeight, props.maxWidth, props.maxHeight], () => updateLocation());
8998
+ vue.nextTick(() => {
8999
+ const result = updateLocation();
9000
+
9001
+ // TODO: overflowing content should only require a single updateLocation call
9002
+ // Icky hack to make sure the content is positioned consistently
9003
+ if (!result) return;
9004
+ const {
9005
+ available,
9006
+ contentBox
9007
+ } = result;
9008
+ if (contentBox.height > available.y) {
9009
+ requestAnimationFrame(() => {
9010
+ updateLocation();
9011
+ requestAnimationFrame(() => {
9012
+ updateLocation();
9013
+ });
9014
+ });
9015
+ }
8968
9016
  });
8969
9017
  return {
8970
9018
  updateLocation
@@ -9032,10 +9080,10 @@
9032
9080
  await vue.nextTick();
9033
9081
  scope.run(() => {
9034
9082
  if (typeof props.scrollStrategy === 'function') {
9035
- props.scrollStrategy(data, props);
9083
+ props.scrollStrategy(data, props, scope);
9036
9084
  } else {
9037
9085
  var _scrollStrategies$pro;
9038
- (_scrollStrategies$pro = scrollStrategies[props.scrollStrategy]) == null ? void 0 : _scrollStrategies$pro.call(scrollStrategies, data, props);
9086
+ (_scrollStrategies$pro = scrollStrategies[props.scrollStrategy]) == null ? void 0 : _scrollStrategies$pro.call(scrollStrategies, data, props, scope);
9039
9087
  }
9040
9088
  });
9041
9089
  });
@@ -9081,9 +9129,10 @@
9081
9129
  }
9082
9130
  });
9083
9131
  }
9084
- function repositionScrollStrategy(data) {
9132
+ function repositionScrollStrategy(data, props, scope) {
9085
9133
  let slow = false;
9086
9134
  let raf = -1;
9135
+ let ric = -1;
9087
9136
  function update(e) {
9088
9137
  requestNewFrame(() => {
9089
9138
  var _data$updateLocation$, _data$updateLocation;
@@ -9093,21 +9142,29 @@
9093
9142
  slow = time / (1000 / 60) > 2;
9094
9143
  });
9095
9144
  }
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(() => {
9145
+ ric = requestIdleCallback(() => {
9146
+ scope.run(() => {
9147
+ bindScroll(data.activatorEl.value ?? data.contentEl.value, e => {
9148
+ if (slow) {
9149
+ // If the position calculation is slow,
9150
+ // defer updates until scrolling is finished.
9151
+ // Browsers usually fire one scroll event per frame so
9152
+ // we just wait until we've got two frames without an event
9153
+ cancelAnimationFrame(raf);
9154
+ raf = requestAnimationFrame(() => {
9155
+ raf = requestAnimationFrame(() => {
9156
+ update(e);
9157
+ });
9158
+ });
9159
+ } else {
9105
9160
  update(e);
9106
- });
9161
+ }
9107
9162
  });
9108
- } else {
9109
- update(e);
9110
- }
9163
+ });
9164
+ });
9165
+ vue.onScopeDispose(() => {
9166
+ cancelIdleCallback(ric);
9167
+ cancelAnimationFrame(raf);
9111
9168
  });
9112
9169
  }
9113
9170
 
@@ -9750,6 +9807,11 @@
9750
9807
  function onClickOutside() {
9751
9808
  parent == null ? void 0 : parent.closeParents();
9752
9809
  }
9810
+ const activatorProps = vue.computed(() => vue.mergeProps({
9811
+ 'aria-haspopup': 'menu',
9812
+ 'aria-expanded': String(isActive.value),
9813
+ 'aria-owns': id.value
9814
+ }, props.activatorProps));
9753
9815
  useRender(() => {
9754
9816
  const [overlayProps] = filterVOverlayProps(props);
9755
9817
  return vue.createVNode(VOverlay, vue.mergeProps({
@@ -9759,11 +9821,7 @@
9759
9821
  "modelValue": isActive.value,
9760
9822
  "onUpdate:modelValue": $event => isActive.value = $event,
9761
9823
  "absolute": true,
9762
- "activatorProps": vue.mergeProps({
9763
- 'aria-haspopup': 'menu',
9764
- 'aria-expanded': String(isActive.value),
9765
- 'aria-owns': id.value
9766
- }, props.activatorProps),
9824
+ "activatorProps": activatorProps.value,
9767
9825
  "onClick:outside": onClickOutside
9768
9826
  }, scopeId), {
9769
9827
  activator: slots.activator,
@@ -9877,8 +9935,10 @@
9877
9935
  }
9878
9936
  function onKeydown(e) {
9879
9937
  if (props.readonly || form != null && form.isReadonly.value) return;
9880
- if (['Enter', 'ArrowDown', ' '].includes(e.key)) {
9938
+ if (['Enter', ' ', 'ArrowDown', 'ArrowUp', 'Home', 'End'].includes(e.key)) {
9881
9939
  e.preventDefault();
9940
+ }
9941
+ if (['Enter', 'ArrowDown', ' '].includes(e.key)) {
9882
9942
  menu.value = true;
9883
9943
  }
9884
9944
  if (['Escape', 'Tab'].includes(e.key)) {
@@ -9889,15 +9949,12 @@
9889
9949
  (_listRef$value = listRef.value) == null ? void 0 : _listRef$value.focus('next');
9890
9950
  } else if (e.key === 'ArrowUp') {
9891
9951
  var _listRef$value2;
9892
- e.preventDefault();
9893
9952
  (_listRef$value2 = listRef.value) == null ? void 0 : _listRef$value2.focus('prev');
9894
9953
  } else if (e.key === 'Home') {
9895
9954
  var _listRef$value3;
9896
- e.preventDefault();
9897
9955
  (_listRef$value3 = listRef.value) == null ? void 0 : _listRef$value3.focus('first');
9898
9956
  } else if (e.key === 'End') {
9899
9957
  var _listRef$value4;
9900
- e.preventDefault();
9901
9958
  (_listRef$value4 = listRef.value) == null ? void 0 : _listRef$value4.focus('last');
9902
9959
  }
9903
9960
  }
@@ -10079,7 +10136,7 @@
10079
10136
  const customFiltersLength = Object.keys((options == null ? void 0 : options.customKeyFilter) ?? {}).length;
10080
10137
  if (!(items != null && items.length)) return array;
10081
10138
  loop: for (let i = 0; i < items.length; i++) {
10082
- const item = items[i].raw;
10139
+ const item = items[i];
10083
10140
  const customMatches = {};
10084
10141
  const defaultMatches = {};
10085
10142
  let match = -1;
@@ -10119,7 +10176,7 @@
10119
10176
  }
10120
10177
  return array;
10121
10178
  }
10122
- function useFilter(props, items, query) {
10179
+ function useFilter(props, items, query, options) {
10123
10180
  const strQuery = vue.computed(() => typeof (query == null ? void 0 : query.value) !== 'string' && typeof (query == null ? void 0 : query.value) !== 'number' ? '' : String(query.value));
10124
10181
  const filteredItems = vue.ref([]);
10125
10182
  const filteredMatches = vue.ref(new Map());
@@ -10130,7 +10187,7 @@
10130
10187
  const results = filterItems(transformedItems, strQuery.value, {
10131
10188
  customKeyFilter: props.customKeyFilter,
10132
10189
  default: props.customFilter,
10133
- filterKeys: props.filterKeys,
10190
+ filterKeys: vue.unref(options == null ? void 0 : options.filterKeys) ?? props.filterKeys,
10134
10191
  filterMode: props.filterMode,
10135
10192
  noFilter: props.noFilter
10136
10193
  });
@@ -10241,6 +10298,9 @@
10241
10298
  }
10242
10299
  function onKeydown(e) {
10243
10300
  if (props.readonly || form != null && form.isReadonly.value) return;
10301
+ if (['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) {
10302
+ e.preventDefault();
10303
+ }
10244
10304
  if (['Enter', 'ArrowDown'].includes(e.key)) {
10245
10305
  menu.value = true;
10246
10306
  }
@@ -10252,11 +10312,9 @@
10252
10312
  }
10253
10313
  if (e.key === 'ArrowDown') {
10254
10314
  var _listRef$value;
10255
- e.preventDefault();
10256
10315
  (_listRef$value = listRef.value) == null ? void 0 : _listRef$value.focus('next');
10257
10316
  } else if (e.key === 'ArrowUp') {
10258
10317
  var _listRef$value2;
10259
- e.preventDefault();
10260
10318
  (_listRef$value2 = listRef.value) == null ? void 0 : _listRef$value2.focus('prev');
10261
10319
  }
10262
10320
  }
@@ -13585,7 +13643,9 @@
13585
13643
  if (props.readonly || form != null && form.isReadonly.value) return;
13586
13644
  const selectionStart = vTextFieldRef.value.selectionStart;
13587
13645
  const length = selected.value.length;
13588
- if (selectionIndex.value > -1) e.preventDefault();
13646
+ if (selectionIndex.value > -1 || ['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) {
13647
+ e.preventDefault();
13648
+ }
13589
13649
  if (['Enter', 'ArrowDown'].includes(e.key)) {
13590
13650
  menu.value = true;
13591
13651
  }
@@ -13597,11 +13657,9 @@
13597
13657
  }
13598
13658
  if (e.key === 'ArrowDown') {
13599
13659
  var _listRef$value;
13600
- e.preventDefault();
13601
13660
  (_listRef$value = listRef.value) == null ? void 0 : _listRef$value.focus('next');
13602
13661
  } else if (e.key === 'ArrowUp') {
13603
13662
  var _listRef$value2;
13604
- e.preventDefault();
13605
13663
  (_listRef$value2 = listRef.value) == null ? void 0 : _listRef$value2.focus('prev');
13606
13664
  }
13607
13665
  if (!props.multiple) return;
@@ -13896,6 +13954,10 @@
13896
13954
  });
13897
13955
  }
13898
13956
  });
13957
+ const activatorProps = vue.computed(() => vue.mergeProps({
13958
+ 'aria-haspopup': 'dialog',
13959
+ 'aria-expanded': String(isActive.value)
13960
+ }, props.activatorProps));
13899
13961
  useRender(() => {
13900
13962
  const [overlayProps] = filterVOverlayProps(props);
13901
13963
  return vue.createVNode(VOverlay, vue.mergeProps({
@@ -13909,10 +13971,7 @@
13909
13971
  "onUpdate:modelValue": $event => isActive.value = $event,
13910
13972
  "aria-role": "dialog",
13911
13973
  "aria-modal": "true",
13912
- "activatorProps": vue.mergeProps({
13913
- 'aria-haspopup': 'dialog',
13914
- 'aria-expanded': String(isActive.value)
13915
- }, props.activatorProps)
13974
+ "activatorProps": activatorProps.value
13916
13975
  }, scopeId), {
13917
13976
  activator: slots.activator,
13918
13977
  default: function () {
@@ -14261,12 +14320,15 @@
14261
14320
  onFocus();
14262
14321
  vue.nextTick(() => {
14263
14322
  model.value = [];
14264
- if (inputRef != null && inputRef.value) {
14265
- inputRef.value.value = '';
14266
- }
14267
14323
  callEvent(props['onClick:clear'], e);
14268
14324
  });
14269
14325
  }
14326
+ vue.watch(model, newValue => {
14327
+ const hasModelReset = !Array.isArray(newValue) || !newValue.length;
14328
+ if (hasModelReset && inputRef.value) {
14329
+ inputRef.value.value = '';
14330
+ }
14331
+ });
14270
14332
  useRender(() => {
14271
14333
  const hasCounter = !!(slots.counter || props.counter);
14272
14334
  const hasDetails = !!(hasCounter || slots.details);
@@ -15257,7 +15319,7 @@
15257
15319
  window.removeEventListener('touchmove', onTouchmove);
15258
15320
  window.removeEventListener('touchend', onTouchend);
15259
15321
  });
15260
- const isHorizontal = vue.computed(() => position.value !== 'bottom');
15322
+ const isHorizontal = vue.computed(() => ['left', 'right'].includes(position.value));
15261
15323
  const {
15262
15324
  addMovement,
15263
15325
  endTouch,
@@ -15269,11 +15331,11 @@
15269
15331
  const offset = vue.ref(0);
15270
15332
  let start;
15271
15333
  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);
15334
+ 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
15335
  }
15274
15336
  function getProgress(pos) {
15275
15337
  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();
15338
+ 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
15339
  return limit ? Math.max(0, Math.min(1, progress)) : progress;
15278
15340
  }
15279
15341
  function onTouchstart(e) {
@@ -15281,8 +15343,8 @@
15281
15343
  const touchX = e.changedTouches[0].clientX;
15282
15344
  const touchY = e.changedTouches[0].clientY;
15283
15345
  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());
15346
+ 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();
15347
+ 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
15348
  if (inTouchZone || inElement || isActive.value && isTemporary.value) {
15287
15349
  maybeDragging = true;
15288
15350
  start = [touchX, touchY];
@@ -15334,6 +15396,7 @@
15334
15396
  isActive.value = velocity.direction === ({
15335
15397
  left: 'right',
15336
15398
  right: 'left',
15399
+ top: 'down',
15337
15400
  bottom: 'up'
15338
15401
  }[position.value] || oops());
15339
15402
  } else {
@@ -15342,7 +15405,7 @@
15342
15405
  }
15343
15406
  const dragStyles = vue.computed(() => {
15344
15407
  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(),
15408
+ 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
15409
  transition: 'none'
15347
15410
  } : undefined;
15348
15411
  });
@@ -15358,7 +15421,7 @@
15358
15421
 
15359
15422
  // Types
15360
15423
 
15361
- const locations = ['start', 'end', 'left', 'right', 'bottom'];
15424
+ const locations = ['start', 'end', 'left', 'right', 'top', 'bottom'];
15362
15425
  const VNavigationDrawer = defineComponent({
15363
15426
  name: 'VNavigationDrawer',
15364
15427
  props: {
@@ -15815,7 +15878,7 @@
15815
15878
  disabled: !!props.disabled || props.length < 2,
15816
15879
  color: isActive ? props.activeColor : props.color,
15817
15880
  ariaCurrent: isActive,
15818
- ariaLabel: t(isActive ? props.currentPageAriaLabel : props.pageAriaLabel, index + 1),
15881
+ ariaLabel: t(isActive ? props.currentPageAriaLabel : props.pageAriaLabel, item),
15819
15882
  onClick: e => setValue(e, item)
15820
15883
  }
15821
15884
  };
@@ -17994,6 +18057,9 @@
17994
18057
  if (props.transition) return props.transition;
17995
18058
  return isActive.value ? 'scale-transition' : 'fade-transition';
17996
18059
  });
18060
+ const activatorProps = vue.computed(() => vue.mergeProps({
18061
+ 'aria-describedby': id.value
18062
+ }, props.activatorProps));
17997
18063
  useRender(() => {
17998
18064
  const [overlayProps] = filterVOverlayProps(props);
17999
18065
  return vue.createVNode(VOverlay, vue.mergeProps({
@@ -18010,9 +18076,7 @@
18010
18076
  "persistent": true,
18011
18077
  "role": "tooltip",
18012
18078
  "eager": true,
18013
- "activatorProps": vue.mergeProps({
18014
- 'aria-describedby': id.value
18015
- }, props.activatorProps),
18079
+ "activatorProps": activatorProps.value,
18016
18080
  "_disableGlobalStack": true
18017
18081
  }, scopeId), {
18018
18082
  activator: slots.activator,
@@ -18961,7 +19025,7 @@
18961
19025
  });
18962
19026
  },
18963
19027
  "item": item
18964
- }, slots), isExpanded(item.value) && ((_slots$expandedRow = slots['expanded-row']) == null ? void 0 : _slots$expandedRow.call(slots, {
19028
+ }, slots), isExpanded(item) && ((_slots$expandedRow = slots['expanded-row']) == null ? void 0 : _slots$expandedRow.call(slots, {
18965
19029
  item,
18966
19030
  columns: columns.value
18967
19031
  }))]);
@@ -18999,7 +19063,7 @@
18999
19063
  return Math.min(itemsLength.value, startIndex.value + itemsPerPage.value);
19000
19064
  });
19001
19065
  const pageCount = vue.computed(() => {
19002
- if (itemsPerPage.value === -1) return 1;
19066
+ if (itemsPerPage.value === -1 || itemsLength.value === 0) return 1;
19003
19067
  return Math.ceil(itemsLength.value / itemsPerPage.value);
19004
19068
  });
19005
19069
  vue.watchEffect(() => {
@@ -19054,6 +19118,30 @@
19054
19118
  type: String,
19055
19119
  default: '$last'
19056
19120
  },
19121
+ itemsPerPageText: {
19122
+ type: String,
19123
+ default: '$vuetify.dataFooter.itemsPerPageText'
19124
+ },
19125
+ pageText: {
19126
+ type: String,
19127
+ default: '$vuetify.dataFooter.pageText'
19128
+ },
19129
+ firstPageLabel: {
19130
+ type: String,
19131
+ default: '$vuetify.dataFooter.firstPage'
19132
+ },
19133
+ prevPageLabel: {
19134
+ type: String,
19135
+ default: '$vuetify.dataFooter.prevPage'
19136
+ },
19137
+ nextPageLabel: {
19138
+ type: String,
19139
+ default: '$vuetify.dataFooter.nextPage'
19140
+ },
19141
+ lastPageLabel: {
19142
+ type: String,
19143
+ default: '$vuetify.dataFooter.lastPage'
19144
+ },
19057
19145
  itemsPerPageOptions: {
19058
19146
  type: Array,
19059
19147
  default: () => [{
@@ -19070,7 +19158,7 @@
19070
19158
  title: '100'
19071
19159
  }, {
19072
19160
  value: -1,
19073
- title: 'All'
19161
+ title: '$vuetify.dataFooter.itemsPerPageAll'
19074
19162
  }]
19075
19163
  },
19076
19164
  showCurrentPage: Boolean
@@ -19079,6 +19167,9 @@
19079
19167
  let {
19080
19168
  slots
19081
19169
  } = _ref;
19170
+ const {
19171
+ t
19172
+ } = useLocale();
19082
19173
  const {
19083
19174
  page,
19084
19175
  pageCount,
@@ -19087,14 +19178,18 @@
19087
19178
  itemsLength,
19088
19179
  itemsPerPage
19089
19180
  } = usePagination();
19181
+ const itemsPerPageOptions = vue.computed(() => props.itemsPerPageOptions.map(option => ({
19182
+ ...option,
19183
+ title: t(option.title)
19184
+ })));
19090
19185
  return () => {
19091
19186
  var _slots$prepend;
19092
19187
  return vue.createVNode("div", {
19093
19188
  "class": "v-data-table-footer"
19094
19189
  }, [(_slots$prepend = slots.prepend) == null ? void 0 : _slots$prepend.call(slots), vue.createVNode("div", {
19095
19190
  "class": "v-data-table-footer__items-per-page"
19096
- }, [vue.createVNode("span", null, [vue.createTextVNode("Items per page:")]), vue.createVNode(VSelect, {
19097
- "items": props.itemsPerPageOptions,
19191
+ }, [vue.createVNode("span", null, [t(props.itemsPerPageText)]), vue.createVNode(VSelect, {
19192
+ "items": itemsPerPageOptions.value,
19098
19193
  "modelValue": itemsPerPage.value,
19099
19194
  "onUpdate:modelValue": v => itemsPerPage.value = Number(v),
19100
19195
  "density": "compact",
@@ -19102,30 +19197,35 @@
19102
19197
  "hide-details": true
19103
19198
  }, null)]), vue.createVNode("div", {
19104
19199
  "class": "v-data-table-footer__info"
19105
- }, [vue.createVNode("div", null, [(startIndex.value ?? -1) + 1, vue.createTextVNode(" - "), stopIndex.value ?? 0, vue.createTextVNode(" of "), itemsLength.value ?? 0])]), vue.createVNode("div", {
19200
+ }, [vue.createVNode("div", null, [t(props.pageText, !itemsLength.value ? 0 : startIndex.value + 1, stopIndex.value, itemsLength.value)])]), vue.createVNode("div", {
19106
19201
  "class": "v-data-table-footer__pagination"
19107
19202
  }, [vue.createVNode(VBtn, {
19108
19203
  "icon": props.firstIcon,
19109
19204
  "variant": "plain",
19110
19205
  "onClick": () => page.value = 1,
19111
- "disabled": page.value === 1
19206
+ "disabled": page.value === 1,
19207
+ "aria-label": t(props.firstPageLabel)
19112
19208
  }, null), vue.createVNode(VBtn, {
19113
19209
  "icon": props.prevIcon,
19114
19210
  "variant": "plain",
19115
19211
  "onClick": () => page.value = Math.max(1, page.value - 1),
19116
- "disabled": page.value === 1
19117
- }, null), props.showCurrentPage && vue.createVNode("div", {
19118
- "key": "page"
19119
- }, [vue.createTextVNode("page.value")]), vue.createVNode(VBtn, {
19212
+ "disabled": page.value === 1,
19213
+ "aria-label": t(props.prevPageLabel)
19214
+ }, null), props.showCurrentPage && vue.createVNode("span", {
19215
+ "key": "page",
19216
+ "class": "v-data-table-footer__page"
19217
+ }, [page.value]), vue.createVNode(VBtn, {
19120
19218
  "icon": props.nextIcon,
19121
19219
  "variant": "plain",
19122
19220
  "onClick": () => page.value = Math.min(pageCount.value, page.value + 1),
19123
- "disabled": page.value === pageCount.value
19221
+ "disabled": page.value === pageCount.value,
19222
+ "aria-label": t(props.nextPageLabel)
19124
19223
  }, null), vue.createVNode(VBtn, {
19125
19224
  "icon": props.lastIcon,
19126
19225
  "variant": "plain",
19127
19226
  "onClick": () => page.value = pageCount.value,
19128
- "disabled": page.value === pageCount.value
19227
+ "disabled": page.value === pageCount.value,
19228
+ "aria-label": t(props.lastPageLabel)
19129
19229
  }, null)])]);
19130
19230
  };
19131
19231
  }
@@ -19170,18 +19270,14 @@
19170
19270
  page,
19171
19271
  itemsPerPage,
19172
19272
  sortBy,
19173
- startIndex,
19174
- stopIndex,
19175
- pageCount
19273
+ groupBy
19176
19274
  } = _ref;
19177
19275
  const vm = getCurrentInstance('VDataTable');
19178
19276
  const options = vue.computed(() => ({
19179
19277
  page: page.value,
19180
19278
  itemsPerPage: itemsPerPage.value,
19181
- startIndex: startIndex.value,
19182
- stopIndex: stopIndex.value,
19183
- pageCount: pageCount.value,
19184
- sortBy: sortBy.value
19279
+ sortBy: sortBy.value,
19280
+ groupBy: groupBy.value
19185
19281
  }));
19186
19282
 
19187
19283
  // Reset page when sorting changes
@@ -19259,9 +19355,12 @@
19259
19355
  const {
19260
19356
  items
19261
19357
  } = useDataTableItems(props, columns);
19358
+ const filterKeys = vue.computed(() => columns.value.map(c => 'columns.' + c.key));
19262
19359
  const {
19263
19360
  filteredItems
19264
- } = useFilter(props, items, vue.toRef(props, 'search'));
19361
+ } = useFilter(props, items, vue.toRef(props, 'search'), {
19362
+ filterKeys
19363
+ });
19265
19364
  const {
19266
19365
  sortBy
19267
19366
  } = createSort(props);
@@ -19280,8 +19379,7 @@
19280
19379
  page,
19281
19380
  itemsPerPage,
19282
19381
  startIndex,
19283
- stopIndex,
19284
- pageCount
19382
+ stopIndex
19285
19383
  } = createPagination(props, flatItems);
19286
19384
  const {
19287
19385
  paginatedItems
@@ -19293,9 +19391,7 @@
19293
19391
  page,
19294
19392
  itemsPerPage,
19295
19393
  sortBy,
19296
- pageCount,
19297
- startIndex,
19298
- stopIndex
19394
+ groupBy
19299
19395
  });
19300
19396
  provideDefaults({
19301
19397
  VDataTableRows: {
@@ -19451,9 +19547,12 @@
19451
19547
  const {
19452
19548
  items
19453
19549
  } = useDataTableItems(props, columns);
19550
+ const filterKeys = vue.computed(() => columns.value.map(c => 'columns.' + c.key));
19454
19551
  const {
19455
19552
  filteredItems
19456
- } = useFilter(props, items, vue.toRef(props, 'search'));
19553
+ } = useFilter(props, items, vue.toRef(props, 'search'), {
19554
+ filterKeys
19555
+ });
19457
19556
  const {
19458
19557
  sortBy
19459
19558
  } = createSort(props);
@@ -19486,10 +19585,8 @@
19486
19585
  useOptions({
19487
19586
  sortBy,
19488
19587
  page: vue.ref(1),
19489
- startIndex: vue.ref(0),
19490
- stopIndex: vue.computed(() => flatItems.value.length - 1),
19491
- pageCount: vue.ref(1),
19492
- itemsPerPage: vue.ref(-1)
19588
+ itemsPerPage: vue.ref(-1),
19589
+ groupBy
19493
19590
  });
19494
19591
  provideDefaults({
19495
19592
  VDataTableRows: {
@@ -19565,7 +19662,8 @@
19565
19662
  ...makeDataTableItemProps(),
19566
19663
  ...makeDataTableSelectProps(),
19567
19664
  ...makeDataTableSortProps(),
19568
- ...makeDataTablePaginateProps()
19665
+ ...makeDataTablePaginateProps(),
19666
+ ...makeDataTableGroupProps()
19569
19667
  },
19570
19668
  emits: {
19571
19669
  'update:modelValue': value => true,
@@ -19574,6 +19672,7 @@
19574
19672
  'update:sortBy': sortBy => true,
19575
19673
  'update:options': options => true,
19576
19674
  'update:expanded': options => true,
19675
+ 'update:groupBy': value => true,
19577
19676
  'click:row': (event, value) => true
19578
19677
  },
19579
19678
  setup(props, _ref) {
@@ -19581,10 +19680,12 @@
19581
19680
  emit,
19582
19681
  slots
19583
19682
  } = _ref;
19683
+ const groupBy = useProxiedModel(props, 'groupBy');
19584
19684
  createExpanded(props);
19585
19685
  const {
19586
19686
  columns
19587
19687
  } = createHeaders(props, {
19688
+ groupBy,
19588
19689
  showSelect: vue.toRef(props, 'showSelect'),
19589
19690
  showExpand: vue.toRef(props, 'showExpand')
19590
19691
  });
@@ -19595,21 +19696,22 @@
19595
19696
  sortBy,
19596
19697
  toggleSort
19597
19698
  } = createSort(props);
19699
+ const {
19700
+ opened
19701
+ } = createGroupBy(props, groupBy, sortBy);
19598
19702
  const {
19599
19703
  page,
19600
- itemsPerPage,
19601
- startIndex,
19602
- stopIndex,
19603
- pageCount
19704
+ itemsPerPage
19604
19705
  } = createPagination(props, items);
19706
+ const {
19707
+ flatItems
19708
+ } = useGroupedItems(items, groupBy, opened);
19605
19709
  createSelection(props, items);
19606
19710
  useOptions({
19607
19711
  page,
19608
19712
  itemsPerPage,
19609
19713
  sortBy,
19610
- startIndex,
19611
- stopIndex,
19612
- pageCount
19714
+ groupBy
19613
19715
  });
19614
19716
  vue.provide('v-data-table', {
19615
19717
  toggleSort,
@@ -19645,7 +19747,7 @@
19645
19747
  "class": "v-data-table__tbody",
19646
19748
  "role": "rowgroup"
19647
19749
  }, [slots.body ? slots.body() : vue.createVNode(VDataTableRows, {
19648
- "items": items.value,
19750
+ "items": flatItems.value,
19649
19751
  "onClick:row": (event, value) => emit('click:row', event, value)
19650
19752
  }, slots)]), (_slots$tbody = slots.tbody) == null ? void 0 : _slots$tbody.call(slots), (_slots$tfoot = slots.tfoot) == null ? void 0 : _slots$tfoot.call(slots)]);
19651
19753
  }),
@@ -19936,6 +20038,7 @@
19936
20038
  VDataTableRow: VDataTableRow,
19937
20039
  VDataTableVirtual: VDataTableVirtual,
19938
20040
  VDataTableServer: VDataTableServer,
20041
+ VDataTableFooter: VDataTableFooter,
19939
20042
  VVirtualScroll: VVirtualScroll
19940
20043
  });
19941
20044
 
@@ -20151,7 +20254,7 @@
20151
20254
  locale
20152
20255
  };
20153
20256
  }
20154
- const version$1 = "3.2.0-next-20230118.0";
20257
+ const version$1 = "4.0.0-dev-20230211.0";
20155
20258
  createVuetify$1.version = version$1;
20156
20259
 
20157
20260
  // Vue's inject() can only be used in setup
@@ -20164,7 +20267,7 @@
20164
20267
  }
20165
20268
  }
20166
20269
 
20167
- const version = "3.2.0-next-20230118.0";
20270
+ const version = "4.0.0-dev-20230211.0";
20168
20271
 
20169
20272
  const createVuetify = function () {
20170
20273
  let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};