vuetify 3.7.10 → 3.7.12

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 (61) hide show
  1. package/dist/json/attributes.json +3092 -3104
  2. package/dist/json/importMap-labs.json +28 -28
  3. package/dist/json/importMap.json +168 -168
  4. package/dist/json/tags.json +0 -3
  5. package/dist/json/web-types.json +6174 -6201
  6. package/dist/vuetify-labs.css +4937 -4936
  7. package/dist/vuetify-labs.d.ts +90 -165
  8. package/dist/vuetify-labs.esm.js +138 -110
  9. package/dist/vuetify-labs.esm.js.map +1 -1
  10. package/dist/vuetify-labs.js +137 -109
  11. package/dist/vuetify-labs.min.css +2 -2
  12. package/dist/vuetify.css +5080 -5079
  13. package/dist/vuetify.d.ts +131 -191
  14. package/dist/vuetify.esm.js +123 -104
  15. package/dist/vuetify.esm.js.map +1 -1
  16. package/dist/vuetify.js +122 -103
  17. package/dist/vuetify.js.map +1 -1
  18. package/dist/vuetify.min.css +2 -2
  19. package/dist/vuetify.min.js +935 -923
  20. package/dist/vuetify.min.js.map +1 -1
  21. package/lib/components/VAutocomplete/VAutocomplete.mjs +3 -12
  22. package/lib/components/VAutocomplete/VAutocomplete.mjs.map +1 -1
  23. package/lib/components/VAutocomplete/index.d.mts +25 -47
  24. package/lib/components/VCombobox/VCombobox.mjs +4 -14
  25. package/lib/components/VCombobox/VCombobox.mjs.map +1 -1
  26. package/lib/components/VCombobox/index.d.mts +25 -47
  27. package/lib/components/VDatePicker/VDatePickerMonth.mjs +2 -2
  28. package/lib/components/VDatePicker/VDatePickerMonth.mjs.map +1 -1
  29. package/lib/components/VDatePicker/index.d.mts +12 -24
  30. package/lib/components/VList/VList.mjs +1 -4
  31. package/lib/components/VList/VList.mjs.map +1 -1
  32. package/lib/components/VList/index.d.mts +7 -16
  33. package/lib/components/VOverlay/VOverlay.css +2 -1
  34. package/lib/components/VOverlay/VOverlay.sass +2 -1
  35. package/lib/components/VOverlay/_variables.scss +1 -1
  36. package/lib/components/VSelect/VSelect.mjs +5 -9
  37. package/lib/components/VSelect/VSelect.mjs.map +1 -1
  38. package/lib/components/VSelect/index.d.mts +25 -47
  39. package/lib/components/VSlider/slider.mjs +25 -12
  40. package/lib/components/VSlider/slider.mjs.map +1 -1
  41. package/lib/components/index.d.mts +73 -133
  42. package/lib/composables/calendar.mjs.map +1 -1
  43. package/lib/composables/list-items.mjs +70 -17
  44. package/lib/composables/list-items.mjs.map +1 -1
  45. package/lib/composables/nested/selectStrategies.mjs +6 -7
  46. package/lib/composables/nested/selectStrategies.mjs.map +1 -1
  47. package/lib/directives/ripple/index.mjs +7 -5
  48. package/lib/directives/ripple/index.mjs.map +1 -1
  49. package/lib/entry-bundler.mjs +1 -1
  50. package/lib/framework.mjs +1 -1
  51. package/lib/index.d.mts +58 -58
  52. package/lib/labs/VDateInput/VDateInput.mjs +17 -7
  53. package/lib/labs/VDateInput/VDateInput.mjs.map +1 -1
  54. package/lib/labs/VDateInput/index.d.mts +11 -17
  55. package/lib/labs/VTreeview/index.d.mts +7 -16
  56. package/lib/labs/components.d.mts +18 -33
  57. package/lib/util/helpers.mjs +3 -0
  58. package/lib/util/helpers.mjs.map +1 -1
  59. package/package.json +2 -2
  60. package/lib/composables/mousedown.mjs +0 -30
  61. package/lib/composables/mousedown.mjs.map +0 -1
@@ -1,10 +1,10 @@
1
1
  /*!
2
- * Vuetify v3.7.10
2
+ * Vuetify v3.7.12
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
6
6
 
7
- import { shallowRef, Fragment, reactive, computed, watchEffect, toRefs, capitalize, isVNode, Comment, unref, warn, getCurrentInstance as getCurrentInstance$1, ref, provide, inject as inject$1, defineComponent as defineComponent$1, camelize, h, onBeforeUnmount, watch, readonly, onDeactivated, onActivated, onMounted, onScopeDispose, effectScope, toRaw, createVNode, TransitionGroup, Transition, mergeProps, isRef, toRef, onBeforeMount, nextTick, withDirectives, resolveDirective, vShow, onUpdated, Text, resolveDynamicComponent, markRaw, Teleport, cloneVNode, onUnmounted, createTextVNode, onBeforeUpdate, withModifiers, toDisplayString, vModelText, resolveComponent, render } from 'vue';
7
+ import { shallowRef, Fragment, reactive, computed, watchEffect, toRefs, capitalize, isVNode, Comment, unref, warn, getCurrentInstance as getCurrentInstance$1, ref, provide, inject as inject$1, defineComponent as defineComponent$1, camelize, h, onBeforeUnmount, watch, readonly, onDeactivated, onActivated, onMounted, onScopeDispose, effectScope, toRaw, createVNode, TransitionGroup, Transition, mergeProps, isRef, toRef, onBeforeMount, nextTick, withDirectives, resolveDirective, vShow, onUpdated, Text, resolveDynamicComponent, markRaw, Teleport, cloneVNode, createTextVNode, onUnmounted, onBeforeUpdate, withModifiers, toDisplayString, vModelText, resolveComponent, render } from 'vue';
8
8
 
9
9
  // Types
10
10
  // eslint-disable-line vue/prefer-import-from-vue
@@ -577,6 +577,9 @@ function checkPrintable(e) {
577
577
  const noModifier = !e.ctrlKey && !e.metaKey && !e.altKey;
578
578
  return isPrintableChar && noModifier;
579
579
  }
580
+ function isPrimitive(value) {
581
+ return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint';
582
+ }
580
583
 
581
584
  // Utilities
582
585
  const block = ['top', 'bottom'];
@@ -5345,11 +5348,13 @@ const ripples = {
5345
5348
  animation.classList.add('v-ripple__animation--visible');
5346
5349
  transform(animation, `translate(${x}, ${y}) scale3d(${scale},${scale},${scale})`);
5347
5350
  animation.dataset.activated = String(performance.now());
5348
- setTimeout(() => {
5349
- animation.classList.remove('v-ripple__animation--enter');
5350
- animation.classList.add('v-ripple__animation--in');
5351
- transform(animation, `translate(${centerX}, ${centerY}) scale3d(1,1,1)`);
5352
- }, 0);
5351
+ requestAnimationFrame(() => {
5352
+ requestAnimationFrame(() => {
5353
+ animation.classList.remove('v-ripple__animation--enter');
5354
+ animation.classList.add('v-ripple__animation--in');
5355
+ transform(animation, `translate(${centerX}, ${centerY}) scale3d(1,1,1)`);
5356
+ });
5357
+ });
5353
5358
  },
5354
5359
  hide(el) {
5355
5360
  if (!el?._ripple?.enabled) return;
@@ -8344,12 +8349,12 @@ const independentSelectStrategy = mandatory => {
8344
8349
  return selected;
8345
8350
  },
8346
8351
  in: (v, children, parents) => {
8347
- let map = new Map();
8352
+ const map = new Map();
8348
8353
  for (const id of v || []) {
8349
- map = strategy.select({
8354
+ strategy.select({
8350
8355
  id,
8351
8356
  value: true,
8352
- selected: new Map(map),
8357
+ selected: map,
8353
8358
  children,
8354
8359
  parents
8355
8360
  });
@@ -8384,11 +8389,10 @@ const independentSingleSelectStrategy = mandatory => {
8384
8389
  });
8385
8390
  },
8386
8391
  in: (v, children, parents) => {
8387
- let map = new Map();
8388
8392
  if (v?.length) {
8389
- map = parentStrategy.in(v.slice(0, 1), children, parents);
8393
+ return parentStrategy.in(v.slice(0, 1), children, parents);
8390
8394
  }
8391
- return map;
8395
+ return new Map();
8392
8396
  },
8393
8397
  out: (v, children, parents) => {
8394
8398
  return parentStrategy.out(v, children, parents);
@@ -8491,7 +8495,7 @@ const classicSelectStrategy = mandatory => {
8491
8495
  map = strategy.select({
8492
8496
  id,
8493
8497
  value: true,
8494
- selected: new Map(map),
8498
+ selected: map,
8495
8499
  children,
8496
8500
  parents
8497
8501
  });
@@ -9375,10 +9379,7 @@ const makeItemsProps = propsFactory({
9375
9379
  default: 'props'
9376
9380
  },
9377
9381
  returnObject: Boolean,
9378
- valueComparator: {
9379
- type: Function,
9380
- default: deepEqual
9381
- }
9382
+ valueComparator: Function
9382
9383
  }, 'list-items');
9383
9384
  function transformItem$3(props, item) {
9384
9385
  const title = getPropertyFromItem(item, props.itemTitle, item);
@@ -9399,29 +9400,85 @@ function transformItem$3(props, item) {
9399
9400
  };
9400
9401
  }
9401
9402
  function transformItems$3(props, items) {
9403
+ const _props = pick(props, ['itemTitle', 'itemValue', 'itemChildren', 'itemProps', 'returnObject', 'valueComparator']);
9402
9404
  const array = [];
9403
9405
  for (const item of items) {
9404
- array.push(transformItem$3(props, item));
9406
+ array.push(transformItem$3(_props, item));
9405
9407
  }
9406
9408
  return array;
9407
9409
  }
9408
9410
  function useItems(props) {
9409
9411
  const items = computed(() => transformItems$3(props, props.items));
9410
9412
  const hasNullItem = computed(() => items.value.some(item => item.value === null));
9413
+ const itemsMap = shallowRef(new Map());
9414
+ const keylessItems = shallowRef([]);
9415
+ watchEffect(() => {
9416
+ const _items = items.value;
9417
+ const map = new Map();
9418
+ const keyless = [];
9419
+ for (let i = 0; i < _items.length; i++) {
9420
+ const item = _items[i];
9421
+ if (isPrimitive(item.value) || item.value === null) {
9422
+ let values = map.get(item.value);
9423
+ if (!values) {
9424
+ values = [];
9425
+ map.set(item.value, values);
9426
+ }
9427
+ values.push(item);
9428
+ } else {
9429
+ keyless.push(item);
9430
+ }
9431
+ }
9432
+ itemsMap.value = map;
9433
+ keylessItems.value = keyless;
9434
+ });
9411
9435
  function transformIn(value) {
9412
- if (!hasNullItem.value) {
9436
+ // Cache unrefed values outside the loop,
9437
+ // proxy getters can be slow when you call them a billion times
9438
+ const _value = toRaw(value);
9439
+ const _items = itemsMap.value;
9440
+ const _allItems = items.value;
9441
+ const _keylessItems = keylessItems.value;
9442
+ const _hasNullItem = hasNullItem.value;
9443
+ const _returnObject = props.returnObject;
9444
+ const hasValueComparator = !!props.valueComparator;
9445
+ const valueComparator = props.valueComparator || deepEqual;
9446
+ const _props = pick(props, ['itemTitle', 'itemValue', 'itemChildren', 'itemProps', 'returnObject', 'valueComparator']);
9447
+ const returnValue = [];
9448
+ main: for (const v of _value) {
9413
9449
  // When the model value is null, return an InternalItem
9414
9450
  // based on null only if null is one of the items
9415
- value = value.filter(v => v !== null);
9416
- }
9417
- return value.map(v => {
9418
- if (props.returnObject && typeof v === 'string') {
9419
- // String model value means value is a custom input value from combobox
9420
- // Don't look up existing items if the model value is a string
9421
- return transformItem$3(props, v);
9451
+ if (!_hasNullItem && v === null) continue;
9452
+
9453
+ // String model value means value is a custom input value from combobox
9454
+ // Don't look up existing items if the model value is a string
9455
+ if (_returnObject && typeof v === 'string') {
9456
+ returnValue.push(transformItem$3(_props, v));
9457
+ continue;
9422
9458
  }
9423
- return items.value.find(item => props.valueComparator(v, item.value)) || transformItem$3(props, v);
9424
- });
9459
+
9460
+ // Fast path, items with primitive values and no
9461
+ // custom valueComparator can use a constant-time
9462
+ // map lookup instead of searching the items array
9463
+ const fastItems = _items.get(v);
9464
+
9465
+ // Slow path, always use valueComparator.
9466
+ // This is O(n^2) so we really don't want to
9467
+ // do it for more than a couple hundred items.
9468
+ if (hasValueComparator || !fastItems) {
9469
+ for (const item of hasValueComparator ? _allItems : _keylessItems) {
9470
+ if (valueComparator(v, item.value)) {
9471
+ returnValue.push(item);
9472
+ continue main;
9473
+ }
9474
+ }
9475
+ // Not an existing item, construct it from the model (#4000)
9476
+ returnValue.push(transformItem$3(_props, v));
9477
+ continue;
9478
+ }
9479
+ returnValue.push(...fastItems);
9480
+ }
9481
+ return returnValue;
9425
9482
  }
9426
9483
  function transformOut(value) {
9427
9484
  return props.returnObject ? value.map(_ref => {
@@ -9445,9 +9502,6 @@ function useItems(props) {
9445
9502
 
9446
9503
  // Types
9447
9504
 
9448
- function isPrimitive(value) {
9449
- return typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
9450
- }
9451
9505
  function transformItem$2(props, item) {
9452
9506
  const type = getPropertyFromItem(item, props.itemType, 'item');
9453
9507
  const title = isPrimitive(item) ? item : getPropertyFromItem(item, props.itemTitle);
@@ -12400,34 +12454,6 @@ function useScrolling(listRef, textFieldRef) {
12400
12454
  }; // typescript doesn't know about vue's event merging
12401
12455
  }
12402
12456
 
12403
- // https://github.com/vuetifyjs/vuetify/issues/20003
12404
- /**
12405
- * This composable is designed to track whether the mouse is in a mousedown state at any given time. The original motivation is that
12406
- * it is impossible to distinguish whether a blur event is triggered by mousedown, keydown, or via JavaScript.
12407
- * This composable allows for conditional logic when a blur is triggered by mousedown.
12408
- */
12409
-
12410
- function useIsMousedown() {
12411
- const isMousedown = shallowRef(false);
12412
- function mousedown() {
12413
- isMousedown.value = true;
12414
- }
12415
- function mouseup() {
12416
- isMousedown.value = false;
12417
- }
12418
- onMounted(() => {
12419
- document.body.addEventListener('mousedown', mousedown);
12420
- document.body.addEventListener('mouseup', mouseup);
12421
- });
12422
- onUnmounted(() => {
12423
- document.body.removeEventListener('mousedown', mousedown);
12424
- document.body.removeEventListener('mouseup', mouseup);
12425
- });
12426
- return {
12427
- isMousedown
12428
- };
12429
- }
12430
-
12431
12457
  // Types
12432
12458
 
12433
12459
  const makeSelectProps = propsFactory({
@@ -12517,9 +12543,6 @@ const VSelect = genericComponent()({
12517
12543
  return typeof props.counterValue === 'function' ? props.counterValue(model.value) : typeof props.counterValue === 'number' ? props.counterValue : model.value.length;
12518
12544
  });
12519
12545
  const form = useForm(props);
12520
- const {
12521
- isMousedown
12522
- } = useIsMousedown();
12523
12546
  const selectedValues = computed(() => model.value.map(selection => selection.value));
12524
12547
  const isFocused = shallowRef(false);
12525
12548
  const label = computed(() => menu.value ? props.closeText : props.openText);
@@ -12527,7 +12550,7 @@ const VSelect = genericComponent()({
12527
12550
  let keyboardLookupLastTime;
12528
12551
  const displayItems = computed(() => {
12529
12552
  if (props.hideSelected) {
12530
- return items.value.filter(item => !model.value.some(s => props.valueComparator(s, item)));
12553
+ return items.value.filter(item => !model.value.some(s => (props.valueComparator || deepEqual)(s, item)));
12531
12554
  }
12532
12555
  return items.value;
12533
12556
  });
@@ -12599,7 +12622,7 @@ const VSelect = genericComponent()({
12599
12622
  let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
12600
12623
  if (item.props.disabled) return;
12601
12624
  if (props.multiple) {
12602
- const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value));
12625
+ const index = model.value.findIndex(selection => (props.valueComparator || deepEqual)(selection.value, item.value));
12603
12626
  const add = set == null ? !~index : set;
12604
12627
  if (~index) {
12605
12628
  const value = add ? [...model.value, item] : [...model.value];
@@ -12617,7 +12640,7 @@ const VSelect = genericComponent()({
12617
12640
  }
12618
12641
  }
12619
12642
  function onBlur(e) {
12620
- if (!listRef.value?.$el.contains(e.relatedTarget) && !isMousedown.value) {
12643
+ if (!listRef.value?.$el.contains(e.relatedTarget)) {
12621
12644
  menu.value = false;
12622
12645
  }
12623
12646
  }
@@ -12646,7 +12669,7 @@ const VSelect = genericComponent()({
12646
12669
  }
12647
12670
  watch(menu, () => {
12648
12671
  if (!props.hideSelected && menu.value && model.value.length) {
12649
- const index = displayItems.value.findIndex(item => model.value.some(s => props.valueComparator(s.value, item.value)));
12672
+ const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
12650
12673
  IN_BROWSER && window.requestAnimationFrame(() => {
12651
12674
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
12652
12675
  });
@@ -13029,9 +13052,6 @@ const VAutocomplete = genericComponent()({
13029
13052
  textColorClasses,
13030
13053
  textColorStyles
13031
13054
  } = useTextColor(color);
13032
- const {
13033
- isMousedown
13034
- } = useIsMousedown();
13035
13055
  const search = useProxiedModel(props, 'search', '');
13036
13056
  const model = useProxiedModel(props, 'modelValue', [], v => transformIn(v === null ? [null] : wrapInArray(v)), v => {
13037
13057
  const transformed = transformOut(v);
@@ -13181,7 +13201,7 @@ const VAutocomplete = genericComponent()({
13181
13201
  let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
13182
13202
  if (!item || item.props.disabled) return;
13183
13203
  if (props.multiple) {
13184
- const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value));
13204
+ const index = model.value.findIndex(selection => (props.valueComparator || deepEqual)(selection.value, item.value));
13185
13205
  const add = set == null ? !~index : set;
13186
13206
  if (~index) {
13187
13207
  const value = add ? [...model.value, item] : [...model.value];
@@ -13205,11 +13225,6 @@ const VAutocomplete = genericComponent()({
13205
13225
  });
13206
13226
  }
13207
13227
  }
13208
- function onBlur(e) {
13209
- if (!isMousedown.value) {
13210
- menu.value = false;
13211
- }
13212
- }
13213
13228
  watch(isFocused, (val, oldVal) => {
13214
13229
  if (val === oldVal) return;
13215
13230
  if (val) {
@@ -13219,6 +13234,7 @@ const VAutocomplete = genericComponent()({
13219
13234
  nextTick(() => isSelecting.value = false);
13220
13235
  } else {
13221
13236
  if (!props.multiple && search.value == null) model.value = [];
13237
+ menu.value = false;
13222
13238
  if (!model.value.some(_ref3 => {
13223
13239
  let {
13224
13240
  title
@@ -13272,7 +13288,6 @@ const VAutocomplete = genericComponent()({
13272
13288
  "readonly": form.isReadonly.value,
13273
13289
  "placeholder": isDirty ? undefined : props.placeholder,
13274
13290
  "onClick:clear": onClear,
13275
- "onBlur": onBlur,
13276
13291
  "onMousedown:control": onMousedownControl,
13277
13292
  "onKeydown": onKeydown
13278
13293
  }), {
@@ -15575,6 +15590,8 @@ const useSlider = _ref => {
15575
15590
  const trackContainerRef = ref();
15576
15591
  const activeThumbRef = ref();
15577
15592
  function parseMouseMove(e) {
15593
+ const el = trackContainerRef.value?.$el;
15594
+ if (!el) return;
15578
15595
  const vertical = props.direction === 'vertical';
15579
15596
  const start = vertical ? 'top' : 'left';
15580
15597
  const length = vertical ? 'height' : 'width';
@@ -15582,7 +15599,7 @@ const useSlider = _ref => {
15582
15599
  const {
15583
15600
  [start]: trackStart,
15584
15601
  [length]: trackLength
15585
- } = trackContainerRef.value?.$el.getBoundingClientRect();
15602
+ } = el.getBoundingClientRect();
15586
15603
  const clickOffset = getPosition(e, position);
15587
15604
 
15588
15605
  // It is possible for left to be NaN, force to number
@@ -15591,13 +15608,17 @@ const useSlider = _ref => {
15591
15608
  return roundValue(min.value + clickPos * (max.value - min.value));
15592
15609
  }
15593
15610
  const handleStop = e => {
15594
- onSliderEnd({
15595
- value: parseMouseMove(e)
15596
- });
15611
+ const value = parseMouseMove(e);
15612
+ if (value != null) {
15613
+ onSliderEnd({
15614
+ value
15615
+ });
15616
+ }
15597
15617
  mousePressed.value = false;
15598
15618
  startOffset.value = 0;
15599
15619
  };
15600
15620
  const handleStart = e => {
15621
+ const value = parseMouseMove(e);
15601
15622
  activeThumbRef.value = getActiveThumb(e);
15602
15623
  if (!activeThumbRef.value) return;
15603
15624
  mousePressed.value = true;
@@ -15605,13 +15626,17 @@ const useSlider = _ref => {
15605
15626
  startOffset.value = getOffset(e, activeThumbRef.value, props.direction);
15606
15627
  } else {
15607
15628
  startOffset.value = 0;
15608
- onSliderMove({
15609
- value: parseMouseMove(e)
15629
+ if (value != null) {
15630
+ onSliderMove({
15631
+ value
15632
+ });
15633
+ }
15634
+ }
15635
+ if (value != null) {
15636
+ onSliderStart({
15637
+ value
15610
15638
  });
15611
15639
  }
15612
- onSliderStart({
15613
- value: parseMouseMove(e)
15614
- });
15615
15640
  nextTick(() => activeThumbRef.value?.focus());
15616
15641
  };
15617
15642
  const moveListenerOptions = {
@@ -15619,9 +15644,12 @@ const useSlider = _ref => {
15619
15644
  capture: true
15620
15645
  };
15621
15646
  function onMouseMove(e) {
15622
- onSliderMove({
15623
- value: parseMouseMove(e)
15624
- });
15647
+ const value = parseMouseMove(e);
15648
+ if (value != null) {
15649
+ onSliderMove({
15650
+ value
15651
+ });
15652
+ }
15625
15653
  }
15626
15654
  function onSliderMouseUp(e) {
15627
15655
  e.stopPropagation();
@@ -16892,9 +16920,6 @@ const VCombobox = genericComponent()({
16892
16920
  return props.multiple ? transformed : transformed[0] ?? null;
16893
16921
  });
16894
16922
  const form = useForm(props);
16895
- const {
16896
- isMousedown
16897
- } = useIsMousedown();
16898
16923
  const hasChips = computed(() => !!(props.chips || slots.chip));
16899
16924
  const hasSelectionSlot = computed(() => hasChips.value || !!slots.selection);
16900
16925
  const _search = shallowRef(!props.multiple && !hasSelectionSlot.value ? model.value[0]?.title ?? '' : '');
@@ -17058,18 +17083,12 @@ const VCombobox = genericComponent()({
17058
17083
  vTextFieldRef.value?.focus();
17059
17084
  }
17060
17085
  }
17061
- function onBlur(e) {
17062
- if (!isMousedown.value) {
17063
- menu.value = false;
17064
- }
17065
- }
17066
-
17067
17086
  /** @param set - null means toggle */
17068
17087
  function select(item) {
17069
17088
  let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
17070
17089
  if (!item || item.props.disabled) return;
17071
17090
  if (props.multiple) {
17072
- const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value));
17091
+ const index = model.value.findIndex(selection => (props.valueComparator || deepEqual)(selection.value, item.value));
17073
17092
  const add = set == null ? !~index : set;
17074
17093
  if (~index) {
17075
17094
  const value = add ? [...model.value, item] : [...model.value];
@@ -17108,6 +17127,7 @@ const VCombobox = genericComponent()({
17108
17127
  watch(isFocused, (val, oldVal) => {
17109
17128
  if (val || val === oldVal) return;
17110
17129
  selectionIndex.value = -1;
17130
+ menu.value = false;
17111
17131
  if (search.value) {
17112
17132
  if (props.multiple) {
17113
17133
  select(transformItem$3(props, search.value));
@@ -17128,7 +17148,7 @@ const VCombobox = genericComponent()({
17128
17148
  });
17129
17149
  watch(menu, () => {
17130
17150
  if (!props.hideSelected && menu.value && model.value.length) {
17131
- const index = displayItems.value.findIndex(item => model.value.some(s => props.valueComparator(s.value, item.value)));
17151
+ const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
17132
17152
  IN_BROWSER && window.requestAnimationFrame(() => {
17133
17153
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
17134
17154
  });
@@ -17165,7 +17185,6 @@ const VCombobox = genericComponent()({
17165
17185
  "readonly": form.isReadonly.value,
17166
17186
  "placeholder": isDirty ? undefined : props.placeholder,
17167
17187
  "onClick:clear": onClear,
17168
- "onBlur": onBlur,
17169
17188
  "onMousedown:control": onMousedownControl,
17170
17189
  "onKeydown": onKeydown
17171
17190
  }), {
@@ -21763,7 +21782,7 @@ const makeVDatePickerMonthProps = propsFactory({
21763
21782
  type: String,
21764
21783
  default: 'picker-reverse-transition'
21765
21784
  },
21766
- ...makeCalendarProps()
21785
+ ...omit(makeCalendarProps(), ['displayValue'])
21767
21786
  }, 'VDatePickerMonth');
21768
21787
  const VDatePickerMonth = genericComponent()({
21769
21788
  name: 'VDatePickerMonth',
@@ -28172,7 +28191,7 @@ const makeVDateInputProps = propsFactory({
28172
28191
  ...omit(makeVDatePickerProps({
28173
28192
  weeksInMonth: 'dynamic',
28174
28193
  hideHeader: true
28175
- }), ['active', 'location'])
28194
+ }), ['active', 'location', 'rounded'])
28176
28195
  }, 'VDateInput');
28177
28196
  const VDateInput = genericComponent()({
28178
28197
  name: 'VDateInput',
@@ -28193,8 +28212,9 @@ const VDateInput = genericComponent()({
28193
28212
  focus,
28194
28213
  blur
28195
28214
  } = useFocus(props);
28196
- const model = useProxiedModel(props, 'modelValue', props.multiple ? [] : null);
28215
+ const model = useProxiedModel(props, 'modelValue', props.multiple ? [] : null, val => Array.isArray(val) ? val.map(item => adapter.toJsDate(item)) : val ? adapter.toJsDate(val) : val, val => Array.isArray(val) ? val.map(item => adapter.date(item)) : val ? adapter.date(val) : val);
28197
28216
  const menu = shallowRef(false);
28217
+ const vDateInputRef = ref();
28198
28218
  const display = computed(() => {
28199
28219
  const value = wrapInArray(model.value);
28200
28220
  if (!value.length) return null;
@@ -28216,7 +28236,7 @@ const VDateInput = genericComponent()({
28216
28236
  return;
28217
28237
  }
28218
28238
  const target = e.target;
28219
- model.value = adapter.date(target.value);
28239
+ model.value = target.value;
28220
28240
  }
28221
28241
  function onClick(e) {
28222
28242
  e.preventDefault();
@@ -28226,11 +28246,17 @@ const VDateInput = genericComponent()({
28226
28246
  function onSave() {
28227
28247
  menu.value = false;
28228
28248
  }
28249
+ function onUpdateModel(value) {
28250
+ if (value != null) return;
28251
+ model.value = null;
28252
+ }
28229
28253
  useRender(() => {
28230
28254
  const confirmEditProps = VConfirmEdit.filterProps(props);
28231
- const datePickerProps = VDatePicker.filterProps(omit(props, ['active', 'location']));
28255
+ const datePickerProps = VDatePicker.filterProps(omit(props, ['active', 'location', 'rounded']));
28232
28256
  const textFieldProps = VTextField.filterProps(props);
28233
- return createVNode(VTextField, mergeProps(textFieldProps, {
28257
+ return createVNode(VTextField, mergeProps({
28258
+ "ref": vDateInputRef
28259
+ }, textFieldProps, {
28234
28260
  "class": props.class,
28235
28261
  "style": props.style,
28236
28262
  "modelValue": display.value,
@@ -28239,7 +28265,8 @@ const VDateInput = genericComponent()({
28239
28265
  "onFocus": focus,
28240
28266
  "onBlur": blur,
28241
28267
  "onClick:control": isInteractive.value ? onClick : undefined,
28242
- "onClick:prepend": isInteractive.value ? onClick : undefined
28268
+ "onClick:prepend": isInteractive.value ? onClick : undefined,
28269
+ "onUpdate:modelValue": onUpdateModel
28243
28270
  }), {
28244
28271
  default: () => [createVNode(VMenu, {
28245
28272
  "modelValue": menu.value,
@@ -28287,6 +28314,7 @@ const VDateInput = genericComponent()({
28287
28314
  }), slots.default?.()]
28288
28315
  });
28289
28316
  });
28317
+ return forwardRefs({}, vDateInputRef);
28290
28318
  }
28291
28319
  });
28292
28320
 
@@ -30865,7 +30893,7 @@ function createVuetify$1() {
30865
30893
  goTo
30866
30894
  };
30867
30895
  }
30868
- const version$1 = "3.7.10";
30896
+ const version$1 = "3.7.12";
30869
30897
  createVuetify$1.version = version$1;
30870
30898
 
30871
30899
  // Vue's inject() can only be used in setup
@@ -31118,7 +31146,7 @@ var index = /*#__PURE__*/Object.freeze({
31118
31146
 
31119
31147
  /* eslint-disable local-rules/sort-imports */
31120
31148
 
31121
- const version = "3.7.10";
31149
+ const version = "3.7.12";
31122
31150
 
31123
31151
  /* eslint-disable local-rules/sort-imports */
31124
31152