vuetify 3.3.15 → 3.3.16

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 (78) hide show
  1. package/dist/json/attributes.json +427 -403
  2. package/dist/json/importMap.json +4 -4
  3. package/dist/json/tags.json +1 -0
  4. package/dist/json/web-types.json +908 -879
  5. package/dist/vuetify-labs.css +245 -240
  6. package/dist/vuetify-labs.d.ts +162 -144
  7. package/dist/vuetify-labs.esm.js +121 -136
  8. package/dist/vuetify-labs.esm.js.map +1 -1
  9. package/dist/vuetify-labs.js +121 -136
  10. package/dist/vuetify-labs.min.css +2 -2
  11. package/dist/vuetify.css +92 -88
  12. package/dist/vuetify.d.ts +99 -81
  13. package/dist/vuetify.esm.js +113 -130
  14. package/dist/vuetify.esm.js.map +1 -1
  15. package/dist/vuetify.js +113 -130
  16. package/dist/vuetify.js.map +1 -1
  17. package/dist/vuetify.min.css +2 -2
  18. package/dist/vuetify.min.js +223 -224
  19. package/dist/vuetify.min.js.map +1 -1
  20. package/lib/blueprints/index.d.mts +2 -0
  21. package/lib/blueprints/md1.d.mts +2 -0
  22. package/lib/blueprints/md2.d.mts +2 -0
  23. package/lib/blueprints/md3.d.mts +2 -0
  24. package/lib/components/VAutocomplete/VAutocomplete.mjs +16 -26
  25. package/lib/components/VAutocomplete/VAutocomplete.mjs.map +1 -1
  26. package/lib/components/VAutocomplete/index.d.mts +40 -38
  27. package/lib/components/VColorPicker/VColorPickerCanvas.css +1 -0
  28. package/lib/components/VColorPicker/VColorPickerCanvas.mjs +28 -34
  29. package/lib/components/VColorPicker/VColorPickerCanvas.mjs.map +1 -1
  30. package/lib/components/VColorPicker/VColorPickerCanvas.sass +1 -0
  31. package/lib/components/VCombobox/VCombobox.mjs +15 -25
  32. package/lib/components/VCombobox/VCombobox.mjs.map +1 -1
  33. package/lib/components/VCombobox/index.d.mts +40 -38
  34. package/lib/components/VField/VField.css +3 -2
  35. package/lib/components/VField/VField.sass +3 -2
  36. package/lib/components/VLabel/VLabel.css +1 -0
  37. package/lib/components/VLabel/VLabel.sass +1 -0
  38. package/lib/components/VLabel/_variables.scss +1 -1
  39. package/lib/components/VList/index.d.mts +21 -3
  40. package/lib/components/VSelect/VSelect.mjs +9 -23
  41. package/lib/components/VSelect/VSelect.mjs.map +1 -1
  42. package/lib/components/VSelect/index.d.mts +14 -11
  43. package/lib/components/VSelectionControl/VSelectionControl.css +1 -1
  44. package/lib/components/VSelectionControl/VSelectionControl.sass +1 -1
  45. package/lib/components/VTabs/VTab.css +1 -0
  46. package/lib/components/VTabs/VTab.mjs +2 -3
  47. package/lib/components/VTabs/VTab.mjs.map +1 -1
  48. package/lib/components/VTabs/VTab.sass +1 -0
  49. package/lib/components/VTabs/_variables.scss +1 -0
  50. package/lib/components/index.d.mts +96 -80
  51. package/lib/composables/filter.mjs +4 -4
  52. package/lib/composables/filter.mjs.map +1 -1
  53. package/lib/composables/list-items.mjs +26 -15
  54. package/lib/composables/list-items.mjs.map +1 -1
  55. package/lib/entry-bundler.mjs +1 -1
  56. package/lib/framework.mjs +1 -1
  57. package/lib/index.d.mts +3 -1
  58. package/lib/labs/VBottomSheet/VBottomSheet.css +1 -0
  59. package/lib/labs/VBottomSheet/VBottomSheet.sass +2 -0
  60. package/lib/labs/VBottomSheet/_variables.scss +1 -0
  61. package/lib/labs/VDataIterator/index.d.mts +30 -26
  62. package/lib/labs/VDataTable/index.d.mts +43 -39
  63. package/lib/labs/VDataTable/types.mjs.map +1 -1
  64. package/lib/labs/VDatePicker/VDatePicker.mjs +4 -2
  65. package/lib/labs/VDatePicker/VDatePicker.mjs.map +1 -1
  66. package/lib/labs/VDatePicker/VDatePickerControls.mjs +4 -4
  67. package/lib/labs/VDatePicker/VDatePickerControls.mjs.map +1 -1
  68. package/lib/labs/VDatePicker/VDatePickerYears.css +1 -1
  69. package/lib/labs/VDatePicker/VDatePickerYears.sass +1 -1
  70. package/lib/labs/VDatePicker/index.d.mts +24 -24
  71. package/lib/labs/VDateRangePicker/index.d.mts +8 -8
  72. package/lib/labs/components.d.mts +80 -76
  73. package/lib/labs/date/DateAdapter.mjs.map +1 -1
  74. package/lib/labs/date/adapters/vuetify.d.mts +4 -0
  75. package/lib/labs/date/adapters/vuetify.mjs +13 -0
  76. package/lib/labs/date/adapters/vuetify.mjs.map +1 -1
  77. package/lib/labs/date/index.d.mts +4 -0
  78. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.3.15
2
+ * Vuetify v3.3.16
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -7985,11 +7985,15 @@
7985
7985
  type: [Boolean, String, Array, Function],
7986
7986
  default: 'props'
7987
7987
  },
7988
- returnObject: Boolean
7988
+ returnObject: Boolean,
7989
+ valueComparator: {
7990
+ type: Function,
7991
+ default: deepEqual
7992
+ }
7989
7993
  }, 'list-items');
7990
7994
  function transformItem$3(props, item) {
7991
7995
  const title = getPropertyFromItem(item, props.itemTitle, item);
7992
- const value = props.returnObject ? item : getPropertyFromItem(item, props.itemValue, title);
7996
+ const value = getPropertyFromItem(item, props.itemValue, title);
7993
7997
  const children = getPropertyFromItem(item, props.itemChildren);
7994
7998
  const itemProps = props.itemProps === true ? typeof item === 'object' && item != null && !Array.isArray(item) ? 'children' in item ? pick(item, ['children'])[1] : item : undefined : getPropertyFromItem(item, props.itemProps);
7995
7999
  const _props = {
@@ -8014,25 +8018,32 @@
8014
8018
  }
8015
8019
  function useItems(props) {
8016
8020
  const items = vue.computed(() => transformItems$3(props, props.items));
8017
- return useTransformItems(items, value => transformItem$3(props, value));
8018
- }
8019
- function useTransformItems(items, transform) {
8021
+ const hasNullItem = vue.computed(() => items.value.some(item => item.value === null));
8020
8022
  function transformIn(value) {
8021
- return value
8022
- // When the model value is null, returns an InternalItem based on null
8023
- // only if null is one of the items
8024
- .filter(v => v !== null || items.value.some(item => item.value === null)).map(v => {
8025
- const existingItem = items.value.find(item => deepEqual(v, item.value));
8026
- // Nullish existingItem means value is a custom input value from combobox
8027
- // In this case, use transformItem to create an InternalItem based on value
8028
- return existingItem ?? transform(v);
8023
+ if (!hasNullItem.value) {
8024
+ // When the model value is null, return an InternalItem
8025
+ // based on null only if null is one of the items
8026
+ value = value.filter(v => v !== null);
8027
+ }
8028
+ return value.map(v => {
8029
+ if (props.returnObject && typeof v === 'string') {
8030
+ // String model value means value is a custom input value from combobox
8031
+ // Don't look up existing items if the model value is a string
8032
+ return transformItem$3(props, v);
8033
+ }
8034
+ return items.value.find(item => props.valueComparator(v, item.value)) || transformItem$3(props, v);
8029
8035
  });
8030
8036
  }
8031
8037
  function transformOut(value) {
8032
- return value.map(_ref => {
8038
+ return props.returnObject ? value.map(_ref => {
8033
8039
  let {
8034
- value
8040
+ raw
8035
8041
  } = _ref;
8042
+ return raw;
8043
+ }) : value.map(_ref2 => {
8044
+ let {
8045
+ value
8046
+ } = _ref2;
8036
8047
  return value;
8037
8048
  });
8038
8049
  }
@@ -10863,10 +10874,6 @@
10863
10874
  default: '$vuetify.noDataText'
10864
10875
  },
10865
10876
  openOnClear: Boolean,
10866
- valueComparator: {
10867
- type: Function,
10868
- default: deepEqual
10869
- },
10870
10877
  itemColor: String,
10871
10878
  ...makeItemsProps({
10872
10879
  itemChildren: false
@@ -10920,24 +10927,14 @@
10920
10927
  return props.multiple ? transformed : transformed[0] ?? null;
10921
10928
  });
10922
10929
  const form = useForm();
10923
- const selections = vue.computed(() => {
10924
- return model.value.map(v => {
10925
- return items.value.find(item => {
10926
- const itemRawValue = getPropertyFromItem(item.raw, props.itemValue);
10927
- const modelRawValue = getPropertyFromItem(v.raw, props.itemValue);
10928
- if (itemRawValue === undefined || modelRawValue === undefined) return false;
10929
- return props.returnObject ? props.valueComparator(itemRawValue, modelRawValue) : props.valueComparator(item.value, v.value);
10930
- }) || v;
10931
- });
10932
- });
10933
- const selected = vue.computed(() => selections.value.map(selection => selection.props.value));
10930
+ const selectedValues = vue.computed(() => model.value.map(selection => selection.value));
10934
10931
  const isFocused = vue.shallowRef(false);
10935
10932
  const label = vue.computed(() => menu.value ? props.closeText : props.openText);
10936
10933
  let keyboardLookupPrefix = '';
10937
10934
  let keyboardLookupLastTime;
10938
10935
  const displayItems = vue.computed(() => {
10939
10936
  if (props.hideSelected) {
10940
- return items.value.filter(item => !selections.value.some(s => s === item));
10937
+ return items.value.filter(item => !model.value.some(s => s === item));
10941
10938
  }
10942
10939
  return items.value;
10943
10940
  });
@@ -10995,7 +10992,7 @@
10995
10992
  }
10996
10993
  function select(item) {
10997
10994
  if (props.multiple) {
10998
- const index = selected.value.findIndex(selection => props.valueComparator(selection, item.value));
10995
+ const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value));
10999
10996
  if (index === -1) {
11000
10997
  model.value = [...model.value, item];
11001
10998
  } else {
@@ -11032,8 +11029,8 @@
11032
11029
  }
11033
11030
  }
11034
11031
  vue.watch(menu, () => {
11035
- if (!props.hideSelected && menu.value && selections.value.length) {
11036
- const index = displayItems.value.findIndex(item => selections.value.some(s => item.value === s.value));
11032
+ if (!props.hideSelected && menu.value && model.value.length) {
11033
+ const index = displayItems.value.findIndex(item => model.value.some(s => props.valueComparator(s.value, item.value)));
11037
11034
  IN_BROWSER && window.requestAnimationFrame(() => {
11038
11035
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
11039
11036
  });
@@ -11088,7 +11085,7 @@
11088
11085
  }, props.menuProps), {
11089
11086
  default: () => [hasList && vue.createVNode(VList, {
11090
11087
  "ref": listRef,
11091
- "selected": selected.value,
11088
+ "selected": selectedValues.value,
11092
11089
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
11093
11090
  "onMousedown": e => e.preventDefault(),
11094
11091
  "onKeydown": onListKeydown,
@@ -11137,7 +11134,7 @@
11137
11134
  }
11138
11135
  }), slots['append-item']?.()]
11139
11136
  })]
11140
- }), selections.value.map((item, index) => {
11137
+ }), model.value.map((item, index) => {
11141
11138
  function onChipClose(e) {
11142
11139
  e.stopPropagation();
11143
11140
  e.preventDefault();
@@ -11180,7 +11177,7 @@
11180
11177
  index
11181
11178
  }) ?? vue.createVNode("span", {
11182
11179
  "class": "v-select__selection-text"
11183
- }, [item.title, props.multiple && index < selections.value.length - 1 && vue.createVNode("span", {
11180
+ }, [item.title, props.multiple && index < model.value.length - 1 && vue.createVNode("span", {
11184
11181
  "class": "v-select__selection-comma"
11185
11182
  }, [vue.createTextVNode(",")])])]);
11186
11183
  })]),
@@ -11232,15 +11229,15 @@
11232
11229
  const customFiltersLength = Object.keys(options?.customKeyFilter ?? {}).length;
11233
11230
  if (!items?.length) return array;
11234
11231
  loop: for (let i = 0; i < items.length; i++) {
11235
- const item = items[i];
11232
+ const [item, transformed = item] = wrapInArray(items[i]);
11236
11233
  const customMatches = {};
11237
11234
  const defaultMatches = {};
11238
11235
  let match = -1;
11239
11236
  if (query && !options?.noFilter) {
11240
11237
  if (typeof item === 'object') {
11241
- const filterKeys = keys || Object.keys(item);
11238
+ const filterKeys = keys || Object.keys(transformed);
11242
11239
  for (const key of filterKeys) {
11243
- const value = getPropertyFromItem(item, key, item);
11240
+ const value = getPropertyFromItem(transformed, key, transformed);
11244
11241
  const keyFilter = options?.customKeyFilter?.[key];
11245
11242
  match = keyFilter ? keyFilter(value, query, item) : filter(value, query, item);
11246
11243
  if (match !== -1 && match !== false) {
@@ -11274,7 +11271,7 @@
11274
11271
  function useFilter(props, items, query, options) {
11275
11272
  const filteredItems = vue.ref([]);
11276
11273
  const filteredMatches = vue.ref(new Map());
11277
- const transformedItems = vue.computed(() => options?.transform ? vue.unref(items).map(options?.transform) : vue.unref(items));
11274
+ const transformedItems = vue.computed(() => options?.transform ? vue.unref(items).map(item => [item, options.transform(item)]) : vue.unref(items));
11278
11275
  vue.watchEffect(() => {
11279
11276
  const _query = typeof query === 'function' ? query() : vue.unref(query);
11280
11277
  const strQuery = typeof _query !== 'string' && typeof _query !== 'number' ? '' : String(_query);
@@ -11392,24 +11389,13 @@
11392
11389
  filteredItems,
11393
11390
  getMatches
11394
11391
  } = useFilter(props, items, () => isPristine.value ? '' : search.value);
11395
- const selections = vue.computed(() => {
11396
- return model.value.map(v => {
11397
- return items.value.find(item => {
11398
- const itemRawValue = getPropertyFromItem(item.raw, props.itemValue);
11399
- const modelRawValue = getPropertyFromItem(v.raw, props.itemValue);
11400
- if (itemRawValue === undefined || modelRawValue === undefined) return false;
11401
- return props.returnObject ? props.valueComparator(itemRawValue, modelRawValue) : props.valueComparator(item.value, v.value);
11402
- }) || v;
11403
- });
11404
- });
11405
11392
  const displayItems = vue.computed(() => {
11406
11393
  if (props.hideSelected) {
11407
- return filteredItems.value.filter(filteredItem => !selections.value.some(s => s.value === filteredItem.value));
11394
+ return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
11408
11395
  }
11409
11396
  return filteredItems.value;
11410
11397
  });
11411
- const selected = vue.computed(() => selections.value.map(selection => selection.props.value));
11412
- const selection = vue.computed(() => selections.value[selectionIndex.value]);
11398
+ const selectedValues = vue.computed(() => model.value.map(selection => selection.props.value));
11413
11399
  const highlightFirst = vue.computed(() => {
11414
11400
  const selectFirst = props.autoSelectFirst === true || props.autoSelectFirst === 'exact' && search.value === displayItems.value[0]?.title;
11415
11401
  return selectFirst && displayItems.value.length > 0 && !isPristine.value && !listHasFocus.value;
@@ -11441,7 +11427,7 @@
11441
11427
  function onKeydown(e) {
11442
11428
  if (props.readonly || form?.isReadonly.value) return;
11443
11429
  const selectionStart = vTextFieldRef.value.selectionStart;
11444
- const length = selected.value.length;
11430
+ const length = model.value.length;
11445
11431
  if (selectionIndex.value > -1 || ['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) {
11446
11432
  e.preventDefault();
11447
11433
  }
@@ -11466,13 +11452,14 @@
11466
11452
  return;
11467
11453
  }
11468
11454
  const originalSelectionIndex = selectionIndex.value;
11469
- if (selection.value) select(selection.value);
11455
+ const selectedItem = model.value[selectionIndex.value];
11456
+ if (selectedItem) select(selectedItem);
11470
11457
  selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex;
11471
11458
  }
11472
11459
  if (e.key === 'ArrowLeft') {
11473
11460
  if (selectionIndex.value < 0 && selectionStart > 0) return;
11474
11461
  const prev = selectionIndex.value > -1 ? selectionIndex.value - 1 : length - 1;
11475
- if (selections.value[prev]) {
11462
+ if (model.value[prev]) {
11476
11463
  selectionIndex.value = prev;
11477
11464
  } else {
11478
11465
  selectionIndex.value = -1;
@@ -11482,7 +11469,7 @@
11482
11469
  if (e.key === 'ArrowRight') {
11483
11470
  if (selectionIndex.value < 0) return;
11484
11471
  const next = selectionIndex.value + 1;
11485
- if (selections.value[next]) {
11472
+ if (model.value[next]) {
11486
11473
  selectionIndex.value = next;
11487
11474
  } else {
11488
11475
  selectionIndex.value = -1;
@@ -11522,7 +11509,7 @@
11522
11509
  const isSelecting = vue.shallowRef(false);
11523
11510
  function select(item) {
11524
11511
  if (props.multiple) {
11525
- const index = selected.value.findIndex(selection => props.valueComparator(selection, item.value));
11512
+ const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value));
11526
11513
  if (index === -1) {
11527
11514
  model.value = [...model.value, item];
11528
11515
  } else {
@@ -11543,11 +11530,11 @@
11543
11530
  if (val === oldVal) return;
11544
11531
  if (val) {
11545
11532
  isSelecting.value = true;
11546
- search.value = props.multiple ? '' : String(selections.value.at(-1)?.props.title ?? '');
11533
+ search.value = props.multiple ? '' : String(model.value.at(-1)?.props.title ?? '');
11547
11534
  isPristine.value = true;
11548
11535
  vue.nextTick(() => isSelecting.value = false);
11549
11536
  } else {
11550
- if (!props.multiple && !search.value) model.value = [];else if (highlightFirst.value && !listHasFocus.value && !selections.value.some(_ref2 => {
11537
+ if (!props.multiple && !search.value) model.value = [];else if (highlightFirst.value && !listHasFocus.value && !model.value.some(_ref2 => {
11551
11538
  let {
11552
11539
  value
11553
11540
  } = _ref2;
@@ -11566,8 +11553,8 @@
11566
11553
  isPristine.value = !val;
11567
11554
  });
11568
11555
  vue.watch(menu, () => {
11569
- if (!props.hideSelected && menu.value && selections.value.length) {
11570
- const index = displayItems.value.findIndex(item => selections.value.some(s => item.value === s.value));
11556
+ if (!props.hideSelected && menu.value && model.value.length) {
11557
+ const index = displayItems.value.findIndex(item => model.value.some(s => item.value === s.value));
11571
11558
  IN_BROWSER && window.requestAnimationFrame(() => {
11572
11559
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
11573
11560
  });
@@ -11619,7 +11606,7 @@
11619
11606
  }, props.menuProps), {
11620
11607
  default: () => [hasList && vue.createVNode(VList, {
11621
11608
  "ref": listRef,
11622
- "selected": selected.value,
11609
+ "selected": selectedValues.value,
11623
11610
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
11624
11611
  "onMousedown": e => e.preventDefault(),
11625
11612
  "onKeydown": onListKeydown,
@@ -11673,7 +11660,7 @@
11673
11660
  }
11674
11661
  }), slots['append-item']?.()]
11675
11662
  })]
11676
- }), selections.value.map((item, index) => {
11663
+ }), model.value.map((item, index) => {
11677
11664
  function onChipClose(e) {
11678
11665
  e.stopPropagation();
11679
11666
  e.preventDefault();
@@ -11717,7 +11704,7 @@
11717
11704
  index
11718
11705
  }) ?? vue.createVNode("span", {
11719
11706
  "class": "v-autocomplete__selection-text"
11720
- }, [item.title, props.multiple && index < selections.value.length - 1 && vue.createVNode("span", {
11707
+ }, [item.title, props.multiple && index < model.value.length - 1 && vue.createVNode("span", {
11721
11708
  "class": "v-autocomplete__selection-comma"
11722
11709
  }, [vue.createTextVNode(",")])])]);
11723
11710
  })]),
@@ -13115,11 +13102,29 @@
13115
13102
  emit
13116
13103
  } = _ref;
13117
13104
  const isInteracting = vue.shallowRef(false);
13118
- const isOutsideUpdate = vue.shallowRef(false);
13119
- const dotPosition = vue.ref({
13105
+ const canvasRef = vue.ref();
13106
+ const canvasWidth = vue.shallowRef(parseFloat(props.width));
13107
+ const canvasHeight = vue.shallowRef(parseFloat(props.height));
13108
+ const _dotPosition = vue.ref({
13120
13109
  x: 0,
13121
13110
  y: 0
13122
13111
  });
13112
+ const dotPosition = vue.computed({
13113
+ get: () => _dotPosition.value,
13114
+ set(val) {
13115
+ if (!canvasRef.value) return;
13116
+ const {
13117
+ x,
13118
+ y
13119
+ } = val;
13120
+ emit('update:color', {
13121
+ h: props.color?.h ?? 0,
13122
+ s: clamp(x, 0, canvasWidth.value) / canvasWidth.value,
13123
+ v: 1 - clamp(y, 0, canvasHeight.value) / canvasHeight.value,
13124
+ a: props.color?.a ?? 1
13125
+ });
13126
+ }
13127
+ });
13123
13128
  const dotStyles = vue.computed(() => {
13124
13129
  const {
13125
13130
  x,
@@ -13132,9 +13137,6 @@
13132
13137
  transform: `translate(${convertToUnit(x - radius)}, ${convertToUnit(y - radius)})`
13133
13138
  };
13134
13139
  });
13135
- const canvasRef = vue.ref();
13136
- const canvasWidth = vue.shallowRef(parseFloat(props.width));
13137
- const canvasHeight = vue.shallowRef(parseFloat(props.height));
13138
13140
  const {
13139
13141
  resizeRef
13140
13142
  } = useResizeObserver(entries => {
@@ -13158,15 +13160,13 @@
13158
13160
  y: clamp(y - top, 0, height)
13159
13161
  };
13160
13162
  }
13161
- function handleClick(e) {
13162
- if (props.disabled || !canvasRef.value) return;
13163
- updateDotPosition(e.clientX, e.clientY, canvasRef.value.getBoundingClientRect());
13164
- }
13165
13163
  function handleMouseDown(e) {
13166
- // To prevent selection while moving cursor
13167
- e.preventDefault();
13164
+ if (e.type === 'mousedown') {
13165
+ // Prevent text selection while dragging
13166
+ e.preventDefault();
13167
+ }
13168
13168
  if (props.disabled) return;
13169
- isInteracting.value = true;
13169
+ handleMouseMove(e);
13170
13170
  window.addEventListener('mousemove', handleMouseMove);
13171
13171
  window.addEventListener('mouseup', handleMouseUp);
13172
13172
  window.addEventListener('touchmove', handleMouseMove);
@@ -13184,23 +13184,6 @@
13184
13184
  window.removeEventListener('touchmove', handleMouseMove);
13185
13185
  window.removeEventListener('touchend', handleMouseUp);
13186
13186
  }
13187
- vue.watch(dotPosition, () => {
13188
- if (isOutsideUpdate.value) {
13189
- isOutsideUpdate.value = false;
13190
- return;
13191
- }
13192
- if (!canvasRef.value) return;
13193
- const {
13194
- x,
13195
- y
13196
- } = dotPosition.value;
13197
- emit('update:color', {
13198
- h: props.color?.h ?? 0,
13199
- s: clamp(x, 0, canvasWidth.value) / canvasWidth.value,
13200
- v: 1 - clamp(y, 0, canvasHeight.value) / canvasHeight.value,
13201
- a: props.color?.a ?? 1
13202
- });
13203
- });
13204
13187
  function updateCanvas() {
13205
13188
  if (!canvasRef.value) return;
13206
13189
  const canvas = canvasRef.value;
@@ -13222,7 +13205,7 @@
13222
13205
  });
13223
13206
  vue.watch(() => [canvasWidth.value, canvasHeight.value], (newVal, oldVal) => {
13224
13207
  updateCanvas();
13225
- dotPosition.value = {
13208
+ _dotPosition.value = {
13226
13209
  x: dotPosition.value.x * newVal[0] / oldVal[0],
13227
13210
  y: dotPosition.value.y * newVal[1] / oldVal[1]
13228
13211
  };
@@ -13234,8 +13217,7 @@
13234
13217
  isInteracting.value = false;
13235
13218
  return;
13236
13219
  }
13237
- isOutsideUpdate.value = true;
13238
- dotPosition.value = props.color ? {
13220
+ _dotPosition.value = props.color ? {
13239
13221
  x: props.color.s * canvasWidth.value,
13240
13222
  y: (1 - props.color.v) * canvasHeight.value
13241
13223
  } : {
@@ -13251,9 +13233,8 @@
13251
13233
  "ref": resizeRef,
13252
13234
  "class": ['v-color-picker-canvas', props.class],
13253
13235
  "style": props.style,
13254
- "onClick": handleClick,
13255
13236
  "onMousedown": handleMouseDown,
13256
- "onTouchstart": handleMouseDown
13237
+ "onTouchstartPassive": handleMouseDown
13257
13238
  }, [vue.createVNode("canvas", {
13258
13239
  "ref": canvasRef,
13259
13240
  "width": canvasWidth.value,
@@ -14974,24 +14955,13 @@
14974
14955
  filteredItems,
14975
14956
  getMatches
14976
14957
  } = useFilter(props, items, () => isPristine.value ? '' : search.value);
14977
- const selections = vue.computed(() => {
14978
- return model.value.map(v => {
14979
- return items.value.find(item => {
14980
- const itemRawValue = getPropertyFromItem(item.raw, props.itemValue);
14981
- const modelRawValue = getPropertyFromItem(v.raw, props.itemValue);
14982
- if (itemRawValue === undefined || modelRawValue === undefined) return false;
14983
- return props.returnObject ? props.valueComparator(itemRawValue, modelRawValue) : props.valueComparator(item.value, v.value);
14984
- }) || v;
14985
- });
14986
- });
14987
14958
  const displayItems = vue.computed(() => {
14988
14959
  if (props.hideSelected) {
14989
- return filteredItems.value.filter(filteredItem => !selections.value.some(s => s.value === filteredItem.value));
14960
+ return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
14990
14961
  }
14991
14962
  return filteredItems.value;
14992
14963
  });
14993
- const selected = vue.computed(() => selections.value.map(selection => selection.props.value));
14994
- const selection = vue.computed(() => selections.value[selectionIndex.value]);
14964
+ const selectedValues = vue.computed(() => model.value.map(selection => selection.value));
14995
14965
  const highlightFirst = vue.computed(() => {
14996
14966
  const selectFirst = props.autoSelectFirst === true || props.autoSelectFirst === 'exact' && search.value === displayItems.value[0]?.title;
14997
14967
  return selectFirst && displayItems.value.length > 0 && !isPristine.value && !listHasFocus.value;
@@ -15023,7 +14993,7 @@
15023
14993
  function onKeydown(e) {
15024
14994
  if (props.readonly || form?.isReadonly.value) return;
15025
14995
  const selectionStart = vTextFieldRef.value.selectionStart;
15026
- const length = selected.value.length;
14996
+ const length = model.value.length;
15027
14997
  if (selectionIndex.value > -1 || ['Enter', 'ArrowDown', 'ArrowUp'].includes(e.key)) {
15028
14998
  e.preventDefault();
15029
14999
  }
@@ -15051,13 +15021,14 @@
15051
15021
  return;
15052
15022
  }
15053
15023
  const originalSelectionIndex = selectionIndex.value;
15054
- if (selection.value) select(selection.value);
15024
+ const selectedItem = model.value[selectionIndex.value];
15025
+ if (selectedItem) select(selectedItem);
15055
15026
  selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex;
15056
15027
  }
15057
15028
  if (e.key === 'ArrowLeft') {
15058
15029
  if (selectionIndex.value < 0 && selectionStart > 0) return;
15059
15030
  const prev = selectionIndex.value > -1 ? selectionIndex.value - 1 : length - 1;
15060
- if (selections.value[prev]) {
15031
+ if (model.value[prev]) {
15061
15032
  selectionIndex.value = prev;
15062
15033
  } else {
15063
15034
  selectionIndex.value = -1;
@@ -15067,7 +15038,7 @@
15067
15038
  if (e.key === 'ArrowRight') {
15068
15039
  if (selectionIndex.value < 0) return;
15069
15040
  const next = selectionIndex.value + 1;
15070
- if (selections.value[next]) {
15041
+ if (model.value[next]) {
15071
15042
  selectionIndex.value = next;
15072
15043
  } else {
15073
15044
  selectionIndex.value = -1;
@@ -15087,7 +15058,7 @@
15087
15058
  }
15088
15059
  function select(item) {
15089
15060
  if (props.multiple) {
15090
- const index = selected.value.findIndex(selection => props.valueComparator(selection, item.value));
15061
+ const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value));
15091
15062
  if (index === -1) {
15092
15063
  model.value = [...model.value, item];
15093
15064
  } else {
@@ -15126,7 +15097,7 @@
15126
15097
  if (val || val === oldVal) return;
15127
15098
  selectionIndex.value = -1;
15128
15099
  menu.value = false;
15129
- if (highlightFirst.value && !listHasFocus.value && !selections.value.some(_ref2 => {
15100
+ if (highlightFirst.value && !listHasFocus.value && !model.value.some(_ref2 => {
15130
15101
  let {
15131
15102
  value
15132
15103
  } = _ref2;
@@ -15139,8 +15110,8 @@
15139
15110
  }
15140
15111
  });
15141
15112
  vue.watch(menu, () => {
15142
- if (!props.hideSelected && menu.value && selections.value.length) {
15143
- const index = displayItems.value.findIndex(item => selections.value.some(s => item.value === s.value));
15113
+ if (!props.hideSelected && menu.value && model.value.length) {
15114
+ const index = displayItems.value.findIndex(item => model.value.some(s => props.valueComparator(s.value, item.value)));
15144
15115
  IN_BROWSER && window.requestAnimationFrame(() => {
15145
15116
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
15146
15117
  });
@@ -15191,7 +15162,7 @@
15191
15162
  }, props.menuProps), {
15192
15163
  default: () => [hasList && vue.createVNode(VList, {
15193
15164
  "ref": listRef,
15194
- "selected": selected.value,
15165
+ "selected": selectedValues.value,
15195
15166
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
15196
15167
  "onMousedown": e => e.preventDefault(),
15197
15168
  "onKeydown": onListKeydown,
@@ -15245,7 +15216,7 @@
15245
15216
  }
15246
15217
  }), slots['append-item']?.()]
15247
15218
  })]
15248
- }), selections.value.map((item, index) => {
15219
+ }), model.value.map((item, index) => {
15249
15220
  function onChipClose(e) {
15250
15221
  e.stopPropagation();
15251
15222
  e.preventDefault();
@@ -15289,7 +15260,7 @@
15289
15260
  index
15290
15261
  }) ?? vue.createVNode("span", {
15291
15262
  "class": "v-combobox__selection-text"
15292
- }, [item.title, props.multiple && index < selections.value.length - 1 && vue.createVNode("span", {
15263
+ }, [item.title, props.multiple && index < model.value.length - 1 && vue.createVNode("span", {
15293
15264
  "class": "v-combobox__selection-comma"
15294
15265
  }, [vue.createTextVNode(",")])])]);
15295
15266
  })]),
@@ -18826,11 +18797,10 @@
18826
18797
  "tabindex": isSelected.value ? 0 : -1,
18827
18798
  "role": "tab",
18828
18799
  "aria-selected": String(isSelected.value),
18829
- "active": false,
18800
+ "active": false
18801
+ }, btnProps, attrs, {
18830
18802
  "block": props.fixed,
18831
18803
  "maxWidth": props.fixed ? 300 : undefined,
18832
- "rounded": 0
18833
- }, btnProps, attrs, {
18834
18804
  "onGroup:selected": updateSlider
18835
18805
  }), {
18836
18806
  default: () => [slots.default?.() ?? props.text, !props.hideSlider && vue.createVNode("div", {
@@ -21810,7 +21780,7 @@
21810
21780
  const makeVDatePickerControlsProps = propsFactory({
21811
21781
  displayDate: String,
21812
21782
  disabled: {
21813
- type: [Boolean, String],
21783
+ type: [Boolean, String, Array],
21814
21784
  default: false
21815
21785
  },
21816
21786
  nextIcon: {
@@ -21850,13 +21820,13 @@
21850
21820
  return props.viewMode === 'month' ? props.expandIcon : props.collapseIcon;
21851
21821
  });
21852
21822
  const disableMode = vue.computed(() => {
21853
- return Array.isArray(props.disabled) ? props.disabled.includes('mode') : props.disabled;
21823
+ return Array.isArray(props.disabled) ? props.disabled.includes('mode') : !!props.disabled;
21854
21824
  });
21855
21825
  const disablePrev = vue.computed(() => {
21856
- return Array.isArray(props.disabled) ? props.disabled.includes('prev') : props.disabled;
21826
+ return Array.isArray(props.disabled) ? props.disabled.includes('prev') : !!props.disabled;
21857
21827
  });
21858
21828
  const disableNext = vue.computed(() => {
21859
- return Array.isArray(props.disabled) ? props.disabled.includes('next') : props.disabled;
21829
+ return Array.isArray(props.disabled) ? props.disabled.includes('next') : !!props.disabled;
21860
21830
  });
21861
21831
  function onClickPrev() {
21862
21832
  emit('click:prev');
@@ -22197,6 +22167,7 @@
22197
22167
  return isAfter(date, range[0]) && isBefore(date, range[1]);
22198
22168
  }
22199
22169
  function isValid(date) {
22170
+ if (!date || date == null) return false;
22200
22171
  const d = new Date(date);
22201
22172
  return d instanceof Date && !isNaN(d.getTime());
22202
22173
  }
@@ -22228,6 +22199,12 @@
22228
22199
  d.setFullYear(year);
22229
22200
  return d;
22230
22201
  }
22202
+ function startOfDay(date) {
22203
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate());
22204
+ }
22205
+ function endOfDay(date) {
22206
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate(), 23, 59, 59, 999);
22207
+ }
22231
22208
  class VuetifyDateAdapter {
22232
22209
  constructor(options) {
22233
22210
  this.locale = options.locale;
@@ -22292,6 +22269,12 @@
22292
22269
  getMonth(date) {
22293
22270
  return getMonth(date);
22294
22271
  }
22272
+ startOfDay(date) {
22273
+ return startOfDay(date);
22274
+ }
22275
+ endOfDay(date) {
22276
+ return endOfDay(date);
22277
+ }
22295
22278
  startOfYear(date) {
22296
22279
  return startOfYear(date);
22297
22280
  }
@@ -23160,9 +23143,11 @@
23160
23143
  function updateFromInput(input, index) {
23161
23144
  const {
23162
23145
  isValid,
23163
- date
23146
+ date,
23147
+ isAfter
23164
23148
  } = adapter;
23165
- if (isValid(input)) {
23149
+ const inputDate = date(input);
23150
+ if (isValid(input) && (!minDate.value || !isAfter(minDate.value, inputDate)) && (!maxDate.value || !isAfter(inputDate, maxDate.value))) {
23166
23151
  const newModel = model.value.slice();
23167
23152
  newModel[index] = date(input);
23168
23153
  if (props.hideActions) {
@@ -24578,7 +24563,7 @@
24578
24563
  date
24579
24564
  };
24580
24565
  }
24581
- const version$1 = "3.3.15";
24566
+ const version$1 = "3.3.16";
24582
24567
  createVuetify$1.version = version$1;
24583
24568
 
24584
24569
  // Vue's inject() can only be used in setup
@@ -24592,7 +24577,7 @@
24592
24577
 
24593
24578
  /* eslint-disable local-rules/sort-imports */
24594
24579
 
24595
- const version = "3.3.15";
24580
+ const version = "3.3.16";
24596
24581
 
24597
24582
  /* eslint-disable local-rules/sort-imports */
24598
24583