vuetify 3.5.6 → 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 (72) hide show
  1. package/dist/_component-variables-labs.sass +2 -0
  2. package/dist/json/attributes.json +312 -40
  3. package/dist/json/importMap-labs.json +8 -0
  4. package/dist/json/importMap.json +122 -122
  5. package/dist/json/tags.json +78 -0
  6. package/dist/json/web-types.json +793 -52
  7. package/dist/vuetify-labs.css +1931 -1803
  8. package/dist/vuetify-labs.d.ts +1073 -106
  9. package/dist/vuetify-labs.esm.js +315 -75
  10. package/dist/vuetify-labs.esm.js.map +1 -1
  11. package/dist/vuetify-labs.js +315 -75
  12. package/dist/vuetify-labs.min.css +2 -2
  13. package/dist/vuetify.css +846 -844
  14. package/dist/vuetify.d.ts +74 -141
  15. package/dist/vuetify.esm.js +70 -69
  16. package/dist/vuetify.esm.js.map +1 -1
  17. package/dist/vuetify.js +70 -69
  18. package/dist/vuetify.js.map +1 -1
  19. package/dist/vuetify.min.css +2 -2
  20. package/dist/vuetify.min.js +50 -49
  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 +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 +19 -22
  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/VLayout/index.d.mts +8 -6
  36. package/lib/components/VSelect/VSelect.mjs +18 -17
  37. package/lib/components/VSelect/VSelect.mjs.map +1 -1
  38. package/lib/components/VToolbar/VToolbar.css +3 -1
  39. package/lib/components/VToolbar/VToolbar.sass +2 -1
  40. package/lib/components/index.d.mts +38 -105
  41. package/lib/composables/layout.mjs.map +1 -1
  42. package/lib/entry-bundler.mjs +1 -1
  43. package/lib/framework.mjs +1 -1
  44. package/lib/index.d.mts +38 -36
  45. package/lib/labs/VEmptyState/VEmptyState.css +59 -0
  46. package/lib/labs/VEmptyState/VEmptyState.mjs +145 -0
  47. package/lib/labs/VEmptyState/VEmptyState.mjs.map +1 -0
  48. package/lib/labs/VEmptyState/VEmptyState.sass +53 -0
  49. package/lib/labs/VEmptyState/_variables.scss +22 -0
  50. package/lib/labs/VEmptyState/index.d.mts +415 -0
  51. package/lib/labs/VEmptyState/index.mjs +2 -0
  52. package/lib/labs/VEmptyState/index.mjs.map +1 -0
  53. package/lib/labs/VFab/VFab.css +69 -0
  54. package/lib/labs/VFab/VFab.mjs +114 -0
  55. package/lib/labs/VFab/VFab.mjs.map +1 -0
  56. package/lib/labs/VFab/VFab.sass +82 -0
  57. package/lib/labs/VFab/_mixins.scss +22 -0
  58. package/lib/labs/VFab/_variables.scss +33 -0
  59. package/lib/labs/VFab/index.d.mts +656 -0
  60. package/lib/labs/VFab/index.mjs +2 -0
  61. package/lib/labs/VFab/index.mjs.map +1 -0
  62. package/lib/labs/VSparkline/VBarline.mjs +4 -4
  63. package/lib/labs/VSparkline/VBarline.mjs.map +1 -1
  64. package/lib/labs/VSparkline/VTrendline.mjs +6 -2
  65. package/lib/labs/VSparkline/VTrendline.mjs.map +1 -1
  66. package/lib/labs/VSparkline/index.d.mts +12 -0
  67. package/lib/labs/VSparkline/util/line.mjs +2 -0
  68. package/lib/labs/VSparkline/util/line.mjs.map +1 -1
  69. package/lib/labs/components.d.mts +1066 -2
  70. package/lib/labs/components.mjs +2 -0
  71. package/lib/labs/components.mjs.map +1 -1
  72. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.5.6
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,21 +11850,27 @@
11848
11850
  model.value = [item];
11849
11851
  }
11850
11852
  }
11853
+
11854
+ /** @param set - null means toggle */
11851
11855
  function select(item) {
11852
- let add = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
11856
+ let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
11857
+ if (item.props.disabled) return;
11853
11858
  if (props.multiple) {
11854
11859
  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];
11860
+ const add = set == null ? !~index : set;
11861
+ if (~index) {
11862
+ const value = add ? [...model.value, item] : [...model.value];
11860
11863
  value.splice(index, 1);
11861
11864
  model.value = value;
11865
+ } else if (add) {
11866
+ model.value = [...model.value, item];
11862
11867
  }
11863
11868
  } else {
11869
+ const add = set !== false;
11864
11870
  model.value = add ? [item] : [];
11865
- menu.value = false;
11871
+ vue.nextTick(() => {
11872
+ menu.value = false;
11873
+ });
11866
11874
  }
11867
11875
  }
11868
11876
  function onBlur(e) {
@@ -11896,14 +11904,9 @@
11896
11904
  });
11897
11905
  }
11898
11906
  });
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
- }
11907
+ vue.watch(() => props.items, val => {
11908
+ if (!isFocused.value || !val.length || menu.value) return;
11909
+ menu.value = true;
11907
11910
  });
11908
11911
  useRender(() => {
11909
11912
  const hasChips = !!(props.chips || slots.chip);
@@ -11981,7 +11984,7 @@
11981
11984
  const itemProps = vue.mergeProps(item.props, {
11982
11985
  ref: itemRef,
11983
11986
  key: index,
11984
- onClick: () => select(item)
11987
+ onClick: () => select(item, null)
11985
11988
  });
11986
11989
  return slots.item?.({
11987
11990
  item,
@@ -12288,6 +12291,8 @@
12288
12291
  }
12289
12292
  return filteredItems.value;
12290
12293
  });
12294
+ const hasChips = vue.computed(() => !!(props.chips || slots.chip));
12295
+ const hasSelectionSlot = vue.computed(() => hasChips.value || !!slots.selection);
12291
12296
  const selectedValues = vue.computed(() => model.value.map(selection => selection.props.value));
12292
12297
  const highlightFirst = vue.computed(() => {
12293
12298
  const selectFirst = props.autoSelectFirst === true || props.autoSelectFirst === 'exact' && search.value === displayItems.value[0]?.title;
@@ -12346,7 +12351,7 @@
12346
12351
  }
12347
12352
  const originalSelectionIndex = selectionIndex.value;
12348
12353
  const selectedItem = model.value[selectionIndex.value];
12349
- if (selectedItem && !selectedItem.props.disabled) select(selectedItem);
12354
+ if (selectedItem && !selectedItem.props.disabled) select(selectedItem, false);
12350
12355
  selectionIndex.value = originalSelectionIndex >= length - 1 ? length - 2 : originalSelectionIndex;
12351
12356
  }
12352
12357
  if (e.key === 'ArrowLeft') {
@@ -12397,36 +12402,41 @@
12397
12402
  if (v == null || v === '' && !props.multiple) model.value = [];
12398
12403
  }
12399
12404
  const isSelecting = vue.shallowRef(false);
12405
+
12406
+ /** @param set - null means toggle */
12400
12407
  function select(item) {
12401
- let add = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
12408
+ let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
12402
12409
  if (item.props.disabled) return;
12403
12410
  if (props.multiple) {
12404
12411
  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];
12412
+ const add = set == null ? !~index : set;
12413
+ if (~index) {
12414
+ const value = add ? [...model.value, item] : [...model.value];
12410
12415
  value.splice(index, 1);
12411
12416
  model.value = value;
12417
+ } else if (add) {
12418
+ model.value = [...model.value, item];
12412
12419
  }
12413
12420
  if (props.clearOnSelect) {
12414
12421
  search.value = '';
12415
12422
  }
12416
12423
  } else {
12424
+ const add = set !== false;
12417
12425
  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);
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
+ });
12423
12433
  }
12424
12434
  }
12425
12435
  vue.watch(isFocused, (val, oldVal) => {
12426
12436
  if (val === oldVal) return;
12427
12437
  if (val) {
12428
12438
  isSelecting.value = true;
12429
- 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 ?? '');
12430
12440
  isPristine.value = true;
12431
12441
  vue.nextTick(() => isSelecting.value = false);
12432
12442
  } else {
@@ -12456,17 +12466,11 @@
12456
12466
  });
12457
12467
  }
12458
12468
  });
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
- }
12469
+ vue.watch(() => props.items, val => {
12470
+ if (!isFocused.value || !val.length || menu.value) return;
12471
+ menu.value = true;
12467
12472
  });
12468
12473
  useRender(() => {
12469
- const hasChips = !!(props.chips || slots.chip);
12470
12474
  const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']);
12471
12475
  const isDirty = model.value.length > 0;
12472
12476
  const textFieldProps = VTextField.filterProps(props);
@@ -12484,7 +12488,7 @@
12484
12488
  "class": ['v-autocomplete', `v-autocomplete--${props.multiple ? 'multiple' : 'single'}`, {
12485
12489
  'v-autocomplete--active-menu': menu.value,
12486
12490
  'v-autocomplete--chips': !!props.chips,
12487
- 'v-autocomplete--selection-slot': !!slots.selection,
12491
+ 'v-autocomplete--selection-slot': !!hasSelectionSlot.value,
12488
12492
  'v-autocomplete--selecting-index': selectionIndex.value > -1
12489
12493
  }, props.class],
12490
12494
  "style": props.style,
@@ -12539,7 +12543,7 @@
12539
12543
  ref: itemRef,
12540
12544
  key: index,
12541
12545
  active: highlightFirst.value && index === 0 ? true : undefined,
12542
- onClick: () => select(item)
12546
+ onClick: () => select(item, null)
12543
12547
  });
12544
12548
  return slots.item?.({
12545
12549
  item,
@@ -12585,8 +12589,8 @@
12585
12589
  modelValue: true,
12586
12590
  'onUpdate:modelValue': undefined
12587
12591
  };
12588
- const hasSlot = hasChips ? !!slots.chip : !!slots.selection;
12589
- 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({
12590
12594
  item,
12591
12595
  index,
12592
12596
  props: slotProps
@@ -12599,7 +12603,7 @@
12599
12603
  "key": item.value,
12600
12604
  "class": ['v-autocomplete__selection', index === selectionIndex.value && ['v-autocomplete__selection--selected', textColorClasses.value]],
12601
12605
  "style": index === selectionIndex.value ? textColorStyles.value : {}
12602
- }, [hasChips ? !slots.chip ? vue.createVNode(VChip, vue.mergeProps({
12606
+ }, [hasChips.value ? !slots.chip ? vue.createVNode(VChip, vue.mergeProps({
12603
12607
  "key": "chip",
12604
12608
  "closable": props.closableChips,
12605
12609
  "size": "small",
@@ -16038,14 +16042,16 @@
16038
16042
  return props.multiple ? transformed : transformed[0] ?? null;
16039
16043
  });
16040
16044
  const form = useForm();
16041
- 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 ?? '' : '');
16042
16048
  const search = vue.computed({
16043
16049
  get: () => {
16044
16050
  return _search.value;
16045
16051
  },
16046
16052
  set: val => {
16047
16053
  _search.value = val ?? '';
16048
- if (!props.multiple) {
16054
+ if (!props.multiple && !hasSelectionSlot.value) {
16049
16055
  model.value = [transformItem$3(props, val)];
16050
16056
  }
16051
16057
  if (val && props.multiple && props.delimiters?.length) {
@@ -16076,7 +16082,7 @@
16076
16082
  emit('update:search', value);
16077
16083
  });
16078
16084
  vue.watch(model, value => {
16079
- if (!props.multiple) {
16085
+ if (!props.multiple && !hasSelectionSlot.value) {
16080
16086
  _search.value = value[0]?.title ?? '';
16081
16087
  }
16082
16088
  });
@@ -16141,6 +16147,10 @@
16141
16147
  if (e.key === 'ArrowDown' && highlightFirst.value) {
16142
16148
  listRef.value?.focus('next');
16143
16149
  }
16150
+ if (e.key === 'Enter' && search.value) {
16151
+ select(transformItem$3(props, search.value));
16152
+ if (hasSelectionSlot.value) search.value = '';
16153
+ }
16144
16154
  if (!props.multiple) return;
16145
16155
  if (['Backspace', 'Delete'].includes(e.key)) {
16146
16156
  if (selectionIndex.value < 0) {
@@ -16174,10 +16184,6 @@
16174
16184
  vTextFieldRef.value.setSelectionRange(0, 0);
16175
16185
  }
16176
16186
  }
16177
- if (e.key === 'Enter' && search.value) {
16178
- select(transformItem$3(props, search.value));
16179
- search.value = '';
16180
- }
16181
16187
  }
16182
16188
  function onAfterLeave() {
16183
16189
  if (isFocused.value) {
@@ -16188,6 +16194,7 @@
16188
16194
  /** @param set - null means toggle */
16189
16195
  function select(item) {
16190
16196
  let set = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
16197
+ if (item.props.disabled) return;
16191
16198
  if (props.multiple) {
16192
16199
  const index = model.value.findIndex(selection => props.valueComparator(selection.value, item.value));
16193
16200
  const add = set == null ? !~index : set;
@@ -16204,7 +16211,7 @@
16204
16211
  } else {
16205
16212
  const add = set !== false;
16206
16213
  model.value = add ? [item] : [];
16207
- _search.value = add ? item.title : '';
16214
+ _search.value = add && !hasSelectionSlot.value ? item.title : '';
16208
16215
 
16209
16216
  // watch for search watcher to trigger
16210
16217
  vue.nextTick(() => {
@@ -16236,7 +16243,7 @@
16236
16243
  return value === displayItems.value[0].value;
16237
16244
  })) {
16238
16245
  select(displayItems.value[0]);
16239
- } else if (props.multiple && search.value) {
16246
+ } else if (search.value) {
16240
16247
  select(transformItem$3(props, search.value));
16241
16248
  }
16242
16249
  });
@@ -16248,17 +16255,11 @@
16248
16255
  });
16249
16256
  }
16250
16257
  });
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
- }
16258
+ vue.watch(() => props.items, val => {
16259
+ if (!isFocused.value || !val.length || menu.value) return;
16260
+ menu.value = true;
16259
16261
  });
16260
16262
  useRender(() => {
16261
- const hasChips = !!(props.chips || slots.chip);
16262
16263
  const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']);
16263
16264
  const isDirty = model.value.length > 0;
16264
16265
  const textFieldProps = VTextField.filterProps(props);
@@ -16275,7 +16276,7 @@
16275
16276
  "class": ['v-combobox', {
16276
16277
  'v-combobox--active-menu': menu.value,
16277
16278
  'v-combobox--chips': !!props.chips,
16278
- 'v-combobox--selection-slot': !!slots.selection,
16279
+ 'v-combobox--selection-slot': !!hasSelectionSlot.value,
16279
16280
  'v-combobox--selecting-index': selectionIndex.value > -1,
16280
16281
  [`v-combobox--${props.multiple ? 'multiple' : 'single'}`]: true
16281
16282
  }, props.class],
@@ -16377,8 +16378,8 @@
16377
16378
  modelValue: true,
16378
16379
  'onUpdate:modelValue': undefined
16379
16380
  };
16380
- const hasSlot = hasChips ? !!slots.chip : !!slots.selection;
16381
- 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({
16382
16383
  item,
16383
16384
  index,
16384
16385
  props: slotProps
@@ -16391,7 +16392,7 @@
16391
16392
  "key": item.value,
16392
16393
  "class": ['v-combobox__selection', index === selectionIndex.value && ['v-combobox__selection--selected', textColorClasses.value]],
16393
16394
  "style": index === selectionIndex.value ? textColorStyles.value : {}
16394
- }, [hasChips ? !slots.chip ? vue.createVNode(VChip, vue.mergeProps({
16395
+ }, [hasChips.value ? !slots.chip ? vue.createVNode(VChip, vue.mergeProps({
16395
16396
  "key": "chip",
16396
16397
  "closable": props.closableChips,
16397
16398
  "size": "small",
@@ -25906,6 +25907,106 @@
25906
25907
  }
25907
25908
  });
25908
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
+
25909
26010
  // Utilities
25910
26011
 
25911
26012
  // Types
@@ -25948,6 +26049,8 @@
25948
26049
  type: Array,
25949
26050
  default: () => []
25950
26051
  },
26052
+ min: [String, Number],
26053
+ max: [String, Number],
25951
26054
  padding: {
25952
26055
  type: [String, Number],
25953
26056
  default: 8
@@ -25997,10 +26100,10 @@
25997
26100
  maxY
25998
26101
  } = boundary;
25999
26102
  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;
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;
26004
26107
  const gridX = maxX / totalValues;
26005
26108
  const gridY = (maxY - minY) / (maxValue - minValue || 1);
26006
26109
  const horizonY = maxY - Math.abs(minValue * gridY);
@@ -26181,8 +26284,8 @@
26181
26284
  maxY
26182
26285
  } = boundary;
26183
26286
  const totalValues = values.length;
26184
- const maxValue = Math.max(...values);
26185
- 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);
26186
26289
  const gridX = (maxX - minX) / (totalValues - 1);
26187
26290
  const gridY = (maxY - minY) / (maxValue - minValue || 1);
26188
26291
  return values.map((value, index) => {
@@ -26289,6 +26392,10 @@
26289
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)),
26290
26393
  "fill": props.fill ? `url(#${id.value})` : 'none',
26291
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]
26292
26399
  }, null)]);
26293
26400
  });
26294
26401
  }
@@ -26338,6 +26445,137 @@
26338
26445
  }
26339
26446
  });
26340
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
+
26341
26579
  var components = /*#__PURE__*/Object.freeze({
26342
26580
  __proto__: null,
26343
26581
  VAlert: VAlert,
@@ -26407,12 +26645,14 @@
26407
26645
  VDialogTopTransition: VDialogTopTransition,
26408
26646
  VDialogTransition: VDialogTransition,
26409
26647
  VDivider: VDivider,
26648
+ VEmptyState: VEmptyState,
26410
26649
  VExpandTransition: VExpandTransition,
26411
26650
  VExpandXTransition: VExpandXTransition,
26412
26651
  VExpansionPanel: VExpansionPanel,
26413
26652
  VExpansionPanelText: VExpansionPanelText,
26414
26653
  VExpansionPanelTitle: VExpansionPanelTitle,
26415
26654
  VExpansionPanels: VExpansionPanels,
26655
+ VFab: VFab,
26416
26656
  VFabTransition: VFabTransition,
26417
26657
  VFadeTransition: VFadeTransition,
26418
26658
  VField: VField,
@@ -26729,7 +26969,7 @@
26729
26969
  goTo
26730
26970
  };
26731
26971
  }
26732
- const version$1 = "3.5.6";
26972
+ const version$1 = "3.5.7";
26733
26973
  createVuetify$1.version = version$1;
26734
26974
 
26735
26975
  // Vue's inject() can only be used in setup
@@ -26743,7 +26983,7 @@
26743
26983
 
26744
26984
  /* eslint-disable local-rules/sort-imports */
26745
26985
 
26746
- const version = "3.5.6";
26986
+ const version = "3.5.7";
26747
26987
 
26748
26988
  /* eslint-disable local-rules/sort-imports */
26749
26989