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
package/dist/vuetify.cjs CHANGED
@@ -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
  */
@@ -401,8 +401,10 @@
401
401
  }
402
402
  function focusableChildren(el) {
403
403
  let filterByTabIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
404
- const targets = ['button', '[href]', 'input:not([type="hidden"])', 'select', 'textarea', '[tabindex]'].map(s => `${s}${filterByTabIndex ? ':not([tabindex="-1"])' : ''}:not([disabled])`).join(', ');
405
- return [...el.querySelectorAll(targets)];
404
+ 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(', ');
405
+ return [...el.querySelectorAll(targets)].filter(x => !x.closest('[inert]')) // does not have inert parent
406
+ .filter(x => !!x.offsetParent || x.getClientRects().length > 0) // is rendered
407
+ .filter(x => !x.parentElement?.closest('details:not([open])') || x.tagName === 'SUMMARY' && x.parentElement?.tagName === 'DETAILS');
406
408
  }
407
409
  function getNextElement(elements, location, condition) {
408
410
  let _el;
@@ -5023,7 +5025,7 @@
5023
5025
  function unregister() {
5024
5026
  group?.unregister(id);
5025
5027
  }
5026
- vue.onMounted(() => register());
5028
+ register();
5027
5029
  vue.onBeforeUnmount(() => unregister());
5028
5030
  const isSelected = vue.computed(() => {
5029
5031
  return group.isSelected(id);
@@ -8343,6 +8345,10 @@
8343
8345
  const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group');
8344
8346
  const makeVSlideGroupProps = propsFactory({
8345
8347
  centerActive: Boolean,
8348
+ scrollToActive: {
8349
+ type: Boolean,
8350
+ default: true
8351
+ },
8346
8352
  contentClass: null,
8347
8353
  direction: {
8348
8354
  type: String,
@@ -8431,7 +8437,7 @@
8431
8437
  contentSize.value = contentRect.value[sizeProperty];
8432
8438
  isOverflowing.value = containerSize.value + 1 < contentSize.value;
8433
8439
  }
8434
- if (firstSelectedIndex.value >= 0 && contentRef.el) {
8440
+ if (props.scrollToActive && firstSelectedIndex.value >= 0 && contentRef.el) {
8435
8441
  // TODO: Is this too naive? Should we store element references in group composable?
8436
8442
  const selectedElement = contentRef.el.children[lastSelectedIndex.value];
8437
8443
  scrollToChildren(selectedElement, props.centerActive);
@@ -8700,7 +8706,9 @@
8700
8706
  type: Function,
8701
8707
  default: deepEqual
8702
8708
  },
8703
- ...makeVSlideGroupProps(),
8709
+ ...makeVSlideGroupProps({
8710
+ scrollToActive: false
8711
+ }),
8704
8712
  ...makeComponentProps(),
8705
8713
  ...makeGroupProps({
8706
8714
  selectedClass: 'v-chip--selected'
@@ -9799,7 +9807,9 @@
9799
9807
  };
9800
9808
  vue.onBeforeMount(() => {
9801
9809
  if (!parent.isGroupActivator) {
9802
- parent.root.register(computedId.value, parent.id.value, vue.toValue(isDisabled), isGroup);
9810
+ vue.nextTick(() => {
9811
+ parent.root.register(computedId.value, parent.id.value, vue.toValue(isDisabled), isGroup);
9812
+ });
9803
9813
  }
9804
9814
  });
9805
9815
  vue.onBeforeUnmount(() => {
@@ -9807,6 +9817,14 @@
9807
9817
  parent.root.unregister(computedId.value);
9808
9818
  }
9809
9819
  });
9820
+ vue.watch(computedId, (val, oldVal) => {
9821
+ if (!parent.isGroupActivator) {
9822
+ parent.root.unregister(oldVal);
9823
+ vue.nextTick(() => {
9824
+ parent.root.register(val, parent.id.value, vue.toValue(isDisabled), isGroup);
9825
+ });
9826
+ }
9827
+ });
9810
9828
  isGroup && vue.provide(VNestedSymbol, item);
9811
9829
  return item;
9812
9830
  };
@@ -10057,7 +10075,9 @@
10057
10075
  handleActiveLink();
10058
10076
  });
10059
10077
  vue.onBeforeMount(() => {
10060
- if (link.isActive?.value) handleActiveLink();
10078
+ if (link.isActive?.value) {
10079
+ vue.nextTick(() => handleActiveLink());
10080
+ }
10061
10081
  });
10062
10082
  function handleActiveLink() {
10063
10083
  if (parent.value != null) {
@@ -12305,25 +12325,41 @@
12305
12325
  document.removeEventListener('focusin', onFocusIn);
12306
12326
  });
12307
12327
  vue.onDeactivated(() => isActive.value = false);
12328
+ let focusTrapSuppressed = false;
12329
+ let focusTrapSuppressionTimeout = -1;
12330
+ async function onPointerdown() {
12331
+ focusTrapSuppressed = true;
12332
+ focusTrapSuppressionTimeout = window.setTimeout(() => {
12333
+ focusTrapSuppressed = false;
12334
+ }, 100);
12335
+ }
12308
12336
  async function onFocusIn(e) {
12309
12337
  const before = e.relatedTarget;
12310
12338
  const after = e.target;
12311
12339
  await vue.nextTick();
12312
12340
  if (isActive.value && before !== after && overlay.value?.contentEl &&
12313
- // We're the topmost menu
12314
- overlay.value?.globalTop &&
12341
+ // We're the menu without open submenus or overlays
12342
+ overlay.value?.localTop &&
12315
12343
  // It isn't the document or the menu body
12316
12344
  ![document, overlay.value.contentEl].includes(after) &&
12317
12345
  // It isn't inside the menu body
12318
12346
  !overlay.value.contentEl.contains(after)) {
12319
- const focusable = focusableChildren(overlay.value.contentEl);
12320
- focusable[0]?.focus();
12347
+ if (focusTrapSuppressed) {
12348
+ if (!props.openOnHover && !overlay.value.activatorEl?.contains(after)) {
12349
+ isActive.value = false;
12350
+ }
12351
+ } else {
12352
+ const focusable = focusableChildren(overlay.value.contentEl);
12353
+ focusable[0]?.focus();
12354
+ document.removeEventListener('pointerdown', onPointerdown);
12355
+ }
12321
12356
  }
12322
12357
  }
12323
12358
  vue.watch(isActive, val => {
12324
12359
  if (val) {
12325
12360
  parent?.register();
12326
12361
  if (IN_BROWSER && !props.disableInitialFocus) {
12362
+ document.addEventListener('pointerdown', onPointerdown);
12327
12363
  document.addEventListener('focusin', onFocusIn, {
12328
12364
  once: true
12329
12365
  });
@@ -12331,6 +12367,8 @@
12331
12367
  } else {
12332
12368
  parent?.unregister();
12333
12369
  if (IN_BROWSER) {
12370
+ clearTimeout(focusTrapSuppressionTimeout);
12371
+ document.removeEventListener('pointerdown', onPointerdown);
12334
12372
  document.removeEventListener('focusin', onFocusIn);
12335
12373
  }
12336
12374
  }
@@ -12924,7 +12962,6 @@
12924
12962
  e.stopPropagation();
12925
12963
  onFocus();
12926
12964
  vue.nextTick(() => {
12927
- model.value = null;
12928
12965
  reset();
12929
12966
  callEvent(props['onClick:clear'], e);
12930
12967
  });
@@ -12979,8 +13016,6 @@
12979
13016
  "onMousedown": onControlMousedown,
12980
13017
  "onClick": onControlClick,
12981
13018
  "onClick:clear": e => onClear(e, reset),
12982
- "onClick:prependInner": props['onClick:prependInner'],
12983
- "onClick:appendInner": props['onClick:appendInner'],
12984
13019
  "role": props.role
12985
13020
  }, omit(fieldProps, ['onClick:clear']), {
12986
13021
  "id": id.value,
@@ -12997,10 +13032,11 @@
12997
13032
  props: {
12998
13033
  class: fieldClass,
12999
13034
  ...slotProps
13000
- }
13035
+ },
13036
+ controlRef
13001
13037
  } = _ref3;
13002
13038
  const inputNode = vue.withDirectives(vue.createElementVNode("input", vue.mergeProps({
13003
- "ref": inputRef,
13039
+ "ref": val => inputRef.value = controlRef.value = val,
13004
13040
  "value": model.value,
13005
13041
  "onInput": onInput,
13006
13042
  "autofocus": props.autofocus,
@@ -13156,7 +13192,7 @@
13156
13192
  const start = performance.now();
13157
13193
  offsets[0] = 0;
13158
13194
  const length = items.value.length;
13159
- for (let i = 1; i <= length - 1; i++) {
13195
+ for (let i = 1; i <= length; i++) {
13160
13196
  offsets[i] = (offsets[i - 1] || 0) + getSize(i - 1);
13161
13197
  }
13162
13198
  updateTime.value = Math.max(updateTime.value, performance.now() - start);
@@ -13191,7 +13227,7 @@
13191
13227
  }
13192
13228
  }
13193
13229
  function calculateOffset(index) {
13194
- index = clamp(index, 0, items.value.length - 1);
13230
+ index = clamp(index, 0, items.value.length);
13195
13231
  const whole = Math.floor(index);
13196
13232
  const fraction = index % 1;
13197
13233
  const next = whole + 1;
@@ -13924,7 +13960,8 @@
13924
13960
  "key": item.value,
13925
13961
  "modelValue": isSelected,
13926
13962
  "ripple": false,
13927
- "tabindex": "-1"
13963
+ "tabindex": "-1",
13964
+ "onClick": event => event.preventDefault()
13928
13965
  }, null) : undefined, camelizedProps.prependAvatar && vue.createVNode(VAvatar, {
13929
13966
  "image": camelizedProps.prependAvatar
13930
13967
  }, null), camelizedProps.prependIcon && vue.createVNode(VIcon, {
@@ -14196,10 +14233,7 @@
14196
14233
  ...omit(makeVTextFieldProps({
14197
14234
  modelValue: null,
14198
14235
  role: 'combobox'
14199
- }), ['validationValue', 'dirty', 'appendInnerIcon']),
14200
- ...makeTransitionProps({
14201
- transition: false
14202
- })
14236
+ }), ['validationValue', 'dirty', 'appendInnerIcon'])
14203
14237
  }, 'VAutocomplete');
14204
14238
  const VAutocomplete = genericComponent()({
14205
14239
  name: 'VAutocomplete',
@@ -14224,6 +14258,7 @@
14224
14258
  const vMenuRef = vue.ref();
14225
14259
  const vVirtualScrollRef = vue.ref();
14226
14260
  const selectionIndex = vue.shallowRef(-1);
14261
+ const _searchLock = vue.shallowRef(null);
14227
14262
  const {
14228
14263
  items,
14229
14264
  transformIn,
@@ -14245,9 +14280,9 @@
14245
14280
  const {
14246
14281
  filteredItems,
14247
14282
  getMatches
14248
- } = useFilter(props, items, () => isPristine.value ? '' : search.value);
14283
+ } = useFilter(props, items, () => _searchLock.value ?? (isPristine.value ? '' : search.value));
14249
14284
  const displayItems = vue.computed(() => {
14250
- if (props.hideSelected) {
14285
+ if (props.hideSelected && _searchLock.value === null) {
14251
14286
  return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
14252
14287
  }
14253
14288
  return filteredItems.value;
@@ -14378,6 +14413,7 @@
14378
14413
  isPristine.value = true;
14379
14414
  vTextFieldRef.value?.focus();
14380
14415
  }
14416
+ _searchLock.value = null;
14381
14417
  }
14382
14418
  function onFocusin(e) {
14383
14419
  isFocused.value = true;
@@ -14413,6 +14449,7 @@
14413
14449
  } else {
14414
14450
  const add = set !== false;
14415
14451
  model.value = add ? [item] : [];
14452
+ _searchLock.value = isPristine.value ? '' : search.value ?? '';
14416
14453
  search.value = add && !hasSelectionSlot.value ? item.title : '';
14417
14454
 
14418
14455
  // watch for search watcher to trigger
@@ -14432,6 +14469,9 @@
14432
14469
  } else {
14433
14470
  if (!props.multiple && search.value == null) model.value = [];
14434
14471
  menu.value = false;
14472
+ if (!isPristine.value && search.value) {
14473
+ _searchLock.value = search.value;
14474
+ }
14435
14475
  search.value = '';
14436
14476
  selectionIndex.value = -1;
14437
14477
  }
@@ -14441,13 +14481,14 @@
14441
14481
  if (val) menu.value = true;
14442
14482
  isPristine.value = !val;
14443
14483
  });
14444
- vue.watch(menu, () => {
14445
- if (!props.hideSelected && menu.value && model.value.length) {
14484
+ vue.watch(menu, val => {
14485
+ if (!props.hideSelected && val && model.value.length && isPristine.value) {
14446
14486
  const index = displayItems.value.findIndex(item => model.value.some(s => item.value === s.value));
14447
14487
  IN_BROWSER && window.requestAnimationFrame(() => {
14448
14488
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
14449
14489
  });
14450
14490
  }
14491
+ if (val) _searchLock.value = null;
14451
14492
  });
14452
14493
  vue.watch(items, (newVal, oldVal) => {
14453
14494
  if (menu.value) return;
@@ -14498,7 +14539,6 @@
14498
14539
  "maxHeight": 310,
14499
14540
  "openOnClick": false,
14500
14541
  "closeOnContentClick": false,
14501
- "transition": props.transition,
14502
14542
  "onAfterEnter": onAfterEnter,
14503
14543
  "onAfterLeave": onAfterLeave
14504
14544
  }, props.menuProps), {
@@ -14568,7 +14608,8 @@
14568
14608
  "key": item.value,
14569
14609
  "modelValue": isSelected,
14570
14610
  "ripple": false,
14571
- "tabindex": "-1"
14611
+ "tabindex": "-1",
14612
+ "onClick": event => event.preventDefault()
14572
14613
  }, null) : undefined, item.props.prependAvatar && vue.createVNode(VAvatar, {
14573
14614
  "image": item.props.prependAvatar
14574
14615
  }, null), item.props.prependIcon && vue.createVNode(VIcon, {
@@ -15926,7 +15967,19 @@
15926
15967
  const activeIndex = vue.computed(() => {
15927
15968
  return group.items.value.findIndex(item => group.selected.value.includes(item.id));
15928
15969
  });
15970
+
15971
+ // Fix for https://github.com/vuetifyjs/vuetify/issues/18447
15929
15972
  vue.watch(activeIndex, (newVal, oldVal) => {
15973
+ let scrollableParent;
15974
+ const savedScrollPosition = {
15975
+ left: 0,
15976
+ top: 0
15977
+ };
15978
+ if (IN_BROWSER && oldVal >= 0) {
15979
+ scrollableParent = getScrollParent(rootRef.value);
15980
+ savedScrollPosition.left = scrollableParent?.scrollLeft;
15981
+ savedScrollPosition.top = scrollableParent?.scrollTop;
15982
+ }
15930
15983
  const itemsLength = group.items.value.length;
15931
15984
  const lastIndex = itemsLength - 1;
15932
15985
  if (itemsLength <= 2) {
@@ -15938,7 +15991,30 @@
15938
15991
  } else {
15939
15992
  isReversed.value = newVal < oldVal;
15940
15993
  }
15941
- });
15994
+ vue.nextTick(() => {
15995
+ if (!IN_BROWSER || !scrollableParent) return;
15996
+ const currentScrollY = scrollableParent.scrollTop;
15997
+ if (currentScrollY !== savedScrollPosition.top) {
15998
+ scrollableParent.scrollTo({
15999
+ ...savedScrollPosition,
16000
+ behavior: 'instant'
16001
+ });
16002
+ }
16003
+ requestAnimationFrame(() => {
16004
+ if (!scrollableParent) return;
16005
+ const rafScrollY = scrollableParent.scrollTop;
16006
+ if (rafScrollY !== savedScrollPosition.top) {
16007
+ scrollableParent.scrollTo({
16008
+ ...savedScrollPosition,
16009
+ behavior: 'instant'
16010
+ });
16011
+ }
16012
+ });
16013
+ });
16014
+ }, {
16015
+ flush: 'sync'
16016
+ }); // Run synchronously before DOM updates
16017
+
15942
16018
  vue.provide(VWindowSymbol, {
15943
16019
  transition,
15944
16020
  isReversed,
@@ -18843,7 +18919,7 @@
18843
18919
  };
18844
18920
  }
18845
18921
  function createDateRange(adapter, start, stop) {
18846
- const diff = adapter.getDiff(adapter.endOfDay(stop ?? start), adapter.startOfDay(start), 'days');
18922
+ const diff = adapter.getDiff(new Date(`${adapter.toISO(stop ?? start)}T00:00:00Z`), new Date(`${adapter.toISO(start)}T00:00:00Z`), 'days');
18847
18923
  const datesInRange = [start];
18848
18924
  for (let i = 1; i < diff; i++) {
18849
18925
  const nextDate = adapter.addDays(start, i);
@@ -19517,10 +19593,7 @@
19517
19593
  ...omit(makeVTextFieldProps({
19518
19594
  modelValue: null,
19519
19595
  role: 'combobox'
19520
- }), ['validationValue', 'dirty', 'appendInnerIcon']),
19521
- ...makeTransitionProps({
19522
- transition: false
19523
- })
19596
+ }), ['validationValue', 'dirty', 'appendInnerIcon'])
19524
19597
  }, 'VCombobox');
19525
19598
  const VCombobox = genericComponent()({
19526
19599
  name: 'VCombobox',
@@ -19564,13 +19637,16 @@
19564
19637
  const hasChips = vue.computed(() => !!(props.chips || slots.chip));
19565
19638
  const hasSelectionSlot = vue.computed(() => hasChips.value || !!slots.selection);
19566
19639
  const _search = vue.shallowRef(!props.multiple && !hasSelectionSlot.value ? model.value[0]?.title ?? '' : '');
19640
+ const _searchLock = vue.shallowRef(null);
19567
19641
  const search = vue.computed({
19568
19642
  get: () => {
19569
19643
  return _search.value;
19570
19644
  },
19571
19645
  set: async val => {
19572
19646
  _search.value = val ?? '';
19573
- if (!props.multiple && !hasSelectionSlot.value) {
19647
+ if (val === null || val === '' && !props.multiple && !hasSelectionSlot.value) {
19648
+ model.value = [];
19649
+ } else if (!props.multiple && !hasSelectionSlot.value) {
19574
19650
  model.value = [transformItem$3(props, val)];
19575
19651
  vue.nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
19576
19652
  }
@@ -19598,9 +19674,9 @@
19598
19674
  const {
19599
19675
  filteredItems,
19600
19676
  getMatches
19601
- } = useFilter(props, items, () => props.alwaysFilter || !isPristine.value ? search.value : '');
19677
+ } = useFilter(props, items, () => _searchLock.value ?? (props.alwaysFilter || !isPristine.value ? search.value : ''));
19602
19678
  const displayItems = vue.computed(() => {
19603
- if (props.hideSelected) {
19679
+ if (props.hideSelected && _searchLock.value === null) {
19604
19680
  return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
19605
19681
  }
19606
19682
  return filteredItems.value;
@@ -19681,22 +19757,19 @@
19681
19757
  if (['Escape'].includes(e.key)) {
19682
19758
  menu.value = false;
19683
19759
  }
19684
- if (['Enter', 'Escape', 'Tab'].includes(e.key)) {
19685
- if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key) && !model.value.some(_ref2 => {
19686
- let {
19687
- value
19688
- } = _ref2;
19689
- return value === displayItems.value[0].value;
19690
- })) {
19691
- select(filteredItems.value[0]);
19692
- }
19693
- isPristine.value = true;
19760
+ if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key) && !model.value.some(_ref2 => {
19761
+ let {
19762
+ value
19763
+ } = _ref2;
19764
+ return value === displayItems.value[0].value;
19765
+ })) {
19766
+ select(filteredItems.value[0]);
19694
19767
  }
19695
19768
  if (e.key === 'ArrowDown' && highlightFirst.value) {
19696
19769
  listRef.value?.focus('next');
19697
19770
  }
19698
19771
  if (e.key === 'Enter' && search.value) {
19699
- select(transformItem$3(props, search.value));
19772
+ select(transformItem$3(props, search.value), true, true);
19700
19773
  if (hasSelectionSlot.value) _search.value = '';
19701
19774
  }
19702
19775
  if (['Backspace', 'Delete'].includes(e.key)) {
@@ -19741,13 +19814,15 @@
19741
19814
  }
19742
19815
  function onAfterLeave() {
19743
19816
  if (isFocused.value) {
19744
- isPristine.value = true;
19745
19817
  vTextFieldRef.value?.focus();
19746
19818
  }
19819
+ isPristine.value = true;
19820
+ _searchLock.value = null;
19747
19821
  }
19748
19822
  /** @param set - null means toggle */
19749
19823
  function select(item) {
19750
19824
  let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
19825
+ let keepMenu = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
19751
19826
  if (!item || item.props.disabled) return;
19752
19827
  if (props.multiple) {
19753
19828
  const index = model.value.findIndex(selection => (props.valueComparator || deepEqual)(selection.value, item.value));
@@ -19765,11 +19840,14 @@
19765
19840
  } else {
19766
19841
  const add = set !== false;
19767
19842
  model.value = add ? [item] : [];
19843
+ if ((!isPristine.value || props.alwaysFilter) && _search.value) {
19844
+ _searchLock.value = _search.value;
19845
+ }
19768
19846
  _search.value = add && !hasSelectionSlot.value ? item.title : '';
19769
19847
 
19770
19848
  // watch for search watcher to trigger
19771
19849
  vue.nextTick(() => {
19772
- menu.value = false;
19850
+ menu.value = keepMenu;
19773
19851
  isPristine.value = true;
19774
19852
  });
19775
19853
  }
@@ -19783,9 +19861,6 @@
19783
19861
  function onFocusout(e) {
19784
19862
  listHasFocus.value = false;
19785
19863
  }
19786
- function onUpdateModelValue(v) {
19787
- if (v == null || v === '' && !props.multiple && !hasSelectionSlot.value) model.value = [];
19788
- }
19789
19864
  vue.watch(isFocused, (val, oldVal) => {
19790
19865
  if (val || val === oldVal) return;
19791
19866
  selectionIndex.value = -1;
@@ -19808,13 +19883,14 @@
19808
19883
  }
19809
19884
  }
19810
19885
  });
19811
- vue.watch(menu, () => {
19812
- if (!props.hideSelected && menu.value && model.value.length) {
19886
+ vue.watch(menu, val => {
19887
+ if (!props.hideSelected && val && model.value.length && isPristine.value) {
19813
19888
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
19814
19889
  IN_BROWSER && window.requestAnimationFrame(() => {
19815
19890
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
19816
19891
  });
19817
19892
  }
19893
+ if (val) _searchLock.value = null;
19818
19894
  });
19819
19895
  vue.watch(items, (newVal, oldVal) => {
19820
19896
  if (menu.value) return;
@@ -19830,7 +19906,7 @@
19830
19906
  "ref": vTextFieldRef
19831
19907
  }, textFieldProps, {
19832
19908
  "modelValue": search.value,
19833
- "onUpdate:modelValue": [$event => search.value = $event, onUpdateModelValue],
19909
+ "onUpdate:modelValue": $event => search.value = $event,
19834
19910
  "focused": isFocused.value,
19835
19911
  "onUpdate:focused": $event => isFocused.value = $event,
19836
19912
  "validationValue": model.externalValue,
@@ -19865,7 +19941,6 @@
19865
19941
  "maxHeight": 310,
19866
19942
  "openOnClick": false,
19867
19943
  "closeOnContentClick": false,
19868
- "transition": props.transition,
19869
19944
  "onAfterEnter": onAfterEnter,
19870
19945
  "onAfterLeave": onAfterLeave
19871
19946
  }, props.menuProps), {
@@ -19935,7 +20010,8 @@
19935
20010
  "key": item.value,
19936
20011
  "modelValue": isSelected,
19937
20012
  "ripple": false,
19938
- "tabindex": "-1"
20013
+ "tabindex": "-1",
20014
+ "onClick": event => event.preventDefault()
19939
20015
  }, null) : undefined, item.props.prependAvatar && vue.createVNode(VAvatar, {
19940
20016
  "image": item.props.prependAvatar
19941
20017
  }, null), item.props.prependIcon && vue.createVNode(VIcon, {
@@ -24345,7 +24421,7 @@
24345
24421
  function isAllowedInRange(start, end) {
24346
24422
  const allowedDates = props.allowedDates;
24347
24423
  if (typeof allowedDates !== 'function') return true;
24348
- const days = adapter.getDiff(end, start, 'days');
24424
+ const days = 1 + adapter.getDiff(new Date(`${adapter.toISO(end)}T00:00:00Z`), new Date(`${adapter.toISO(start)}T00:00:00Z`), 'days');
24349
24425
  for (let i = 0; i < days; i++) {
24350
24426
  if (allowedDates(adapter.addDays(start, i))) return true;
24351
24427
  }
@@ -25368,10 +25444,11 @@
25368
25444
  props: {
25369
25445
  class: fieldClass,
25370
25446
  ...slotProps
25371
- }
25447
+ },
25448
+ controlRef
25372
25449
  } = _ref4;
25373
25450
  return vue.createElementVNode(vue.Fragment, null, [vue.createElementVNode("input", vue.mergeProps({
25374
- "ref": inputRef,
25451
+ "ref": val => inputRef.value = controlRef.value = val,
25375
25452
  "type": "file",
25376
25453
  "accept": inputAccept,
25377
25454
  "readonly": isReadonly.value,
@@ -26848,7 +26925,7 @@
26848
26925
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
26849
26926
  const _inputText = vue.shallowRef(null);
26850
26927
  vue.watchEffect(() => {
26851
- if (isFocused.value && !controlsDisabled.value && Number(_inputText.value) === model.value) ; else if (model.value == null) {
26928
+ if (isFocused.value && !controlsDisabled.value && Number(_inputText.value?.replace(decimalSeparator.value, '.')) === model.value) ; else if (model.value == null) {
26852
26929
  _inputText.value = null;
26853
26930
  } else if (!isNaN(model.value)) {
26854
26931
  _inputText.value = correctPrecision(model.value);
@@ -26943,6 +27020,7 @@
26943
27020
  if (!new RegExp(`^-?\\d*${escapeForRegex(decimalSeparator.value)}?\\d*$`).test(potentialNewInputVal)) {
26944
27021
  e.preventDefault();
26945
27022
  inputElement.value = potentialNewNumber;
27023
+ vue.nextTick(() => inputText.value = potentialNewNumber);
26946
27024
  }
26947
27025
  if (props.precision == null) return;
26948
27026
 
@@ -26950,13 +27028,15 @@
26950
27028
  if (potentialNewInputVal.split(decimalSeparator.value)[1]?.length > props.precision) {
26951
27029
  e.preventDefault();
26952
27030
  inputElement.value = potentialNewNumber;
27031
+ vue.nextTick(() => inputText.value = potentialNewNumber);
26953
27032
  const cursorPosition = (selectionStart ?? 0) + e.data.length;
26954
27033
  inputElement.setSelectionRange(cursorPosition, cursorPosition);
26955
27034
  }
26956
27035
  // Ignore decimal separator when precision = 0
26957
- if (props.precision === 0 && potentialNewInputVal.includes(decimalSeparator.value)) {
27036
+ if (props.precision === 0 && potentialNewInputVal.endsWith(decimalSeparator.value)) {
26958
27037
  e.preventDefault();
26959
27038
  inputElement.value = potentialNewNumber;
27039
+ vue.nextTick(() => inputText.value = potentialNewNumber);
26960
27040
  }
26961
27041
  }
26962
27042
  async function onKeydown(e) {
@@ -28152,12 +28232,12 @@
28152
28232
  ariaLabel: t(props.loadingText),
28153
28233
  role: 'alert'
28154
28234
  };
28155
- return vue.createElementVNode(vue.Fragment, null, [isLoading ? vue.createElementVNode("div", vue.mergeProps({
28235
+ return isLoading ? vue.createElementVNode("div", vue.mergeProps({
28156
28236
  "class": ['v-skeleton-loader', {
28157
28237
  'v-skeleton-loader--boilerplate': props.boilerplate
28158
28238
  }, themeClasses.value, backgroundColorClasses.value, elevationClasses.value],
28159
28239
  "style": [backgroundColorStyles.value, dimensionStyles.value]
28160
- }, loadingProps, attrs), [items.value]) : slots.default?.()]);
28240
+ }, loadingProps, attrs), [items.value]) : vue.createElementVNode(vue.Fragment, null, [slots.default?.()]);
28161
28241
  });
28162
28242
  return {};
28163
28243
  }
@@ -30022,6 +30102,10 @@
30022
30102
  const vFieldRef = vue.ref();
30023
30103
  const controlHeight = vue.shallowRef('');
30024
30104
  const textareaRef = vue.ref();
30105
+ const scrollbarWidth = vue.ref(0);
30106
+ const {
30107
+ platform
30108
+ } = useDisplay();
30025
30109
  const autocomplete = useAutocomplete(props);
30026
30110
  const isActive = vue.computed(() => props.persistentPlaceholder || isFocused.value || props.active);
30027
30111
  function onFocus() {
@@ -30066,6 +30150,18 @@
30066
30150
  if (!props.autoGrow) rows.value = Number(props.rows);
30067
30151
  });
30068
30152
  function calculateInputHeight() {
30153
+ vue.nextTick(() => {
30154
+ if (!textareaRef.value) return;
30155
+ if (platform.value.firefox) {
30156
+ scrollbarWidth.value = 12;
30157
+ return;
30158
+ }
30159
+ const {
30160
+ offsetWidth,
30161
+ clientWidth
30162
+ } = textareaRef.value;
30163
+ scrollbarWidth.value = Math.max(0, offsetWidth - clientWidth);
30164
+ });
30069
30165
  if (!props.autoGrow) return;
30070
30166
  vue.nextTick(() => {
30071
30167
  if (!sizerRef.value || !vFieldRef.value) return;
@@ -30126,7 +30222,9 @@
30126
30222
  'v-textarea--no-resize': props.noResize || props.autoGrow,
30127
30223
  'v-input--plain-underlined': isPlainOrUnderlined.value
30128
30224
  }, props.class],
30129
- "style": props.style
30225
+ "style": [{
30226
+ '--v-textarea-scroll-bar-width': convertToUnit(scrollbarWidth.value)
30227
+ }, props.style]
30130
30228
  }, rootAttrs, inputProps, {
30131
30229
  "centerAffix": rows.value === 1 && !isPlainOrUnderlined.value,
30132
30230
  "focused": isFocused.value
@@ -30166,12 +30264,13 @@
30166
30264
  props: {
30167
30265
  class: fieldClass,
30168
30266
  ...slotProps
30169
- }
30267
+ },
30268
+ controlRef
30170
30269
  } = _ref3;
30171
30270
  return vue.createElementVNode(vue.Fragment, null, [props.prefix && vue.createElementVNode("span", {
30172
30271
  "class": "v-text-field__prefix"
30173
30272
  }, [props.prefix]), vue.withDirectives(vue.createElementVNode("textarea", vue.mergeProps({
30174
- "ref": textareaRef,
30273
+ "ref": val => textareaRef.value = controlRef.value = val,
30175
30274
  "class": fieldClass,
30176
30275
  "value": model.value,
30177
30276
  "onInput": onInput,
@@ -32281,7 +32380,7 @@
32281
32380
  };
32282
32381
  });
32283
32382
  }
32284
- const version$1 = "3.10.5";
32383
+ const version$1 = "3.10.7";
32285
32384
  createVuetify$1.version = version$1;
32286
32385
 
32287
32386
  // Vue's inject() can only be used in setup
@@ -32306,7 +32405,7 @@
32306
32405
  ...options
32307
32406
  });
32308
32407
  };
32309
- const version = "3.10.5";
32408
+ const version = "3.10.7";
32310
32409
  createVuetify.version = version;
32311
32410
 
32312
32411
  exports.blueprints = index;