vuetify 3.10.5 → 3.10.7

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 (94) hide show
  1. package/README.md +0 -6
  2. package/dist/json/attributes.json +3488 -3512
  3. package/dist/json/importMap-labs.json +20 -20
  4. package/dist/json/importMap.json +176 -176
  5. package/dist/json/tags.json +3 -9
  6. package/dist/json/web-types.json +6467 -6520
  7. package/dist/vuetify-labs.cjs +190 -82
  8. package/dist/vuetify-labs.css +4945 -4895
  9. package/dist/vuetify-labs.d.ts +117 -172
  10. package/dist/vuetify-labs.esm.js +190 -82
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +190 -82
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +171 -72
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +3926 -3898
  17. package/dist/vuetify.d.ts +117 -137
  18. package/dist/vuetify.esm.js +171 -72
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +171 -72
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +118 -107
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VAutocomplete/VAutocomplete.d.ts +0 -61
  26. package/lib/components/VAutocomplete/VAutocomplete.js +15 -12
  27. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  28. package/lib/components/VChipGroup/VChipGroup.d.ts +37 -0
  29. package/lib/components/VChipGroup/VChipGroup.js +3 -1
  30. package/lib/components/VChipGroup/VChipGroup.js.map +1 -1
  31. package/lib/components/VCombobox/VCombobox.d.ts +6 -67
  32. package/lib/components/VCombobox/VCombobox.js +29 -30
  33. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  34. package/lib/components/VCounter/VCounter.css +1 -0
  35. package/lib/components/VCounter/VCounter.sass +1 -0
  36. package/lib/components/VDatePicker/VDatePicker.js +1 -1
  37. package/lib/components/VDatePicker/VDatePicker.js.map +1 -1
  38. package/lib/components/VFileInput/VFileInput.js +3 -2
  39. package/lib/components/VFileInput/VFileInput.js.map +1 -1
  40. package/lib/components/VList/VListItem.css +14 -12
  41. package/lib/components/VList/VListItem.js +4 -2
  42. package/lib/components/VList/VListItem.js.map +1 -1
  43. package/lib/components/VList/VListItem.sass +20 -18
  44. package/lib/components/VMenu/VMenu.js +22 -4
  45. package/lib/components/VMenu/VMenu.js.map +1 -1
  46. package/lib/components/VNumberInput/VNumberInput.css +8 -0
  47. package/lib/components/VNumberInput/VNumberInput.js +5 -2
  48. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  49. package/lib/components/VNumberInput/VNumberInput.sass +10 -4
  50. package/lib/components/VSelect/VSelect.js +2 -1
  51. package/lib/components/VSelect/VSelect.js.map +1 -1
  52. package/lib/components/VSkeletonLoader/VSkeletonLoader.css +17 -0
  53. package/lib/components/VSkeletonLoader/VSkeletonLoader.js +3 -3
  54. package/lib/components/VSkeletonLoader/VSkeletonLoader.js.map +1 -1
  55. package/lib/components/VSkeletonLoader/VSkeletonLoader.sass +7 -0
  56. package/lib/components/VSlideGroup/VSlideGroup.d.ts +25 -0
  57. package/lib/components/VSlideGroup/VSlideGroup.js +5 -1
  58. package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
  59. package/lib/components/VTabs/VTabs.d.ts +25 -0
  60. package/lib/components/VTextField/VTextField.js +3 -5
  61. package/lib/components/VTextField/VTextField.js.map +1 -1
  62. package/lib/components/VTextarea/VTextarea.css +2 -2
  63. package/lib/components/VTextarea/VTextarea.d.ts +3 -3
  64. package/lib/components/VTextarea/VTextarea.js +23 -3
  65. package/lib/components/VTextarea/VTextarea.js.map +1 -1
  66. package/lib/components/VTextarea/VTextarea.sass +4 -2
  67. package/lib/components/VWindow/VWindow.js +39 -3
  68. package/lib/components/VWindow/VWindow.js.map +1 -1
  69. package/lib/composables/date/date.js +1 -1
  70. package/lib/composables/date/date.js.map +1 -1
  71. package/lib/composables/group.js +1 -1
  72. package/lib/composables/group.js.map +1 -1
  73. package/lib/composables/nested/nested.js +12 -2
  74. package/lib/composables/nested/nested.js.map +1 -1
  75. package/lib/composables/virtual.js +2 -2
  76. package/lib/composables/virtual.js.map +1 -1
  77. package/lib/entry-bundler.js +1 -1
  78. package/lib/framework.d.ts +60 -60
  79. package/lib/framework.js +1 -1
  80. package/lib/labs/VColorInput/VColorInput.d.ts +0 -40
  81. package/lib/labs/VColorInput/VColorInput.js +2 -2
  82. package/lib/labs/VColorInput/VColorInput.js.map +1 -1
  83. package/lib/labs/VDateInput/VDateInput.d.ts +0 -30
  84. package/lib/labs/VDateInput/VDateInput.js +16 -7
  85. package/lib/labs/VDateInput/VDateInput.js.map +1 -1
  86. package/lib/labs/VIconBtn/VIconBtn.css +22 -0
  87. package/lib/labs/VIconBtn/VIconBtn.scss +32 -0
  88. package/lib/labs/VMaskInput/VMaskInput.js +1 -1
  89. package/lib/labs/VMaskInput/VMaskInput.js.map +1 -1
  90. package/lib/labs/rules/rules.js +1 -1
  91. package/lib/labs/rules/rules.js.map +1 -1
  92. package/lib/util/helpers.js +4 -2
  93. package/lib/util/helpers.js.map +1 -1
  94. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.10.5
2
+ * Vuetify v3.10.7
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -468,8 +468,10 @@ function callEvent(handler) {
468
468
  }
469
469
  function focusableChildren(el) {
470
470
  let filterByTabIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
471
- const targets = ['button', '[href]', 'input:not([type="hidden"])', 'select', 'textarea', '[tabindex]'].map(s => `${s}${filterByTabIndex ? ':not([tabindex="-1"])' : ''}:not([disabled])`).join(', ');
472
- return [...el.querySelectorAll(targets)];
471
+ const targets = ['button', '[href]', 'input:not([type="hidden"])', 'select', 'textarea', 'details:not(:has(> summary))', 'details > summary', '[tabindex]', '[contenteditable]:not([contenteditable="false"])', 'audio[controls]', 'video[controls]'].map(s => `${s}${filterByTabIndex ? ':not([tabindex="-1"])' : ''}:not([disabled], [inert])`).join(', ');
472
+ return [...el.querySelectorAll(targets)].filter(x => !x.closest('[inert]')) // does not have inert parent
473
+ .filter(x => !!x.offsetParent || x.getClientRects().length > 0) // is rendered
474
+ .filter(x => !x.parentElement?.closest('details:not([open])') || x.tagName === 'SUMMARY' && x.parentElement?.tagName === 'DETAILS');
473
475
  }
474
476
  function getNextElement(elements, location, condition) {
475
477
  let _el;
@@ -4543,7 +4545,7 @@ function useGroupItem(props, injectKey) {
4543
4545
  function unregister() {
4544
4546
  group?.unregister(id);
4545
4547
  }
4546
- onMounted(() => register());
4548
+ register();
4547
4549
  onBeforeUnmount(() => unregister());
4548
4550
  const isSelected = computed(() => {
4549
4551
  return group.isSelected(id);
@@ -8093,6 +8095,10 @@ function getOffsetPosition(isHorizontal, element) {
8093
8095
  const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group');
8094
8096
  const makeVSlideGroupProps = propsFactory({
8095
8097
  centerActive: Boolean,
8098
+ scrollToActive: {
8099
+ type: Boolean,
8100
+ default: true
8101
+ },
8096
8102
  contentClass: null,
8097
8103
  direction: {
8098
8104
  type: String,
@@ -8181,7 +8187,7 @@ const VSlideGroup = genericComponent()({
8181
8187
  contentSize.value = contentRect.value[sizeProperty];
8182
8188
  isOverflowing.value = containerSize.value + 1 < contentSize.value;
8183
8189
  }
8184
- if (firstSelectedIndex.value >= 0 && contentRef.el) {
8190
+ if (props.scrollToActive && firstSelectedIndex.value >= 0 && contentRef.el) {
8185
8191
  // TODO: Is this too naive? Should we store element references in group composable?
8186
8192
  const selectedElement = contentRef.el.children[lastSelectedIndex.value];
8187
8193
  scrollToChildren(selectedElement, props.centerActive);
@@ -8450,7 +8456,9 @@ const makeVChipGroupProps = propsFactory({
8450
8456
  type: Function,
8451
8457
  default: deepEqual
8452
8458
  },
8453
- ...makeVSlideGroupProps(),
8459
+ ...makeVSlideGroupProps({
8460
+ scrollToActive: false
8461
+ }),
8454
8462
  ...makeComponentProps(),
8455
8463
  ...makeGroupProps({
8456
8464
  selectedClass: 'v-chip--selected'
@@ -9549,7 +9557,9 @@ const useNestedItem = (id, isDisabled, isGroup) => {
9549
9557
  };
9550
9558
  onBeforeMount(() => {
9551
9559
  if (!parent.isGroupActivator) {
9552
- parent.root.register(computedId.value, parent.id.value, toValue(isDisabled), isGroup);
9560
+ nextTick(() => {
9561
+ parent.root.register(computedId.value, parent.id.value, toValue(isDisabled), isGroup);
9562
+ });
9553
9563
  }
9554
9564
  });
9555
9565
  onBeforeUnmount(() => {
@@ -9557,6 +9567,14 @@ const useNestedItem = (id, isDisabled, isGroup) => {
9557
9567
  parent.root.unregister(computedId.value);
9558
9568
  }
9559
9569
  });
9570
+ watch(computedId, (val, oldVal) => {
9571
+ if (!parent.isGroupActivator) {
9572
+ parent.root.unregister(oldVal);
9573
+ nextTick(() => {
9574
+ parent.root.register(val, parent.id.value, toValue(isDisabled), isGroup);
9575
+ });
9576
+ }
9577
+ });
9560
9578
  isGroup && provide(VNestedSymbol, item);
9561
9579
  return item;
9562
9580
  };
@@ -9807,7 +9825,9 @@ const VListItem = genericComponent()({
9807
9825
  handleActiveLink();
9808
9826
  });
9809
9827
  onBeforeMount(() => {
9810
- if (link.isActive?.value) handleActiveLink();
9828
+ if (link.isActive?.value) {
9829
+ nextTick(() => handleActiveLink());
9830
+ }
9811
9831
  });
9812
9832
  function handleActiveLink() {
9813
9833
  if (parent.value != null) {
@@ -12055,25 +12075,41 @@ const VMenu = genericComponent()({
12055
12075
  document.removeEventListener('focusin', onFocusIn);
12056
12076
  });
12057
12077
  onDeactivated(() => isActive.value = false);
12078
+ let focusTrapSuppressed = false;
12079
+ let focusTrapSuppressionTimeout = -1;
12080
+ async function onPointerdown() {
12081
+ focusTrapSuppressed = true;
12082
+ focusTrapSuppressionTimeout = window.setTimeout(() => {
12083
+ focusTrapSuppressed = false;
12084
+ }, 100);
12085
+ }
12058
12086
  async function onFocusIn(e) {
12059
12087
  const before = e.relatedTarget;
12060
12088
  const after = e.target;
12061
12089
  await nextTick();
12062
12090
  if (isActive.value && before !== after && overlay.value?.contentEl &&
12063
- // We're the topmost menu
12064
- overlay.value?.globalTop &&
12091
+ // We're the menu without open submenus or overlays
12092
+ overlay.value?.localTop &&
12065
12093
  // It isn't the document or the menu body
12066
12094
  ![document, overlay.value.contentEl].includes(after) &&
12067
12095
  // It isn't inside the menu body
12068
12096
  !overlay.value.contentEl.contains(after)) {
12069
- const focusable = focusableChildren(overlay.value.contentEl);
12070
- focusable[0]?.focus();
12097
+ if (focusTrapSuppressed) {
12098
+ if (!props.openOnHover && !overlay.value.activatorEl?.contains(after)) {
12099
+ isActive.value = false;
12100
+ }
12101
+ } else {
12102
+ const focusable = focusableChildren(overlay.value.contentEl);
12103
+ focusable[0]?.focus();
12104
+ document.removeEventListener('pointerdown', onPointerdown);
12105
+ }
12071
12106
  }
12072
12107
  }
12073
12108
  watch(isActive, val => {
12074
12109
  if (val) {
12075
12110
  parent?.register();
12076
12111
  if (IN_BROWSER && !props.disableInitialFocus) {
12112
+ document.addEventListener('pointerdown', onPointerdown);
12077
12113
  document.addEventListener('focusin', onFocusIn, {
12078
12114
  once: true
12079
12115
  });
@@ -12081,6 +12117,8 @@ const VMenu = genericComponent()({
12081
12117
  } else {
12082
12118
  parent?.unregister();
12083
12119
  if (IN_BROWSER) {
12120
+ clearTimeout(focusTrapSuppressionTimeout);
12121
+ document.removeEventListener('pointerdown', onPointerdown);
12084
12122
  document.removeEventListener('focusin', onFocusIn);
12085
12123
  }
12086
12124
  }
@@ -12674,7 +12712,6 @@ const VTextField = genericComponent()({
12674
12712
  e.stopPropagation();
12675
12713
  onFocus();
12676
12714
  nextTick(() => {
12677
- model.value = null;
12678
12715
  reset();
12679
12716
  callEvent(props['onClick:clear'], e);
12680
12717
  });
@@ -12729,8 +12766,6 @@ const VTextField = genericComponent()({
12729
12766
  "onMousedown": onControlMousedown,
12730
12767
  "onClick": onControlClick,
12731
12768
  "onClick:clear": e => onClear(e, reset),
12732
- "onClick:prependInner": props['onClick:prependInner'],
12733
- "onClick:appendInner": props['onClick:appendInner'],
12734
12769
  "role": props.role
12735
12770
  }, omit(fieldProps, ['onClick:clear']), {
12736
12771
  "id": id.value,
@@ -12747,10 +12782,11 @@ const VTextField = genericComponent()({
12747
12782
  props: {
12748
12783
  class: fieldClass,
12749
12784
  ...slotProps
12750
- }
12785
+ },
12786
+ controlRef
12751
12787
  } = _ref3;
12752
12788
  const inputNode = withDirectives(createElementVNode("input", mergeProps({
12753
- "ref": inputRef,
12789
+ "ref": val => inputRef.value = controlRef.value = val,
12754
12790
  "value": model.value,
12755
12791
  "onInput": onInput,
12756
12792
  "autofocus": props.autofocus,
@@ -12906,7 +12942,7 @@ function useVirtual(props, items) {
12906
12942
  const start = performance.now();
12907
12943
  offsets[0] = 0;
12908
12944
  const length = items.value.length;
12909
- for (let i = 1; i <= length - 1; i++) {
12945
+ for (let i = 1; i <= length; i++) {
12910
12946
  offsets[i] = (offsets[i - 1] || 0) + getSize(i - 1);
12911
12947
  }
12912
12948
  updateTime.value = Math.max(updateTime.value, performance.now() - start);
@@ -12941,7 +12977,7 @@ function useVirtual(props, items) {
12941
12977
  }
12942
12978
  }
12943
12979
  function calculateOffset(index) {
12944
- index = clamp(index, 0, items.value.length - 1);
12980
+ index = clamp(index, 0, items.value.length);
12945
12981
  const whole = Math.floor(index);
12946
12982
  const fraction = index % 1;
12947
12983
  const next = whole + 1;
@@ -13674,7 +13710,8 @@ const VSelect = genericComponent()({
13674
13710
  "key": item.value,
13675
13711
  "modelValue": isSelected,
13676
13712
  "ripple": false,
13677
- "tabindex": "-1"
13713
+ "tabindex": "-1",
13714
+ "onClick": event => event.preventDefault()
13678
13715
  }, null) : undefined, camelizedProps.prependAvatar && createVNode(VAvatar, {
13679
13716
  "image": camelizedProps.prependAvatar
13680
13717
  }, null), camelizedProps.prependIcon && createVNode(VIcon, {
@@ -13946,10 +13983,7 @@ const makeVAutocompleteProps = propsFactory({
13946
13983
  ...omit(makeVTextFieldProps({
13947
13984
  modelValue: null,
13948
13985
  role: 'combobox'
13949
- }), ['validationValue', 'dirty', 'appendInnerIcon']),
13950
- ...makeTransitionProps({
13951
- transition: false
13952
- })
13986
+ }), ['validationValue', 'dirty', 'appendInnerIcon'])
13953
13987
  }, 'VAutocomplete');
13954
13988
  const VAutocomplete = genericComponent()({
13955
13989
  name: 'VAutocomplete',
@@ -13974,6 +14008,7 @@ const VAutocomplete = genericComponent()({
13974
14008
  const vMenuRef = ref();
13975
14009
  const vVirtualScrollRef = ref();
13976
14010
  const selectionIndex = shallowRef(-1);
14011
+ const _searchLock = shallowRef(null);
13977
14012
  const {
13978
14013
  items,
13979
14014
  transformIn,
@@ -13995,9 +14030,9 @@ const VAutocomplete = genericComponent()({
13995
14030
  const {
13996
14031
  filteredItems,
13997
14032
  getMatches
13998
- } = useFilter(props, items, () => isPristine.value ? '' : search.value);
14033
+ } = useFilter(props, items, () => _searchLock.value ?? (isPristine.value ? '' : search.value));
13999
14034
  const displayItems = computed(() => {
14000
- if (props.hideSelected) {
14035
+ if (props.hideSelected && _searchLock.value === null) {
14001
14036
  return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
14002
14037
  }
14003
14038
  return filteredItems.value;
@@ -14128,6 +14163,7 @@ const VAutocomplete = genericComponent()({
14128
14163
  isPristine.value = true;
14129
14164
  vTextFieldRef.value?.focus();
14130
14165
  }
14166
+ _searchLock.value = null;
14131
14167
  }
14132
14168
  function onFocusin(e) {
14133
14169
  isFocused.value = true;
@@ -14163,6 +14199,7 @@ const VAutocomplete = genericComponent()({
14163
14199
  } else {
14164
14200
  const add = set !== false;
14165
14201
  model.value = add ? [item] : [];
14202
+ _searchLock.value = isPristine.value ? '' : search.value ?? '';
14166
14203
  search.value = add && !hasSelectionSlot.value ? item.title : '';
14167
14204
 
14168
14205
  // watch for search watcher to trigger
@@ -14182,6 +14219,9 @@ const VAutocomplete = genericComponent()({
14182
14219
  } else {
14183
14220
  if (!props.multiple && search.value == null) model.value = [];
14184
14221
  menu.value = false;
14222
+ if (!isPristine.value && search.value) {
14223
+ _searchLock.value = search.value;
14224
+ }
14185
14225
  search.value = '';
14186
14226
  selectionIndex.value = -1;
14187
14227
  }
@@ -14191,13 +14231,14 @@ const VAutocomplete = genericComponent()({
14191
14231
  if (val) menu.value = true;
14192
14232
  isPristine.value = !val;
14193
14233
  });
14194
- watch(menu, () => {
14195
- if (!props.hideSelected && menu.value && model.value.length) {
14234
+ watch(menu, val => {
14235
+ if (!props.hideSelected && val && model.value.length && isPristine.value) {
14196
14236
  const index = displayItems.value.findIndex(item => model.value.some(s => item.value === s.value));
14197
14237
  IN_BROWSER && window.requestAnimationFrame(() => {
14198
14238
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
14199
14239
  });
14200
14240
  }
14241
+ if (val) _searchLock.value = null;
14201
14242
  });
14202
14243
  watch(items, (newVal, oldVal) => {
14203
14244
  if (menu.value) return;
@@ -14248,7 +14289,6 @@ const VAutocomplete = genericComponent()({
14248
14289
  "maxHeight": 310,
14249
14290
  "openOnClick": false,
14250
14291
  "closeOnContentClick": false,
14251
- "transition": props.transition,
14252
14292
  "onAfterEnter": onAfterEnter,
14253
14293
  "onAfterLeave": onAfterLeave
14254
14294
  }, props.menuProps), {
@@ -14318,7 +14358,8 @@ const VAutocomplete = genericComponent()({
14318
14358
  "key": item.value,
14319
14359
  "modelValue": isSelected,
14320
14360
  "ripple": false,
14321
- "tabindex": "-1"
14361
+ "tabindex": "-1",
14362
+ "onClick": event => event.preventDefault()
14322
14363
  }, null) : undefined, item.props.prependAvatar && createVNode(VAvatar, {
14323
14364
  "image": item.props.prependAvatar
14324
14365
  }, null), item.props.prependIcon && createVNode(VIcon, {
@@ -15676,7 +15717,19 @@ const VWindow = genericComponent()({
15676
15717
  const activeIndex = computed(() => {
15677
15718
  return group.items.value.findIndex(item => group.selected.value.includes(item.id));
15678
15719
  });
15720
+
15721
+ // Fix for https://github.com/vuetifyjs/vuetify/issues/18447
15679
15722
  watch(activeIndex, (newVal, oldVal) => {
15723
+ let scrollableParent;
15724
+ const savedScrollPosition = {
15725
+ left: 0,
15726
+ top: 0
15727
+ };
15728
+ if (IN_BROWSER && oldVal >= 0) {
15729
+ scrollableParent = getScrollParent(rootRef.value);
15730
+ savedScrollPosition.left = scrollableParent?.scrollLeft;
15731
+ savedScrollPosition.top = scrollableParent?.scrollTop;
15732
+ }
15680
15733
  const itemsLength = group.items.value.length;
15681
15734
  const lastIndex = itemsLength - 1;
15682
15735
  if (itemsLength <= 2) {
@@ -15688,7 +15741,30 @@ const VWindow = genericComponent()({
15688
15741
  } else {
15689
15742
  isReversed.value = newVal < oldVal;
15690
15743
  }
15691
- });
15744
+ nextTick(() => {
15745
+ if (!IN_BROWSER || !scrollableParent) return;
15746
+ const currentScrollY = scrollableParent.scrollTop;
15747
+ if (currentScrollY !== savedScrollPosition.top) {
15748
+ scrollableParent.scrollTo({
15749
+ ...savedScrollPosition,
15750
+ behavior: 'instant'
15751
+ });
15752
+ }
15753
+ requestAnimationFrame(() => {
15754
+ if (!scrollableParent) return;
15755
+ const rafScrollY = scrollableParent.scrollTop;
15756
+ if (rafScrollY !== savedScrollPosition.top) {
15757
+ scrollableParent.scrollTo({
15758
+ ...savedScrollPosition,
15759
+ behavior: 'instant'
15760
+ });
15761
+ }
15762
+ });
15763
+ });
15764
+ }, {
15765
+ flush: 'sync'
15766
+ }); // Run synchronously before DOM updates
15767
+
15692
15768
  provide(VWindowSymbol, {
15693
15769
  transition,
15694
15770
  isReversed,
@@ -18593,7 +18669,7 @@ function createDate(options, locale) {
18593
18669
  };
18594
18670
  }
18595
18671
  function createDateRange(adapter, start, stop) {
18596
- const diff = adapter.getDiff(adapter.endOfDay(stop ?? start), adapter.startOfDay(start), 'days');
18672
+ const diff = adapter.getDiff(new Date(`${adapter.toISO(stop ?? start)}T00:00:00Z`), new Date(`${adapter.toISO(start)}T00:00:00Z`), 'days');
18597
18673
  const datesInRange = [start];
18598
18674
  for (let i = 1; i < diff; i++) {
18599
18675
  const nextDate = adapter.addDays(start, i);
@@ -19276,10 +19352,7 @@ const makeVComboboxProps = propsFactory({
19276
19352
  ...omit(makeVTextFieldProps({
19277
19353
  modelValue: null,
19278
19354
  role: 'combobox'
19279
- }), ['validationValue', 'dirty', 'appendInnerIcon']),
19280
- ...makeTransitionProps({
19281
- transition: false
19282
- })
19355
+ }), ['validationValue', 'dirty', 'appendInnerIcon'])
19283
19356
  }, 'VCombobox');
19284
19357
  const VCombobox = genericComponent()({
19285
19358
  name: 'VCombobox',
@@ -19323,13 +19396,16 @@ const VCombobox = genericComponent()({
19323
19396
  const hasChips = computed(() => !!(props.chips || slots.chip));
19324
19397
  const hasSelectionSlot = computed(() => hasChips.value || !!slots.selection);
19325
19398
  const _search = shallowRef(!props.multiple && !hasSelectionSlot.value ? model.value[0]?.title ?? '' : '');
19399
+ const _searchLock = shallowRef(null);
19326
19400
  const search = computed({
19327
19401
  get: () => {
19328
19402
  return _search.value;
19329
19403
  },
19330
19404
  set: async val => {
19331
19405
  _search.value = val ?? '';
19332
- if (!props.multiple && !hasSelectionSlot.value) {
19406
+ if (val === null || val === '' && !props.multiple && !hasSelectionSlot.value) {
19407
+ model.value = [];
19408
+ } else if (!props.multiple && !hasSelectionSlot.value) {
19333
19409
  model.value = [transformItem$3(props, val)];
19334
19410
  nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
19335
19411
  }
@@ -19357,9 +19433,9 @@ const VCombobox = genericComponent()({
19357
19433
  const {
19358
19434
  filteredItems,
19359
19435
  getMatches
19360
- } = useFilter(props, items, () => props.alwaysFilter || !isPristine.value ? search.value : '');
19436
+ } = useFilter(props, items, () => _searchLock.value ?? (props.alwaysFilter || !isPristine.value ? search.value : ''));
19361
19437
  const displayItems = computed(() => {
19362
- if (props.hideSelected) {
19438
+ if (props.hideSelected && _searchLock.value === null) {
19363
19439
  return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
19364
19440
  }
19365
19441
  return filteredItems.value;
@@ -19440,22 +19516,19 @@ const VCombobox = genericComponent()({
19440
19516
  if (['Escape'].includes(e.key)) {
19441
19517
  menu.value = false;
19442
19518
  }
19443
- if (['Enter', 'Escape', 'Tab'].includes(e.key)) {
19444
- if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key) && !model.value.some(_ref2 => {
19445
- let {
19446
- value
19447
- } = _ref2;
19448
- return value === displayItems.value[0].value;
19449
- })) {
19450
- select(filteredItems.value[0]);
19451
- }
19452
- isPristine.value = true;
19519
+ if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key) && !model.value.some(_ref2 => {
19520
+ let {
19521
+ value
19522
+ } = _ref2;
19523
+ return value === displayItems.value[0].value;
19524
+ })) {
19525
+ select(filteredItems.value[0]);
19453
19526
  }
19454
19527
  if (e.key === 'ArrowDown' && highlightFirst.value) {
19455
19528
  listRef.value?.focus('next');
19456
19529
  }
19457
19530
  if (e.key === 'Enter' && search.value) {
19458
- select(transformItem$3(props, search.value));
19531
+ select(transformItem$3(props, search.value), true, true);
19459
19532
  if (hasSelectionSlot.value) _search.value = '';
19460
19533
  }
19461
19534
  if (['Backspace', 'Delete'].includes(e.key)) {
@@ -19500,13 +19573,15 @@ const VCombobox = genericComponent()({
19500
19573
  }
19501
19574
  function onAfterLeave() {
19502
19575
  if (isFocused.value) {
19503
- isPristine.value = true;
19504
19576
  vTextFieldRef.value?.focus();
19505
19577
  }
19578
+ isPristine.value = true;
19579
+ _searchLock.value = null;
19506
19580
  }
19507
19581
  /** @param set - null means toggle */
19508
19582
  function select(item) {
19509
19583
  let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
19584
+ let keepMenu = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
19510
19585
  if (!item || item.props.disabled) return;
19511
19586
  if (props.multiple) {
19512
19587
  const index = model.value.findIndex(selection => (props.valueComparator || deepEqual)(selection.value, item.value));
@@ -19524,11 +19599,14 @@ const VCombobox = genericComponent()({
19524
19599
  } else {
19525
19600
  const add = set !== false;
19526
19601
  model.value = add ? [item] : [];
19602
+ if ((!isPristine.value || props.alwaysFilter) && _search.value) {
19603
+ _searchLock.value = _search.value;
19604
+ }
19527
19605
  _search.value = add && !hasSelectionSlot.value ? item.title : '';
19528
19606
 
19529
19607
  // watch for search watcher to trigger
19530
19608
  nextTick(() => {
19531
- menu.value = false;
19609
+ menu.value = keepMenu;
19532
19610
  isPristine.value = true;
19533
19611
  });
19534
19612
  }
@@ -19542,9 +19620,6 @@ const VCombobox = genericComponent()({
19542
19620
  function onFocusout(e) {
19543
19621
  listHasFocus.value = false;
19544
19622
  }
19545
- function onUpdateModelValue(v) {
19546
- if (v == null || v === '' && !props.multiple && !hasSelectionSlot.value) model.value = [];
19547
- }
19548
19623
  watch(isFocused, (val, oldVal) => {
19549
19624
  if (val || val === oldVal) return;
19550
19625
  selectionIndex.value = -1;
@@ -19567,13 +19642,14 @@ const VCombobox = genericComponent()({
19567
19642
  }
19568
19643
  }
19569
19644
  });
19570
- watch(menu, () => {
19571
- if (!props.hideSelected && menu.value && model.value.length) {
19645
+ watch(menu, val => {
19646
+ if (!props.hideSelected && val && model.value.length && isPristine.value) {
19572
19647
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
19573
19648
  IN_BROWSER && window.requestAnimationFrame(() => {
19574
19649
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
19575
19650
  });
19576
19651
  }
19652
+ if (val) _searchLock.value = null;
19577
19653
  });
19578
19654
  watch(items, (newVal, oldVal) => {
19579
19655
  if (menu.value) return;
@@ -19589,7 +19665,7 @@ const VCombobox = genericComponent()({
19589
19665
  "ref": vTextFieldRef
19590
19666
  }, textFieldProps, {
19591
19667
  "modelValue": search.value,
19592
- "onUpdate:modelValue": [$event => search.value = $event, onUpdateModelValue],
19668
+ "onUpdate:modelValue": $event => search.value = $event,
19593
19669
  "focused": isFocused.value,
19594
19670
  "onUpdate:focused": $event => isFocused.value = $event,
19595
19671
  "validationValue": model.externalValue,
@@ -19624,7 +19700,6 @@ const VCombobox = genericComponent()({
19624
19700
  "maxHeight": 310,
19625
19701
  "openOnClick": false,
19626
19702
  "closeOnContentClick": false,
19627
- "transition": props.transition,
19628
19703
  "onAfterEnter": onAfterEnter,
19629
19704
  "onAfterLeave": onAfterLeave
19630
19705
  }, props.menuProps), {
@@ -19694,7 +19769,8 @@ const VCombobox = genericComponent()({
19694
19769
  "key": item.value,
19695
19770
  "modelValue": isSelected,
19696
19771
  "ripple": false,
19697
- "tabindex": "-1"
19772
+ "tabindex": "-1",
19773
+ "onClick": event => event.preventDefault()
19698
19774
  }, null) : undefined, item.props.prependAvatar && createVNode(VAvatar, {
19699
19775
  "image": item.props.prependAvatar
19700
19776
  }, null), item.props.prependIcon && createVNode(VIcon, {
@@ -24104,7 +24180,7 @@ const VDatePicker = genericComponent()({
24104
24180
  function isAllowedInRange(start, end) {
24105
24181
  const allowedDates = props.allowedDates;
24106
24182
  if (typeof allowedDates !== 'function') return true;
24107
- const days = adapter.getDiff(end, start, 'days');
24183
+ const days = 1 + adapter.getDiff(new Date(`${adapter.toISO(end)}T00:00:00Z`), new Date(`${adapter.toISO(start)}T00:00:00Z`), 'days');
24108
24184
  for (let i = 0; i < days; i++) {
24109
24185
  if (allowedDates(adapter.addDays(start, i))) return true;
24110
24186
  }
@@ -25127,10 +25203,11 @@ const VFileInput = genericComponent()({
25127
25203
  props: {
25128
25204
  class: fieldClass,
25129
25205
  ...slotProps
25130
- }
25206
+ },
25207
+ controlRef
25131
25208
  } = _ref4;
25132
25209
  return createElementVNode(Fragment, null, [createElementVNode("input", mergeProps({
25133
- "ref": inputRef,
25210
+ "ref": val => inputRef.value = controlRef.value = val,
25134
25211
  "type": "file",
25135
25212
  "accept": inputAccept,
25136
25213
  "readonly": isReadonly.value,
@@ -26607,7 +26684,7 @@ const VNumberInput = genericComponent()({
26607
26684
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
26608
26685
  const _inputText = shallowRef(null);
26609
26686
  watchEffect(() => {
26610
- if (isFocused.value && !controlsDisabled.value && Number(_inputText.value) === model.value) ; else if (model.value == null) {
26687
+ if (isFocused.value && !controlsDisabled.value && Number(_inputText.value?.replace(decimalSeparator.value, '.')) === model.value) ; else if (model.value == null) {
26611
26688
  _inputText.value = null;
26612
26689
  } else if (!isNaN(model.value)) {
26613
26690
  _inputText.value = correctPrecision(model.value);
@@ -26702,6 +26779,7 @@ const VNumberInput = genericComponent()({
26702
26779
  if (!new RegExp(`^-?\\d*${escapeForRegex(decimalSeparator.value)}?\\d*$`).test(potentialNewInputVal)) {
26703
26780
  e.preventDefault();
26704
26781
  inputElement.value = potentialNewNumber;
26782
+ nextTick(() => inputText.value = potentialNewNumber);
26705
26783
  }
26706
26784
  if (props.precision == null) return;
26707
26785
 
@@ -26709,13 +26787,15 @@ const VNumberInput = genericComponent()({
26709
26787
  if (potentialNewInputVal.split(decimalSeparator.value)[1]?.length > props.precision) {
26710
26788
  e.preventDefault();
26711
26789
  inputElement.value = potentialNewNumber;
26790
+ nextTick(() => inputText.value = potentialNewNumber);
26712
26791
  const cursorPosition = (selectionStart ?? 0) + e.data.length;
26713
26792
  inputElement.setSelectionRange(cursorPosition, cursorPosition);
26714
26793
  }
26715
26794
  // Ignore decimal separator when precision = 0
26716
- if (props.precision === 0 && potentialNewInputVal.includes(decimalSeparator.value)) {
26795
+ if (props.precision === 0 && potentialNewInputVal.endsWith(decimalSeparator.value)) {
26717
26796
  e.preventDefault();
26718
26797
  inputElement.value = potentialNewNumber;
26798
+ nextTick(() => inputText.value = potentialNewNumber);
26719
26799
  }
26720
26800
  }
26721
26801
  async function onKeydown(e) {
@@ -27911,12 +27991,12 @@ const VSkeletonLoader = genericComponent()({
27911
27991
  ariaLabel: t(props.loadingText),
27912
27992
  role: 'alert'
27913
27993
  };
27914
- return createElementVNode(Fragment, null, [isLoading ? createElementVNode("div", mergeProps({
27994
+ return isLoading ? createElementVNode("div", mergeProps({
27915
27995
  "class": ['v-skeleton-loader', {
27916
27996
  'v-skeleton-loader--boilerplate': props.boilerplate
27917
27997
  }, themeClasses.value, backgroundColorClasses.value, elevationClasses.value],
27918
27998
  "style": [backgroundColorStyles.value, dimensionStyles.value]
27919
- }, loadingProps, attrs), [items.value]) : slots.default?.()]);
27999
+ }, loadingProps, attrs), [items.value]) : createElementVNode(Fragment, null, [slots.default?.()]);
27920
28000
  });
27921
28001
  return {};
27922
28002
  }
@@ -29781,6 +29861,10 @@ const VTextarea = genericComponent()({
29781
29861
  const vFieldRef = ref();
29782
29862
  const controlHeight = shallowRef('');
29783
29863
  const textareaRef = ref();
29864
+ const scrollbarWidth = ref(0);
29865
+ const {
29866
+ platform
29867
+ } = useDisplay();
29784
29868
  const autocomplete = useAutocomplete(props);
29785
29869
  const isActive = computed(() => props.persistentPlaceholder || isFocused.value || props.active);
29786
29870
  function onFocus() {
@@ -29825,6 +29909,18 @@ const VTextarea = genericComponent()({
29825
29909
  if (!props.autoGrow) rows.value = Number(props.rows);
29826
29910
  });
29827
29911
  function calculateInputHeight() {
29912
+ nextTick(() => {
29913
+ if (!textareaRef.value) return;
29914
+ if (platform.value.firefox) {
29915
+ scrollbarWidth.value = 12;
29916
+ return;
29917
+ }
29918
+ const {
29919
+ offsetWidth,
29920
+ clientWidth
29921
+ } = textareaRef.value;
29922
+ scrollbarWidth.value = Math.max(0, offsetWidth - clientWidth);
29923
+ });
29828
29924
  if (!props.autoGrow) return;
29829
29925
  nextTick(() => {
29830
29926
  if (!sizerRef.value || !vFieldRef.value) return;
@@ -29885,7 +29981,9 @@ const VTextarea = genericComponent()({
29885
29981
  'v-textarea--no-resize': props.noResize || props.autoGrow,
29886
29982
  'v-input--plain-underlined': isPlainOrUnderlined.value
29887
29983
  }, props.class],
29888
- "style": props.style
29984
+ "style": [{
29985
+ '--v-textarea-scroll-bar-width': convertToUnit(scrollbarWidth.value)
29986
+ }, props.style]
29889
29987
  }, rootAttrs, inputProps, {
29890
29988
  "centerAffix": rows.value === 1 && !isPlainOrUnderlined.value,
29891
29989
  "focused": isFocused.value
@@ -29925,12 +30023,13 @@ const VTextarea = genericComponent()({
29925
30023
  props: {
29926
30024
  class: fieldClass,
29927
30025
  ...slotProps
29928
- }
30026
+ },
30027
+ controlRef
29929
30028
  } = _ref3;
29930
30029
  return createElementVNode(Fragment, null, [props.prefix && createElementVNode("span", {
29931
30030
  "class": "v-text-field__prefix"
29932
30031
  }, [props.prefix]), withDirectives(createElementVNode("textarea", mergeProps({
29933
- "ref": textareaRef,
30032
+ "ref": val => textareaRef.value = controlRef.value = val,
29934
30033
  "class": fieldClass,
29935
30034
  "value": model.value,
29936
30035
  "onInput": onInput,
@@ -34313,7 +34412,7 @@ const makeVColorInputProps = propsFactory({
34313
34412
  ...makeFocusProps(),
34314
34413
  ...makeVConfirmEditProps(),
34315
34414
  ...makeVTextFieldProps(),
34316
- ...omit(makeVColorPickerProps(), ['width'])
34415
+ ...omit(makeVColorPickerProps(), ['location', 'height', 'minHeight', 'maxHeight'])
34317
34416
  }, 'VColorInput');
34318
34417
  const VColorInput = genericComponent()({
34319
34418
  name: 'VColorInput',
@@ -34352,7 +34451,7 @@ const VColorInput = genericComponent()({
34352
34451
  }
34353
34452
  useRender(() => {
34354
34453
  const confirmEditProps = VConfirmEdit.filterProps(props);
34355
- const colorPickerProps = VColorPicker.filterProps(omit(props, ['active', 'color']));
34454
+ const colorPickerProps = VColorPicker.filterProps(omit(props, ['active', 'bgColor', 'color', 'rounded', 'maxWidth', 'minWidth', 'width']));
34356
34455
  const textFieldProps = VTextField.filterProps(props);
34357
34456
  const slotWithPip = props.hidePip ? undefined : {
34358
34457
  [props.pipLocation]: arg => createElementVNode(Fragment, null, [createVNode(VAvatar, {
@@ -34570,7 +34669,7 @@ const makeVDateInputProps = propsFactory({
34570
34669
  ...omit(makeVDatePickerProps({
34571
34670
  hideHeader: true,
34572
34671
  showAdjacentMonths: true
34573
- }), ['active', 'location', 'rounded'])
34672
+ }), ['active', 'location', 'rounded', 'height', 'minHeight', 'maxHeight'])
34574
34673
  }, 'VDateInput');
34575
34674
  const VDateInput = genericComponent()({
34576
34675
  name: 'VDateInput',
@@ -34601,6 +34700,15 @@ const VDateInput = genericComponent()({
34601
34700
  const {
34602
34701
  mobile
34603
34702
  } = useDisplay(props);
34703
+ const clamp = date => {
34704
+ if (props.max && adapter.isAfter(date, props.max)) {
34705
+ return props.max;
34706
+ }
34707
+ if (props.min && adapter.isBefore(date, props.min)) {
34708
+ return props.min;
34709
+ }
34710
+ return date;
34711
+ };
34604
34712
  const emptyModelValue = () => props.multiple ? [] : null;
34605
34713
  const model = useProxiedModel(props, 'modelValue', emptyModelValue(), val => Array.isArray(val) ? val.map(item => adapter.toJsDate(item)) : val ? adapter.toJsDate(val) : val, val => Array.isArray(val) ? val.map(item => adapter.date(item)) : val ? adapter.date(val) : val);
34606
34714
  const menu = useProxiedModel(props, 'menu');
@@ -34651,7 +34759,7 @@ const VDateInput = genericComponent()({
34651
34759
  if (!menu.value || !isFocused.value) {
34652
34760
  menu.value = true;
34653
34761
  }
34654
- if (props.updateOn.includes('enter')) {
34762
+ if (props.updateOn.includes('enter') && !props.readonly) {
34655
34763
  onUserInput(e.target);
34656
34764
  }
34657
34765
  }
@@ -34678,7 +34786,7 @@ const VDateInput = genericComponent()({
34678
34786
  model.value = emptyModelValue();
34679
34787
  }
34680
34788
  function onBlur(e) {
34681
- if (props.updateOn.includes('blur')) {
34789
+ if (props.updateOn.includes('blur') && !props.readonly) {
34682
34790
  onUserInput(e.target);
34683
34791
  }
34684
34792
 
@@ -34696,23 +34804,23 @@ const VDateInput = genericComponent()({
34696
34804
  model.value = emptyModelValue();
34697
34805
  } else if (!props.multiple) {
34698
34806
  if (isValid(value)) {
34699
- model.value = parseDate(value);
34807
+ model.value = clamp(parseDate(value));
34700
34808
  }
34701
34809
  } else {
34702
34810
  const parts = value.trim().split(/\D+-\D+|[^\d\-/.]+/);
34703
34811
  if (parts.every(isValid)) {
34704
34812
  if (props.multiple === 'range') {
34705
- const [start, stop] = parts.map(parseDate).toSorted((a, b) => adapter.isAfter(a, b) ? 1 : -1);
34813
+ const [start, stop] = parts.map(parseDate).map(clamp).toSorted((a, b) => adapter.isAfter(a, b) ? 1 : -1);
34706
34814
  model.value = createDateRange(adapter, start, stop);
34707
34815
  } else {
34708
- model.value = parts.map(parseDate);
34816
+ model.value = parts.map(parseDate).map(clamp);
34709
34817
  }
34710
34818
  }
34711
34819
  }
34712
34820
  }
34713
34821
  useRender(() => {
34714
34822
  const confirmEditProps = VConfirmEdit.filterProps(props);
34715
- const datePickerProps = VDatePicker.filterProps(omit(props, ['active', 'location', 'rounded']));
34823
+ const datePickerProps = VDatePicker.filterProps(omit(props, ['active', 'bgColor', 'color', 'location', 'rounded', 'maxWidth', 'minWidth', 'width']));
34716
34824
  const datePickerSlots = pick(slots, ['title', 'header', 'day', 'month', 'year']);
34717
34825
  const textFieldProps = VTextField.filterProps(omit(props, ['placeholder']));
34718
34826
  return createVNode(VTextField, mergeProps({
@@ -35157,7 +35265,7 @@ const VMaskInput = genericComponent()({
35157
35265
  // Always display masked value in input when mask is applied
35158
35266
  val => props.mask ? mask.mask(mask.unmask(val)) : val, val => {
35159
35267
  if (props.mask) {
35160
- const valueWithoutDelimiters = removeMaskDelimiters(val);
35268
+ const valueWithoutDelimiters = val ? removeMaskDelimiters(val) : '';
35161
35269
 
35162
35270
  // E.g. mask is #-# and the input value is '2-23'
35163
35271
  // model-value should be enforced to '2-2'
@@ -37903,7 +38011,7 @@ function createVuetify$1() {
37903
38011
  };
37904
38012
  });
37905
38013
  }
37906
- const version$1 = "3.10.5";
38014
+ const version$1 = "3.10.7";
37907
38015
  createVuetify$1.version = version$1;
37908
38016
 
37909
38017
  // Vue's inject() can only be used in setup
@@ -38201,7 +38309,7 @@ var index = /*#__PURE__*/Object.freeze({
38201
38309
 
38202
38310
  /* eslint-disable local-rules/sort-imports */
38203
38311
 
38204
- const version = "3.10.5";
38312
+ const version = "3.10.7";
38205
38313
 
38206
38314
  /* eslint-disable local-rules/sort-imports */
38207
38315