@vuetify/nightly 3.8.5-pr-21419.3ae3440 → 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 (106) hide show
  1. package/CHANGELOG.md +21 -10
  2. package/dist/json/attributes.json +3457 -3421
  3. package/dist/json/importMap-labs.json +28 -28
  4. package/dist/json/importMap.json +174 -174
  5. package/dist/json/tags.json +9 -0
  6. package/dist/json/web-types.json +6421 -6246
  7. package/dist/vuetify-labs.cjs +296 -156
  8. package/dist/vuetify-labs.css +5588 -5549
  9. package/dist/vuetify-labs.d.ts +1512 -1354
  10. package/dist/vuetify-labs.esm.js +297 -157
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +296 -156
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +290 -145
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +4006 -3967
  17. package/dist/vuetify.d.ts +671 -521
  18. package/dist/vuetify.esm.js +291 -146
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +290 -145
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1196 -1189
  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/VDatePicker/VDatePicker.d.ts +10 -0
  44. package/lib/components/VDatePicker/VDatePickerMonth.d.ts +10 -0
  45. package/lib/components/VDatePicker/VDatePickerMonth.js +1 -1
  46. package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
  47. package/lib/components/VField/VField.d.ts +3 -3
  48. package/lib/components/VFileInput/VFileInput.d.ts +15 -15
  49. package/lib/components/VInput/VInput.d.ts +4 -4
  50. package/lib/components/VList/VListChildren.js.map +1 -1
  51. package/lib/components/VNumberInput/VNumberInput.css +15 -4
  52. package/lib/components/VNumberInput/VNumberInput.d.ts +103 -89
  53. package/lib/components/VNumberInput/VNumberInput.js +19 -4
  54. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  55. package/lib/components/VNumberInput/VNumberInput.sass +18 -6
  56. package/lib/components/VOverlay/VOverlay.css +1 -1
  57. package/lib/components/VOverlay/_variables.scss +1 -1
  58. package/lib/components/VRadioGroup/VRadioGroup.d.ts +3 -3
  59. package/lib/components/VRangeSlider/VRangeSlider.d.ts +3 -3
  60. package/lib/components/VSelect/VSelect.d.ts +120 -96
  61. package/lib/components/VSelect/VSelect.js +19 -34
  62. package/lib/components/VSelect/VSelect.js.map +1 -1
  63. package/lib/components/VSlider/VSlider.d.ts +3 -3
  64. package/lib/components/VSwitch/VSwitch.d.ts +3 -3
  65. package/lib/components/VTextField/VTextField.d.ts +27 -27
  66. package/lib/components/VTextarea/VTextarea.d.ts +15 -15
  67. package/lib/composables/calendar.d.ts +6 -0
  68. package/lib/composables/calendar.js +2 -1
  69. package/lib/composables/calendar.js.map +1 -1
  70. package/lib/composables/date/DateAdapter.d.ts +1 -1
  71. package/lib/composables/date/DateAdapter.js.map +1 -1
  72. package/lib/composables/date/adapters/vuetify.d.ts +1 -1
  73. package/lib/composables/date/adapters/vuetify.js +4 -4
  74. package/lib/composables/date/adapters/vuetify.js.map +1 -1
  75. package/lib/composables/date/date.d.ts +1 -1
  76. package/lib/composables/date/index.d.ts +1 -0
  77. package/lib/composables/date/index.js +1 -0
  78. package/lib/composables/date/index.js.map +1 -1
  79. package/lib/composables/filter.js +3 -0
  80. package/lib/composables/filter.js.map +1 -1
  81. package/lib/composables/iconSizes.d.ts +28 -0
  82. package/lib/composables/iconSizes.js +23 -0
  83. package/lib/composables/iconSizes.js.map +1 -0
  84. package/lib/composables/theme.d.ts +6 -1
  85. package/lib/composables/theme.js +94 -26
  86. package/lib/composables/theme.js.map +1 -1
  87. package/lib/composables/virtual.js +6 -1
  88. package/lib/composables/virtual.js.map +1 -1
  89. package/lib/entry-bundler.d.ts +1 -1
  90. package/lib/entry-bundler.js +1 -1
  91. package/lib/entry-bundler.js.map +1 -1
  92. package/lib/framework.d.ts +76 -71
  93. package/lib/framework.js +1 -1
  94. package/lib/framework.js.map +1 -1
  95. package/lib/labs/VCalendar/VCalendar.d.ts +10 -0
  96. package/lib/labs/VColorInput/VColorInput.d.ts +3 -3
  97. package/lib/labs/VDateInput/VDateInput.d.ts +97 -87
  98. package/lib/labs/VFileUpload/VFileUpload.d.ts +3 -3
  99. package/lib/labs/VIconBtn/VIconBtn.d.ts +29 -29
  100. package/lib/labs/VIconBtn/VIconBtn.js +7 -11
  101. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  102. package/lib/labs/entry-bundler.d.ts +1 -1
  103. package/lib/util/globals.d.ts +1 -0
  104. package/lib/util/globals.js +1 -0
  105. package/lib/util/globals.js.map +1 -1
  106. package/package.json +3 -1
@@ -1,15 +1,16 @@
1
1
  /*!
2
- * Vuetify v3.8.5-pr-21419.3ae3440
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);
@@ -13017,7 +13126,6 @@ const VSelect = genericComponent()({
13017
13126
  const selectedValues = computed(() => model.value.map(selection => selection.value));
13018
13127
  const isFocused = shallowRef(false);
13019
13128
  let keyboardLookupPrefix = '';
13020
- let keyboardLookupIndex = -1;
13021
13129
  let keyboardLookupLastTime;
13022
13130
  const displayItems = computed(() => {
13023
13131
  if (props.hideSelected) {
@@ -13085,41 +13193,10 @@ const VSelect = genericComponent()({
13085
13193
  const now = performance.now();
13086
13194
  if (now - keyboardLookupLastTime > KEYBOARD_LOOKUP_THRESHOLD) {
13087
13195
  keyboardLookupPrefix = '';
13088
- keyboardLookupIndex = -1;
13089
13196
  }
13090
13197
  keyboardLookupPrefix += e.key.toLowerCase();
13091
13198
  keyboardLookupLastTime = now;
13092
- const items = displayItems.value;
13093
- function findItem() {
13094
- let result = findItemBase();
13095
- if (result !== undefined) return result;
13096
- if (keyboardLookupPrefix.at(-1) === keyboardLookupPrefix.at(-2)) {
13097
- // No matches but we have a repeated letter, try the next item with that prefix
13098
- keyboardLookupPrefix = keyboardLookupPrefix.slice(0, -1);
13099
- result = findItemBase();
13100
- if (result !== undefined) return result;
13101
- }
13102
-
13103
- // Still nothing, wrap around to the top
13104
- keyboardLookupIndex = -1;
13105
- result = findItemBase();
13106
- if (result !== undefined) return result;
13107
-
13108
- // Still nothing, try just the new letter
13109
- keyboardLookupPrefix = e.key.toLowerCase();
13110
- return findItemBase();
13111
- }
13112
- function findItemBase() {
13113
- for (let i = 0; i < items.length; i++) {
13114
- const _item = items[i];
13115
- if (i > keyboardLookupIndex && _item.title.toLowerCase().startsWith(keyboardLookupPrefix)) {
13116
- keyboardLookupIndex = i;
13117
- return _item;
13118
- }
13119
- }
13120
- return undefined;
13121
- }
13122
- const item = findItem();
13199
+ const item = items.value.find(item => item.title.toLowerCase().startsWith(keyboardLookupPrefix));
13123
13200
  if (item !== undefined) {
13124
13201
  if (!props.multiple) {
13125
13202
  model.value = [item];
@@ -13276,6 +13353,22 @@ const VSelect = genericComponent()({
13276
13353
  key: item.value,
13277
13354
  onClick: () => select(item, null)
13278
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
+ }
13279
13372
  return slots.item?.({
13280
13373
  item,
13281
13374
  index,
@@ -13436,6 +13529,9 @@ function filterItems(items, query, options) {
13436
13529
  let match = -1;
13437
13530
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13438
13531
  if (typeof item === 'object') {
13532
+ if (['divider', 'subheader'].includes(item.raw?.type)) {
13533
+ continue;
13534
+ }
13439
13535
  const filterKeys = keys || Object.keys(transformed);
13440
13536
  for (const key of filterKeys) {
13441
13537
  const value = getPropertyFromItem(transformed, key);
@@ -13874,6 +13970,22 @@ const VAutocomplete = genericComponent()({
13874
13970
  active: highlightFirst.value && index === 0 ? true : undefined,
13875
13971
  onClick: () => select(item, null)
13876
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
+ }
13877
13989
  return slots.item?.({
13878
13990
  item,
13879
13991
  index,
@@ -17469,13 +17581,13 @@ function date(value) {
17469
17581
  return null;
17470
17582
  }
17471
17583
  const sundayJanuarySecond2000 = new Date(2000, 0, 2);
17472
- function getWeekdays(locale, firstDayOfWeek) {
17584
+ function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
17473
17585
  const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
17474
17586
  return createRange(7).map(i => {
17475
17587
  const weekday = new Date(sundayJanuarySecond2000);
17476
17588
  weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
17477
17589
  return new Intl.DateTimeFormat(locale, {
17478
- weekday: 'narrow'
17590
+ weekday: weekdayFormat ?? 'narrow'
17479
17591
  }).format(weekday);
17480
17592
  });
17481
17593
  }
@@ -17939,9 +18051,9 @@ class VuetifyDateAdapter {
17939
18051
  getDiff(date, comparing, unit) {
17940
18052
  return getDiff(date, comparing, unit);
17941
18053
  }
17942
- getWeekdays(firstDayOfWeek) {
18054
+ getWeekdays(firstDayOfWeek, weekdayFormat) {
17943
18055
  const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
17944
- return getWeekdays(this.locale, firstDay);
18056
+ return getWeekdays(this.locale, firstDay, weekdayFormat);
17945
18057
  }
17946
18058
  getYear(date) {
17947
18059
  return getYear(date);
@@ -18284,6 +18396,7 @@ const VCombobox = genericComponent()({
18284
18396
  _search.value = val ?? '';
18285
18397
  if (!props.multiple && !hasSelectionSlot.value) {
18286
18398
  model.value = [transformItem$3(props, val)];
18399
+ nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18287
18400
  }
18288
18401
  if (val && props.multiple && props.delimiters?.length) {
18289
18402
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18600,6 +18713,22 @@ const VCombobox = genericComponent()({
18600
18713
  active: highlightFirst.value && index === 0 ? true : undefined,
18601
18714
  onClick: () => select(item, null)
18602
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
+ }
18603
18732
  return slots.item?.({
18604
18733
  item,
18605
18734
  index,
@@ -22243,7 +22372,8 @@ const makeCalendarProps = propsFactory({
22243
22372
  firstDayOfWeek: {
22244
22373
  type: [Number, String],
22245
22374
  default: undefined
22246
- }
22375
+ },
22376
+ weekdayFormat: String
22247
22377
  }, 'calendar');
22248
22378
  function useCalendar(props) {
22249
22379
  const adapter = useDate();
@@ -22491,7 +22621,7 @@ const VDatePickerMonth = genericComponent()({
22491
22621
  "ref": daysRef,
22492
22622
  "key": daysInMonth.value[0].date?.toString(),
22493
22623
  "class": "v-date-picker-month__days"
22494
- }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => createVNode("div", {
22624
+ }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => createVNode("div", {
22495
22625
  "class": ['v-date-picker-month__day', 'v-date-picker-month__weekday']
22496
22626
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22497
22627
  const slotProps = {
@@ -25022,6 +25152,10 @@ const makeVNumberInputProps = propsFactory({
25022
25152
  type: Number,
25023
25153
  default: 0
25024
25154
  },
25155
+ minFractionDigits: {
25156
+ type: Number,
25157
+ default: null
25158
+ },
25025
25159
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
25026
25160
  }, 'VNumberInput');
25027
25161
  const VNumberInput = genericComponent()({
@@ -25052,9 +25186,19 @@ const VNumberInput = genericComponent()({
25052
25186
  } = useFocus(props);
25053
25187
  function correctPrecision(val) {
25054
25188
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
25055
- const fixed = precision == null ? String(val) : val.toFixed(precision);
25056
- return isFocused.value ? Number(fixed).toString() // trim zeros
25057
- : 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;
25058
25202
  }
25059
25203
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
25060
25204
  const _inputText = shallowRef(null);
@@ -25107,6 +25251,7 @@ const VNumberInput = genericComponent()({
25107
25251
  }
25108
25252
  };
25109
25253
  watch(() => props.precision, () => formatInputValue());
25254
+ watch(() => props.minFractionDigits, () => formatInputValue());
25110
25255
  onMounted(() => {
25111
25256
  clampModel();
25112
25257
  });
@@ -25208,7 +25353,7 @@ const VNumberInput = genericComponent()({
25208
25353
  inputText.value = null;
25209
25354
  return;
25210
25355
  }
25211
- inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25356
+ inputText.value = correctPrecision(model.value);
25212
25357
  }
25213
25358
  function trimDecimalZeros() {
25214
25359
  if (controlsDisabled.value) return;
@@ -29250,7 +29395,7 @@ function createVuetify$1() {
29250
29395
  };
29251
29396
  });
29252
29397
  }
29253
- const version$1 = "3.8.5-pr-21419.3ae3440";
29398
+ const version$1 = "3.8.6-dev.2025-05-21";
29254
29399
  createVuetify$1.version = version$1;
29255
29400
 
29256
29401
  // Vue's inject() can only be used in setup
@@ -29275,7 +29420,7 @@ const createVuetify = function () {
29275
29420
  ...options
29276
29421
  });
29277
29422
  };
29278
- const version = "3.8.5-pr-21419.3ae3440";
29423
+ const version = "3.8.6-dev.2025-05-21";
29279
29424
  createVuetify.version = version;
29280
29425
 
29281
29426
  export { index as blueprints, components, createVuetify, directives, useDate, useDefaults, useDisplay, useGoTo, useLayout, useLocale, useRtl, useTheme, version };