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
package/dist/vuetify.js CHANGED
@@ -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
  */
@@ -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
  };
@@ -10038,7 +10056,7 @@
10038
10056
  const isLink = vue.toRef(() => props.link !== false && link.isLink.value);
10039
10057
  const isSelectable = vue.computed(() => !!list && (root.selectable.value || root.activatable.value || props.value != null));
10040
10058
  const isClickable = vue.computed(() => !props.disabled && props.link !== false && (props.link || link.isClickable.value || isSelectable.value));
10041
- const role = vue.computed(() => list ? isSelectable.value ? 'option' : 'listitem' : undefined);
10059
+ const role = vue.computed(() => list ? isLink.value ? 'link' : isSelectable.value ? 'option' : 'listitem' : undefined);
10042
10060
  const ariaSelected = vue.computed(() => {
10043
10061
  if (!isSelectable.value) return undefined;
10044
10062
  return root.activatable.value ? isActivated.value : root.selectable.value ? isSelected.value : isActive.value;
@@ -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), {
@@ -21879,6 +21955,7 @@
21879
21955
  },
21880
21956
  /** @deprecated */
21881
21957
  sticky: Boolean,
21958
+ ...makeDensityProps(),
21882
21959
  ...makeDisplayProps(),
21883
21960
  ...makeLoaderProps()
21884
21961
  }, 'VDataTableHeaders');
@@ -22003,6 +22080,7 @@
22003
22080
  if (isEmpty) return '';
22004
22081
  if (column.key === 'data-table-select') {
22005
22082
  return slots['header.data-table-select']?.(columnSlotProps) ?? (showSelectAll.value && vue.createVNode(VCheckboxBtn, {
22083
+ "density": props.density,
22006
22084
  "modelValue": allSelected.value,
22007
22085
  "indeterminate": someSelected.value && !allSelected.value,
22008
22086
  "onUpdate:modelValue": selectAll
@@ -22103,7 +22181,8 @@
22103
22181
  groupExpandIcon: {
22104
22182
  type: IconValue,
22105
22183
  default: '$tableGroupExpand'
22106
- }
22184
+ },
22185
+ ...makeDensityProps()
22107
22186
  }, 'VDataTableGroupHeaderRow');
22108
22187
  const VDataTableGroupHeaderRow = genericComponent()({
22109
22188
  name: 'VDataTableGroupHeaderRow',
@@ -22171,6 +22250,7 @@
22171
22250
  "noPadding": true
22172
22251
  }, {
22173
22252
  default: () => [vue.createVNode(VCheckboxBtn, {
22253
+ "density": props.density,
22174
22254
  "modelValue": modelValue,
22175
22255
  "indeterminate": indeterminate,
22176
22256
  "onUpdate:modelValue": selectGroup
@@ -22199,6 +22279,7 @@
22199
22279
  onClick: EventProp(),
22200
22280
  onContextmenu: EventProp(),
22201
22281
  onDblclick: EventProp(),
22282
+ ...makeDensityProps(),
22202
22283
  ...makeDisplayProps()
22203
22284
  }, 'VDataTableRow');
22204
22285
  const VDataTableRow = genericComponent()({
@@ -22307,6 +22388,7 @@
22307
22388
  }
22308
22389
  }) ?? vue.createVNode(VCheckboxBtn, {
22309
22390
  "disabled": !item.selectable,
22391
+ "density": props.density,
22310
22392
  "modelValue": isSelected([item]),
22311
22393
  "onClick": vue.withModifiers(event => toggleSelect(item, props.index, event), ['stop'])
22312
22394
  }, null);
@@ -22359,8 +22441,8 @@
22359
22441
  },
22360
22442
  rowProps: [Object, Function],
22361
22443
  cellProps: [Object, Function],
22362
- ...pick(makeVDataTableRowProps(), ['collapseIcon', 'expandIcon']),
22363
- ...pick(makeVDataTableGroupHeaderRowProps(), ['groupCollapseIcon', 'groupExpandIcon']),
22444
+ ...pick(makeVDataTableRowProps(), ['collapseIcon', 'expandIcon', 'density']),
22445
+ ...pick(makeVDataTableGroupHeaderRowProps(), ['groupCollapseIcon', 'groupExpandIcon', 'density']),
22364
22446
  ...makeDisplayProps()
22365
22447
  }, 'VDataTableRows');
22366
22448
  const VDataTableRows = genericComponent()({
@@ -22395,7 +22477,7 @@
22395
22477
  mobile
22396
22478
  } = useDisplay(props);
22397
22479
  useRender(() => {
22398
- const groupHeaderRowProps = pick(props, ['groupCollapseIcon', 'groupExpandIcon']);
22480
+ const groupHeaderRowProps = pick(props, ['groupCollapseIcon', 'groupExpandIcon', 'density']);
22399
22481
  if (props.loading && (!props.items.length || slots.loading)) {
22400
22482
  return vue.createElementVNode("tr", {
22401
22483
  "class": "v-data-table-rows-loading",
@@ -22461,6 +22543,7 @@
22461
22543
  cellProps: props.cellProps,
22462
22544
  collapseIcon: props.collapseIcon,
22463
22545
  expandIcon: props.expandIcon,
22546
+ density: props.density,
22464
22547
  mobile: mobile.value
22465
22548
  }, getPrefixedEventHandlers(attrs, ':row', () => slotProps), typeof props.rowProps === 'function' ? props.rowProps({
22466
22549
  item: slotProps.item,
@@ -22477,6 +22560,8 @@
22477
22560
  }
22478
22561
  });
22479
22562
 
22563
+ // Types
22564
+
22480
22565
  const makeVTableProps = propsFactory({
22481
22566
  fixedHeader: Boolean,
22482
22567
  fixedFooter: Boolean,
@@ -22506,37 +22591,26 @@
22506
22591
  const {
22507
22592
  densityClasses
22508
22593
  } = useDensity(props);
22509
- useRender(() => {
22510
- const tableContentDefaults = {
22511
- VCheckboxBtn: {
22512
- density: props.density
22594
+ useRender(() => vue.createVNode(props.tag, {
22595
+ "class": vue.normalizeClass(['v-table', {
22596
+ 'v-table--fixed-height': !!props.height,
22597
+ 'v-table--fixed-header': props.fixedHeader,
22598
+ 'v-table--fixed-footer': props.fixedFooter,
22599
+ 'v-table--has-top': !!slots.top,
22600
+ 'v-table--has-bottom': !!slots.bottom,
22601
+ 'v-table--hover': props.hover,
22602
+ 'v-table--striped-even': props.striped === 'even',
22603
+ 'v-table--striped-odd': props.striped === 'odd'
22604
+ }, themeClasses.value, densityClasses.value, props.class]),
22605
+ "style": vue.normalizeStyle(props.style)
22606
+ }, {
22607
+ default: () => [slots.top?.(), slots.default ? vue.createElementVNode("div", {
22608
+ "class": "v-table__wrapper",
22609
+ "style": {
22610
+ height: convertToUnit(props.height)
22513
22611
  }
22514
- };
22515
- return vue.createVNode(props.tag, {
22516
- "class": vue.normalizeClass(['v-table', {
22517
- 'v-table--fixed-height': !!props.height,
22518
- 'v-table--fixed-header': props.fixedHeader,
22519
- 'v-table--fixed-footer': props.fixedFooter,
22520
- 'v-table--has-top': !!slots.top,
22521
- 'v-table--has-bottom': !!slots.bottom,
22522
- 'v-table--hover': props.hover,
22523
- 'v-table--striped-even': props.striped === 'even',
22524
- 'v-table--striped-odd': props.striped === 'odd'
22525
- }, themeClasses.value, densityClasses.value, props.class]),
22526
- "style": vue.normalizeStyle(props.style)
22527
- }, {
22528
- default: () => [slots.top?.(), vue.createVNode(VDefaultsProvider, {
22529
- "defaults": tableContentDefaults
22530
- }, {
22531
- default: () => [slots.default ? vue.createElementVNode("div", {
22532
- "class": "v-table__wrapper",
22533
- "style": {
22534
- height: convertToUnit(props.height)
22535
- }
22536
- }, [vue.createElementVNode("table", null, [slots.default()])]) : slots.wrapper?.()]
22537
- }), slots.bottom?.()]
22538
- });
22539
- });
22612
+ }, [vue.createElementVNode("table", null, [slots.default()])]) : slots.wrapper?.(), slots.bottom?.()]
22613
+ }));
22540
22614
  return {};
22541
22615
  }
22542
22616
  });
@@ -24347,7 +24421,7 @@
24347
24421
  function isAllowedInRange(start, end) {
24348
24422
  const allowedDates = props.allowedDates;
24349
24423
  if (typeof allowedDates !== 'function') return true;
24350
- 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');
24351
24425
  for (let i = 0; i < days; i++) {
24352
24426
  if (allowedDates(adapter.addDays(start, i))) return true;
24353
24427
  }
@@ -26850,7 +26924,7 @@
26850
26924
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
26851
26925
  const _inputText = vue.shallowRef(null);
26852
26926
  vue.watchEffect(() => {
26853
- 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) {
26854
26928
  _inputText.value = null;
26855
26929
  } else if (!isNaN(model.value)) {
26856
26930
  _inputText.value = correctPrecision(model.value);
@@ -26945,6 +27019,7 @@
26945
27019
  if (!new RegExp(`^-?\\d*${escapeForRegex(decimalSeparator.value)}?\\d*$`).test(potentialNewInputVal)) {
26946
27020
  e.preventDefault();
26947
27021
  inputElement.value = potentialNewNumber;
27022
+ vue.nextTick(() => inputText.value = potentialNewNumber);
26948
27023
  }
26949
27024
  if (props.precision == null) return;
26950
27025
 
@@ -26952,13 +27027,15 @@
26952
27027
  if (potentialNewInputVal.split(decimalSeparator.value)[1]?.length > props.precision) {
26953
27028
  e.preventDefault();
26954
27029
  inputElement.value = potentialNewNumber;
27030
+ vue.nextTick(() => inputText.value = potentialNewNumber);
26955
27031
  const cursorPosition = (selectionStart ?? 0) + e.data.length;
26956
27032
  inputElement.setSelectionRange(cursorPosition, cursorPosition);
26957
27033
  }
26958
27034
  // Ignore decimal separator when precision = 0
26959
- if (props.precision === 0 && potentialNewInputVal.includes(decimalSeparator.value)) {
27035
+ if (props.precision === 0 && potentialNewInputVal.endsWith(decimalSeparator.value)) {
26960
27036
  e.preventDefault();
26961
27037
  inputElement.value = potentialNewNumber;
27038
+ vue.nextTick(() => inputText.value = potentialNewNumber);
26962
27039
  }
26963
27040
  }
26964
27041
  async function onKeydown(e) {
@@ -28154,12 +28231,12 @@
28154
28231
  ariaLabel: t(props.loadingText),
28155
28232
  role: 'alert'
28156
28233
  };
28157
- return vue.createElementVNode(vue.Fragment, null, [isLoading ? vue.createElementVNode("div", vue.mergeProps({
28234
+ return isLoading ? vue.createElementVNode("div", vue.mergeProps({
28158
28235
  "class": ['v-skeleton-loader', {
28159
28236
  'v-skeleton-loader--boilerplate': props.boilerplate
28160
28237
  }, themeClasses.value, backgroundColorClasses.value, elevationClasses.value],
28161
28238
  "style": [backgroundColorStyles.value, dimensionStyles.value]
28162
- }, loadingProps, attrs), [items.value]) : slots.default?.()]);
28239
+ }, loadingProps, attrs), [items.value]) : vue.createElementVNode(vue.Fragment, null, [slots.default?.()]);
28163
28240
  });
28164
28241
  return {};
28165
28242
  }
@@ -30024,6 +30101,10 @@
30024
30101
  const vFieldRef = vue.ref();
30025
30102
  const controlHeight = vue.shallowRef('');
30026
30103
  const textareaRef = vue.ref();
30104
+ const scrollbarWidth = vue.ref(0);
30105
+ const {
30106
+ platform
30107
+ } = useDisplay();
30027
30108
  const autocomplete = useAutocomplete(props);
30028
30109
  const isActive = vue.computed(() => props.persistentPlaceholder || isFocused.value || props.active);
30029
30110
  function onFocus() {
@@ -30068,6 +30149,18 @@
30068
30149
  if (!props.autoGrow) rows.value = Number(props.rows);
30069
30150
  });
30070
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
+ });
30071
30164
  if (!props.autoGrow) return;
30072
30165
  vue.nextTick(() => {
30073
30166
  if (!sizerRef.value || !vFieldRef.value) return;
@@ -30128,7 +30221,9 @@
30128
30221
  'v-textarea--no-resize': props.noResize || props.autoGrow,
30129
30222
  'v-input--plain-underlined': isPlainOrUnderlined.value
30130
30223
  }, props.class],
30131
- "style": props.style
30224
+ "style": [{
30225
+ '--v-textarea-scroll-bar-width': convertToUnit(scrollbarWidth.value)
30226
+ }, props.style]
30132
30227
  }, rootAttrs, inputProps, {
30133
30228
  "centerAffix": rows.value === 1 && !isPlainOrUnderlined.value,
30134
30229
  "focused": isFocused.value
@@ -32283,7 +32378,7 @@
32283
32378
  };
32284
32379
  });
32285
32380
  }
32286
- const version$1 = "3.10.4";
32381
+ const version$1 = "3.10.6";
32287
32382
  createVuetify$1.version = version$1;
32288
32383
 
32289
32384
  // Vue's inject() can only be used in setup
@@ -32308,7 +32403,7 @@
32308
32403
  ...options
32309
32404
  });
32310
32405
  };
32311
- const version = "3.10.4";
32406
+ const version = "3.10.6";
32312
32407
  createVuetify.version = version;
32313
32408
 
32314
32409
  exports.blueprints = index;