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
package/dist/vuetify.js CHANGED
@@ -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
  */
@@ -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,
@@ -13156,7 +13191,7 @@
13156
13191
  const start = performance.now();
13157
13192
  offsets[0] = 0;
13158
13193
  const length = items.value.length;
13159
- for (let i = 1; i <= length - 1; i++) {
13194
+ for (let i = 1; i <= length; i++) {
13160
13195
  offsets[i] = (offsets[i - 1] || 0) + getSize(i - 1);
13161
13196
  }
13162
13197
  updateTime.value = Math.max(updateTime.value, performance.now() - start);
@@ -13191,7 +13226,7 @@
13191
13226
  }
13192
13227
  }
13193
13228
  function calculateOffset(index) {
13194
- index = clamp(index, 0, items.value.length - 1);
13229
+ index = clamp(index, 0, items.value.length);
13195
13230
  const whole = Math.floor(index);
13196
13231
  const fraction = index % 1;
13197
13232
  const next = whole + 1;
@@ -14196,10 +14231,7 @@
14196
14231
  ...omit(makeVTextFieldProps({
14197
14232
  modelValue: null,
14198
14233
  role: 'combobox'
14199
- }), ['validationValue', 'dirty', 'appendInnerIcon']),
14200
- ...makeTransitionProps({
14201
- transition: false
14202
- })
14234
+ }), ['validationValue', 'dirty', 'appendInnerIcon'])
14203
14235
  }, 'VAutocomplete');
14204
14236
  const VAutocomplete = genericComponent()({
14205
14237
  name: 'VAutocomplete',
@@ -14224,6 +14256,7 @@
14224
14256
  const vMenuRef = vue.ref();
14225
14257
  const vVirtualScrollRef = vue.ref();
14226
14258
  const selectionIndex = vue.shallowRef(-1);
14259
+ const _searchLock = vue.shallowRef(null);
14227
14260
  const {
14228
14261
  items,
14229
14262
  transformIn,
@@ -14245,9 +14278,9 @@
14245
14278
  const {
14246
14279
  filteredItems,
14247
14280
  getMatches
14248
- } = useFilter(props, items, () => isPristine.value ? '' : search.value);
14281
+ } = useFilter(props, items, () => _searchLock.value ?? (isPristine.value ? '' : search.value));
14249
14282
  const displayItems = vue.computed(() => {
14250
- if (props.hideSelected) {
14283
+ if (props.hideSelected && _searchLock.value === null) {
14251
14284
  return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
14252
14285
  }
14253
14286
  return filteredItems.value;
@@ -14378,6 +14411,7 @@
14378
14411
  isPristine.value = true;
14379
14412
  vTextFieldRef.value?.focus();
14380
14413
  }
14414
+ _searchLock.value = null;
14381
14415
  }
14382
14416
  function onFocusin(e) {
14383
14417
  isFocused.value = true;
@@ -14413,6 +14447,7 @@
14413
14447
  } else {
14414
14448
  const add = set !== false;
14415
14449
  model.value = add ? [item] : [];
14450
+ _searchLock.value = isPristine.value ? '' : search.value ?? '';
14416
14451
  search.value = add && !hasSelectionSlot.value ? item.title : '';
14417
14452
 
14418
14453
  // watch for search watcher to trigger
@@ -14432,6 +14467,9 @@
14432
14467
  } else {
14433
14468
  if (!props.multiple && search.value == null) model.value = [];
14434
14469
  menu.value = false;
14470
+ if (!isPristine.value && search.value) {
14471
+ _searchLock.value = search.value;
14472
+ }
14435
14473
  search.value = '';
14436
14474
  selectionIndex.value = -1;
14437
14475
  }
@@ -14441,13 +14479,14 @@
14441
14479
  if (val) menu.value = true;
14442
14480
  isPristine.value = !val;
14443
14481
  });
14444
- vue.watch(menu, () => {
14445
- if (!props.hideSelected && menu.value && model.value.length) {
14482
+ vue.watch(menu, val => {
14483
+ if (!props.hideSelected && val && model.value.length && isPristine.value) {
14446
14484
  const index = displayItems.value.findIndex(item => model.value.some(s => item.value === s.value));
14447
14485
  IN_BROWSER && window.requestAnimationFrame(() => {
14448
14486
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
14449
14487
  });
14450
14488
  }
14489
+ if (val) _searchLock.value = null;
14451
14490
  });
14452
14491
  vue.watch(items, (newVal, oldVal) => {
14453
14492
  if (menu.value) return;
@@ -14498,7 +14537,6 @@
14498
14537
  "maxHeight": 310,
14499
14538
  "openOnClick": false,
14500
14539
  "closeOnContentClick": false,
14501
- "transition": props.transition,
14502
14540
  "onAfterEnter": onAfterEnter,
14503
14541
  "onAfterLeave": onAfterLeave
14504
14542
  }, props.menuProps), {
@@ -15926,7 +15964,21 @@
15926
15964
  const activeIndex = vue.computed(() => {
15927
15965
  return group.items.value.findIndex(item => group.selected.value.includes(item.id));
15928
15966
  });
15967
+
15968
+ // Fix for https://github.com/vuetifyjs/vuetify/issues/18447
15929
15969
  vue.watch(activeIndex, (newVal, oldVal) => {
15970
+ let scrollableParent;
15971
+ const savedScrollPosition = {
15972
+ x: 0,
15973
+ y: 0
15974
+ };
15975
+ if (IN_BROWSER && oldVal >= 0) {
15976
+ scrollableParent = getScrollParent(rootRef.value);
15977
+
15978
+ // Save current scroll position
15979
+ savedScrollPosition.x = scrollableParent.scrollLeft;
15980
+ savedScrollPosition.y = scrollableParent.scrollTop;
15981
+ }
15930
15982
  const itemsLength = group.items.value.length;
15931
15983
  const lastIndex = itemsLength - 1;
15932
15984
  if (itemsLength <= 2) {
@@ -15938,7 +15990,32 @@
15938
15990
  } else {
15939
15991
  isReversed.value = newVal < oldVal;
15940
15992
  }
15941
- });
15993
+ vue.nextTick(() => {
15994
+ if (!IN_BROWSER || !scrollableParent) return;
15995
+ const currentScrollY = scrollableParent.scrollTop;
15996
+ if (currentScrollY !== savedScrollPosition.y) {
15997
+ scrollableParent.scrollTo({
15998
+ left: savedScrollPosition.x,
15999
+ top: savedScrollPosition.y,
16000
+ behavior: 'instant'
16001
+ });
16002
+ }
16003
+ requestAnimationFrame(() => {
16004
+ if (!scrollableParent) return;
16005
+ const rafScrollY = scrollableParent.scrollTop;
16006
+ if (rafScrollY !== savedScrollPosition.y) {
16007
+ scrollableParent.scrollTo({
16008
+ left: savedScrollPosition.x,
16009
+ top: savedScrollPosition.y,
16010
+ behavior: 'instant'
16011
+ });
16012
+ }
16013
+ });
16014
+ });
16015
+ }, {
16016
+ flush: 'sync'
16017
+ }); // Run synchronously before DOM updates
16018
+
15942
16019
  vue.provide(VWindowSymbol, {
15943
16020
  transition,
15944
16021
  isReversed,
@@ -18843,7 +18920,7 @@
18843
18920
  };
18844
18921
  }
18845
18922
  function createDateRange(adapter, start, stop) {
18846
- const diff = adapter.getDiff(adapter.endOfDay(stop ?? start), adapter.startOfDay(start), 'days');
18923
+ const diff = adapter.getDiff(new Date(`${adapter.toISO(stop ?? start)}T00:00:00Z`), new Date(`${adapter.toISO(start)}T00:00:00Z`), 'days');
18847
18924
  const datesInRange = [start];
18848
18925
  for (let i = 1; i < diff; i++) {
18849
18926
  const nextDate = adapter.addDays(start, i);
@@ -19517,10 +19594,7 @@
19517
19594
  ...omit(makeVTextFieldProps({
19518
19595
  modelValue: null,
19519
19596
  role: 'combobox'
19520
- }), ['validationValue', 'dirty', 'appendInnerIcon']),
19521
- ...makeTransitionProps({
19522
- transition: false
19523
- })
19597
+ }), ['validationValue', 'dirty', 'appendInnerIcon'])
19524
19598
  }, 'VCombobox');
19525
19599
  const VCombobox = genericComponent()({
19526
19600
  name: 'VCombobox',
@@ -19564,13 +19638,16 @@
19564
19638
  const hasChips = vue.computed(() => !!(props.chips || slots.chip));
19565
19639
  const hasSelectionSlot = vue.computed(() => hasChips.value || !!slots.selection);
19566
19640
  const _search = vue.shallowRef(!props.multiple && !hasSelectionSlot.value ? model.value[0]?.title ?? '' : '');
19641
+ const _searchLock = vue.shallowRef(null);
19567
19642
  const search = vue.computed({
19568
19643
  get: () => {
19569
19644
  return _search.value;
19570
19645
  },
19571
19646
  set: async val => {
19572
19647
  _search.value = val ?? '';
19573
- if (!props.multiple && !hasSelectionSlot.value) {
19648
+ if (val === null || val === '' && !props.multiple && !hasSelectionSlot.value) {
19649
+ model.value = [];
19650
+ } else if (!props.multiple && !hasSelectionSlot.value) {
19574
19651
  model.value = [transformItem$3(props, val)];
19575
19652
  vue.nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
19576
19653
  }
@@ -19598,9 +19675,9 @@
19598
19675
  const {
19599
19676
  filteredItems,
19600
19677
  getMatches
19601
- } = useFilter(props, items, () => props.alwaysFilter || !isPristine.value ? search.value : '');
19678
+ } = useFilter(props, items, () => _searchLock.value ?? (props.alwaysFilter || !isPristine.value ? search.value : ''));
19602
19679
  const displayItems = vue.computed(() => {
19603
- if (props.hideSelected) {
19680
+ if (props.hideSelected && _searchLock.value === null) {
19604
19681
  return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
19605
19682
  }
19606
19683
  return filteredItems.value;
@@ -19681,22 +19758,19 @@
19681
19758
  if (['Escape'].includes(e.key)) {
19682
19759
  menu.value = false;
19683
19760
  }
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;
19761
+ if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key) && !model.value.some(_ref2 => {
19762
+ let {
19763
+ value
19764
+ } = _ref2;
19765
+ return value === displayItems.value[0].value;
19766
+ })) {
19767
+ select(filteredItems.value[0]);
19694
19768
  }
19695
19769
  if (e.key === 'ArrowDown' && highlightFirst.value) {
19696
19770
  listRef.value?.focus('next');
19697
19771
  }
19698
19772
  if (e.key === 'Enter' && search.value) {
19699
- select(transformItem$3(props, search.value));
19773
+ select(transformItem$3(props, search.value), true, true);
19700
19774
  if (hasSelectionSlot.value) _search.value = '';
19701
19775
  }
19702
19776
  if (['Backspace', 'Delete'].includes(e.key)) {
@@ -19744,10 +19818,12 @@
19744
19818
  isPristine.value = true;
19745
19819
  vTextFieldRef.value?.focus();
19746
19820
  }
19821
+ _searchLock.value = null;
19747
19822
  }
19748
19823
  /** @param set - null means toggle */
19749
19824
  function select(item) {
19750
19825
  let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
19826
+ let keepMenu = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
19751
19827
  if (!item || item.props.disabled) return;
19752
19828
  if (props.multiple) {
19753
19829
  const index = model.value.findIndex(selection => (props.valueComparator || deepEqual)(selection.value, item.value));
@@ -19765,11 +19841,14 @@
19765
19841
  } else {
19766
19842
  const add = set !== false;
19767
19843
  model.value = add ? [item] : [];
19844
+ if ((!isPristine.value || props.alwaysFilter) && _search.value) {
19845
+ _searchLock.value = _search.value;
19846
+ }
19768
19847
  _search.value = add && !hasSelectionSlot.value ? item.title : '';
19769
19848
 
19770
19849
  // watch for search watcher to trigger
19771
19850
  vue.nextTick(() => {
19772
- menu.value = false;
19851
+ menu.value = keepMenu;
19773
19852
  isPristine.value = true;
19774
19853
  });
19775
19854
  }
@@ -19783,9 +19862,6 @@
19783
19862
  function onFocusout(e) {
19784
19863
  listHasFocus.value = false;
19785
19864
  }
19786
- function onUpdateModelValue(v) {
19787
- if (v == null || v === '' && !props.multiple && !hasSelectionSlot.value) model.value = [];
19788
- }
19789
19865
  vue.watch(isFocused, (val, oldVal) => {
19790
19866
  if (val || val === oldVal) return;
19791
19867
  selectionIndex.value = -1;
@@ -19808,13 +19884,14 @@
19808
19884
  }
19809
19885
  }
19810
19886
  });
19811
- vue.watch(menu, () => {
19812
- if (!props.hideSelected && menu.value && model.value.length) {
19887
+ vue.watch(menu, val => {
19888
+ if (!props.hideSelected && val && model.value.length && isPristine.value) {
19813
19889
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
19814
19890
  IN_BROWSER && window.requestAnimationFrame(() => {
19815
19891
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
19816
19892
  });
19817
19893
  }
19894
+ if (val) _searchLock.value = null;
19818
19895
  });
19819
19896
  vue.watch(items, (newVal, oldVal) => {
19820
19897
  if (menu.value) return;
@@ -19830,7 +19907,7 @@
19830
19907
  "ref": vTextFieldRef
19831
19908
  }, textFieldProps, {
19832
19909
  "modelValue": search.value,
19833
- "onUpdate:modelValue": [$event => search.value = $event, onUpdateModelValue],
19910
+ "onUpdate:modelValue": $event => search.value = $event,
19834
19911
  "focused": isFocused.value,
19835
19912
  "onUpdate:focused": $event => isFocused.value = $event,
19836
19913
  "validationValue": model.externalValue,
@@ -19865,7 +19942,6 @@
19865
19942
  "maxHeight": 310,
19866
19943
  "openOnClick": false,
19867
19944
  "closeOnContentClick": false,
19868
- "transition": props.transition,
19869
19945
  "onAfterEnter": onAfterEnter,
19870
19946
  "onAfterLeave": onAfterLeave
19871
19947
  }, props.menuProps), {
@@ -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
  }
@@ -26848,7 +26924,7 @@
26848
26924
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
26849
26925
  const _inputText = vue.shallowRef(null);
26850
26926
  vue.watchEffect(() => {
26851
- if (isFocused.value && !controlsDisabled.value && Number(_inputText.value) === model.value) ; else if (model.value == null) {
26927
+ if (isFocused.value && !controlsDisabled.value && Number(_inputText.value?.replace(decimalSeparator.value, '.')) === model.value) ; else if (model.value == null) {
26852
26928
  _inputText.value = null;
26853
26929
  } else if (!isNaN(model.value)) {
26854
26930
  _inputText.value = correctPrecision(model.value);
@@ -26943,6 +27019,7 @@
26943
27019
  if (!new RegExp(`^-?\\d*${escapeForRegex(decimalSeparator.value)}?\\d*$`).test(potentialNewInputVal)) {
26944
27020
  e.preventDefault();
26945
27021
  inputElement.value = potentialNewNumber;
27022
+ vue.nextTick(() => inputText.value = potentialNewNumber);
26946
27023
  }
26947
27024
  if (props.precision == null) return;
26948
27025
 
@@ -26950,13 +27027,15 @@
26950
27027
  if (potentialNewInputVal.split(decimalSeparator.value)[1]?.length > props.precision) {
26951
27028
  e.preventDefault();
26952
27029
  inputElement.value = potentialNewNumber;
27030
+ vue.nextTick(() => inputText.value = potentialNewNumber);
26953
27031
  const cursorPosition = (selectionStart ?? 0) + e.data.length;
26954
27032
  inputElement.setSelectionRange(cursorPosition, cursorPosition);
26955
27033
  }
26956
27034
  // Ignore decimal separator when precision = 0
26957
- if (props.precision === 0 && potentialNewInputVal.includes(decimalSeparator.value)) {
27035
+ if (props.precision === 0 && potentialNewInputVal.endsWith(decimalSeparator.value)) {
26958
27036
  e.preventDefault();
26959
27037
  inputElement.value = potentialNewNumber;
27038
+ vue.nextTick(() => inputText.value = potentialNewNumber);
26960
27039
  }
26961
27040
  }
26962
27041
  async function onKeydown(e) {
@@ -28152,12 +28231,12 @@
28152
28231
  ariaLabel: t(props.loadingText),
28153
28232
  role: 'alert'
28154
28233
  };
28155
- return vue.createElementVNode(vue.Fragment, null, [isLoading ? vue.createElementVNode("div", vue.mergeProps({
28234
+ return isLoading ? vue.createElementVNode("div", vue.mergeProps({
28156
28235
  "class": ['v-skeleton-loader', {
28157
28236
  'v-skeleton-loader--boilerplate': props.boilerplate
28158
28237
  }, themeClasses.value, backgroundColorClasses.value, elevationClasses.value],
28159
28238
  "style": [backgroundColorStyles.value, dimensionStyles.value]
28160
- }, loadingProps, attrs), [items.value]) : slots.default?.()]);
28239
+ }, loadingProps, attrs), [items.value]) : vue.createElementVNode(vue.Fragment, null, [slots.default?.()]);
28161
28240
  });
28162
28241
  return {};
28163
28242
  }
@@ -30022,6 +30101,10 @@
30022
30101
  const vFieldRef = vue.ref();
30023
30102
  const controlHeight = vue.shallowRef('');
30024
30103
  const textareaRef = vue.ref();
30104
+ const scrollbarWidth = vue.ref(0);
30105
+ const {
30106
+ platform
30107
+ } = useDisplay();
30025
30108
  const autocomplete = useAutocomplete(props);
30026
30109
  const isActive = vue.computed(() => props.persistentPlaceholder || isFocused.value || props.active);
30027
30110
  function onFocus() {
@@ -30066,6 +30149,18 @@
30066
30149
  if (!props.autoGrow) rows.value = Number(props.rows);
30067
30150
  });
30068
30151
  function calculateInputHeight() {
30152
+ vue.nextTick(() => {
30153
+ if (!textareaRef.value) return;
30154
+ if (platform.value.firefox) {
30155
+ scrollbarWidth.value = 12;
30156
+ return;
30157
+ }
30158
+ const {
30159
+ offsetWidth,
30160
+ clientWidth
30161
+ } = textareaRef.value;
30162
+ scrollbarWidth.value = Math.max(0, offsetWidth - clientWidth);
30163
+ });
30069
30164
  if (!props.autoGrow) return;
30070
30165
  vue.nextTick(() => {
30071
30166
  if (!sizerRef.value || !vFieldRef.value) return;
@@ -30126,7 +30221,9 @@
30126
30221
  'v-textarea--no-resize': props.noResize || props.autoGrow,
30127
30222
  'v-input--plain-underlined': isPlainOrUnderlined.value
30128
30223
  }, props.class],
30129
- "style": props.style
30224
+ "style": [{
30225
+ '--v-textarea-scroll-bar-width': convertToUnit(scrollbarWidth.value)
30226
+ }, props.style]
30130
30227
  }, rootAttrs, inputProps, {
30131
30228
  "centerAffix": rows.value === 1 && !isPlainOrUnderlined.value,
30132
30229
  "focused": isFocused.value
@@ -32281,7 +32378,7 @@
32281
32378
  };
32282
32379
  });
32283
32380
  }
32284
- const version$1 = "3.10.5";
32381
+ const version$1 = "3.10.6";
32285
32382
  createVuetify$1.version = version$1;
32286
32383
 
32287
32384
  // Vue's inject() can only be used in setup
@@ -32306,7 +32403,7 @@
32306
32403
  ...options
32307
32404
  });
32308
32405
  };
32309
- const version = "3.10.5";
32406
+ const version = "3.10.6";
32310
32407
  createVuetify.version = version;
32311
32408
 
32312
32409
  exports.blueprints = index;