@vuetify/nightly 3.8.6-master.2025-05-26 → 3.8.7-dev.2025-05-27

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 (117) hide show
  1. package/CHANGELOG.md +24 -24
  2. package/dist/json/attributes.json +3294 -3218
  3. package/dist/json/importMap-labs.json +26 -26
  4. package/dist/json/importMap.json +192 -192
  5. package/dist/json/tags.json +19 -0
  6. package/dist/json/web-types.json +5776 -5504
  7. package/dist/vuetify-labs.cjs +305 -128
  8. package/dist/vuetify-labs.css +5202 -5174
  9. package/dist/vuetify-labs.d.ts +1580 -1351
  10. package/dist/vuetify-labs.esm.js +306 -129
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +305 -128
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +299 -117
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +4512 -4484
  17. package/dist/vuetify.d.ts +739 -518
  18. package/dist/vuetify.esm.js +300 -118
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +299 -117
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1194 -1184
  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 +15 -10
  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 +133 -96
  31. package/lib/components/VAutocomplete/VAutocomplete.js +19 -2
  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/VChipGroup/VChipGroup.d.ts +10 -0
  41. package/lib/components/VCombobox/VCombobox.d.ts +133 -96
  42. package/lib/components/VCombobox/VCombobox.js +20 -2
  43. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  44. package/lib/components/VDataTable/VDataTable.d.ts +18 -0
  45. package/lib/components/VDataTable/VDataTableHeaders.d.ts +13 -0
  46. package/lib/components/VDataTable/VDataTableHeaders.js +4 -2
  47. package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
  48. package/lib/components/VDataTable/VDataTableServer.d.ts +13 -0
  49. package/lib/components/VDataTable/VDataTableVirtual.d.ts +13 -0
  50. package/lib/components/VDatePicker/VDatePicker.d.ts +10 -0
  51. package/lib/components/VDatePicker/VDatePickerMonth.d.ts +10 -0
  52. package/lib/components/VDatePicker/VDatePickerMonth.js +1 -1
  53. package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
  54. package/lib/components/VField/VField.d.ts +3 -3
  55. package/lib/components/VFileInput/VFileInput.d.ts +15 -15
  56. package/lib/components/VInput/VInput.d.ts +4 -4
  57. package/lib/components/VList/VListChildren.js.map +1 -1
  58. package/lib/components/VNumberInput/VNumberInput.d.ts +103 -89
  59. package/lib/components/VNumberInput/VNumberInput.js +19 -4
  60. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  61. package/lib/components/VOtpInput/VOtpInput.js +2 -1
  62. package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
  63. package/lib/components/VOverlay/VOverlay.css +1 -1
  64. package/lib/components/VOverlay/_variables.scss +1 -1
  65. package/lib/components/VRadioGroup/VRadioGroup.d.ts +3 -3
  66. package/lib/components/VRangeSlider/VRangeSlider.d.ts +3 -3
  67. package/lib/components/VSelect/VSelect.d.ts +138 -96
  68. package/lib/components/VSelect/VSelect.js +21 -3
  69. package/lib/components/VSelect/VSelect.js.map +1 -1
  70. package/lib/components/VSlideGroup/VSlideGroup.d.ts +10 -0
  71. package/lib/components/VSlideGroup/VSlideGroup.js +2 -1
  72. package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
  73. package/lib/components/VSlider/VSlider.d.ts +3 -3
  74. package/lib/components/VSwitch/VSwitch.d.ts +3 -3
  75. package/lib/components/VTabs/VTabs.d.ts +10 -0
  76. package/lib/components/VTextField/VTextField.d.ts +27 -27
  77. package/lib/components/VTextarea/VTextarea.d.ts +15 -15
  78. package/lib/composables/calendar.d.ts +6 -0
  79. package/lib/composables/calendar.js +2 -1
  80. package/lib/composables/calendar.js.map +1 -1
  81. package/lib/composables/date/DateAdapter.d.ts +1 -1
  82. package/lib/composables/date/DateAdapter.js.map +1 -1
  83. package/lib/composables/date/adapters/vuetify.d.ts +1 -1
  84. package/lib/composables/date/adapters/vuetify.js +4 -4
  85. package/lib/composables/date/adapters/vuetify.js.map +1 -1
  86. package/lib/composables/date/date.d.ts +1 -1
  87. package/lib/composables/date/index.d.ts +1 -0
  88. package/lib/composables/date/index.js +1 -0
  89. package/lib/composables/date/index.js.map +1 -1
  90. package/lib/composables/filter.js +3 -0
  91. package/lib/composables/filter.js.map +1 -1
  92. package/lib/composables/iconSizes.d.ts +28 -0
  93. package/lib/composables/iconSizes.js +23 -0
  94. package/lib/composables/iconSizes.js.map +1 -0
  95. package/lib/composables/theme.d.ts +6 -1
  96. package/lib/composables/theme.js +94 -26
  97. package/lib/composables/theme.js.map +1 -1
  98. package/lib/composables/virtual.js +6 -1
  99. package/lib/composables/virtual.js.map +1 -1
  100. package/lib/entry-bundler.d.ts +1 -1
  101. package/lib/entry-bundler.js +1 -1
  102. package/lib/entry-bundler.js.map +1 -1
  103. package/lib/framework.d.ts +73 -68
  104. package/lib/framework.js +1 -1
  105. package/lib/framework.js.map +1 -1
  106. package/lib/labs/VCalendar/VCalendar.d.ts +10 -0
  107. package/lib/labs/VColorInput/VColorInput.d.ts +3 -3
  108. package/lib/labs/VDateInput/VDateInput.d.ts +97 -87
  109. package/lib/labs/VFileUpload/VFileUpload.d.ts +3 -3
  110. package/lib/labs/VIconBtn/VIconBtn.d.ts +29 -29
  111. package/lib/labs/VIconBtn/VIconBtn.js +7 -11
  112. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  113. package/lib/labs/entry-bundler.d.ts +1 -1
  114. package/lib/util/globals.d.ts +1 -0
  115. package/lib/util/globals.js +1 -0
  116. package/lib/util/globals.js.map +1 -1
  117. package/package.json +3 -1
package/dist/vuetify.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.8.6-master.2025-05-26
2
+ * Vuetify v3.8.7-dev.2025-05-27
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -14,6 +14,7 @@
14
14
  const SUPPORTS_INTERSECTION = IN_BROWSER && 'IntersectionObserver' in window;
15
15
  const SUPPORTS_TOUCH = IN_BROWSER && ('ontouchstart' in window || window.navigator.maxTouchPoints > 0);
16
16
  const SUPPORTS_EYE_DROPPER = IN_BROWSER && 'EyeDropper' in window;
17
+ const SUPPORTS_MATCH_MEDIA = IN_BROWSER && 'matchMedia' in window && typeof window.matchMedia === 'function';
17
18
 
18
19
  function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
19
20
  function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
@@ -2828,6 +2829,7 @@
2828
2829
  function genDefaults$1() {
2829
2830
  return {
2830
2831
  defaultTheme: 'light',
2832
+ prefix: 'v-',
2831
2833
  variations: {
2832
2834
  colors: [],
2833
2835
  lighten: 0,
@@ -2909,7 +2911,10 @@
2909
2911
  }
2910
2912
  }
2911
2913
  },
2912
- stylesheetId: 'vuetify-theme-stylesheet'
2914
+ stylesheetId: 'vuetify-theme-stylesheet',
2915
+ scoped: false,
2916
+ unimportant: false,
2917
+ utilities: true
2913
2918
  };
2914
2919
  }
2915
2920
  function parseThemeOptions() {
@@ -2932,21 +2937,21 @@
2932
2937
  function createCssClass(lines, selector, content, scope) {
2933
2938
  lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
2934
2939
  }
2935
- function genCssVariables(theme) {
2940
+ function genCssVariables(theme, prefix) {
2936
2941
  const lightOverlay = theme.dark ? 2 : 1;
2937
2942
  const darkOverlay = theme.dark ? 1 : 2;
2938
2943
  const variables = [];
2939
2944
  for (const [key, value] of Object.entries(theme.colors)) {
2940
2945
  const rgb = parseColor(value);
2941
- variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2946
+ variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2942
2947
  if (!key.startsWith('on-')) {
2943
- variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2948
+ variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2944
2949
  }
2945
2950
  }
2946
2951
  for (const [key, value] of Object.entries(theme.variables)) {
2947
2952
  const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
2948
2953
  const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
2949
- variables.push(`--v-${key}: ${rgb ?? value}`);
2954
+ variables.push(`--${prefix}${key}: ${rgb ?? value}`);
2950
2955
  }
2951
2956
  return variables;
2952
2957
  }
@@ -2990,7 +2995,8 @@
2990
2995
  const scopeSelector = `:where(${scope})`;
2991
2996
  return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
2992
2997
  }
2993
- function upsertStyles(styleEl, styles) {
2998
+ function upsertStyles(id, cspNonce, styles) {
2999
+ const styleEl = getOrCreateStyleElement(id, cspNonce);
2994
3000
  if (!styleEl) return;
2995
3001
  styleEl.innerHTML = styles;
2996
3002
  }
@@ -3010,8 +3016,17 @@
3010
3016
  // Composables
3011
3017
  function createTheme(options) {
3012
3018
  const parsedOptions = parseThemeOptions(options);
3013
- const name = vue.shallowRef(parsedOptions.defaultTheme);
3019
+ const _name = vue.shallowRef(parsedOptions.defaultTheme);
3014
3020
  const themes = vue.ref(parsedOptions.themes);
3021
+ const systemName = vue.shallowRef('light');
3022
+ const name = vue.computed({
3023
+ get() {
3024
+ return _name.value === 'system' ? systemName.value : _name.value;
3025
+ },
3026
+ set(val) {
3027
+ _name.value = val;
3028
+ }
3029
+ });
3015
3030
  const computedThemes = vue.computed(() => {
3016
3031
  const acc = {};
3017
3032
  for (const [name, original] of Object.entries(themes.value)) {
@@ -3032,28 +3047,49 @@
3032
3047
  const current = vue.toRef(() => computedThemes.value[name.value]);
3033
3048
  const styles = vue.computed(() => {
3034
3049
  const lines = [];
3050
+ const important = parsedOptions.unimportant ? '' : ' !important';
3051
+ const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
3035
3052
  if (current.value?.dark) {
3036
3053
  createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
3037
3054
  }
3038
- createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
3055
+ createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
3039
3056
  for (const [themeName, theme] of Object.entries(computedThemes.value)) {
3040
- createCssClass(lines, `.v-theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme)], parsedOptions.scope);
3041
- }
3042
- const bgLines = [];
3043
- const fgLines = [];
3044
- const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
3045
- for (const key of colors) {
3046
- if (key.startsWith('on-')) {
3047
- createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
3048
- } else {
3049
- 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);
3050
- createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
3051
- createCssClass(fgLines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`], parsedOptions.scope);
3057
+ createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
3058
+ }
3059
+ if (parsedOptions.utilities) {
3060
+ const bgLines = [];
3061
+ const fgLines = [];
3062
+ const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
3063
+ for (const key of colors) {
3064
+ if (key.startsWith('on-')) {
3065
+ createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
3066
+ } else {
3067
+ 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);
3068
+ createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
3069
+ createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
3070
+ }
3052
3071
  }
3072
+ lines.push(...bgLines, ...fgLines);
3053
3073
  }
3054
- lines.push(...bgLines, ...fgLines);
3055
3074
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
3056
3075
  });
3076
+ const themeClasses = vue.toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
3077
+ const themeNames = vue.toRef(() => Object.keys(computedThemes.value));
3078
+ if (SUPPORTS_MATCH_MEDIA) {
3079
+ const media = window.matchMedia('(prefers-color-scheme: dark)');
3080
+ function updateSystemName() {
3081
+ systemName.value = media.matches ? 'dark' : 'light';
3082
+ }
3083
+ updateSystemName();
3084
+ media.addEventListener('change', updateSystemName, {
3085
+ passive: true
3086
+ });
3087
+ if (vue.getCurrentScope()) {
3088
+ vue.onScopeDispose(() => {
3089
+ media.removeEventListener('change', updateSystemName);
3090
+ });
3091
+ }
3092
+ }
3057
3093
  function install(app) {
3058
3094
  if (parsedOptions.isDisabled) return;
3059
3095
  const head = app._context.provides.usehead;
@@ -3091,22 +3127,55 @@
3091
3127
  updateStyles();
3092
3128
  }
3093
3129
  function updateStyles() {
3094
- upsertStyles(getOrCreateStyleElement(parsedOptions.stylesheetId, parsedOptions.cspNonce), styles.value);
3130
+ upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
3095
3131
  }
3096
3132
  }
3097
3133
  }
3098
- const themeClasses = vue.toRef(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);
3134
+ function change(themeName) {
3135
+ if (!themeNames.value.includes(themeName)) {
3136
+ consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
3137
+ return;
3138
+ }
3139
+ name.value = themeName;
3140
+ }
3141
+ function cycle() {
3142
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
3143
+ const currentIndex = themeArray.indexOf(name.value);
3144
+ const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
3145
+ change(themeArray[nextIndex]);
3146
+ }
3147
+ function toggle() {
3148
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
3149
+ cycle(themeArray);
3150
+ }
3151
+ const globalName = new Proxy(name, {
3152
+ get(target, prop) {
3153
+ return target[prop];
3154
+ },
3155
+ set(target, prop, val) {
3156
+ if (prop === 'value') {
3157
+ deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
3158
+ }
3159
+ // @ts-expect-error
3160
+ target[prop] = val;
3161
+ return true;
3162
+ }
3163
+ });
3099
3164
  return {
3100
3165
  install,
3166
+ change,
3167
+ cycle,
3168
+ toggle,
3101
3169
  isDisabled: parsedOptions.isDisabled,
3102
3170
  name,
3103
3171
  themes,
3104
3172
  current,
3105
3173
  computedThemes,
3174
+ prefix: parsedOptions.prefix,
3106
3175
  themeClasses,
3107
3176
  styles,
3108
3177
  global: {
3109
- name,
3178
+ name: globalName,
3110
3179
  current
3111
3180
  }
3112
3181
  };
@@ -3117,7 +3186,7 @@
3117
3186
  if (!theme) throw new Error('Could not find Vuetify theme injection');
3118
3187
  const name = vue.toRef(() => props.theme ?? theme.name.value);
3119
3188
  const current = vue.toRef(() => theme.themes.value[name.value]);
3120
- const themeClasses = vue.toRef(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);
3189
+ const themeClasses = vue.toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
3121
3190
  const newTheme = {
3122
3191
  ...theme,
3123
3192
  name,
@@ -4664,9 +4733,15 @@
4664
4733
  };
4665
4734
  }
4666
4735
 
4736
+ // Types
4737
+
4667
4738
  const makeVBtnGroupProps = propsFactory({
4668
4739
  baseColor: String,
4669
4740
  divided: Boolean,
4741
+ direction: {
4742
+ type: String,
4743
+ default: 'horizontal'
4744
+ },
4670
4745
  ...makeBorderProps(),
4671
4746
  ...makeComponentProps(),
4672
4747
  ...makeDensityProps(),
@@ -4700,7 +4775,7 @@
4700
4775
  } = useRounded(props);
4701
4776
  provideDefaults({
4702
4777
  VBtn: {
4703
- height: 'auto',
4778
+ height: vue.toRef(() => props.direction === 'horizontal' ? 'auto' : null),
4704
4779
  baseColor: vue.toRef(() => props.baseColor),
4705
4780
  color: vue.toRef(() => props.color),
4706
4781
  density: vue.toRef(() => props.density),
@@ -4710,7 +4785,7 @@
4710
4785
  });
4711
4786
  useRender(() => {
4712
4787
  return vue.createVNode(props.tag, {
4713
- "class": vue.normalizeClass(['v-btn-group', {
4788
+ "class": vue.normalizeClass(['v-btn-group', `v-btn-group--${props.direction}`, {
4714
4789
  'v-btn-group--divided': props.divided
4715
4790
  }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
4716
4791
  "style": vue.normalizeStyle(props.style)
@@ -6189,6 +6264,31 @@
6189
6264
  // Utilities
6190
6265
  const VAlertTitle = createSimpleFunctional('v-alert-title');
6191
6266
 
6267
+ // Utilities
6268
+
6269
+ // Types
6270
+
6271
+ // Types
6272
+
6273
+ // Composables
6274
+ const makeIconSizeProps = propsFactory({
6275
+ iconSize: [Number, String],
6276
+ iconSizes: {
6277
+ type: Array,
6278
+ default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
6279
+ }
6280
+ }, 'iconSize');
6281
+ function useIconSizes(props, fallback) {
6282
+ const iconSize = vue.computed(() => {
6283
+ const iconSizeMap = new Map(props.iconSizes);
6284
+ const _iconSize = props.iconSize ?? fallback() ?? 'default';
6285
+ return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
6286
+ });
6287
+ return {
6288
+ iconSize
6289
+ };
6290
+ }
6291
+
6192
6292
  // Types
6193
6293
 
6194
6294
  const allowedTypes = ['success', 'info', 'warning', 'error'];
@@ -6228,6 +6328,7 @@
6228
6328
  ...makeDensityProps(),
6229
6329
  ...makeDimensionProps(),
6230
6330
  ...makeElevationProps(),
6331
+ ...makeIconSizeProps(),
6231
6332
  ...makeLocationProps(),
6232
6333
  ...makePositionProps(),
6233
6334
  ...makeRoundedProps(),
@@ -6255,6 +6356,9 @@
6255
6356
  if (!props.type) return props.icon;
6256
6357
  return props.icon ?? `$${props.type}`;
6257
6358
  });
6359
+ const {
6360
+ iconSize
6361
+ } = useIconSizes(props, () => props.prominent ? 44 : 28);
6258
6362
  const {
6259
6363
  themeClasses
6260
6364
  } = provideTheme(props);
@@ -6302,6 +6406,11 @@
6302
6406
  const hasPrepend = !!(slots.prepend || icon.value);
6303
6407
  const hasTitle = !!(slots.title || props.title);
6304
6408
  const hasClose = !!(slots.close || props.closable);
6409
+ const iconProps = {
6410
+ density: props.density,
6411
+ icon: icon.value,
6412
+ size: iconSize.value
6413
+ };
6305
6414
  return isActive.value && vue.createVNode(props.tag, {
6306
6415
  "class": vue.normalizeClass(['v-alert', props.border && {
6307
6416
  'v-alert--border': !!props.border,
@@ -6319,19 +6428,14 @@
6319
6428
  }, null), hasPrepend && vue.createElementVNode("div", {
6320
6429
  "key": "prepend",
6321
6430
  "class": "v-alert__prepend"
6322
- }, [!slots.prepend ? vue.createVNode(VIcon, {
6323
- "key": "prepend-icon",
6324
- "density": props.density,
6325
- "icon": icon.value,
6326
- "size": props.prominent ? 44 : 28
6327
- }, null) : vue.createVNode(VDefaultsProvider, {
6431
+ }, [!slots.prepend ? vue.createVNode(VIcon, vue.mergeProps({
6432
+ "key": "prepend-icon"
6433
+ }, iconProps), null) : vue.createVNode(VDefaultsProvider, {
6328
6434
  "key": "prepend-defaults",
6329
6435
  "disabled": !icon.value,
6330
6436
  "defaults": {
6331
6437
  VIcon: {
6332
- density: props.density,
6333
- icon: icon.value,
6334
- size: props.prominent ? 44 : 28
6438
+ ...iconProps
6335
6439
  }
6336
6440
  }
6337
6441
  }, slots.prepend)]), vue.createElementVNode("div", {
@@ -7856,6 +7960,7 @@
7856
7960
  const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group');
7857
7961
  const makeVSlideGroupProps = propsFactory({
7858
7962
  centerActive: Boolean,
7963
+ contentClass: null,
7859
7964
  direction: {
7860
7965
  type: String,
7861
7966
  default: 'horizontal'
@@ -8168,7 +8273,7 @@
8168
8273
  })]), vue.createElementVNode("div", {
8169
8274
  "key": "container",
8170
8275
  "ref": containerRef,
8171
- "class": "v-slide-group__container",
8276
+ "class": vue.normalizeClass(['v-slide-group__container', props.contentClass]),
8172
8277
  "onScroll": onScroll
8173
8278
  }, [vue.createElementVNode("div", {
8174
8279
  "ref": contentRef,
@@ -8530,6 +8635,68 @@
8530
8635
  }
8531
8636
  });
8532
8637
 
8638
+ const makeVDividerProps = propsFactory({
8639
+ color: String,
8640
+ inset: Boolean,
8641
+ length: [Number, String],
8642
+ opacity: [Number, String],
8643
+ thickness: [Number, String],
8644
+ vertical: Boolean,
8645
+ ...makeComponentProps(),
8646
+ ...makeThemeProps()
8647
+ }, 'VDivider');
8648
+ const VDivider = genericComponent()({
8649
+ name: 'VDivider',
8650
+ props: makeVDividerProps(),
8651
+ setup(props, _ref) {
8652
+ let {
8653
+ attrs,
8654
+ slots
8655
+ } = _ref;
8656
+ const {
8657
+ themeClasses
8658
+ } = provideTheme(props);
8659
+ const {
8660
+ textColorClasses,
8661
+ textColorStyles
8662
+ } = useTextColor(() => props.color);
8663
+ const dividerStyles = vue.computed(() => {
8664
+ const styles = {};
8665
+ if (props.length) {
8666
+ styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
8667
+ }
8668
+ if (props.thickness) {
8669
+ styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
8670
+ }
8671
+ return styles;
8672
+ });
8673
+ useRender(() => {
8674
+ const divider = vue.createElementVNode("hr", {
8675
+ "class": vue.normalizeClass([{
8676
+ 'v-divider': true,
8677
+ 'v-divider--inset': props.inset,
8678
+ 'v-divider--vertical': props.vertical
8679
+ }, themeClasses.value, textColorClasses.value, props.class]),
8680
+ "style": vue.normalizeStyle([dividerStyles.value, textColorStyles.value, {
8681
+ '--v-border-opacity': props.opacity
8682
+ }, props.style]),
8683
+ "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
8684
+ "role": `${attrs.role || 'separator'}`
8685
+ }, null);
8686
+ if (!slots.default) return divider;
8687
+ return vue.createElementVNode("div", {
8688
+ "class": vue.normalizeClass(['v-divider__wrapper', {
8689
+ 'v-divider__wrapper--vertical': props.vertical,
8690
+ 'v-divider__wrapper--inset': props.inset
8691
+ }])
8692
+ }, [divider, vue.createElementVNode("div", {
8693
+ "class": "v-divider__content"
8694
+ }, [slots.default()]), divider]);
8695
+ });
8696
+ return {};
8697
+ }
8698
+ });
8699
+
8533
8700
  // Utilities
8534
8701
 
8535
8702
  // List
@@ -9681,68 +9848,6 @@
9681
9848
  }
9682
9849
  });
9683
9850
 
9684
- const makeVDividerProps = propsFactory({
9685
- color: String,
9686
- inset: Boolean,
9687
- length: [Number, String],
9688
- opacity: [Number, String],
9689
- thickness: [Number, String],
9690
- vertical: Boolean,
9691
- ...makeComponentProps(),
9692
- ...makeThemeProps()
9693
- }, 'VDivider');
9694
- const VDivider = genericComponent()({
9695
- name: 'VDivider',
9696
- props: makeVDividerProps(),
9697
- setup(props, _ref) {
9698
- let {
9699
- attrs,
9700
- slots
9701
- } = _ref;
9702
- const {
9703
- themeClasses
9704
- } = provideTheme(props);
9705
- const {
9706
- textColorClasses,
9707
- textColorStyles
9708
- } = useTextColor(() => props.color);
9709
- const dividerStyles = vue.computed(() => {
9710
- const styles = {};
9711
- if (props.length) {
9712
- styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
9713
- }
9714
- if (props.thickness) {
9715
- styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
9716
- }
9717
- return styles;
9718
- });
9719
- useRender(() => {
9720
- const divider = vue.createElementVNode("hr", {
9721
- "class": vue.normalizeClass([{
9722
- 'v-divider': true,
9723
- 'v-divider--inset': props.inset,
9724
- 'v-divider--vertical': props.vertical
9725
- }, themeClasses.value, textColorClasses.value, props.class]),
9726
- "style": vue.normalizeStyle([dividerStyles.value, textColorStyles.value, {
9727
- '--v-border-opacity': props.opacity
9728
- }, props.style]),
9729
- "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
9730
- "role": `${attrs.role || 'separator'}`
9731
- }, null);
9732
- if (!slots.default) return divider;
9733
- return vue.createElementVNode("div", {
9734
- "class": vue.normalizeClass(['v-divider__wrapper', {
9735
- 'v-divider__wrapper--vertical': props.vertical,
9736
- 'v-divider__wrapper--inset': props.inset
9737
- }])
9738
- }, [divider, vue.createElementVNode("div", {
9739
- "class": "v-divider__content"
9740
- }, [slots.default()]), divider]);
9741
- });
9742
- return {};
9743
- }
9744
- });
9745
-
9746
9851
  // Types
9747
9852
 
9748
9853
  const makeVListChildrenProps = propsFactory({
@@ -12670,7 +12775,12 @@
12670
12775
  }
12671
12776
  function calculateOffset(index) {
12672
12777
  index = clamp(index, 0, items.value.length - 1);
12673
- return offsets[index] || 0;
12778
+ const whole = Math.floor(index);
12779
+ const fraction = index % 1;
12780
+ const next = whole + 1;
12781
+ const wholeOffset = offsets[whole] || 0;
12782
+ const nextOffset = offsets[next] || wholeOffset;
12783
+ return wholeOffset + (nextOffset - wholeOffset) * fraction;
12674
12784
  }
12675
12785
  function calculateIndex(scrollTop) {
12676
12786
  return binaryClosest(offsets, scrollTop);
@@ -13024,6 +13134,7 @@
13024
13134
  },
13025
13135
  openOnClear: Boolean,
13026
13136
  itemColor: String,
13137
+ noAutoScroll: Boolean,
13027
13138
  ...makeItemsProps({
13028
13139
  itemChildren: false
13029
13140
  })
@@ -13238,7 +13349,7 @@
13238
13349
  vue.watch(menu, () => {
13239
13350
  if (!props.hideSelected && menu.value && model.value.length) {
13240
13351
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
13241
- IN_BROWSER && window.requestAnimationFrame(() => {
13352
+ IN_BROWSER && !props.noAutoScroll && window.requestAnimationFrame(() => {
13242
13353
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
13243
13354
  });
13244
13355
  }
@@ -13330,6 +13441,22 @@
13330
13441
  key: item.value,
13331
13442
  onClick: () => select(item, null)
13332
13443
  });
13444
+ if (item.raw.type === 'divider') {
13445
+ return slots.divider?.({
13446
+ props: item.raw,
13447
+ index
13448
+ }) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
13449
+ "key": `divider-${index}`
13450
+ }), null);
13451
+ }
13452
+ if (item.raw.type === 'subheader') {
13453
+ return slots.subheader?.({
13454
+ props: item.raw,
13455
+ index
13456
+ }) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
13457
+ "key": `subheader-${index}`
13458
+ }), null);
13459
+ }
13333
13460
  return slots.item?.({
13334
13461
  item,
13335
13462
  index,
@@ -13490,6 +13617,9 @@
13490
13617
  let match = -1;
13491
13618
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13492
13619
  if (typeof item === 'object') {
13620
+ if (['divider', 'subheader'].includes(item.raw?.type)) {
13621
+ continue;
13622
+ }
13493
13623
  const filterKeys = keys || Object.keys(transformed);
13494
13624
  for (const key of filterKeys) {
13495
13625
  const value = getPropertyFromItem(transformed, key);
@@ -13928,6 +14058,22 @@
13928
14058
  active: highlightFirst.value && index === 0 ? true : undefined,
13929
14059
  onClick: () => select(item, null)
13930
14060
  });
14061
+ if (item.raw.type === 'divider') {
14062
+ return slots.divider?.({
14063
+ props: item.raw,
14064
+ index
14065
+ }) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
14066
+ "key": `divider-${index}`
14067
+ }), null);
14068
+ }
14069
+ if (item.raw.type === 'subheader') {
14070
+ return slots.subheader?.({
14071
+ props: item.raw,
14072
+ index
14073
+ }) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
14074
+ "key": `subheader-${index}`
14075
+ }), null);
14076
+ }
13931
14077
  return slots.item?.({
13932
14078
  item,
13933
14079
  index,
@@ -17523,13 +17669,13 @@
17523
17669
  return null;
17524
17670
  }
17525
17671
  const sundayJanuarySecond2000 = new Date(2000, 0, 2);
17526
- function getWeekdays(locale, firstDayOfWeek) {
17672
+ function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
17527
17673
  const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
17528
17674
  return createRange(7).map(i => {
17529
17675
  const weekday = new Date(sundayJanuarySecond2000);
17530
17676
  weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
17531
17677
  return new Intl.DateTimeFormat(locale, {
17532
- weekday: 'narrow'
17678
+ weekday: weekdayFormat ?? 'narrow'
17533
17679
  }).format(weekday);
17534
17680
  });
17535
17681
  }
@@ -17993,9 +18139,9 @@
17993
18139
  getDiff(date, comparing, unit) {
17994
18140
  return getDiff(date, comparing, unit);
17995
18141
  }
17996
- getWeekdays(firstDayOfWeek) {
18142
+ getWeekdays(firstDayOfWeek, weekdayFormat) {
17997
18143
  const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
17998
- return getWeekdays(this.locale, firstDay);
18144
+ return getWeekdays(this.locale, firstDay, weekdayFormat);
17999
18145
  }
18000
18146
  getYear(date) {
18001
18147
  return getYear(date);
@@ -18338,6 +18484,7 @@
18338
18484
  _search.value = val ?? '';
18339
18485
  if (!props.multiple && !hasSelectionSlot.value) {
18340
18486
  model.value = [transformItem$3(props, val)];
18487
+ vue.nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18341
18488
  }
18342
18489
  if (val && props.multiple && props.delimiters?.length) {
18343
18490
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18654,6 +18801,22 @@
18654
18801
  active: highlightFirst.value && index === 0 ? true : undefined,
18655
18802
  onClick: () => select(item, null)
18656
18803
  });
18804
+ if (item.raw.type === 'divider') {
18805
+ return slots.divider?.({
18806
+ props: item.raw,
18807
+ index
18808
+ }) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
18809
+ "key": `divider-${index}`
18810
+ }), null);
18811
+ }
18812
+ if (item.raw.type === 'subheader') {
18813
+ return slots.subheader?.({
18814
+ props: item.raw,
18815
+ index
18816
+ }) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
18817
+ "key": `subheader-${index}`
18818
+ }), null);
18819
+ }
18657
18820
  return slots.item?.({
18658
18821
  item,
18659
18822
  index,
@@ -20533,6 +20696,7 @@
20533
20696
  color: String,
20534
20697
  disableSort: Boolean,
20535
20698
  fixedHeader: Boolean,
20699
+ lastFixed: Boolean,
20536
20700
  multiSort: Boolean,
20537
20701
  sortAscIcon: {
20538
20702
  type: IconValue,
@@ -20579,10 +20743,11 @@
20579
20743
  loaderClasses
20580
20744
  } = useLoader(props);
20581
20745
  function getFixedStyles(column, y) {
20582
- if (!(props.sticky || props.fixedHeader) && !column.fixed) return undefined;
20746
+ if (!(props.sticky || props.fixedHeader) && !(column.fixed || column.lastFixed)) return undefined;
20583
20747
  return {
20584
20748
  position: 'sticky',
20585
- left: column.fixed ? convertToUnit(column.fixedOffset) : undefined,
20749
+ left: column.fixed || column.lastFixed ? convertToUnit(column.fixedOffset) : undefined,
20750
+ right: column.lastFixed ? convertToUnit(column.fixedOffset ?? 0) : undefined,
20586
20751
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
20587
20752
  };
20588
20753
  }
@@ -22297,7 +22462,8 @@
22297
22462
  firstDayOfWeek: {
22298
22463
  type: [Number, String],
22299
22464
  default: undefined
22300
- }
22465
+ },
22466
+ weekdayFormat: String
22301
22467
  }, 'calendar');
22302
22468
  function useCalendar(props) {
22303
22469
  const adapter = useDate();
@@ -22545,7 +22711,7 @@
22545
22711
  "ref": daysRef,
22546
22712
  "key": daysInMonth.value[0].date?.toString(),
22547
22713
  "class": "v-date-picker-month__days"
22548
- }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => vue.createElementVNode("div", {
22714
+ }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => vue.createElementVNode("div", {
22549
22715
  "class": ['v-date-picker-month__day', 'v-date-picker-month__weekday']
22550
22716
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22551
22717
  const slotProps = {
@@ -25076,6 +25242,10 @@
25076
25242
  type: Number,
25077
25243
  default: 0
25078
25244
  },
25245
+ minFractionDigits: {
25246
+ type: Number,
25247
+ default: null
25248
+ },
25079
25249
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
25080
25250
  }, 'VNumberInput');
25081
25251
  const VNumberInput = genericComponent()({
@@ -25106,9 +25276,19 @@
25106
25276
  } = useFocus(props);
25107
25277
  function correctPrecision(val) {
25108
25278
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
25109
- const fixed = precision == null ? String(val) : val.toFixed(precision);
25110
- return isFocused.value ? Number(fixed).toString() // trim zeros
25111
- : fixed;
25279
+ if (precision == null) {
25280
+ return String(val);
25281
+ }
25282
+ let fixed = val.toFixed(precision);
25283
+ if (isFocused.value) {
25284
+ return Number(fixed).toString(); // trim zeros
25285
+ }
25286
+ if ((props.minFractionDigits ?? precision) < precision) {
25287
+ const trimLimit = precision - props.minFractionDigits;
25288
+ const [baseDigits, fractionDigits] = fixed.split('.');
25289
+ fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
25290
+ }
25291
+ return fixed;
25112
25292
  }
25113
25293
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
25114
25294
  const _inputText = vue.shallowRef(null);
@@ -25167,6 +25347,7 @@
25167
25347
  }
25168
25348
  };
25169
25349
  vue.watch(() => props.precision, () => formatInputValue());
25350
+ vue.watch(() => props.minFractionDigits, () => formatInputValue());
25170
25351
  vue.onMounted(() => {
25171
25352
  clampModel();
25172
25353
  });
@@ -25276,7 +25457,7 @@
25276
25457
  inputText.value = null;
25277
25458
  return;
25278
25459
  }
25279
- inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25460
+ inputText.value = correctPrecision(model.value);
25280
25461
  }
25281
25462
  function trimDecimalZeros() {
25282
25463
  if (controlsDisabled.value) return;
@@ -25536,9 +25717,10 @@
25536
25717
  e.preventDefault();
25537
25718
  e.stopPropagation();
25538
25719
  const clipboardText = e?.clipboardData?.getData('Text').slice(0, length.value) ?? '';
25720
+ const finalIndex = clipboardText.length - 1 === -1 ? index : clipboardText.length - 1;
25539
25721
  if (isValidNumber(clipboardText)) return;
25540
25722
  model.value = clipboardText.split('');
25541
- inputRef.value?.[index].blur();
25723
+ inputRef.value?.[finalIndex].focus();
25542
25724
  }
25543
25725
  function reset() {
25544
25726
  model.value = [];
@@ -29320,7 +29502,7 @@
29320
29502
  };
29321
29503
  });
29322
29504
  }
29323
- const version$1 = "3.8.6-master.2025-05-26";
29505
+ const version$1 = "3.8.7-dev.2025-05-27";
29324
29506
  createVuetify$1.version = version$1;
29325
29507
 
29326
29508
  // Vue's inject() can only be used in setup
@@ -29345,7 +29527,7 @@
29345
29527
  ...options
29346
29528
  });
29347
29529
  };
29348
- const version = "3.8.6-master.2025-05-26";
29530
+ const version = "3.8.7-dev.2025-05-27";
29349
29531
  createVuetify.version = version;
29350
29532
 
29351
29533
  exports.blueprints = index;