vuetify 3.10.5 → 3.10.6

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 (89) hide show
  1. package/README.md +0 -6
  2. package/dist/json/attributes.json +3568 -3592
  3. package/dist/json/importMap-labs.json +24 -24
  4. package/dist/json/importMap.json +152 -152
  5. package/dist/json/tags.json +3 -9
  6. package/dist/json/web-types.json +6916 -6969
  7. package/dist/vuetify-labs.cjs +178 -72
  8. package/dist/vuetify-labs.css +4389 -4339
  9. package/dist/vuetify-labs.d.ts +108 -163
  10. package/dist/vuetify-labs.esm.js +178 -72
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +178 -72
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +159 -62
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +4349 -4321
  17. package/dist/vuetify.d.ts +108 -128
  18. package/dist/vuetify.esm.js +159 -62
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +159 -62
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +113 -102
  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 +13 -11
  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 +26 -28
  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/VList/VListItem.css +14 -12
  39. package/lib/components/VList/VListItem.js +4 -2
  40. package/lib/components/VList/VListItem.js.map +1 -1
  41. package/lib/components/VList/VListItem.sass +20 -18
  42. package/lib/components/VMenu/VMenu.js +22 -4
  43. package/lib/components/VMenu/VMenu.js.map +1 -1
  44. package/lib/components/VNumberInput/VNumberInput.css +8 -0
  45. package/lib/components/VNumberInput/VNumberInput.js +5 -2
  46. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  47. package/lib/components/VNumberInput/VNumberInput.sass +10 -4
  48. package/lib/components/VSkeletonLoader/VSkeletonLoader.css +17 -0
  49. package/lib/components/VSkeletonLoader/VSkeletonLoader.js +3 -3
  50. package/lib/components/VSkeletonLoader/VSkeletonLoader.js.map +1 -1
  51. package/lib/components/VSkeletonLoader/VSkeletonLoader.sass +7 -0
  52. package/lib/components/VSlideGroup/VSlideGroup.d.ts +25 -0
  53. package/lib/components/VSlideGroup/VSlideGroup.js +5 -1
  54. package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
  55. package/lib/components/VTabs/VTabs.d.ts +25 -0
  56. package/lib/components/VTextField/VTextField.js +0 -3
  57. package/lib/components/VTextField/VTextField.js.map +1 -1
  58. package/lib/components/VTextarea/VTextarea.css +2 -2
  59. package/lib/components/VTextarea/VTextarea.js +20 -1
  60. package/lib/components/VTextarea/VTextarea.js.map +1 -1
  61. package/lib/components/VTextarea/VTextarea.sass +4 -2
  62. package/lib/components/VWindow/VWindow.js +43 -3
  63. package/lib/components/VWindow/VWindow.js.map +1 -1
  64. package/lib/composables/date/date.js +1 -1
  65. package/lib/composables/date/date.js.map +1 -1
  66. package/lib/composables/group.js +1 -1
  67. package/lib/composables/group.js.map +1 -1
  68. package/lib/composables/nested/nested.js +12 -2
  69. package/lib/composables/nested/nested.js.map +1 -1
  70. package/lib/composables/virtual.js +2 -2
  71. package/lib/composables/virtual.js.map +1 -1
  72. package/lib/entry-bundler.js +1 -1
  73. package/lib/framework.d.ts +54 -54
  74. package/lib/framework.js +1 -1
  75. package/lib/labs/VColorInput/VColorInput.d.ts +0 -40
  76. package/lib/labs/VColorInput/VColorInput.js +2 -2
  77. package/lib/labs/VColorInput/VColorInput.js.map +1 -1
  78. package/lib/labs/VDateInput/VDateInput.d.ts +0 -30
  79. package/lib/labs/VDateInput/VDateInput.js +16 -7
  80. package/lib/labs/VDateInput/VDateInput.js.map +1 -1
  81. package/lib/labs/VIconBtn/VIconBtn.css +22 -0
  82. package/lib/labs/VIconBtn/VIconBtn.scss +32 -0
  83. package/lib/labs/VMaskInput/VMaskInput.js +1 -1
  84. package/lib/labs/VMaskInput/VMaskInput.js.map +1 -1
  85. package/lib/labs/rules/rules.js +1 -1
  86. package/lib/labs/rules/rules.js.map +1 -1
  87. package/lib/util/helpers.js +4 -2
  88. package/lib/util/helpers.js.map +1 -1
  89. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.10.5
2
+ * Vuetify v3.10.6
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,
@@ -12906,7 +12941,7 @@ function useVirtual(props, items) {
12906
12941
  const start = performance.now();
12907
12942
  offsets[0] = 0;
12908
12943
  const length = items.value.length;
12909
- for (let i = 1; i <= length - 1; i++) {
12944
+ for (let i = 1; i <= length; i++) {
12910
12945
  offsets[i] = (offsets[i - 1] || 0) + getSize(i - 1);
12911
12946
  }
12912
12947
  updateTime.value = Math.max(updateTime.value, performance.now() - start);
@@ -12941,7 +12976,7 @@ function useVirtual(props, items) {
12941
12976
  }
12942
12977
  }
12943
12978
  function calculateOffset(index) {
12944
- index = clamp(index, 0, items.value.length - 1);
12979
+ index = clamp(index, 0, items.value.length);
12945
12980
  const whole = Math.floor(index);
12946
12981
  const fraction = index % 1;
12947
12982
  const next = whole + 1;
@@ -13946,10 +13981,7 @@ const makeVAutocompleteProps = propsFactory({
13946
13981
  ...omit(makeVTextFieldProps({
13947
13982
  modelValue: null,
13948
13983
  role: 'combobox'
13949
- }), ['validationValue', 'dirty', 'appendInnerIcon']),
13950
- ...makeTransitionProps({
13951
- transition: false
13952
- })
13984
+ }), ['validationValue', 'dirty', 'appendInnerIcon'])
13953
13985
  }, 'VAutocomplete');
13954
13986
  const VAutocomplete = genericComponent()({
13955
13987
  name: 'VAutocomplete',
@@ -13974,6 +14006,7 @@ const VAutocomplete = genericComponent()({
13974
14006
  const vMenuRef = ref();
13975
14007
  const vVirtualScrollRef = ref();
13976
14008
  const selectionIndex = shallowRef(-1);
14009
+ const _searchLock = shallowRef(null);
13977
14010
  const {
13978
14011
  items,
13979
14012
  transformIn,
@@ -13995,9 +14028,9 @@ const VAutocomplete = genericComponent()({
13995
14028
  const {
13996
14029
  filteredItems,
13997
14030
  getMatches
13998
- } = useFilter(props, items, () => isPristine.value ? '' : search.value);
14031
+ } = useFilter(props, items, () => _searchLock.value ?? (isPristine.value ? '' : search.value));
13999
14032
  const displayItems = computed(() => {
14000
- if (props.hideSelected) {
14033
+ if (props.hideSelected && _searchLock.value === null) {
14001
14034
  return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
14002
14035
  }
14003
14036
  return filteredItems.value;
@@ -14128,6 +14161,7 @@ const VAutocomplete = genericComponent()({
14128
14161
  isPristine.value = true;
14129
14162
  vTextFieldRef.value?.focus();
14130
14163
  }
14164
+ _searchLock.value = null;
14131
14165
  }
14132
14166
  function onFocusin(e) {
14133
14167
  isFocused.value = true;
@@ -14163,6 +14197,7 @@ const VAutocomplete = genericComponent()({
14163
14197
  } else {
14164
14198
  const add = set !== false;
14165
14199
  model.value = add ? [item] : [];
14200
+ _searchLock.value = isPristine.value ? '' : search.value ?? '';
14166
14201
  search.value = add && !hasSelectionSlot.value ? item.title : '';
14167
14202
 
14168
14203
  // watch for search watcher to trigger
@@ -14182,6 +14217,9 @@ const VAutocomplete = genericComponent()({
14182
14217
  } else {
14183
14218
  if (!props.multiple && search.value == null) model.value = [];
14184
14219
  menu.value = false;
14220
+ if (!isPristine.value && search.value) {
14221
+ _searchLock.value = search.value;
14222
+ }
14185
14223
  search.value = '';
14186
14224
  selectionIndex.value = -1;
14187
14225
  }
@@ -14191,13 +14229,14 @@ const VAutocomplete = genericComponent()({
14191
14229
  if (val) menu.value = true;
14192
14230
  isPristine.value = !val;
14193
14231
  });
14194
- watch(menu, () => {
14195
- if (!props.hideSelected && menu.value && model.value.length) {
14232
+ watch(menu, val => {
14233
+ if (!props.hideSelected && val && model.value.length && isPristine.value) {
14196
14234
  const index = displayItems.value.findIndex(item => model.value.some(s => item.value === s.value));
14197
14235
  IN_BROWSER && window.requestAnimationFrame(() => {
14198
14236
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
14199
14237
  });
14200
14238
  }
14239
+ if (val) _searchLock.value = null;
14201
14240
  });
14202
14241
  watch(items, (newVal, oldVal) => {
14203
14242
  if (menu.value) return;
@@ -14248,7 +14287,6 @@ const VAutocomplete = genericComponent()({
14248
14287
  "maxHeight": 310,
14249
14288
  "openOnClick": false,
14250
14289
  "closeOnContentClick": false,
14251
- "transition": props.transition,
14252
14290
  "onAfterEnter": onAfterEnter,
14253
14291
  "onAfterLeave": onAfterLeave
14254
14292
  }, props.menuProps), {
@@ -15676,7 +15714,21 @@ const VWindow = genericComponent()({
15676
15714
  const activeIndex = computed(() => {
15677
15715
  return group.items.value.findIndex(item => group.selected.value.includes(item.id));
15678
15716
  });
15717
+
15718
+ // Fix for https://github.com/vuetifyjs/vuetify/issues/18447
15679
15719
  watch(activeIndex, (newVal, oldVal) => {
15720
+ let scrollableParent;
15721
+ const savedScrollPosition = {
15722
+ x: 0,
15723
+ y: 0
15724
+ };
15725
+ if (IN_BROWSER && oldVal >= 0) {
15726
+ scrollableParent = getScrollParent(rootRef.value);
15727
+
15728
+ // Save current scroll position
15729
+ savedScrollPosition.x = scrollableParent.scrollLeft;
15730
+ savedScrollPosition.y = scrollableParent.scrollTop;
15731
+ }
15680
15732
  const itemsLength = group.items.value.length;
15681
15733
  const lastIndex = itemsLength - 1;
15682
15734
  if (itemsLength <= 2) {
@@ -15688,7 +15740,32 @@ const VWindow = genericComponent()({
15688
15740
  } else {
15689
15741
  isReversed.value = newVal < oldVal;
15690
15742
  }
15691
- });
15743
+ nextTick(() => {
15744
+ if (!IN_BROWSER || !scrollableParent) return;
15745
+ const currentScrollY = scrollableParent.scrollTop;
15746
+ if (currentScrollY !== savedScrollPosition.y) {
15747
+ scrollableParent.scrollTo({
15748
+ left: savedScrollPosition.x,
15749
+ top: savedScrollPosition.y,
15750
+ behavior: 'instant'
15751
+ });
15752
+ }
15753
+ requestAnimationFrame(() => {
15754
+ if (!scrollableParent) return;
15755
+ const rafScrollY = scrollableParent.scrollTop;
15756
+ if (rafScrollY !== savedScrollPosition.y) {
15757
+ scrollableParent.scrollTo({
15758
+ left: savedScrollPosition.x,
15759
+ top: savedScrollPosition.y,
15760
+ behavior: 'instant'
15761
+ });
15762
+ }
15763
+ });
15764
+ });
15765
+ }, {
15766
+ flush: 'sync'
15767
+ }); // Run synchronously before DOM updates
15768
+
15692
15769
  provide(VWindowSymbol, {
15693
15770
  transition,
15694
15771
  isReversed,
@@ -18593,7 +18670,7 @@ function createDate(options, locale) {
18593
18670
  };
18594
18671
  }
18595
18672
  function createDateRange(adapter, start, stop) {
18596
- const diff = adapter.getDiff(adapter.endOfDay(stop ?? start), adapter.startOfDay(start), 'days');
18673
+ const diff = adapter.getDiff(new Date(`${adapter.toISO(stop ?? start)}T00:00:00Z`), new Date(`${adapter.toISO(start)}T00:00:00Z`), 'days');
18597
18674
  const datesInRange = [start];
18598
18675
  for (let i = 1; i < diff; i++) {
18599
18676
  const nextDate = adapter.addDays(start, i);
@@ -19276,10 +19353,7 @@ const makeVComboboxProps = propsFactory({
19276
19353
  ...omit(makeVTextFieldProps({
19277
19354
  modelValue: null,
19278
19355
  role: 'combobox'
19279
- }), ['validationValue', 'dirty', 'appendInnerIcon']),
19280
- ...makeTransitionProps({
19281
- transition: false
19282
- })
19356
+ }), ['validationValue', 'dirty', 'appendInnerIcon'])
19283
19357
  }, 'VCombobox');
19284
19358
  const VCombobox = genericComponent()({
19285
19359
  name: 'VCombobox',
@@ -19323,13 +19397,16 @@ const VCombobox = genericComponent()({
19323
19397
  const hasChips = computed(() => !!(props.chips || slots.chip));
19324
19398
  const hasSelectionSlot = computed(() => hasChips.value || !!slots.selection);
19325
19399
  const _search = shallowRef(!props.multiple && !hasSelectionSlot.value ? model.value[0]?.title ?? '' : '');
19400
+ const _searchLock = shallowRef(null);
19326
19401
  const search = computed({
19327
19402
  get: () => {
19328
19403
  return _search.value;
19329
19404
  },
19330
19405
  set: async val => {
19331
19406
  _search.value = val ?? '';
19332
- if (!props.multiple && !hasSelectionSlot.value) {
19407
+ if (val === null || val === '' && !props.multiple && !hasSelectionSlot.value) {
19408
+ model.value = [];
19409
+ } else if (!props.multiple && !hasSelectionSlot.value) {
19333
19410
  model.value = [transformItem$3(props, val)];
19334
19411
  nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
19335
19412
  }
@@ -19357,9 +19434,9 @@ const VCombobox = genericComponent()({
19357
19434
  const {
19358
19435
  filteredItems,
19359
19436
  getMatches
19360
- } = useFilter(props, items, () => props.alwaysFilter || !isPristine.value ? search.value : '');
19437
+ } = useFilter(props, items, () => _searchLock.value ?? (props.alwaysFilter || !isPristine.value ? search.value : ''));
19361
19438
  const displayItems = computed(() => {
19362
- if (props.hideSelected) {
19439
+ if (props.hideSelected && _searchLock.value === null) {
19363
19440
  return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
19364
19441
  }
19365
19442
  return filteredItems.value;
@@ -19440,22 +19517,19 @@ const VCombobox = genericComponent()({
19440
19517
  if (['Escape'].includes(e.key)) {
19441
19518
  menu.value = false;
19442
19519
  }
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;
19520
+ if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key) && !model.value.some(_ref2 => {
19521
+ let {
19522
+ value
19523
+ } = _ref2;
19524
+ return value === displayItems.value[0].value;
19525
+ })) {
19526
+ select(filteredItems.value[0]);
19453
19527
  }
19454
19528
  if (e.key === 'ArrowDown' && highlightFirst.value) {
19455
19529
  listRef.value?.focus('next');
19456
19530
  }
19457
19531
  if (e.key === 'Enter' && search.value) {
19458
- select(transformItem$3(props, search.value));
19532
+ select(transformItem$3(props, search.value), true, true);
19459
19533
  if (hasSelectionSlot.value) _search.value = '';
19460
19534
  }
19461
19535
  if (['Backspace', 'Delete'].includes(e.key)) {
@@ -19503,10 +19577,12 @@ const VCombobox = genericComponent()({
19503
19577
  isPristine.value = true;
19504
19578
  vTextFieldRef.value?.focus();
19505
19579
  }
19580
+ _searchLock.value = null;
19506
19581
  }
19507
19582
  /** @param set - null means toggle */
19508
19583
  function select(item) {
19509
19584
  let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
19585
+ let keepMenu = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
19510
19586
  if (!item || item.props.disabled) return;
19511
19587
  if (props.multiple) {
19512
19588
  const index = model.value.findIndex(selection => (props.valueComparator || deepEqual)(selection.value, item.value));
@@ -19524,11 +19600,14 @@ const VCombobox = genericComponent()({
19524
19600
  } else {
19525
19601
  const add = set !== false;
19526
19602
  model.value = add ? [item] : [];
19603
+ if ((!isPristine.value || props.alwaysFilter) && _search.value) {
19604
+ _searchLock.value = _search.value;
19605
+ }
19527
19606
  _search.value = add && !hasSelectionSlot.value ? item.title : '';
19528
19607
 
19529
19608
  // watch for search watcher to trigger
19530
19609
  nextTick(() => {
19531
- menu.value = false;
19610
+ menu.value = keepMenu;
19532
19611
  isPristine.value = true;
19533
19612
  });
19534
19613
  }
@@ -19542,9 +19621,6 @@ const VCombobox = genericComponent()({
19542
19621
  function onFocusout(e) {
19543
19622
  listHasFocus.value = false;
19544
19623
  }
19545
- function onUpdateModelValue(v) {
19546
- if (v == null || v === '' && !props.multiple && !hasSelectionSlot.value) model.value = [];
19547
- }
19548
19624
  watch(isFocused, (val, oldVal) => {
19549
19625
  if (val || val === oldVal) return;
19550
19626
  selectionIndex.value = -1;
@@ -19567,13 +19643,14 @@ const VCombobox = genericComponent()({
19567
19643
  }
19568
19644
  }
19569
19645
  });
19570
- watch(menu, () => {
19571
- if (!props.hideSelected && menu.value && model.value.length) {
19646
+ watch(menu, val => {
19647
+ if (!props.hideSelected && val && model.value.length && isPristine.value) {
19572
19648
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
19573
19649
  IN_BROWSER && window.requestAnimationFrame(() => {
19574
19650
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
19575
19651
  });
19576
19652
  }
19653
+ if (val) _searchLock.value = null;
19577
19654
  });
19578
19655
  watch(items, (newVal, oldVal) => {
19579
19656
  if (menu.value) return;
@@ -19589,7 +19666,7 @@ const VCombobox = genericComponent()({
19589
19666
  "ref": vTextFieldRef
19590
19667
  }, textFieldProps, {
19591
19668
  "modelValue": search.value,
19592
- "onUpdate:modelValue": [$event => search.value = $event, onUpdateModelValue],
19669
+ "onUpdate:modelValue": $event => search.value = $event,
19593
19670
  "focused": isFocused.value,
19594
19671
  "onUpdate:focused": $event => isFocused.value = $event,
19595
19672
  "validationValue": model.externalValue,
@@ -19624,7 +19701,6 @@ const VCombobox = genericComponent()({
19624
19701
  "maxHeight": 310,
19625
19702
  "openOnClick": false,
19626
19703
  "closeOnContentClick": false,
19627
- "transition": props.transition,
19628
19704
  "onAfterEnter": onAfterEnter,
19629
19705
  "onAfterLeave": onAfterLeave
19630
19706
  }, props.menuProps), {
@@ -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
  }
@@ -26607,7 +26683,7 @@ const VNumberInput = genericComponent()({
26607
26683
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
26608
26684
  const _inputText = shallowRef(null);
26609
26685
  watchEffect(() => {
26610
- if (isFocused.value && !controlsDisabled.value && Number(_inputText.value) === model.value) ; else if (model.value == null) {
26686
+ if (isFocused.value && !controlsDisabled.value && Number(_inputText.value?.replace(decimalSeparator.value, '.')) === model.value) ; else if (model.value == null) {
26611
26687
  _inputText.value = null;
26612
26688
  } else if (!isNaN(model.value)) {
26613
26689
  _inputText.value = correctPrecision(model.value);
@@ -26702,6 +26778,7 @@ const VNumberInput = genericComponent()({
26702
26778
  if (!new RegExp(`^-?\\d*${escapeForRegex(decimalSeparator.value)}?\\d*$`).test(potentialNewInputVal)) {
26703
26779
  e.preventDefault();
26704
26780
  inputElement.value = potentialNewNumber;
26781
+ nextTick(() => inputText.value = potentialNewNumber);
26705
26782
  }
26706
26783
  if (props.precision == null) return;
26707
26784
 
@@ -26709,13 +26786,15 @@ const VNumberInput = genericComponent()({
26709
26786
  if (potentialNewInputVal.split(decimalSeparator.value)[1]?.length > props.precision) {
26710
26787
  e.preventDefault();
26711
26788
  inputElement.value = potentialNewNumber;
26789
+ nextTick(() => inputText.value = potentialNewNumber);
26712
26790
  const cursorPosition = (selectionStart ?? 0) + e.data.length;
26713
26791
  inputElement.setSelectionRange(cursorPosition, cursorPosition);
26714
26792
  }
26715
26793
  // Ignore decimal separator when precision = 0
26716
- if (props.precision === 0 && potentialNewInputVal.includes(decimalSeparator.value)) {
26794
+ if (props.precision === 0 && potentialNewInputVal.endsWith(decimalSeparator.value)) {
26717
26795
  e.preventDefault();
26718
26796
  inputElement.value = potentialNewNumber;
26797
+ nextTick(() => inputText.value = potentialNewNumber);
26719
26798
  }
26720
26799
  }
26721
26800
  async function onKeydown(e) {
@@ -27911,12 +27990,12 @@ const VSkeletonLoader = genericComponent()({
27911
27990
  ariaLabel: t(props.loadingText),
27912
27991
  role: 'alert'
27913
27992
  };
27914
- return createElementVNode(Fragment, null, [isLoading ? createElementVNode("div", mergeProps({
27993
+ return isLoading ? createElementVNode("div", mergeProps({
27915
27994
  "class": ['v-skeleton-loader', {
27916
27995
  'v-skeleton-loader--boilerplate': props.boilerplate
27917
27996
  }, themeClasses.value, backgroundColorClasses.value, elevationClasses.value],
27918
27997
  "style": [backgroundColorStyles.value, dimensionStyles.value]
27919
- }, loadingProps, attrs), [items.value]) : slots.default?.()]);
27998
+ }, loadingProps, attrs), [items.value]) : createElementVNode(Fragment, null, [slots.default?.()]);
27920
27999
  });
27921
28000
  return {};
27922
28001
  }
@@ -29781,6 +29860,10 @@ const VTextarea = genericComponent()({
29781
29860
  const vFieldRef = ref();
29782
29861
  const controlHeight = shallowRef('');
29783
29862
  const textareaRef = ref();
29863
+ const scrollbarWidth = ref(0);
29864
+ const {
29865
+ platform
29866
+ } = useDisplay();
29784
29867
  const autocomplete = useAutocomplete(props);
29785
29868
  const isActive = computed(() => props.persistentPlaceholder || isFocused.value || props.active);
29786
29869
  function onFocus() {
@@ -29825,6 +29908,18 @@ const VTextarea = genericComponent()({
29825
29908
  if (!props.autoGrow) rows.value = Number(props.rows);
29826
29909
  });
29827
29910
  function calculateInputHeight() {
29911
+ nextTick(() => {
29912
+ if (!textareaRef.value) return;
29913
+ if (platform.value.firefox) {
29914
+ scrollbarWidth.value = 12;
29915
+ return;
29916
+ }
29917
+ const {
29918
+ offsetWidth,
29919
+ clientWidth
29920
+ } = textareaRef.value;
29921
+ scrollbarWidth.value = Math.max(0, offsetWidth - clientWidth);
29922
+ });
29828
29923
  if (!props.autoGrow) return;
29829
29924
  nextTick(() => {
29830
29925
  if (!sizerRef.value || !vFieldRef.value) return;
@@ -29885,7 +29980,9 @@ const VTextarea = genericComponent()({
29885
29980
  'v-textarea--no-resize': props.noResize || props.autoGrow,
29886
29981
  'v-input--plain-underlined': isPlainOrUnderlined.value
29887
29982
  }, props.class],
29888
- "style": props.style
29983
+ "style": [{
29984
+ '--v-textarea-scroll-bar-width': convertToUnit(scrollbarWidth.value)
29985
+ }, props.style]
29889
29986
  }, rootAttrs, inputProps, {
29890
29987
  "centerAffix": rows.value === 1 && !isPlainOrUnderlined.value,
29891
29988
  "focused": isFocused.value
@@ -34313,7 +34410,7 @@ const makeVColorInputProps = propsFactory({
34313
34410
  ...makeFocusProps(),
34314
34411
  ...makeVConfirmEditProps(),
34315
34412
  ...makeVTextFieldProps(),
34316
- ...omit(makeVColorPickerProps(), ['width'])
34413
+ ...omit(makeVColorPickerProps(), ['location', 'height', 'minHeight', 'maxHeight'])
34317
34414
  }, 'VColorInput');
34318
34415
  const VColorInput = genericComponent()({
34319
34416
  name: 'VColorInput',
@@ -34352,7 +34449,7 @@ const VColorInput = genericComponent()({
34352
34449
  }
34353
34450
  useRender(() => {
34354
34451
  const confirmEditProps = VConfirmEdit.filterProps(props);
34355
- const colorPickerProps = VColorPicker.filterProps(omit(props, ['active', 'color']));
34452
+ const colorPickerProps = VColorPicker.filterProps(omit(props, ['active', 'bgColor', 'color', 'rounded', 'maxWidth', 'minWidth', 'width']));
34356
34453
  const textFieldProps = VTextField.filterProps(props);
34357
34454
  const slotWithPip = props.hidePip ? undefined : {
34358
34455
  [props.pipLocation]: arg => createElementVNode(Fragment, null, [createVNode(VAvatar, {
@@ -34570,7 +34667,7 @@ const makeVDateInputProps = propsFactory({
34570
34667
  ...omit(makeVDatePickerProps({
34571
34668
  hideHeader: true,
34572
34669
  showAdjacentMonths: true
34573
- }), ['active', 'location', 'rounded'])
34670
+ }), ['active', 'location', 'rounded', 'height', 'minHeight', 'maxHeight'])
34574
34671
  }, 'VDateInput');
34575
34672
  const VDateInput = genericComponent()({
34576
34673
  name: 'VDateInput',
@@ -34601,6 +34698,15 @@ const VDateInput = genericComponent()({
34601
34698
  const {
34602
34699
  mobile
34603
34700
  } = useDisplay(props);
34701
+ const clamp = date => {
34702
+ if (props.max && adapter.isAfter(date, props.max)) {
34703
+ return props.max;
34704
+ }
34705
+ if (props.min && adapter.isBefore(date, props.min)) {
34706
+ return props.min;
34707
+ }
34708
+ return date;
34709
+ };
34604
34710
  const emptyModelValue = () => props.multiple ? [] : null;
34605
34711
  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
34712
  const menu = useProxiedModel(props, 'menu');
@@ -34651,7 +34757,7 @@ const VDateInput = genericComponent()({
34651
34757
  if (!menu.value || !isFocused.value) {
34652
34758
  menu.value = true;
34653
34759
  }
34654
- if (props.updateOn.includes('enter')) {
34760
+ if (props.updateOn.includes('enter') && !props.readonly) {
34655
34761
  onUserInput(e.target);
34656
34762
  }
34657
34763
  }
@@ -34678,7 +34784,7 @@ const VDateInput = genericComponent()({
34678
34784
  model.value = emptyModelValue();
34679
34785
  }
34680
34786
  function onBlur(e) {
34681
- if (props.updateOn.includes('blur')) {
34787
+ if (props.updateOn.includes('blur') && !props.readonly) {
34682
34788
  onUserInput(e.target);
34683
34789
  }
34684
34790
 
@@ -34696,23 +34802,23 @@ const VDateInput = genericComponent()({
34696
34802
  model.value = emptyModelValue();
34697
34803
  } else if (!props.multiple) {
34698
34804
  if (isValid(value)) {
34699
- model.value = parseDate(value);
34805
+ model.value = clamp(parseDate(value));
34700
34806
  }
34701
34807
  } else {
34702
34808
  const parts = value.trim().split(/\D+-\D+|[^\d\-/.]+/);
34703
34809
  if (parts.every(isValid)) {
34704
34810
  if (props.multiple === 'range') {
34705
- const [start, stop] = parts.map(parseDate).toSorted((a, b) => adapter.isAfter(a, b) ? 1 : -1);
34811
+ const [start, stop] = parts.map(parseDate).map(clamp).toSorted((a, b) => adapter.isAfter(a, b) ? 1 : -1);
34706
34812
  model.value = createDateRange(adapter, start, stop);
34707
34813
  } else {
34708
- model.value = parts.map(parseDate);
34814
+ model.value = parts.map(parseDate).map(clamp);
34709
34815
  }
34710
34816
  }
34711
34817
  }
34712
34818
  }
34713
34819
  useRender(() => {
34714
34820
  const confirmEditProps = VConfirmEdit.filterProps(props);
34715
- const datePickerProps = VDatePicker.filterProps(omit(props, ['active', 'location', 'rounded']));
34821
+ const datePickerProps = VDatePicker.filterProps(omit(props, ['active', 'bgColor', 'color', 'location', 'rounded', 'maxWidth', 'minWidth', 'width']));
34716
34822
  const datePickerSlots = pick(slots, ['title', 'header', 'day', 'month', 'year']);
34717
34823
  const textFieldProps = VTextField.filterProps(omit(props, ['placeholder']));
34718
34824
  return createVNode(VTextField, mergeProps({
@@ -35157,7 +35263,7 @@ const VMaskInput = genericComponent()({
35157
35263
  // Always display masked value in input when mask is applied
35158
35264
  val => props.mask ? mask.mask(mask.unmask(val)) : val, val => {
35159
35265
  if (props.mask) {
35160
- const valueWithoutDelimiters = removeMaskDelimiters(val);
35266
+ const valueWithoutDelimiters = val ? removeMaskDelimiters(val) : '';
35161
35267
 
35162
35268
  // E.g. mask is #-# and the input value is '2-23'
35163
35269
  // model-value should be enforced to '2-2'
@@ -37903,7 +38009,7 @@ function createVuetify$1() {
37903
38009
  };
37904
38010
  });
37905
38011
  }
37906
- const version$1 = "3.10.5";
38012
+ const version$1 = "3.10.6";
37907
38013
  createVuetify$1.version = version$1;
37908
38014
 
37909
38015
  // Vue's inject() can only be used in setup
@@ -38201,7 +38307,7 @@ var index = /*#__PURE__*/Object.freeze({
38201
38307
 
38202
38308
  /* eslint-disable local-rules/sort-imports */
38203
38309
 
38204
- const version = "3.10.5";
38310
+ const version = "3.10.6";
38205
38311
 
38206
38312
  /* eslint-disable local-rules/sort-imports */
38207
38313