vuetify 3.1.1 → 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 (135) hide show
  1. package/dist/json/attributes.json +495 -483
  2. package/dist/json/importMap.json +58 -58
  3. package/dist/json/tags.json +4 -1
  4. package/dist/json/web-types.json +892 -839
  5. package/dist/vuetify-labs.css +356 -346
  6. package/dist/vuetify-labs.d.ts +257 -179
  7. package/dist/vuetify-labs.esm.js +432 -278
  8. package/dist/vuetify-labs.esm.js.map +1 -1
  9. package/dist/vuetify-labs.js +431 -277
  10. package/dist/vuetify-labs.min.css +2 -2
  11. package/dist/vuetify.css +94 -84
  12. package/dist/vuetify.d.ts +261 -194
  13. package/dist/vuetify.esm.js +346 -242
  14. package/dist/vuetify.esm.js.map +1 -1
  15. package/dist/vuetify.js +345 -241
  16. package/dist/vuetify.js.map +1 -1
  17. package/dist/vuetify.min.css +2 -2
  18. package/dist/vuetify.min.js +731 -721
  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 +4 -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 +16 -5
  28. package/lib/components/VBtn/VBtn.mjs.map +1 -1
  29. package/lib/components/VCard/VCard.mjs +5 -2
  30. package/lib/components/VCard/VCard.mjs.map +1 -1
  31. package/lib/components/VCard/index.d.ts +8 -2
  32. package/lib/components/VChip/VChip.mjs +18 -4
  33. package/lib/components/VChip/VChip.mjs.map +1 -1
  34. package/lib/components/VChip/index.d.ts +15 -2
  35. package/lib/components/VChipGroup/VChipGroup.mjs +1 -0
  36. package/lib/components/VChipGroup/VChipGroup.mjs.map +1 -1
  37. package/lib/components/VCombobox/VCombobox.mjs +5 -4
  38. package/lib/components/VCombobox/VCombobox.mjs.map +1 -1
  39. package/lib/components/VCombobox/index.d.ts +43 -20
  40. package/lib/components/VDefaultsProvider/index.d.ts +5 -4
  41. package/lib/components/VDialog/VDialog.mjs +6 -5
  42. package/lib/components/VDialog/VDialog.mjs.map +1 -1
  43. package/lib/components/VDialog/index.d.ts +57 -34
  44. package/lib/components/VDivider/VDivider.mjs +6 -6
  45. package/lib/components/VDivider/VDivider.mjs.map +1 -1
  46. package/lib/components/VField/VField.mjs +28 -26
  47. package/lib/components/VField/VField.mjs.map +1 -1
  48. package/lib/components/VFileInput/VFileInput.css +1 -0
  49. package/lib/components/VFileInput/VFileInput.mjs +7 -4
  50. package/lib/components/VFileInput/VFileInput.mjs.map +1 -1
  51. package/lib/components/VFileInput/VFileInput.sass +1 -0
  52. package/lib/components/VForm/index.d.ts +0 -3
  53. package/lib/components/VGrid/VGrid.css +5 -0
  54. package/lib/components/VGrid/VGrid.sass +5 -0
  55. package/lib/components/VList/VList.mjs +4 -1
  56. package/lib/components/VList/VList.mjs.map +1 -1
  57. package/lib/components/VList/VListItem.css +1 -1
  58. package/lib/components/VList/VListItem.mjs +34 -20
  59. package/lib/components/VList/VListItem.mjs.map +1 -1
  60. package/lib/components/VList/VListItem.sass +1 -1
  61. package/lib/components/VList/index.d.ts +20 -1
  62. package/lib/components/VMenu/VMenu.mjs +6 -5
  63. package/lib/components/VMenu/VMenu.mjs.map +1 -1
  64. package/lib/components/VMenu/index.d.ts +57 -34
  65. package/lib/components/VNavigationDrawer/VNavigationDrawer.css +4 -0
  66. package/lib/components/VNavigationDrawer/VNavigationDrawer.mjs +1 -1
  67. package/lib/components/VNavigationDrawer/VNavigationDrawer.mjs.map +1 -1
  68. package/lib/components/VNavigationDrawer/VNavigationDrawer.sass +4 -0
  69. package/lib/components/VNavigationDrawer/index.d.ts +3 -3
  70. package/lib/components/VNavigationDrawer/touch.mjs +7 -6
  71. package/lib/components/VNavigationDrawer/touch.mjs.map +1 -1
  72. package/lib/components/VOverlay/index.d.ts +34 -11
  73. package/lib/components/VOverlay/locationStrategies.mjs +40 -29
  74. package/lib/components/VOverlay/locationStrategies.mjs.map +1 -1
  75. package/lib/components/VOverlay/scrollStrategies.mjs +25 -16
  76. package/lib/components/VOverlay/scrollStrategies.mjs.map +1 -1
  77. package/lib/components/VPagination/VPagination.mjs +1 -1
  78. package/lib/components/VPagination/VPagination.mjs.map +1 -1
  79. package/lib/components/VProgressLinear/VProgressLinear.mjs +13 -1
  80. package/lib/components/VProgressLinear/VProgressLinear.mjs.map +1 -1
  81. package/lib/components/VProgressLinear/index.d.ts +18 -0
  82. package/lib/components/VSelect/VSelect.mjs +4 -4
  83. package/lib/components/VSelect/VSelect.mjs.map +1 -1
  84. package/lib/components/VSelect/index.d.ts +43 -20
  85. package/lib/components/VSlider/VSliderThumb.mjs +5 -1
  86. package/lib/components/VSlider/VSliderThumb.mjs.map +1 -1
  87. package/lib/components/VSnackbar/index.d.ts +42 -19
  88. package/lib/components/VTable/VTable.css +4 -4
  89. package/lib/components/VTable/VTable.sass +2 -2
  90. package/lib/components/VTooltip/VTooltip.mjs +4 -3
  91. package/lib/components/VTooltip/VTooltip.mjs.map +1 -1
  92. package/lib/components/VTooltip/index.d.ts +57 -34
  93. package/lib/components/index.d.ts +247 -179
  94. package/lib/composables/defaults.mjs +1 -1
  95. package/lib/composables/defaults.mjs.map +1 -1
  96. package/lib/composables/filter.mjs +3 -3
  97. package/lib/composables/filter.mjs.map +1 -1
  98. package/lib/composables/form.mjs +0 -1
  99. package/lib/composables/form.mjs.map +1 -1
  100. package/lib/composables/teleport.mjs +6 -7
  101. package/lib/composables/teleport.mjs.map +1 -1
  102. package/lib/composables/toggleScope.mjs +14 -7
  103. package/lib/composables/toggleScope.mjs.map +1 -1
  104. package/lib/entry-bundler.mjs +1 -1
  105. package/lib/framework.mjs +1 -1
  106. package/lib/index.d.ts +17 -17
  107. package/lib/labs/VDataTable/VDataTable.mjs +10 -6
  108. package/lib/labs/VDataTable/VDataTable.mjs.map +1 -1
  109. package/lib/labs/VDataTable/VDataTableGroupHeaderRow.mjs +3 -3
  110. package/lib/labs/VDataTable/VDataTableGroupHeaderRow.mjs.map +1 -1
  111. package/lib/labs/VDataTable/VDataTableRows.mjs +36 -8
  112. package/lib/labs/VDataTable/VDataTableRows.mjs.map +1 -1
  113. package/lib/labs/VDataTable/VDataTableServer.mjs +23 -10
  114. package/lib/labs/VDataTable/VDataTableServer.mjs.map +1 -1
  115. package/lib/labs/VDataTable/VDataTableVirtual.mjs +6 -2
  116. package/lib/labs/VDataTable/VDataTableVirtual.mjs.map +1 -1
  117. package/lib/labs/VDataTable/composables/group.mjs +9 -4
  118. package/lib/labs/VDataTable/composables/group.mjs.map +1 -1
  119. package/lib/labs/VDataTable/composables/options.mjs +4 -2
  120. package/lib/labs/VDataTable/composables/options.mjs.map +1 -1
  121. package/lib/labs/VDataTable/composables/sort.mjs +3 -5
  122. package/lib/labs/VDataTable/composables/sort.mjs.map +1 -1
  123. package/lib/labs/VDataTable/index.d.ts +11 -0
  124. package/lib/labs/components.d.ts +11 -0
  125. package/lib/locale/adapters/vue-i18n.mjs +12 -2
  126. package/lib/locale/adapters/vue-i18n.mjs.map +1 -1
  127. package/lib/locale/en.mjs +2 -2
  128. package/lib/locale/en.mjs.map +1 -1
  129. package/lib/locale/sv.mjs +7 -7
  130. package/lib/locale/sv.mjs.map +1 -1
  131. package/lib/util/defineComponent.mjs +21 -18
  132. package/lib/util/defineComponent.mjs.map +1 -1
  133. package/lib/util/helpers.mjs +5 -1
  134. package/lib/util/helpers.mjs.map +1 -1
  135. package/package.json +2 -2
package/dist/vuetify.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.1.1
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));
@@ -1892,8 +1906,8 @@
1892
1906
  root: 'Pagination Navigation',
1893
1907
  next: 'Next page',
1894
1908
  previous: 'Previous page',
1895
- page: 'Goto Page {0}',
1896
- currentPage: 'Page {0}, Current Page',
1909
+ page: 'Go to page {0}',
1910
+ currentPage: 'Page {0}, Current page',
1897
1911
  first: 'First page',
1898
1912
  last: 'Last page'
1899
1913
  }
@@ -4384,9 +4398,69 @@
4384
4398
  updated: updated$1
4385
4399
  };
4386
4400
 
4401
+ // Composables
4402
+
4403
+ // Types
4404
+
4405
+ const oppositeMap = {
4406
+ center: 'center',
4407
+ top: 'bottom',
4408
+ bottom: 'top',
4409
+ left: 'right',
4410
+ right: 'left'
4411
+ };
4412
+ const makeLocationProps = propsFactory({
4413
+ location: String
4414
+ }, 'location');
4415
+ function useLocation(props) {
4416
+ let opposite = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
4417
+ let offset = arguments.length > 2 ? arguments[2] : undefined;
4418
+ const {
4419
+ isRtl
4420
+ } = useRtl();
4421
+ const locationStyles = vue.computed(() => {
4422
+ if (!props.location) return {};
4423
+ const {
4424
+ side,
4425
+ align
4426
+ } = parseAnchor(props.location.split(' ').length > 1 ? props.location : `${props.location} center`, isRtl.value);
4427
+ function getOffset(side) {
4428
+ return offset ? offset(side) : 0;
4429
+ }
4430
+ const styles = {};
4431
+ if (side !== 'center') {
4432
+ if (opposite) styles[oppositeMap[side]] = `calc(100% - ${getOffset(side)}px)`;else styles[side] = 0;
4433
+ }
4434
+ if (align !== 'center') {
4435
+ if (opposite) styles[oppositeMap[align]] = `calc(100% - ${getOffset(align)}px)`;else styles[align] = 0;
4436
+ } else {
4437
+ if (side === 'center') styles.top = styles.left = '50%';else {
4438
+ styles[{
4439
+ top: 'left',
4440
+ bottom: 'left',
4441
+ left: 'top',
4442
+ right: 'top'
4443
+ }[side]] = '50%';
4444
+ }
4445
+ styles.transform = {
4446
+ top: 'translateX(-50%)',
4447
+ bottom: 'translateX(-50%)',
4448
+ left: 'translateY(-50%)',
4449
+ right: 'translateY(-50%)',
4450
+ center: 'translate(-50%, -50%)'
4451
+ }[side];
4452
+ }
4453
+ return styles;
4454
+ });
4455
+ return {
4456
+ locationStyles
4457
+ };
4458
+ }
4459
+
4387
4460
  const VProgressLinear = defineComponent({
4388
4461
  name: 'VProgressLinear',
4389
4462
  props: {
4463
+ absolute: Boolean,
4390
4464
  active: {
4391
4465
  type: Boolean,
4392
4466
  default: true
@@ -4416,6 +4490,9 @@
4416
4490
  stream: Boolean,
4417
4491
  striped: Boolean,
4418
4492
  roundedBar: Boolean,
4493
+ ...makeLocationProps({
4494
+ location: 'top'
4495
+ }),
4419
4496
  ...makeRoundedProps(),
4420
4497
  ...makeTagProps(),
4421
4498
  ...makeThemeProps()
@@ -4434,6 +4511,9 @@
4434
4511
  const {
4435
4512
  themeClasses
4436
4513
  } = provideTheme(props);
4514
+ const {
4515
+ locationStyles
4516
+ } = useLocation(props);
4437
4517
  const {
4438
4518
  textColorClasses,
4439
4519
  textColorStyles
@@ -4475,6 +4555,7 @@
4475
4555
  useRender(() => vue.createVNode(props.tag, {
4476
4556
  "ref": intersectionRef,
4477
4557
  "class": ['v-progress-linear', {
4558
+ 'v-progress-linear--absolute': props.absolute,
4478
4559
  'v-progress-linear--active': props.active && isIntersecting.value,
4479
4560
  'v-progress-linear--reverse': isReversed.value,
4480
4561
  'v-progress-linear--rounded': props.rounded,
@@ -4482,8 +4563,11 @@
4482
4563
  'v-progress-linear--striped': props.striped
4483
4564
  }, roundedClasses.value, themeClasses.value],
4484
4565
  "style": {
4566
+ bottom: props.location === 'bottom' ? 0 : undefined,
4567
+ top: props.location === 'top' ? 0 : undefined,
4485
4568
  height: props.active ? convertToUnit(height.value) : 0,
4486
- '--v-progress-linear-height': convertToUnit(height.value)
4569
+ '--v-progress-linear-height': convertToUnit(height.value),
4570
+ ...locationStyles.value
4487
4571
  },
4488
4572
  "role": "progressbar",
4489
4573
  "aria-hidden": props.active ? 'false' : 'true',
@@ -4569,65 +4653,6 @@
4569
4653
  }, null)]);
4570
4654
  }
4571
4655
 
4572
- // Composables
4573
-
4574
- // Types
4575
-
4576
- const oppositeMap = {
4577
- center: 'center',
4578
- top: 'bottom',
4579
- bottom: 'top',
4580
- left: 'right',
4581
- right: 'left'
4582
- };
4583
- const makeLocationProps = propsFactory({
4584
- location: String
4585
- }, 'location');
4586
- function useLocation(props) {
4587
- let opposite = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
4588
- let offset = arguments.length > 2 ? arguments[2] : undefined;
4589
- const {
4590
- isRtl
4591
- } = useRtl();
4592
- const locationStyles = vue.computed(() => {
4593
- if (!props.location) return {};
4594
- const {
4595
- side,
4596
- align
4597
- } = parseAnchor(props.location.split(' ').length > 1 ? props.location : `${props.location} center`, isRtl.value);
4598
- function getOffset(side) {
4599
- return offset ? offset(side) : 0;
4600
- }
4601
- const styles = {};
4602
- if (side !== 'center') {
4603
- if (opposite) styles[oppositeMap[side]] = `calc(100% - ${getOffset(side)}px)`;else styles[side] = 0;
4604
- }
4605
- if (align !== 'center') {
4606
- if (opposite) styles[oppositeMap[align]] = `calc(100% - ${getOffset(align)}px)`;else styles[align] = 0;
4607
- } else {
4608
- if (side === 'center') styles.top = styles.left = '50%';else {
4609
- styles[{
4610
- top: 'left',
4611
- bottom: 'left',
4612
- left: 'top',
4613
- right: 'top'
4614
- }[side]] = '50%';
4615
- }
4616
- styles.transform = {
4617
- top: 'translateX(-50%)',
4618
- bottom: 'translateX(-50%)',
4619
- left: 'translateY(-50%)',
4620
- right: 'translateY(-50%)',
4621
- center: 'translate(-50%, -50%)'
4622
- }[side];
4623
- }
4624
- return styles;
4625
- });
4626
- return {
4627
- locationStyles
4628
- };
4629
- }
4630
-
4631
4656
  // Utilities
4632
4657
 
4633
4658
  // Types
@@ -4833,21 +4858,31 @@
4833
4858
  const group = useGroupItem(props, props.symbol, false);
4834
4859
  const link = useLink(props, attrs);
4835
4860
  const isActive = vue.computed(() => {
4836
- var _link$isActive;
4837
- return props.active !== false && (props.active || ((_link$isActive = link.isActive) == null ? void 0 : _link$isActive.value) || (group == null ? void 0 : group.isSelected.value));
4861
+ if (props.active !== undefined) {
4862
+ return props.active;
4863
+ }
4864
+ if (link.isLink.value) {
4865
+ var _link$isActive;
4866
+ return (_link$isActive = link.isActive) == null ? void 0 : _link$isActive.value;
4867
+ }
4868
+ return group == null ? void 0 : group.isSelected.value;
4838
4869
  });
4839
4870
  const isDisabled = vue.computed(() => (group == null ? void 0 : group.disabled.value) || props.disabled);
4840
4871
  const isElevated = vue.computed(() => {
4841
4872
  return props.variant === 'elevated' && !(props.disabled || props.flat || props.border);
4842
4873
  });
4874
+ const valueAttr = vue.computed(() => {
4875
+ if (props.value === undefined) return undefined;
4876
+ return Object(props.value) === props.value ? JSON.stringify(props.value, null, 0) : props.value;
4877
+ });
4843
4878
  useSelectLink(link, group == null ? void 0 : group.select);
4844
4879
  useRender(() => {
4845
- var _slots$prepend, _slots$default, _slots$append, _slots$loader;
4880
+ var _link$isActive2, _link$isActive3, _slots$prepend, _slots$default, _slots$append, _slots$loader;
4846
4881
  const Tag = link.isLink.value ? 'a' : props.tag;
4847
- const hasColor = !group || group.isSelected.value;
4848
4882
  const hasPrepend = !!(props.prependIcon || slots.prepend);
4849
4883
  const hasAppend = !!(props.appendIcon || slots.append);
4850
4884
  const hasIcon = !!(props.icon && props.icon !== true);
4885
+ 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);
4851
4886
  return vue.withDirectives(vue.createVNode(Tag, {
4852
4887
  "type": Tag === 'a' ? undefined : 'button',
4853
4888
  "class": ['v-btn', group == null ? void 0 : group.selectedClass.value, {
@@ -4868,7 +4903,8 @@
4868
4903
  if (isDisabled.value) return;
4869
4904
  (_link$navigate = link.navigate) == null ? void 0 : _link$navigate.call(link, e);
4870
4905
  group == null ? void 0 : group.toggle();
4871
- }
4906
+ },
4907
+ "value": valueAttr.value
4872
4908
  }, {
4873
4909
  default: () => [genOverlays(true, 'v-btn'), !props.icon && hasPrepend && vue.createVNode(VDefaultsProvider, {
4874
4910
  "key": "prepend",
@@ -5342,32 +5378,34 @@
5342
5378
  if (hasLabel.value) {
5343
5379
  const el = labelRef.value.$el;
5344
5380
  const targetEl = floatingLabelRef.value.$el;
5345
- const rect = nullifyTransforms(el);
5346
- const targetRect = targetEl.getBoundingClientRect();
5347
- const x = targetRect.x - rect.x;
5348
- const y = targetRect.y - rect.y - (rect.height / 2 - targetRect.height / 2);
5349
- const targetWidth = targetRect.width / 0.75;
5350
- const width = Math.abs(targetWidth - rect.width) > 1 ? {
5351
- maxWidth: convertToUnit(targetWidth)
5352
- } : undefined;
5353
- const style = getComputedStyle(el);
5354
- const targetStyle = getComputedStyle(targetEl);
5355
- const duration = parseFloat(style.transitionDuration) * 1000 || 150;
5356
- const scale = parseFloat(targetStyle.getPropertyValue('--v-field-label-scale'));
5357
- const color = targetStyle.getPropertyValue('color');
5358
- el.style.visibility = 'visible';
5359
- targetEl.style.visibility = 'hidden';
5360
- animate(el, {
5361
- transform: `translate(${x}px, ${y}px) scale(${scale})`,
5362
- color,
5363
- ...width
5364
- }, {
5365
- duration,
5366
- easing: standardEasing,
5367
- direction: val ? 'normal' : 'reverse'
5368
- }).finished.then(() => {
5369
- el.style.removeProperty('visibility');
5370
- targetEl.style.removeProperty('visibility');
5381
+ requestAnimationFrame(() => {
5382
+ const rect = nullifyTransforms(el);
5383
+ const targetRect = targetEl.getBoundingClientRect();
5384
+ const x = targetRect.x - rect.x;
5385
+ const y = targetRect.y - rect.y - (rect.height / 2 - targetRect.height / 2);
5386
+ const targetWidth = targetRect.width / 0.75;
5387
+ const width = Math.abs(targetWidth - rect.width) > 1 ? {
5388
+ maxWidth: convertToUnit(targetWidth)
5389
+ } : undefined;
5390
+ const style = getComputedStyle(el);
5391
+ const targetStyle = getComputedStyle(targetEl);
5392
+ const duration = parseFloat(style.transitionDuration) * 1000 || 150;
5393
+ const scale = parseFloat(targetStyle.getPropertyValue('--v-field-label-scale'));
5394
+ const color = targetStyle.getPropertyValue('color');
5395
+ el.style.visibility = 'visible';
5396
+ targetEl.style.visibility = 'hidden';
5397
+ animate(el, {
5398
+ transform: `translate(${x}px, ${y}px) scale(${scale})`,
5399
+ color,
5400
+ ...width
5401
+ }, {
5402
+ duration,
5403
+ easing: standardEasing,
5404
+ direction: val ? 'normal' : 'reverse'
5405
+ }).finished.then(() => {
5406
+ el.style.removeProperty('visibility');
5407
+ targetEl.style.removeProperty('visibility');
5408
+ });
5371
5409
  });
5372
5410
  }
5373
5411
  }, {
@@ -5556,7 +5594,6 @@
5556
5594
  const makeFormProps = propsFactory({
5557
5595
  disabled: Boolean,
5558
5596
  fastFail: Boolean,
5559
- lazyValidation: Boolean,
5560
5597
  readonly: Boolean,
5561
5598
  modelValue: {
5562
5599
  type: Boolean,
@@ -6701,6 +6738,7 @@
6701
6738
  provideDefaults({
6702
6739
  VChip: {
6703
6740
  color: vue.toRef(props, 'color'),
6741
+ disabled: vue.toRef(props, 'disabled'),
6704
6742
  filter: vue.toRef(props, 'filter'),
6705
6743
  variant: vue.toRef(props, 'variant')
6706
6744
  }
@@ -6750,7 +6788,10 @@
6750
6788
  default: '$complete'
6751
6789
  },
6752
6790
  label: Boolean,
6753
- link: Boolean,
6791
+ link: {
6792
+ type: Boolean,
6793
+ default: undefined
6794
+ },
6754
6795
  pill: Boolean,
6755
6796
  prependAvatar: String,
6756
6797
  prependIcon: IconValue,
@@ -6763,6 +6804,8 @@
6763
6804
  type: Boolean,
6764
6805
  default: true
6765
6806
  },
6807
+ onClick: EventProp,
6808
+ onClickOnce: EventProp,
6766
6809
  ...makeBorderProps(),
6767
6810
  ...makeDensityProps(),
6768
6811
  ...makeElevationProps(),
@@ -6816,7 +6859,8 @@
6816
6859
  const isActive = useProxiedModel(props, 'modelValue');
6817
6860
  const group = useGroupItem(props, VChipGroupSymbol, false);
6818
6861
  const link = useLink(props, attrs);
6819
- const isClickable = vue.computed(() => !props.disabled && (!!group || link.isClickable.value || props.link));
6862
+ const isLink = vue.computed(() => props.link !== false && link.isLink.value);
6863
+ const isClickable = vue.computed(() => !props.disabled && props.link !== false && (!!group || props.link || link.isClickable.value));
6820
6864
  function onCloseClick(e) {
6821
6865
  isActive.value = false;
6822
6866
  emit('click:close', e);
@@ -6828,6 +6872,12 @@
6828
6872
  (_link$navigate = link.navigate) == null ? void 0 : _link$navigate.call(link, e);
6829
6873
  group == null ? void 0 : group.toggle();
6830
6874
  }
6875
+ function onKeyDown(e) {
6876
+ if (e.key === 'Enter' || e.key === ' ') {
6877
+ e.preventDefault();
6878
+ onClick(e);
6879
+ }
6880
+ }
6831
6881
  return () => {
6832
6882
  var _slots$default;
6833
6883
  const Tag = link.isLink.value ? 'a' : props.tag;
@@ -6848,7 +6898,9 @@
6848
6898
  "disabled": props.disabled || undefined,
6849
6899
  "draggable": props.draggable,
6850
6900
  "href": link.href.value,
6851
- "onClick": onClick
6901
+ "tabindex": isClickable.value ? 0 : undefined,
6902
+ "onClick": onClick,
6903
+ "onKeydown": isClickable.value && !isLink.value && onKeyDown
6852
6904
  }, {
6853
6905
  default: () => [genOverlays(isClickable.value, 'v-chip'), hasFilter && vue.createVNode(VDefaultsProvider, {
6854
6906
  "key": "filter",
@@ -6945,9 +6997,9 @@
6945
6997
  themeClasses
6946
6998
  } = provideTheme(props);
6947
6999
  const {
6948
- backgroundColorClasses,
6949
- backgroundColorStyles
6950
- } = useBackgroundColor(vue.toRef(props, 'color'));
7000
+ textColorClasses,
7001
+ textColorStyles
7002
+ } = useTextColor(vue.toRef(props, 'color'));
6951
7003
  const dividerStyles = vue.computed(() => {
6952
7004
  const styles = {};
6953
7005
  if (props.length) {
@@ -6963,8 +7015,8 @@
6963
7015
  'v-divider': true,
6964
7016
  'v-divider--inset': props.inset,
6965
7017
  'v-divider--vertical': props.vertical
6966
- }, themeClasses.value, backgroundColorClasses.value],
6967
- "style": [dividerStyles.value, backgroundColorStyles.value],
7018
+ }, themeClasses.value, textColorClasses.value],
7019
+ "style": [dividerStyles.value, textColorStyles.value],
6968
7020
  "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
6969
7021
  "role": `${attrs.role || 'separator'}`
6970
7022
  }, null));
@@ -7564,6 +7616,10 @@
7564
7616
  nav: Boolean,
7565
7617
  prependAvatar: String,
7566
7618
  prependIcon: IconValue,
7619
+ ripple: {
7620
+ type: Boolean,
7621
+ default: true
7622
+ },
7567
7623
  subtitle: [String, Number, Boolean],
7568
7624
  title: [String, Number, Boolean],
7569
7625
  value: null,
@@ -7670,7 +7726,7 @@
7670
7726
  }
7671
7727
  }
7672
7728
  useRender(() => {
7673
- var _slots$prepend, _slots$title, _slots$subtitle, _slots$default, _slots$append;
7729
+ var _slots$title, _slots$subtitle, _slots$default;
7674
7730
  const Tag = isLink.value ? 'a' : props.tag;
7675
7731
  const hasColor = !list || isSelected.value || isActive.value;
7676
7732
  const hasTitle = slots.title || props.title;
@@ -7693,7 +7749,18 @@
7693
7749
  "onClick": onClick,
7694
7750
  "onKeydown": isClickable.value && !isLink.value && onKeyDown
7695
7751
  }, {
7696
- default: () => [genOverlays(isClickable.value || isActive.value, 'v-list-item'), hasPrepend && vue.createVNode(VDefaultsProvider, {
7752
+ default: () => [genOverlays(isClickable.value || isActive.value, 'v-list-item'), hasPrepend && vue.createVNode("div", {
7753
+ "key": "prepend",
7754
+ "class": "v-list-item__prepend"
7755
+ }, [props.prependAvatar && vue.createVNode(VAvatar, {
7756
+ "key": "prepend-avatar",
7757
+ "density": props.density,
7758
+ "image": props.prependAvatar
7759
+ }, null), props.prependIcon && vue.createVNode(VIcon, {
7760
+ "key": "prepend-icon",
7761
+ "density": props.density,
7762
+ "icon": props.prependIcon
7763
+ }, null), slots.prepend && vue.createVNode(VDefaultsProvider, {
7697
7764
  "key": "prepend",
7698
7765
  "defaults": {
7699
7766
  VAvatar: {
@@ -7709,14 +7776,8 @@
7709
7776
  }
7710
7777
  }
7711
7778
  }, {
7712
- default: () => [vue.createVNode("div", {
7713
- "class": "v-list-item__prepend"
7714
- }, [props.prependAvatar && vue.createVNode(VAvatar, {
7715
- "key": "prepend-avatar"
7716
- }, null), props.prependIcon && vue.createVNode(VIcon, {
7717
- "key": "prepend-icon"
7718
- }, null), (_slots$prepend = slots.prepend) == null ? void 0 : _slots$prepend.call(slots, slotProps.value)])]
7719
- }), vue.createVNode("div", {
7779
+ default: () => [slots.prepend(slotProps.value)]
7780
+ })]), vue.createVNode("div", {
7720
7781
  "class": "v-list-item__content",
7721
7782
  "data-no-activator": ""
7722
7783
  }, [hasTitle && vue.createVNode(VListItemTitle, {
@@ -7731,7 +7792,10 @@
7731
7792
  default: () => [((_slots$subtitle = slots.subtitle) == null ? void 0 : _slots$subtitle.call(slots, {
7732
7793
  subtitle: props.subtitle
7733
7794
  })) ?? props.subtitle]
7734
- }), (_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots, slotProps.value)]), hasAppend && vue.createVNode(VDefaultsProvider, {
7795
+ }), (_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots, slotProps.value)]), hasAppend && vue.createVNode("div", {
7796
+ "key": "append",
7797
+ "class": "v-list-item__append"
7798
+ }, [slots.append && vue.createVNode(VDefaultsProvider, {
7735
7799
  "key": "append",
7736
7800
  "defaults": {
7737
7801
  VAvatar: {
@@ -7747,15 +7811,17 @@
7747
7811
  }
7748
7812
  }
7749
7813
  }, {
7750
- default: () => [vue.createVNode("div", {
7751
- "class": "v-list-item__append"
7752
- }, [(_slots$append = slots.append) == null ? void 0 : _slots$append.call(slots, slotProps.value), props.appendIcon && vue.createVNode(VIcon, {
7753
- "key": "append-icon"
7754
- }, null), props.appendAvatar && vue.createVNode(VAvatar, {
7755
- "key": "append-avatar"
7756
- }, null)])]
7757
- })]
7758
- }), [[vue.resolveDirective("ripple"), isClickable.value]]);
7814
+ default: () => [slots.append(slotProps.value)]
7815
+ }), props.appendIcon && vue.createVNode(VIcon, {
7816
+ "key": "append-icon",
7817
+ "density": props.density,
7818
+ "icon": props.appendIcon
7819
+ }, null), props.appendAvatar && vue.createVNode(VAvatar, {
7820
+ "key": "append-avatar",
7821
+ "density": props.density,
7822
+ "image": props.appendAvatar
7823
+ }, null)])]
7824
+ }), [[vue.resolveDirective("ripple"), isClickable.value && props.ripple]]);
7759
7825
  });
7760
7826
  return {};
7761
7827
  }
@@ -7968,9 +8034,12 @@
7968
8034
 
7969
8035
  // Types
7970
8036
 
8037
+ function isPrimitive(value) {
8038
+ return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
8039
+ }
7971
8040
  function transformItem(props, item) {
7972
8041
  const type = getPropertyFromItem(item, props.itemType, 'item');
7973
- const title = typeof item === 'string' ? item : getPropertyFromItem(item, props.itemTitle);
8042
+ const title = isPrimitive(item) ? item : getPropertyFromItem(item, props.itemTitle);
7974
8043
  const value = getPropertyFromItem(item, props.itemValue, undefined);
7975
8044
  const children = getPropertyFromItem(item, props.itemChildren);
7976
8045
  const itemProps = props.itemProps === true ? pick(item, ['children'])[1] : getPropertyFromItem(item, props.itemProps);
@@ -8596,17 +8665,12 @@
8596
8665
  function useLocationStrategies(props, data) {
8597
8666
  const contentStyles = vue.ref({});
8598
8667
  const updateLocation = vue.ref();
8599
- let scope;
8600
- vue.watchEffect(async () => {
8601
- var _scope;
8602
- (_scope = scope) == null ? void 0 : _scope.stop();
8603
- updateLocation.value = undefined;
8604
- if (!(IN_BROWSER && data.isActive.value && props.locationStrategy)) return;
8605
- scope = vue.effectScope();
8606
- if (!(props.locationStrategy === 'connected')) {
8607
- await vue.nextTick();
8608
- }
8609
- scope.run(() => {
8668
+ if (IN_BROWSER) {
8669
+ useToggleScope(() => !!(data.isActive.value && props.locationStrategy), reset => {
8670
+ vue.watch(() => props.locationStrategy, reset);
8671
+ vue.onScopeDispose(() => {
8672
+ updateLocation.value = undefined;
8673
+ });
8610
8674
  if (typeof props.locationStrategy === 'function') {
8611
8675
  var _props$locationStrate;
8612
8676
  updateLocation.value = (_props$locationStrate = props.locationStrategy(data, props, contentStyles)) == null ? void 0 : _props$locationStrate.updateLocation;
@@ -8615,16 +8679,14 @@
8615
8679
  updateLocation.value = (_locationStrategies$p = locationStrategies[props.locationStrategy](data, props, contentStyles)) == null ? void 0 : _locationStrategies$p.updateLocation;
8616
8680
  }
8617
8681
  });
8618
- });
8619
- IN_BROWSER && window.addEventListener('resize', onResize, {
8620
- passive: true
8621
- });
8622
- vue.onScopeDispose(() => {
8623
- var _scope2;
8624
- IN_BROWSER && window.removeEventListener('resize', onResize);
8625
- updateLocation.value = undefined;
8626
- (_scope2 = scope) == null ? void 0 : _scope2.stop();
8627
- });
8682
+ window.addEventListener('resize', onResize, {
8683
+ passive: true
8684
+ });
8685
+ vue.onScopeDispose(() => {
8686
+ window.removeEventListener('resize', onResize);
8687
+ updateLocation.value = undefined;
8688
+ });
8689
+ }
8628
8690
  function onResize(e) {
8629
8691
  var _updateLocation$value;
8630
8692
  (_updateLocation$value = updateLocation.value) == null ? void 0 : _updateLocation$value.call(updateLocation, e);
@@ -8918,13 +8980,30 @@
8918
8980
  maxWidth: convertToUnit(pixelCeil(clamp(available.x, minWidth.value === Infinity ? 0 : minWidth.value, maxWidth.value))),
8919
8981
  maxHeight: convertToUnit(pixelCeil(clamp(available.y, minHeight.value === Infinity ? 0 : minHeight.value, maxHeight.value)))
8920
8982
  });
8983
+ return {
8984
+ available,
8985
+ contentBox
8986
+ };
8921
8987
  }
8922
- vue.watch(() => [preferredAnchor.value, preferredOrigin.value, props.offset, props.minWidth, props.minHeight, props.maxWidth, props.maxHeight], () => updateLocation(), {
8923
- immediate: !activatorFixed
8924
- });
8925
- if (activatorFixed) vue.nextTick(() => updateLocation());
8926
- requestAnimationFrame(() => {
8927
- if (contentStyles.value.maxHeight) updateLocation();
8988
+ vue.watch(() => [preferredAnchor.value, preferredOrigin.value, props.offset, props.minWidth, props.minHeight, props.maxWidth, props.maxHeight], () => updateLocation());
8989
+ vue.nextTick(() => {
8990
+ const result = updateLocation();
8991
+
8992
+ // TODO: overflowing content should only require a single updateLocation call
8993
+ // Icky hack to make sure the content is positioned consistently
8994
+ if (!result) return;
8995
+ const {
8996
+ available,
8997
+ contentBox
8998
+ } = result;
8999
+ if (contentBox.height > available.y) {
9000
+ requestAnimationFrame(() => {
9001
+ updateLocation();
9002
+ requestAnimationFrame(() => {
9003
+ updateLocation();
9004
+ });
9005
+ });
9006
+ }
8928
9007
  });
8929
9008
  return {
8930
9009
  updateLocation
@@ -8992,10 +9071,10 @@
8992
9071
  await vue.nextTick();
8993
9072
  scope.run(() => {
8994
9073
  if (typeof props.scrollStrategy === 'function') {
8995
- props.scrollStrategy(data, props);
9074
+ props.scrollStrategy(data, props, scope);
8996
9075
  } else {
8997
9076
  var _scrollStrategies$pro;
8998
- (_scrollStrategies$pro = scrollStrategies[props.scrollStrategy]) == null ? void 0 : _scrollStrategies$pro.call(scrollStrategies, data, props);
9077
+ (_scrollStrategies$pro = scrollStrategies[props.scrollStrategy]) == null ? void 0 : _scrollStrategies$pro.call(scrollStrategies, data, props, scope);
8999
9078
  }
9000
9079
  });
9001
9080
  });
@@ -9041,9 +9120,10 @@
9041
9120
  }
9042
9121
  });
9043
9122
  }
9044
- function repositionScrollStrategy(data) {
9123
+ function repositionScrollStrategy(data, props, scope) {
9045
9124
  let slow = false;
9046
9125
  let raf = -1;
9126
+ let ric = -1;
9047
9127
  function update(e) {
9048
9128
  requestNewFrame(() => {
9049
9129
  var _data$updateLocation$, _data$updateLocation;
@@ -9053,21 +9133,29 @@
9053
9133
  slow = time / (1000 / 60) > 2;
9054
9134
  });
9055
9135
  }
9056
- bindScroll(data.activatorEl.value ?? data.contentEl.value, e => {
9057
- if (slow) {
9058
- // If the position calculation is slow,
9059
- // defer updates until scrolling is finished.
9060
- // Browsers usually fire one scroll event per frame so
9061
- // we just wait until we've got two frames without an event
9062
- cancelAnimationFrame(raf);
9063
- raf = requestAnimationFrame(() => {
9064
- raf = requestAnimationFrame(() => {
9136
+ ric = requestIdleCallback(() => {
9137
+ scope.run(() => {
9138
+ bindScroll(data.activatorEl.value ?? data.contentEl.value, e => {
9139
+ if (slow) {
9140
+ // If the position calculation is slow,
9141
+ // defer updates until scrolling is finished.
9142
+ // Browsers usually fire one scroll event per frame so
9143
+ // we just wait until we've got two frames without an event
9144
+ cancelAnimationFrame(raf);
9145
+ raf = requestAnimationFrame(() => {
9146
+ raf = requestAnimationFrame(() => {
9147
+ update(e);
9148
+ });
9149
+ });
9150
+ } else {
9065
9151
  update(e);
9066
- });
9152
+ }
9067
9153
  });
9068
- } else {
9069
- update(e);
9070
- }
9154
+ });
9155
+ });
9156
+ vue.onScopeDispose(() => {
9157
+ cancelIdleCallback(ric);
9158
+ cancelAnimationFrame(raf);
9071
9159
  });
9072
9160
  }
9073
9161
 
@@ -9296,19 +9384,18 @@
9296
9384
  vue.warn(`Unable to locate target ${_target}`);
9297
9385
  return undefined;
9298
9386
  }
9299
- if (!useTeleport.cache.has(targetElement)) {
9300
- const el = document.createElement('div');
9301
- el.className = 'v-overlay-container';
9302
- targetElement.appendChild(el);
9303
- useTeleport.cache.set(targetElement, el);
9387
+ let container = targetElement.querySelector('.v-overlay-container');
9388
+ if (!container) {
9389
+ container = document.createElement('div');
9390
+ container.className = 'v-overlay-container';
9391
+ targetElement.appendChild(container);
9304
9392
  }
9305
- return useTeleport.cache.get(targetElement);
9393
+ return container;
9306
9394
  });
9307
9395
  return {
9308
9396
  teleportTarget
9309
9397
  };
9310
9398
  }
9311
- useTeleport.cache = new WeakMap();
9312
9399
 
9313
9400
  function defaultConditional() {
9314
9401
  return true;
@@ -9711,6 +9798,11 @@
9711
9798
  function onClickOutside() {
9712
9799
  parent == null ? void 0 : parent.closeParents();
9713
9800
  }
9801
+ const activatorProps = vue.computed(() => vue.mergeProps({
9802
+ 'aria-haspopup': 'menu',
9803
+ 'aria-expanded': String(isActive.value),
9804
+ 'aria-owns': id.value
9805
+ }, props.activatorProps));
9714
9806
  useRender(() => {
9715
9807
  const [overlayProps] = filterVOverlayProps(props);
9716
9808
  return vue.createVNode(VOverlay, vue.mergeProps({
@@ -9720,11 +9812,7 @@
9720
9812
  "modelValue": isActive.value,
9721
9813
  "onUpdate:modelValue": $event => isActive.value = $event,
9722
9814
  "absolute": true,
9723
- "activatorProps": vue.mergeProps({
9724
- 'aria-haspopup': 'menu',
9725
- 'aria-expanded': String(isActive.value),
9726
- 'aria-owns': id.value
9727
- }, props.activatorProps),
9815
+ "activatorProps": activatorProps.value,
9728
9816
  "onClick:outside": onClickOutside
9729
9817
  }, scopeId), {
9730
9818
  activator: slots.activator,
@@ -9838,8 +9926,10 @@
9838
9926
  }
9839
9927
  function onKeydown(e) {
9840
9928
  if (props.readonly || form != null && form.isReadonly.value) return;
9841
- if (['Enter', 'ArrowDown', ' '].includes(e.key)) {
9929
+ if (['Enter', ' ', 'ArrowDown', 'ArrowUp', 'Home', 'End'].includes(e.key)) {
9842
9930
  e.preventDefault();
9931
+ }
9932
+ if (['Enter', 'ArrowDown', ' '].includes(e.key)) {
9843
9933
  menu.value = true;
9844
9934
  }
9845
9935
  if (['Escape', 'Tab'].includes(e.key)) {
@@ -9850,15 +9940,12 @@
9850
9940
  (_listRef$value = listRef.value) == null ? void 0 : _listRef$value.focus('next');
9851
9941
  } else if (e.key === 'ArrowUp') {
9852
9942
  var _listRef$value2;
9853
- e.preventDefault();
9854
9943
  (_listRef$value2 = listRef.value) == null ? void 0 : _listRef$value2.focus('prev');
9855
9944
  } else if (e.key === 'Home') {
9856
9945
  var _listRef$value3;
9857
- e.preventDefault();
9858
9946
  (_listRef$value3 = listRef.value) == null ? void 0 : _listRef$value3.focus('first');
9859
9947
  } else if (e.key === 'End') {
9860
9948
  var _listRef$value4;
9861
- e.preventDefault();
9862
9949
  (_listRef$value4 = listRef.value) == null ? void 0 : _listRef$value4.focus('last');
9863
9950
  }
9864
9951
  }
@@ -9924,6 +10011,7 @@
9924
10011
  "activator": "parent",
9925
10012
  "contentClass": "v-select__content",
9926
10013
  "eager": props.eager,
10014
+ "maxHeight": 310,
9927
10015
  "openOnClick": false,
9928
10016
  "closeOnContentClick": false,
9929
10017
  "transition": props.transition
@@ -10039,7 +10127,7 @@
10039
10127
  const customFiltersLength = Object.keys((options == null ? void 0 : options.customKeyFilter) ?? {}).length;
10040
10128
  if (!(items != null && items.length)) return array;
10041
10129
  loop: for (let i = 0; i < items.length; i++) {
10042
- const item = items[i].raw;
10130
+ const item = items[i];
10043
10131
  const customMatches = {};
10044
10132
  const defaultMatches = {};
10045
10133
  let match = -1;
@@ -10079,7 +10167,7 @@
10079
10167
  }
10080
10168
  return array;
10081
10169
  }
10082
- function useFilter(props, items, query) {
10170
+ function useFilter(props, items, query, options) {
10083
10171
  const strQuery = vue.computed(() => typeof (query == null ? void 0 : query.value) !== 'string' && typeof (query == null ? void 0 : query.value) !== 'number' ? '' : String(query.value));
10084
10172
  const filteredItems = vue.ref([]);
10085
10173
  const filteredMatches = vue.ref(new Map());
@@ -10090,7 +10178,7 @@
10090
10178
  const results = filterItems(transformedItems, strQuery.value, {
10091
10179
  customKeyFilter: props.customKeyFilter,
10092
10180
  default: props.customFilter,
10093
- filterKeys: props.filterKeys,
10181
+ filterKeys: vue.unref(options == null ? void 0 : options.filterKeys) ?? props.filterKeys,
10094
10182
  filterMode: props.filterMode,
10095
10183
  noFilter: props.noFilter
10096
10184
  });
@@ -10201,6 +10289,9 @@
10201
10289
  }
10202
10290
  function onKeydown(e) {
10203
10291
  if (props.readonly || form != null && form.isReadonly.value) return;
10292
+ if (['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) {
10293
+ e.preventDefault();
10294
+ }
10204
10295
  if (['Enter', 'ArrowDown'].includes(e.key)) {
10205
10296
  menu.value = true;
10206
10297
  }
@@ -10212,11 +10303,9 @@
10212
10303
  }
10213
10304
  if (e.key === 'ArrowDown') {
10214
10305
  var _listRef$value;
10215
- e.preventDefault();
10216
10306
  (_listRef$value = listRef.value) == null ? void 0 : _listRef$value.focus('next');
10217
10307
  } else if (e.key === 'ArrowUp') {
10218
10308
  var _listRef$value2;
10219
- e.preventDefault();
10220
10309
  (_listRef$value2 = listRef.value) == null ? void 0 : _listRef$value2.focus('prev');
10221
10310
  }
10222
10311
  }
@@ -10313,6 +10402,7 @@
10313
10402
  "activator": "parent",
10314
10403
  "contentClass": "v-autocomplete__content",
10315
10404
  "eager": props.eager,
10405
+ "maxHeight": 310,
10316
10406
  "openOnClick": false,
10317
10407
  "closeOnContentClick": false,
10318
10408
  "transition": props.transition,
@@ -11021,7 +11111,10 @@
11021
11111
  },
11022
11112
  prependAvatar: String,
11023
11113
  prependIcon: IconValue,
11024
- ripple: Boolean,
11114
+ ripple: {
11115
+ type: Boolean,
11116
+ default: true
11117
+ },
11025
11118
  subtitle: String,
11026
11119
  text: String,
11027
11120
  title: String,
@@ -11142,7 +11235,7 @@
11142
11235
  }), (_slots$default = slots.default) == null ? void 0 : _slots$default.call(slots), slots.actions && vue.createVNode(VCardActions, null, {
11143
11236
  default: slots.actions
11144
11237
  }), genOverlays(isClickable.value, 'v-card')]
11145
- }), [[vue.resolveDirective("ripple"), isClickable.value]]);
11238
+ }), [[vue.resolveDirective("ripple"), isClickable.value && props.ripple]]);
11146
11239
  });
11147
11240
  return {};
11148
11241
  }
@@ -12435,6 +12528,10 @@
12435
12528
  position: {
12436
12529
  type: Number,
12437
12530
  required: true
12531
+ },
12532
+ ripple: {
12533
+ type: Boolean,
12534
+ default: true
12438
12535
  }
12439
12536
  },
12440
12537
  emits: {
@@ -12535,7 +12632,7 @@
12535
12632
  }, null), vue.withDirectives(vue.createVNode("div", {
12536
12633
  "class": ['v-slider-thumb__ripple', textColorClasses.value],
12537
12634
  "style": textColorStyles.value
12538
- }, null), [[vue.resolveDirective("ripple"), true, null, {
12635
+ }, null), [[vue.resolveDirective("ripple"), props.ripple, null, {
12539
12636
  circle: true,
12540
12637
  center: true
12541
12638
  }]]), vue.createVNode(VScaleTransition, {
@@ -13537,7 +13634,9 @@
13537
13634
  if (props.readonly || form != null && form.isReadonly.value) return;
13538
13635
  const selectionStart = vTextFieldRef.value.selectionStart;
13539
13636
  const length = selected.value.length;
13540
- if (selectionIndex.value > -1) e.preventDefault();
13637
+ if (selectionIndex.value > -1 || ['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) {
13638
+ e.preventDefault();
13639
+ }
13541
13640
  if (['Enter', 'ArrowDown'].includes(e.key)) {
13542
13641
  menu.value = true;
13543
13642
  }
@@ -13549,11 +13648,9 @@
13549
13648
  }
13550
13649
  if (e.key === 'ArrowDown') {
13551
13650
  var _listRef$value;
13552
- e.preventDefault();
13553
13651
  (_listRef$value = listRef.value) == null ? void 0 : _listRef$value.focus('next');
13554
13652
  } else if (e.key === 'ArrowUp') {
13555
13653
  var _listRef$value2;
13556
- e.preventDefault();
13557
13654
  (_listRef$value2 = listRef.value) == null ? void 0 : _listRef$value2.focus('prev');
13558
13655
  }
13559
13656
  if (!props.multiple) return;
@@ -13587,7 +13684,7 @@
13587
13684
  vTextFieldRef.value.setSelectionRange(0, 0);
13588
13685
  }
13589
13686
  }
13590
- if (e.key === 'Enter') {
13687
+ if (e.key === 'Enter' && search.value) {
13591
13688
  select(transformItem$1(props, search.value));
13592
13689
  search.value = '';
13593
13690
  }
@@ -13676,6 +13773,7 @@
13676
13773
  "activator": "parent",
13677
13774
  "contentClass": "v-combobox__content",
13678
13775
  "eager": props.eager,
13776
+ "maxHeight": 310,
13679
13777
  "openOnClick": false,
13680
13778
  "closeOnContentClick": false,
13681
13779
  "transition": props.transition,
@@ -13847,6 +13945,10 @@
13847
13945
  });
13848
13946
  }
13849
13947
  });
13948
+ const activatorProps = vue.computed(() => vue.mergeProps({
13949
+ 'aria-haspopup': 'dialog',
13950
+ 'aria-expanded': String(isActive.value)
13951
+ }, props.activatorProps));
13850
13952
  useRender(() => {
13851
13953
  const [overlayProps] = filterVOverlayProps(props);
13852
13954
  return vue.createVNode(VOverlay, vue.mergeProps({
@@ -13860,10 +13962,7 @@
13860
13962
  "onUpdate:modelValue": $event => isActive.value = $event,
13861
13963
  "aria-role": "dialog",
13862
13964
  "aria-modal": "true",
13863
- "activatorProps": vue.mergeProps({
13864
- 'aria-haspopup': 'dialog',
13865
- 'aria-expanded': String(isActive.value)
13866
- }, props.activatorProps)
13965
+ "activatorProps": activatorProps.value
13867
13966
  }, scopeId), {
13868
13967
  activator: slots.activator,
13869
13968
  default: function () {
@@ -14212,12 +14311,15 @@
14212
14311
  onFocus();
14213
14312
  vue.nextTick(() => {
14214
14313
  model.value = [];
14215
- if (inputRef != null && inputRef.value) {
14216
- inputRef.value.value = '';
14217
- }
14218
14314
  callEvent(props['onClick:clear'], e);
14219
14315
  });
14220
14316
  }
14317
+ vue.watch(model, newValue => {
14318
+ const hasModelReset = !Array.isArray(newValue) || !newValue.length;
14319
+ if (hasModelReset && inputRef.value) {
14320
+ inputRef.value.value = '';
14321
+ }
14322
+ });
14221
14323
  useRender(() => {
14222
14324
  const hasCounter = !!(slots.counter || props.counter);
14223
14325
  const hasDetails = !!(hasCounter || slots.details);
@@ -15208,7 +15310,7 @@
15208
15310
  window.removeEventListener('touchmove', onTouchmove);
15209
15311
  window.removeEventListener('touchend', onTouchend);
15210
15312
  });
15211
- const isHorizontal = vue.computed(() => position.value !== 'bottom');
15313
+ const isHorizontal = vue.computed(() => ['left', 'right'].includes(position.value));
15212
15314
  const {
15213
15315
  addMovement,
15214
15316
  endTouch,
@@ -15220,11 +15322,11 @@
15220
15322
  const offset = vue.ref(0);
15221
15323
  let start;
15222
15324
  function getOffset(pos, active) {
15223
- return (position.value === 'left' ? pos : position.value === 'right' ? document.documentElement.clientWidth - pos : position.value === 'bottom' ? document.documentElement.clientHeight - pos : oops()) - (active ? width.value : 0);
15325
+ 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);
15224
15326
  }
15225
15327
  function getProgress(pos) {
15226
15328
  let limit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
15227
- 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();
15329
+ 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();
15228
15330
  return limit ? Math.max(0, Math.min(1, progress)) : progress;
15229
15331
  }
15230
15332
  function onTouchstart(e) {
@@ -15232,8 +15334,8 @@
15232
15334
  const touchX = e.changedTouches[0].clientX;
15233
15335
  const touchY = e.changedTouches[0].clientY;
15234
15336
  const touchZone = 25;
15235
- const inTouchZone = position.value === 'left' ? touchX < touchZone : position.value === 'right' ? touchX > document.documentElement.clientWidth - touchZone : position.value === 'bottom' ? touchY > document.documentElement.clientHeight - touchZone : oops();
15236
- 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());
15337
+ 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();
15338
+ 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());
15237
15339
  if (inTouchZone || inElement || isActive.value && isTemporary.value) {
15238
15340
  maybeDragging = true;
15239
15341
  start = [touchX, touchY];
@@ -15285,6 +15387,7 @@
15285
15387
  isActive.value = velocity.direction === ({
15286
15388
  left: 'right',
15287
15389
  right: 'left',
15390
+ top: 'down',
15288
15391
  bottom: 'up'
15289
15392
  }[position.value] || oops());
15290
15393
  } else {
@@ -15293,7 +15396,7 @@
15293
15396
  }
15294
15397
  const dragStyles = vue.computed(() => {
15295
15398
  return isDragging.value ? {
15296
- 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(),
15399
+ 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(),
15297
15400
  transition: 'none'
15298
15401
  } : undefined;
15299
15402
  });
@@ -15309,7 +15412,7 @@
15309
15412
 
15310
15413
  // Types
15311
15414
 
15312
- const locations = ['start', 'end', 'left', 'right', 'bottom'];
15415
+ const locations = ['start', 'end', 'left', 'right', 'top', 'bottom'];
15313
15416
  const VNavigationDrawer = defineComponent({
15314
15417
  name: 'VNavigationDrawer',
15315
15418
  props: {
@@ -15766,7 +15869,7 @@
15766
15869
  disabled: !!props.disabled || props.length < 2,
15767
15870
  color: isActive ? props.activeColor : props.color,
15768
15871
  ariaCurrent: isActive,
15769
- ariaLabel: t(isActive ? props.currentPageAriaLabel : props.pageAriaLabel, index + 1),
15872
+ ariaLabel: t(isActive ? props.currentPageAriaLabel : props.pageAriaLabel, item),
15770
15873
  onClick: e => setValue(e, item)
15771
15874
  }
15772
15875
  };
@@ -17945,6 +18048,9 @@
17945
18048
  if (props.transition) return props.transition;
17946
18049
  return isActive.value ? 'scale-transition' : 'fade-transition';
17947
18050
  });
18051
+ const activatorProps = vue.computed(() => vue.mergeProps({
18052
+ 'aria-describedby': id.value
18053
+ }, props.activatorProps));
17948
18054
  useRender(() => {
17949
18055
  const [overlayProps] = filterVOverlayProps(props);
17950
18056
  return vue.createVNode(VOverlay, vue.mergeProps({
@@ -17961,9 +18067,7 @@
17961
18067
  "persistent": true,
17962
18068
  "role": "tooltip",
17963
18069
  "eager": true,
17964
- "activatorProps": vue.mergeProps({
17965
- 'aria-describedby': id.value
17966
- }, props.activatorProps),
18070
+ "activatorProps": activatorProps.value,
17967
18071
  "_disableGlobalStack": true
17968
18072
  }, scopeId), {
17969
18073
  activator: slots.activator,
@@ -18349,7 +18453,7 @@
18349
18453
  locale
18350
18454
  };
18351
18455
  }
18352
- const version$1 = "3.1.1";
18456
+ const version$1 = "3.1.3";
18353
18457
  createVuetify$1.version = version$1;
18354
18458
 
18355
18459
  // Vue's inject() can only be used in setup
@@ -18370,7 +18474,7 @@
18370
18474
  ...options
18371
18475
  });
18372
18476
  };
18373
- const version = "3.1.1";
18477
+ const version = "3.1.3";
18374
18478
  createVuetify.version = version;
18375
18479
 
18376
18480
  exports.components = components;