vuetify 3.5.5 → 3.5.7

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 (86) hide show
  1. package/dist/_component-variables-labs.sass +2 -0
  2. package/dist/json/attributes.json +352 -40
  3. package/dist/json/importMap-labs.json +16 -8
  4. package/dist/json/importMap.json +122 -118
  5. package/dist/json/tags.json +93 -0
  6. package/dist/json/web-types.json +1084 -52
  7. package/dist/vuetify-labs.css +2121 -1996
  8. package/dist/vuetify-labs.d.ts +1336 -128
  9. package/dist/vuetify-labs.esm.js +332 -81
  10. package/dist/vuetify-labs.esm.js.map +1 -1
  11. package/dist/vuetify-labs.js +332 -81
  12. package/dist/vuetify-labs.min.css +2 -2
  13. package/dist/vuetify.css +838 -839
  14. package/dist/vuetify.d.ts +320 -145
  15. package/dist/vuetify.esm.js +87 -75
  16. package/dist/vuetify.esm.js.map +1 -1
  17. package/dist/vuetify.js +87 -75
  18. package/dist/vuetify.js.map +1 -1
  19. package/dist/vuetify.min.css +2 -2
  20. package/dist/vuetify.min.js +60 -58
  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 +33 -29
  25. package/lib/components/VAutocomplete/VAutocomplete.mjs.map +1 -1
  26. package/lib/components/VAutocomplete/VAutocomplete.sass +1 -1
  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 +22 -23
  31. package/lib/components/VCombobox/VCombobox.mjs.map +1 -1
  32. package/lib/components/VCombobox/VCombobox.sass +1 -1
  33. package/lib/components/VDataIterator/VDataIterator.mjs.map +1 -1
  34. package/lib/components/VDataIterator/index.d.mts +50 -94
  35. package/lib/components/VDataTable/index.d.mts +214 -1
  36. package/lib/components/VDataTable/index.mjs +1 -0
  37. package/lib/components/VDataTable/index.mjs.map +1 -1
  38. package/lib/components/VExpansionPanel/VExpansionPanel.css +4 -7
  39. package/lib/components/VExpansionPanel/VExpansionPanel.sass +4 -3
  40. package/lib/components/VExpansionPanel/VExpansionPanelTitle.mjs +2 -0
  41. package/lib/components/VExpansionPanel/VExpansionPanelTitle.mjs.map +1 -1
  42. package/lib/components/VExpansionPanel/VExpansionPanels.mjs +2 -0
  43. package/lib/components/VExpansionPanel/VExpansionPanels.mjs.map +1 -1
  44. package/lib/components/VExpansionPanel/index.d.mts +27 -0
  45. package/lib/components/VLayout/index.d.mts +8 -6
  46. package/lib/components/VSelect/VSelect.mjs +20 -18
  47. package/lib/components/VSelect/VSelect.mjs.map +1 -1
  48. package/lib/components/VToolbar/VToolbar.css +3 -1
  49. package/lib/components/VToolbar/VToolbar.sass +2 -1
  50. package/lib/components/index.d.mts +279 -106
  51. package/lib/composables/filter.mjs +1 -1
  52. package/lib/composables/filter.mjs.map +1 -1
  53. package/lib/composables/goto.mjs +2 -2
  54. package/lib/composables/goto.mjs.map +1 -1
  55. package/lib/composables/layout.mjs.map +1 -1
  56. package/lib/entry-bundler.mjs +1 -1
  57. package/lib/framework.mjs +1 -1
  58. package/lib/index.d.mts +42 -39
  59. package/lib/labs/VEmptyState/VEmptyState.css +59 -0
  60. package/lib/labs/VEmptyState/VEmptyState.mjs +145 -0
  61. package/lib/labs/VEmptyState/VEmptyState.mjs.map +1 -0
  62. package/lib/labs/VEmptyState/VEmptyState.sass +53 -0
  63. package/lib/labs/VEmptyState/_variables.scss +22 -0
  64. package/lib/labs/VEmptyState/index.d.mts +415 -0
  65. package/lib/labs/VEmptyState/index.mjs +2 -0
  66. package/lib/labs/VEmptyState/index.mjs.map +1 -0
  67. package/lib/labs/VFab/VFab.css +69 -0
  68. package/lib/labs/VFab/VFab.mjs +114 -0
  69. package/lib/labs/VFab/VFab.mjs.map +1 -0
  70. package/lib/labs/VFab/VFab.sass +82 -0
  71. package/lib/labs/VFab/_mixins.scss +22 -0
  72. package/lib/labs/VFab/_variables.scss +33 -0
  73. package/lib/labs/VFab/index.d.mts +656 -0
  74. package/lib/labs/VFab/index.mjs +2 -0
  75. package/lib/labs/VFab/index.mjs.map +1 -0
  76. package/lib/labs/VSparkline/VBarline.mjs +4 -4
  77. package/lib/labs/VSparkline/VBarline.mjs.map +1 -1
  78. package/lib/labs/VSparkline/VTrendline.mjs +6 -2
  79. package/lib/labs/VSparkline/VTrendline.mjs.map +1 -1
  80. package/lib/labs/VSparkline/index.d.mts +12 -0
  81. package/lib/labs/VSparkline/util/line.mjs +2 -0
  82. package/lib/labs/VSparkline/util/line.mjs.map +1 -1
  83. package/lib/labs/components.d.mts +1066 -2
  84. package/lib/labs/components.mjs +2 -0
  85. package/lib/labs/components.mjs.map +1 -1
  86. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.5.5
2
+ * Vuetify v3.5.7
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -6891,7 +6891,8 @@
6891
6891
  id,
6892
6892
  messagesId,
6893
6893
  isDisabled,
6894
- isReadonly
6894
+ isReadonly,
6895
+ isValid
6895
6896
  } = _ref2;
6896
6897
  return vue.createVNode(VCheckboxBtn, vue.mergeProps(checkboxProps, {
6897
6898
  "id": id.value,
@@ -6899,6 +6900,7 @@
6899
6900
  "disabled": isDisabled.value,
6900
6901
  "readonly": isReadonly.value
6901
6902
  }, controlAttrs, {
6903
+ "error": isValid.value === false,
6902
6904
  "modelValue": model.value,
6903
6905
  "onUpdate:modelValue": $event => model.value = $event,
6904
6906
  "onFocus": focus,
@@ -11848,20 +11850,27 @@
11848
11850
  model.value = [item];
11849
11851
  }
11850
11852
  }
11853
+
11854
+ /** @param set - null means toggle */
11851
11855
  function select(item) {
11852
- const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value));
11853
- const add = index === -1;
11856
+ let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
11857
+ if (item.props.disabled) return;
11854
11858
  if (props.multiple) {
11855
- if (add) {
11856
- model.value = [...model.value, item];
11857
- } else {
11858
- const value = [...model.value];
11859
+ const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value));
11860
+ const add = set == null ? !~index : set;
11861
+ if (~index) {
11862
+ const value = add ? [...model.value, item] : [...model.value];
11859
11863
  value.splice(index, 1);
11860
11864
  model.value = value;
11865
+ } else if (add) {
11866
+ model.value = [...model.value, item];
11861
11867
  }
11862
11868
  } else {
11869
+ const add = set !== false;
11863
11870
  model.value = add ? [item] : [];
11864
- menu.value = false;
11871
+ vue.nextTick(() => {
11872
+ menu.value = false;
11873
+ });
11865
11874
  }
11866
11875
  }
11867
11876
  function onBlur(e) {
@@ -11895,14 +11904,9 @@
11895
11904
  });
11896
11905
  }
11897
11906
  });
11898
- vue.watch(displayItems, (val, oldVal) => {
11899
- if (!isFocused.value) return;
11900
- if (!val.length && props.hideNoData) {
11901
- menu.value = false;
11902
- }
11903
- if (!oldVal.length && val.length) {
11904
- menu.value = true;
11905
- }
11907
+ vue.watch(() => props.items, val => {
11908
+ if (!isFocused.value || !val.length || menu.value) return;
11909
+ menu.value = true;
11906
11910
  });
11907
11911
  useRender(() => {
11908
11912
  const hasChips = !!(props.chips || slots.chip);
@@ -11980,7 +11984,7 @@
11980
11984
  const itemProps = vue.mergeProps(item.props, {
11981
11985
  ref: itemRef,
11982
11986
  key: index,
11983
- onClick: () => select(item)
11987
+ onClick: () => select(item, null)
11984
11988
  });
11985
11989
  return slots.item?.({
11986
11990
  item,
@@ -12012,7 +12016,7 @@
12012
12016
  function onChipClose(e) {
12013
12017
  e.stopPropagation();
12014
12018
  e.preventDefault();
12015
- select(item);
12019
+ select(item, false);
12016
12020
  }
12017
12021
  const slotProps = {
12018
12022
  'onClick:close': onChipClose,
@@ -12122,7 +12126,7 @@
12122
12126
  if (typeof item === 'object') {
12123
12127
  const filterKeys = keys || Object.keys(transformed);
12124
12128
  for (const key of filterKeys) {
12125
- const value = getPropertyFromItem(transformed, key, transformed);
12129
+ const value = getPropertyFromItem(transformed, key);
12126
12130
  const keyFilter = options?.customKeyFilter?.[key];
12127
12131
  match = keyFilter ? keyFilter(value, query, item) : filter(value, query, item);
12128
12132
  if (match !== -1 && match !== false) {
@@ -12287,6 +12291,8 @@
12287
12291
  }
12288
12292
  return filteredItems.value;
12289
12293
  });
12294
+ const hasChips = vue.computed(() => !!(props.chips || slots.chip));
12295
+ const hasSelectionSlot = vue.computed(() => hasChips.value || !!slots.selection);
12290
12296
  const selectedValues = vue.computed(() => model.value.map(selection => selection.props.value));
12291
12297
  const highlightFirst = vue.computed(() => {
12292
12298
  const selectFirst = props.autoSelectFirst === true || props.autoSelectFirst === 'exact' && search.value === displayItems.value[0]?.title;
@@ -12345,7 +12351,7 @@
12345
12351
  }
12346
12352
  const originalSelectionIndex = selectionIndex.value;
12347
12353
  const selectedItem = model.value[selectionIndex.value];
12348
- if (selectedItem && !selectedItem.props.disabled) select(selectedItem);
12354
+ if (selectedItem && !selectedItem.props.disabled) select(selectedItem, false);
12349
12355
  selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex;
12350
12356
  }
12351
12357
  if (e.key === 'ArrowLeft') {
@@ -12396,35 +12402,41 @@
12396
12402
  if (v == null || v === '' && !props.multiple) model.value = [];
12397
12403
  }
12398
12404
  const isSelecting = vue.shallowRef(false);
12405
+
12406
+ /** @param set - null means toggle */
12399
12407
  function select(item) {
12408
+ let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
12400
12409
  if (item.props.disabled) return;
12401
- const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value));
12402
- const add = index === -1;
12403
12410
  if (props.multiple) {
12404
- if (add) {
12405
- model.value = [...model.value, item];
12406
- } else {
12407
- const value = [...model.value];
12411
+ const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value));
12412
+ const add = set == null ? !~index : set;
12413
+ if (~index) {
12414
+ const value = add ? [...model.value, item] : [...model.value];
12408
12415
  value.splice(index, 1);
12409
12416
  model.value = value;
12417
+ } else if (add) {
12418
+ model.value = [...model.value, item];
12410
12419
  }
12411
12420
  if (props.clearOnSelect) {
12412
12421
  search.value = '';
12413
12422
  }
12414
12423
  } else {
12424
+ const add = set !== false;
12415
12425
  model.value = add ? [item] : [];
12416
- isSelecting.value = true;
12417
- search.value = add ? item.title : '';
12418
- menu.value = false;
12419
- isPristine.value = true;
12420
- vue.nextTick(() => isSelecting.value = false);
12426
+ search.value = add && !hasSelectionSlot.value ? item.title : '';
12427
+
12428
+ // watch for search watcher to trigger
12429
+ vue.nextTick(() => {
12430
+ menu.value = false;
12431
+ isPristine.value = true;
12432
+ });
12421
12433
  }
12422
12434
  }
12423
12435
  vue.watch(isFocused, (val, oldVal) => {
12424
12436
  if (val === oldVal) return;
12425
12437
  if (val) {
12426
12438
  isSelecting.value = true;
12427
- search.value = props.multiple ? '' : String(model.value.at(-1)?.props.title ?? '');
12439
+ search.value = props.multiple || hasSelectionSlot.value ? '' : String(model.value.at(-1)?.props.title ?? '');
12428
12440
  isPristine.value = true;
12429
12441
  vue.nextTick(() => isSelecting.value = false);
12430
12442
  } else {
@@ -12454,17 +12466,11 @@
12454
12466
  });
12455
12467
  }
12456
12468
  });
12457
- vue.watch(displayItems, (val, oldVal) => {
12458
- if (!isFocused.value) return;
12459
- if (!val.length && props.hideNoData) {
12460
- menu.value = false;
12461
- }
12462
- if (!oldVal.length && val.length) {
12463
- menu.value = true;
12464
- }
12469
+ vue.watch(() => props.items, val => {
12470
+ if (!isFocused.value || !val.length || menu.value) return;
12471
+ menu.value = true;
12465
12472
  });
12466
12473
  useRender(() => {
12467
- const hasChips = !!(props.chips || slots.chip);
12468
12474
  const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']);
12469
12475
  const isDirty = model.value.length > 0;
12470
12476
  const textFieldProps = VTextField.filterProps(props);
@@ -12482,7 +12488,7 @@
12482
12488
  "class": ['v-autocomplete', `v-autocomplete--${props.multiple ? 'multiple' : 'single'}`, {
12483
12489
  'v-autocomplete--active-menu': menu.value,
12484
12490
  'v-autocomplete--chips': !!props.chips,
12485
- 'v-autocomplete--selection-slot': !!slots.selection,
12491
+ 'v-autocomplete--selection-slot': !!hasSelectionSlot.value,
12486
12492
  'v-autocomplete--selecting-index': selectionIndex.value > -1
12487
12493
  }, props.class],
12488
12494
  "style": props.style,
@@ -12537,13 +12543,15 @@
12537
12543
  ref: itemRef,
12538
12544
  key: index,
12539
12545
  active: highlightFirst.value && index === 0 ? true : undefined,
12540
- onClick: () => select(item)
12546
+ onClick: () => select(item, null)
12541
12547
  });
12542
12548
  return slots.item?.({
12543
12549
  item,
12544
12550
  index,
12545
12551
  props: itemProps
12546
- }) ?? vue.createVNode(VListItem, itemProps, {
12552
+ }) ?? vue.createVNode(VListItem, vue.mergeProps(itemProps, {
12553
+ "role": "option"
12554
+ }), {
12547
12555
  prepend: _ref4 => {
12548
12556
  let {
12549
12557
  isSelected
@@ -12570,7 +12578,7 @@
12570
12578
  function onChipClose(e) {
12571
12579
  e.stopPropagation();
12572
12580
  e.preventDefault();
12573
- select(item);
12581
+ select(item, false);
12574
12582
  }
12575
12583
  const slotProps = {
12576
12584
  'onClick:close': onChipClose,
@@ -12581,8 +12589,8 @@
12581
12589
  modelValue: true,
12582
12590
  'onUpdate:modelValue': undefined
12583
12591
  };
12584
- const hasSlot = hasChips ? !!slots.chip : !!slots.selection;
12585
- const slotContent = hasSlot ? ensureValidVNode(hasChips ? slots.chip({
12592
+ const hasSlot = hasChips.value ? !!slots.chip : !!slots.selection;
12593
+ const slotContent = hasSlot ? ensureValidVNode(hasChips.value ? slots.chip({
12586
12594
  item,
12587
12595
  index,
12588
12596
  props: slotProps
@@ -12595,7 +12603,7 @@
12595
12603
  "key": item.value,
12596
12604
  "class": ['v-autocomplete__selection', index === selectionIndex.value && ['v-autocomplete__selection--selected', textColorClasses.value]],
12597
12605
  "style": index === selectionIndex.value ? textColorStyles.value : {}
12598
- }, [hasChips ? !slots.chip ? vue.createVNode(VChip, vue.mergeProps({
12606
+ }, [hasChips.value ? !slots.chip ? vue.createVNode(VChip, vue.mergeProps({
12599
12607
  "key": "chip",
12600
12608
  "closable": props.closableChips,
12601
12609
  "size": "small",
@@ -16034,14 +16042,16 @@
16034
16042
  return props.multiple ? transformed : transformed[0] ?? null;
16035
16043
  });
16036
16044
  const form = useForm();
16037
- const _search = vue.shallowRef(!props.multiple ? model.value[0]?.title ?? '' : '');
16045
+ const hasChips = vue.computed(() => !!(props.chips || slots.chip));
16046
+ const hasSelectionSlot = vue.computed(() => hasChips.value || !!slots.selection);
16047
+ const _search = vue.shallowRef(!props.multiple && !hasSelectionSlot.value ? model.value[0]?.title ?? '' : '');
16038
16048
  const search = vue.computed({
16039
16049
  get: () => {
16040
16050
  return _search.value;
16041
16051
  },
16042
16052
  set: val => {
16043
16053
  _search.value = val ?? '';
16044
- if (!props.multiple) {
16054
+ if (!props.multiple && !hasSelectionSlot.value) {
16045
16055
  model.value = [transformItem$3(props, val)];
16046
16056
  }
16047
16057
  if (val && props.multiple && props.delimiters?.length) {
@@ -16072,7 +16082,7 @@
16072
16082
  emit('update:search', value);
16073
16083
  });
16074
16084
  vue.watch(model, value => {
16075
- if (!props.multiple) {
16085
+ if (!props.multiple && !hasSelectionSlot.value) {
16076
16086
  _search.value = value[0]?.title ?? '';
16077
16087
  }
16078
16088
  });
@@ -16137,6 +16147,10 @@
16137
16147
  if (e.key === 'ArrowDown' && highlightFirst.value) {
16138
16148
  listRef.value?.focus('next');
16139
16149
  }
16150
+ if (e.key === 'Enter' && search.value) {
16151
+ select(transformItem$3(props, search.value));
16152
+ if (hasSelectionSlot.value) search.value = '';
16153
+ }
16140
16154
  if (!props.multiple) return;
16141
16155
  if (['Backspace', 'Delete'].includes(e.key)) {
16142
16156
  if (selectionIndex.value < 0) {
@@ -16170,10 +16184,6 @@
16170
16184
  vTextFieldRef.value.setSelectionRange(0, 0);
16171
16185
  }
16172
16186
  }
16173
- if (e.key === 'Enter' && search.value) {
16174
- select(transformItem$3(props, search.value));
16175
- search.value = '';
16176
- }
16177
16187
  }
16178
16188
  function onAfterLeave() {
16179
16189
  if (isFocused.value) {
@@ -16184,6 +16194,7 @@
16184
16194
  /** @param set - null means toggle */
16185
16195
  function select(item) {
16186
16196
  let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
16197
+ if (item.props.disabled) return;
16187
16198
  if (props.multiple) {
16188
16199
  const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value));
16189
16200
  const add = set == null ? !~index : set;
@@ -16200,7 +16211,7 @@
16200
16211
  } else {
16201
16212
  const add = set !== false;
16202
16213
  model.value = add ? [item] : [];
16203
- _search.value = add ? item.title : '';
16214
+ _search.value = add && !hasSelectionSlot.value ? item.title : '';
16204
16215
 
16205
16216
  // watch for search watcher to trigger
16206
16217
  vue.nextTick(() => {
@@ -16232,7 +16243,7 @@
16232
16243
  return value === displayItems.value[0].value;
16233
16244
  })) {
16234
16245
  select(displayItems.value[0]);
16235
- } else if (props.multiple && search.value) {
16246
+ } else if (search.value) {
16236
16247
  select(transformItem$3(props, search.value));
16237
16248
  }
16238
16249
  });
@@ -16244,17 +16255,11 @@
16244
16255
  });
16245
16256
  }
16246
16257
  });
16247
- vue.watch(displayItems, (val, oldVal) => {
16248
- if (!isFocused.value) return;
16249
- if (!val.length && props.hideNoData) {
16250
- menu.value = false;
16251
- }
16252
- if (!oldVal.length && val.length) {
16253
- menu.value = true;
16254
- }
16258
+ vue.watch(() => props.items, val => {
16259
+ if (!isFocused.value || !val.length || menu.value) return;
16260
+ menu.value = true;
16255
16261
  });
16256
16262
  useRender(() => {
16257
- const hasChips = !!(props.chips || slots.chip);
16258
16263
  const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']);
16259
16264
  const isDirty = model.value.length > 0;
16260
16265
  const textFieldProps = VTextField.filterProps(props);
@@ -16271,7 +16276,7 @@
16271
16276
  "class": ['v-combobox', {
16272
16277
  'v-combobox--active-menu': menu.value,
16273
16278
  'v-combobox--chips': !!props.chips,
16274
- 'v-combobox--selection-slot': !!slots.selection,
16279
+ 'v-combobox--selection-slot': !!hasSelectionSlot.value,
16275
16280
  'v-combobox--selecting-index': selectionIndex.value > -1,
16276
16281
  [`v-combobox--${props.multiple ? 'multiple' : 'single'}`]: true
16277
16282
  }, props.class],
@@ -16333,7 +16338,9 @@
16333
16338
  item,
16334
16339
  index,
16335
16340
  props: itemProps
16336
- }) ?? vue.createVNode(VListItem, itemProps, {
16341
+ }) ?? vue.createVNode(VListItem, vue.mergeProps(itemProps, {
16342
+ "role": "option"
16343
+ }), {
16337
16344
  prepend: _ref4 => {
16338
16345
  let {
16339
16346
  isSelected
@@ -16371,8 +16378,8 @@
16371
16378
  modelValue: true,
16372
16379
  'onUpdate:modelValue': undefined
16373
16380
  };
16374
- const hasSlot = hasChips ? !!slots.chip : !!slots.selection;
16375
- const slotContent = hasSlot ? ensureValidVNode(hasChips ? slots.chip({
16381
+ const hasSlot = hasChips.value ? !!slots.chip : !!slots.selection;
16382
+ const slotContent = hasSlot ? ensureValidVNode(hasChips.value ? slots.chip({
16376
16383
  item,
16377
16384
  index,
16378
16385
  props: slotProps
@@ -16385,7 +16392,7 @@
16385
16392
  "key": item.value,
16386
16393
  "class": ['v-combobox__selection', index === selectionIndex.value && ['v-combobox__selection--selected', textColorClasses.value]],
16387
16394
  "style": index === selectionIndex.value ? textColorStyles.value : {}
16388
- }, [hasChips ? !slots.chip ? vue.createVNode(VChip, vue.mergeProps({
16395
+ }, [hasChips.value ? !slots.chip ? vue.createVNode(VChip, vue.mergeProps({
16389
16396
  "key": "chip",
16390
16397
  "closable": props.closableChips,
16391
16398
  "size": "small",
@@ -17676,7 +17683,7 @@
17676
17683
  return new Promise(resolve => requestAnimationFrame(function step(currentTime) {
17677
17684
  const timeElapsed = currentTime - startTime;
17678
17685
  const progress = timeElapsed / options.duration;
17679
- const location = Math.floor(startLocation + (targetLocation - startLocation) * ease(Math.max(progress, 1)));
17686
+ const location = Math.floor(startLocation + (targetLocation - startLocation) * ease(clamp(progress, 0, 1)));
17680
17687
  container[property] = location;
17681
17688
 
17682
17689
  // Allow for some jitter if target time has elapsed
@@ -21100,6 +21107,7 @@
21100
21107
  const makeVExpansionPanelsProps = propsFactory({
21101
21108
  color: String,
21102
21109
  flat: Boolean,
21110
+ focusable: Boolean,
21103
21111
  static: Boolean,
21104
21112
  tile: Boolean,
21105
21113
  variant: {
@@ -21134,6 +21142,7 @@
21134
21142
  readonly: vue.toRef(props, 'readonly')
21135
21143
  },
21136
21144
  VExpansionPanelTitle: {
21145
+ focusable: vue.toRef(props, 'focusable'),
21137
21146
  static: vue.toRef(props, 'static')
21138
21147
  }
21139
21148
  });
@@ -21192,6 +21201,7 @@
21192
21201
  default: '$collapse'
21193
21202
  },
21194
21203
  hideActions: Boolean,
21204
+ focusable: Boolean,
21195
21205
  static: Boolean,
21196
21206
  ripple: {
21197
21207
  type: [Boolean, Object],
@@ -21226,6 +21236,7 @@
21226
21236
  useRender(() => vue.withDirectives(vue.createVNode("button", {
21227
21237
  "class": ['v-expansion-panel-title', {
21228
21238
  'v-expansion-panel-title--active': expansionPanel.isSelected.value,
21239
+ 'v-expansion-panel-title--focusable': props.focusable,
21229
21240
  'v-expansion-panel-title--static': props.static
21230
21241
  }, backgroundColorClasses.value, props.class],
21231
21242
  "style": [backgroundColorStyles.value, props.style],
@@ -25896,6 +25907,106 @@
25896
25907
  }
25897
25908
  });
25898
25909
 
25910
+ const makeVFabProps = propsFactory({
25911
+ app: Boolean,
25912
+ appear: Boolean,
25913
+ extended: Boolean,
25914
+ location: {
25915
+ type: String,
25916
+ default: 'bottom end'
25917
+ },
25918
+ offset: Boolean,
25919
+ modelValue: {
25920
+ type: Boolean,
25921
+ default: true
25922
+ },
25923
+ ...omit(makeVBtnProps({
25924
+ active: true
25925
+ }), ['location']),
25926
+ ...makeLayoutItemProps(),
25927
+ ...makeTransitionProps({
25928
+ transition: 'fab-transition'
25929
+ })
25930
+ }, 'VFab');
25931
+ const VFab = genericComponent()({
25932
+ name: 'VFab',
25933
+ props: makeVFabProps(),
25934
+ emits: {
25935
+ 'update:modelValue': value => true
25936
+ },
25937
+ setup(props, _ref) {
25938
+ let {
25939
+ slots
25940
+ } = _ref;
25941
+ const model = useProxiedModel(props, 'modelValue');
25942
+ const height = vue.shallowRef(56);
25943
+ const layoutItemStyles = vue.ref();
25944
+ const {
25945
+ resizeRef
25946
+ } = useResizeObserver(entries => {
25947
+ if (!entries.length) return;
25948
+ height.value = entries[0].target.clientHeight;
25949
+ });
25950
+ const hasPosition = vue.computed(() => props.app || props.absolute);
25951
+ const position = vue.computed(() => {
25952
+ if (!hasPosition.value) return false;
25953
+ return props.location.split(' ').shift();
25954
+ });
25955
+ const orientation = vue.computed(() => {
25956
+ if (!hasPosition.value) return false;
25957
+ return props.location.split(' ')[1] ?? 'end';
25958
+ });
25959
+ useToggleScope(() => props.app, () => {
25960
+ const layout = useLayoutItem({
25961
+ id: props.name,
25962
+ order: vue.computed(() => parseInt(props.order, 10)),
25963
+ position,
25964
+ layoutSize: height,
25965
+ elementSize: vue.computed(() => height.value + 32),
25966
+ active: vue.computed(() => props.app && model.value),
25967
+ absolute: vue.toRef(props, 'absolute')
25968
+ });
25969
+ vue.watchEffect(() => {
25970
+ layoutItemStyles.value = layout.layoutItemStyles.value;
25971
+ });
25972
+ });
25973
+ const vFabRef = vue.ref();
25974
+ useRender(() => {
25975
+ const btnProps = VBtn.filterProps(props);
25976
+ return vue.createVNode("div", {
25977
+ "ref": vFabRef,
25978
+ "class": ['v-fab', {
25979
+ 'v-fab--absolute': props.absolute,
25980
+ 'v-fab--app': !!props.app,
25981
+ 'v-fab--extended': props.extended,
25982
+ 'v-fab--offset': props.offset,
25983
+ [`v-fab--${position.value}`]: hasPosition.value,
25984
+ [`v-fab--${orientation.value}`]: hasPosition.value
25985
+ }, props.class],
25986
+ "style": [props.app ? {
25987
+ ...layoutItemStyles.value
25988
+ } : {
25989
+ height: 'inherit',
25990
+ width: undefined
25991
+ }, props.style]
25992
+ }, [vue.createVNode("div", {
25993
+ "class": "v-fab__container"
25994
+ }, [vue.createVNode(MaybeTransition, {
25995
+ "appear": props.appear,
25996
+ "transition": props.transition
25997
+ }, {
25998
+ default: () => [vue.withDirectives(vue.createVNode(VBtn, vue.mergeProps({
25999
+ "ref": resizeRef
26000
+ }, btnProps, {
26001
+ "active": undefined,
26002
+ "location": undefined
26003
+ }), slots), [[vue.vShow, props.active]])]
26004
+ })])]);
26005
+ });
26006
+ return {};
26007
+ }
26008
+ });
26009
+
25899
26010
  // Utilities
25900
26011
 
25901
26012
  // Types
@@ -25938,6 +26049,8 @@
25938
26049
  type: Array,
25939
26050
  default: () => []
25940
26051
  },
26052
+ min: [String, Number],
26053
+ max: [String, Number],
25941
26054
  padding: {
25942
26055
  type: [String, Number],
25943
26056
  default: 8
@@ -25987,10 +26100,10 @@
25987
26100
  maxY
25988
26101
  } = boundary;
25989
26102
  const totalValues = values.length;
25990
- let maxValue = Math.max(...values);
25991
- let minValue = Math.min(...values);
25992
- if (minValue > 0) minValue = 0;
25993
- if (maxValue < 0) maxValue = 0;
26103
+ let maxValue = props.max != null ? Number(props.max) : Math.max(...values);
26104
+ let minValue = props.min != null ? Number(props.min) : Math.min(...values);
26105
+ if (minValue > 0 && props.min == null) minValue = 0;
26106
+ if (maxValue < 0 && props.max == null) maxValue = 0;
25994
26107
  const gridX = maxX / totalValues;
25995
26108
  const gridY = (maxY - minY) / (maxValue - minValue || 1);
25996
26109
  const horizonY = maxY - Math.abs(minValue * gridY);
@@ -26171,8 +26284,8 @@
26171
26284
  maxY
26172
26285
  } = boundary;
26173
26286
  const totalValues = values.length;
26174
- const maxValue = Math.max(...values);
26175
- const minValue = Math.min(...values);
26287
+ const maxValue = props.max != null ? Number(props.max) : Math.max(...values);
26288
+ const minValue = props.min != null ? Number(props.min) : Math.min(...values);
26176
26289
  const gridX = (maxX - minX) / (totalValues - 1);
26177
26290
  const gridY = (maxY - minY) / (maxValue - minValue || 1);
26178
26291
  return values.map((value, index) => {
@@ -26279,6 +26392,10 @@
26279
26392
  "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)),
26280
26393
  "fill": props.fill ? `url(#${id.value})` : 'none',
26281
26394
  "stroke": props.fill ? 'none' : `url(#${id.value})`
26395
+ }, null), props.fill && vue.createVNode("path", {
26396
+ "d": genPath(genPoints(props.modelValue.map(item => typeof item === 'number' ? item : item.value), boundary.value), props.smooth ? 8 : Number(props.smooth), false, parseInt(props.height, 10)),
26397
+ "fill": "none",
26398
+ "stroke": props.color ?? props.gradient?.[0]
26282
26399
  }, null)]);
26283
26400
  });
26284
26401
  }
@@ -26328,6 +26445,137 @@
26328
26445
  }
26329
26446
  });
26330
26447
 
26448
+ // Types
26449
+
26450
+ // Types
26451
+
26452
+ const makeVEmptyStateProps = propsFactory({
26453
+ actionText: String,
26454
+ bgColor: String,
26455
+ color: String,
26456
+ icon: IconValue,
26457
+ image: String,
26458
+ justify: {
26459
+ type: String,
26460
+ default: 'center'
26461
+ },
26462
+ headline: String,
26463
+ title: String,
26464
+ text: String,
26465
+ textWidth: {
26466
+ type: [Number, String],
26467
+ default: 500
26468
+ },
26469
+ href: String,
26470
+ to: String,
26471
+ ...makeComponentProps(),
26472
+ ...makeDimensionProps(),
26473
+ ...makeSizeProps({
26474
+ size: undefined
26475
+ }),
26476
+ ...makeThemeProps()
26477
+ }, 'VEmptyState');
26478
+ const VEmptyState = genericComponent()({
26479
+ name: 'VEmptyState',
26480
+ props: makeVEmptyStateProps(),
26481
+ emits: {
26482
+ 'click:action': e => true
26483
+ },
26484
+ setup(props, _ref) {
26485
+ let {
26486
+ emit,
26487
+ slots
26488
+ } = _ref;
26489
+ const {
26490
+ themeClasses
26491
+ } = provideTheme(props);
26492
+ const {
26493
+ backgroundColorClasses,
26494
+ backgroundColorStyles
26495
+ } = useBackgroundColor(vue.toRef(props, 'bgColor'));
26496
+ const {
26497
+ dimensionStyles
26498
+ } = useDimension(props);
26499
+ function onClickAction(e) {
26500
+ emit('click:action', e);
26501
+ }
26502
+ useRender(() => {
26503
+ const hasActions = !!(slots.actions || props.actionText);
26504
+ const hasHeadline = !!(slots.headline || props.headline);
26505
+ const hasTitle = !!(slots.title || props.title);
26506
+ const hasText = !!(slots.text || props.text);
26507
+ const hasMedia = !!(slots.media || props.image || props.icon);
26508
+ const size = props.size || (props.image ? 200 : 96);
26509
+ return vue.createVNode("div", {
26510
+ "class": ['v-empty-state', {
26511
+ [`v-empty-state--${props.justify}`]: true
26512
+ }, themeClasses.value, backgroundColorClasses.value, props.class],
26513
+ "style": [backgroundColorStyles.value, dimensionStyles.value, props.style]
26514
+ }, [hasMedia && vue.createVNode("div", {
26515
+ "key": "media",
26516
+ "class": "v-empty-state__media"
26517
+ }, [!slots.media ? vue.createVNode(vue.Fragment, null, [props.image ? vue.createVNode(VImg, {
26518
+ "key": "image",
26519
+ "src": props.image,
26520
+ "height": size
26521
+ }, null) : props.icon ? vue.createVNode(VIcon, {
26522
+ "key": "icon",
26523
+ "size": size,
26524
+ "icon": props.icon
26525
+ }, null) : undefined]) : vue.createVNode(VDefaultsProvider, {
26526
+ "key": "media-defaults",
26527
+ "defaults": {
26528
+ VImg: {
26529
+ src: props.image,
26530
+ height: size
26531
+ },
26532
+ VIcon: {
26533
+ size,
26534
+ icon: props.icon
26535
+ }
26536
+ }
26537
+ }, {
26538
+ default: () => [slots.media()]
26539
+ })]), hasHeadline && vue.createVNode("div", {
26540
+ "key": "headline",
26541
+ "class": "v-empty-state__headline"
26542
+ }, [slots.headline?.() ?? props.headline]), hasTitle && vue.createVNode("div", {
26543
+ "key": "title",
26544
+ "class": "v-empty-state__title"
26545
+ }, [slots.title?.() ?? props.title]), hasText && vue.createVNode("div", {
26546
+ "key": "text",
26547
+ "class": "v-empty-state__text",
26548
+ "style": {
26549
+ maxWidth: convertToUnit(props.textWidth)
26550
+ }
26551
+ }, [slots.text?.() ?? props.text]), slots.default && vue.createVNode("div", {
26552
+ "key": "content",
26553
+ "class": "v-empty-state__content"
26554
+ }, [slots.default()]), hasActions && vue.createVNode("div", {
26555
+ "key": "actions",
26556
+ "class": "v-empty-state__actions"
26557
+ }, [vue.createVNode(VDefaultsProvider, {
26558
+ "defaults": {
26559
+ VBtn: {
26560
+ class: 'v-empty-state__action-btn',
26561
+ color: props.color,
26562
+ text: props.actionText
26563
+ }
26564
+ }
26565
+ }, {
26566
+ default: () => [slots.actions?.({
26567
+ props: {
26568
+ onClick: onClickAction
26569
+ }
26570
+ }) ?? vue.createVNode(VBtn, {
26571
+ "onClick": onClickAction
26572
+ }, null)]
26573
+ })])]);
26574
+ });
26575
+ return {};
26576
+ }
26577
+ });
26578
+
26331
26579
  var components = /*#__PURE__*/Object.freeze({
26332
26580
  __proto__: null,
26333
26581
  VAlert: VAlert,
@@ -26380,6 +26628,7 @@
26380
26628
  VDataIterator: VDataIterator,
26381
26629
  VDataTable: VDataTable,
26382
26630
  VDataTableFooter: VDataTableFooter,
26631
+ VDataTableHeaders: VDataTableHeaders,
26383
26632
  VDataTableRow: VDataTableRow,
26384
26633
  VDataTableRows: VDataTableRows,
26385
26634
  VDataTableServer: VDataTableServer,
@@ -26396,12 +26645,14 @@
26396
26645
  VDialogTopTransition: VDialogTopTransition,
26397
26646
  VDialogTransition: VDialogTransition,
26398
26647
  VDivider: VDivider,
26648
+ VEmptyState: VEmptyState,
26399
26649
  VExpandTransition: VExpandTransition,
26400
26650
  VExpandXTransition: VExpandXTransition,
26401
26651
  VExpansionPanel: VExpansionPanel,
26402
26652
  VExpansionPanelText: VExpansionPanelText,
26403
26653
  VExpansionPanelTitle: VExpansionPanelTitle,
26404
26654
  VExpansionPanels: VExpansionPanels,
26655
+ VFab: VFab,
26405
26656
  VFabTransition: VFabTransition,
26406
26657
  VFadeTransition: VFadeTransition,
26407
26658
  VField: VField,
@@ -26718,7 +26969,7 @@
26718
26969
  goTo
26719
26970
  };
26720
26971
  }
26721
- const version$1 = "3.5.5";
26972
+ const version$1 = "3.5.7";
26722
26973
  createVuetify$1.version = version$1;
26723
26974
 
26724
26975
  // Vue's inject() can only be used in setup
@@ -26732,7 +26983,7 @@
26732
26983
 
26733
26984
  /* eslint-disable local-rules/sort-imports */
26734
26985
 
26735
- const version = "3.5.5";
26986
+ const version = "3.5.7";
26736
26987
 
26737
26988
  /* eslint-disable local-rules/sort-imports */
26738
26989