vuetify 3.10.4 → 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 (108) hide show
  1. package/README.md +0 -6
  2. package/dist/json/attributes.json +1910 -1922
  3. package/dist/json/importMap-labs.json +20 -20
  4. package/dist/json/importMap.json +182 -182
  5. package/dist/json/tags.json +6 -9
  6. package/dist/json/web-types.json +3674 -3697
  7. package/dist/vuetify-labs.cjs +211 -107
  8. package/dist/vuetify-labs.css +5703 -5642
  9. package/dist/vuetify-labs.d.ts +168 -175
  10. package/dist/vuetify-labs.esm.js +211 -107
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +211 -107
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +192 -97
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +5916 -5877
  17. package/dist/vuetify.d.ts +168 -140
  18. package/dist/vuetify.esm.js +192 -97
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +192 -97
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +124 -114
  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/VBadge/VBadge.css +10 -0
  29. package/lib/components/VBadge/VBadge.sass +9 -0
  30. package/lib/components/VChipGroup/VChipGroup.d.ts +37 -0
  31. package/lib/components/VChipGroup/VChipGroup.js +3 -1
  32. package/lib/components/VChipGroup/VChipGroup.js.map +1 -1
  33. package/lib/components/VCombobox/VCombobox.d.ts +6 -67
  34. package/lib/components/VCombobox/VCombobox.js +26 -28
  35. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  36. package/lib/components/VCounter/VCounter.css +1 -0
  37. package/lib/components/VCounter/VCounter.sass +1 -0
  38. package/lib/components/VDataTable/VDataTableGroupHeaderRow.d.ts +29 -0
  39. package/lib/components/VDataTable/VDataTableGroupHeaderRow.js +4 -1
  40. package/lib/components/VDataTable/VDataTableGroupHeaderRow.js.map +1 -1
  41. package/lib/components/VDataTable/VDataTableHeaders.d.ts +29 -0
  42. package/lib/components/VDataTable/VDataTableHeaders.js +3 -0
  43. package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
  44. package/lib/components/VDataTable/VDataTableRow.d.ts +29 -0
  45. package/lib/components/VDataTable/VDataTableRow.js +3 -0
  46. package/lib/components/VDataTable/VDataTableRow.js.map +1 -1
  47. package/lib/components/VDataTable/VDataTableRows.d.ts +29 -0
  48. package/lib/components/VDataTable/VDataTableRows.js +4 -3
  49. package/lib/components/VDataTable/VDataTableRows.js.map +1 -1
  50. package/lib/components/VDatePicker/VDatePicker.js +1 -1
  51. package/lib/components/VDatePicker/VDatePicker.js.map +1 -1
  52. package/lib/components/VDivider/VDivider.css +1 -0
  53. package/lib/components/VDivider/VDivider.sass +1 -0
  54. package/lib/components/VKbd/_variables.scss +3 -1
  55. package/lib/components/VList/VListItem.css +14 -12
  56. package/lib/components/VList/VListItem.js +5 -3
  57. package/lib/components/VList/VListItem.js.map +1 -1
  58. package/lib/components/VList/VListItem.sass +20 -18
  59. package/lib/components/VMenu/VMenu.js +22 -4
  60. package/lib/components/VMenu/VMenu.js.map +1 -1
  61. package/lib/components/VNumberInput/VNumberInput.css +8 -0
  62. package/lib/components/VNumberInput/VNumberInput.js +5 -2
  63. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  64. package/lib/components/VNumberInput/VNumberInput.sass +10 -4
  65. package/lib/components/VSkeletonLoader/VSkeletonLoader.css +17 -0
  66. package/lib/components/VSkeletonLoader/VSkeletonLoader.js +3 -3
  67. package/lib/components/VSkeletonLoader/VSkeletonLoader.js.map +1 -1
  68. package/lib/components/VSkeletonLoader/VSkeletonLoader.sass +7 -0
  69. package/lib/components/VSlideGroup/VSlideGroup.d.ts +25 -0
  70. package/lib/components/VSlideGroup/VSlideGroup.js +5 -1
  71. package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
  72. package/lib/components/VTable/VTable.js +20 -32
  73. package/lib/components/VTable/VTable.js.map +1 -1
  74. package/lib/components/VTabs/VTabs.d.ts +25 -0
  75. package/lib/components/VTextField/VTextField.js +0 -3
  76. package/lib/components/VTextField/VTextField.js.map +1 -1
  77. package/lib/components/VTextarea/VTextarea.css +2 -2
  78. package/lib/components/VTextarea/VTextarea.js +20 -1
  79. package/lib/components/VTextarea/VTextarea.js.map +1 -1
  80. package/lib/components/VTextarea/VTextarea.sass +4 -2
  81. package/lib/components/VWindow/VWindow.js +43 -3
  82. package/lib/components/VWindow/VWindow.js.map +1 -1
  83. package/lib/composables/date/date.js +1 -1
  84. package/lib/composables/date/date.js.map +1 -1
  85. package/lib/composables/group.js +1 -1
  86. package/lib/composables/group.js.map +1 -1
  87. package/lib/composables/nested/nested.js +12 -2
  88. package/lib/composables/nested/nested.js.map +1 -1
  89. package/lib/composables/virtual.js +2 -2
  90. package/lib/composables/virtual.js.map +1 -1
  91. package/lib/entry-bundler.js +1 -1
  92. package/lib/framework.d.ts +66 -66
  93. package/lib/framework.js +1 -1
  94. package/lib/labs/VColorInput/VColorInput.d.ts +0 -40
  95. package/lib/labs/VColorInput/VColorInput.js +2 -2
  96. package/lib/labs/VColorInput/VColorInput.js.map +1 -1
  97. package/lib/labs/VDateInput/VDateInput.d.ts +0 -30
  98. package/lib/labs/VDateInput/VDateInput.js +16 -7
  99. package/lib/labs/VDateInput/VDateInput.js.map +1 -1
  100. package/lib/labs/VIconBtn/VIconBtn.css +22 -0
  101. package/lib/labs/VIconBtn/VIconBtn.scss +32 -0
  102. package/lib/labs/VMaskInput/VMaskInput.js +1 -1
  103. package/lib/labs/VMaskInput/VMaskInput.js.map +1 -1
  104. package/lib/labs/rules/rules.js +4 -4
  105. package/lib/labs/rules/rules.js.map +1 -1
  106. package/lib/util/helpers.js +4 -2
  107. package/lib/util/helpers.js.map +1 -1
  108. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.10.4
2
+ * Vuetify v3.10.6
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
  };
@@ -10034,7 +10052,7 @@ const VListItem = genericComponent()({
10034
10052
  const isLink = toRef(() => props.link !== false && link.isLink.value);
10035
10053
  const isSelectable = computed(() => !!list && (root.selectable.value || root.activatable.value || props.value != null));
10036
10054
  const isClickable = computed(() => !props.disabled && props.link !== false && (props.link || link.isClickable.value || isSelectable.value));
10037
- const role = computed(() => list ? isSelectable.value ? 'option' : 'listitem' : undefined);
10055
+ const role = computed(() => list ? isLink.value ? 'link' : isSelectable.value ? 'option' : 'listitem' : undefined);
10038
10056
  const ariaSelected = computed(() => {
10039
10057
  if (!isSelectable.value) return undefined;
10040
10058
  return root.activatable.value ? isActivated.value : root.selectable.value ? isSelected.value : isActive.value;
@@ -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,
@@ -13152,7 +13187,7 @@ function useVirtual(props, items) {
13152
13187
  const start = performance.now();
13153
13188
  offsets[0] = 0;
13154
13189
  const length = items.value.length;
13155
- for (let i = 1; i <= length - 1; i++) {
13190
+ for (let i = 1; i <= length; i++) {
13156
13191
  offsets[i] = (offsets[i - 1] || 0) + getSize(i - 1);
13157
13192
  }
13158
13193
  updateTime.value = Math.max(updateTime.value, performance.now() - start);
@@ -13187,7 +13222,7 @@ function useVirtual(props, items) {
13187
13222
  }
13188
13223
  }
13189
13224
  function calculateOffset(index) {
13190
- index = clamp(index, 0, items.value.length - 1);
13225
+ index = clamp(index, 0, items.value.length);
13191
13226
  const whole = Math.floor(index);
13192
13227
  const fraction = index % 1;
13193
13228
  const next = whole + 1;
@@ -14192,10 +14227,7 @@ const makeVAutocompleteProps = propsFactory({
14192
14227
  ...omit(makeVTextFieldProps({
14193
14228
  modelValue: null,
14194
14229
  role: 'combobox'
14195
- }), ['validationValue', 'dirty', 'appendInnerIcon']),
14196
- ...makeTransitionProps({
14197
- transition: false
14198
- })
14230
+ }), ['validationValue', 'dirty', 'appendInnerIcon'])
14199
14231
  }, 'VAutocomplete');
14200
14232
  const VAutocomplete = genericComponent()({
14201
14233
  name: 'VAutocomplete',
@@ -14220,6 +14252,7 @@ const VAutocomplete = genericComponent()({
14220
14252
  const vMenuRef = ref();
14221
14253
  const vVirtualScrollRef = ref();
14222
14254
  const selectionIndex = shallowRef(-1);
14255
+ const _searchLock = shallowRef(null);
14223
14256
  const {
14224
14257
  items,
14225
14258
  transformIn,
@@ -14241,9 +14274,9 @@ const VAutocomplete = genericComponent()({
14241
14274
  const {
14242
14275
  filteredItems,
14243
14276
  getMatches
14244
- } = useFilter(props, items, () => isPristine.value ? '' : search.value);
14277
+ } = useFilter(props, items, () => _searchLock.value ?? (isPristine.value ? '' : search.value));
14245
14278
  const displayItems = computed(() => {
14246
- if (props.hideSelected) {
14279
+ if (props.hideSelected && _searchLock.value === null) {
14247
14280
  return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
14248
14281
  }
14249
14282
  return filteredItems.value;
@@ -14374,6 +14407,7 @@ const VAutocomplete = genericComponent()({
14374
14407
  isPristine.value = true;
14375
14408
  vTextFieldRef.value?.focus();
14376
14409
  }
14410
+ _searchLock.value = null;
14377
14411
  }
14378
14412
  function onFocusin(e) {
14379
14413
  isFocused.value = true;
@@ -14409,6 +14443,7 @@ const VAutocomplete = genericComponent()({
14409
14443
  } else {
14410
14444
  const add = set !== false;
14411
14445
  model.value = add ? [item] : [];
14446
+ _searchLock.value = isPristine.value ? '' : search.value ?? '';
14412
14447
  search.value = add && !hasSelectionSlot.value ? item.title : '';
14413
14448
 
14414
14449
  // watch for search watcher to trigger
@@ -14428,6 +14463,9 @@ const VAutocomplete = genericComponent()({
14428
14463
  } else {
14429
14464
  if (!props.multiple && search.value == null) model.value = [];
14430
14465
  menu.value = false;
14466
+ if (!isPristine.value && search.value) {
14467
+ _searchLock.value = search.value;
14468
+ }
14431
14469
  search.value = '';
14432
14470
  selectionIndex.value = -1;
14433
14471
  }
@@ -14437,13 +14475,14 @@ const VAutocomplete = genericComponent()({
14437
14475
  if (val) menu.value = true;
14438
14476
  isPristine.value = !val;
14439
14477
  });
14440
- watch(menu, () => {
14441
- if (!props.hideSelected && menu.value && model.value.length) {
14478
+ watch(menu, val => {
14479
+ if (!props.hideSelected && val && model.value.length && isPristine.value) {
14442
14480
  const index = displayItems.value.findIndex(item => model.value.some(s => item.value === s.value));
14443
14481
  IN_BROWSER && window.requestAnimationFrame(() => {
14444
14482
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
14445
14483
  });
14446
14484
  }
14485
+ if (val) _searchLock.value = null;
14447
14486
  });
14448
14487
  watch(items, (newVal, oldVal) => {
14449
14488
  if (menu.value) return;
@@ -14494,7 +14533,6 @@ const VAutocomplete = genericComponent()({
14494
14533
  "maxHeight": 310,
14495
14534
  "openOnClick": false,
14496
14535
  "closeOnContentClick": false,
14497
- "transition": props.transition,
14498
14536
  "onAfterEnter": onAfterEnter,
14499
14537
  "onAfterLeave": onAfterLeave
14500
14538
  }, props.menuProps), {
@@ -15922,7 +15960,21 @@ const VWindow = genericComponent()({
15922
15960
  const activeIndex = computed(() => {
15923
15961
  return group.items.value.findIndex(item => group.selected.value.includes(item.id));
15924
15962
  });
15963
+
15964
+ // Fix for https://github.com/vuetifyjs/vuetify/issues/18447
15925
15965
  watch(activeIndex, (newVal, oldVal) => {
15966
+ let scrollableParent;
15967
+ const savedScrollPosition = {
15968
+ x: 0,
15969
+ y: 0
15970
+ };
15971
+ if (IN_BROWSER && oldVal >= 0) {
15972
+ scrollableParent = getScrollParent(rootRef.value);
15973
+
15974
+ // Save current scroll position
15975
+ savedScrollPosition.x = scrollableParent.scrollLeft;
15976
+ savedScrollPosition.y = scrollableParent.scrollTop;
15977
+ }
15926
15978
  const itemsLength = group.items.value.length;
15927
15979
  const lastIndex = itemsLength - 1;
15928
15980
  if (itemsLength <= 2) {
@@ -15934,7 +15986,32 @@ const VWindow = genericComponent()({
15934
15986
  } else {
15935
15987
  isReversed.value = newVal < oldVal;
15936
15988
  }
15937
- });
15989
+ nextTick(() => {
15990
+ if (!IN_BROWSER || !scrollableParent) return;
15991
+ const currentScrollY = scrollableParent.scrollTop;
15992
+ if (currentScrollY !== savedScrollPosition.y) {
15993
+ scrollableParent.scrollTo({
15994
+ left: savedScrollPosition.x,
15995
+ top: savedScrollPosition.y,
15996
+ behavior: 'instant'
15997
+ });
15998
+ }
15999
+ requestAnimationFrame(() => {
16000
+ if (!scrollableParent) return;
16001
+ const rafScrollY = scrollableParent.scrollTop;
16002
+ if (rafScrollY !== savedScrollPosition.y) {
16003
+ scrollableParent.scrollTo({
16004
+ left: savedScrollPosition.x,
16005
+ top: savedScrollPosition.y,
16006
+ behavior: 'instant'
16007
+ });
16008
+ }
16009
+ });
16010
+ });
16011
+ }, {
16012
+ flush: 'sync'
16013
+ }); // Run synchronously before DOM updates
16014
+
15938
16015
  provide(VWindowSymbol, {
15939
16016
  transition,
15940
16017
  isReversed,
@@ -18839,7 +18916,7 @@ function createDate(options, locale) {
18839
18916
  };
18840
18917
  }
18841
18918
  function createDateRange(adapter, start, stop) {
18842
- const diff = adapter.getDiff(adapter.endOfDay(stop ?? start), adapter.startOfDay(start), 'days');
18919
+ const diff = adapter.getDiff(new Date(`${adapter.toISO(stop ?? start)}T00:00:00Z`), new Date(`${adapter.toISO(start)}T00:00:00Z`), 'days');
18843
18920
  const datesInRange = [start];
18844
18921
  for (let i = 1; i < diff; i++) {
18845
18922
  const nextDate = adapter.addDays(start, i);
@@ -19513,10 +19590,7 @@ const makeVComboboxProps = propsFactory({
19513
19590
  ...omit(makeVTextFieldProps({
19514
19591
  modelValue: null,
19515
19592
  role: 'combobox'
19516
- }), ['validationValue', 'dirty', 'appendInnerIcon']),
19517
- ...makeTransitionProps({
19518
- transition: false
19519
- })
19593
+ }), ['validationValue', 'dirty', 'appendInnerIcon'])
19520
19594
  }, 'VCombobox');
19521
19595
  const VCombobox = genericComponent()({
19522
19596
  name: 'VCombobox',
@@ -19560,13 +19634,16 @@ const VCombobox = genericComponent()({
19560
19634
  const hasChips = computed(() => !!(props.chips || slots.chip));
19561
19635
  const hasSelectionSlot = computed(() => hasChips.value || !!slots.selection);
19562
19636
  const _search = shallowRef(!props.multiple && !hasSelectionSlot.value ? model.value[0]?.title ?? '' : '');
19637
+ const _searchLock = shallowRef(null);
19563
19638
  const search = computed({
19564
19639
  get: () => {
19565
19640
  return _search.value;
19566
19641
  },
19567
19642
  set: async val => {
19568
19643
  _search.value = val ?? '';
19569
- if (!props.multiple && !hasSelectionSlot.value) {
19644
+ if (val === null || val === '' && !props.multiple && !hasSelectionSlot.value) {
19645
+ model.value = [];
19646
+ } else if (!props.multiple && !hasSelectionSlot.value) {
19570
19647
  model.value = [transformItem$3(props, val)];
19571
19648
  nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
19572
19649
  }
@@ -19594,9 +19671,9 @@ const VCombobox = genericComponent()({
19594
19671
  const {
19595
19672
  filteredItems,
19596
19673
  getMatches
19597
- } = useFilter(props, items, () => props.alwaysFilter || !isPristine.value ? search.value : '');
19674
+ } = useFilter(props, items, () => _searchLock.value ?? (props.alwaysFilter || !isPristine.value ? search.value : ''));
19598
19675
  const displayItems = computed(() => {
19599
- if (props.hideSelected) {
19676
+ if (props.hideSelected && _searchLock.value === null) {
19600
19677
  return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
19601
19678
  }
19602
19679
  return filteredItems.value;
@@ -19677,22 +19754,19 @@ const VCombobox = genericComponent()({
19677
19754
  if (['Escape'].includes(e.key)) {
19678
19755
  menu.value = false;
19679
19756
  }
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;
19757
+ if (highlightFirst.value && ['Enter', 'Tab'].includes(e.key) && !model.value.some(_ref2 => {
19758
+ let {
19759
+ value
19760
+ } = _ref2;
19761
+ return value === displayItems.value[0].value;
19762
+ })) {
19763
+ select(filteredItems.value[0]);
19690
19764
  }
19691
19765
  if (e.key === 'ArrowDown' && highlightFirst.value) {
19692
19766
  listRef.value?.focus('next');
19693
19767
  }
19694
19768
  if (e.key === 'Enter' && search.value) {
19695
- select(transformItem$3(props, search.value));
19769
+ select(transformItem$3(props, search.value), true, true);
19696
19770
  if (hasSelectionSlot.value) _search.value = '';
19697
19771
  }
19698
19772
  if (['Backspace', 'Delete'].includes(e.key)) {
@@ -19740,10 +19814,12 @@ const VCombobox = genericComponent()({
19740
19814
  isPristine.value = true;
19741
19815
  vTextFieldRef.value?.focus();
19742
19816
  }
19817
+ _searchLock.value = null;
19743
19818
  }
19744
19819
  /** @param set - null means toggle */
19745
19820
  function select(item) {
19746
19821
  let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
19822
+ let keepMenu = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
19747
19823
  if (!item || item.props.disabled) return;
19748
19824
  if (props.multiple) {
19749
19825
  const index = model.value.findIndex(selection => (props.valueComparator || deepEqual)(selection.value, item.value));
@@ -19761,11 +19837,14 @@ const VCombobox = genericComponent()({
19761
19837
  } else {
19762
19838
  const add = set !== false;
19763
19839
  model.value = add ? [item] : [];
19840
+ if ((!isPristine.value || props.alwaysFilter) && _search.value) {
19841
+ _searchLock.value = _search.value;
19842
+ }
19764
19843
  _search.value = add && !hasSelectionSlot.value ? item.title : '';
19765
19844
 
19766
19845
  // watch for search watcher to trigger
19767
19846
  nextTick(() => {
19768
- menu.value = false;
19847
+ menu.value = keepMenu;
19769
19848
  isPristine.value = true;
19770
19849
  });
19771
19850
  }
@@ -19779,9 +19858,6 @@ const VCombobox = genericComponent()({
19779
19858
  function onFocusout(e) {
19780
19859
  listHasFocus.value = false;
19781
19860
  }
19782
- function onUpdateModelValue(v) {
19783
- if (v == null || v === '' && !props.multiple && !hasSelectionSlot.value) model.value = [];
19784
- }
19785
19861
  watch(isFocused, (val, oldVal) => {
19786
19862
  if (val || val === oldVal) return;
19787
19863
  selectionIndex.value = -1;
@@ -19804,13 +19880,14 @@ const VCombobox = genericComponent()({
19804
19880
  }
19805
19881
  }
19806
19882
  });
19807
- watch(menu, () => {
19808
- if (!props.hideSelected && menu.value && model.value.length) {
19883
+ watch(menu, val => {
19884
+ if (!props.hideSelected && val && model.value.length && isPristine.value) {
19809
19885
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
19810
19886
  IN_BROWSER && window.requestAnimationFrame(() => {
19811
19887
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
19812
19888
  });
19813
19889
  }
19890
+ if (val) _searchLock.value = null;
19814
19891
  });
19815
19892
  watch(items, (newVal, oldVal) => {
19816
19893
  if (menu.value) return;
@@ -19826,7 +19903,7 @@ const VCombobox = genericComponent()({
19826
19903
  "ref": vTextFieldRef
19827
19904
  }, textFieldProps, {
19828
19905
  "modelValue": search.value,
19829
- "onUpdate:modelValue": [$event => search.value = $event, onUpdateModelValue],
19906
+ "onUpdate:modelValue": $event => search.value = $event,
19830
19907
  "focused": isFocused.value,
19831
19908
  "onUpdate:focused": $event => isFocused.value = $event,
19832
19909
  "validationValue": model.externalValue,
@@ -19861,7 +19938,6 @@ const VCombobox = genericComponent()({
19861
19938
  "maxHeight": 310,
19862
19939
  "openOnClick": false,
19863
19940
  "closeOnContentClick": false,
19864
- "transition": props.transition,
19865
19941
  "onAfterEnter": onAfterEnter,
19866
19942
  "onAfterLeave": onAfterLeave
19867
19943
  }, props.menuProps), {
@@ -21875,6 +21951,7 @@ const makeVDataTableHeadersProps = propsFactory({
21875
21951
  },
21876
21952
  /** @deprecated */
21877
21953
  sticky: Boolean,
21954
+ ...makeDensityProps(),
21878
21955
  ...makeDisplayProps(),
21879
21956
  ...makeLoaderProps()
21880
21957
  }, 'VDataTableHeaders');
@@ -21999,6 +22076,7 @@ const VDataTableHeaders = genericComponent()({
21999
22076
  if (isEmpty) return '';
22000
22077
  if (column.key === 'data-table-select') {
22001
22078
  return slots['header.data-table-select']?.(columnSlotProps) ?? (showSelectAll.value && createVNode(VCheckboxBtn, {
22079
+ "density": props.density,
22002
22080
  "modelValue": allSelected.value,
22003
22081
  "indeterminate": someSelected.value && !allSelected.value,
22004
22082
  "onUpdate:modelValue": selectAll
@@ -22099,7 +22177,8 @@ const makeVDataTableGroupHeaderRowProps = propsFactory({
22099
22177
  groupExpandIcon: {
22100
22178
  type: IconValue,
22101
22179
  default: '$tableGroupExpand'
22102
- }
22180
+ },
22181
+ ...makeDensityProps()
22103
22182
  }, 'VDataTableGroupHeaderRow');
22104
22183
  const VDataTableGroupHeaderRow = genericComponent()({
22105
22184
  name: 'VDataTableGroupHeaderRow',
@@ -22167,6 +22246,7 @@ const VDataTableGroupHeaderRow = genericComponent()({
22167
22246
  "noPadding": true
22168
22247
  }, {
22169
22248
  default: () => [createVNode(VCheckboxBtn, {
22249
+ "density": props.density,
22170
22250
  "modelValue": modelValue,
22171
22251
  "indeterminate": indeterminate,
22172
22252
  "onUpdate:modelValue": selectGroup
@@ -22195,6 +22275,7 @@ const makeVDataTableRowProps = propsFactory({
22195
22275
  onClick: EventProp(),
22196
22276
  onContextmenu: EventProp(),
22197
22277
  onDblclick: EventProp(),
22278
+ ...makeDensityProps(),
22198
22279
  ...makeDisplayProps()
22199
22280
  }, 'VDataTableRow');
22200
22281
  const VDataTableRow = genericComponent()({
@@ -22303,6 +22384,7 @@ const VDataTableRow = genericComponent()({
22303
22384
  }
22304
22385
  }) ?? createVNode(VCheckboxBtn, {
22305
22386
  "disabled": !item.selectable,
22387
+ "density": props.density,
22306
22388
  "modelValue": isSelected([item]),
22307
22389
  "onClick": withModifiers(event => toggleSelect(item, props.index, event), ['stop'])
22308
22390
  }, null);
@@ -22355,8 +22437,8 @@ const makeVDataTableRowsProps = propsFactory({
22355
22437
  },
22356
22438
  rowProps: [Object, Function],
22357
22439
  cellProps: [Object, Function],
22358
- ...pick(makeVDataTableRowProps(), ['collapseIcon', 'expandIcon']),
22359
- ...pick(makeVDataTableGroupHeaderRowProps(), ['groupCollapseIcon', 'groupExpandIcon']),
22440
+ ...pick(makeVDataTableRowProps(), ['collapseIcon', 'expandIcon', 'density']),
22441
+ ...pick(makeVDataTableGroupHeaderRowProps(), ['groupCollapseIcon', 'groupExpandIcon', 'density']),
22360
22442
  ...makeDisplayProps()
22361
22443
  }, 'VDataTableRows');
22362
22444
  const VDataTableRows = genericComponent()({
@@ -22391,7 +22473,7 @@ const VDataTableRows = genericComponent()({
22391
22473
  mobile
22392
22474
  } = useDisplay(props);
22393
22475
  useRender(() => {
22394
- const groupHeaderRowProps = pick(props, ['groupCollapseIcon', 'groupExpandIcon']);
22476
+ const groupHeaderRowProps = pick(props, ['groupCollapseIcon', 'groupExpandIcon', 'density']);
22395
22477
  if (props.loading && (!props.items.length || slots.loading)) {
22396
22478
  return createElementVNode("tr", {
22397
22479
  "class": "v-data-table-rows-loading",
@@ -22457,6 +22539,7 @@ const VDataTableRows = genericComponent()({
22457
22539
  cellProps: props.cellProps,
22458
22540
  collapseIcon: props.collapseIcon,
22459
22541
  expandIcon: props.expandIcon,
22542
+ density: props.density,
22460
22543
  mobile: mobile.value
22461
22544
  }, getPrefixedEventHandlers(attrs, ':row', () => slotProps), typeof props.rowProps === 'function' ? props.rowProps({
22462
22545
  item: slotProps.item,
@@ -22473,6 +22556,8 @@ const VDataTableRows = genericComponent()({
22473
22556
  }
22474
22557
  });
22475
22558
 
22559
+ // Types
22560
+
22476
22561
  const makeVTableProps = propsFactory({
22477
22562
  fixedHeader: Boolean,
22478
22563
  fixedFooter: Boolean,
@@ -22502,37 +22587,26 @@ const VTable = genericComponent()({
22502
22587
  const {
22503
22588
  densityClasses
22504
22589
  } = useDensity(props);
22505
- useRender(() => {
22506
- const tableContentDefaults = {
22507
- VCheckboxBtn: {
22508
- density: props.density
22590
+ useRender(() => createVNode(props.tag, {
22591
+ "class": normalizeClass(['v-table', {
22592
+ 'v-table--fixed-height': !!props.height,
22593
+ 'v-table--fixed-header': props.fixedHeader,
22594
+ 'v-table--fixed-footer': props.fixedFooter,
22595
+ 'v-table--has-top': !!slots.top,
22596
+ 'v-table--has-bottom': !!slots.bottom,
22597
+ 'v-table--hover': props.hover,
22598
+ 'v-table--striped-even': props.striped === 'even',
22599
+ 'v-table--striped-odd': props.striped === 'odd'
22600
+ }, themeClasses.value, densityClasses.value, props.class]),
22601
+ "style": normalizeStyle(props.style)
22602
+ }, {
22603
+ default: () => [slots.top?.(), slots.default ? createElementVNode("div", {
22604
+ "class": "v-table__wrapper",
22605
+ "style": {
22606
+ height: convertToUnit(props.height)
22509
22607
  }
22510
- };
22511
- return createVNode(props.tag, {
22512
- "class": normalizeClass(['v-table', {
22513
- 'v-table--fixed-height': !!props.height,
22514
- 'v-table--fixed-header': props.fixedHeader,
22515
- 'v-table--fixed-footer': props.fixedFooter,
22516
- 'v-table--has-top': !!slots.top,
22517
- 'v-table--has-bottom': !!slots.bottom,
22518
- 'v-table--hover': props.hover,
22519
- 'v-table--striped-even': props.striped === 'even',
22520
- 'v-table--striped-odd': props.striped === 'odd'
22521
- }, themeClasses.value, densityClasses.value, props.class]),
22522
- "style": normalizeStyle(props.style)
22523
- }, {
22524
- default: () => [slots.top?.(), createVNode(VDefaultsProvider, {
22525
- "defaults": tableContentDefaults
22526
- }, {
22527
- default: () => [slots.default ? createElementVNode("div", {
22528
- "class": "v-table__wrapper",
22529
- "style": {
22530
- height: convertToUnit(props.height)
22531
- }
22532
- }, [createElementVNode("table", null, [slots.default()])]) : slots.wrapper?.()]
22533
- }), slots.bottom?.()]
22534
- });
22535
- });
22608
+ }, [createElementVNode("table", null, [slots.default()])]) : slots.wrapper?.(), slots.bottom?.()]
22609
+ }));
22536
22610
  return {};
22537
22611
  }
22538
22612
  });
@@ -24343,7 +24417,7 @@ const VDatePicker = genericComponent()({
24343
24417
  function isAllowedInRange(start, end) {
24344
24418
  const allowedDates = props.allowedDates;
24345
24419
  if (typeof allowedDates !== 'function') return true;
24346
- 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');
24347
24421
  for (let i = 0; i < days; i++) {
24348
24422
  if (allowedDates(adapter.addDays(start, i))) return true;
24349
24423
  }
@@ -26846,7 +26920,7 @@ const VNumberInput = genericComponent()({
26846
26920
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
26847
26921
  const _inputText = shallowRef(null);
26848
26922
  watchEffect(() => {
26849
- if (isFocused.value && !controlsDisabled.value && Number(_inputText.value) === model.value) ; else if (model.value == null) {
26923
+ if (isFocused.value && !controlsDisabled.value && Number(_inputText.value?.replace(decimalSeparator.value, '.')) === model.value) ; else if (model.value == null) {
26850
26924
  _inputText.value = null;
26851
26925
  } else if (!isNaN(model.value)) {
26852
26926
  _inputText.value = correctPrecision(model.value);
@@ -26941,6 +27015,7 @@ const VNumberInput = genericComponent()({
26941
27015
  if (!new RegExp(`^-?\\d*${escapeForRegex(decimalSeparator.value)}?\\d*$`).test(potentialNewInputVal)) {
26942
27016
  e.preventDefault();
26943
27017
  inputElement.value = potentialNewNumber;
27018
+ nextTick(() => inputText.value = potentialNewNumber);
26944
27019
  }
26945
27020
  if (props.precision == null) return;
26946
27021
 
@@ -26948,13 +27023,15 @@ const VNumberInput = genericComponent()({
26948
27023
  if (potentialNewInputVal.split(decimalSeparator.value)[1]?.length > props.precision) {
26949
27024
  e.preventDefault();
26950
27025
  inputElement.value = potentialNewNumber;
27026
+ nextTick(() => inputText.value = potentialNewNumber);
26951
27027
  const cursorPosition = (selectionStart ?? 0) + e.data.length;
26952
27028
  inputElement.setSelectionRange(cursorPosition, cursorPosition);
26953
27029
  }
26954
27030
  // Ignore decimal separator when precision = 0
26955
- if (props.precision === 0 && potentialNewInputVal.includes(decimalSeparator.value)) {
27031
+ if (props.precision === 0 && potentialNewInputVal.endsWith(decimalSeparator.value)) {
26956
27032
  e.preventDefault();
26957
27033
  inputElement.value = potentialNewNumber;
27034
+ nextTick(() => inputText.value = potentialNewNumber);
26958
27035
  }
26959
27036
  }
26960
27037
  async function onKeydown(e) {
@@ -28150,12 +28227,12 @@ const VSkeletonLoader = genericComponent()({
28150
28227
  ariaLabel: t(props.loadingText),
28151
28228
  role: 'alert'
28152
28229
  };
28153
- return createElementVNode(Fragment, null, [isLoading ? createElementVNode("div", mergeProps({
28230
+ return isLoading ? createElementVNode("div", mergeProps({
28154
28231
  "class": ['v-skeleton-loader', {
28155
28232
  'v-skeleton-loader--boilerplate': props.boilerplate
28156
28233
  }, themeClasses.value, backgroundColorClasses.value, elevationClasses.value],
28157
28234
  "style": [backgroundColorStyles.value, dimensionStyles.value]
28158
- }, loadingProps, attrs), [items.value]) : slots.default?.()]);
28235
+ }, loadingProps, attrs), [items.value]) : createElementVNode(Fragment, null, [slots.default?.()]);
28159
28236
  });
28160
28237
  return {};
28161
28238
  }
@@ -30020,6 +30097,10 @@ const VTextarea = genericComponent()({
30020
30097
  const vFieldRef = ref();
30021
30098
  const controlHeight = shallowRef('');
30022
30099
  const textareaRef = ref();
30100
+ const scrollbarWidth = ref(0);
30101
+ const {
30102
+ platform
30103
+ } = useDisplay();
30023
30104
  const autocomplete = useAutocomplete(props);
30024
30105
  const isActive = computed(() => props.persistentPlaceholder || isFocused.value || props.active);
30025
30106
  function onFocus() {
@@ -30064,6 +30145,18 @@ const VTextarea = genericComponent()({
30064
30145
  if (!props.autoGrow) rows.value = Number(props.rows);
30065
30146
  });
30066
30147
  function calculateInputHeight() {
30148
+ nextTick(() => {
30149
+ if (!textareaRef.value) return;
30150
+ if (platform.value.firefox) {
30151
+ scrollbarWidth.value = 12;
30152
+ return;
30153
+ }
30154
+ const {
30155
+ offsetWidth,
30156
+ clientWidth
30157
+ } = textareaRef.value;
30158
+ scrollbarWidth.value = Math.max(0, offsetWidth - clientWidth);
30159
+ });
30067
30160
  if (!props.autoGrow) return;
30068
30161
  nextTick(() => {
30069
30162
  if (!sizerRef.value || !vFieldRef.value) return;
@@ -30124,7 +30217,9 @@ const VTextarea = genericComponent()({
30124
30217
  'v-textarea--no-resize': props.noResize || props.autoGrow,
30125
30218
  'v-input--plain-underlined': isPlainOrUnderlined.value
30126
30219
  }, props.class],
30127
- "style": props.style
30220
+ "style": [{
30221
+ '--v-textarea-scroll-bar-width': convertToUnit(scrollbarWidth.value)
30222
+ }, props.style]
30128
30223
  }, rootAttrs, inputProps, {
30129
30224
  "centerAffix": rows.value === 1 && !isPlainOrUnderlined.value,
30130
30225
  "focused": isFocused.value
@@ -32279,7 +32374,7 @@ function createVuetify$1() {
32279
32374
  };
32280
32375
  });
32281
32376
  }
32282
- const version$1 = "3.10.4";
32377
+ const version$1 = "3.10.6";
32283
32378
  createVuetify$1.version = version$1;
32284
32379
 
32285
32380
  // Vue's inject() can only be used in setup
@@ -32304,7 +32399,7 @@ const createVuetify = function () {
32304
32399
  ...options
32305
32400
  });
32306
32401
  };
32307
- const version = "3.10.4";
32402
+ const version = "3.10.6";
32308
32403
  createVuetify.version = version;
32309
32404
 
32310
32405
  export { index as blueprints, components, createVuetify, directives, useDate, useDefaults, useDisplay, useGoTo, useHotkey, useLayout, useLocale, useMask, useRtl, useTheme, version };