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
  */
@@ -397,8 +397,10 @@ function callEvent(handler) {
397
397
  }
398
398
  function focusableChildren(el) {
399
399
  let filterByTabIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
400
- const targets = ['button', '[href]', 'input:not([type="hidden"])', 'select', 'textarea', '[tabindex]'].map(s => `${s}${filterByTabIndex ? ':not([tabindex="-1"])' : ''}:not([disabled])`).join(', ');
401
- return [...el.querySelectorAll(targets)];
400
+ 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(', ');
401
+ return [...el.querySelectorAll(targets)].filter(x => !x.closest('[inert]')) // does not have inert parent
402
+ .filter(x => !!x.offsetParent || x.getClientRects().length > 0) // is rendered
403
+ .filter(x => !x.parentElement?.closest('details:not([open])') || x.tagName === 'SUMMARY' && x.parentElement?.tagName === 'DETAILS');
402
404
  }
403
405
  function getNextElement(elements, location, condition) {
404
406
  let _el;
@@ -5019,7 +5021,7 @@ function useGroupItem(props, injectKey) {
5019
5021
  function unregister() {
5020
5022
  group?.unregister(id);
5021
5023
  }
5022
- onMounted(() => register());
5024
+ register();
5023
5025
  onBeforeUnmount(() => unregister());
5024
5026
  const isSelected = computed(() => {
5025
5027
  return group.isSelected(id);
@@ -8339,6 +8341,10 @@ function getOffsetPosition(isHorizontal, element) {
8339
8341
  const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group');
8340
8342
  const makeVSlideGroupProps = propsFactory({
8341
8343
  centerActive: Boolean,
8344
+ scrollToActive: {
8345
+ type: Boolean,
8346
+ default: true
8347
+ },
8342
8348
  contentClass: null,
8343
8349
  direction: {
8344
8350
  type: String,
@@ -8427,7 +8433,7 @@ const VSlideGroup = genericComponent()({
8427
8433
  contentSize.value = contentRect.value[sizeProperty];
8428
8434
  isOverflowing.value = containerSize.value + 1 < contentSize.value;
8429
8435
  }
8430
- if (firstSelectedIndex.value >= 0 && contentRef.el) {
8436
+ if (props.scrollToActive && firstSelectedIndex.value >= 0 && contentRef.el) {
8431
8437
  // TODO: Is this too naive? Should we store element references in group composable?
8432
8438
  const selectedElement = contentRef.el.children[lastSelectedIndex.value];
8433
8439
  scrollToChildren(selectedElement, props.centerActive);
@@ -8696,7 +8702,9 @@ const makeVChipGroupProps = propsFactory({
8696
8702
  type: Function,
8697
8703
  default: deepEqual
8698
8704
  },
8699
- ...makeVSlideGroupProps(),
8705
+ ...makeVSlideGroupProps({
8706
+ scrollToActive: false
8707
+ }),
8700
8708
  ...makeComponentProps(),
8701
8709
  ...makeGroupProps({
8702
8710
  selectedClass: 'v-chip--selected'
@@ -9795,7 +9803,9 @@ const useNestedItem = (id, isDisabled, isGroup) => {
9795
9803
  };
9796
9804
  onBeforeMount(() => {
9797
9805
  if (!parent.isGroupActivator) {
9798
- parent.root.register(computedId.value, parent.id.value, toValue(isDisabled), isGroup);
9806
+ nextTick(() => {
9807
+ parent.root.register(computedId.value, parent.id.value, toValue(isDisabled), isGroup);
9808
+ });
9799
9809
  }
9800
9810
  });
9801
9811
  onBeforeUnmount(() => {
@@ -9803,6 +9813,14 @@ const useNestedItem = (id, isDisabled, isGroup) => {
9803
9813
  parent.root.unregister(computedId.value);
9804
9814
  }
9805
9815
  });
9816
+ watch(computedId, (val, oldVal) => {
9817
+ if (!parent.isGroupActivator) {
9818
+ parent.root.unregister(oldVal);
9819
+ nextTick(() => {
9820
+ parent.root.register(val, parent.id.value, toValue(isDisabled), isGroup);
9821
+ });
9822
+ }
9823
+ });
9806
9824
  isGroup && provide(VNestedSymbol, item);
9807
9825
  return item;
9808
9826
  };
@@ -10053,7 +10071,9 @@ const VListItem = genericComponent()({
10053
10071
  handleActiveLink();
10054
10072
  });
10055
10073
  onBeforeMount(() => {
10056
- if (link.isActive?.value) handleActiveLink();
10074
+ if (link.isActive?.value) {
10075
+ nextTick(() => handleActiveLink());
10076
+ }
10057
10077
  });
10058
10078
  function handleActiveLink() {
10059
10079
  if (parent.value != null) {
@@ -12301,25 +12321,41 @@ const VMenu = genericComponent()({
12301
12321
  document.removeEventListener('focusin', onFocusIn);
12302
12322
  });
12303
12323
  onDeactivated(() => isActive.value = false);
12324
+ let focusTrapSuppressed = false;
12325
+ let focusTrapSuppressionTimeout = -1;
12326
+ async function onPointerdown() {
12327
+ focusTrapSuppressed = true;
12328
+ focusTrapSuppressionTimeout = window.setTimeout(() => {
12329
+ focusTrapSuppressed = false;
12330
+ }, 100);
12331
+ }
12304
12332
  async function onFocusIn(e) {
12305
12333
  const before = e.relatedTarget;
12306
12334
  const after = e.target;
12307
12335
  await nextTick();
12308
12336
  if (isActive.value && before !== after && overlay.value?.contentEl &&
12309
- // We're the topmost menu
12310
- overlay.value?.globalTop &&
12337
+ // We're the menu without open submenus or overlays
12338
+ overlay.value?.localTop &&
12311
12339
  // It isn't the document or the menu body
12312
12340
  ![document, overlay.value.contentEl].includes(after) &&
12313
12341
  // It isn't inside the menu body
12314
12342
  !overlay.value.contentEl.contains(after)) {
12315
- const focusable = focusableChildren(overlay.value.contentEl);
12316
- focusable[0]?.focus();
12343
+ if (focusTrapSuppressed) {
12344
+ if (!props.openOnHover && !overlay.value.activatorEl?.contains(after)) {
12345
+ isActive.value = false;
12346
+ }
12347
+ } else {
12348
+ const focusable = focusableChildren(overlay.value.contentEl);
12349
+ focusable[0]?.focus();
12350
+ document.removeEventListener('pointerdown', onPointerdown);
12351
+ }
12317
12352
  }
12318
12353
  }
12319
12354
  watch(isActive, val => {
12320
12355
  if (val) {
12321
12356
  parent?.register();
12322
12357
  if (IN_BROWSER && !props.disableInitialFocus) {
12358
+ document.addEventListener('pointerdown', onPointerdown);
12323
12359
  document.addEventListener('focusin', onFocusIn, {
12324
12360
  once: true
12325
12361
  });
@@ -12327,6 +12363,8 @@ const VMenu = genericComponent()({
12327
12363
  } else {
12328
12364
  parent?.unregister();
12329
12365
  if (IN_BROWSER) {
12366
+ clearTimeout(focusTrapSuppressionTimeout);
12367
+ document.removeEventListener('pointerdown', onPointerdown);
12330
12368
  document.removeEventListener('focusin', onFocusIn);
12331
12369
  }
12332
12370
  }
@@ -12920,7 +12958,6 @@ const VTextField = genericComponent()({
12920
12958
  e.stopPropagation();
12921
12959
  onFocus();
12922
12960
  nextTick(() => {
12923
- model.value = null;
12924
12961
  reset();
12925
12962
  callEvent(props['onClick:clear'], e);
12926
12963
  });
@@ -12975,8 +13012,6 @@ const VTextField = genericComponent()({
12975
13012
  "onMousedown": onControlMousedown,
12976
13013
  "onClick": onControlClick,
12977
13014
  "onClick:clear": e => onClear(e, reset),
12978
- "onClick:prependInner": props['onClick:prependInner'],
12979
- "onClick:appendInner": props['onClick:appendInner'],
12980
13015
  "role": props.role
12981
13016
  }, omit(fieldProps, ['onClick:clear']), {
12982
13017
  "id": id.value,
@@ -12993,10 +13028,11 @@ const VTextField = genericComponent()({
12993
13028
  props: {
12994
13029
  class: fieldClass,
12995
13030
  ...slotProps
12996
- }
13031
+ },
13032
+ controlRef
12997
13033
  } = _ref3;
12998
13034
  const inputNode = withDirectives(createElementVNode("input", mergeProps({
12999
- "ref": inputRef,
13035
+ "ref": val => inputRef.value = controlRef.value = val,
13000
13036
  "value": model.value,
13001
13037
  "onInput": onInput,
13002
13038
  "autofocus": props.autofocus,
@@ -13152,7 +13188,7 @@ function useVirtual(props, items) {
13152
13188
  const start = performance.now();
13153
13189
  offsets[0] = 0;
13154
13190
  const length = items.value.length;
13155
- for (let i = 1; i <= length - 1; i++) {
13191
+ for (let i = 1; i <= length; i++) {
13156
13192
  offsets[i] = (offsets[i - 1] || 0) + getSize(i - 1);
13157
13193
  }
13158
13194
  updateTime.value = Math.max(updateTime.value, performance.now() - start);
@@ -13187,7 +13223,7 @@ function useVirtual(props, items) {
13187
13223
  }
13188
13224
  }
13189
13225
  function calculateOffset(index) {
13190
- index = clamp(index, 0, items.value.length - 1);
13226
+ index = clamp(index, 0, items.value.length);
13191
13227
  const whole = Math.floor(index);
13192
13228
  const fraction = index % 1;
13193
13229
  const next = whole + 1;
@@ -13920,7 +13956,8 @@ const VSelect = genericComponent()({
13920
13956
  "key": item.value,
13921
13957
  "modelValue": isSelected,
13922
13958
  "ripple": false,
13923
- "tabindex": "-1"
13959
+ "tabindex": "-1",
13960
+ "onClick": event => event.preventDefault()
13924
13961
  }, null) : undefined, camelizedProps.prependAvatar && createVNode(VAvatar, {
13925
13962
  "image": camelizedProps.prependAvatar
13926
13963
  }, null), camelizedProps.prependIcon && createVNode(VIcon, {
@@ -14192,10 +14229,7 @@ const makeVAutocompleteProps = propsFactory({
14192
14229
  ...omit(makeVTextFieldProps({
14193
14230
  modelValue: null,
14194
14231
  role: 'combobox'
14195
- }), ['validationValue', 'dirty', 'appendInnerIcon']),
14196
- ...makeTransitionProps({
14197
- transition: false
14198
- })
14232
+ }), ['validationValue', 'dirty', 'appendInnerIcon'])
14199
14233
  }, 'VAutocomplete');
14200
14234
  const VAutocomplete = genericComponent()({
14201
14235
  name: 'VAutocomplete',
@@ -14220,6 +14254,7 @@ const VAutocomplete = genericComponent()({
14220
14254
  const vMenuRef = ref();
14221
14255
  const vVirtualScrollRef = ref();
14222
14256
  const selectionIndex = shallowRef(-1);
14257
+ const _searchLock = shallowRef(null);
14223
14258
  const {
14224
14259
  items,
14225
14260
  transformIn,
@@ -14241,9 +14276,9 @@ const VAutocomplete = genericComponent()({
14241
14276
  const {
14242
14277
  filteredItems,
14243
14278
  getMatches
14244
- } = useFilter(props, items, () => isPristine.value ? '' : search.value);
14279
+ } = useFilter(props, items, () => _searchLock.value ?? (isPristine.value ? '' : search.value));
14245
14280
  const displayItems = computed(() => {
14246
- if (props.hideSelected) {
14281
+ if (props.hideSelected && _searchLock.value === null) {
14247
14282
  return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
14248
14283
  }
14249
14284
  return filteredItems.value;
@@ -14374,6 +14409,7 @@ const VAutocomplete = genericComponent()({
14374
14409
  isPristine.value = true;
14375
14410
  vTextFieldRef.value?.focus();
14376
14411
  }
14412
+ _searchLock.value = null;
14377
14413
  }
14378
14414
  function onFocusin(e) {
14379
14415
  isFocused.value = true;
@@ -14409,6 +14445,7 @@ const VAutocomplete = genericComponent()({
14409
14445
  } else {
14410
14446
  const add = set !== false;
14411
14447
  model.value = add ? [item] : [];
14448
+ _searchLock.value = isPristine.value ? '' : search.value ?? '';
14412
14449
  search.value = add && !hasSelectionSlot.value ? item.title : '';
14413
14450
 
14414
14451
  // watch for search watcher to trigger
@@ -14428,6 +14465,9 @@ const VAutocomplete = genericComponent()({
14428
14465
  } else {
14429
14466
  if (!props.multiple && search.value == null) model.value = [];
14430
14467
  menu.value = false;
14468
+ if (!isPristine.value && search.value) {
14469
+ _searchLock.value = search.value;
14470
+ }
14431
14471
  search.value = '';
14432
14472
  selectionIndex.value = -1;
14433
14473
  }
@@ -14437,13 +14477,14 @@ const VAutocomplete = genericComponent()({
14437
14477
  if (val) menu.value = true;
14438
14478
  isPristine.value = !val;
14439
14479
  });
14440
- watch(menu, () => {
14441
- if (!props.hideSelected && menu.value && model.value.length) {
14480
+ watch(menu, val => {
14481
+ if (!props.hideSelected && val && model.value.length && isPristine.value) {
14442
14482
  const index = displayItems.value.findIndex(item => model.value.some(s => item.value === s.value));
14443
14483
  IN_BROWSER && window.requestAnimationFrame(() => {
14444
14484
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
14445
14485
  });
14446
14486
  }
14487
+ if (val) _searchLock.value = null;
14447
14488
  });
14448
14489
  watch(items, (newVal, oldVal) => {
14449
14490
  if (menu.value) return;
@@ -14494,7 +14535,6 @@ const VAutocomplete = genericComponent()({
14494
14535
  "maxHeight": 310,
14495
14536
  "openOnClick": false,
14496
14537
  "closeOnContentClick": false,
14497
- "transition": props.transition,
14498
14538
  "onAfterEnter": onAfterEnter,
14499
14539
  "onAfterLeave": onAfterLeave
14500
14540
  }, props.menuProps), {
@@ -14564,7 +14604,8 @@ const VAutocomplete = genericComponent()({
14564
14604
  "key": item.value,
14565
14605
  "modelValue": isSelected,
14566
14606
  "ripple": false,
14567
- "tabindex": "-1"
14607
+ "tabindex": "-1",
14608
+ "onClick": event => event.preventDefault()
14568
14609
  }, null) : undefined, item.props.prependAvatar && createVNode(VAvatar, {
14569
14610
  "image": item.props.prependAvatar
14570
14611
  }, null), item.props.prependIcon && createVNode(VIcon, {
@@ -15922,7 +15963,19 @@ const VWindow = genericComponent()({
15922
15963
  const activeIndex = computed(() => {
15923
15964
  return group.items.value.findIndex(item => group.selected.value.includes(item.id));
15924
15965
  });
15966
+
15967
+ // Fix for https://github.com/vuetifyjs/vuetify/issues/18447
15925
15968
  watch(activeIndex, (newVal, oldVal) => {
15969
+ let scrollableParent;
15970
+ const savedScrollPosition = {
15971
+ left: 0,
15972
+ top: 0
15973
+ };
15974
+ if (IN_BROWSER && oldVal >= 0) {
15975
+ scrollableParent = getScrollParent(rootRef.value);
15976
+ savedScrollPosition.left = scrollableParent?.scrollLeft;
15977
+ savedScrollPosition.top = scrollableParent?.scrollTop;
15978
+ }
15926
15979
  const itemsLength = group.items.value.length;
15927
15980
  const lastIndex = itemsLength - 1;
15928
15981
  if (itemsLength <= 2) {
@@ -15934,7 +15987,30 @@ const VWindow = genericComponent()({
15934
15987
  } else {
15935
15988
  isReversed.value = newVal < oldVal;
15936
15989
  }
15937
- });
15990
+ nextTick(() => {
15991
+ if (!IN_BROWSER || !scrollableParent) return;
15992
+ const currentScrollY = scrollableParent.scrollTop;
15993
+ if (currentScrollY !== savedScrollPosition.top) {
15994
+ scrollableParent.scrollTo({
15995
+ ...savedScrollPosition,
15996
+ behavior: 'instant'
15997
+ });
15998
+ }
15999
+ requestAnimationFrame(() => {
16000
+ if (!scrollableParent) return;
16001
+ const rafScrollY = scrollableParent.scrollTop;
16002
+ if (rafScrollY !== savedScrollPosition.top) {
16003
+ scrollableParent.scrollTo({
16004
+ ...savedScrollPosition,
16005
+ behavior: 'instant'
16006
+ });
16007
+ }
16008
+ });
16009
+ });
16010
+ }, {
16011
+ flush: 'sync'
16012
+ }); // Run synchronously before DOM updates
16013
+
15938
16014
  provide(VWindowSymbol, {
15939
16015
  transition,
15940
16016
  isReversed,
@@ -18839,7 +18915,7 @@ function createDate(options, locale) {
18839
18915
  };
18840
18916
  }
18841
18917
  function createDateRange(adapter, start, stop) {
18842
- const diff = adapter.getDiff(adapter.endOfDay(stop ?? start), adapter.startOfDay(start), 'days');
18918
+ const diff = adapter.getDiff(new Date(`${adapter.toISO(stop ?? start)}T00:00:00Z`), new Date(`${adapter.toISO(start)}T00:00:00Z`), 'days');
18843
18919
  const datesInRange = [start];
18844
18920
  for (let i = 1; i < diff; i++) {
18845
18921
  const nextDate = adapter.addDays(start, i);
@@ -19513,10 +19589,7 @@ const makeVComboboxProps = propsFactory({
19513
19589
  ...omit(makeVTextFieldProps({
19514
19590
  modelValue: null,
19515
19591
  role: 'combobox'
19516
- }), ['validationValue', 'dirty', 'appendInnerIcon']),
19517
- ...makeTransitionProps({
19518
- transition: false
19519
- })
19592
+ }), ['validationValue', 'dirty', 'appendInnerIcon'])
19520
19593
  }, 'VCombobox');
19521
19594
  const VCombobox = genericComponent()({
19522
19595
  name: 'VCombobox',
@@ -19560,13 +19633,16 @@ const VCombobox = genericComponent()({
19560
19633
  const hasChips = computed(() => !!(props.chips || slots.chip));
19561
19634
  const hasSelectionSlot = computed(() => hasChips.value || !!slots.selection);
19562
19635
  const _search = shallowRef(!props.multiple && !hasSelectionSlot.value ? model.value[0]?.title ?? '' : '');
19636
+ const _searchLock = shallowRef(null);
19563
19637
  const search = computed({
19564
19638
  get: () => {
19565
19639
  return _search.value;
19566
19640
  },
19567
19641
  set: async val => {
19568
19642
  _search.value = val ?? '';
19569
- if (!props.multiple && !hasSelectionSlot.value) {
19643
+ if (val === null || val === '' && !props.multiple && !hasSelectionSlot.value) {
19644
+ model.value = [];
19645
+ } else if (!props.multiple && !hasSelectionSlot.value) {
19570
19646
  model.value = [transformItem$3(props, val)];
19571
19647
  nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
19572
19648
  }
@@ -19594,9 +19670,9 @@ const VCombobox = genericComponent()({
19594
19670
  const {
19595
19671
  filteredItems,
19596
19672
  getMatches
19597
- } = useFilter(props, items, () => props.alwaysFilter || !isPristine.value ? search.value : '');
19673
+ } = useFilter(props, items, () => _searchLock.value ?? (props.alwaysFilter || !isPristine.value ? search.value : ''));
19598
19674
  const displayItems = computed(() => {
19599
- if (props.hideSelected) {
19675
+ if (props.hideSelected && _searchLock.value === null) {
19600
19676
  return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
19601
19677
  }
19602
19678
  return filteredItems.value;
@@ -19677,22 +19753,19 @@ const VCombobox = genericComponent()({
19677
19753
  if (['Escape'].includes(e.key)) {
19678
19754
  menu.value = false;
19679
19755
  }
19680
- if (['Enter', 'Escape', 'Tab'].includes(e.key)) {
19681
- if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key) && !model.value.some(_ref2 => {
19682
- let {
19683
- value
19684
- } = _ref2;
19685
- return value === displayItems.value[0].value;
19686
- })) {
19687
- select(filteredItems.value[0]);
19688
- }
19689
- isPristine.value = true;
19756
+ if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key) && !model.value.some(_ref2 => {
19757
+ let {
19758
+ value
19759
+ } = _ref2;
19760
+ return value === displayItems.value[0].value;
19761
+ })) {
19762
+ select(filteredItems.value[0]);
19690
19763
  }
19691
19764
  if (e.key === 'ArrowDown' && highlightFirst.value) {
19692
19765
  listRef.value?.focus('next');
19693
19766
  }
19694
19767
  if (e.key === 'Enter' && search.value) {
19695
- select(transformItem$3(props, search.value));
19768
+ select(transformItem$3(props, search.value), true, true);
19696
19769
  if (hasSelectionSlot.value) _search.value = '';
19697
19770
  }
19698
19771
  if (['Backspace', 'Delete'].includes(e.key)) {
@@ -19737,13 +19810,15 @@ const VCombobox = genericComponent()({
19737
19810
  }
19738
19811
  function onAfterLeave() {
19739
19812
  if (isFocused.value) {
19740
- isPristine.value = true;
19741
19813
  vTextFieldRef.value?.focus();
19742
19814
  }
19815
+ isPristine.value = true;
19816
+ _searchLock.value = null;
19743
19817
  }
19744
19818
  /** @param set - null means toggle */
19745
19819
  function select(item) {
19746
19820
  let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
19821
+ let keepMenu = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
19747
19822
  if (!item || item.props.disabled) return;
19748
19823
  if (props.multiple) {
19749
19824
  const index = model.value.findIndex(selection => (props.valueComparator || deepEqual)(selection.value, item.value));
@@ -19761,11 +19836,14 @@ const VCombobox = genericComponent()({
19761
19836
  } else {
19762
19837
  const add = set !== false;
19763
19838
  model.value = add ? [item] : [];
19839
+ if ((!isPristine.value || props.alwaysFilter) && _search.value) {
19840
+ _searchLock.value = _search.value;
19841
+ }
19764
19842
  _search.value = add && !hasSelectionSlot.value ? item.title : '';
19765
19843
 
19766
19844
  // watch for search watcher to trigger
19767
19845
  nextTick(() => {
19768
- menu.value = false;
19846
+ menu.value = keepMenu;
19769
19847
  isPristine.value = true;
19770
19848
  });
19771
19849
  }
@@ -19779,9 +19857,6 @@ const VCombobox = genericComponent()({
19779
19857
  function onFocusout(e) {
19780
19858
  listHasFocus.value = false;
19781
19859
  }
19782
- function onUpdateModelValue(v) {
19783
- if (v == null || v === '' && !props.multiple && !hasSelectionSlot.value) model.value = [];
19784
- }
19785
19860
  watch(isFocused, (val, oldVal) => {
19786
19861
  if (val || val === oldVal) return;
19787
19862
  selectionIndex.value = -1;
@@ -19804,13 +19879,14 @@ const VCombobox = genericComponent()({
19804
19879
  }
19805
19880
  }
19806
19881
  });
19807
- watch(menu, () => {
19808
- if (!props.hideSelected && menu.value && model.value.length) {
19882
+ watch(menu, val => {
19883
+ if (!props.hideSelected && val && model.value.length && isPristine.value) {
19809
19884
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
19810
19885
  IN_BROWSER && window.requestAnimationFrame(() => {
19811
19886
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
19812
19887
  });
19813
19888
  }
19889
+ if (val) _searchLock.value = null;
19814
19890
  });
19815
19891
  watch(items, (newVal, oldVal) => {
19816
19892
  if (menu.value) return;
@@ -19826,7 +19902,7 @@ const VCombobox = genericComponent()({
19826
19902
  "ref": vTextFieldRef
19827
19903
  }, textFieldProps, {
19828
19904
  "modelValue": search.value,
19829
- "onUpdate:modelValue": [$event => search.value = $event, onUpdateModelValue],
19905
+ "onUpdate:modelValue": $event => search.value = $event,
19830
19906
  "focused": isFocused.value,
19831
19907
  "onUpdate:focused": $event => isFocused.value = $event,
19832
19908
  "validationValue": model.externalValue,
@@ -19861,7 +19937,6 @@ const VCombobox = genericComponent()({
19861
19937
  "maxHeight": 310,
19862
19938
  "openOnClick": false,
19863
19939
  "closeOnContentClick": false,
19864
- "transition": props.transition,
19865
19940
  "onAfterEnter": onAfterEnter,
19866
19941
  "onAfterLeave": onAfterLeave
19867
19942
  }, props.menuProps), {
@@ -19931,7 +20006,8 @@ const VCombobox = genericComponent()({
19931
20006
  "key": item.value,
19932
20007
  "modelValue": isSelected,
19933
20008
  "ripple": false,
19934
- "tabindex": "-1"
20009
+ "tabindex": "-1",
20010
+ "onClick": event => event.preventDefault()
19935
20011
  }, null) : undefined, item.props.prependAvatar && createVNode(VAvatar, {
19936
20012
  "image": item.props.prependAvatar
19937
20013
  }, null), item.props.prependIcon && createVNode(VIcon, {
@@ -24341,7 +24417,7 @@ const VDatePicker = genericComponent()({
24341
24417
  function isAllowedInRange(start, end) {
24342
24418
  const allowedDates = props.allowedDates;
24343
24419
  if (typeof allowedDates !== 'function') return true;
24344
- const days = adapter.getDiff(end, start, 'days');
24420
+ const days = 1 + adapter.getDiff(new Date(`${adapter.toISO(end)}T00:00:00Z`), new Date(`${adapter.toISO(start)}T00:00:00Z`), 'days');
24345
24421
  for (let i = 0; i < days; i++) {
24346
24422
  if (allowedDates(adapter.addDays(start, i))) return true;
24347
24423
  }
@@ -25364,10 +25440,11 @@ const VFileInput = genericComponent()({
25364
25440
  props: {
25365
25441
  class: fieldClass,
25366
25442
  ...slotProps
25367
- }
25443
+ },
25444
+ controlRef
25368
25445
  } = _ref4;
25369
25446
  return createElementVNode(Fragment, null, [createElementVNode("input", mergeProps({
25370
- "ref": inputRef,
25447
+ "ref": val => inputRef.value = controlRef.value = val,
25371
25448
  "type": "file",
25372
25449
  "accept": inputAccept,
25373
25450
  "readonly": isReadonly.value,
@@ -26844,7 +26921,7 @@ const VNumberInput = genericComponent()({
26844
26921
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
26845
26922
  const _inputText = shallowRef(null);
26846
26923
  watchEffect(() => {
26847
- if (isFocused.value && !controlsDisabled.value && Number(_inputText.value) === model.value) ; else if (model.value == null) {
26924
+ if (isFocused.value && !controlsDisabled.value && Number(_inputText.value?.replace(decimalSeparator.value, '.')) === model.value) ; else if (model.value == null) {
26848
26925
  _inputText.value = null;
26849
26926
  } else if (!isNaN(model.value)) {
26850
26927
  _inputText.value = correctPrecision(model.value);
@@ -26939,6 +27016,7 @@ const VNumberInput = genericComponent()({
26939
27016
  if (!new RegExp(`^-?\\d*${escapeForRegex(decimalSeparator.value)}?\\d*$`).test(potentialNewInputVal)) {
26940
27017
  e.preventDefault();
26941
27018
  inputElement.value = potentialNewNumber;
27019
+ nextTick(() => inputText.value = potentialNewNumber);
26942
27020
  }
26943
27021
  if (props.precision == null) return;
26944
27022
 
@@ -26946,13 +27024,15 @@ const VNumberInput = genericComponent()({
26946
27024
  if (potentialNewInputVal.split(decimalSeparator.value)[1]?.length > props.precision) {
26947
27025
  e.preventDefault();
26948
27026
  inputElement.value = potentialNewNumber;
27027
+ nextTick(() => inputText.value = potentialNewNumber);
26949
27028
  const cursorPosition = (selectionStart ?? 0) + e.data.length;
26950
27029
  inputElement.setSelectionRange(cursorPosition, cursorPosition);
26951
27030
  }
26952
27031
  // Ignore decimal separator when precision = 0
26953
- if (props.precision === 0 && potentialNewInputVal.includes(decimalSeparator.value)) {
27032
+ if (props.precision === 0 && potentialNewInputVal.endsWith(decimalSeparator.value)) {
26954
27033
  e.preventDefault();
26955
27034
  inputElement.value = potentialNewNumber;
27035
+ nextTick(() => inputText.value = potentialNewNumber);
26956
27036
  }
26957
27037
  }
26958
27038
  async function onKeydown(e) {
@@ -28148,12 +28228,12 @@ const VSkeletonLoader = genericComponent()({
28148
28228
  ariaLabel: t(props.loadingText),
28149
28229
  role: 'alert'
28150
28230
  };
28151
- return createElementVNode(Fragment, null, [isLoading ? createElementVNode("div", mergeProps({
28231
+ return isLoading ? createElementVNode("div", mergeProps({
28152
28232
  "class": ['v-skeleton-loader', {
28153
28233
  'v-skeleton-loader--boilerplate': props.boilerplate
28154
28234
  }, themeClasses.value, backgroundColorClasses.value, elevationClasses.value],
28155
28235
  "style": [backgroundColorStyles.value, dimensionStyles.value]
28156
- }, loadingProps, attrs), [items.value]) : slots.default?.()]);
28236
+ }, loadingProps, attrs), [items.value]) : createElementVNode(Fragment, null, [slots.default?.()]);
28157
28237
  });
28158
28238
  return {};
28159
28239
  }
@@ -30018,6 +30098,10 @@ const VTextarea = genericComponent()({
30018
30098
  const vFieldRef = ref();
30019
30099
  const controlHeight = shallowRef('');
30020
30100
  const textareaRef = ref();
30101
+ const scrollbarWidth = ref(0);
30102
+ const {
30103
+ platform
30104
+ } = useDisplay();
30021
30105
  const autocomplete = useAutocomplete(props);
30022
30106
  const isActive = computed(() => props.persistentPlaceholder || isFocused.value || props.active);
30023
30107
  function onFocus() {
@@ -30062,6 +30146,18 @@ const VTextarea = genericComponent()({
30062
30146
  if (!props.autoGrow) rows.value = Number(props.rows);
30063
30147
  });
30064
30148
  function calculateInputHeight() {
30149
+ nextTick(() => {
30150
+ if (!textareaRef.value) return;
30151
+ if (platform.value.firefox) {
30152
+ scrollbarWidth.value = 12;
30153
+ return;
30154
+ }
30155
+ const {
30156
+ offsetWidth,
30157
+ clientWidth
30158
+ } = textareaRef.value;
30159
+ scrollbarWidth.value = Math.max(0, offsetWidth - clientWidth);
30160
+ });
30065
30161
  if (!props.autoGrow) return;
30066
30162
  nextTick(() => {
30067
30163
  if (!sizerRef.value || !vFieldRef.value) return;
@@ -30122,7 +30218,9 @@ const VTextarea = genericComponent()({
30122
30218
  'v-textarea--no-resize': props.noResize || props.autoGrow,
30123
30219
  'v-input--plain-underlined': isPlainOrUnderlined.value
30124
30220
  }, props.class],
30125
- "style": props.style
30221
+ "style": [{
30222
+ '--v-textarea-scroll-bar-width': convertToUnit(scrollbarWidth.value)
30223
+ }, props.style]
30126
30224
  }, rootAttrs, inputProps, {
30127
30225
  "centerAffix": rows.value === 1 && !isPlainOrUnderlined.value,
30128
30226
  "focused": isFocused.value
@@ -30162,12 +30260,13 @@ const VTextarea = genericComponent()({
30162
30260
  props: {
30163
30261
  class: fieldClass,
30164
30262
  ...slotProps
30165
- }
30263
+ },
30264
+ controlRef
30166
30265
  } = _ref3;
30167
30266
  return createElementVNode(Fragment, null, [props.prefix && createElementVNode("span", {
30168
30267
  "class": "v-text-field__prefix"
30169
30268
  }, [props.prefix]), withDirectives(createElementVNode("textarea", mergeProps({
30170
- "ref": textareaRef,
30269
+ "ref": val => textareaRef.value = controlRef.value = val,
30171
30270
  "class": fieldClass,
30172
30271
  "value": model.value,
30173
30272
  "onInput": onInput,
@@ -32277,7 +32376,7 @@ function createVuetify$1() {
32277
32376
  };
32278
32377
  });
32279
32378
  }
32280
- const version$1 = "3.10.5";
32379
+ const version$1 = "3.10.7";
32281
32380
  createVuetify$1.version = version$1;
32282
32381
 
32283
32382
  // Vue's inject() can only be used in setup
@@ -32302,7 +32401,7 @@ const createVuetify = function () {
32302
32401
  ...options
32303
32402
  });
32304
32403
  };
32305
- const version = "3.10.5";
32404
+ const version = "3.10.7";
32306
32405
  createVuetify.version = version;
32307
32406
 
32308
32407
  export { index as blueprints, components, createVuetify, directives, useDate, useDefaults, useDisplay, useGoTo, useHotkey, useLayout, useLocale, useMask, useRtl, useTheme, version };