@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
package/dist/vuetify.js CHANGED
@@ -1,5 +1,5 @@
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
  */
@@ -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);
@@ -13021,7 +13130,6 @@
13021
13130
  const selectedValues = vue.computed(() => model.value.map(selection => selection.value));
13022
13131
  const isFocused = vue.shallowRef(false);
13023
13132
  let keyboardLookupPrefix = '';
13024
- let keyboardLookupIndex = -1;
13025
13133
  let keyboardLookupLastTime;
13026
13134
  const displayItems = vue.computed(() => {
13027
13135
  if (props.hideSelected) {
@@ -13089,41 +13197,10 @@
13089
13197
  const now = performance.now();
13090
13198
  if (now - keyboardLookupLastTime > KEYBOARD_LOOKUP_THRESHOLD) {
13091
13199
  keyboardLookupPrefix = '';
13092
- keyboardLookupIndex = -1;
13093
13200
  }
13094
13201
  keyboardLookupPrefix += e.key.toLowerCase();
13095
13202
  keyboardLookupLastTime = now;
13096
- const items = displayItems.value;
13097
- function findItem() {
13098
- let result = findItemBase();
13099
- if (result !== undefined) return result;
13100
- if (keyboardLookupPrefix.at(-1) === keyboardLookupPrefix.at(-2)) {
13101
- // No matches but we have a repeated letter, try the next item with that prefix
13102
- keyboardLookupPrefix = keyboardLookupPrefix.slice(0, -1);
13103
- result = findItemBase();
13104
- if (result !== undefined) return result;
13105
- }
13106
-
13107
- // Still nothing, wrap around to the top
13108
- keyboardLookupIndex = -1;
13109
- result = findItemBase();
13110
- if (result !== undefined) return result;
13111
-
13112
- // Still nothing, try just the new letter
13113
- keyboardLookupPrefix = e.key.toLowerCase();
13114
- return findItemBase();
13115
- }
13116
- function findItemBase() {
13117
- for (let i = 0; i < items.length; i++) {
13118
- const _item = items[i];
13119
- if (i > keyboardLookupIndex && _item.title.toLowerCase().startsWith(keyboardLookupPrefix)) {
13120
- keyboardLookupIndex = i;
13121
- return _item;
13122
- }
13123
- }
13124
- return undefined;
13125
- }
13126
- const item = findItem();
13203
+ const item = items.value.find(item => item.title.toLowerCase().startsWith(keyboardLookupPrefix));
13127
13204
  if (item !== undefined) {
13128
13205
  if (!props.multiple) {
13129
13206
  model.value = [item];
@@ -13280,6 +13357,22 @@
13280
13357
  key: item.value,
13281
13358
  onClick: () => select(item, null)
13282
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
+ }
13283
13376
  return slots.item?.({
13284
13377
  item,
13285
13378
  index,
@@ -13440,6 +13533,9 @@
13440
13533
  let match = -1;
13441
13534
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13442
13535
  if (typeof item === 'object') {
13536
+ if (['divider', 'subheader'].includes(item.raw?.type)) {
13537
+ continue;
13538
+ }
13443
13539
  const filterKeys = keys || Object.keys(transformed);
13444
13540
  for (const key of filterKeys) {
13445
13541
  const value = getPropertyFromItem(transformed, key);
@@ -13878,6 +13974,22 @@
13878
13974
  active: highlightFirst.value && index === 0 ? true : undefined,
13879
13975
  onClick: () => select(item, null)
13880
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
+ }
13881
13993
  return slots.item?.({
13882
13994
  item,
13883
13995
  index,
@@ -17473,13 +17585,13 @@
17473
17585
  return null;
17474
17586
  }
17475
17587
  const sundayJanuarySecond2000 = new Date(2000, 0, 2);
17476
- function getWeekdays(locale, firstDayOfWeek) {
17588
+ function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
17477
17589
  const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
17478
17590
  return createRange(7).map(i => {
17479
17591
  const weekday = new Date(sundayJanuarySecond2000);
17480
17592
  weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
17481
17593
  return new Intl.DateTimeFormat(locale, {
17482
- weekday: 'narrow'
17594
+ weekday: weekdayFormat ?? 'narrow'
17483
17595
  }).format(weekday);
17484
17596
  });
17485
17597
  }
@@ -17943,9 +18055,9 @@
17943
18055
  getDiff(date, comparing, unit) {
17944
18056
  return getDiff(date, comparing, unit);
17945
18057
  }
17946
- getWeekdays(firstDayOfWeek) {
18058
+ getWeekdays(firstDayOfWeek, weekdayFormat) {
17947
18059
  const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
17948
- return getWeekdays(this.locale, firstDay);
18060
+ return getWeekdays(this.locale, firstDay, weekdayFormat);
17949
18061
  }
17950
18062
  getYear(date) {
17951
18063
  return getYear(date);
@@ -18288,6 +18400,7 @@
18288
18400
  _search.value = val ?? '';
18289
18401
  if (!props.multiple && !hasSelectionSlot.value) {
18290
18402
  model.value = [transformItem$3(props, val)];
18403
+ vue.nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18291
18404
  }
18292
18405
  if (val && props.multiple && props.delimiters?.length) {
18293
18406
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18604,6 +18717,22 @@
18604
18717
  active: highlightFirst.value && index === 0 ? true : undefined,
18605
18718
  onClick: () => select(item, null)
18606
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
+ }
18607
18736
  return slots.item?.({
18608
18737
  item,
18609
18738
  index,
@@ -22247,7 +22376,8 @@
22247
22376
  firstDayOfWeek: {
22248
22377
  type: [Number, String],
22249
22378
  default: undefined
22250
- }
22379
+ },
22380
+ weekdayFormat: String
22251
22381
  }, 'calendar');
22252
22382
  function useCalendar(props) {
22253
22383
  const adapter = useDate();
@@ -22495,7 +22625,7 @@
22495
22625
  "ref": daysRef,
22496
22626
  "key": daysInMonth.value[0].date?.toString(),
22497
22627
  "class": "v-date-picker-month__days"
22498
- }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => vue.createVNode("div", {
22628
+ }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => vue.createVNode("div", {
22499
22629
  "class": ['v-date-picker-month__day', 'v-date-picker-month__weekday']
22500
22630
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22501
22631
  const slotProps = {
@@ -25026,6 +25156,10 @@
25026
25156
  type: Number,
25027
25157
  default: 0
25028
25158
  },
25159
+ minFractionDigits: {
25160
+ type: Number,
25161
+ default: null
25162
+ },
25029
25163
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
25030
25164
  }, 'VNumberInput');
25031
25165
  const VNumberInput = genericComponent()({
@@ -25056,9 +25190,19 @@
25056
25190
  } = useFocus(props);
25057
25191
  function correctPrecision(val) {
25058
25192
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
25059
- const fixed = precision == null ? String(val) : val.toFixed(precision);
25060
- return isFocused.value ? Number(fixed).toString() // trim zeros
25061
- : 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;
25062
25206
  }
25063
25207
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
25064
25208
  const _inputText = vue.shallowRef(null);
@@ -25111,6 +25255,7 @@
25111
25255
  }
25112
25256
  };
25113
25257
  vue.watch(() => props.precision, () => formatInputValue());
25258
+ vue.watch(() => props.minFractionDigits, () => formatInputValue());
25114
25259
  vue.onMounted(() => {
25115
25260
  clampModel();
25116
25261
  });
@@ -25212,7 +25357,7 @@
25212
25357
  inputText.value = null;
25213
25358
  return;
25214
25359
  }
25215
- inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25360
+ inputText.value = correctPrecision(model.value);
25216
25361
  }
25217
25362
  function trimDecimalZeros() {
25218
25363
  if (controlsDisabled.value) return;
@@ -29254,7 +29399,7 @@
29254
29399
  };
29255
29400
  });
29256
29401
  }
29257
- const version$1 = "3.8.5-pr-21419.3ae3440";
29402
+ const version$1 = "3.8.6-dev.2025-05-21";
29258
29403
  createVuetify$1.version = version$1;
29259
29404
 
29260
29405
  // Vue's inject() can only be used in setup
@@ -29279,7 +29424,7 @@
29279
29424
  ...options
29280
29425
  });
29281
29426
  };
29282
- const version = "3.8.5-pr-21419.3ae3440";
29427
+ const version = "3.8.6-dev.2025-05-21";
29283
29428
  createVuetify.version = version;
29284
29429
 
29285
29430
  exports.blueprints = index;