@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
package/dist/vuetify.cjs CHANGED
@@ -1,5 +1,5 @@
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
  */
@@ -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"); }
@@ -2786,6 +2787,7 @@
2786
2787
  function genDefaults$1() {
2787
2788
  return {
2788
2789
  defaultTheme: 'light',
2790
+ prefix: 'v-',
2789
2791
  variations: {
2790
2792
  colors: [],
2791
2793
  lighten: 0,
@@ -2867,7 +2869,10 @@
2867
2869
  }
2868
2870
  }
2869
2871
  },
2870
- stylesheetId: 'vuetify-theme-stylesheet'
2872
+ stylesheetId: 'vuetify-theme-stylesheet',
2873
+ scoped: false,
2874
+ unimportant: false,
2875
+ utilities: true
2871
2876
  };
2872
2877
  }
2873
2878
  function parseThemeOptions() {
@@ -2890,21 +2895,21 @@
2890
2895
  function createCssClass(lines, selector, content, scope) {
2891
2896
  lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
2892
2897
  }
2893
- function genCssVariables(theme) {
2898
+ function genCssVariables(theme, prefix) {
2894
2899
  const lightOverlay = theme.dark ? 2 : 1;
2895
2900
  const darkOverlay = theme.dark ? 1 : 2;
2896
2901
  const variables = [];
2897
2902
  for (const [key, value] of Object.entries(theme.colors)) {
2898
2903
  const rgb = parseColor(value);
2899
- variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2904
+ variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2900
2905
  if (!key.startsWith('on-')) {
2901
- variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2906
+ variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2902
2907
  }
2903
2908
  }
2904
2909
  for (const [key, value] of Object.entries(theme.variables)) {
2905
2910
  const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
2906
2911
  const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
2907
- variables.push(`--v-${key}: ${rgb ?? value}`);
2912
+ variables.push(`--${prefix}${key}: ${rgb ?? value}`);
2908
2913
  }
2909
2914
  return variables;
2910
2915
  }
@@ -2948,7 +2953,8 @@
2948
2953
  const scopeSelector = `:where(${scope})`;
2949
2954
  return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
2950
2955
  }
2951
- function upsertStyles(styleEl, styles) {
2956
+ function upsertStyles(id, cspNonce, styles) {
2957
+ const styleEl = getOrCreateStyleElement(id, cspNonce);
2952
2958
  if (!styleEl) return;
2953
2959
  styleEl.innerHTML = styles;
2954
2960
  }
@@ -2968,8 +2974,17 @@
2968
2974
  // Composables
2969
2975
  function createTheme(options) {
2970
2976
  const parsedOptions = parseThemeOptions(options);
2971
- const name = vue.shallowRef(parsedOptions.defaultTheme);
2977
+ const _name = vue.shallowRef(parsedOptions.defaultTheme);
2972
2978
  const themes = vue.ref(parsedOptions.themes);
2979
+ const systemName = vue.shallowRef('light');
2980
+ const name = vue.computed({
2981
+ get() {
2982
+ return _name.value === 'system' ? systemName.value : _name.value;
2983
+ },
2984
+ set(val) {
2985
+ _name.value = val;
2986
+ }
2987
+ });
2973
2988
  const computedThemes = vue.computed(() => {
2974
2989
  const acc = {};
2975
2990
  for (const [name, original] of Object.entries(themes.value)) {
@@ -2990,28 +3005,49 @@
2990
3005
  const current = vue.toRef(() => computedThemes.value[name.value]);
2991
3006
  const styles = vue.computed(() => {
2992
3007
  const lines = [];
3008
+ const important = parsedOptions.unimportant ? '' : ' !important';
3009
+ const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
2993
3010
  if (current.value?.dark) {
2994
3011
  createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
2995
3012
  }
2996
- createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
3013
+ createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
2997
3014
  for (const [themeName, theme] of Object.entries(computedThemes.value)) {
2998
- createCssClass(lines, `.v-theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme)], parsedOptions.scope);
2999
- }
3000
- const bgLines = [];
3001
- const fgLines = [];
3002
- const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
3003
- for (const key of colors) {
3004
- if (key.startsWith('on-')) {
3005
- createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
3006
- } else {
3007
- 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);
3008
- createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
3009
- createCssClass(fgLines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`], parsedOptions.scope);
3015
+ createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
3016
+ }
3017
+ if (parsedOptions.utilities) {
3018
+ const bgLines = [];
3019
+ const fgLines = [];
3020
+ const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
3021
+ for (const key of colors) {
3022
+ if (key.startsWith('on-')) {
3023
+ createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
3024
+ } else {
3025
+ 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);
3026
+ createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
3027
+ createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
3028
+ }
3010
3029
  }
3030
+ lines.push(...bgLines, ...fgLines);
3011
3031
  }
3012
- lines.push(...bgLines, ...fgLines);
3013
3032
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
3014
3033
  });
3034
+ const themeClasses = vue.toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
3035
+ const themeNames = vue.toRef(() => Object.keys(computedThemes.value));
3036
+ if (SUPPORTS_MATCH_MEDIA) {
3037
+ const media = window.matchMedia('(prefers-color-scheme: dark)');
3038
+ function updateSystemName() {
3039
+ systemName.value = media.matches ? 'dark' : 'light';
3040
+ }
3041
+ updateSystemName();
3042
+ media.addEventListener('change', updateSystemName, {
3043
+ passive: true
3044
+ });
3045
+ if (vue.getCurrentScope()) {
3046
+ vue.onScopeDispose(() => {
3047
+ media.removeEventListener('change', updateSystemName);
3048
+ });
3049
+ }
3050
+ }
3015
3051
  function install(app) {
3016
3052
  if (parsedOptions.isDisabled) return;
3017
3053
  const head = app._context.provides.usehead;
@@ -3049,22 +3085,55 @@
3049
3085
  updateStyles();
3050
3086
  }
3051
3087
  function updateStyles() {
3052
- upsertStyles(getOrCreateStyleElement(parsedOptions.stylesheetId, parsedOptions.cspNonce), styles.value);
3088
+ upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
3053
3089
  }
3054
3090
  }
3055
3091
  }
3056
- const themeClasses = vue.toRef(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);
3092
+ function change(themeName) {
3093
+ if (!themeNames.value.includes(themeName)) {
3094
+ consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
3095
+ return;
3096
+ }
3097
+ name.value = themeName;
3098
+ }
3099
+ function cycle() {
3100
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
3101
+ const currentIndex = themeArray.indexOf(name.value);
3102
+ const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
3103
+ change(themeArray[nextIndex]);
3104
+ }
3105
+ function toggle() {
3106
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
3107
+ cycle(themeArray);
3108
+ }
3109
+ const globalName = new Proxy(name, {
3110
+ get(target, prop) {
3111
+ return target[prop];
3112
+ },
3113
+ set(target, prop, val) {
3114
+ if (prop === 'value') {
3115
+ deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
3116
+ }
3117
+ // @ts-expect-error
3118
+ target[prop] = val;
3119
+ return true;
3120
+ }
3121
+ });
3057
3122
  return {
3058
3123
  install,
3124
+ change,
3125
+ cycle,
3126
+ toggle,
3059
3127
  isDisabled: parsedOptions.isDisabled,
3060
3128
  name,
3061
3129
  themes,
3062
3130
  current,
3063
3131
  computedThemes,
3132
+ prefix: parsedOptions.prefix,
3064
3133
  themeClasses,
3065
3134
  styles,
3066
3135
  global: {
3067
- name,
3136
+ name: globalName,
3068
3137
  current
3069
3138
  }
3070
3139
  };
@@ -3075,7 +3144,7 @@
3075
3144
  if (!theme) throw new Error('Could not find Vuetify theme injection');
3076
3145
  const name = vue.toRef(() => props.theme ?? theme.name.value);
3077
3146
  const current = vue.toRef(() => theme.themes.value[name.value]);
3078
- const themeClasses = vue.toRef(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);
3147
+ const themeClasses = vue.toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
3079
3148
  const newTheme = {
3080
3149
  ...theme,
3081
3150
  name,
@@ -4622,9 +4691,15 @@
4622
4691
  };
4623
4692
  }
4624
4693
 
4694
+ // Types
4695
+
4625
4696
  const makeVBtnGroupProps = propsFactory({
4626
4697
  baseColor: String,
4627
4698
  divided: Boolean,
4699
+ direction: {
4700
+ type: String,
4701
+ default: 'horizontal'
4702
+ },
4628
4703
  ...makeBorderProps(),
4629
4704
  ...makeComponentProps(),
4630
4705
  ...makeDensityProps(),
@@ -4658,7 +4733,7 @@
4658
4733
  } = useRounded(props);
4659
4734
  provideDefaults({
4660
4735
  VBtn: {
4661
- height: 'auto',
4736
+ height: vue.toRef(() => props.direction === 'horizontal' ? 'auto' : null),
4662
4737
  baseColor: vue.toRef(() => props.baseColor),
4663
4738
  color: vue.toRef(() => props.color),
4664
4739
  density: vue.toRef(() => props.density),
@@ -4668,7 +4743,7 @@
4668
4743
  });
4669
4744
  useRender(() => {
4670
4745
  return vue.createVNode(props.tag, {
4671
- "class": ['v-btn-group', {
4746
+ "class": ['v-btn-group', `v-btn-group--${props.direction}`, {
4672
4747
  'v-btn-group--divided': props.divided
4673
4748
  }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class],
4674
4749
  "style": props.style
@@ -6147,6 +6222,31 @@
6147
6222
  // Utilities
6148
6223
  const VAlertTitle = createSimpleFunctional('v-alert-title');
6149
6224
 
6225
+ // Utilities
6226
+
6227
+ // Types
6228
+
6229
+ // Types
6230
+
6231
+ // Composables
6232
+ const makeIconSizeProps = propsFactory({
6233
+ iconSize: [Number, String],
6234
+ iconSizes: {
6235
+ type: Array,
6236
+ default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
6237
+ }
6238
+ }, 'iconSize');
6239
+ function useIconSizes(props, fallback) {
6240
+ const iconSize = vue.computed(() => {
6241
+ const iconSizeMap = new Map(props.iconSizes);
6242
+ const _iconSize = props.iconSize ?? fallback() ?? 'default';
6243
+ return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
6244
+ });
6245
+ return {
6246
+ iconSize
6247
+ };
6248
+ }
6249
+
6150
6250
  // Types
6151
6251
 
6152
6252
  const allowedTypes = ['success', 'info', 'warning', 'error'];
@@ -6186,6 +6286,7 @@
6186
6286
  ...makeDensityProps(),
6187
6287
  ...makeDimensionProps(),
6188
6288
  ...makeElevationProps(),
6289
+ ...makeIconSizeProps(),
6189
6290
  ...makeLocationProps(),
6190
6291
  ...makePositionProps(),
6191
6292
  ...makeRoundedProps(),
@@ -6213,6 +6314,9 @@
6213
6314
  if (!props.type) return props.icon;
6214
6315
  return props.icon ?? `$${props.type}`;
6215
6316
  });
6317
+ const {
6318
+ iconSize
6319
+ } = useIconSizes(props, () => props.prominent ? 44 : 28);
6216
6320
  const {
6217
6321
  themeClasses
6218
6322
  } = provideTheme(props);
@@ -6260,6 +6364,11 @@
6260
6364
  const hasPrepend = !!(slots.prepend || icon.value);
6261
6365
  const hasTitle = !!(slots.title || props.title);
6262
6366
  const hasClose = !!(slots.close || props.closable);
6367
+ const iconProps = {
6368
+ density: props.density,
6369
+ icon: icon.value,
6370
+ size: iconSize.value
6371
+ };
6263
6372
  return isActive.value && vue.createVNode(props.tag, {
6264
6373
  "class": ['v-alert', props.border && {
6265
6374
  'v-alert--border': !!props.border,
@@ -6277,19 +6386,14 @@
6277
6386
  }, null), hasPrepend && vue.createVNode("div", {
6278
6387
  "key": "prepend",
6279
6388
  "class": "v-alert__prepend"
6280
- }, [!slots.prepend ? vue.createVNode(VIcon, {
6281
- "key": "prepend-icon",
6282
- "density": props.density,
6283
- "icon": icon.value,
6284
- "size": props.prominent ? 44 : 28
6285
- }, null) : vue.createVNode(VDefaultsProvider, {
6389
+ }, [!slots.prepend ? vue.createVNode(VIcon, vue.mergeProps({
6390
+ "key": "prepend-icon"
6391
+ }, iconProps), null) : vue.createVNode(VDefaultsProvider, {
6286
6392
  "key": "prepend-defaults",
6287
6393
  "disabled": !icon.value,
6288
6394
  "defaults": {
6289
6395
  VIcon: {
6290
- density: props.density,
6291
- icon: icon.value,
6292
- size: props.prominent ? 44 : 28
6396
+ ...iconProps
6293
6397
  }
6294
6398
  }
6295
6399
  }, slots.prepend)]), vue.createVNode("div", {
@@ -8487,6 +8591,68 @@
8487
8591
  }
8488
8592
  });
8489
8593
 
8594
+ const makeVDividerProps = propsFactory({
8595
+ color: String,
8596
+ inset: Boolean,
8597
+ length: [Number, String],
8598
+ opacity: [Number, String],
8599
+ thickness: [Number, String],
8600
+ vertical: Boolean,
8601
+ ...makeComponentProps(),
8602
+ ...makeThemeProps()
8603
+ }, 'VDivider');
8604
+ const VDivider = genericComponent()({
8605
+ name: 'VDivider',
8606
+ props: makeVDividerProps(),
8607
+ setup(props, _ref) {
8608
+ let {
8609
+ attrs,
8610
+ slots
8611
+ } = _ref;
8612
+ const {
8613
+ themeClasses
8614
+ } = provideTheme(props);
8615
+ const {
8616
+ textColorClasses,
8617
+ textColorStyles
8618
+ } = useTextColor(() => props.color);
8619
+ const dividerStyles = vue.computed(() => {
8620
+ const styles = {};
8621
+ if (props.length) {
8622
+ styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
8623
+ }
8624
+ if (props.thickness) {
8625
+ styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
8626
+ }
8627
+ return styles;
8628
+ });
8629
+ useRender(() => {
8630
+ const divider = vue.createVNode("hr", {
8631
+ "class": [{
8632
+ 'v-divider': true,
8633
+ 'v-divider--inset': props.inset,
8634
+ 'v-divider--vertical': props.vertical
8635
+ }, themeClasses.value, textColorClasses.value, props.class],
8636
+ "style": [dividerStyles.value, textColorStyles.value, {
8637
+ '--v-border-opacity': props.opacity
8638
+ }, props.style],
8639
+ "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
8640
+ "role": `${attrs.role || 'separator'}`
8641
+ }, null);
8642
+ if (!slots.default) return divider;
8643
+ return vue.createVNode("div", {
8644
+ "class": ['v-divider__wrapper', {
8645
+ 'v-divider__wrapper--vertical': props.vertical,
8646
+ 'v-divider__wrapper--inset': props.inset
8647
+ }]
8648
+ }, [divider, vue.createVNode("div", {
8649
+ "class": "v-divider__content"
8650
+ }, [slots.default()]), divider]);
8651
+ });
8652
+ return {};
8653
+ }
8654
+ });
8655
+
8490
8656
  // Utilities
8491
8657
 
8492
8658
  // List
@@ -9638,68 +9804,6 @@
9638
9804
  }
9639
9805
  });
9640
9806
 
9641
- const makeVDividerProps = propsFactory({
9642
- color: String,
9643
- inset: Boolean,
9644
- length: [Number, String],
9645
- opacity: [Number, String],
9646
- thickness: [Number, String],
9647
- vertical: Boolean,
9648
- ...makeComponentProps(),
9649
- ...makeThemeProps()
9650
- }, 'VDivider');
9651
- const VDivider = genericComponent()({
9652
- name: 'VDivider',
9653
- props: makeVDividerProps(),
9654
- setup(props, _ref) {
9655
- let {
9656
- attrs,
9657
- slots
9658
- } = _ref;
9659
- const {
9660
- themeClasses
9661
- } = provideTheme(props);
9662
- const {
9663
- textColorClasses,
9664
- textColorStyles
9665
- } = useTextColor(() => props.color);
9666
- const dividerStyles = vue.computed(() => {
9667
- const styles = {};
9668
- if (props.length) {
9669
- styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
9670
- }
9671
- if (props.thickness) {
9672
- styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
9673
- }
9674
- return styles;
9675
- });
9676
- useRender(() => {
9677
- const divider = vue.createVNode("hr", {
9678
- "class": [{
9679
- 'v-divider': true,
9680
- 'v-divider--inset': props.inset,
9681
- 'v-divider--vertical': props.vertical
9682
- }, themeClasses.value, textColorClasses.value, props.class],
9683
- "style": [dividerStyles.value, textColorStyles.value, {
9684
- '--v-border-opacity': props.opacity
9685
- }, props.style],
9686
- "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
9687
- "role": `${attrs.role || 'separator'}`
9688
- }, null);
9689
- if (!slots.default) return divider;
9690
- return vue.createVNode("div", {
9691
- "class": ['v-divider__wrapper', {
9692
- 'v-divider__wrapper--vertical': props.vertical,
9693
- 'v-divider__wrapper--inset': props.inset
9694
- }]
9695
- }, [divider, vue.createVNode("div", {
9696
- "class": "v-divider__content"
9697
- }, [slots.default()]), divider]);
9698
- });
9699
- return {};
9700
- }
9701
- });
9702
-
9703
9807
  // Types
9704
9808
 
9705
9809
  const makeVListChildrenProps = propsFactory({
@@ -12617,7 +12721,12 @@
12617
12721
  }
12618
12722
  function calculateOffset(index) {
12619
12723
  index = clamp(index, 0, items.value.length - 1);
12620
- return offsets[index] || 0;
12724
+ const whole = Math.floor(index);
12725
+ const fraction = index % 1;
12726
+ const next = whole + 1;
12727
+ const wholeOffset = offsets[whole] || 0;
12728
+ const nextOffset = offsets[next] || wholeOffset;
12729
+ return wholeOffset + (nextOffset - wholeOffset) * fraction;
12621
12730
  }
12622
12731
  function calculateIndex(scrollTop) {
12623
12732
  return binaryClosest(offsets, scrollTop);
@@ -13248,6 +13357,22 @@
13248
13357
  key: item.value,
13249
13358
  onClick: () => select(item, null)
13250
13359
  });
13360
+ if (item.raw.type === 'divider') {
13361
+ return slots.divider?.({
13362
+ props: item.raw,
13363
+ index
13364
+ }) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
13365
+ "key": `divider-${index}`
13366
+ }), null);
13367
+ }
13368
+ if (item.raw.type === 'subheader') {
13369
+ return slots.subheader?.({
13370
+ props: item.raw,
13371
+ index
13372
+ }) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
13373
+ "key": `subheader-${index}`
13374
+ }), null);
13375
+ }
13251
13376
  return slots.item?.({
13252
13377
  item,
13253
13378
  index,
@@ -13408,6 +13533,9 @@
13408
13533
  let match = -1;
13409
13534
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13410
13535
  if (typeof item === 'object') {
13536
+ if (['divider', 'subheader'].includes(item.raw?.type)) {
13537
+ continue;
13538
+ }
13411
13539
  const filterKeys = keys || Object.keys(transformed);
13412
13540
  for (const key of filterKeys) {
13413
13541
  const value = getPropertyFromItem(transformed, key);
@@ -13846,6 +13974,22 @@
13846
13974
  active: highlightFirst.value && index === 0 ? true : undefined,
13847
13975
  onClick: () => select(item, null)
13848
13976
  });
13977
+ if (item.raw.type === 'divider') {
13978
+ return slots.divider?.({
13979
+ props: item.raw,
13980
+ index
13981
+ }) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
13982
+ "key": `divider-${index}`
13983
+ }), null);
13984
+ }
13985
+ if (item.raw.type === 'subheader') {
13986
+ return slots.subheader?.({
13987
+ props: item.raw,
13988
+ index
13989
+ }) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
13990
+ "key": `subheader-${index}`
13991
+ }), null);
13992
+ }
13849
13993
  return slots.item?.({
13850
13994
  item,
13851
13995
  index,
@@ -18256,6 +18400,7 @@
18256
18400
  _search.value = val ?? '';
18257
18401
  if (!props.multiple && !hasSelectionSlot.value) {
18258
18402
  model.value = [transformItem$3(props, val)];
18403
+ vue.nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18259
18404
  }
18260
18405
  if (val && props.multiple && props.delimiters?.length) {
18261
18406
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18572,6 +18717,22 @@
18572
18717
  active: highlightFirst.value && index === 0 ? true : undefined,
18573
18718
  onClick: () => select(item, null)
18574
18719
  });
18720
+ if (item.raw.type === 'divider') {
18721
+ return slots.divider?.({
18722
+ props: item.raw,
18723
+ index
18724
+ }) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
18725
+ "key": `divider-${index}`
18726
+ }), null);
18727
+ }
18728
+ if (item.raw.type === 'subheader') {
18729
+ return slots.subheader?.({
18730
+ props: item.raw,
18731
+ index
18732
+ }) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
18733
+ "key": `subheader-${index}`
18734
+ }), null);
18735
+ }
18575
18736
  return slots.item?.({
18576
18737
  item,
18577
18738
  index,
@@ -24995,6 +25156,10 @@
24995
25156
  type: Number,
24996
25157
  default: 0
24997
25158
  },
25159
+ minFractionDigits: {
25160
+ type: Number,
25161
+ default: null
25162
+ },
24998
25163
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
24999
25164
  }, 'VNumberInput');
25000
25165
  const VNumberInput = genericComponent()({
@@ -25025,9 +25190,19 @@
25025
25190
  } = useFocus(props);
25026
25191
  function correctPrecision(val) {
25027
25192
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
25028
- const fixed = precision == null ? String(val) : val.toFixed(precision);
25029
- return isFocused.value ? Number(fixed).toString() // trim zeros
25030
- : fixed;
25193
+ if (precision == null) {
25194
+ return String(val);
25195
+ }
25196
+ let fixed = val.toFixed(precision);
25197
+ if (isFocused.value) {
25198
+ return Number(fixed).toString(); // trim zeros
25199
+ }
25200
+ if ((props.minFractionDigits ?? precision) < precision) {
25201
+ const trimLimit = precision - props.minFractionDigits;
25202
+ const [baseDigits, fractionDigits] = fixed.split('.');
25203
+ fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
25204
+ }
25205
+ return fixed;
25031
25206
  }
25032
25207
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
25033
25208
  const _inputText = vue.shallowRef(null);
@@ -25080,6 +25255,7 @@
25080
25255
  }
25081
25256
  };
25082
25257
  vue.watch(() => props.precision, () => formatInputValue());
25258
+ vue.watch(() => props.minFractionDigits, () => formatInputValue());
25083
25259
  vue.onMounted(() => {
25084
25260
  clampModel();
25085
25261
  });
@@ -25181,7 +25357,7 @@
25181
25357
  inputText.value = null;
25182
25358
  return;
25183
25359
  }
25184
- inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25360
+ inputText.value = correctPrecision(model.value);
25185
25361
  }
25186
25362
  function trimDecimalZeros() {
25187
25363
  if (controlsDisabled.value) return;
@@ -29223,7 +29399,7 @@
29223
29399
  };
29224
29400
  });
29225
29401
  }
29226
- const version$1 = "3.8.5-master.2025-05-20";
29402
+ const version$1 = "3.8.6-dev.2025-05-21";
29227
29403
  createVuetify$1.version = version$1;
29228
29404
 
29229
29405
  // Vue's inject() can only be used in setup
@@ -29248,7 +29424,7 @@
29248
29424
  ...options
29249
29425
  });
29250
29426
  };
29251
- const version = "3.8.5-master.2025-05-20";
29427
+ const version = "3.8.6-dev.2025-05-21";
29252
29428
  createVuetify.version = version;
29253
29429
 
29254
29430
  exports.blueprints = index;