@vuetify/nightly 3.8.8-master.2025-06-10 → 3.8.9-dev.2025-06-12

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 (180) hide show
  1. package/CHANGELOG.md +44 -19
  2. package/dist/json/attributes.json +2771 -2411
  3. package/dist/json/importMap-labs.json +32 -28
  4. package/dist/json/importMap.json +128 -128
  5. package/dist/json/tags.json +96 -1
  6. package/dist/json/web-types.json +5703 -4391
  7. package/dist/vuetify-labs.cjs +635 -146
  8. package/dist/vuetify-labs.css +4248 -4214
  9. package/dist/vuetify-labs.d.ts +9097 -1977
  10. package/dist/vuetify-labs.esm.js +636 -147
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +635 -146
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +383 -135
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +5999 -5965
  17. package/dist/vuetify.d.ts +1586 -1085
  18. package/dist/vuetify.esm.js +384 -136
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +383 -135
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1219 -1203
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VAlert/VAlert.css +6 -1
  26. package/lib/components/VAlert/VAlert.d.ts +35 -0
  27. package/lib/components/VAlert/VAlert.js +15 -10
  28. package/lib/components/VAlert/VAlert.js.map +1 -1
  29. package/lib/components/VAlert/VAlert.sass +7 -1
  30. package/lib/components/VAppBar/VAppBar.d.ts +15 -3
  31. package/lib/components/VAppBar/VAppBarNavIcon.d.ts +20 -10
  32. package/lib/components/VAutocomplete/VAutocomplete.d.ts +154 -103
  33. package/lib/components/VAutocomplete/VAutocomplete.js +21 -3
  34. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  35. package/lib/components/VBadge/VBadge.d.ts +60 -0
  36. package/lib/components/VBadge/VBadge.js +7 -2
  37. package/lib/components/VBadge/VBadge.js.map +1 -1
  38. package/lib/components/VBtn/VBtn.d.ts +20 -10
  39. package/lib/components/VBtnGroup/VBtnGroup.css +30 -7
  40. package/lib/components/VBtnGroup/VBtnGroup.d.ts +58 -32
  41. package/lib/components/VBtnGroup/VBtnGroup.js +7 -3
  42. package/lib/components/VBtnGroup/VBtnGroup.js.map +1 -1
  43. package/lib/components/VBtnGroup/VBtnGroup.sass +44 -17
  44. package/lib/components/VBtnToggle/VBtnToggle.d.ts +25 -0
  45. package/lib/components/VCard/VCard.d.ts +20 -10
  46. package/lib/components/VCheckbox/VCheckbox.d.ts +23 -13
  47. package/lib/components/VCheckbox/VCheckboxBtn.d.ts +20 -10
  48. package/lib/components/VChip/VChip.d.ts +20 -10
  49. package/lib/components/VChipGroup/VChipGroup.d.ts +10 -0
  50. package/lib/components/VCombobox/VCombobox.d.ts +154 -103
  51. package/lib/components/VCombobox/VCombobox.js +22 -3
  52. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  53. package/lib/components/VDataTable/VDataTable.d.ts +60 -0
  54. package/lib/components/VDataTable/VDataTableHeaders.d.ts +13 -0
  55. package/lib/components/VDataTable/VDataTableHeaders.js +4 -2
  56. package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
  57. package/lib/components/VDataTable/VDataTableServer.d.ts +42 -0
  58. package/lib/components/VDataTable/VDataTableVirtual.d.ts +42 -0
  59. package/lib/components/VDatePicker/VDatePicker.d.ts +10 -0
  60. package/lib/components/VDatePicker/VDatePickerMonth.d.ts +10 -0
  61. package/lib/components/VDatePicker/VDatePickerMonth.js +1 -1
  62. package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
  63. package/lib/components/VExpansionPanel/VExpansionPanel.d.ts +20 -10
  64. package/lib/components/VExpansionPanel/VExpansionPanelTitle.d.ts +20 -10
  65. package/lib/components/VExpansionPanel/VExpansionPanels.d.ts +20 -10
  66. package/lib/components/VFab/VFab.d.ts +20 -10
  67. package/lib/components/VField/VField.d.ts +3 -3
  68. package/lib/components/VFileInput/VFileInput.d.ts +15 -15
  69. package/lib/components/VInfiniteScroll/VInfiniteScroll.d.ts +9 -3
  70. package/lib/components/VInfiniteScroll/VInfiniteScroll.js +29 -0
  71. package/lib/components/VInfiniteScroll/VInfiniteScroll.js.map +1 -1
  72. package/lib/components/VInput/VInput.d.ts +4 -4
  73. package/lib/components/VList/VList.d.ts +13 -0
  74. package/lib/components/VList/VList.js +4 -1
  75. package/lib/components/VList/VList.js.map +1 -1
  76. package/lib/components/VList/VListChildren.js.map +1 -1
  77. package/lib/components/VList/VListItem.d.ts +23 -10
  78. package/lib/components/VList/VListItem.js +7 -3
  79. package/lib/components/VList/VListItem.js.map +1 -1
  80. package/lib/components/VList/list.d.ts +9 -2
  81. package/lib/components/VList/list.js +7 -0
  82. package/lib/components/VList/list.js.map +1 -1
  83. package/lib/components/VNumberInput/VNumberInput.d.ts +103 -89
  84. package/lib/components/VNumberInput/VNumberInput.js +19 -4
  85. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  86. package/lib/components/VOtpInput/VOtpInput.js +2 -1
  87. package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
  88. package/lib/components/VOverlay/VOverlay.css +1 -1
  89. package/lib/components/VOverlay/_variables.scss +1 -1
  90. package/lib/components/VRadio/VRadio.d.ts +20 -10
  91. package/lib/components/VRadioGroup/VRadioGroup.d.ts +23 -13
  92. package/lib/components/VRangeSlider/VRangeSlider.d.ts +3 -3
  93. package/lib/components/VSelect/VSelect.d.ts +171 -107
  94. package/lib/components/VSelect/VSelect.js +21 -3
  95. package/lib/components/VSelect/VSelect.js.map +1 -1
  96. package/lib/components/VSelectionControl/VSelectionControl.d.ts +20 -10
  97. package/lib/components/VSelectionControlGroup/VSelectionControlGroup.d.ts +28 -14
  98. package/lib/components/VSlideGroup/VSlideGroup.d.ts +10 -0
  99. package/lib/components/VSlideGroup/VSlideGroup.js +2 -1
  100. package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
  101. package/lib/components/VSlider/VSlider.d.ts +3 -3
  102. package/lib/components/VSlider/VSliderThumb.d.ts +20 -10
  103. package/lib/components/VStepper/VStepperItem.d.ts +28 -14
  104. package/lib/components/VSwitch/VSwitch.d.ts +23 -13
  105. package/lib/components/VTable/VTable.css +6 -0
  106. package/lib/components/VTable/VTable.d.ts +55 -24
  107. package/lib/components/VTable/VTable.js +9 -2
  108. package/lib/components/VTable/VTable.js.map +1 -1
  109. package/lib/components/VTable/VTable.sass +14 -0
  110. package/lib/components/VTable/_variables.scss +1 -0
  111. package/lib/components/VTabs/VTab.d.ts +56 -28
  112. package/lib/components/VTabs/VTabs.d.ts +10 -0
  113. package/lib/components/VTextField/VTextField.d.ts +27 -27
  114. package/lib/components/VTextarea/VTextarea.d.ts +15 -15
  115. package/lib/components/VToolbar/VToolbar.d.ts +15 -3
  116. package/lib/components/VToolbar/VToolbar.js +6 -3
  117. package/lib/components/VToolbar/VToolbar.js.map +1 -1
  118. package/lib/composables/calendar.d.ts +6 -0
  119. package/lib/composables/calendar.js +2 -1
  120. package/lib/composables/calendar.js.map +1 -1
  121. package/lib/composables/date/DateAdapter.d.ts +3 -3
  122. package/lib/composables/date/DateAdapter.js.map +1 -1
  123. package/lib/composables/date/adapters/string.d.ts +54 -0
  124. package/lib/composables/date/adapters/string.js +153 -0
  125. package/lib/composables/date/adapters/string.js.map +1 -0
  126. package/lib/composables/date/adapters/vuetify.d.ts +1 -1
  127. package/lib/composables/date/adapters/vuetify.js +4 -4
  128. package/lib/composables/date/adapters/vuetify.js.map +1 -1
  129. package/lib/composables/date/date.d.ts +3 -3
  130. package/lib/composables/date/index.d.ts +1 -0
  131. package/lib/composables/date/index.js +1 -0
  132. package/lib/composables/date/index.js.map +1 -1
  133. package/lib/composables/filter.js +3 -0
  134. package/lib/composables/filter.js.map +1 -1
  135. package/lib/composables/iconSizes.d.ts +28 -0
  136. package/lib/composables/iconSizes.js +23 -0
  137. package/lib/composables/iconSizes.js.map +1 -0
  138. package/lib/composables/mask.d.ts +38 -0
  139. package/lib/composables/mask.js +183 -0
  140. package/lib/composables/mask.js.map +1 -0
  141. package/lib/composables/theme.d.ts +6 -1
  142. package/lib/composables/theme.js +94 -26
  143. package/lib/composables/theme.js.map +1 -1
  144. package/lib/composables/virtual.js +6 -1
  145. package/lib/composables/virtual.js.map +1 -1
  146. package/lib/directives/ripple/index.d.ts +2 -1
  147. package/lib/directives/ripple/index.js +12 -7
  148. package/lib/directives/ripple/index.js.map +1 -1
  149. package/lib/entry-bundler.d.ts +3 -3
  150. package/lib/entry-bundler.js +1 -1
  151. package/lib/entry-bundler.js.map +1 -1
  152. package/lib/framework.d.ts +72 -56
  153. package/lib/framework.js +1 -1
  154. package/lib/framework.js.map +1 -1
  155. package/lib/labs/VCalendar/VCalendar.d.ts +10 -0
  156. package/lib/labs/VColorInput/VColorInput.d.ts +3 -3
  157. package/lib/labs/VDateInput/VDateInput.d.ts +97 -87
  158. package/lib/labs/VFileUpload/VFileUpload.d.ts +3 -3
  159. package/lib/labs/VFileUpload/VFileUploadItem.d.ts +20 -10
  160. package/lib/labs/VIconBtn/VIconBtn.d.ts +29 -29
  161. package/lib/labs/VIconBtn/VIconBtn.js +7 -11
  162. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  163. package/lib/labs/VMaskInput/VMaskInput.d.ts +6993 -0
  164. package/lib/labs/VMaskInput/VMaskInput.js +67 -0
  165. package/lib/labs/VMaskInput/VMaskInput.js.map +1 -0
  166. package/lib/labs/VMaskInput/index.d.ts +1 -0
  167. package/lib/labs/VMaskInput/index.js +2 -0
  168. package/lib/labs/VMaskInput/index.js.map +1 -0
  169. package/lib/labs/VStepperVertical/VStepperVertical.d.ts +20 -10
  170. package/lib/labs/VStepperVertical/VStepperVerticalItem.d.ts +20 -10
  171. package/lib/labs/VTreeview/VTreeview.d.ts +13 -0
  172. package/lib/labs/VTreeview/VTreeviewItem.d.ts +20 -10
  173. package/lib/labs/components.d.ts +1 -0
  174. package/lib/labs/components.js +1 -0
  175. package/lib/labs/components.js.map +1 -1
  176. package/lib/labs/entry-bundler.d.ts +3 -3
  177. package/lib/util/globals.d.ts +1 -0
  178. package/lib/util/globals.js +1 -0
  179. package/lib/util/globals.js.map +1 -1
  180. package/package.json +3 -1
@@ -1,15 +1,16 @@
1
1
  /*!
2
- * Vuetify v3.8.8-master.2025-06-10
2
+ * Vuetify v3.8.9-dev.2025-06-12
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, camelize, isVNode, Comment, warn, getCurrentInstance as getCurrentInstance$1, ref, computed, provide, inject as inject$1, defineComponent as defineComponent$1, h, 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';
7
+ import { shallowRef, reactive, watchEffect, toRef, capitalize, unref, Fragment, camelize, isVNode, Comment, warn, getCurrentInstance as getCurrentInstance$1, ref, computed, provide, inject as inject$1, defineComponent as defineComponent$1, h, 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';
8
8
 
9
9
  const IN_BROWSER = typeof window !== 'undefined';
10
10
  const SUPPORTS_INTERSECTION = IN_BROWSER && 'IntersectionObserver' in window;
11
11
  const SUPPORTS_TOUCH = IN_BROWSER && ('ontouchstart' in window || window.navigator.maxTouchPoints > 0);
12
12
  const SUPPORTS_EYE_DROPPER = IN_BROWSER && 'EyeDropper' in window;
13
+ const SUPPORTS_MATCH_MEDIA = IN_BROWSER && 'matchMedia' in window && typeof window.matchMedia === 'function';
13
14
 
14
15
  function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
15
16
  function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
@@ -2831,6 +2832,7 @@ const makeThemeProps = propsFactory({
2831
2832
  function genDefaults$1() {
2832
2833
  return {
2833
2834
  defaultTheme: 'light',
2835
+ prefix: 'v-',
2834
2836
  variations: {
2835
2837
  colors: [],
2836
2838
  lighten: 0,
@@ -2912,7 +2914,10 @@ function genDefaults$1() {
2912
2914
  }
2913
2915
  }
2914
2916
  },
2915
- stylesheetId: 'vuetify-theme-stylesheet'
2917
+ stylesheetId: 'vuetify-theme-stylesheet',
2918
+ scoped: false,
2919
+ unimportant: false,
2920
+ utilities: true
2916
2921
  };
2917
2922
  }
2918
2923
  function parseThemeOptions() {
@@ -2935,21 +2940,21 @@ function parseThemeOptions() {
2935
2940
  function createCssClass(lines, selector, content, scope) {
2936
2941
  lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
2937
2942
  }
2938
- function genCssVariables(theme) {
2943
+ function genCssVariables(theme, prefix) {
2939
2944
  const lightOverlay = theme.dark ? 2 : 1;
2940
2945
  const darkOverlay = theme.dark ? 1 : 2;
2941
2946
  const variables = [];
2942
2947
  for (const [key, value] of Object.entries(theme.colors)) {
2943
2948
  const rgb = parseColor(value);
2944
- variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2949
+ variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2945
2950
  if (!key.startsWith('on-')) {
2946
- variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2951
+ variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2947
2952
  }
2948
2953
  }
2949
2954
  for (const [key, value] of Object.entries(theme.variables)) {
2950
2955
  const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
2951
2956
  const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
2952
- variables.push(`--v-${key}: ${rgb ?? value}`);
2957
+ variables.push(`--${prefix}${key}: ${rgb ?? value}`);
2953
2958
  }
2954
2959
  return variables;
2955
2960
  }
@@ -2993,7 +2998,8 @@ function getScopedSelector(selector, scope) {
2993
2998
  const scopeSelector = `:where(${scope})`;
2994
2999
  return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
2995
3000
  }
2996
- function upsertStyles(styleEl, styles) {
3001
+ function upsertStyles(id, cspNonce, styles) {
3002
+ const styleEl = getOrCreateStyleElement(id, cspNonce);
2997
3003
  if (!styleEl) return;
2998
3004
  styleEl.innerHTML = styles;
2999
3005
  }
@@ -3013,8 +3019,17 @@ function getOrCreateStyleElement(id, cspNonce) {
3013
3019
  // Composables
3014
3020
  function createTheme(options) {
3015
3021
  const parsedOptions = parseThemeOptions(options);
3016
- const name = shallowRef(parsedOptions.defaultTheme);
3022
+ const _name = shallowRef(parsedOptions.defaultTheme);
3017
3023
  const themes = ref(parsedOptions.themes);
3024
+ const systemName = shallowRef('light');
3025
+ const name = computed({
3026
+ get() {
3027
+ return _name.value === 'system' ? systemName.value : _name.value;
3028
+ },
3029
+ set(val) {
3030
+ _name.value = val;
3031
+ }
3032
+ });
3018
3033
  const computedThemes = computed(() => {
3019
3034
  const acc = {};
3020
3035
  for (const [name, original] of Object.entries(themes.value)) {
@@ -3035,28 +3050,49 @@ function createTheme(options) {
3035
3050
  const current = toRef(() => computedThemes.value[name.value]);
3036
3051
  const styles = computed(() => {
3037
3052
  const lines = [];
3053
+ const important = parsedOptions.unimportant ? '' : ' !important';
3054
+ const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
3038
3055
  if (current.value?.dark) {
3039
3056
  createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
3040
3057
  }
3041
- createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
3058
+ createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
3042
3059
  for (const [themeName, theme] of Object.entries(computedThemes.value)) {
3043
- createCssClass(lines, `.v-theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme)], parsedOptions.scope);
3044
- }
3045
- const bgLines = [];
3046
- const fgLines = [];
3047
- const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
3048
- for (const key of colors) {
3049
- if (key.startsWith('on-')) {
3050
- createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
3051
- } else {
3052
- 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);
3053
- createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
3054
- createCssClass(fgLines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`], parsedOptions.scope);
3060
+ createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
3061
+ }
3062
+ if (parsedOptions.utilities) {
3063
+ const bgLines = [];
3064
+ const fgLines = [];
3065
+ const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
3066
+ for (const key of colors) {
3067
+ if (key.startsWith('on-')) {
3068
+ createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
3069
+ } else {
3070
+ 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);
3071
+ createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
3072
+ createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
3073
+ }
3055
3074
  }
3075
+ lines.push(...bgLines, ...fgLines);
3056
3076
  }
3057
- lines.push(...bgLines, ...fgLines);
3058
3077
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
3059
3078
  });
3079
+ const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
3080
+ const themeNames = toRef(() => Object.keys(computedThemes.value));
3081
+ if (SUPPORTS_MATCH_MEDIA) {
3082
+ const media = window.matchMedia('(prefers-color-scheme: dark)');
3083
+ function updateSystemName() {
3084
+ systemName.value = media.matches ? 'dark' : 'light';
3085
+ }
3086
+ updateSystemName();
3087
+ media.addEventListener('change', updateSystemName, {
3088
+ passive: true
3089
+ });
3090
+ if (getCurrentScope()) {
3091
+ onScopeDispose(() => {
3092
+ media.removeEventListener('change', updateSystemName);
3093
+ });
3094
+ }
3095
+ }
3060
3096
  function install(app) {
3061
3097
  if (parsedOptions.isDisabled) return;
3062
3098
  const head = app._context.provides.usehead;
@@ -3094,22 +3130,55 @@ function createTheme(options) {
3094
3130
  updateStyles();
3095
3131
  }
3096
3132
  function updateStyles() {
3097
- upsertStyles(getOrCreateStyleElement(parsedOptions.stylesheetId, parsedOptions.cspNonce), styles.value);
3133
+ upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
3098
3134
  }
3099
3135
  }
3100
3136
  }
3101
- const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);
3137
+ function change(themeName) {
3138
+ if (!themeNames.value.includes(themeName)) {
3139
+ consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
3140
+ return;
3141
+ }
3142
+ name.value = themeName;
3143
+ }
3144
+ function cycle() {
3145
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
3146
+ const currentIndex = themeArray.indexOf(name.value);
3147
+ const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
3148
+ change(themeArray[nextIndex]);
3149
+ }
3150
+ function toggle() {
3151
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
3152
+ cycle(themeArray);
3153
+ }
3154
+ const globalName = new Proxy(name, {
3155
+ get(target, prop) {
3156
+ return target[prop];
3157
+ },
3158
+ set(target, prop, val) {
3159
+ if (prop === 'value') {
3160
+ deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
3161
+ }
3162
+ // @ts-expect-error
3163
+ target[prop] = val;
3164
+ return true;
3165
+ }
3166
+ });
3102
3167
  return {
3103
3168
  install,
3169
+ change,
3170
+ cycle,
3171
+ toggle,
3104
3172
  isDisabled: parsedOptions.isDisabled,
3105
3173
  name,
3106
3174
  themes,
3107
3175
  current,
3108
3176
  computedThemes,
3177
+ prefix: parsedOptions.prefix,
3109
3178
  themeClasses,
3110
3179
  styles,
3111
3180
  global: {
3112
- name,
3181
+ name: globalName,
3113
3182
  current
3114
3183
  }
3115
3184
  };
@@ -3120,7 +3189,7 @@ function provideTheme(props) {
3120
3189
  if (!theme) throw new Error('Could not find Vuetify theme injection');
3121
3190
  const name = toRef(() => props.theme ?? theme.name.value);
3122
3191
  const current = toRef(() => theme.themes.value[name.value]);
3123
- const themeClasses = toRef(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);
3192
+ const themeClasses = toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
3124
3193
  const newTheme = {
3125
3194
  ...theme,
3126
3195
  name,
@@ -4224,7 +4293,10 @@ const makeVToolbarProps = propsFactory({
4224
4293
  default: 'default',
4225
4294
  validator: v => allowedDensities$1.includes(v)
4226
4295
  },
4227
- extended: Boolean,
4296
+ extended: {
4297
+ type: Boolean,
4298
+ default: null
4299
+ },
4228
4300
  extensionHeight: {
4229
4301
  type: [Number, String],
4230
4302
  default: 48
@@ -4272,7 +4344,7 @@ const VToolbar = genericComponent()({
4272
4344
  const {
4273
4345
  rtlClasses
4274
4346
  } = useRtl();
4275
- const isExtended = shallowRef(!!(props.extended || slots.extension?.()));
4347
+ const isExtended = shallowRef(props.extended === null ? !!slots.extension?.() : props.extended);
4276
4348
  const contentHeight = computed(() => parseInt(Number(props.height) + (props.density === 'prominent' ? Number(props.height) : 0) - (props.density === 'comfortable' ? 8 : 0) - (props.density === 'compact' ? 16 : 0), 10));
4277
4349
  const extensionHeight = computed(() => isExtended.value ? parseInt(Number(props.extensionHeight) + (props.density === 'prominent' ? Number(props.extensionHeight) : 0) - (props.density === 'comfortable' ? 4 : 0) - (props.density === 'compact' ? 8 : 0), 10) : 0);
4278
4350
  provideDefaults({
@@ -4284,7 +4356,7 @@ const VToolbar = genericComponent()({
4284
4356
  const hasTitle = !!(props.title || slots.title);
4285
4357
  const hasImage = !!(slots.image || props.image);
4286
4358
  const extension = slots.extension?.();
4287
- isExtended.value = !!(props.extended || extension);
4359
+ isExtended.value = props.extended === null ? !!extension : props.extended;
4288
4360
  return createVNode(props.tag, {
4289
4361
  "class": normalizeClass(['v-toolbar', {
4290
4362
  'v-toolbar--absolute': props.absolute,
@@ -4667,9 +4739,15 @@ function useVariant(props) {
4667
4739
  };
4668
4740
  }
4669
4741
 
4742
+ // Types
4743
+
4670
4744
  const makeVBtnGroupProps = propsFactory({
4671
4745
  baseColor: String,
4672
4746
  divided: Boolean,
4747
+ direction: {
4748
+ type: String,
4749
+ default: 'horizontal'
4750
+ },
4673
4751
  ...makeBorderProps(),
4674
4752
  ...makeComponentProps(),
4675
4753
  ...makeDensityProps(),
@@ -4703,7 +4781,7 @@ const VBtnGroup = genericComponent()({
4703
4781
  } = useRounded(props);
4704
4782
  provideDefaults({
4705
4783
  VBtn: {
4706
- height: 'auto',
4784
+ height: toRef(() => props.direction === 'horizontal' ? 'auto' : null),
4707
4785
  baseColor: toRef(() => props.baseColor),
4708
4786
  color: toRef(() => props.color),
4709
4787
  density: toRef(() => props.density),
@@ -4713,7 +4791,7 @@ const VBtnGroup = genericComponent()({
4713
4791
  });
4714
4792
  useRender(() => {
4715
4793
  return createVNode(props.tag, {
4716
- "class": normalizeClass(['v-btn-group', {
4794
+ "class": normalizeClass(['v-btn-group', `v-btn-group--${props.direction}`, {
4717
4795
  'v-btn-group--divided': props.divided
4718
4796
  }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
4719
4797
  "style": normalizeStyle(props.style)
@@ -5836,8 +5914,8 @@ function rippleCancelShow(e) {
5836
5914
  window.clearTimeout(element._ripple.showTimer);
5837
5915
  }
5838
5916
  let keyboardRipple = false;
5839
- function keyboardRippleShow(e) {
5840
- if (!keyboardRipple && (e.keyCode === keyCodes.enter || e.keyCode === keyCodes.space)) {
5917
+ function keyboardRippleShow(e, keys) {
5918
+ if (!keyboardRipple && keys.includes(e.keyCode)) {
5841
5919
  keyboardRipple = true;
5842
5920
  rippleShow(e);
5843
5921
  }
@@ -5865,9 +5943,12 @@ function updateRipple(el, binding, wasEnabled) {
5865
5943
  el._ripple.enabled = enabled;
5866
5944
  el._ripple.centered = modifiers.center;
5867
5945
  el._ripple.circle = modifiers.circle;
5868
- if (isObject(value) && value.class) {
5869
- el._ripple.class = value.class;
5946
+ const bindingValue = isObject(value) ? value : {};
5947
+ if (bindingValue.class) {
5948
+ el._ripple.class = bindingValue.class;
5870
5949
  }
5950
+ const allowedKeys = bindingValue.keys ?? [keyCodes.enter, keyCodes.space];
5951
+ el._ripple.keyDownHandler = e => keyboardRippleShow(e, allowedKeys);
5871
5952
  if (enabled && !wasEnabled) {
5872
5953
  if (modifiers.stop) {
5873
5954
  el.addEventListener('touchstart', rippleStop, {
@@ -5889,7 +5970,7 @@ function updateRipple(el, binding, wasEnabled) {
5889
5970
  el.addEventListener('mousedown', rippleShow);
5890
5971
  el.addEventListener('mouseup', rippleHide);
5891
5972
  el.addEventListener('mouseleave', rippleHide);
5892
- el.addEventListener('keydown', keyboardRippleShow);
5973
+ el.addEventListener('keydown', e => keyboardRippleShow(e, allowedKeys));
5893
5974
  el.addEventListener('keyup', keyboardRippleHide);
5894
5975
  el.addEventListener('blur', focusRippleHide);
5895
5976
 
@@ -5909,7 +5990,9 @@ function removeListeners(el) {
5909
5990
  el.removeEventListener('touchcancel', rippleHide);
5910
5991
  el.removeEventListener('mouseup', rippleHide);
5911
5992
  el.removeEventListener('mouseleave', rippleHide);
5912
- el.removeEventListener('keydown', keyboardRippleShow);
5993
+ if (el._ripple?.keyDownHandler) {
5994
+ el.removeEventListener('keydown', el._ripple.keyDownHandler);
5995
+ }
5913
5996
  el.removeEventListener('keyup', keyboardRippleHide);
5914
5997
  el.removeEventListener('dragstart', rippleHide);
5915
5998
  el.removeEventListener('blur', focusRippleHide);
@@ -5918,8 +6001,8 @@ function mounted$4(el, binding) {
5918
6001
  updateRipple(el, binding, false);
5919
6002
  }
5920
6003
  function unmounted$4(el) {
5921
- delete el._ripple;
5922
6004
  removeListeners(el);
6005
+ delete el._ripple;
5923
6006
  }
5924
6007
  function updated$1(el, binding) {
5925
6008
  if (binding.value === binding.oldValue) {
@@ -6192,6 +6275,31 @@ const VAppBarTitle = genericComponent()({
6192
6275
  // Utilities
6193
6276
  const VAlertTitle = createSimpleFunctional('v-alert-title');
6194
6277
 
6278
+ // Utilities
6279
+
6280
+ // Types
6281
+
6282
+ // Types
6283
+
6284
+ // Composables
6285
+ const makeIconSizeProps = propsFactory({
6286
+ iconSize: [Number, String],
6287
+ iconSizes: {
6288
+ type: Array,
6289
+ default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
6290
+ }
6291
+ }, 'iconSize');
6292
+ function useIconSizes(props, fallback) {
6293
+ const iconSize = computed(() => {
6294
+ const iconSizeMap = new Map(props.iconSizes);
6295
+ const _iconSize = props.iconSize ?? fallback() ?? 'default';
6296
+ return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
6297
+ });
6298
+ return {
6299
+ iconSize
6300
+ };
6301
+ }
6302
+
6195
6303
  // Types
6196
6304
 
6197
6305
  const allowedTypes = ['success', 'info', 'warning', 'error'];
@@ -6231,6 +6339,7 @@ const makeVAlertProps = propsFactory({
6231
6339
  ...makeDensityProps(),
6232
6340
  ...makeDimensionProps(),
6233
6341
  ...makeElevationProps(),
6342
+ ...makeIconSizeProps(),
6234
6343
  ...makeLocationProps(),
6235
6344
  ...makePositionProps(),
6236
6345
  ...makeRoundedProps(),
@@ -6258,6 +6367,9 @@ const VAlert = genericComponent()({
6258
6367
  if (!props.type) return props.icon;
6259
6368
  return props.icon ?? `$${props.type}`;
6260
6369
  });
6370
+ const {
6371
+ iconSize
6372
+ } = useIconSizes(props, () => props.prominent ? 44 : 28);
6261
6373
  const {
6262
6374
  themeClasses
6263
6375
  } = provideTheme(props);
@@ -6305,6 +6417,11 @@ const VAlert = genericComponent()({
6305
6417
  const hasPrepend = !!(slots.prepend || icon.value);
6306
6418
  const hasTitle = !!(slots.title || props.title);
6307
6419
  const hasClose = !!(slots.close || props.closable);
6420
+ const iconProps = {
6421
+ density: props.density,
6422
+ icon: icon.value,
6423
+ size: iconSize.value
6424
+ };
6308
6425
  return isActive.value && createVNode(props.tag, {
6309
6426
  "class": normalizeClass(['v-alert', props.border && {
6310
6427
  'v-alert--border': !!props.border,
@@ -6322,19 +6439,14 @@ const VAlert = genericComponent()({
6322
6439
  }, null), hasPrepend && createElementVNode("div", {
6323
6440
  "key": "prepend",
6324
6441
  "class": "v-alert__prepend"
6325
- }, [!slots.prepend ? createVNode(VIcon, {
6326
- "key": "prepend-icon",
6327
- "density": props.density,
6328
- "icon": icon.value,
6329
- "size": props.prominent ? 44 : 28
6330
- }, null) : createVNode(VDefaultsProvider, {
6442
+ }, [!slots.prepend ? createVNode(VIcon, mergeProps({
6443
+ "key": "prepend-icon"
6444
+ }, iconProps), null) : createVNode(VDefaultsProvider, {
6331
6445
  "key": "prepend-defaults",
6332
6446
  "disabled": !icon.value,
6333
6447
  "defaults": {
6334
6448
  VIcon: {
6335
- density: props.density,
6336
- icon: icon.value,
6337
- size: props.prominent ? 44 : 28
6449
+ ...iconProps
6338
6450
  }
6339
6451
  }
6340
6452
  }, slots.prepend)]), createElementVNode("div", {
@@ -7859,6 +7971,7 @@ function getOffsetPosition(isHorizontal, element) {
7859
7971
  const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group');
7860
7972
  const makeVSlideGroupProps = propsFactory({
7861
7973
  centerActive: Boolean,
7974
+ contentClass: null,
7862
7975
  direction: {
7863
7976
  type: String,
7864
7977
  default: 'horizontal'
@@ -8171,7 +8284,7 @@ const VSlideGroup = genericComponent()({
8171
8284
  })]), createElementVNode("div", {
8172
8285
  "key": "container",
8173
8286
  "ref": containerRef,
8174
- "class": "v-slide-group__container",
8287
+ "class": normalizeClass(['v-slide-group__container', props.contentClass]),
8175
8288
  "onScroll": onScroll
8176
8289
  }, [createElementVNode("div", {
8177
8290
  "ref": contentRef,
@@ -8534,16 +8647,85 @@ const VChip = genericComponent()({
8534
8647
  }
8535
8648
  });
8536
8649
 
8650
+ const makeVDividerProps = propsFactory({
8651
+ color: String,
8652
+ inset: Boolean,
8653
+ length: [Number, String],
8654
+ opacity: [Number, String],
8655
+ thickness: [Number, String],
8656
+ vertical: Boolean,
8657
+ ...makeComponentProps(),
8658
+ ...makeThemeProps()
8659
+ }, 'VDivider');
8660
+ const VDivider = genericComponent()({
8661
+ name: 'VDivider',
8662
+ props: makeVDividerProps(),
8663
+ setup(props, _ref) {
8664
+ let {
8665
+ attrs,
8666
+ slots
8667
+ } = _ref;
8668
+ const {
8669
+ themeClasses
8670
+ } = provideTheme(props);
8671
+ const {
8672
+ textColorClasses,
8673
+ textColorStyles
8674
+ } = useTextColor(() => props.color);
8675
+ const dividerStyles = computed(() => {
8676
+ const styles = {};
8677
+ if (props.length) {
8678
+ styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
8679
+ }
8680
+ if (props.thickness) {
8681
+ styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
8682
+ }
8683
+ return styles;
8684
+ });
8685
+ useRender(() => {
8686
+ const divider = createElementVNode("hr", {
8687
+ "class": normalizeClass([{
8688
+ 'v-divider': true,
8689
+ 'v-divider--inset': props.inset,
8690
+ 'v-divider--vertical': props.vertical
8691
+ }, themeClasses.value, textColorClasses.value, props.class]),
8692
+ "style": normalizeStyle([dividerStyles.value, textColorStyles.value, {
8693
+ '--v-border-opacity': props.opacity
8694
+ }, props.style]),
8695
+ "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
8696
+ "role": `${attrs.role || 'separator'}`
8697
+ }, null);
8698
+ if (!slots.default) return divider;
8699
+ return createElementVNode("div", {
8700
+ "class": normalizeClass(['v-divider__wrapper', {
8701
+ 'v-divider__wrapper--vertical': props.vertical,
8702
+ 'v-divider__wrapper--inset': props.inset
8703
+ }])
8704
+ }, [divider, createElementVNode("div", {
8705
+ "class": "v-divider__content"
8706
+ }, [slots.default()]), divider]);
8707
+ });
8708
+ return {};
8709
+ }
8710
+ });
8711
+
8537
8712
  // Utilities
8538
8713
 
8539
8714
  // List
8540
8715
  const ListKey = Symbol.for('vuetify:list');
8541
8716
  function createList() {
8717
+ let {
8718
+ filterable
8719
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
8720
+ filterable: false
8721
+ };
8542
8722
  const parent = inject$1(ListKey, {
8723
+ filterable: false,
8543
8724
  hasPrepend: shallowRef(false),
8544
8725
  updateHasPrepend: () => null
8545
8726
  });
8546
8727
  const data = {
8728
+ filterable: parent.filterable || filterable,
8547
8729
  hasPrepend: shallowRef(false),
8548
8730
  updateHasPrepend: value => {
8549
8731
  if (value) data.hasPrepend.value = value;
@@ -9495,6 +9677,9 @@ const VListItem = genericComponent()({
9495
9677
  roundedClasses
9496
9678
  } = useRounded(roundedProps);
9497
9679
  const lineClasses = toRef(() => props.lines ? `v-list-item--${props.lines}-line` : undefined);
9680
+ const rippleOptions = toRef(() => props.ripple !== undefined && !!props.ripple && list?.filterable ? {
9681
+ keys: [keyCodes.enter]
9682
+ } : props.ripple);
9498
9683
  const slotProps = computed(() => ({
9499
9684
  isActive: isActive.value,
9500
9685
  select,
@@ -9519,8 +9704,9 @@ const VListItem = genericComponent()({
9519
9704
  function onKeyDown(e) {
9520
9705
  const target = e.target;
9521
9706
  if (['INPUT', 'TEXTAREA'].includes(target.tagName)) return;
9522
- if (e.key === 'Enter' || e.key === ' ') {
9707
+ if (e.key === 'Enter' || e.key === ' ' && !list?.filterable) {
9523
9708
  e.preventDefault();
9709
+ e.stopPropagation();
9524
9710
  e.target.dispatchEvent(new MouseEvent('click', e));
9525
9711
  }
9526
9712
  }
@@ -9630,7 +9816,7 @@ const VListItem = genericComponent()({
9630
9816
  }), createElementVNode("div", {
9631
9817
  "class": "v-list-item__spacer"
9632
9818
  }, null)])]
9633
- }), [[Ripple, isClickable.value && props.ripple]]);
9819
+ }), [[Ripple, isClickable.value && rippleOptions.value]]);
9634
9820
  });
9635
9821
  return {
9636
9822
  activate,
@@ -9685,68 +9871,6 @@ const VListSubheader = genericComponent()({
9685
9871
  }
9686
9872
  });
9687
9873
 
9688
- const makeVDividerProps = propsFactory({
9689
- color: String,
9690
- inset: Boolean,
9691
- length: [Number, String],
9692
- opacity: [Number, String],
9693
- thickness: [Number, String],
9694
- vertical: Boolean,
9695
- ...makeComponentProps(),
9696
- ...makeThemeProps()
9697
- }, 'VDivider');
9698
- const VDivider = genericComponent()({
9699
- name: 'VDivider',
9700
- props: makeVDividerProps(),
9701
- setup(props, _ref) {
9702
- let {
9703
- attrs,
9704
- slots
9705
- } = _ref;
9706
- const {
9707
- themeClasses
9708
- } = provideTheme(props);
9709
- const {
9710
- textColorClasses,
9711
- textColorStyles
9712
- } = useTextColor(() => props.color);
9713
- const dividerStyles = computed(() => {
9714
- const styles = {};
9715
- if (props.length) {
9716
- styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
9717
- }
9718
- if (props.thickness) {
9719
- styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
9720
- }
9721
- return styles;
9722
- });
9723
- useRender(() => {
9724
- const divider = createElementVNode("hr", {
9725
- "class": normalizeClass([{
9726
- 'v-divider': true,
9727
- 'v-divider--inset': props.inset,
9728
- 'v-divider--vertical': props.vertical
9729
- }, themeClasses.value, textColorClasses.value, props.class]),
9730
- "style": normalizeStyle([dividerStyles.value, textColorStyles.value, {
9731
- '--v-border-opacity': props.opacity
9732
- }, props.style]),
9733
- "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
9734
- "role": `${attrs.role || 'separator'}`
9735
- }, null);
9736
- if (!slots.default) return divider;
9737
- return createElementVNode("div", {
9738
- "class": normalizeClass(['v-divider__wrapper', {
9739
- 'v-divider__wrapper--vertical': props.vertical,
9740
- 'v-divider__wrapper--inset': props.inset
9741
- }])
9742
- }, [divider, createElementVNode("div", {
9743
- "class": "v-divider__content"
9744
- }, [slots.default()]), divider]);
9745
- });
9746
- return {};
9747
- }
9748
- });
9749
-
9750
9874
  // Types
9751
9875
 
9752
9876
  const makeVListChildrenProps = propsFactory({
@@ -10015,6 +10139,7 @@ const makeVListProps = propsFactory({
10015
10139
  activeClass: String,
10016
10140
  bgColor: String,
10017
10141
  disabled: Boolean,
10142
+ filterable: Boolean,
10018
10143
  expandIcon: IconValue,
10019
10144
  collapseIcon: IconValue,
10020
10145
  lines: {
@@ -10098,7 +10223,9 @@ const VList = genericComponent()({
10098
10223
  const activeColor = toRef(() => props.activeColor);
10099
10224
  const baseColor = toRef(() => props.baseColor);
10100
10225
  const color = toRef(() => props.color);
10101
- createList();
10226
+ createList({
10227
+ filterable: props.filterable
10228
+ });
10102
10229
  provideDefaults({
10103
10230
  VListGroup: {
10104
10231
  activeColor,
@@ -12675,7 +12802,12 @@ function useVirtual(props, items) {
12675
12802
  }
12676
12803
  function calculateOffset(index) {
12677
12804
  index = clamp(index, 0, items.value.length - 1);
12678
- return offsets[index] || 0;
12805
+ const whole = Math.floor(index);
12806
+ const fraction = index % 1;
12807
+ const next = whole + 1;
12808
+ const wholeOffset = offsets[whole] || 0;
12809
+ const nextOffset = offsets[next] || wholeOffset;
12810
+ return wholeOffset + (nextOffset - wholeOffset) * fraction;
12679
12811
  }
12680
12812
  function calculateIndex(scrollTop) {
12681
12813
  return binaryClosest(offsets, scrollTop);
@@ -13029,6 +13161,7 @@ const makeSelectProps = propsFactory({
13029
13161
  },
13030
13162
  openOnClear: Boolean,
13031
13163
  itemColor: String,
13164
+ noAutoScroll: Boolean,
13032
13165
  ...makeItemsProps({
13033
13166
  itemChildren: false
13034
13167
  })
@@ -13243,7 +13376,7 @@ const VSelect = genericComponent()({
13243
13376
  watch(menu, () => {
13244
13377
  if (!props.hideSelected && menu.value && model.value.length) {
13245
13378
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
13246
- IN_BROWSER && window.requestAnimationFrame(() => {
13379
+ IN_BROWSER && !props.noAutoScroll && window.requestAnimationFrame(() => {
13247
13380
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
13248
13381
  });
13249
13382
  }
@@ -13336,6 +13469,22 @@ const VSelect = genericComponent()({
13336
13469
  key: item.value,
13337
13470
  onClick: () => select(item, null)
13338
13471
  });
13472
+ if (item.raw.type === 'divider') {
13473
+ return slots.divider?.({
13474
+ props: item.raw,
13475
+ index
13476
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
13477
+ "key": `divider-${index}`
13478
+ }), null);
13479
+ }
13480
+ if (item.raw.type === 'subheader') {
13481
+ return slots.subheader?.({
13482
+ props: item.raw,
13483
+ index
13484
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
13485
+ "key": `subheader-${index}`
13486
+ }), null);
13487
+ }
13339
13488
  return slots.item?.({
13340
13489
  item,
13341
13490
  index,
@@ -13496,6 +13645,9 @@ function filterItems(items, query, options) {
13496
13645
  let match = -1;
13497
13646
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13498
13647
  if (typeof item === 'object') {
13648
+ if (['divider', 'subheader'].includes(item.raw?.type)) {
13649
+ continue;
13650
+ }
13499
13651
  const filterKeys = keys || Object.keys(transformed);
13500
13652
  for (const key of filterKeys) {
13501
13653
  const value = getPropertyFromItem(transformed, key);
@@ -13698,7 +13850,7 @@ const VAutocomplete = genericComponent()({
13698
13850
  menu.value = !menu.value;
13699
13851
  }
13700
13852
  function onListKeydown(e) {
13701
- if (e.key !== ' ' && checkPrintable(e)) {
13853
+ if (checkPrintable(e) || e.key === 'Backspace') {
13702
13854
  vTextFieldRef.value?.focus();
13703
13855
  }
13704
13856
  }
@@ -13903,6 +14055,7 @@ const VAutocomplete = genericComponent()({
13903
14055
  }, props.menuProps), {
13904
14056
  default: () => [hasList && createVNode(VList, mergeProps({
13905
14057
  "ref": listRef,
14058
+ "filterable": true,
13906
14059
  "selected": selectedValues.value,
13907
14060
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
13908
14061
  "onMousedown": e => e.preventDefault(),
@@ -13934,6 +14087,22 @@ const VAutocomplete = genericComponent()({
13934
14087
  active: highlightFirst.value && index === 0 ? true : undefined,
13935
14088
  onClick: () => select(item, null)
13936
14089
  });
14090
+ if (item.raw.type === 'divider') {
14091
+ return slots.divider?.({
14092
+ props: item.raw,
14093
+ index
14094
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
14095
+ "key": `divider-${index}`
14096
+ }), null);
14097
+ }
14098
+ if (item.raw.type === 'subheader') {
14099
+ return slots.subheader?.({
14100
+ props: item.raw,
14101
+ index
14102
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
14103
+ "key": `subheader-${index}`
14104
+ }), null);
14105
+ }
13937
14106
  return slots.item?.({
13938
14107
  item,
13939
14108
  index,
@@ -14078,7 +14247,8 @@ const makeVBadgeProps = propsFactory({
14078
14247
  ...makeThemeProps(),
14079
14248
  ...makeTransitionProps({
14080
14249
  transition: 'scale-rotate-transition'
14081
- })
14250
+ }),
14251
+ ...makeDimensionProps()
14082
14252
  }, 'VBadge');
14083
14253
  const VBadge = genericComponent()({
14084
14254
  name: 'VBadge',
@@ -14108,6 +14278,9 @@ const VBadge = genericComponent()({
14108
14278
  const base = props.floating ? props.dot ? 2 : 4 : props.dot ? 8 : 12;
14109
14279
  return base + (['top', 'bottom'].includes(side) ? Number(props.offsetY ?? 0) : ['left', 'right'].includes(side) ? Number(props.offsetX ?? 0) : 0);
14110
14280
  });
14281
+ const {
14282
+ dimensionStyles
14283
+ } = useDimension(props);
14111
14284
  useRender(() => {
14112
14285
  const value = Number(props.content);
14113
14286
  const content = !props.max || isNaN(value) ? props.content : value <= Number(props.max) ? value : `${props.max}+`;
@@ -14129,7 +14302,7 @@ const VBadge = genericComponent()({
14129
14302
  }, {
14130
14303
  default: () => [withDirectives(createElementVNode("span", mergeProps({
14131
14304
  "class": ['v-badge__badge', themeClasses.value, backgroundColorClasses.value, roundedClasses.value, textColorClasses.value],
14132
- "style": [backgroundColorStyles.value, textColorStyles.value, props.inline ? {} : locationStyles.value],
14305
+ "style": [backgroundColorStyles.value, textColorStyles.value, dimensionStyles.value, props.inline ? {} : locationStyles.value],
14133
14306
  "aria-atomic": "true",
14134
14307
  "aria-label": t(props.label, value),
14135
14308
  "aria-live": "polite",
@@ -17538,13 +17711,13 @@ function date(value) {
17538
17711
  return null;
17539
17712
  }
17540
17713
  const sundayJanuarySecond2000 = new Date(2000, 0, 2);
17541
- function getWeekdays(locale, firstDayOfWeek) {
17714
+ function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
17542
17715
  const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
17543
17716
  return createRange(7).map(i => {
17544
17717
  const weekday = new Date(sundayJanuarySecond2000);
17545
17718
  weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
17546
17719
  return new Intl.DateTimeFormat(locale, {
17547
- weekday: 'narrow'
17720
+ weekday: weekdayFormat ?? 'narrow'
17548
17721
  }).format(weekday);
17549
17722
  });
17550
17723
  }
@@ -18008,9 +18181,9 @@ class VuetifyDateAdapter {
18008
18181
  getDiff(date, comparing, unit) {
18009
18182
  return getDiff(date, comparing, unit);
18010
18183
  }
18011
- getWeekdays(firstDayOfWeek) {
18184
+ getWeekdays(firstDayOfWeek, weekdayFormat) {
18012
18185
  const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
18013
- return getWeekdays(this.locale, firstDay);
18186
+ return getWeekdays(this.locale, firstDay, weekdayFormat);
18014
18187
  }
18015
18188
  getYear(date) {
18016
18189
  return getYear(date);
@@ -18365,6 +18538,7 @@ const VCombobox = genericComponent()({
18365
18538
  _search.value = val ?? '';
18366
18539
  if (!props.multiple && !hasSelectionSlot.value) {
18367
18540
  model.value = [transformItem$3(props, val)];
18541
+ nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18368
18542
  }
18369
18543
  if (val && props.multiple && props.delimiters?.length) {
18370
18544
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18445,7 +18619,7 @@ const VCombobox = genericComponent()({
18445
18619
  menu.value = !menu.value;
18446
18620
  }
18447
18621
  function onListKeydown(e) {
18448
- if (e.key !== ' ' && checkPrintable(e)) {
18622
+ if (checkPrintable(e) || e.key === 'Backspace') {
18449
18623
  vTextFieldRef.value?.focus();
18450
18624
  }
18451
18625
  }
@@ -18650,6 +18824,7 @@ const VCombobox = genericComponent()({
18650
18824
  }, props.menuProps), {
18651
18825
  default: () => [hasList && createVNode(VList, mergeProps({
18652
18826
  "ref": listRef,
18827
+ "filterable": true,
18653
18828
  "selected": selectedValues.value,
18654
18829
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
18655
18830
  "onMousedown": e => e.preventDefault(),
@@ -18681,6 +18856,22 @@ const VCombobox = genericComponent()({
18681
18856
  active: highlightFirst.value && index === 0 ? true : undefined,
18682
18857
  onClick: () => select(item, null)
18683
18858
  });
18859
+ if (item.raw.type === 'divider') {
18860
+ return slots.divider?.({
18861
+ props: item.raw,
18862
+ index
18863
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
18864
+ "key": `divider-${index}`
18865
+ }), null);
18866
+ }
18867
+ if (item.raw.type === 'subheader') {
18868
+ return slots.subheader?.({
18869
+ props: item.raw,
18870
+ index
18871
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
18872
+ "key": `subheader-${index}`
18873
+ }), null);
18874
+ }
18684
18875
  return slots.item?.({
18685
18876
  item,
18686
18877
  index,
@@ -20563,6 +20754,7 @@ const makeVDataTableHeadersProps = propsFactory({
20563
20754
  color: String,
20564
20755
  disableSort: Boolean,
20565
20756
  fixedHeader: Boolean,
20757
+ lastFixed: Boolean,
20566
20758
  multiSort: Boolean,
20567
20759
  sortAscIcon: {
20568
20760
  type: IconValue,
@@ -20609,10 +20801,11 @@ const VDataTableHeaders = genericComponent()({
20609
20801
  loaderClasses
20610
20802
  } = useLoader(props);
20611
20803
  function getFixedStyles(column, y) {
20612
- if (!(props.sticky || props.fixedHeader) && !column.fixed) return undefined;
20804
+ if (!(props.sticky || props.fixedHeader) && !(column.fixed || column.lastFixed)) return undefined;
20613
20805
  return {
20614
20806
  position: 'sticky',
20615
- left: column.fixed ? convertToUnit(column.fixedOffset) : undefined,
20807
+ left: column.fixed || column.lastFixed ? convertToUnit(column.fixedOffset) : undefined,
20808
+ right: column.lastFixed ? convertToUnit(column.fixedOffset ?? 0) : undefined,
20616
20809
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
20617
20810
  };
20618
20811
  }
@@ -21128,11 +21321,18 @@ const VDataTableRows = genericComponent()({
21128
21321
  }
21129
21322
  });
21130
21323
 
21324
+ // Types
21325
+
21131
21326
  const makeVTableProps = propsFactory({
21132
21327
  fixedHeader: Boolean,
21133
21328
  fixedFooter: Boolean,
21134
21329
  height: [Number, String],
21135
21330
  hover: Boolean,
21331
+ striped: {
21332
+ type: String,
21333
+ default: null,
21334
+ validator: v => ['even', 'odd'].includes(v)
21335
+ },
21136
21336
  ...makeComponentProps(),
21137
21337
  ...makeDensityProps(),
21138
21338
  ...makeTagProps(),
@@ -21159,7 +21359,9 @@ const VTable = genericComponent()({
21159
21359
  'v-table--fixed-footer': props.fixedFooter,
21160
21360
  'v-table--has-top': !!slots.top,
21161
21361
  'v-table--has-bottom': !!slots.bottom,
21162
- 'v-table--hover': props.hover
21362
+ 'v-table--hover': props.hover,
21363
+ 'v-table--striped-even': props.striped === 'even',
21364
+ 'v-table--striped-odd': props.striped === 'odd'
21163
21365
  }, themeClasses.value, densityClasses.value, props.class]),
21164
21366
  "style": normalizeStyle(props.style)
21165
21367
  }, {
@@ -22334,7 +22536,8 @@ const makeCalendarProps = propsFactory({
22334
22536
  firstDayOfWeek: {
22335
22537
  type: [Number, String],
22336
22538
  default: undefined
22337
- }
22539
+ },
22540
+ weekdayFormat: String
22338
22541
  }, 'calendar');
22339
22542
  function useCalendar(props) {
22340
22543
  const adapter = useDate();
@@ -22575,7 +22778,7 @@ const VDatePickerMonth = genericComponent()({
22575
22778
  "ref": daysRef,
22576
22779
  "key": daysInMonth.value[0].date?.toString(),
22577
22780
  "class": "v-date-picker-month__days"
22578
- }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => createElementVNode("div", {
22781
+ }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => createElementVNode("div", {
22579
22782
  "class": normalizeClass(['v-date-picker-month__day', 'v-date-picker-month__weekday'])
22580
22783
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22581
22784
  const slotProps = {
@@ -24190,6 +24393,9 @@ const VInfiniteScroll = genericComponent()({
24190
24393
  startStatus.value = status;
24191
24394
  } else if (side === 'end') {
24192
24395
  endStatus.value = status;
24396
+ } else if (side === 'both') {
24397
+ startStatus.value = status;
24398
+ endStatus.value = status;
24193
24399
  }
24194
24400
  }
24195
24401
  function getStatus(side) {
@@ -24301,6 +24507,32 @@ const VInfiniteScroll = genericComponent()({
24301
24507
  }, [renderSide('end', endStatus.value)])]
24302
24508
  });
24303
24509
  });
24510
+ function reset(side) {
24511
+ const effectiveSide = side ?? props.side;
24512
+ setStatus(effectiveSide, 'ok');
24513
+ nextTick(() => {
24514
+ setScrollAmount(getScrollSize() - previousScrollSize + getScrollAmount());
24515
+ if (props.mode !== 'manual') {
24516
+ nextTick(() => {
24517
+ window.requestAnimationFrame(() => {
24518
+ window.requestAnimationFrame(() => {
24519
+ window.requestAnimationFrame(() => {
24520
+ if (effectiveSide === 'both') {
24521
+ intersecting('start');
24522
+ intersecting('end');
24523
+ } else {
24524
+ intersecting(effectiveSide);
24525
+ }
24526
+ });
24527
+ });
24528
+ });
24529
+ });
24530
+ }
24531
+ });
24532
+ }
24533
+ return {
24534
+ reset
24535
+ };
24304
24536
  }
24305
24537
  });
24306
24538
 
@@ -25219,6 +25451,10 @@ const makeVNumberInputProps = propsFactory({
25219
25451
  type: Number,
25220
25452
  default: 0
25221
25453
  },
25454
+ minFractionDigits: {
25455
+ type: Number,
25456
+ default: null
25457
+ },
25222
25458
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
25223
25459
  }, 'VNumberInput');
25224
25460
  const VNumberInput = genericComponent()({
@@ -25246,9 +25482,19 @@ const VNumberInput = genericComponent()({
25246
25482
  const isFocused = shallowRef(props.focused);
25247
25483
  function correctPrecision(val) {
25248
25484
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
25249
- const fixed = precision == null ? String(val) : val.toFixed(precision);
25250
- return isFocused.value ? Number(fixed).toString() // trim zeros
25251
- : fixed;
25485
+ if (precision == null) {
25486
+ return String(val);
25487
+ }
25488
+ let fixed = val.toFixed(precision);
25489
+ if (isFocused.value) {
25490
+ return Number(fixed).toString(); // trim zeros
25491
+ }
25492
+ if ((props.minFractionDigits ?? precision) < precision) {
25493
+ const trimLimit = precision - props.minFractionDigits;
25494
+ const [baseDigits, fractionDigits] = fixed.split('.');
25495
+ fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
25496
+ }
25497
+ return fixed;
25252
25498
  }
25253
25499
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
25254
25500
  const _inputText = shallowRef(null);
@@ -25303,6 +25549,7 @@ const VNumberInput = genericComponent()({
25303
25549
  }
25304
25550
  };
25305
25551
  watch(() => props.precision, () => formatInputValue());
25552
+ watch(() => props.minFractionDigits, () => formatInputValue());
25306
25553
  onMounted(() => {
25307
25554
  clampModel();
25308
25555
  });
@@ -25417,7 +25664,7 @@ const VNumberInput = genericComponent()({
25417
25664
  inputText.value = null;
25418
25665
  return;
25419
25666
  }
25420
- inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25667
+ inputText.value = correctPrecision(model.value);
25421
25668
  }
25422
25669
  function trimDecimalZeros() {
25423
25670
  if (controlsDisabled.value) return;
@@ -25677,9 +25924,10 @@ const VOtpInput = genericComponent()({
25677
25924
  e.preventDefault();
25678
25925
  e.stopPropagation();
25679
25926
  const clipboardText = e?.clipboardData?.getData('Text').trim().slice(0, length.value) ?? '';
25927
+ const finalIndex = clipboardText.length - 1 === -1 ? index : clipboardText.length - 1;
25680
25928
  if (isValidNumber(clipboardText)) return;
25681
25929
  model.value = clipboardText.split('');
25682
- inputRef.value?.[index].blur();
25930
+ inputRef.value?.[finalIndex].focus();
25683
25931
  }
25684
25932
  function reset() {
25685
25933
  model.value = [];
@@ -29464,7 +29712,7 @@ function createVuetify$1() {
29464
29712
  };
29465
29713
  });
29466
29714
  }
29467
- const version$1 = "3.8.8-master.2025-06-10";
29715
+ const version$1 = "3.8.9-dev.2025-06-12";
29468
29716
  createVuetify$1.version = version$1;
29469
29717
 
29470
29718
  // Vue's inject() can only be used in setup
@@ -29489,7 +29737,7 @@ const createVuetify = function () {
29489
29737
  ...options
29490
29738
  });
29491
29739
  };
29492
- const version = "3.8.8-master.2025-06-10";
29740
+ const version = "3.8.9-dev.2025-06-12";
29493
29741
  createVuetify.version = version;
29494
29742
 
29495
29743
  export { index as blueprints, components, createVuetify, directives, useDate, useDefaults, useDisplay, useGoTo, useLayout, useLocale, useRtl, useTheme, version };