@vuetify/nightly 3.8.0-beta.0-dev.2025-03-31 → 3.8.0-dev.2025-04-03

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/CHANGELOG.md +10 -96
  2. package/dist/json/attributes.json +3028 -3028
  3. package/dist/json/importMap-labs.json +32 -32
  4. package/dist/json/importMap.json +154 -154
  5. package/dist/json/web-types.json +5664 -5664
  6. package/dist/vuetify-labs.cjs +73 -67
  7. package/dist/vuetify-labs.css +3832 -3835
  8. package/dist/vuetify-labs.d.ts +110 -71
  9. package/dist/vuetify-labs.esm.js +73 -67
  10. package/dist/vuetify-labs.esm.js.map +1 -1
  11. package/dist/vuetify-labs.js +73 -67
  12. package/dist/vuetify-labs.min.css +2 -2
  13. package/dist/vuetify.cjs +68 -58
  14. package/dist/vuetify.cjs.map +1 -1
  15. package/dist/vuetify.css +4692 -4695
  16. package/dist/vuetify.d.ts +110 -71
  17. package/dist/vuetify.esm.js +68 -58
  18. package/dist/vuetify.esm.js.map +1 -1
  19. package/dist/vuetify.js +68 -58
  20. package/dist/vuetify.js.map +1 -1
  21. package/dist/vuetify.min.css +2 -2
  22. package/dist/vuetify.min.js +88 -87
  23. package/dist/vuetify.min.js.map +1 -1
  24. package/lib/components/VAutocomplete/VAutocomplete.css +0 -1
  25. package/lib/components/VAutocomplete/VAutocomplete.js +16 -19
  26. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  27. package/lib/components/VAutocomplete/VAutocomplete.sass +0 -1
  28. package/lib/components/VColorPicker/VColorPickerPreview.js +4 -3
  29. package/lib/components/VColorPicker/VColorPickerPreview.js.map +1 -1
  30. package/lib/components/VCombobox/VCombobox.css +0 -1
  31. package/lib/components/VCombobox/VCombobox.js +22 -20
  32. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  33. package/lib/components/VCombobox/VCombobox.sass +0 -1
  34. package/lib/components/VEmptyState/VEmptyState.js +3 -1
  35. package/lib/components/VEmptyState/VEmptyState.js.map +1 -1
  36. package/lib/components/VField/VField.d.ts +3 -0
  37. package/lib/components/VField/VField.js +3 -2
  38. package/lib/components/VField/VField.js.map +1 -1
  39. package/lib/components/VInput/VInput.css +11 -11
  40. package/lib/components/VInput/VInput.sass +1 -1
  41. package/lib/components/VNumberInput/VNumberInput.d.ts +39 -12
  42. package/lib/components/VSelect/VSelect.css +0 -1
  43. package/lib/components/VSelect/VSelect.js +11 -9
  44. package/lib/components/VSelect/VSelect.js.map +1 -1
  45. package/lib/components/VSelect/VSelect.sass +0 -1
  46. package/lib/components/VTextField/VTextField.d.ts +12 -3
  47. package/lib/composables/virtual.js +6 -1
  48. package/lib/composables/virtual.js.map +1 -1
  49. package/lib/entry-bundler.js +1 -1
  50. package/lib/entry-bundler.js.map +1 -1
  51. package/lib/framework.d.ts +56 -56
  52. package/lib/framework.js +1 -1
  53. package/lib/framework.js.map +1 -1
  54. package/lib/labs/VDateInput/VDateInput.js +3 -8
  55. package/lib/labs/VDateInput/VDateInput.js.map +1 -1
  56. package/lib/labs/VFileUpload/VFileUpload.js +2 -1
  57. package/lib/labs/VFileUpload/VFileUpload.js.map +1 -1
  58. package/lib/util/helpers.d.ts +1 -2
  59. package/lib/util/helpers.js +1 -11
  60. package/lib/util/helpers.js.map +1 -1
  61. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.8.0-beta.0-dev.2025-03-31
2
+ * Vuetify v3.8.0-dev.2025-04-03
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -11736,7 +11736,7 @@
11736
11736
  return props.error || props.disabled ? undefined : isActive.value && isFocused.value ? props.color : props.baseColor;
11737
11737
  });
11738
11738
  const iconColor = vue.computed(() => {
11739
- if (!props.iconColor) return undefined;
11739
+ if (!props.iconColor || props.glow && !isFocused.value) return undefined;
11740
11740
  return props.iconColor === true ? color.value : props.iconColor;
11741
11741
  });
11742
11742
  const {
@@ -11934,7 +11934,8 @@
11934
11934
  })])]);
11935
11935
  });
11936
11936
  return {
11937
- controlRef
11937
+ controlRef,
11938
+ fieldIconColor: iconColor
11938
11939
  };
11939
11940
  }
11940
11941
  });
@@ -12284,7 +12285,12 @@
12284
12285
  }
12285
12286
  function calculateOffset(index) {
12286
12287
  index = clamp(index, 0, items.value.length - 1);
12287
- return offsets[index] || 0;
12288
+ const whole = Math.floor(index);
12289
+ const fraction = index % 1;
12290
+ const next = whole + 1;
12291
+ const wholeOffset = offsets[whole] || 0;
12292
+ const nextOffset = offsets[next] || wholeOffset;
12293
+ return wholeOffset + (nextOffset - wholeOffset) * fraction;
12288
12294
  }
12289
12295
  function calculateIndex(scrollTop) {
12290
12296
  return binaryClosest(offsets, scrollTop);
@@ -12672,14 +12678,6 @@
12672
12678
  const vTextFieldRef = vue.ref();
12673
12679
  const vMenuRef = vue.ref();
12674
12680
  const vVirtualScrollRef = vue.ref();
12675
- const _menu = useProxiedModel(props, 'menu');
12676
- const menu = vue.computed({
12677
- get: () => _menu.value,
12678
- set: v => {
12679
- if (_menu.value && !v && vMenuRef.value?.ΨopenChildren.size) return;
12680
- _menu.value = v;
12681
- }
12682
- });
12683
12681
  const {
12684
12682
  items,
12685
12683
  transformIn,
@@ -12695,7 +12693,6 @@
12695
12693
  const form = useForm(props);
12696
12694
  const selectedValues = vue.computed(() => model.value.map(selection => selection.value));
12697
12695
  const isFocused = vue.shallowRef(false);
12698
- const label = vue.computed(() => menu.value ? props.closeText : props.openText);
12699
12696
  let keyboardLookupPrefix = '';
12700
12697
  let keyboardLookupLastTime;
12701
12698
  const displayItems = vue.computed(() => {
@@ -12705,6 +12702,16 @@
12705
12702
  return items.value;
12706
12703
  });
12707
12704
  const menuDisabled = vue.computed(() => props.hideNoData && !displayItems.value.length || form.isReadonly.value || form.isDisabled.value);
12705
+ const _menu = useProxiedModel(props, 'menu');
12706
+ const menu = vue.computed({
12707
+ get: () => _menu.value,
12708
+ set: v => {
12709
+ if (_menu.value && !v && vMenuRef.value?.ΨopenChildren.size) return;
12710
+ if (v && menuDisabled.value) return;
12711
+ _menu.value = v;
12712
+ }
12713
+ });
12714
+ const label = vue.computed(() => menu.value ? props.closeText : props.openText);
12708
12715
  const computedMenuProps = vue.computed(() => {
12709
12716
  return {
12710
12717
  ...props.menuProps,
@@ -13000,6 +13007,7 @@
13000
13007
  }
13001
13008
  return vue.createVNode(vue.Fragment, null, [slots['append-inner']?.(...args), props.menuIcon ? vue.createVNode(VIcon, {
13002
13009
  "class": "v-select__menu-icon",
13010
+ "color": vTextFieldRef.value?.fieldIconColor,
13003
13011
  "icon": props.menuIcon
13004
13012
  }, null) : undefined]);
13005
13013
  }
@@ -13203,17 +13211,8 @@
13203
13211
  const listHasFocus = vue.shallowRef(false);
13204
13212
  const vMenuRef = vue.ref();
13205
13213
  const vVirtualScrollRef = vue.ref();
13206
- const _menu = useProxiedModel(props, 'menu');
13207
- const menu = vue.computed({
13208
- get: () => _menu.value,
13209
- set: v => {
13210
- if (_menu.value && !v && vMenuRef.value?.ΨopenChildren.size) return;
13211
- _menu.value = v;
13212
- }
13213
- });
13214
13214
  const selectionIndex = vue.shallowRef(-1);
13215
13215
  const color = vue.computed(() => vTextFieldRef.value?.color);
13216
- const label = vue.computed(() => menu.value ? props.closeText : props.openText);
13217
13216
  const {
13218
13217
  items,
13219
13218
  transformIn,
@@ -13250,6 +13249,16 @@
13250
13249
  return selectFirst && displayItems.value.length > 0 && !isPristine.value && !listHasFocus.value;
13251
13250
  });
13252
13251
  const menuDisabled = vue.computed(() => props.hideNoData && !displayItems.value.length || form.isReadonly.value || form.isDisabled.value);
13252
+ const _menu = useProxiedModel(props, 'menu');
13253
+ const menu = vue.computed({
13254
+ get: () => _menu.value,
13255
+ set: v => {
13256
+ if (_menu.value && !v && vMenuRef.value?.ΨopenChildren.size) return;
13257
+ if (v && menuDisabled.value) return;
13258
+ _menu.value = v;
13259
+ }
13260
+ });
13261
+ const label = vue.computed(() => menu.value ? props.closeText : props.openText);
13253
13262
  const listRef = vue.ref();
13254
13263
  const listEvents = useScrolling(listRef, vTextFieldRef);
13255
13264
  function onClear(e) {
@@ -13406,12 +13415,7 @@
13406
13415
  } else {
13407
13416
  if (!props.multiple && search.value == null) model.value = [];
13408
13417
  menu.value = false;
13409
- if (!model.value.some(_ref3 => {
13410
- let {
13411
- title
13412
- } = _ref3;
13413
- return title === search.value;
13414
- })) search.value = '';
13418
+ if (props.multiple || hasSelectionSlot.value) search.value = '';
13415
13419
  selectionIndex.value = -1;
13416
13420
  }
13417
13421
  });
@@ -13499,12 +13503,12 @@
13499
13503
  "items": displayItems.value,
13500
13504
  "itemKey": "value"
13501
13505
  }, {
13502
- default: _ref4 => {
13506
+ default: _ref3 => {
13503
13507
  let {
13504
13508
  item,
13505
13509
  index,
13506
13510
  itemRef
13507
- } = _ref4;
13511
+ } = _ref3;
13508
13512
  const itemProps = vue.mergeProps(item.props, {
13509
13513
  ref: itemRef,
13510
13514
  key: item.value,
@@ -13518,10 +13522,10 @@
13518
13522
  }) ?? vue.createVNode(VListItem, vue.mergeProps(itemProps, {
13519
13523
  "role": "option"
13520
13524
  }), {
13521
- prepend: _ref5 => {
13525
+ prepend: _ref4 => {
13522
13526
  let {
13523
13527
  isSelected
13524
- } = _ref5;
13528
+ } = _ref4;
13525
13529
  return vue.createVNode(vue.Fragment, null, [props.multiple && !props.hideSelected ? vue.createVNode(VCheckboxBtn, {
13526
13530
  "key": item.value,
13527
13531
  "modelValue": isSelected,
@@ -13604,6 +13608,7 @@
13604
13608
  }
13605
13609
  return vue.createVNode(vue.Fragment, null, [slots['append-inner']?.(...args), props.menuIcon ? vue.createVNode(VIcon, {
13606
13610
  "class": "v-autocomplete__menu-icon",
13611
+ "color": vTextFieldRef.value?.fieldIconColor,
13607
13612
  "icon": props.menuIcon,
13608
13613
  "onMousedown": onMousedownMenuIcon,
13609
13614
  "onClick": noop,
@@ -16390,7 +16395,7 @@
16390
16395
  const abortController = new AbortController();
16391
16396
  vue.onUnmounted(() => abortController.abort());
16392
16397
  async function openEyeDropper() {
16393
- if (!SUPPORTS_EYE_DROPPER) return;
16398
+ if (!SUPPORTS_EYE_DROPPER || props.disabled) return;
16394
16399
  const eyeDropper = new window.EyeDropper();
16395
16400
  try {
16396
16401
  const result = await eyeDropper.open({
@@ -16412,10 +16417,11 @@
16412
16417
  "class": "v-color-picker-preview__eye-dropper",
16413
16418
  "key": "eyeDropper"
16414
16419
  }, [vue.createVNode(VBtn, {
16415
- "onClick": openEyeDropper,
16420
+ "density": "comfortable",
16421
+ "disabled": props.disabled,
16416
16422
  "icon": "$eyeDropper",
16417
16423
  "variant": "plain",
16418
- "density": "comfortable"
16424
+ "onClick": openEyeDropper
16419
16425
  }, null)]), vue.createVNode("div", {
16420
16426
  "class": "v-color-picker-preview__dot"
16421
16427
  }, [vue.createVNode("div", {
@@ -17972,18 +17978,9 @@
17972
17978
  const listHasFocus = vue.shallowRef(false);
17973
17979
  const vMenuRef = vue.ref();
17974
17980
  const vVirtualScrollRef = vue.ref();
17975
- const _menu = useProxiedModel(props, 'menu');
17976
- const menu = vue.computed({
17977
- get: () => _menu.value,
17978
- set: v => {
17979
- if (_menu.value && !v && vMenuRef.value?.ΨopenChildren.size) return;
17980
- _menu.value = v;
17981
- }
17982
- });
17983
17981
  const selectionIndex = vue.shallowRef(-1);
17984
17982
  let cleared = false;
17985
17983
  const color = vue.computed(() => vTextFieldRef.value?.color);
17986
- const label = vue.computed(() => menu.value ? props.closeText : props.openText);
17987
17984
  const {
17988
17985
  items,
17989
17986
  transformIn,
@@ -18027,6 +18024,27 @@
18027
18024
  const counterValue = vue.computed(() => {
18028
18025
  return typeof props.counterValue === 'function' ? props.counterValue(model.value) : typeof props.counterValue === 'number' ? props.counterValue : props.multiple ? model.value.length : search.value.length;
18029
18026
  });
18027
+ const {
18028
+ filteredItems,
18029
+ getMatches
18030
+ } = useFilter(props, items, () => isPristine.value ? '' : search.value);
18031
+ const displayItems = vue.computed(() => {
18032
+ if (props.hideSelected) {
18033
+ return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
18034
+ }
18035
+ return filteredItems.value;
18036
+ });
18037
+ const menuDisabled = vue.computed(() => props.hideNoData && !displayItems.value.length || form.isReadonly.value || form.isDisabled.value);
18038
+ const _menu = useProxiedModel(props, 'menu');
18039
+ const menu = vue.computed({
18040
+ get: () => _menu.value,
18041
+ set: v => {
18042
+ if (_menu.value && !v && vMenuRef.value?.ΨopenChildren.size) return;
18043
+ if (v && menuDisabled.value) return;
18044
+ _menu.value = v;
18045
+ }
18046
+ });
18047
+ const label = vue.computed(() => menu.value ? props.closeText : props.openText);
18030
18048
  vue.watch(_search, value => {
18031
18049
  if (cleared) {
18032
18050
  // wait for clear to finish, VTextField sets _search to null
@@ -18042,22 +18060,11 @@
18042
18060
  _search.value = value[0]?.title ?? '';
18043
18061
  }
18044
18062
  });
18045
- const {
18046
- filteredItems,
18047
- getMatches
18048
- } = useFilter(props, items, () => isPristine.value ? '' : search.value);
18049
- const displayItems = vue.computed(() => {
18050
- if (props.hideSelected) {
18051
- return filteredItems.value.filter(filteredItem => !model.value.some(s => s.value === filteredItem.value));
18052
- }
18053
- return filteredItems.value;
18054
- });
18055
18063
  const selectedValues = vue.computed(() => model.value.map(selection => selection.value));
18056
18064
  const highlightFirst = vue.computed(() => {
18057
18065
  const selectFirst = props.autoSelectFirst === true || props.autoSelectFirst === 'exact' && search.value === displayItems.value[0]?.title;
18058
18066
  return selectFirst && displayItems.value.length > 0 && !isPristine.value && !listHasFocus.value;
18059
18067
  });
18060
- const menuDisabled = vue.computed(() => props.hideNoData && !displayItems.value.length || form.isReadonly.value || form.isDisabled.value);
18061
18068
  const listRef = vue.ref();
18062
18069
  const listEvents = useScrolling(listRef, vTextFieldRef);
18063
18070
  function onClear(e) {
@@ -18408,6 +18415,7 @@
18408
18415
  }
18409
18416
  return vue.createVNode(vue.Fragment, null, [slots['append-inner']?.(...args), (!props.hideNoData || props.items.length) && props.menuIcon ? vue.createVNode(VIcon, {
18410
18417
  "class": "v-combobox__menu-icon",
18418
+ "color": vTextFieldRef.value?.fieldIconColor,
18411
18419
  "icon": props.menuIcon,
18412
18420
  "onMousedown": onMousedownMenuIcon,
18413
18421
  "onClick": noop,
@@ -22800,7 +22808,9 @@
22800
22808
  VBtn: {
22801
22809
  class: 'v-empty-state__action-btn',
22802
22810
  color: props.color ?? 'surface-variant',
22803
- text: props.actionText
22811
+ href: props.href,
22812
+ text: props.actionText,
22813
+ to: props.to
22804
22814
  }
22805
22815
  }
22806
22816
  }, {
@@ -28991,7 +29001,7 @@
28991
29001
  const adapter = useDate();
28992
29002
  const {
28993
29003
  mobile
28994
- } = useDisplay();
29004
+ } = useDisplay(props);
28995
29005
  const {
28996
29006
  isFocused,
28997
29007
  focus,
@@ -29041,7 +29051,7 @@
29041
29051
  return;
29042
29052
  }
29043
29053
  const target = e.target;
29044
- model.value = target.value === '' ? null : target.value;
29054
+ model.value = adapter.isValid(target.value) ? target.value : null;
29045
29055
  }
29046
29056
  function onClick(e) {
29047
29057
  e.preventDefault();
@@ -29065,10 +29075,6 @@
29065
29075
  if (value != null) return;
29066
29076
  model.value = null;
29067
29077
  }
29068
- function onUpdateMenuModel(isMenuOpen) {
29069
- if (isMenuOpen) return;
29070
- isEditingInput.value = false;
29071
- }
29072
29078
  function onBlur() {
29073
29079
  blur();
29074
29080
 
@@ -29101,7 +29107,7 @@
29101
29107
  ...slots,
29102
29108
  default: () => vue.createVNode(vue.Fragment, null, [vue.createVNode(VMenu, {
29103
29109
  "modelValue": menu.value,
29104
- "onUpdate:modelValue": [$event => menu.value = $event, onUpdateMenuModel],
29110
+ "onUpdate:modelValue": $event => menu.value = $event,
29105
29111
  "activator": "parent",
29106
29112
  "min-width": "0",
29107
29113
  "eager": isFocused.value,
@@ -29134,7 +29140,6 @@
29134
29140
  }
29135
29141
  }
29136
29142
  emit('save', value);
29137
- vDateInputRef.value?.blur();
29138
29143
  disabledActions.value = [];
29139
29144
  }
29140
29145
  return vue.createVNode(VDatePicker, vue.mergeProps(datePickerProps, {
@@ -29382,7 +29387,8 @@
29382
29387
  'v-file-upload--clickable': !hasBrowse,
29383
29388
  'v-file-upload--disabled': props.disabled,
29384
29389
  'v-file-upload--dragging': dragOver.value
29385
- }, densityClasses.value],
29390
+ }, densityClasses.value, props.class],
29391
+ "style": [props.style],
29386
29392
  "onDragleave": onDragLeave,
29387
29393
  "onDragover": onDragOver,
29388
29394
  "onDrop": onDrop,
@@ -31540,7 +31546,7 @@
31540
31546
  };
31541
31547
  });
31542
31548
  }
31543
- const version$1 = "3.8.0-beta.0-dev.2025-03-31";
31549
+ const version$1 = "3.8.0-dev.2025-04-03";
31544
31550
  createVuetify$1.version = version$1;
31545
31551
 
31546
31552
  // Vue's inject() can only be used in setup
@@ -31825,7 +31831,7 @@
31825
31831
 
31826
31832
  /* eslint-disable local-rules/sort-imports */
31827
31833
 
31828
- const version = "3.8.0-beta.0-dev.2025-03-31";
31834
+ const version = "3.8.0-dev.2025-04-03";
31829
31835
 
31830
31836
  /* eslint-disable local-rules/sort-imports */
31831
31837