vuetify 3.5.6 → 3.5.8

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 (96) hide show
  1. package/dist/_component-variables-labs.sass +2 -0
  2. package/dist/json/attributes.json +461 -41
  3. package/dist/json/importMap-labs.json +16 -4
  4. package/dist/json/importMap.json +120 -120
  5. package/dist/json/tags.json +120 -0
  6. package/dist/json/web-types.json +1173 -53
  7. package/dist/vuetify-labs.css +1547 -1407
  8. package/dist/vuetify-labs.d.ts +1672 -127
  9. package/dist/vuetify-labs.esm.js +428 -94
  10. package/dist/vuetify-labs.esm.js.map +1 -1
  11. package/dist/vuetify-labs.js +428 -94
  12. package/dist/vuetify-labs.min.css +2 -2
  13. package/dist/vuetify.css +438 -432
  14. package/dist/vuetify.d.ts +78 -142
  15. package/dist/vuetify.esm.js +121 -82
  16. package/dist/vuetify.esm.js.map +1 -1
  17. package/dist/vuetify.js +121 -82
  18. package/dist/vuetify.js.map +1 -1
  19. package/dist/vuetify.min.css +2 -2
  20. package/dist/vuetify.min.js +147 -135
  21. package/dist/vuetify.min.js.map +1 -1
  22. package/lib/components/VApp/index.d.mts +8 -6
  23. package/lib/components/VAutocomplete/VAutocomplete.css +4 -4
  24. package/lib/components/VAutocomplete/VAutocomplete.mjs +28 -27
  25. package/lib/components/VAutocomplete/VAutocomplete.mjs.map +1 -1
  26. package/lib/components/VAutocomplete/VAutocomplete.sass +2 -2
  27. package/lib/components/VCheckbox/VCheckbox.mjs +3 -1
  28. package/lib/components/VCheckbox/VCheckbox.mjs.map +1 -1
  29. package/lib/components/VCombobox/VCombobox.css +4 -4
  30. package/lib/components/VCombobox/VCombobox.mjs +40 -27
  31. package/lib/components/VCombobox/VCombobox.mjs.map +1 -1
  32. package/lib/components/VCombobox/VCombobox.sass +2 -2
  33. package/lib/components/VDataIterator/VDataIterator.mjs.map +1 -1
  34. package/lib/components/VDataIterator/index.d.mts +50 -94
  35. package/lib/components/VDatePicker/VDatePickerMonth.mjs +1 -1
  36. package/lib/components/VDatePicker/VDatePickerMonth.mjs.map +1 -1
  37. package/lib/components/VLayout/index.d.mts +8 -6
  38. package/lib/components/VSelect/VSelect.mjs +18 -17
  39. package/lib/components/VSelect/VSelect.mjs.map +1 -1
  40. package/lib/components/VSwitch/VSwitch.css +9 -5
  41. package/lib/components/VSwitch/VSwitch.mjs +2 -0
  42. package/lib/components/VSwitch/VSwitch.mjs.map +1 -1
  43. package/lib/components/VSwitch/VSwitch.sass +10 -7
  44. package/lib/components/VSwitch/_variables.scss +2 -0
  45. package/lib/components/VToolbar/VToolbar.css +3 -1
  46. package/lib/components/VToolbar/VToolbar.sass +2 -1
  47. package/lib/components/index.d.mts +38 -105
  48. package/lib/composables/date/adapters/vuetify.mjs +21 -3
  49. package/lib/composables/date/adapters/vuetify.mjs.map +1 -1
  50. package/lib/composables/layout.mjs.map +1 -1
  51. package/lib/composables/transition.mjs +7 -5
  52. package/lib/composables/transition.mjs.map +1 -1
  53. package/lib/entry-bundler.mjs +1 -1
  54. package/lib/framework.mjs +1 -1
  55. package/lib/index.d.mts +42 -37
  56. package/lib/labs/VCalendar/VCalendarInterval.css +1 -0
  57. package/lib/labs/VCalendar/VCalendarInterval.sass +1 -0
  58. package/lib/labs/VCalendar/VCalendarIntervalEvent.css +6 -0
  59. package/lib/labs/VCalendar/VCalendarIntervalEvent.mjs +5 -2
  60. package/lib/labs/VCalendar/VCalendarIntervalEvent.mjs.map +1 -1
  61. package/lib/labs/VCalendar/VCalendarIntervalEvent.sass +6 -0
  62. package/lib/labs/VEmptyState/VEmptyState.css +59 -0
  63. package/lib/labs/VEmptyState/VEmptyState.mjs +145 -0
  64. package/lib/labs/VEmptyState/VEmptyState.mjs.map +1 -0
  65. package/lib/labs/VEmptyState/VEmptyState.sass +53 -0
  66. package/lib/labs/VEmptyState/_variables.scss +22 -0
  67. package/lib/labs/VEmptyState/index.d.mts +415 -0
  68. package/lib/labs/VEmptyState/index.mjs +2 -0
  69. package/lib/labs/VEmptyState/index.mjs.map +1 -0
  70. package/lib/labs/VFab/VFab.css +69 -0
  71. package/lib/labs/VFab/VFab.mjs +114 -0
  72. package/lib/labs/VFab/VFab.mjs.map +1 -0
  73. package/lib/labs/VFab/VFab.sass +82 -0
  74. package/lib/labs/VFab/_mixins.scss +22 -0
  75. package/lib/labs/VFab/_variables.scss +33 -0
  76. package/lib/labs/VFab/index.d.mts +656 -0
  77. package/lib/labs/VFab/index.mjs +2 -0
  78. package/lib/labs/VFab/index.mjs.map +1 -0
  79. package/lib/labs/VSparkline/VBarline.mjs +8 -7
  80. package/lib/labs/VSparkline/VBarline.mjs.map +1 -1
  81. package/lib/labs/VSparkline/VTrendline.mjs +14 -6
  82. package/lib/labs/VSparkline/VTrendline.mjs.map +1 -1
  83. package/lib/labs/VSparkline/index.d.mts +27 -0
  84. package/lib/labs/VSparkline/util/line.mjs +6 -0
  85. package/lib/labs/VSparkline/util/line.mjs.map +1 -1
  86. package/lib/labs/VSpeedDial/VSpeedDial.css +3 -0
  87. package/lib/labs/VSpeedDial/VSpeedDial.mjs +56 -0
  88. package/lib/labs/VSpeedDial/VSpeedDial.mjs.map +1 -0
  89. package/lib/labs/VSpeedDial/VSpeedDial.sass +2 -0
  90. package/lib/labs/VSpeedDial/index.d.mts +649 -0
  91. package/lib/labs/VSpeedDial/index.mjs +2 -0
  92. package/lib/labs/VSpeedDial/index.mjs.map +1 -0
  93. package/lib/labs/components.d.mts +1907 -193
  94. package/lib/labs/components.mjs +3 -0
  95. package/lib/labs/components.mjs.map +1 -1
  96. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.5.6
2
+ * Vuetify v3.5.8
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -3164,17 +3164,19 @@
3164
3164
  const {
3165
3165
  transition,
3166
3166
  disabled,
3167
+ group,
3167
3168
  ...rest
3168
3169
  } = props;
3169
3170
  const {
3170
- component = vue.Transition,
3171
+ component = group ? vue.TransitionGroup : vue.Transition,
3171
3172
  ...customProps
3172
3173
  } = typeof transition === 'object' ? transition : {};
3173
3174
  return vue.h(component, vue.mergeProps(typeof transition === 'string' ? {
3174
3175
  name: disabled ? '' : transition
3175
- } : customProps, rest, {
3176
- disabled
3177
- }), slots);
3176
+ } : customProps, typeof transition === 'string' ? {} : {
3177
+ disabled,
3178
+ group
3179
+ }, rest), slots);
3178
3180
  };
3179
3181
 
3180
3182
  // Utilities
@@ -6891,7 +6893,8 @@
6891
6893
  id,
6892
6894
  messagesId,
6893
6895
  isDisabled,
6894
- isReadonly
6896
+ isReadonly,
6897
+ isValid
6895
6898
  } = _ref2;
6896
6899
  return vue.createVNode(VCheckboxBtn, vue.mergeProps(checkboxProps, {
6897
6900
  "id": id.value,
@@ -6899,6 +6902,7 @@
6899
6902
  "disabled": isDisabled.value,
6900
6903
  "readonly": isReadonly.value
6901
6904
  }, controlAttrs, {
6905
+ "error": isValid.value === false,
6902
6906
  "modelValue": model.value,
6903
6907
  "onUpdate:modelValue": $event => model.value = $event,
6904
6908
  "onFocus": focus,
@@ -11848,21 +11852,27 @@
11848
11852
  model.value = [item];
11849
11853
  }
11850
11854
  }
11855
+
11856
+ /** @param set - null means toggle */
11851
11857
  function select(item) {
11852
- let add = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
11858
+ let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
11859
+ if (item.props.disabled) return;
11853
11860
  if (props.multiple) {
11854
11861
  const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value));
11855
- add = index === -1;
11856
- if (add) {
11857
- model.value = [...model.value, item];
11858
- } else {
11859
- const value = [...model.value];
11862
+ const add = set == null ? !~index : set;
11863
+ if (~index) {
11864
+ const value = add ? [...model.value, item] : [...model.value];
11860
11865
  value.splice(index, 1);
11861
11866
  model.value = value;
11867
+ } else if (add) {
11868
+ model.value = [...model.value, item];
11862
11869
  }
11863
11870
  } else {
11871
+ const add = set !== false;
11864
11872
  model.value = add ? [item] : [];
11865
- menu.value = false;
11873
+ vue.nextTick(() => {
11874
+ menu.value = false;
11875
+ });
11866
11876
  }
11867
11877
  }
11868
11878
  function onBlur(e) {
@@ -11896,14 +11906,9 @@
11896
11906
  });
11897
11907
  }
11898
11908
  });
11899
- vue.watch(displayItems, (val, oldVal) => {
11900
- if (!isFocused.value) return;
11901
- if (!val.length && props.hideNoData) {
11902
- menu.value = false;
11903
- }
11904
- if (!oldVal.length && val.length) {
11905
- menu.value = true;
11906
- }
11909
+ vue.watch(() => props.items, val => {
11910
+ if (!isFocused.value || !val.length || menu.value) return;
11911
+ menu.value = true;
11907
11912
  });
11908
11913
  useRender(() => {
11909
11914
  const hasChips = !!(props.chips || slots.chip);
@@ -11981,7 +11986,7 @@
11981
11986
  const itemProps = vue.mergeProps(item.props, {
11982
11987
  ref: itemRef,
11983
11988
  key: index,
11984
- onClick: () => select(item)
11989
+ onClick: () => select(item, null)
11985
11990
  });
11986
11991
  return slots.item?.({
11987
11992
  item,
@@ -12288,6 +12293,8 @@
12288
12293
  }
12289
12294
  return filteredItems.value;
12290
12295
  });
12296
+ const hasChips = vue.computed(() => !!(props.chips || slots.chip));
12297
+ const hasSelectionSlot = vue.computed(() => hasChips.value || !!slots.selection);
12291
12298
  const selectedValues = vue.computed(() => model.value.map(selection => selection.props.value));
12292
12299
  const highlightFirst = vue.computed(() => {
12293
12300
  const selectFirst = props.autoSelectFirst === true || props.autoSelectFirst === 'exact' && search.value === displayItems.value[0]?.title;
@@ -12346,7 +12353,7 @@
12346
12353
  }
12347
12354
  const originalSelectionIndex = selectionIndex.value;
12348
12355
  const selectedItem = model.value[selectionIndex.value];
12349
- if (selectedItem && !selectedItem.props.disabled) select(selectedItem);
12356
+ if (selectedItem && !selectedItem.props.disabled) select(selectedItem, false);
12350
12357
  selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex;
12351
12358
  }
12352
12359
  if (e.key === 'ArrowLeft') {
@@ -12397,36 +12404,41 @@
12397
12404
  if (v == null || v === '' && !props.multiple) model.value = [];
12398
12405
  }
12399
12406
  const isSelecting = vue.shallowRef(false);
12407
+
12408
+ /** @param set - null means toggle */
12400
12409
  function select(item) {
12401
- let add = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
12410
+ let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
12402
12411
  if (item.props.disabled) return;
12403
12412
  if (props.multiple) {
12404
12413
  const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value));
12405
- add = index === -1;
12406
- if (add) {
12407
- model.value = [...model.value, item];
12408
- } else {
12409
- const value = [...model.value];
12414
+ const add = set == null ? !~index : set;
12415
+ if (~index) {
12416
+ const value = add ? [...model.value, item] : [...model.value];
12410
12417
  value.splice(index, 1);
12411
12418
  model.value = value;
12419
+ } else if (add) {
12420
+ model.value = [...model.value, item];
12412
12421
  }
12413
12422
  if (props.clearOnSelect) {
12414
12423
  search.value = '';
12415
12424
  }
12416
12425
  } else {
12426
+ const add = set !== false;
12417
12427
  model.value = add ? [item] : [];
12418
- isSelecting.value = true;
12419
- search.value = add ? item.title : '';
12420
- menu.value = false;
12421
- isPristine.value = true;
12422
- vue.nextTick(() => isSelecting.value = false);
12428
+ search.value = add && !hasSelectionSlot.value ? item.title : '';
12429
+
12430
+ // watch for search watcher to trigger
12431
+ vue.nextTick(() => {
12432
+ menu.value = false;
12433
+ isPristine.value = true;
12434
+ });
12423
12435
  }
12424
12436
  }
12425
12437
  vue.watch(isFocused, (val, oldVal) => {
12426
12438
  if (val === oldVal) return;
12427
12439
  if (val) {
12428
12440
  isSelecting.value = true;
12429
- search.value = props.multiple ? '' : String(model.value.at(-1)?.props.title ?? '');
12441
+ search.value = props.multiple || hasSelectionSlot.value ? '' : String(model.value.at(-1)?.props.title ?? '');
12430
12442
  isPristine.value = true;
12431
12443
  vue.nextTick(() => isSelecting.value = false);
12432
12444
  } else {
@@ -12456,17 +12468,11 @@
12456
12468
  });
12457
12469
  }
12458
12470
  });
12459
- vue.watch(displayItems, (val, oldVal) => {
12460
- if (!isFocused.value) return;
12461
- if (!val.length && props.hideNoData) {
12462
- menu.value = false;
12463
- }
12464
- if (!oldVal.length && val.length) {
12465
- menu.value = true;
12466
- }
12471
+ vue.watch(() => props.items, val => {
12472
+ if (!isFocused.value || !val.length || menu.value) return;
12473
+ menu.value = true;
12467
12474
  });
12468
12475
  useRender(() => {
12469
- const hasChips = !!(props.chips || slots.chip);
12470
12476
  const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']);
12471
12477
  const isDirty = model.value.length > 0;
12472
12478
  const textFieldProps = VTextField.filterProps(props);
@@ -12484,7 +12490,7 @@
12484
12490
  "class": ['v-autocomplete', `v-autocomplete--${props.multiple ? 'multiple' : 'single'}`, {
12485
12491
  'v-autocomplete--active-menu': menu.value,
12486
12492
  'v-autocomplete--chips': !!props.chips,
12487
- 'v-autocomplete--selection-slot': !!slots.selection,
12493
+ 'v-autocomplete--selection-slot': !!hasSelectionSlot.value,
12488
12494
  'v-autocomplete--selecting-index': selectionIndex.value > -1
12489
12495
  }, props.class],
12490
12496
  "style": props.style,
@@ -12539,7 +12545,7 @@
12539
12545
  ref: itemRef,
12540
12546
  key: index,
12541
12547
  active: highlightFirst.value && index === 0 ? true : undefined,
12542
- onClick: () => select(item)
12548
+ onClick: () => select(item, null)
12543
12549
  });
12544
12550
  return slots.item?.({
12545
12551
  item,
@@ -12585,8 +12591,8 @@
12585
12591
  modelValue: true,
12586
12592
  'onUpdate:modelValue': undefined
12587
12593
  };
12588
- const hasSlot = hasChips ? !!slots.chip : !!slots.selection;
12589
- const slotContent = hasSlot ? ensureValidVNode(hasChips ? slots.chip({
12594
+ const hasSlot = hasChips.value ? !!slots.chip : !!slots.selection;
12595
+ const slotContent = hasSlot ? ensureValidVNode(hasChips.value ? slots.chip({
12590
12596
  item,
12591
12597
  index,
12592
12598
  props: slotProps
@@ -12599,7 +12605,7 @@
12599
12605
  "key": item.value,
12600
12606
  "class": ['v-autocomplete__selection', index === selectionIndex.value && ['v-autocomplete__selection--selected', textColorClasses.value]],
12601
12607
  "style": index === selectionIndex.value ? textColorStyles.value : {}
12602
- }, [hasChips ? !slots.chip ? vue.createVNode(VChip, vue.mergeProps({
12608
+ }, [hasChips.value ? !slots.chip ? vue.createVNode(VChip, vue.mergeProps({
12603
12609
  "key": "chip",
12604
12610
  "closable": props.closableChips,
12605
12611
  "size": "small",
@@ -16038,14 +16044,16 @@
16038
16044
  return props.multiple ? transformed : transformed[0] ?? null;
16039
16045
  });
16040
16046
  const form = useForm();
16041
- const _search = vue.shallowRef(!props.multiple ? model.value[0]?.title ?? '' : '');
16047
+ const hasChips = vue.computed(() => !!(props.chips || slots.chip));
16048
+ const hasSelectionSlot = vue.computed(() => hasChips.value || !!slots.selection);
16049
+ const _search = vue.shallowRef(!props.multiple && !hasSelectionSlot.value ? model.value[0]?.title ?? '' : '');
16042
16050
  const search = vue.computed({
16043
16051
  get: () => {
16044
16052
  return _search.value;
16045
16053
  },
16046
16054
  set: val => {
16047
16055
  _search.value = val ?? '';
16048
- if (!props.multiple) {
16056
+ if (!props.multiple && !hasSelectionSlot.value) {
16049
16057
  model.value = [transformItem$3(props, val)];
16050
16058
  }
16051
16059
  if (val && props.multiple && props.delimiters?.length) {
@@ -16076,7 +16084,7 @@
16076
16084
  emit('update:search', value);
16077
16085
  });
16078
16086
  vue.watch(model, value => {
16079
- if (!props.multiple) {
16087
+ if (!props.multiple && !hasSelectionSlot.value) {
16080
16088
  _search.value = value[0]?.title ?? '';
16081
16089
  }
16082
16090
  });
@@ -16141,6 +16149,10 @@
16141
16149
  if (e.key === 'ArrowDown' && highlightFirst.value) {
16142
16150
  listRef.value?.focus('next');
16143
16151
  }
16152
+ if (e.key === 'Enter' && search.value) {
16153
+ select(transformItem$3(props, search.value));
16154
+ if (hasSelectionSlot.value) _search.value = '';
16155
+ }
16144
16156
  if (!props.multiple) return;
16145
16157
  if (['Backspace', 'Delete'].includes(e.key)) {
16146
16158
  if (selectionIndex.value < 0) {
@@ -16174,10 +16186,6 @@
16174
16186
  vTextFieldRef.value.setSelectionRange(0, 0);
16175
16187
  }
16176
16188
  }
16177
- if (e.key === 'Enter' && search.value) {
16178
- select(transformItem$3(props, search.value));
16179
- search.value = '';
16180
- }
16181
16189
  }
16182
16190
  function onAfterLeave() {
16183
16191
  if (isFocused.value) {
@@ -16188,6 +16196,7 @@
16188
16196
  /** @param set - null means toggle */
16189
16197
  function select(item) {
16190
16198
  let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
16199
+ if (item.props.disabled) return;
16191
16200
  if (props.multiple) {
16192
16201
  const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value));
16193
16202
  const add = set == null ? !~index : set;
@@ -16204,7 +16213,7 @@
16204
16213
  } else {
16205
16214
  const add = set !== false;
16206
16215
  model.value = add ? [item] : [];
16207
- _search.value = add ? item.title : '';
16216
+ _search.value = add && !hasSelectionSlot.value ? item.title : '';
16208
16217
 
16209
16218
  // watch for search watcher to trigger
16210
16219
  vue.nextTick(() => {
@@ -16236,8 +16245,24 @@
16236
16245
  return value === displayItems.value[0].value;
16237
16246
  })) {
16238
16247
  select(displayItems.value[0]);
16239
- } else if (props.multiple && search.value) {
16240
- select(transformItem$3(props, search.value));
16248
+ return;
16249
+ }
16250
+ if (search.value) {
16251
+ if (props.multiple) {
16252
+ select(transformItem$3(props, search.value));
16253
+ return;
16254
+ }
16255
+ if (!hasSelectionSlot.value) return;
16256
+ if (model.value.some(_ref3 => {
16257
+ let {
16258
+ title
16259
+ } = _ref3;
16260
+ return title === search.value;
16261
+ })) {
16262
+ _search.value = '';
16263
+ } else {
16264
+ select(transformItem$3(props, search.value));
16265
+ }
16241
16266
  }
16242
16267
  });
16243
16268
  vue.watch(menu, () => {
@@ -16248,17 +16273,11 @@
16248
16273
  });
16249
16274
  }
16250
16275
  });
16251
- vue.watch(displayItems, (val, oldVal) => {
16252
- if (!isFocused.value) return;
16253
- if (!val.length && props.hideNoData) {
16254
- menu.value = false;
16255
- }
16256
- if (!oldVal.length && val.length) {
16257
- menu.value = true;
16258
- }
16276
+ vue.watch(() => props.items, val => {
16277
+ if (!isFocused.value || !val.length || menu.value) return;
16278
+ menu.value = true;
16259
16279
  });
16260
16280
  useRender(() => {
16261
- const hasChips = !!(props.chips || slots.chip);
16262
16281
  const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']);
16263
16282
  const isDirty = model.value.length > 0;
16264
16283
  const textFieldProps = VTextField.filterProps(props);
@@ -16275,7 +16294,7 @@
16275
16294
  "class": ['v-combobox', {
16276
16295
  'v-combobox--active-menu': menu.value,
16277
16296
  'v-combobox--chips': !!props.chips,
16278
- 'v-combobox--selection-slot': !!slots.selection,
16297
+ 'v-combobox--selection-slot': !!hasSelectionSlot.value,
16279
16298
  'v-combobox--selecting-index': selectionIndex.value > -1,
16280
16299
  [`v-combobox--${props.multiple ? 'multiple' : 'single'}`]: true
16281
16300
  }, props.class],
@@ -16321,12 +16340,12 @@
16321
16340
  "renderless": true,
16322
16341
  "items": displayItems.value
16323
16342
  }, {
16324
- default: _ref3 => {
16343
+ default: _ref4 => {
16325
16344
  let {
16326
16345
  item,
16327
16346
  index,
16328
16347
  itemRef
16329
- } = _ref3;
16348
+ } = _ref4;
16330
16349
  const itemProps = vue.mergeProps(item.props, {
16331
16350
  ref: itemRef,
16332
16351
  key: index,
@@ -16340,10 +16359,10 @@
16340
16359
  }) ?? vue.createVNode(VListItem, vue.mergeProps(itemProps, {
16341
16360
  "role": "option"
16342
16361
  }), {
16343
- prepend: _ref4 => {
16362
+ prepend: _ref5 => {
16344
16363
  let {
16345
16364
  isSelected
16346
- } = _ref4;
16365
+ } = _ref5;
16347
16366
  return vue.createVNode(vue.Fragment, null, [props.multiple && !props.hideSelected ? vue.createVNode(VCheckboxBtn, {
16348
16367
  "key": item.value,
16349
16368
  "modelValue": isSelected,
@@ -16377,8 +16396,8 @@
16377
16396
  modelValue: true,
16378
16397
  'onUpdate:modelValue': undefined
16379
16398
  };
16380
- const hasSlot = hasChips ? !!slots.chip : !!slots.selection;
16381
- const slotContent = hasSlot ? ensureValidVNode(hasChips ? slots.chip({
16399
+ const hasSlot = hasChips.value ? !!slots.chip : !!slots.selection;
16400
+ const slotContent = hasSlot ? ensureValidVNode(hasChips.value ? slots.chip({
16382
16401
  item,
16383
16402
  index,
16384
16403
  props: slotProps
@@ -16391,7 +16410,7 @@
16391
16410
  "key": item.value,
16392
16411
  "class": ['v-combobox__selection', index === selectionIndex.value && ['v-combobox__selection--selected', textColorClasses.value]],
16393
16412
  "style": index === selectionIndex.value ? textColorStyles.value : {}
16394
- }, [hasChips ? !slots.chip ? vue.createVNode(VChip, vue.mergeProps({
16413
+ }, [hasChips.value ? !slots.chip ? vue.createVNode(VChip, vue.mergeProps({
16395
16414
  "key": "chip",
16396
16415
  "closable": props.closableChips,
16397
16416
  "size": "small",
@@ -17359,10 +17378,28 @@
17359
17378
  function getDiff(date, comparing, unit) {
17360
17379
  const d = new Date(date);
17361
17380
  const c = new Date(comparing);
17362
- if (unit === 'month') {
17363
- return d.getMonth() - c.getMonth() + (d.getFullYear() - c.getFullYear()) * 12;
17381
+ switch (unit) {
17382
+ case 'years':
17383
+ return d.getFullYear() - c.getFullYear();
17384
+ case 'quarters':
17385
+ return Math.floor((d.getMonth() - c.getMonth() + (d.getFullYear() - c.getFullYear()) * 12) / 4);
17386
+ case 'months':
17387
+ return d.getMonth() - c.getMonth() + (d.getFullYear() - c.getFullYear()) * 12;
17388
+ case 'weeks':
17389
+ return Math.floor((d.getTime() - c.getTime()) / (1000 * 60 * 60 * 24 * 7));
17390
+ case 'days':
17391
+ return Math.floor((d.getTime() - c.getTime()) / (1000 * 60 * 60 * 24));
17392
+ case 'hours':
17393
+ return Math.floor((d.getTime() - c.getTime()) / (1000 * 60 * 60));
17394
+ case 'minutes':
17395
+ return Math.floor((d.getTime() - c.getTime()) / (1000 * 60));
17396
+ case 'seconds':
17397
+ return Math.floor((d.getTime() - c.getTime()) / 1000);
17398
+ default:
17399
+ {
17400
+ return d.getTime() - c.getTime();
17401
+ }
17364
17402
  }
17365
- return Math.floor((d.getTime() - c.getTime()) / (1000 * 60 * 60 * 24));
17366
17403
  }
17367
17404
  function setHours(date, count) {
17368
17405
  const d = new Date(date);
@@ -20557,7 +20594,7 @@
20557
20594
  } else {
20558
20595
  rangeStop.value = _value;
20559
20596
  }
20560
- const diff = adapter.getDiff(rangeStop.value, rangeStart.value);
20597
+ const diff = adapter.getDiff(rangeStop.value, rangeStart.value, 'days');
20561
20598
  const datesInRange = [rangeStart.value];
20562
20599
  for (let i = 1; i < diff; i++) {
20563
20600
  const nextDate = adapter.addDays(rangeStart.value, i);
@@ -24371,6 +24408,8 @@
24371
24408
  const controlProps = VSelectionControl.filterProps(props);
24372
24409
  return vue.createVNode(VInput, vue.mergeProps({
24373
24410
  "class": ['v-switch', {
24411
+ 'v-switch--flat': props.flat
24412
+ }, {
24374
24413
  'v-switch--inset': props.inset
24375
24414
  }, {
24376
24415
  'v-switch--indeterminate': indeterminate.value
@@ -25494,8 +25533,8 @@
25494
25533
  return vue.createVNode(VSheet, {
25495
25534
  "height": calcHeight().height,
25496
25535
  "density": "comfortable",
25497
- "style": `width: 100%; margin-top: ${calcHeight().margin}`,
25498
- "class": "align-center pa-1",
25536
+ "style": `margin-top: ${calcHeight().margin}`,
25537
+ "class": "v-calendar-internal-event",
25499
25538
  "color": props.event?.color ?? undefined,
25500
25539
  "rounded": props.event?.first && props.event?.last ? true : props.event?.first ? 't' : props.event?.last ? 'b' : false
25501
25540
  }, {
@@ -25906,6 +25945,106 @@
25906
25945
  }
25907
25946
  });
25908
25947
 
25948
+ const makeVFabProps = propsFactory({
25949
+ app: Boolean,
25950
+ appear: Boolean,
25951
+ extended: Boolean,
25952
+ location: {
25953
+ type: String,
25954
+ default: 'bottom end'
25955
+ },
25956
+ offset: Boolean,
25957
+ modelValue: {
25958
+ type: Boolean,
25959
+ default: true
25960
+ },
25961
+ ...omit(makeVBtnProps({
25962
+ active: true
25963
+ }), ['location']),
25964
+ ...makeLayoutItemProps(),
25965
+ ...makeTransitionProps({
25966
+ transition: 'fab-transition'
25967
+ })
25968
+ }, 'VFab');
25969
+ const VFab = genericComponent()({
25970
+ name: 'VFab',
25971
+ props: makeVFabProps(),
25972
+ emits: {
25973
+ 'update:modelValue': value => true
25974
+ },
25975
+ setup(props, _ref) {
25976
+ let {
25977
+ slots
25978
+ } = _ref;
25979
+ const model = useProxiedModel(props, 'modelValue');
25980
+ const height = vue.shallowRef(56);
25981
+ const layoutItemStyles = vue.ref();
25982
+ const {
25983
+ resizeRef
25984
+ } = useResizeObserver(entries => {
25985
+ if (!entries.length) return;
25986
+ height.value = entries[0].target.clientHeight;
25987
+ });
25988
+ const hasPosition = vue.computed(() => props.app || props.absolute);
25989
+ const position = vue.computed(() => {
25990
+ if (!hasPosition.value) return false;
25991
+ return props.location.split(' ').shift();
25992
+ });
25993
+ const orientation = vue.computed(() => {
25994
+ if (!hasPosition.value) return false;
25995
+ return props.location.split(' ')[1] ?? 'end';
25996
+ });
25997
+ useToggleScope(() => props.app, () => {
25998
+ const layout = useLayoutItem({
25999
+ id: props.name,
26000
+ order: vue.computed(() => parseInt(props.order, 10)),
26001
+ position,
26002
+ layoutSize: height,
26003
+ elementSize: vue.computed(() => height.value + 32),
26004
+ active: vue.computed(() => props.app && model.value),
26005
+ absolute: vue.toRef(props, 'absolute')
26006
+ });
26007
+ vue.watchEffect(() => {
26008
+ layoutItemStyles.value = layout.layoutItemStyles.value;
26009
+ });
26010
+ });
26011
+ const vFabRef = vue.ref();
26012
+ useRender(() => {
26013
+ const btnProps = VBtn.filterProps(props);
26014
+ return vue.createVNode("div", {
26015
+ "ref": vFabRef,
26016
+ "class": ['v-fab', {
26017
+ 'v-fab--absolute': props.absolute,
26018
+ 'v-fab--app': !!props.app,
26019
+ 'v-fab--extended': props.extended,
26020
+ 'v-fab--offset': props.offset,
26021
+ [`v-fab--${position.value}`]: hasPosition.value,
26022
+ [`v-fab--${orientation.value}`]: hasPosition.value
26023
+ }, props.class],
26024
+ "style": [props.app ? {
26025
+ ...layoutItemStyles.value
26026
+ } : {
26027
+ height: 'inherit',
26028
+ width: undefined
26029
+ }, props.style]
26030
+ }, [vue.createVNode("div", {
26031
+ "class": "v-fab__container"
26032
+ }, [vue.createVNode(MaybeTransition, {
26033
+ "appear": props.appear,
26034
+ "transition": props.transition
26035
+ }, {
26036
+ default: () => [vue.withDirectives(vue.createVNode(VBtn, vue.mergeProps({
26037
+ "ref": resizeRef
26038
+ }, btnProps, {
26039
+ "active": undefined,
26040
+ "location": undefined
26041
+ }), slots), [[vue.vShow, props.active]])]
26042
+ })])]);
26043
+ });
26044
+ return {};
26045
+ }
26046
+ });
26047
+
25909
26048
  // Utilities
25910
26049
 
25911
26050
  // Types
@@ -25944,10 +26083,16 @@
25944
26083
  default: 4
25945
26084
  },
25946
26085
  id: String,
26086
+ itemValue: {
26087
+ type: String,
26088
+ default: 'value'
26089
+ },
25947
26090
  modelValue: {
25948
26091
  type: Array,
25949
26092
  default: () => []
25950
26093
  },
26094
+ min: [String, Number],
26095
+ max: [String, Number],
25951
26096
  padding: {
25952
26097
  type: [String, Number],
25953
26098
  default: 8
@@ -25989,6 +26134,7 @@
25989
26134
  maxY: parseInt(props.height, 10)
25990
26135
  };
25991
26136
  });
26137
+ const items = vue.computed(() => props.modelValue.map(item => getPropertyFromItem(item, props.itemValue, item)));
25992
26138
  function genBars(values, boundary) {
25993
26139
  const {
25994
26140
  minX,
@@ -25997,10 +26143,10 @@
25997
26143
  maxY
25998
26144
  } = boundary;
25999
26145
  const totalValues = values.length;
26000
- let maxValue = Math.max(...values);
26001
- let minValue = Math.min(...values);
26002
- if (minValue > 0) minValue = 0;
26003
- if (maxValue < 0) maxValue = 0;
26146
+ let maxValue = props.max != null ? Number(props.max) : Math.max(...values);
26147
+ let minValue = props.min != null ? Number(props.min) : Math.min(...values);
26148
+ if (minValue > 0 && props.min == null) minValue = 0;
26149
+ if (maxValue < 0 && props.max == null) maxValue = 0;
26004
26150
  const gridX = maxX / totalValues;
26005
26151
  const gridY = (maxY - minY) / (maxValue - minValue || 1);
26006
26152
  const horizonY = maxY - Math.abs(minValue * gridY);
@@ -26016,7 +26162,7 @@
26016
26162
  }
26017
26163
  const parsedLabels = vue.computed(() => {
26018
26164
  const labels = [];
26019
- const points = genBars(props.modelValue.map(item => typeof item === 'number' ? item : item.value), boundary.value);
26165
+ const points = genBars(items.value, boundary.value);
26020
26166
  const len = points.length;
26021
26167
  for (let i = 0; labels.length < len; i++) {
26022
26168
  const item = points[i];
@@ -26031,7 +26177,7 @@
26031
26177
  }
26032
26178
  return labels;
26033
26179
  });
26034
- const bars = vue.computed(() => genBars(props.modelValue.map(item => typeof item === 'number' ? item : item.value), boundary.value));
26180
+ const bars = vue.computed(() => genBars(items.value, boundary.value));
26035
26181
  const offsetX = vue.computed(() => (Math.abs(bars.value[0].x - bars.value[1].x) - lineWidth.value) / 2);
26036
26182
  useRender(() => {
26037
26183
  const gradientData = !props.gradient.slice().length ? [''] : props.gradient.slice().reverse();
@@ -26181,8 +26327,8 @@
26181
26327
  maxY
26182
26328
  } = boundary;
26183
26329
  const totalValues = values.length;
26184
- const maxValue = Math.max(...values);
26185
- const minValue = Math.min(...values);
26330
+ const maxValue = props.max != null ? Number(props.max) : Math.max(...values);
26331
+ const minValue = props.min != null ? Number(props.min) : Math.min(...values);
26186
26332
  const gridX = (maxX - minX) / (totalValues - 1);
26187
26333
  const gridY = (maxY - minY) / (maxValue - minValue || 1);
26188
26334
  return values.map((value, index) => {
@@ -26209,9 +26355,10 @@
26209
26355
  maxY: parseInt(props.height, 10) - padding
26210
26356
  };
26211
26357
  });
26358
+ const items = vue.computed(() => props.modelValue.map(item => getPropertyFromItem(item, props.itemValue, item)));
26212
26359
  const parsedLabels = vue.computed(() => {
26213
26360
  const labels = [];
26214
- const points = genPoints(props.modelValue.map(item => typeof item === 'number' ? item : item.value), boundary.value);
26361
+ const points = genPoints(items.value, boundary.value);
26215
26362
  const len = points.length;
26216
26363
  for (let i = 0; labels.length < len; i++) {
26217
26364
  const item = points[i];
@@ -26255,6 +26402,9 @@
26255
26402
  }, {
26256
26403
  immediate: true
26257
26404
  });
26405
+ function genPath$1(fill) {
26406
+ return genPath(genPoints(items.value, boundary.value), props.smooth ? 8 : Number(props.smooth), fill, parseInt(props.height, 10));
26407
+ }
26258
26408
  useRender(() => {
26259
26409
  const gradientData = !props.gradient.slice().length ? [''] : props.gradient.slice().reverse();
26260
26410
  return vue.createVNode("svg", {
@@ -26286,9 +26436,13 @@
26286
26436
  value: item.value
26287
26437
  }) ?? item.value]))]), vue.createVNode("path", {
26288
26438
  "ref": path,
26289
- "d": genPath(genPoints(props.modelValue.map(item => typeof item === 'number' ? item : item.value), boundary.value), props.smooth ? 8 : Number(props.smooth), props.fill, parseInt(props.height, 10)),
26439
+ "d": genPath$1(props.fill),
26290
26440
  "fill": props.fill ? `url(#${id.value})` : 'none',
26291
26441
  "stroke": props.fill ? 'none' : `url(#${id.value})`
26442
+ }, null), props.fill && vue.createVNode("path", {
26443
+ "d": genPath$1(false),
26444
+ "fill": "none",
26445
+ "stroke": props.color ?? props.gradient?.[0]
26292
26446
  }, null)]);
26293
26447
  });
26294
26448
  }
@@ -26338,6 +26492,183 @@
26338
26492
  }
26339
26493
  });
26340
26494
 
26495
+ const makeVSpeedDialProps = propsFactory({
26496
+ ...makeComponentProps(),
26497
+ ...makeVMenuProps({
26498
+ offset: 8,
26499
+ minWidth: 0,
26500
+ location: 'top center'
26501
+ }),
26502
+ ...makeTransitionProps({
26503
+ transition: 'fade-transition'
26504
+ })
26505
+ }, 'VSpeedDial');
26506
+ const VSpeedDial = genericComponent()({
26507
+ name: 'VSpeedDial',
26508
+ props: makeVSpeedDialProps(),
26509
+ setup(props, _ref) {
26510
+ let {
26511
+ slots
26512
+ } = _ref;
26513
+ useRender(() => {
26514
+ const menuProps = VMenu.filterProps(props);
26515
+ return vue.createVNode(VMenu, vue.mergeProps(menuProps, {
26516
+ "class": props.class,
26517
+ "style": props.style,
26518
+ "contentClass": "v-speed-dial__content"
26519
+ }), {
26520
+ default: () => [vue.createVNode(VDefaultsProvider, {
26521
+ "defaults": {
26522
+ VBtn: {
26523
+ size: 'small'
26524
+ }
26525
+ }
26526
+ }, {
26527
+ default: () => [vue.createVNode(MaybeTransition, {
26528
+ "appear": true,
26529
+ "group": true,
26530
+ "transition": props.transition
26531
+ }, {
26532
+ default: () => [slots.default?.()]
26533
+ })]
26534
+ })]
26535
+ });
26536
+ });
26537
+ return {};
26538
+ }
26539
+ });
26540
+
26541
+ // Types
26542
+
26543
+ // Types
26544
+
26545
+ const makeVEmptyStateProps = propsFactory({
26546
+ actionText: String,
26547
+ bgColor: String,
26548
+ color: String,
26549
+ icon: IconValue,
26550
+ image: String,
26551
+ justify: {
26552
+ type: String,
26553
+ default: 'center'
26554
+ },
26555
+ headline: String,
26556
+ title: String,
26557
+ text: String,
26558
+ textWidth: {
26559
+ type: [Number, String],
26560
+ default: 500
26561
+ },
26562
+ href: String,
26563
+ to: String,
26564
+ ...makeComponentProps(),
26565
+ ...makeDimensionProps(),
26566
+ ...makeSizeProps({
26567
+ size: undefined
26568
+ }),
26569
+ ...makeThemeProps()
26570
+ }, 'VEmptyState');
26571
+ const VEmptyState = genericComponent()({
26572
+ name: 'VEmptyState',
26573
+ props: makeVEmptyStateProps(),
26574
+ emits: {
26575
+ 'click:action': e => true
26576
+ },
26577
+ setup(props, _ref) {
26578
+ let {
26579
+ emit,
26580
+ slots
26581
+ } = _ref;
26582
+ const {
26583
+ themeClasses
26584
+ } = provideTheme(props);
26585
+ const {
26586
+ backgroundColorClasses,
26587
+ backgroundColorStyles
26588
+ } = useBackgroundColor(vue.toRef(props, 'bgColor'));
26589
+ const {
26590
+ dimensionStyles
26591
+ } = useDimension(props);
26592
+ function onClickAction(e) {
26593
+ emit('click:action', e);
26594
+ }
26595
+ useRender(() => {
26596
+ const hasActions = !!(slots.actions || props.actionText);
26597
+ const hasHeadline = !!(slots.headline || props.headline);
26598
+ const hasTitle = !!(slots.title || props.title);
26599
+ const hasText = !!(slots.text || props.text);
26600
+ const hasMedia = !!(slots.media || props.image || props.icon);
26601
+ const size = props.size || (props.image ? 200 : 96);
26602
+ return vue.createVNode("div", {
26603
+ "class": ['v-empty-state', {
26604
+ [`v-empty-state--${props.justify}`]: true
26605
+ }, themeClasses.value, backgroundColorClasses.value, props.class],
26606
+ "style": [backgroundColorStyles.value, dimensionStyles.value, props.style]
26607
+ }, [hasMedia && vue.createVNode("div", {
26608
+ "key": "media",
26609
+ "class": "v-empty-state__media"
26610
+ }, [!slots.media ? vue.createVNode(vue.Fragment, null, [props.image ? vue.createVNode(VImg, {
26611
+ "key": "image",
26612
+ "src": props.image,
26613
+ "height": size
26614
+ }, null) : props.icon ? vue.createVNode(VIcon, {
26615
+ "key": "icon",
26616
+ "size": size,
26617
+ "icon": props.icon
26618
+ }, null) : undefined]) : vue.createVNode(VDefaultsProvider, {
26619
+ "key": "media-defaults",
26620
+ "defaults": {
26621
+ VImg: {
26622
+ src: props.image,
26623
+ height: size
26624
+ },
26625
+ VIcon: {
26626
+ size,
26627
+ icon: props.icon
26628
+ }
26629
+ }
26630
+ }, {
26631
+ default: () => [slots.media()]
26632
+ })]), hasHeadline && vue.createVNode("div", {
26633
+ "key": "headline",
26634
+ "class": "v-empty-state__headline"
26635
+ }, [slots.headline?.() ?? props.headline]), hasTitle && vue.createVNode("div", {
26636
+ "key": "title",
26637
+ "class": "v-empty-state__title"
26638
+ }, [slots.title?.() ?? props.title]), hasText && vue.createVNode("div", {
26639
+ "key": "text",
26640
+ "class": "v-empty-state__text",
26641
+ "style": {
26642
+ maxWidth: convertToUnit(props.textWidth)
26643
+ }
26644
+ }, [slots.text?.() ?? props.text]), slots.default && vue.createVNode("div", {
26645
+ "key": "content",
26646
+ "class": "v-empty-state__content"
26647
+ }, [slots.default()]), hasActions && vue.createVNode("div", {
26648
+ "key": "actions",
26649
+ "class": "v-empty-state__actions"
26650
+ }, [vue.createVNode(VDefaultsProvider, {
26651
+ "defaults": {
26652
+ VBtn: {
26653
+ class: 'v-empty-state__action-btn',
26654
+ color: props.color,
26655
+ text: props.actionText
26656
+ }
26657
+ }
26658
+ }, {
26659
+ default: () => [slots.actions?.({
26660
+ props: {
26661
+ onClick: onClickAction
26662
+ }
26663
+ }) ?? vue.createVNode(VBtn, {
26664
+ "onClick": onClickAction
26665
+ }, null)]
26666
+ })])]);
26667
+ });
26668
+ return {};
26669
+ }
26670
+ });
26671
+
26341
26672
  var components = /*#__PURE__*/Object.freeze({
26342
26673
  __proto__: null,
26343
26674
  VAlert: VAlert,
@@ -26407,12 +26738,14 @@
26407
26738
  VDialogTopTransition: VDialogTopTransition,
26408
26739
  VDialogTransition: VDialogTransition,
26409
26740
  VDivider: VDivider,
26741
+ VEmptyState: VEmptyState,
26410
26742
  VExpandTransition: VExpandTransition,
26411
26743
  VExpandXTransition: VExpandXTransition,
26412
26744
  VExpansionPanel: VExpansionPanel,
26413
26745
  VExpansionPanelText: VExpansionPanelText,
26414
26746
  VExpansionPanelTitle: VExpansionPanelTitle,
26415
26747
  VExpansionPanels: VExpansionPanels,
26748
+ VFab: VFab,
26416
26749
  VFabTransition: VFabTransition,
26417
26750
  VFadeTransition: VFadeTransition,
26418
26751
  VField: VField,
@@ -26482,6 +26815,7 @@
26482
26815
  VSnackbar: VSnackbar,
26483
26816
  VSpacer: VSpacer,
26484
26817
  VSparkline: VSparkline,
26818
+ VSpeedDial: VSpeedDial,
26485
26819
  VStepper: VStepper,
26486
26820
  VStepperActions: VStepperActions,
26487
26821
  VStepperHeader: VStepperHeader,
@@ -26729,7 +27063,7 @@
26729
27063
  goTo
26730
27064
  };
26731
27065
  }
26732
- const version$1 = "3.5.6";
27066
+ const version$1 = "3.5.8";
26733
27067
  createVuetify$1.version = version$1;
26734
27068
 
26735
27069
  // Vue's inject() can only be used in setup
@@ -26743,7 +27077,7 @@
26743
27077
 
26744
27078
  /* eslint-disable local-rules/sort-imports */
26745
27079
 
26746
- const version = "3.5.6";
27080
+ const version = "3.5.8";
26747
27081
 
26748
27082
  /* eslint-disable local-rules/sort-imports */
26749
27083