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

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 (125) hide show
  1. package/CHANGELOG.md +5 -24
  2. package/dist/json/attributes.json +3311 -3363
  3. package/dist/json/importMap-labs.json +20 -20
  4. package/dist/json/importMap.json +206 -206
  5. package/dist/json/tags.json +6 -19
  6. package/dist/json/web-types.json +6080 -6298
  7. package/dist/vuetify-labs.cjs +204 -321
  8. package/dist/vuetify-labs.css +5998 -6026
  9. package/dist/vuetify-labs.d.ts +1384 -1583
  10. package/dist/vuetify-labs.esm.js +205 -322
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +204 -321
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +193 -315
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +4658 -4686
  17. package/dist/vuetify.d.ts +541 -742
  18. package/dist/vuetify.esm.js +194 -316
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +193 -315
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1198 -1197
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VAlert/VAlert.css +1 -6
  26. package/lib/components/VAlert/VAlert.d.ts +0 -35
  27. package/lib/components/VAlert/VAlert.js +10 -15
  28. package/lib/components/VAlert/VAlert.js.map +1 -1
  29. package/lib/components/VAlert/VAlert.sass +1 -7
  30. package/lib/components/VAutocomplete/VAutocomplete.d.ts +96 -133
  31. package/lib/components/VAutocomplete/VAutocomplete.js +2 -19
  32. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  33. package/lib/components/VBtnGroup/VBtnGroup.css +7 -30
  34. package/lib/components/VBtnGroup/VBtnGroup.d.ts +32 -58
  35. package/lib/components/VBtnGroup/VBtnGroup.js +3 -7
  36. package/lib/components/VBtnGroup/VBtnGroup.js.map +1 -1
  37. package/lib/components/VBtnGroup/VBtnGroup.sass +17 -44
  38. package/lib/components/VBtnToggle/VBtnToggle.d.ts +0 -25
  39. package/lib/components/VCheckbox/VCheckbox.d.ts +3 -3
  40. package/lib/components/VChipGroup/VChipGroup.d.ts +0 -10
  41. package/lib/components/VCombobox/VCombobox.d.ts +96 -133
  42. package/lib/components/VCombobox/VCombobox.js +2 -20
  43. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  44. package/lib/components/VDataTable/VDataTable.d.ts +0 -18
  45. package/lib/components/VDataTable/VDataTableHeaders.d.ts +0 -13
  46. package/lib/components/VDataTable/VDataTableHeaders.js +2 -4
  47. package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
  48. package/lib/components/VDataTable/VDataTableServer.d.ts +0 -13
  49. package/lib/components/VDataTable/VDataTableVirtual.d.ts +0 -13
  50. package/lib/components/VDatePicker/VDatePicker.d.ts +20 -10
  51. package/lib/components/VDatePicker/VDatePicker.js +39 -2
  52. package/lib/components/VDatePicker/VDatePicker.js.map +1 -1
  53. package/lib/components/VDatePicker/VDatePickerMonth.d.ts +0 -10
  54. package/lib/components/VDatePicker/VDatePickerMonth.js +1 -1
  55. package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
  56. package/lib/components/VDatePicker/VDatePickerMonths.d.ts +10 -0
  57. package/lib/components/VDatePicker/VDatePickerMonths.js +12 -2
  58. package/lib/components/VDatePicker/VDatePickerMonths.js.map +1 -1
  59. package/lib/components/VDatePicker/VDatePickerYears.d.ts +10 -0
  60. package/lib/components/VDatePicker/VDatePickerYears.js +14 -2
  61. package/lib/components/VDatePicker/VDatePickerYears.js.map +1 -1
  62. package/lib/components/VField/VField.d.ts +3 -3
  63. package/lib/components/VFileInput/VFileInput.d.ts +15 -15
  64. package/lib/components/VInput/VInput.d.ts +4 -4
  65. package/lib/components/VList/VListChildren.js.map +1 -1
  66. package/lib/components/VNumberInput/VNumberInput.d.ts +89 -103
  67. package/lib/components/VNumberInput/VNumberInput.js +15 -29
  68. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  69. package/lib/components/VOtpInput/VOtpInput.js +1 -2
  70. package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
  71. package/lib/components/VOverlay/VOverlay.css +1 -1
  72. package/lib/components/VOverlay/_variables.scss +1 -1
  73. package/lib/components/VRadioGroup/VRadioGroup.d.ts +3 -3
  74. package/lib/components/VRangeSlider/VRangeSlider.d.ts +3 -3
  75. package/lib/components/VSelect/VSelect.d.ts +96 -138
  76. package/lib/components/VSelect/VSelect.js +3 -21
  77. package/lib/components/VSelect/VSelect.js.map +1 -1
  78. package/lib/components/VSlideGroup/VSlideGroup.d.ts +0 -10
  79. package/lib/components/VSlideGroup/VSlideGroup.js +1 -2
  80. package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
  81. package/lib/components/VSlider/VSlider.d.ts +3 -3
  82. package/lib/components/VSwitch/VSwitch.d.ts +3 -3
  83. package/lib/components/VTabs/VTabs.d.ts +0 -10
  84. package/lib/components/VTextField/VTextField.d.ts +27 -27
  85. package/lib/components/VTextarea/VTextarea.d.ts +15 -15
  86. package/lib/composables/calendar.d.ts +0 -6
  87. package/lib/composables/calendar.js +1 -2
  88. package/lib/composables/calendar.js.map +1 -1
  89. package/lib/composables/date/DateAdapter.d.ts +1 -1
  90. package/lib/composables/date/DateAdapter.js.map +1 -1
  91. package/lib/composables/date/adapters/vuetify.d.ts +1 -1
  92. package/lib/composables/date/adapters/vuetify.js +4 -4
  93. package/lib/composables/date/adapters/vuetify.js.map +1 -1
  94. package/lib/composables/date/date.d.ts +1 -1
  95. package/lib/composables/date/index.d.ts +0 -1
  96. package/lib/composables/date/index.js +0 -1
  97. package/lib/composables/date/index.js.map +1 -1
  98. package/lib/composables/filter.js +0 -3
  99. package/lib/composables/filter.js.map +1 -1
  100. package/lib/composables/theme.d.ts +1 -6
  101. package/lib/composables/theme.js +26 -94
  102. package/lib/composables/theme.js.map +1 -1
  103. package/lib/composables/virtual.js +1 -6
  104. package/lib/composables/virtual.js.map +1 -1
  105. package/lib/entry-bundler.d.ts +1 -1
  106. package/lib/entry-bundler.js +1 -1
  107. package/lib/entry-bundler.js.map +1 -1
  108. package/lib/framework.d.ts +71 -76
  109. package/lib/framework.js +1 -1
  110. package/lib/framework.js.map +1 -1
  111. package/lib/labs/VCalendar/VCalendar.d.ts +0 -10
  112. package/lib/labs/VColorInput/VColorInput.d.ts +3 -3
  113. package/lib/labs/VDateInput/VDateInput.d.ts +107 -97
  114. package/lib/labs/VFileUpload/VFileUpload.d.ts +3 -3
  115. package/lib/labs/VIconBtn/VIconBtn.d.ts +29 -29
  116. package/lib/labs/VIconBtn/VIconBtn.js +11 -7
  117. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  118. package/lib/labs/entry-bundler.d.ts +1 -1
  119. package/lib/util/globals.d.ts +0 -1
  120. package/lib/util/globals.js +0 -1
  121. package/lib/util/globals.js.map +1 -1
  122. package/package.json +1 -3
  123. package/lib/composables/iconSizes.d.ts +0 -28
  124. package/lib/composables/iconSizes.js +0 -23
  125. package/lib/composables/iconSizes.js.map +0 -1
@@ -1,16 +1,15 @@
1
1
  /*!
2
- * Vuetify v3.8.7-dev.2025-05-27
2
+ * Vuetify v3.8.7-master.2025-05-29
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
6
6
 
7
- import { shallowRef, reactive, watchEffect, toRef, capitalize, unref, Fragment, isVNode, Comment, warn, getCurrentInstance as getCurrentInstance$1, ref, computed, provide, inject as inject$1, defineComponent as defineComponent$1, h, camelize, createVNode, mergeProps, createElementVNode, normalizeClass, toValue, onBeforeUnmount, watch, readonly, onMounted, useId, onDeactivated, onActivated, onScopeDispose, effectScope, toRaw, getCurrentScope, normalizeStyle, TransitionGroup, Transition, toRefs, isRef, onBeforeMount, nextTick, withDirectives, vShow, onUpdated, Text, resolveDynamicComponent, toDisplayString, markRaw, Teleport, cloneVNode, createTextVNode, normalizeProps, guardReactiveProps, onUnmounted, onBeforeUpdate, withModifiers, vModelText, resolveComponent, render } from 'vue';
7
+ import { shallowRef, reactive, watchEffect, toRef, capitalize, unref, Fragment, isVNode, Comment, warn, getCurrentInstance as getCurrentInstance$1, ref, computed, provide, inject as inject$1, defineComponent as defineComponent$1, h, camelize, createVNode, mergeProps, createElementVNode, normalizeClass, toValue, onBeforeUnmount, watch, readonly, onMounted, useId, onDeactivated, onActivated, onScopeDispose, effectScope, toRaw, normalizeStyle, TransitionGroup, Transition, toRefs, isRef, onBeforeMount, nextTick, withDirectives, vShow, onUpdated, Text, resolveDynamicComponent, toDisplayString, markRaw, Teleport, cloneVNode, createTextVNode, normalizeProps, guardReactiveProps, onUnmounted, onBeforeUpdate, withModifiers, vModelText, resolveComponent, render } from 'vue';
8
8
 
9
9
  const IN_BROWSER = typeof window !== 'undefined';
10
10
  const SUPPORTS_INTERSECTION = IN_BROWSER && 'IntersectionObserver' in window;
11
11
  const SUPPORTS_TOUCH = IN_BROWSER && ('ontouchstart' in window || window.navigator.maxTouchPoints > 0);
12
12
  const SUPPORTS_EYE_DROPPER = IN_BROWSER && 'EyeDropper' in window;
13
- const SUPPORTS_MATCH_MEDIA = IN_BROWSER && 'matchMedia' in window && typeof window.matchMedia === 'function';
14
13
 
15
14
  function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
16
15
  function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
@@ -2825,7 +2824,6 @@ const makeThemeProps = propsFactory({
2825
2824
  function genDefaults$1() {
2826
2825
  return {
2827
2826
  defaultTheme: 'light',
2828
- prefix: 'v-',
2829
2827
  variations: {
2830
2828
  colors: [],
2831
2829
  lighten: 0,
@@ -2907,10 +2905,7 @@ function genDefaults$1() {
2907
2905
  }
2908
2906
  }
2909
2907
  },
2910
- stylesheetId: 'vuetify-theme-stylesheet',
2911
- scoped: false,
2912
- unimportant: false,
2913
- utilities: true
2908
+ stylesheetId: 'vuetify-theme-stylesheet'
2914
2909
  };
2915
2910
  }
2916
2911
  function parseThemeOptions() {
@@ -2933,21 +2928,21 @@ function parseThemeOptions() {
2933
2928
  function createCssClass(lines, selector, content, scope) {
2934
2929
  lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
2935
2930
  }
2936
- function genCssVariables(theme, prefix) {
2931
+ function genCssVariables(theme) {
2937
2932
  const lightOverlay = theme.dark ? 2 : 1;
2938
2933
  const darkOverlay = theme.dark ? 1 : 2;
2939
2934
  const variables = [];
2940
2935
  for (const [key, value] of Object.entries(theme.colors)) {
2941
2936
  const rgb = parseColor(value);
2942
- variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2937
+ variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2943
2938
  if (!key.startsWith('on-')) {
2944
- variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2939
+ variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2945
2940
  }
2946
2941
  }
2947
2942
  for (const [key, value] of Object.entries(theme.variables)) {
2948
2943
  const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
2949
2944
  const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
2950
- variables.push(`--${prefix}${key}: ${rgb ?? value}`);
2945
+ variables.push(`--v-${key}: ${rgb ?? value}`);
2951
2946
  }
2952
2947
  return variables;
2953
2948
  }
@@ -2991,8 +2986,7 @@ function getScopedSelector(selector, scope) {
2991
2986
  const scopeSelector = `:where(${scope})`;
2992
2987
  return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
2993
2988
  }
2994
- function upsertStyles(id, cspNonce, styles) {
2995
- const styleEl = getOrCreateStyleElement(id, cspNonce);
2989
+ function upsertStyles(styleEl, styles) {
2996
2990
  if (!styleEl) return;
2997
2991
  styleEl.innerHTML = styles;
2998
2992
  }
@@ -3012,17 +3006,8 @@ function getOrCreateStyleElement(id, cspNonce) {
3012
3006
  // Composables
3013
3007
  function createTheme(options) {
3014
3008
  const parsedOptions = parseThemeOptions(options);
3015
- const _name = shallowRef(parsedOptions.defaultTheme);
3009
+ const name = shallowRef(parsedOptions.defaultTheme);
3016
3010
  const themes = ref(parsedOptions.themes);
3017
- const systemName = shallowRef('light');
3018
- const name = computed({
3019
- get() {
3020
- return _name.value === 'system' ? systemName.value : _name.value;
3021
- },
3022
- set(val) {
3023
- _name.value = val;
3024
- }
3025
- });
3026
3011
  const computedThemes = computed(() => {
3027
3012
  const acc = {};
3028
3013
  for (const [name, original] of Object.entries(themes.value)) {
@@ -3043,49 +3028,28 @@ function createTheme(options) {
3043
3028
  const current = toRef(() => computedThemes.value[name.value]);
3044
3029
  const styles = computed(() => {
3045
3030
  const lines = [];
3046
- const important = parsedOptions.unimportant ? '' : ' !important';
3047
- const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
3048
3031
  if (current.value?.dark) {
3049
3032
  createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
3050
3033
  }
3051
- createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
3034
+ createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
3052
3035
  for (const [themeName, theme] of Object.entries(computedThemes.value)) {
3053
- createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
3054
- }
3055
- if (parsedOptions.utilities) {
3056
- const bgLines = [];
3057
- const fgLines = [];
3058
- const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
3059
- for (const key of colors) {
3060
- if (key.startsWith('on-')) {
3061
- createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
3062
- } else {
3063
- 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);
3064
- createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
3065
- createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
3066
- }
3036
+ createCssClass(lines, `.v-theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme)], parsedOptions.scope);
3037
+ }
3038
+ const bgLines = [];
3039
+ const fgLines = [];
3040
+ const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
3041
+ for (const key of colors) {
3042
+ if (key.startsWith('on-')) {
3043
+ createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
3044
+ } else {
3045
+ 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);
3046
+ createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
3047
+ createCssClass(fgLines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`], parsedOptions.scope);
3067
3048
  }
3068
- lines.push(...bgLines, ...fgLines);
3069
3049
  }
3050
+ lines.push(...bgLines, ...fgLines);
3070
3051
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
3071
3052
  });
3072
- const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
3073
- const themeNames = toRef(() => Object.keys(computedThemes.value));
3074
- if (SUPPORTS_MATCH_MEDIA) {
3075
- const media = window.matchMedia('(prefers-color-scheme: dark)');
3076
- function updateSystemName() {
3077
- systemName.value = media.matches ? 'dark' : 'light';
3078
- }
3079
- updateSystemName();
3080
- media.addEventListener('change', updateSystemName, {
3081
- passive: true
3082
- });
3083
- if (getCurrentScope()) {
3084
- onScopeDispose(() => {
3085
- media.removeEventListener('change', updateSystemName);
3086
- });
3087
- }
3088
- }
3089
3053
  function install(app) {
3090
3054
  if (parsedOptions.isDisabled) return;
3091
3055
  const head = app._context.provides.usehead;
@@ -3123,55 +3087,22 @@ function createTheme(options) {
3123
3087
  updateStyles();
3124
3088
  }
3125
3089
  function updateStyles() {
3126
- upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
3090
+ upsertStyles(getOrCreateStyleElement(parsedOptions.stylesheetId, parsedOptions.cspNonce), styles.value);
3127
3091
  }
3128
3092
  }
3129
3093
  }
3130
- function change(themeName) {
3131
- if (!themeNames.value.includes(themeName)) {
3132
- consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
3133
- return;
3134
- }
3135
- name.value = themeName;
3136
- }
3137
- function cycle() {
3138
- let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
3139
- const currentIndex = themeArray.indexOf(name.value);
3140
- const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
3141
- change(themeArray[nextIndex]);
3142
- }
3143
- function toggle() {
3144
- let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
3145
- cycle(themeArray);
3146
- }
3147
- const globalName = new Proxy(name, {
3148
- get(target, prop) {
3149
- return target[prop];
3150
- },
3151
- set(target, prop, val) {
3152
- if (prop === 'value') {
3153
- deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
3154
- }
3155
- // @ts-expect-error
3156
- target[prop] = val;
3157
- return true;
3158
- }
3159
- });
3094
+ const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);
3160
3095
  return {
3161
3096
  install,
3162
- change,
3163
- cycle,
3164
- toggle,
3165
3097
  isDisabled: parsedOptions.isDisabled,
3166
3098
  name,
3167
3099
  themes,
3168
3100
  current,
3169
3101
  computedThemes,
3170
- prefix: parsedOptions.prefix,
3171
3102
  themeClasses,
3172
3103
  styles,
3173
3104
  global: {
3174
- name: globalName,
3105
+ name,
3175
3106
  current
3176
3107
  }
3177
3108
  };
@@ -3182,7 +3113,7 @@ function provideTheme(props) {
3182
3113
  if (!theme) throw new Error('Could not find Vuetify theme injection');
3183
3114
  const name = toRef(() => props.theme ?? theme.name.value);
3184
3115
  const current = toRef(() => theme.themes.value[name.value]);
3185
- const themeClasses = toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
3116
+ const themeClasses = toRef(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);
3186
3117
  const newTheme = {
3187
3118
  ...theme,
3188
3119
  name,
@@ -4729,15 +4660,9 @@ function useVariant(props) {
4729
4660
  };
4730
4661
  }
4731
4662
 
4732
- // Types
4733
-
4734
4663
  const makeVBtnGroupProps = propsFactory({
4735
4664
  baseColor: String,
4736
4665
  divided: Boolean,
4737
- direction: {
4738
- type: String,
4739
- default: 'horizontal'
4740
- },
4741
4666
  ...makeBorderProps(),
4742
4667
  ...makeComponentProps(),
4743
4668
  ...makeDensityProps(),
@@ -4771,7 +4696,7 @@ const VBtnGroup = genericComponent()({
4771
4696
  } = useRounded(props);
4772
4697
  provideDefaults({
4773
4698
  VBtn: {
4774
- height: toRef(() => props.direction === 'horizontal' ? 'auto' : null),
4699
+ height: 'auto',
4775
4700
  baseColor: toRef(() => props.baseColor),
4776
4701
  color: toRef(() => props.color),
4777
4702
  density: toRef(() => props.density),
@@ -4781,7 +4706,7 @@ const VBtnGroup = genericComponent()({
4781
4706
  });
4782
4707
  useRender(() => {
4783
4708
  return createVNode(props.tag, {
4784
- "class": normalizeClass(['v-btn-group', `v-btn-group--${props.direction}`, {
4709
+ "class": normalizeClass(['v-btn-group', {
4785
4710
  'v-btn-group--divided': props.divided
4786
4711
  }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
4787
4712
  "style": normalizeStyle(props.style)
@@ -6260,31 +6185,6 @@ const VAppBarTitle = genericComponent()({
6260
6185
  // Utilities
6261
6186
  const VAlertTitle = createSimpleFunctional('v-alert-title');
6262
6187
 
6263
- // Utilities
6264
-
6265
- // Types
6266
-
6267
- // Types
6268
-
6269
- // Composables
6270
- const makeIconSizeProps = propsFactory({
6271
- iconSize: [Number, String],
6272
- iconSizes: {
6273
- type: Array,
6274
- default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
6275
- }
6276
- }, 'iconSize');
6277
- function useIconSizes(props, fallback) {
6278
- const iconSize = computed(() => {
6279
- const iconSizeMap = new Map(props.iconSizes);
6280
- const _iconSize = props.iconSize ?? fallback() ?? 'default';
6281
- return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
6282
- });
6283
- return {
6284
- iconSize
6285
- };
6286
- }
6287
-
6288
6188
  // Types
6289
6189
 
6290
6190
  const allowedTypes = ['success', 'info', 'warning', 'error'];
@@ -6324,7 +6224,6 @@ const makeVAlertProps = propsFactory({
6324
6224
  ...makeDensityProps(),
6325
6225
  ...makeDimensionProps(),
6326
6226
  ...makeElevationProps(),
6327
- ...makeIconSizeProps(),
6328
6227
  ...makeLocationProps(),
6329
6228
  ...makePositionProps(),
6330
6229
  ...makeRoundedProps(),
@@ -6352,9 +6251,6 @@ const VAlert = genericComponent()({
6352
6251
  if (!props.type) return props.icon;
6353
6252
  return props.icon ?? `$${props.type}`;
6354
6253
  });
6355
- const {
6356
- iconSize
6357
- } = useIconSizes(props, () => props.prominent ? 44 : 28);
6358
6254
  const {
6359
6255
  themeClasses
6360
6256
  } = provideTheme(props);
@@ -6402,11 +6298,6 @@ const VAlert = genericComponent()({
6402
6298
  const hasPrepend = !!(slots.prepend || icon.value);
6403
6299
  const hasTitle = !!(slots.title || props.title);
6404
6300
  const hasClose = !!(slots.close || props.closable);
6405
- const iconProps = {
6406
- density: props.density,
6407
- icon: icon.value,
6408
- size: iconSize.value
6409
- };
6410
6301
  return isActive.value && createVNode(props.tag, {
6411
6302
  "class": normalizeClass(['v-alert', props.border && {
6412
6303
  'v-alert--border': !!props.border,
@@ -6424,14 +6315,19 @@ const VAlert = genericComponent()({
6424
6315
  }, null), hasPrepend && createElementVNode("div", {
6425
6316
  "key": "prepend",
6426
6317
  "class": "v-alert__prepend"
6427
- }, [!slots.prepend ? createVNode(VIcon, mergeProps({
6428
- "key": "prepend-icon"
6429
- }, iconProps), null) : createVNode(VDefaultsProvider, {
6318
+ }, [!slots.prepend ? createVNode(VIcon, {
6319
+ "key": "prepend-icon",
6320
+ "density": props.density,
6321
+ "icon": icon.value,
6322
+ "size": props.prominent ? 44 : 28
6323
+ }, null) : createVNode(VDefaultsProvider, {
6430
6324
  "key": "prepend-defaults",
6431
6325
  "disabled": !icon.value,
6432
6326
  "defaults": {
6433
6327
  VIcon: {
6434
- ...iconProps
6328
+ density: props.density,
6329
+ icon: icon.value,
6330
+ size: props.prominent ? 44 : 28
6435
6331
  }
6436
6332
  }
6437
6333
  }, slots.prepend)]), createElementVNode("div", {
@@ -7956,7 +7852,6 @@ function getOffsetPosition(isHorizontal, element) {
7956
7852
  const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group');
7957
7853
  const makeVSlideGroupProps = propsFactory({
7958
7854
  centerActive: Boolean,
7959
- contentClass: null,
7960
7855
  direction: {
7961
7856
  type: String,
7962
7857
  default: 'horizontal'
@@ -8269,7 +8164,7 @@ const VSlideGroup = genericComponent()({
8269
8164
  })]), createElementVNode("div", {
8270
8165
  "key": "container",
8271
8166
  "ref": containerRef,
8272
- "class": normalizeClass(['v-slide-group__container', props.contentClass]),
8167
+ "class": "v-slide-group__container",
8273
8168
  "onScroll": onScroll
8274
8169
  }, [createElementVNode("div", {
8275
8170
  "ref": contentRef,
@@ -8631,68 +8526,6 @@ const VChip = genericComponent()({
8631
8526
  }
8632
8527
  });
8633
8528
 
8634
- const makeVDividerProps = propsFactory({
8635
- color: String,
8636
- inset: Boolean,
8637
- length: [Number, String],
8638
- opacity: [Number, String],
8639
- thickness: [Number, String],
8640
- vertical: Boolean,
8641
- ...makeComponentProps(),
8642
- ...makeThemeProps()
8643
- }, 'VDivider');
8644
- const VDivider = genericComponent()({
8645
- name: 'VDivider',
8646
- props: makeVDividerProps(),
8647
- setup(props, _ref) {
8648
- let {
8649
- attrs,
8650
- slots
8651
- } = _ref;
8652
- const {
8653
- themeClasses
8654
- } = provideTheme(props);
8655
- const {
8656
- textColorClasses,
8657
- textColorStyles
8658
- } = useTextColor(() => props.color);
8659
- const dividerStyles = computed(() => {
8660
- const styles = {};
8661
- if (props.length) {
8662
- styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
8663
- }
8664
- if (props.thickness) {
8665
- styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
8666
- }
8667
- return styles;
8668
- });
8669
- useRender(() => {
8670
- const divider = createElementVNode("hr", {
8671
- "class": normalizeClass([{
8672
- 'v-divider': true,
8673
- 'v-divider--inset': props.inset,
8674
- 'v-divider--vertical': props.vertical
8675
- }, themeClasses.value, textColorClasses.value, props.class]),
8676
- "style": normalizeStyle([dividerStyles.value, textColorStyles.value, {
8677
- '--v-border-opacity': props.opacity
8678
- }, props.style]),
8679
- "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
8680
- "role": `${attrs.role || 'separator'}`
8681
- }, null);
8682
- if (!slots.default) return divider;
8683
- return createElementVNode("div", {
8684
- "class": normalizeClass(['v-divider__wrapper', {
8685
- 'v-divider__wrapper--vertical': props.vertical,
8686
- 'v-divider__wrapper--inset': props.inset
8687
- }])
8688
- }, [divider, createElementVNode("div", {
8689
- "class": "v-divider__content"
8690
- }, [slots.default()]), divider]);
8691
- });
8692
- return {};
8693
- }
8694
- });
8695
-
8696
8529
  // Utilities
8697
8530
 
8698
8531
  // List
@@ -9844,6 +9677,68 @@ const VListSubheader = genericComponent()({
9844
9677
  }
9845
9678
  });
9846
9679
 
9680
+ const makeVDividerProps = propsFactory({
9681
+ color: String,
9682
+ inset: Boolean,
9683
+ length: [Number, String],
9684
+ opacity: [Number, String],
9685
+ thickness: [Number, String],
9686
+ vertical: Boolean,
9687
+ ...makeComponentProps(),
9688
+ ...makeThemeProps()
9689
+ }, 'VDivider');
9690
+ const VDivider = genericComponent()({
9691
+ name: 'VDivider',
9692
+ props: makeVDividerProps(),
9693
+ setup(props, _ref) {
9694
+ let {
9695
+ attrs,
9696
+ slots
9697
+ } = _ref;
9698
+ const {
9699
+ themeClasses
9700
+ } = provideTheme(props);
9701
+ const {
9702
+ textColorClasses,
9703
+ textColorStyles
9704
+ } = useTextColor(() => props.color);
9705
+ const dividerStyles = computed(() => {
9706
+ const styles = {};
9707
+ if (props.length) {
9708
+ styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
9709
+ }
9710
+ if (props.thickness) {
9711
+ styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
9712
+ }
9713
+ return styles;
9714
+ });
9715
+ useRender(() => {
9716
+ const divider = createElementVNode("hr", {
9717
+ "class": normalizeClass([{
9718
+ 'v-divider': true,
9719
+ 'v-divider--inset': props.inset,
9720
+ 'v-divider--vertical': props.vertical
9721
+ }, themeClasses.value, textColorClasses.value, props.class]),
9722
+ "style": normalizeStyle([dividerStyles.value, textColorStyles.value, {
9723
+ '--v-border-opacity': props.opacity
9724
+ }, props.style]),
9725
+ "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
9726
+ "role": `${attrs.role || 'separator'}`
9727
+ }, null);
9728
+ if (!slots.default) return divider;
9729
+ return createElementVNode("div", {
9730
+ "class": normalizeClass(['v-divider__wrapper', {
9731
+ 'v-divider__wrapper--vertical': props.vertical,
9732
+ 'v-divider__wrapper--inset': props.inset
9733
+ }])
9734
+ }, [divider, createElementVNode("div", {
9735
+ "class": "v-divider__content"
9736
+ }, [slots.default()]), divider]);
9737
+ });
9738
+ return {};
9739
+ }
9740
+ });
9741
+
9847
9742
  // Types
9848
9743
 
9849
9744
  const makeVListChildrenProps = propsFactory({
@@ -12771,12 +12666,7 @@ function useVirtual(props, items) {
12771
12666
  }
12772
12667
  function calculateOffset(index) {
12773
12668
  index = clamp(index, 0, items.value.length - 1);
12774
- const whole = Math.floor(index);
12775
- const fraction = index % 1;
12776
- const next = whole + 1;
12777
- const wholeOffset = offsets[whole] || 0;
12778
- const nextOffset = offsets[next] || wholeOffset;
12779
- return wholeOffset + (nextOffset - wholeOffset) * fraction;
12669
+ return offsets[index] || 0;
12780
12670
  }
12781
12671
  function calculateIndex(scrollTop) {
12782
12672
  return binaryClosest(offsets, scrollTop);
@@ -13130,7 +13020,6 @@ const makeSelectProps = propsFactory({
13130
13020
  },
13131
13021
  openOnClear: Boolean,
13132
13022
  itemColor: String,
13133
- noAutoScroll: Boolean,
13134
13023
  ...makeItemsProps({
13135
13024
  itemChildren: false
13136
13025
  })
@@ -13345,7 +13234,7 @@ const VSelect = genericComponent()({
13345
13234
  watch(menu, () => {
13346
13235
  if (!props.hideSelected && menu.value && model.value.length) {
13347
13236
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
13348
- IN_BROWSER && !props.noAutoScroll && window.requestAnimationFrame(() => {
13237
+ IN_BROWSER && window.requestAnimationFrame(() => {
13349
13238
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
13350
13239
  });
13351
13240
  }
@@ -13437,22 +13326,6 @@ const VSelect = genericComponent()({
13437
13326
  key: item.value,
13438
13327
  onClick: () => select(item, null)
13439
13328
  });
13440
- if (item.raw.type === 'divider') {
13441
- return slots.divider?.({
13442
- props: item.raw,
13443
- index
13444
- }) ?? createVNode(VDivider, mergeProps(item.props, {
13445
- "key": `divider-${index}`
13446
- }), null);
13447
- }
13448
- if (item.raw.type === 'subheader') {
13449
- return slots.subheader?.({
13450
- props: item.raw,
13451
- index
13452
- }) ?? createVNode(VListSubheader, mergeProps(item.props, {
13453
- "key": `subheader-${index}`
13454
- }), null);
13455
- }
13456
13329
  return slots.item?.({
13457
13330
  item,
13458
13331
  index,
@@ -13613,9 +13486,6 @@ function filterItems(items, query, options) {
13613
13486
  let match = -1;
13614
13487
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13615
13488
  if (typeof item === 'object') {
13616
- if (['divider', 'subheader'].includes(item.raw?.type)) {
13617
- continue;
13618
- }
13619
13489
  const filterKeys = keys || Object.keys(transformed);
13620
13490
  for (const key of filterKeys) {
13621
13491
  const value = getPropertyFromItem(transformed, key);
@@ -14054,22 +13924,6 @@ const VAutocomplete = genericComponent()({
14054
13924
  active: highlightFirst.value && index === 0 ? true : undefined,
14055
13925
  onClick: () => select(item, null)
14056
13926
  });
14057
- if (item.raw.type === 'divider') {
14058
- return slots.divider?.({
14059
- props: item.raw,
14060
- index
14061
- }) ?? createVNode(VDivider, mergeProps(item.props, {
14062
- "key": `divider-${index}`
14063
- }), null);
14064
- }
14065
- if (item.raw.type === 'subheader') {
14066
- return slots.subheader?.({
14067
- props: item.raw,
14068
- index
14069
- }) ?? createVNode(VListSubheader, mergeProps(item.props, {
14070
- "key": `subheader-${index}`
14071
- }), null);
14072
- }
14073
13927
  return slots.item?.({
14074
13928
  item,
14075
13929
  index,
@@ -17665,13 +17519,13 @@ function date(value) {
17665
17519
  return null;
17666
17520
  }
17667
17521
  const sundayJanuarySecond2000 = new Date(2000, 0, 2);
17668
- function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
17522
+ function getWeekdays(locale, firstDayOfWeek) {
17669
17523
  const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
17670
17524
  return createRange(7).map(i => {
17671
17525
  const weekday = new Date(sundayJanuarySecond2000);
17672
17526
  weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
17673
17527
  return new Intl.DateTimeFormat(locale, {
17674
- weekday: weekdayFormat ?? 'narrow'
17528
+ weekday: 'narrow'
17675
17529
  }).format(weekday);
17676
17530
  });
17677
17531
  }
@@ -18135,9 +17989,9 @@ class VuetifyDateAdapter {
18135
17989
  getDiff(date, comparing, unit) {
18136
17990
  return getDiff(date, comparing, unit);
18137
17991
  }
18138
- getWeekdays(firstDayOfWeek, weekdayFormat) {
17992
+ getWeekdays(firstDayOfWeek) {
18139
17993
  const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
18140
- return getWeekdays(this.locale, firstDay, weekdayFormat);
17994
+ return getWeekdays(this.locale, firstDay);
18141
17995
  }
18142
17996
  getYear(date) {
18143
17997
  return getYear(date);
@@ -18480,7 +18334,6 @@ const VCombobox = genericComponent()({
18480
18334
  _search.value = val ?? '';
18481
18335
  if (!props.multiple && !hasSelectionSlot.value) {
18482
18336
  model.value = [transformItem$3(props, val)];
18483
- nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18484
18337
  }
18485
18338
  if (val && props.multiple && props.delimiters?.length) {
18486
18339
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18797,22 +18650,6 @@ const VCombobox = genericComponent()({
18797
18650
  active: highlightFirst.value && index === 0 ? true : undefined,
18798
18651
  onClick: () => select(item, null)
18799
18652
  });
18800
- if (item.raw.type === 'divider') {
18801
- return slots.divider?.({
18802
- props: item.raw,
18803
- index
18804
- }) ?? createVNode(VDivider, mergeProps(item.props, {
18805
- "key": `divider-${index}`
18806
- }), null);
18807
- }
18808
- if (item.raw.type === 'subheader') {
18809
- return slots.subheader?.({
18810
- props: item.raw,
18811
- index
18812
- }) ?? createVNode(VListSubheader, mergeProps(item.props, {
18813
- "key": `subheader-${index}`
18814
- }), null);
18815
- }
18816
18653
  return slots.item?.({
18817
18654
  item,
18818
18655
  index,
@@ -20692,7 +20529,6 @@ const makeVDataTableHeadersProps = propsFactory({
20692
20529
  color: String,
20693
20530
  disableSort: Boolean,
20694
20531
  fixedHeader: Boolean,
20695
- lastFixed: Boolean,
20696
20532
  multiSort: Boolean,
20697
20533
  sortAscIcon: {
20698
20534
  type: IconValue,
@@ -20739,11 +20575,10 @@ const VDataTableHeaders = genericComponent()({
20739
20575
  loaderClasses
20740
20576
  } = useLoader(props);
20741
20577
  function getFixedStyles(column, y) {
20742
- if (!(props.sticky || props.fixedHeader) && !(column.fixed || column.lastFixed)) return undefined;
20578
+ if (!(props.sticky || props.fixedHeader) && !column.fixed) return undefined;
20743
20579
  return {
20744
20580
  position: 'sticky',
20745
- left: column.fixed || column.lastFixed ? convertToUnit(column.fixedOffset) : undefined,
20746
- right: column.lastFixed ? convertToUnit(column.fixedOffset ?? 0) : undefined,
20581
+ left: column.fixed ? convertToUnit(column.fixedOffset) : undefined,
20747
20582
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
20748
20583
  };
20749
20584
  }
@@ -22458,8 +22293,7 @@ const makeCalendarProps = propsFactory({
22458
22293
  firstDayOfWeek: {
22459
22294
  type: [Number, String],
22460
22295
  default: undefined
22461
- },
22462
- weekdayFormat: String
22296
+ }
22463
22297
  }, 'calendar');
22464
22298
  function useCalendar(props) {
22465
22299
  const adapter = useDate();
@@ -22707,7 +22541,7 @@ const VDatePickerMonth = genericComponent()({
22707
22541
  "ref": daysRef,
22708
22542
  "key": daysInMonth.value[0].date?.toString(),
22709
22543
  "class": "v-date-picker-month__days"
22710
- }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => createElementVNode("div", {
22544
+ }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => createElementVNode("div", {
22711
22545
  "class": ['v-date-picker-month__day', 'v-date-picker-month__weekday']
22712
22546
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22713
22547
  const slotProps = {
@@ -22750,7 +22584,8 @@ const makeVDatePickerMonthsProps = propsFactory({
22750
22584
  min: null,
22751
22585
  max: null,
22752
22586
  modelValue: Number,
22753
- year: Number
22587
+ year: Number,
22588
+ allowedMonths: [Array, Function]
22754
22589
  }, 'VDatePickerMonths');
22755
22590
  const VDatePickerMonths = genericComponent()({
22756
22591
  name: 'VDatePickerMonths',
@@ -22772,7 +22607,7 @@ const VDatePickerMonths = genericComponent()({
22772
22607
  }
22773
22608
  return createRange(12).map(i => {
22774
22609
  const text = adapter.format(date, 'monthShort');
22775
- const isDisabled = !!(props.min && adapter.isAfter(adapter.startOfMonth(adapter.date(props.min)), date) || props.max && adapter.isAfter(date, adapter.startOfMonth(adapter.date(props.max))));
22610
+ const isDisabled = !!(!isMonthAllowed(i) || props.min && adapter.isAfter(adapter.startOfMonth(adapter.date(props.min)), date) || props.max && adapter.isAfter(date, adapter.startOfMonth(adapter.date(props.max))));
22776
22611
  date = adapter.getNextMonth(date);
22777
22612
  return {
22778
22613
  isDisabled,
@@ -22784,6 +22619,15 @@ const VDatePickerMonths = genericComponent()({
22784
22619
  watchEffect(() => {
22785
22620
  model.value = model.value ?? adapter.getMonth(adapter.date());
22786
22621
  });
22622
+ function isMonthAllowed(month) {
22623
+ if (Array.isArray(props.allowedMonths) && props.allowedMonths.length) {
22624
+ return props.allowedMonths.includes(month);
22625
+ }
22626
+ if (typeof props.allowedMonths === 'function') {
22627
+ return props.allowedMonths(month);
22628
+ }
22629
+ return true;
22630
+ }
22787
22631
  useRender(() => createElementVNode("div", {
22788
22632
  "class": "v-date-picker-months",
22789
22633
  "style": normalizeStyle({
@@ -22829,7 +22673,8 @@ const makeVDatePickerYearsProps = propsFactory({
22829
22673
  height: [String, Number],
22830
22674
  min: null,
22831
22675
  max: null,
22832
- modelValue: Number
22676
+ modelValue: Number,
22677
+ allowedYears: [Array, Function]
22833
22678
  }, 'VDatePickerYears');
22834
22679
  const VDatePickerYears = genericComponent()({
22835
22680
  name: 'VDatePickerYears',
@@ -22861,7 +22706,8 @@ const VDatePickerYears = genericComponent()({
22861
22706
  date = adapter.setYear(date, adapter.getYear(date) + 1);
22862
22707
  return {
22863
22708
  text,
22864
- value: i
22709
+ value: i,
22710
+ isDisabled: !isYearAllowed(i)
22865
22711
  };
22866
22712
  });
22867
22713
  });
@@ -22875,6 +22721,15 @@ const VDatePickerYears = genericComponent()({
22875
22721
  block: 'center'
22876
22722
  });
22877
22723
  });
22724
+ function isYearAllowed(year) {
22725
+ if (Array.isArray(props.allowedYears) && props.allowedYears.length) {
22726
+ return props.allowedYears.includes(year);
22727
+ }
22728
+ if (typeof props.allowedYears === 'function') {
22729
+ return props.allowedYears(year);
22730
+ }
22731
+ return true;
22732
+ }
22878
22733
  useRender(() => createElementVNode("div", {
22879
22734
  "class": "v-date-picker-years",
22880
22735
  "style": normalizeStyle({
@@ -22889,6 +22744,7 @@ const VDatePickerYears = genericComponent()({
22889
22744
  color: model.value === year.value ? props.color : undefined,
22890
22745
  rounded: true,
22891
22746
  text: year.text,
22747
+ disabled: year.isDisabled,
22892
22748
  variant: model.value === year.value ? 'flat' : 'text',
22893
22749
  onClick: () => {
22894
22750
  if (model.value === year.value) {
@@ -23038,6 +22894,41 @@ const VDatePicker = genericComponent()({
23038
22894
  }
23039
22895
  return targets;
23040
22896
  });
22897
+ function isAllowedInRange(start, end) {
22898
+ const allowedDates = props.allowedDates;
22899
+ if (typeof allowedDates !== 'function') return true;
22900
+ const days = adapter.getDiff(end, start, 'days');
22901
+ for (let i = 0; i < days; i++) {
22902
+ if (allowedDates(adapter.addDays(start, i))) return true;
22903
+ }
22904
+ return false;
22905
+ }
22906
+ function allowedYears(year) {
22907
+ if (typeof props.allowedDates === 'function') {
22908
+ const startOfYear = adapter.parseISO(`${year}-01-01`);
22909
+ return isAllowedInRange(startOfYear, adapter.endOfYear(startOfYear));
22910
+ }
22911
+ if (Array.isArray(props.allowedDates) && props.allowedDates.length) {
22912
+ for (const date of props.allowedDates) {
22913
+ if (adapter.getYear(adapter.date(date)) === year) return true;
22914
+ }
22915
+ return false;
22916
+ }
22917
+ return true;
22918
+ }
22919
+ function allowedMonths(month) {
22920
+ if (typeof props.allowedDates === 'function') {
22921
+ const startOfMonth = adapter.parseISO(`${year.value}-${month + 1}-01`);
22922
+ return isAllowedInRange(startOfMonth, adapter.endOfMonth(startOfMonth));
22923
+ }
22924
+ if (Array.isArray(props.allowedDates) && props.allowedDates.length) {
22925
+ for (const date of props.allowedDates) {
22926
+ if (adapter.getYear(adapter.date(date)) === year.value && adapter.getMonth(adapter.date(date)) === month) return true;
22927
+ }
22928
+ return false;
22929
+ }
22930
+ return true;
22931
+ }
23041
22932
 
23042
22933
  // function onClickAppend () {
23043
22934
  // inputMode.value = inputMode.value === 'calendar' ? 'keyboard' : 'calendar'
@@ -23153,14 +23044,16 @@ const VDatePicker = genericComponent()({
23153
23044
  "onUpdate:modelValue": [$event => month.value = $event, onUpdateMonth],
23154
23045
  "min": minDate.value,
23155
23046
  "max": maxDate.value,
23156
- "year": year.value
23047
+ "year": year.value,
23048
+ "allowedMonths": allowedMonths
23157
23049
  }), null) : viewMode.value === 'year' ? createVNode(VDatePickerYears, mergeProps({
23158
23050
  "key": "date-picker-years"
23159
23051
  }, datePickerYearsProps, {
23160
23052
  "modelValue": year.value,
23161
23053
  "onUpdate:modelValue": [$event => year.value = $event, onUpdateYear],
23162
23054
  "min": minDate.value,
23163
- "max": maxDate.value
23055
+ "max": maxDate.value,
23056
+ "allowedYears": allowedYears
23164
23057
  }), null) : createVNode(VDatePickerMonth, mergeProps({
23165
23058
  "key": "date-picker-month"
23166
23059
  }, datePickerMonthProps, {
@@ -25238,10 +25131,6 @@ const makeVNumberInputProps = propsFactory({
25238
25131
  type: Number,
25239
25132
  default: 0
25240
25133
  },
25241
- minFractionDigits: {
25242
- type: Number,
25243
- default: null
25244
- },
25245
25134
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
25246
25135
  }, 'VNumberInput');
25247
25136
  const VNumberInput = genericComponent()({
@@ -25272,19 +25161,9 @@ const VNumberInput = genericComponent()({
25272
25161
  } = useFocus(props);
25273
25162
  function correctPrecision(val) {
25274
25163
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
25275
- if (precision == null) {
25276
- return String(val);
25277
- }
25278
- let fixed = val.toFixed(precision);
25279
- if (isFocused.value) {
25280
- return Number(fixed).toString(); // trim zeros
25281
- }
25282
- if ((props.minFractionDigits ?? precision) < precision) {
25283
- const trimLimit = precision - props.minFractionDigits;
25284
- const [baseDigits, fractionDigits] = fixed.split('.');
25285
- fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
25286
- }
25287
- return fixed;
25164
+ const fixed = precision == null ? String(val) : val.toFixed(precision);
25165
+ return isFocused.value ? Number(fixed).toString() // trim zeros
25166
+ : fixed;
25288
25167
  }
25289
25168
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
25290
25169
  const _inputText = shallowRef(null);
@@ -25324,26 +25203,21 @@ const VNumberInput = genericComponent()({
25324
25203
  const controlNodeDefaultHeight = toRef(() => controlVariant.value === 'stacked' ? 'auto' : '100%');
25325
25204
  const incrementSlotProps = {
25326
25205
  props: {
25327
- style: {
25328
- touchAction: 'none'
25329
- },
25330
25206
  onClick: onControlClick,
25331
25207
  onPointerup: onControlMouseup,
25332
- onPointerdown: onUpControlMousedown
25208
+ onPointerdown: onUpControlMousedown,
25209
+ onPointercancel: onControlPointerCancel
25333
25210
  }
25334
25211
  };
25335
25212
  const decrementSlotProps = {
25336
25213
  props: {
25337
- style: {
25338
- touchAction: 'none'
25339
- },
25340
25214
  onClick: onControlClick,
25341
25215
  onPointerup: onControlMouseup,
25342
- onPointerdown: onDownControlMousedown
25216
+ onPointerdown: onDownControlMousedown,
25217
+ onPointercancel: onControlPointerCancel
25343
25218
  }
25344
25219
  };
25345
25220
  watch(() => props.precision, () => formatInputValue());
25346
- watch(() => props.minFractionDigits, () => formatInputValue());
25347
25221
  onMounted(() => {
25348
25222
  clampModel();
25349
25223
  });
@@ -25437,6 +25311,11 @@ const VNumberInput = genericComponent()({
25437
25311
  e.stopPropagation();
25438
25312
  holdStart('down');
25439
25313
  }
25314
+ function onControlPointerCancel(e) {
25315
+ const el = e.currentTarget;
25316
+ el?.releasePointerCapture(e.pointerId);
25317
+ holdStop();
25318
+ }
25440
25319
  function clampModel() {
25441
25320
  if (controlsDisabled.value) return;
25442
25321
  if (!vTextFieldRef.value) return;
@@ -25453,7 +25332,7 @@ const VNumberInput = genericComponent()({
25453
25332
  inputText.value = null;
25454
25333
  return;
25455
25334
  }
25456
- inputText.value = correctPrecision(model.value);
25335
+ inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25457
25336
  }
25458
25337
  function trimDecimalZeros() {
25459
25338
  if (controlsDisabled.value) return;
@@ -25488,8 +25367,8 @@ const VNumberInput = genericComponent()({
25488
25367
  "onClick": onControlClick,
25489
25368
  "onPointerdown": onUpControlMousedown,
25490
25369
  "onPointerup": onControlMouseup,
25370
+ "onPointercancel": onControlPointerCancel,
25491
25371
  "size": controlNodeSize.value,
25492
- "style": "touch-action: none",
25493
25372
  "tabindex": "-1"
25494
25373
  }, null) : createVNode(VDefaultsProvider, {
25495
25374
  "key": "increment-defaults",
@@ -25518,8 +25397,8 @@ const VNumberInput = genericComponent()({
25518
25397
  "onClick": onControlClick,
25519
25398
  "onPointerdown": onDownControlMousedown,
25520
25399
  "onPointerup": onControlMouseup,
25400
+ "onPointercancel": onControlPointerCancel,
25521
25401
  "size": controlNodeSize.value,
25522
- "style": "touch-action: none",
25523
25402
  "tabindex": "-1"
25524
25403
  }, null) : createVNode(VDefaultsProvider, {
25525
25404
  "key": "decrement-defaults",
@@ -25713,10 +25592,9 @@ const VOtpInput = genericComponent()({
25713
25592
  e.preventDefault();
25714
25593
  e.stopPropagation();
25715
25594
  const clipboardText = e?.clipboardData?.getData('Text').slice(0, length.value) ?? '';
25716
- const finalIndex = clipboardText.length - 1 === -1 ? index : clipboardText.length - 1;
25717
25595
  if (isValidNumber(clipboardText)) return;
25718
25596
  model.value = clipboardText.split('');
25719
- inputRef.value?.[finalIndex].focus();
25597
+ inputRef.value?.[index].blur();
25720
25598
  }
25721
25599
  function reset() {
25722
25600
  model.value = [];
@@ -29498,7 +29376,7 @@ function createVuetify$1() {
29498
29376
  };
29499
29377
  });
29500
29378
  }
29501
- const version$1 = "3.8.7-dev.2025-05-27";
29379
+ const version$1 = "3.8.7-master.2025-05-29";
29502
29380
  createVuetify$1.version = version$1;
29503
29381
 
29504
29382
  // Vue's inject() can only be used in setup
@@ -29523,7 +29401,7 @@ const createVuetify = function () {
29523
29401
  ...options
29524
29402
  });
29525
29403
  };
29526
- const version = "3.8.7-dev.2025-05-27";
29404
+ const version = "3.8.7-master.2025-05-29";
29527
29405
  createVuetify.version = version;
29528
29406
 
29529
29407
  export { index as blueprints, components, createVuetify, directives, useDate, useDefaults, useDisplay, useGoTo, useLayout, useLocale, useRtl, useTheme, version };