@vuetify/nightly 3.8.5-master.2025-05-20 → 3.8.6-dev.2025-05-21

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 (90) hide show
  1. package/CHANGELOG.md +21 -14
  2. package/dist/json/attributes.json +1331 -1311
  3. package/dist/json/importMap-labs.json +24 -24
  4. package/dist/json/importMap.json +192 -192
  5. package/dist/json/tags.json +5 -0
  6. package/dist/json/web-types.json +2610 -2471
  7. package/dist/vuetify-labs.cjs +288 -117
  8. package/dist/vuetify-labs.css +3866 -3838
  9. package/dist/vuetify-labs.d.ts +1490 -1352
  10. package/dist/vuetify-labs.esm.js +289 -118
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +288 -117
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +282 -106
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +3130 -3102
  17. package/dist/vuetify.d.ts +659 -519
  18. package/dist/vuetify.esm.js +283 -107
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +282 -106
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1188 -1178
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VAlert/VAlert.css +6 -1
  26. package/lib/components/VAlert/VAlert.d.ts +35 -0
  27. package/lib/components/VAlert/VAlert.js +14 -9
  28. package/lib/components/VAlert/VAlert.js.map +1 -1
  29. package/lib/components/VAlert/VAlert.sass +7 -1
  30. package/lib/components/VAutocomplete/VAutocomplete.d.ts +120 -96
  31. package/lib/components/VAutocomplete/VAutocomplete.js +18 -1
  32. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  33. package/lib/components/VBtnGroup/VBtnGroup.css +30 -7
  34. package/lib/components/VBtnGroup/VBtnGroup.d.ts +58 -32
  35. package/lib/components/VBtnGroup/VBtnGroup.js +7 -3
  36. package/lib/components/VBtnGroup/VBtnGroup.js.map +1 -1
  37. package/lib/components/VBtnGroup/VBtnGroup.sass +44 -17
  38. package/lib/components/VBtnToggle/VBtnToggle.d.ts +25 -0
  39. package/lib/components/VCheckbox/VCheckbox.d.ts +3 -3
  40. package/lib/components/VCombobox/VCombobox.d.ts +120 -96
  41. package/lib/components/VCombobox/VCombobox.js +19 -1
  42. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  43. package/lib/components/VField/VField.d.ts +3 -3
  44. package/lib/components/VFileInput/VFileInput.d.ts +15 -15
  45. package/lib/components/VInput/VInput.d.ts +4 -4
  46. package/lib/components/VList/VListChildren.js.map +1 -1
  47. package/lib/components/VNumberInput/VNumberInput.d.ts +103 -89
  48. package/lib/components/VNumberInput/VNumberInput.js +19 -4
  49. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  50. package/lib/components/VOverlay/VOverlay.css +1 -1
  51. package/lib/components/VOverlay/_variables.scss +1 -1
  52. package/lib/components/VRadioGroup/VRadioGroup.d.ts +3 -3
  53. package/lib/components/VRangeSlider/VRangeSlider.d.ts +3 -3
  54. package/lib/components/VSelect/VSelect.d.ts +120 -96
  55. package/lib/components/VSelect/VSelect.js +18 -1
  56. package/lib/components/VSelect/VSelect.js.map +1 -1
  57. package/lib/components/VSlider/VSlider.d.ts +3 -3
  58. package/lib/components/VSwitch/VSwitch.d.ts +3 -3
  59. package/lib/components/VTextField/VTextField.d.ts +27 -27
  60. package/lib/components/VTextarea/VTextarea.d.ts +15 -15
  61. package/lib/composables/calendar.d.ts +1 -0
  62. package/lib/composables/calendar.js.map +1 -1
  63. package/lib/composables/date/index.d.ts +1 -0
  64. package/lib/composables/date/index.js +1 -0
  65. package/lib/composables/date/index.js.map +1 -1
  66. package/lib/composables/filter.js +3 -0
  67. package/lib/composables/filter.js.map +1 -1
  68. package/lib/composables/iconSizes.d.ts +28 -0
  69. package/lib/composables/iconSizes.js +23 -0
  70. package/lib/composables/iconSizes.js.map +1 -0
  71. package/lib/composables/theme.d.ts +6 -1
  72. package/lib/composables/theme.js +94 -26
  73. package/lib/composables/theme.js.map +1 -1
  74. package/lib/composables/virtual.js +6 -1
  75. package/lib/composables/virtual.js.map +1 -1
  76. package/lib/entry-bundler.js +1 -1
  77. package/lib/entry-bundler.js.map +1 -1
  78. package/lib/framework.d.ts +74 -69
  79. package/lib/framework.js +1 -1
  80. package/lib/framework.js.map +1 -1
  81. package/lib/labs/VColorInput/VColorInput.d.ts +3 -3
  82. package/lib/labs/VDateInput/VDateInput.d.ts +87 -87
  83. package/lib/labs/VFileUpload/VFileUpload.d.ts +3 -3
  84. package/lib/labs/VIconBtn/VIconBtn.d.ts +29 -29
  85. package/lib/labs/VIconBtn/VIconBtn.js +7 -11
  86. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  87. package/lib/util/globals.d.ts +1 -0
  88. package/lib/util/globals.js +1 -0
  89. package/lib/util/globals.js.map +1 -1
  90. package/package.json +3 -1
@@ -1,15 +1,16 @@
1
1
  /*!
2
- * Vuetify v3.8.5-master.2025-05-20
2
+ * Vuetify v3.8.6-dev.2025-05-21
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
6
6
 
7
- import { shallowRef, reactive, watchEffect, toRef, capitalize, unref, Fragment, isVNode, Comment, warn, getCurrentInstance as getCurrentInstance$1, ref, computed, provide, inject as inject$1, defineComponent as defineComponent$1, h, camelize, createVNode, mergeProps, toValue, onBeforeUnmount, watch, readonly, onMounted, useId, onDeactivated, onActivated, onScopeDispose, effectScope, toRaw, TransitionGroup, Transition, toRefs, isRef, onBeforeMount, nextTick, withDirectives, resolveDirective, vShow, onUpdated, Text, resolveDynamicComponent, toDisplayString, markRaw, Teleport, cloneVNode, createTextVNode, onUnmounted, onBeforeUpdate, withModifiers, vModelText, resolveComponent, render } from 'vue';
7
+ import { shallowRef, reactive, watchEffect, toRef, capitalize, unref, Fragment, isVNode, Comment, warn, getCurrentInstance as getCurrentInstance$1, ref, computed, provide, inject as inject$1, defineComponent as defineComponent$1, h, camelize, createVNode, mergeProps, toValue, onBeforeUnmount, watch, readonly, onMounted, useId, onDeactivated, onActivated, onScopeDispose, effectScope, toRaw, getCurrentScope, TransitionGroup, Transition, toRefs, isRef, onBeforeMount, nextTick, withDirectives, resolveDirective, vShow, onUpdated, Text, resolveDynamicComponent, toDisplayString, markRaw, Teleport, cloneVNode, createTextVNode, onUnmounted, onBeforeUpdate, withModifiers, vModelText, resolveComponent, render } from 'vue';
8
8
 
9
9
  const IN_BROWSER = typeof window !== 'undefined';
10
10
  const SUPPORTS_INTERSECTION = IN_BROWSER && 'IntersectionObserver' in window;
11
11
  const SUPPORTS_TOUCH = IN_BROWSER && ('ontouchstart' in window || window.navigator.maxTouchPoints > 0);
12
12
  const SUPPORTS_EYE_DROPPER = IN_BROWSER && 'EyeDropper' in window;
13
+ const SUPPORTS_MATCH_MEDIA = IN_BROWSER && 'matchMedia' in window && typeof window.matchMedia === 'function';
13
14
 
14
15
  function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
15
16
  function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
@@ -2782,6 +2783,7 @@ const makeThemeProps = propsFactory({
2782
2783
  function genDefaults$1() {
2783
2784
  return {
2784
2785
  defaultTheme: 'light',
2786
+ prefix: 'v-',
2785
2787
  variations: {
2786
2788
  colors: [],
2787
2789
  lighten: 0,
@@ -2863,7 +2865,10 @@ function genDefaults$1() {
2863
2865
  }
2864
2866
  }
2865
2867
  },
2866
- stylesheetId: 'vuetify-theme-stylesheet'
2868
+ stylesheetId: 'vuetify-theme-stylesheet',
2869
+ scoped: false,
2870
+ unimportant: false,
2871
+ utilities: true
2867
2872
  };
2868
2873
  }
2869
2874
  function parseThemeOptions() {
@@ -2886,21 +2891,21 @@ function parseThemeOptions() {
2886
2891
  function createCssClass(lines, selector, content, scope) {
2887
2892
  lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
2888
2893
  }
2889
- function genCssVariables(theme) {
2894
+ function genCssVariables(theme, prefix) {
2890
2895
  const lightOverlay = theme.dark ? 2 : 1;
2891
2896
  const darkOverlay = theme.dark ? 1 : 2;
2892
2897
  const variables = [];
2893
2898
  for (const [key, value] of Object.entries(theme.colors)) {
2894
2899
  const rgb = parseColor(value);
2895
- variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2900
+ variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2896
2901
  if (!key.startsWith('on-')) {
2897
- variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2902
+ variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2898
2903
  }
2899
2904
  }
2900
2905
  for (const [key, value] of Object.entries(theme.variables)) {
2901
2906
  const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
2902
2907
  const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
2903
- variables.push(`--v-${key}: ${rgb ?? value}`);
2908
+ variables.push(`--${prefix}${key}: ${rgb ?? value}`);
2904
2909
  }
2905
2910
  return variables;
2906
2911
  }
@@ -2944,7 +2949,8 @@ function getScopedSelector(selector, scope) {
2944
2949
  const scopeSelector = `:where(${scope})`;
2945
2950
  return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
2946
2951
  }
2947
- function upsertStyles(styleEl, styles) {
2952
+ function upsertStyles(id, cspNonce, styles) {
2953
+ const styleEl = getOrCreateStyleElement(id, cspNonce);
2948
2954
  if (!styleEl) return;
2949
2955
  styleEl.innerHTML = styles;
2950
2956
  }
@@ -2964,8 +2970,17 @@ function getOrCreateStyleElement(id, cspNonce) {
2964
2970
  // Composables
2965
2971
  function createTheme(options) {
2966
2972
  const parsedOptions = parseThemeOptions(options);
2967
- const name = shallowRef(parsedOptions.defaultTheme);
2973
+ const _name = shallowRef(parsedOptions.defaultTheme);
2968
2974
  const themes = ref(parsedOptions.themes);
2975
+ const systemName = shallowRef('light');
2976
+ const name = computed({
2977
+ get() {
2978
+ return _name.value === 'system' ? systemName.value : _name.value;
2979
+ },
2980
+ set(val) {
2981
+ _name.value = val;
2982
+ }
2983
+ });
2969
2984
  const computedThemes = computed(() => {
2970
2985
  const acc = {};
2971
2986
  for (const [name, original] of Object.entries(themes.value)) {
@@ -2986,28 +3001,49 @@ function createTheme(options) {
2986
3001
  const current = toRef(() => computedThemes.value[name.value]);
2987
3002
  const styles = computed(() => {
2988
3003
  const lines = [];
3004
+ const important = parsedOptions.unimportant ? '' : ' !important';
3005
+ const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
2989
3006
  if (current.value?.dark) {
2990
3007
  createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
2991
3008
  }
2992
- createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
3009
+ createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
2993
3010
  for (const [themeName, theme] of Object.entries(computedThemes.value)) {
2994
- createCssClass(lines, `.v-theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme)], parsedOptions.scope);
2995
- }
2996
- const bgLines = [];
2997
- const fgLines = [];
2998
- const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
2999
- for (const key of colors) {
3000
- if (key.startsWith('on-')) {
3001
- createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
3002
- } else {
3003
- createCssClass(bgLines, `.bg-${key}`, [`--v-theme-overlay-multiplier: var(--v-theme-${key}-overlay-multiplier)`, `background-color: rgb(var(--v-theme-${key})) !important`, `color: rgb(var(--v-theme-on-${key})) !important`], parsedOptions.scope);
3004
- createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
3005
- createCssClass(fgLines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`], parsedOptions.scope);
3011
+ createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
3012
+ }
3013
+ if (parsedOptions.utilities) {
3014
+ const bgLines = [];
3015
+ const fgLines = [];
3016
+ const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
3017
+ for (const key of colors) {
3018
+ if (key.startsWith('on-')) {
3019
+ createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
3020
+ } else {
3021
+ createCssClass(bgLines, `.${scoped}bg-${key}`, [`--${parsedOptions.prefix}theme-overlay-multiplier: var(--${parsedOptions.prefix}theme-${key}-overlay-multiplier)`, `background-color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`, `color: rgb(var(--${parsedOptions.prefix}theme-on-${key}))${important}`], parsedOptions.scope);
3022
+ createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
3023
+ createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
3024
+ }
3006
3025
  }
3026
+ lines.push(...bgLines, ...fgLines);
3007
3027
  }
3008
- lines.push(...bgLines, ...fgLines);
3009
3028
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
3010
3029
  });
3030
+ const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
3031
+ const themeNames = toRef(() => Object.keys(computedThemes.value));
3032
+ if (SUPPORTS_MATCH_MEDIA) {
3033
+ const media = window.matchMedia('(prefers-color-scheme: dark)');
3034
+ function updateSystemName() {
3035
+ systemName.value = media.matches ? 'dark' : 'light';
3036
+ }
3037
+ updateSystemName();
3038
+ media.addEventListener('change', updateSystemName, {
3039
+ passive: true
3040
+ });
3041
+ if (getCurrentScope()) {
3042
+ onScopeDispose(() => {
3043
+ media.removeEventListener('change', updateSystemName);
3044
+ });
3045
+ }
3046
+ }
3011
3047
  function install(app) {
3012
3048
  if (parsedOptions.isDisabled) return;
3013
3049
  const head = app._context.provides.usehead;
@@ -3045,22 +3081,55 @@ function createTheme(options) {
3045
3081
  updateStyles();
3046
3082
  }
3047
3083
  function updateStyles() {
3048
- upsertStyles(getOrCreateStyleElement(parsedOptions.stylesheetId, parsedOptions.cspNonce), styles.value);
3084
+ upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
3049
3085
  }
3050
3086
  }
3051
3087
  }
3052
- const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);
3088
+ function change(themeName) {
3089
+ if (!themeNames.value.includes(themeName)) {
3090
+ consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
3091
+ return;
3092
+ }
3093
+ name.value = themeName;
3094
+ }
3095
+ function cycle() {
3096
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
3097
+ const currentIndex = themeArray.indexOf(name.value);
3098
+ const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
3099
+ change(themeArray[nextIndex]);
3100
+ }
3101
+ function toggle() {
3102
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
3103
+ cycle(themeArray);
3104
+ }
3105
+ const globalName = new Proxy(name, {
3106
+ get(target, prop) {
3107
+ return target[prop];
3108
+ },
3109
+ set(target, prop, val) {
3110
+ if (prop === 'value') {
3111
+ deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
3112
+ }
3113
+ // @ts-expect-error
3114
+ target[prop] = val;
3115
+ return true;
3116
+ }
3117
+ });
3053
3118
  return {
3054
3119
  install,
3120
+ change,
3121
+ cycle,
3122
+ toggle,
3055
3123
  isDisabled: parsedOptions.isDisabled,
3056
3124
  name,
3057
3125
  themes,
3058
3126
  current,
3059
3127
  computedThemes,
3128
+ prefix: parsedOptions.prefix,
3060
3129
  themeClasses,
3061
3130
  styles,
3062
3131
  global: {
3063
- name,
3132
+ name: globalName,
3064
3133
  current
3065
3134
  }
3066
3135
  };
@@ -3071,7 +3140,7 @@ function provideTheme(props) {
3071
3140
  if (!theme) throw new Error('Could not find Vuetify theme injection');
3072
3141
  const name = toRef(() => props.theme ?? theme.name.value);
3073
3142
  const current = toRef(() => theme.themes.value[name.value]);
3074
- const themeClasses = toRef(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);
3143
+ const themeClasses = toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
3075
3144
  const newTheme = {
3076
3145
  ...theme,
3077
3146
  name,
@@ -4618,9 +4687,15 @@ function useVariant(props) {
4618
4687
  };
4619
4688
  }
4620
4689
 
4690
+ // Types
4691
+
4621
4692
  const makeVBtnGroupProps = propsFactory({
4622
4693
  baseColor: String,
4623
4694
  divided: Boolean,
4695
+ direction: {
4696
+ type: String,
4697
+ default: 'horizontal'
4698
+ },
4624
4699
  ...makeBorderProps(),
4625
4700
  ...makeComponentProps(),
4626
4701
  ...makeDensityProps(),
@@ -4654,7 +4729,7 @@ const VBtnGroup = genericComponent()({
4654
4729
  } = useRounded(props);
4655
4730
  provideDefaults({
4656
4731
  VBtn: {
4657
- height: 'auto',
4732
+ height: toRef(() => props.direction === 'horizontal' ? 'auto' : null),
4658
4733
  baseColor: toRef(() => props.baseColor),
4659
4734
  color: toRef(() => props.color),
4660
4735
  density: toRef(() => props.density),
@@ -4664,7 +4739,7 @@ const VBtnGroup = genericComponent()({
4664
4739
  });
4665
4740
  useRender(() => {
4666
4741
  return createVNode(props.tag, {
4667
- "class": ['v-btn-group', {
4742
+ "class": ['v-btn-group', `v-btn-group--${props.direction}`, {
4668
4743
  'v-btn-group--divided': props.divided
4669
4744
  }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class],
4670
4745
  "style": props.style
@@ -6143,6 +6218,31 @@ const VAppBarTitle = genericComponent()({
6143
6218
  // Utilities
6144
6219
  const VAlertTitle = createSimpleFunctional('v-alert-title');
6145
6220
 
6221
+ // Utilities
6222
+
6223
+ // Types
6224
+
6225
+ // Types
6226
+
6227
+ // Composables
6228
+ const makeIconSizeProps = propsFactory({
6229
+ iconSize: [Number, String],
6230
+ iconSizes: {
6231
+ type: Array,
6232
+ default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
6233
+ }
6234
+ }, 'iconSize');
6235
+ function useIconSizes(props, fallback) {
6236
+ const iconSize = computed(() => {
6237
+ const iconSizeMap = new Map(props.iconSizes);
6238
+ const _iconSize = props.iconSize ?? fallback() ?? 'default';
6239
+ return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
6240
+ });
6241
+ return {
6242
+ iconSize
6243
+ };
6244
+ }
6245
+
6146
6246
  // Types
6147
6247
 
6148
6248
  const allowedTypes = ['success', 'info', 'warning', 'error'];
@@ -6182,6 +6282,7 @@ const makeVAlertProps = propsFactory({
6182
6282
  ...makeDensityProps(),
6183
6283
  ...makeDimensionProps(),
6184
6284
  ...makeElevationProps(),
6285
+ ...makeIconSizeProps(),
6185
6286
  ...makeLocationProps(),
6186
6287
  ...makePositionProps(),
6187
6288
  ...makeRoundedProps(),
@@ -6209,6 +6310,9 @@ const VAlert = genericComponent()({
6209
6310
  if (!props.type) return props.icon;
6210
6311
  return props.icon ?? `$${props.type}`;
6211
6312
  });
6313
+ const {
6314
+ iconSize
6315
+ } = useIconSizes(props, () => props.prominent ? 44 : 28);
6212
6316
  const {
6213
6317
  themeClasses
6214
6318
  } = provideTheme(props);
@@ -6256,6 +6360,11 @@ const VAlert = genericComponent()({
6256
6360
  const hasPrepend = !!(slots.prepend || icon.value);
6257
6361
  const hasTitle = !!(slots.title || props.title);
6258
6362
  const hasClose = !!(slots.close || props.closable);
6363
+ const iconProps = {
6364
+ density: props.density,
6365
+ icon: icon.value,
6366
+ size: iconSize.value
6367
+ };
6259
6368
  return isActive.value && createVNode(props.tag, {
6260
6369
  "class": ['v-alert', props.border && {
6261
6370
  'v-alert--border': !!props.border,
@@ -6273,19 +6382,14 @@ const VAlert = genericComponent()({
6273
6382
  }, null), hasPrepend && createVNode("div", {
6274
6383
  "key": "prepend",
6275
6384
  "class": "v-alert__prepend"
6276
- }, [!slots.prepend ? createVNode(VIcon, {
6277
- "key": "prepend-icon",
6278
- "density": props.density,
6279
- "icon": icon.value,
6280
- "size": props.prominent ? 44 : 28
6281
- }, null) : createVNode(VDefaultsProvider, {
6385
+ }, [!slots.prepend ? createVNode(VIcon, mergeProps({
6386
+ "key": "prepend-icon"
6387
+ }, iconProps), null) : createVNode(VDefaultsProvider, {
6282
6388
  "key": "prepend-defaults",
6283
6389
  "disabled": !icon.value,
6284
6390
  "defaults": {
6285
6391
  VIcon: {
6286
- density: props.density,
6287
- icon: icon.value,
6288
- size: props.prominent ? 44 : 28
6392
+ ...iconProps
6289
6393
  }
6290
6394
  }
6291
6395
  }, slots.prepend)]), createVNode("div", {
@@ -8483,6 +8587,68 @@ const VChip = genericComponent()({
8483
8587
  }
8484
8588
  });
8485
8589
 
8590
+ const makeVDividerProps = propsFactory({
8591
+ color: String,
8592
+ inset: Boolean,
8593
+ length: [Number, String],
8594
+ opacity: [Number, String],
8595
+ thickness: [Number, String],
8596
+ vertical: Boolean,
8597
+ ...makeComponentProps(),
8598
+ ...makeThemeProps()
8599
+ }, 'VDivider');
8600
+ const VDivider = genericComponent()({
8601
+ name: 'VDivider',
8602
+ props: makeVDividerProps(),
8603
+ setup(props, _ref) {
8604
+ let {
8605
+ attrs,
8606
+ slots
8607
+ } = _ref;
8608
+ const {
8609
+ themeClasses
8610
+ } = provideTheme(props);
8611
+ const {
8612
+ textColorClasses,
8613
+ textColorStyles
8614
+ } = useTextColor(() => props.color);
8615
+ const dividerStyles = computed(() => {
8616
+ const styles = {};
8617
+ if (props.length) {
8618
+ styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
8619
+ }
8620
+ if (props.thickness) {
8621
+ styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
8622
+ }
8623
+ return styles;
8624
+ });
8625
+ useRender(() => {
8626
+ const divider = createVNode("hr", {
8627
+ "class": [{
8628
+ 'v-divider': true,
8629
+ 'v-divider--inset': props.inset,
8630
+ 'v-divider--vertical': props.vertical
8631
+ }, themeClasses.value, textColorClasses.value, props.class],
8632
+ "style": [dividerStyles.value, textColorStyles.value, {
8633
+ '--v-border-opacity': props.opacity
8634
+ }, props.style],
8635
+ "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
8636
+ "role": `${attrs.role || 'separator'}`
8637
+ }, null);
8638
+ if (!slots.default) return divider;
8639
+ return createVNode("div", {
8640
+ "class": ['v-divider__wrapper', {
8641
+ 'v-divider__wrapper--vertical': props.vertical,
8642
+ 'v-divider__wrapper--inset': props.inset
8643
+ }]
8644
+ }, [divider, createVNode("div", {
8645
+ "class": "v-divider__content"
8646
+ }, [slots.default()]), divider]);
8647
+ });
8648
+ return {};
8649
+ }
8650
+ });
8651
+
8486
8652
  // Utilities
8487
8653
 
8488
8654
  // List
@@ -9634,68 +9800,6 @@ const VListSubheader = genericComponent()({
9634
9800
  }
9635
9801
  });
9636
9802
 
9637
- const makeVDividerProps = propsFactory({
9638
- color: String,
9639
- inset: Boolean,
9640
- length: [Number, String],
9641
- opacity: [Number, String],
9642
- thickness: [Number, String],
9643
- vertical: Boolean,
9644
- ...makeComponentProps(),
9645
- ...makeThemeProps()
9646
- }, 'VDivider');
9647
- const VDivider = genericComponent()({
9648
- name: 'VDivider',
9649
- props: makeVDividerProps(),
9650
- setup(props, _ref) {
9651
- let {
9652
- attrs,
9653
- slots
9654
- } = _ref;
9655
- const {
9656
- themeClasses
9657
- } = provideTheme(props);
9658
- const {
9659
- textColorClasses,
9660
- textColorStyles
9661
- } = useTextColor(() => props.color);
9662
- const dividerStyles = computed(() => {
9663
- const styles = {};
9664
- if (props.length) {
9665
- styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
9666
- }
9667
- if (props.thickness) {
9668
- styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
9669
- }
9670
- return styles;
9671
- });
9672
- useRender(() => {
9673
- const divider = createVNode("hr", {
9674
- "class": [{
9675
- 'v-divider': true,
9676
- 'v-divider--inset': props.inset,
9677
- 'v-divider--vertical': props.vertical
9678
- }, themeClasses.value, textColorClasses.value, props.class],
9679
- "style": [dividerStyles.value, textColorStyles.value, {
9680
- '--v-border-opacity': props.opacity
9681
- }, props.style],
9682
- "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
9683
- "role": `${attrs.role || 'separator'}`
9684
- }, null);
9685
- if (!slots.default) return divider;
9686
- return createVNode("div", {
9687
- "class": ['v-divider__wrapper', {
9688
- 'v-divider__wrapper--vertical': props.vertical,
9689
- 'v-divider__wrapper--inset': props.inset
9690
- }]
9691
- }, [divider, createVNode("div", {
9692
- "class": "v-divider__content"
9693
- }, [slots.default()]), divider]);
9694
- });
9695
- return {};
9696
- }
9697
- });
9698
-
9699
9803
  // Types
9700
9804
 
9701
9805
  const makeVListChildrenProps = propsFactory({
@@ -12613,7 +12717,12 @@ function useVirtual(props, items) {
12613
12717
  }
12614
12718
  function calculateOffset(index) {
12615
12719
  index = clamp(index, 0, items.value.length - 1);
12616
- return offsets[index] || 0;
12720
+ const whole = Math.floor(index);
12721
+ const fraction = index % 1;
12722
+ const next = whole + 1;
12723
+ const wholeOffset = offsets[whole] || 0;
12724
+ const nextOffset = offsets[next] || wholeOffset;
12725
+ return wholeOffset + (nextOffset - wholeOffset) * fraction;
12617
12726
  }
12618
12727
  function calculateIndex(scrollTop) {
12619
12728
  return binaryClosest(offsets, scrollTop);
@@ -13244,6 +13353,22 @@ const VSelect = genericComponent()({
13244
13353
  key: item.value,
13245
13354
  onClick: () => select(item, null)
13246
13355
  });
13356
+ if (item.raw.type === 'divider') {
13357
+ return slots.divider?.({
13358
+ props: item.raw,
13359
+ index
13360
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
13361
+ "key": `divider-${index}`
13362
+ }), null);
13363
+ }
13364
+ if (item.raw.type === 'subheader') {
13365
+ return slots.subheader?.({
13366
+ props: item.raw,
13367
+ index
13368
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
13369
+ "key": `subheader-${index}`
13370
+ }), null);
13371
+ }
13247
13372
  return slots.item?.({
13248
13373
  item,
13249
13374
  index,
@@ -13404,6 +13529,9 @@ function filterItems(items, query, options) {
13404
13529
  let match = -1;
13405
13530
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13406
13531
  if (typeof item === 'object') {
13532
+ if (['divider', 'subheader'].includes(item.raw?.type)) {
13533
+ continue;
13534
+ }
13407
13535
  const filterKeys = keys || Object.keys(transformed);
13408
13536
  for (const key of filterKeys) {
13409
13537
  const value = getPropertyFromItem(transformed, key);
@@ -13842,6 +13970,22 @@ const VAutocomplete = genericComponent()({
13842
13970
  active: highlightFirst.value && index === 0 ? true : undefined,
13843
13971
  onClick: () => select(item, null)
13844
13972
  });
13973
+ if (item.raw.type === 'divider') {
13974
+ return slots.divider?.({
13975
+ props: item.raw,
13976
+ index
13977
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
13978
+ "key": `divider-${index}`
13979
+ }), null);
13980
+ }
13981
+ if (item.raw.type === 'subheader') {
13982
+ return slots.subheader?.({
13983
+ props: item.raw,
13984
+ index
13985
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
13986
+ "key": `subheader-${index}`
13987
+ }), null);
13988
+ }
13845
13989
  return slots.item?.({
13846
13990
  item,
13847
13991
  index,
@@ -18252,6 +18396,7 @@ const VCombobox = genericComponent()({
18252
18396
  _search.value = val ?? '';
18253
18397
  if (!props.multiple && !hasSelectionSlot.value) {
18254
18398
  model.value = [transformItem$3(props, val)];
18399
+ nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18255
18400
  }
18256
18401
  if (val && props.multiple && props.delimiters?.length) {
18257
18402
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18568,6 +18713,22 @@ const VCombobox = genericComponent()({
18568
18713
  active: highlightFirst.value && index === 0 ? true : undefined,
18569
18714
  onClick: () => select(item, null)
18570
18715
  });
18716
+ if (item.raw.type === 'divider') {
18717
+ return slots.divider?.({
18718
+ props: item.raw,
18719
+ index
18720
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
18721
+ "key": `divider-${index}`
18722
+ }), null);
18723
+ }
18724
+ if (item.raw.type === 'subheader') {
18725
+ return slots.subheader?.({
18726
+ props: item.raw,
18727
+ index
18728
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
18729
+ "key": `subheader-${index}`
18730
+ }), null);
18731
+ }
18571
18732
  return slots.item?.({
18572
18733
  item,
18573
18734
  index,
@@ -24991,6 +25152,10 @@ const makeVNumberInputProps = propsFactory({
24991
25152
  type: Number,
24992
25153
  default: 0
24993
25154
  },
25155
+ minFractionDigits: {
25156
+ type: Number,
25157
+ default: null
25158
+ },
24994
25159
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
24995
25160
  }, 'VNumberInput');
24996
25161
  const VNumberInput = genericComponent()({
@@ -25021,9 +25186,19 @@ const VNumberInput = genericComponent()({
25021
25186
  } = useFocus(props);
25022
25187
  function correctPrecision(val) {
25023
25188
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
25024
- const fixed = precision == null ? String(val) : val.toFixed(precision);
25025
- return isFocused.value ? Number(fixed).toString() // trim zeros
25026
- : fixed;
25189
+ if (precision == null) {
25190
+ return String(val);
25191
+ }
25192
+ let fixed = val.toFixed(precision);
25193
+ if (isFocused.value) {
25194
+ return Number(fixed).toString(); // trim zeros
25195
+ }
25196
+ if ((props.minFractionDigits ?? precision) < precision) {
25197
+ const trimLimit = precision - props.minFractionDigits;
25198
+ const [baseDigits, fractionDigits] = fixed.split('.');
25199
+ fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
25200
+ }
25201
+ return fixed;
25027
25202
  }
25028
25203
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
25029
25204
  const _inputText = shallowRef(null);
@@ -25076,6 +25251,7 @@ const VNumberInput = genericComponent()({
25076
25251
  }
25077
25252
  };
25078
25253
  watch(() => props.precision, () => formatInputValue());
25254
+ watch(() => props.minFractionDigits, () => formatInputValue());
25079
25255
  onMounted(() => {
25080
25256
  clampModel();
25081
25257
  });
@@ -25177,7 +25353,7 @@ const VNumberInput = genericComponent()({
25177
25353
  inputText.value = null;
25178
25354
  return;
25179
25355
  }
25180
- inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25356
+ inputText.value = correctPrecision(model.value);
25181
25357
  }
25182
25358
  function trimDecimalZeros() {
25183
25359
  if (controlsDisabled.value) return;
@@ -29219,7 +29395,7 @@ function createVuetify$1() {
29219
29395
  };
29220
29396
  });
29221
29397
  }
29222
- const version$1 = "3.8.5-master.2025-05-20";
29398
+ const version$1 = "3.8.6-dev.2025-05-21";
29223
29399
  createVuetify$1.version = version$1;
29224
29400
 
29225
29401
  // Vue's inject() can only be used in setup
@@ -29244,7 +29420,7 @@ const createVuetify = function () {
29244
29420
  ...options
29245
29421
  });
29246
29422
  };
29247
- const version = "3.8.5-master.2025-05-20";
29423
+ const version = "3.8.6-dev.2025-05-21";
29248
29424
  createVuetify.version = version;
29249
29425
 
29250
29426
  export { index as blueprints, components, createVuetify, directives, useDate, useDefaults, useDisplay, useGoTo, useLayout, useLocale, useRtl, useTheme, version };