@vuetify/nightly 3.8.7-master.2025-06-03 → 3.8.8-dev.2025-06-08

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 (170) hide show
  1. package/CHANGELOG.md +30 -15
  2. package/dist/json/attributes.json +3542 -3418
  3. package/dist/json/importMap-labs.json +18 -18
  4. package/dist/json/importMap.json +168 -168
  5. package/dist/json/tags.json +32 -1
  6. package/dist/json/web-types.json +6581 -6195
  7. package/dist/vuetify-labs.cjs +369 -147
  8. package/dist/vuetify-labs.css +3246 -3212
  9. package/dist/vuetify-labs.d.ts +2433 -1899
  10. package/dist/vuetify-labs.esm.js +370 -148
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +369 -147
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +363 -136
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +3712 -3678
  17. package/dist/vuetify.d.ts +1588 -1094
  18. package/dist/vuetify.esm.js +364 -137
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +363 -136
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1224 -1206
  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/VInput/VInput.d.ts +4 -4
  70. package/lib/components/VList/VList.d.ts +13 -0
  71. package/lib/components/VList/VList.js +4 -1
  72. package/lib/components/VList/VList.js.map +1 -1
  73. package/lib/components/VList/VListChildren.js.map +1 -1
  74. package/lib/components/VList/VListItem.d.ts +23 -10
  75. package/lib/components/VList/VListItem.js +7 -3
  76. package/lib/components/VList/VListItem.js.map +1 -1
  77. package/lib/components/VList/list.d.ts +9 -2
  78. package/lib/components/VList/list.js +7 -0
  79. package/lib/components/VList/list.js.map +1 -1
  80. package/lib/components/VNumberInput/VNumberInput.d.ts +103 -89
  81. package/lib/components/VNumberInput/VNumberInput.js +19 -4
  82. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  83. package/lib/components/VOtpInput/VOtpInput.js +2 -1
  84. package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
  85. package/lib/components/VOverlay/VOverlay.css +1 -1
  86. package/lib/components/VOverlay/_variables.scss +1 -1
  87. package/lib/components/VRadio/VRadio.d.ts +20 -10
  88. package/lib/components/VRadioGroup/VRadioGroup.d.ts +23 -13
  89. package/lib/components/VRangeSlider/VRangeSlider.d.ts +3 -3
  90. package/lib/components/VSelect/VSelect.d.ts +171 -107
  91. package/lib/components/VSelect/VSelect.js +21 -3
  92. package/lib/components/VSelect/VSelect.js.map +1 -1
  93. package/lib/components/VSelectionControl/VSelectionControl.d.ts +20 -10
  94. package/lib/components/VSelectionControlGroup/VSelectionControlGroup.d.ts +28 -14
  95. package/lib/components/VSlideGroup/VSlideGroup.d.ts +10 -0
  96. package/lib/components/VSlideGroup/VSlideGroup.js +2 -1
  97. package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
  98. package/lib/components/VSlider/VSlider.d.ts +3 -3
  99. package/lib/components/VSlider/VSliderThumb.d.ts +20 -10
  100. package/lib/components/VStepper/VStepperItem.d.ts +28 -14
  101. package/lib/components/VSwitch/VSwitch.d.ts +23 -13
  102. package/lib/components/VTable/VTable.css +6 -0
  103. package/lib/components/VTable/VTable.d.ts +55 -24
  104. package/lib/components/VTable/VTable.js +9 -2
  105. package/lib/components/VTable/VTable.js.map +1 -1
  106. package/lib/components/VTable/VTable.sass +14 -0
  107. package/lib/components/VTable/_variables.scss +1 -0
  108. package/lib/components/VTabs/VTab.d.ts +56 -28
  109. package/lib/components/VTabs/VTabs.d.ts +10 -0
  110. package/lib/components/VTextField/VTextField.d.ts +27 -27
  111. package/lib/components/VTextarea/VTextarea.d.ts +15 -15
  112. package/lib/components/VToolbar/VToolbar.d.ts +15 -3
  113. package/lib/components/VToolbar/VToolbar.js +6 -3
  114. package/lib/components/VToolbar/VToolbar.js.map +1 -1
  115. package/lib/composables/calendar.d.ts +6 -0
  116. package/lib/composables/calendar.js +2 -1
  117. package/lib/composables/calendar.js.map +1 -1
  118. package/lib/composables/date/DateAdapter.d.ts +3 -3
  119. package/lib/composables/date/DateAdapter.js.map +1 -1
  120. package/lib/composables/date/adapters/string.d.ts +54 -0
  121. package/lib/composables/date/adapters/string.js +153 -0
  122. package/lib/composables/date/adapters/string.js.map +1 -0
  123. package/lib/composables/date/adapters/vuetify.d.ts +1 -1
  124. package/lib/composables/date/adapters/vuetify.js +4 -4
  125. package/lib/composables/date/adapters/vuetify.js.map +1 -1
  126. package/lib/composables/date/date.d.ts +3 -3
  127. package/lib/composables/date/index.d.ts +1 -0
  128. package/lib/composables/date/index.js +1 -0
  129. package/lib/composables/date/index.js.map +1 -1
  130. package/lib/composables/filter.js +3 -0
  131. package/lib/composables/filter.js.map +1 -1
  132. package/lib/composables/iconSizes.d.ts +28 -0
  133. package/lib/composables/iconSizes.js +23 -0
  134. package/lib/composables/iconSizes.js.map +1 -0
  135. package/lib/composables/list-items.js +2 -2
  136. package/lib/composables/list-items.js.map +1 -1
  137. package/lib/composables/theme.d.ts +6 -1
  138. package/lib/composables/theme.js +94 -26
  139. package/lib/composables/theme.js.map +1 -1
  140. package/lib/composables/virtual.js +6 -1
  141. package/lib/composables/virtual.js.map +1 -1
  142. package/lib/directives/ripple/index.d.ts +2 -1
  143. package/lib/directives/ripple/index.js +12 -7
  144. package/lib/directives/ripple/index.js.map +1 -1
  145. package/lib/entry-bundler.d.ts +3 -3
  146. package/lib/entry-bundler.js +1 -1
  147. package/lib/entry-bundler.js.map +1 -1
  148. package/lib/framework.d.ts +83 -68
  149. package/lib/framework.js +1 -1
  150. package/lib/framework.js.map +1 -1
  151. package/lib/labs/VCalendar/VCalendar.d.ts +10 -0
  152. package/lib/labs/VColorInput/VColorInput.d.ts +3 -3
  153. package/lib/labs/VDateInput/VDateInput.d.ts +97 -87
  154. package/lib/labs/VFileUpload/VFileUpload.d.ts +3 -3
  155. package/lib/labs/VFileUpload/VFileUploadItem.d.ts +20 -10
  156. package/lib/labs/VIconBtn/VIconBtn.d.ts +29 -29
  157. package/lib/labs/VIconBtn/VIconBtn.js +7 -11
  158. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  159. package/lib/labs/VStepperVertical/VStepperVertical.d.ts +20 -10
  160. package/lib/labs/VStepperVertical/VStepperVerticalItem.d.ts +20 -10
  161. package/lib/labs/VTreeview/VTreeview.d.ts +13 -0
  162. package/lib/labs/VTreeview/VTreeviewItem.d.ts +20 -10
  163. package/lib/labs/entry-bundler.d.ts +3 -3
  164. package/lib/util/globals.d.ts +1 -0
  165. package/lib/util/globals.js +1 -0
  166. package/lib/util/globals.js.map +1 -1
  167. package/lib/util/helpers.d.ts +1 -0
  168. package/lib/util/helpers.js +9 -1
  169. package/lib/util/helpers.js.map +1 -1
  170. package/package.json +3 -1
@@ -1,15 +1,16 @@
1
1
  /*!
2
- * Vuetify v3.8.7-master.2025-06-03
2
+ * Vuetify v3.8.8-dev.2025-06-08
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, 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, camelize, unref, Fragment, 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"); }
@@ -525,6 +526,14 @@ function extractNumber(text, decimalDigitsLimit) {
525
526
  }
526
527
  return cleanText;
527
528
  }
529
+ function camelizeProps(props) {
530
+ if (!props) return;
531
+ const out = {};
532
+ for (const prop in props) {
533
+ out[camelize(prop)] = props[prop];
534
+ }
535
+ return out;
536
+ }
528
537
 
529
538
  // Utilities
530
539
  const block = ['top', 'bottom'];
@@ -2824,6 +2833,7 @@ const makeThemeProps = propsFactory({
2824
2833
  function genDefaults$1() {
2825
2834
  return {
2826
2835
  defaultTheme: 'light',
2836
+ prefix: 'v-',
2827
2837
  variations: {
2828
2838
  colors: [],
2829
2839
  lighten: 0,
@@ -2905,7 +2915,10 @@ function genDefaults$1() {
2905
2915
  }
2906
2916
  }
2907
2917
  },
2908
- stylesheetId: 'vuetify-theme-stylesheet'
2918
+ stylesheetId: 'vuetify-theme-stylesheet',
2919
+ scoped: false,
2920
+ unimportant: false,
2921
+ utilities: true
2909
2922
  };
2910
2923
  }
2911
2924
  function parseThemeOptions() {
@@ -2928,21 +2941,21 @@ function parseThemeOptions() {
2928
2941
  function createCssClass(lines, selector, content, scope) {
2929
2942
  lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
2930
2943
  }
2931
- function genCssVariables(theme) {
2944
+ function genCssVariables(theme, prefix) {
2932
2945
  const lightOverlay = theme.dark ? 2 : 1;
2933
2946
  const darkOverlay = theme.dark ? 1 : 2;
2934
2947
  const variables = [];
2935
2948
  for (const [key, value] of Object.entries(theme.colors)) {
2936
2949
  const rgb = parseColor(value);
2937
- variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2950
+ variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2938
2951
  if (!key.startsWith('on-')) {
2939
- variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2952
+ variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2940
2953
  }
2941
2954
  }
2942
2955
  for (const [key, value] of Object.entries(theme.variables)) {
2943
2956
  const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
2944
2957
  const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
2945
- variables.push(`--v-${key}: ${rgb ?? value}`);
2958
+ variables.push(`--${prefix}${key}: ${rgb ?? value}`);
2946
2959
  }
2947
2960
  return variables;
2948
2961
  }
@@ -2986,7 +2999,8 @@ function getScopedSelector(selector, scope) {
2986
2999
  const scopeSelector = `:where(${scope})`;
2987
3000
  return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
2988
3001
  }
2989
- function upsertStyles(styleEl, styles) {
3002
+ function upsertStyles(id, cspNonce, styles) {
3003
+ const styleEl = getOrCreateStyleElement(id, cspNonce);
2990
3004
  if (!styleEl) return;
2991
3005
  styleEl.innerHTML = styles;
2992
3006
  }
@@ -3006,8 +3020,17 @@ function getOrCreateStyleElement(id, cspNonce) {
3006
3020
  // Composables
3007
3021
  function createTheme(options) {
3008
3022
  const parsedOptions = parseThemeOptions(options);
3009
- const name = shallowRef(parsedOptions.defaultTheme);
3023
+ const _name = shallowRef(parsedOptions.defaultTheme);
3010
3024
  const themes = ref(parsedOptions.themes);
3025
+ const systemName = shallowRef('light');
3026
+ const name = computed({
3027
+ get() {
3028
+ return _name.value === 'system' ? systemName.value : _name.value;
3029
+ },
3030
+ set(val) {
3031
+ _name.value = val;
3032
+ }
3033
+ });
3011
3034
  const computedThemes = computed(() => {
3012
3035
  const acc = {};
3013
3036
  for (const [name, original] of Object.entries(themes.value)) {
@@ -3028,28 +3051,49 @@ function createTheme(options) {
3028
3051
  const current = toRef(() => computedThemes.value[name.value]);
3029
3052
  const styles = computed(() => {
3030
3053
  const lines = [];
3054
+ const important = parsedOptions.unimportant ? '' : ' !important';
3055
+ const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
3031
3056
  if (current.value?.dark) {
3032
3057
  createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
3033
3058
  }
3034
- createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
3059
+ createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
3035
3060
  for (const [themeName, theme] of Object.entries(computedThemes.value)) {
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);
3061
+ createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
3062
+ }
3063
+ if (parsedOptions.utilities) {
3064
+ const bgLines = [];
3065
+ const fgLines = [];
3066
+ const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
3067
+ for (const key of colors) {
3068
+ if (key.startsWith('on-')) {
3069
+ createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
3070
+ } else {
3071
+ 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);
3072
+ createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
3073
+ createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
3074
+ }
3048
3075
  }
3076
+ lines.push(...bgLines, ...fgLines);
3049
3077
  }
3050
- lines.push(...bgLines, ...fgLines);
3051
3078
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
3052
3079
  });
3080
+ const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
3081
+ const themeNames = toRef(() => Object.keys(computedThemes.value));
3082
+ if (SUPPORTS_MATCH_MEDIA) {
3083
+ const media = window.matchMedia('(prefers-color-scheme: dark)');
3084
+ function updateSystemName() {
3085
+ systemName.value = media.matches ? 'dark' : 'light';
3086
+ }
3087
+ updateSystemName();
3088
+ media.addEventListener('change', updateSystemName, {
3089
+ passive: true
3090
+ });
3091
+ if (getCurrentScope()) {
3092
+ onScopeDispose(() => {
3093
+ media.removeEventListener('change', updateSystemName);
3094
+ });
3095
+ }
3096
+ }
3053
3097
  function install(app) {
3054
3098
  if (parsedOptions.isDisabled) return;
3055
3099
  const head = app._context.provides.usehead;
@@ -3087,22 +3131,55 @@ function createTheme(options) {
3087
3131
  updateStyles();
3088
3132
  }
3089
3133
  function updateStyles() {
3090
- upsertStyles(getOrCreateStyleElement(parsedOptions.stylesheetId, parsedOptions.cspNonce), styles.value);
3134
+ upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
3091
3135
  }
3092
3136
  }
3093
3137
  }
3094
- const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);
3138
+ function change(themeName) {
3139
+ if (!themeNames.value.includes(themeName)) {
3140
+ consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
3141
+ return;
3142
+ }
3143
+ name.value = themeName;
3144
+ }
3145
+ function cycle() {
3146
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
3147
+ const currentIndex = themeArray.indexOf(name.value);
3148
+ const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
3149
+ change(themeArray[nextIndex]);
3150
+ }
3151
+ function toggle() {
3152
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
3153
+ cycle(themeArray);
3154
+ }
3155
+ const globalName = new Proxy(name, {
3156
+ get(target, prop) {
3157
+ return target[prop];
3158
+ },
3159
+ set(target, prop, val) {
3160
+ if (prop === 'value') {
3161
+ deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
3162
+ }
3163
+ // @ts-expect-error
3164
+ target[prop] = val;
3165
+ return true;
3166
+ }
3167
+ });
3095
3168
  return {
3096
3169
  install,
3170
+ change,
3171
+ cycle,
3172
+ toggle,
3097
3173
  isDisabled: parsedOptions.isDisabled,
3098
3174
  name,
3099
3175
  themes,
3100
3176
  current,
3101
3177
  computedThemes,
3178
+ prefix: parsedOptions.prefix,
3102
3179
  themeClasses,
3103
3180
  styles,
3104
3181
  global: {
3105
- name,
3182
+ name: globalName,
3106
3183
  current
3107
3184
  }
3108
3185
  };
@@ -3113,7 +3190,7 @@ function provideTheme(props) {
3113
3190
  if (!theme) throw new Error('Could not find Vuetify theme injection');
3114
3191
  const name = toRef(() => props.theme ?? theme.name.value);
3115
3192
  const current = toRef(() => theme.themes.value[name.value]);
3116
- const themeClasses = toRef(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);
3193
+ const themeClasses = toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
3117
3194
  const newTheme = {
3118
3195
  ...theme,
3119
3196
  name,
@@ -4217,7 +4294,10 @@ const makeVToolbarProps = propsFactory({
4217
4294
  default: 'default',
4218
4295
  validator: v => allowedDensities$1.includes(v)
4219
4296
  },
4220
- extended: Boolean,
4297
+ extended: {
4298
+ type: Boolean,
4299
+ default: null
4300
+ },
4221
4301
  extensionHeight: {
4222
4302
  type: [Number, String],
4223
4303
  default: 48
@@ -4265,7 +4345,7 @@ const VToolbar = genericComponent()({
4265
4345
  const {
4266
4346
  rtlClasses
4267
4347
  } = useRtl();
4268
- const isExtended = shallowRef(!!(props.extended || slots.extension?.()));
4348
+ const isExtended = shallowRef(props.extended === null ? !!slots.extension?.() : props.extended);
4269
4349
  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));
4270
4350
  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);
4271
4351
  provideDefaults({
@@ -4277,7 +4357,7 @@ const VToolbar = genericComponent()({
4277
4357
  const hasTitle = !!(props.title || slots.title);
4278
4358
  const hasImage = !!(slots.image || props.image);
4279
4359
  const extension = slots.extension?.();
4280
- isExtended.value = !!(props.extended || extension);
4360
+ isExtended.value = props.extended === null ? !!extension : props.extended;
4281
4361
  return createVNode(props.tag, {
4282
4362
  "class": normalizeClass(['v-toolbar', {
4283
4363
  'v-toolbar--absolute': props.absolute,
@@ -4660,9 +4740,15 @@ function useVariant(props) {
4660
4740
  };
4661
4741
  }
4662
4742
 
4743
+ // Types
4744
+
4663
4745
  const makeVBtnGroupProps = propsFactory({
4664
4746
  baseColor: String,
4665
4747
  divided: Boolean,
4748
+ direction: {
4749
+ type: String,
4750
+ default: 'horizontal'
4751
+ },
4666
4752
  ...makeBorderProps(),
4667
4753
  ...makeComponentProps(),
4668
4754
  ...makeDensityProps(),
@@ -4696,7 +4782,7 @@ const VBtnGroup = genericComponent()({
4696
4782
  } = useRounded(props);
4697
4783
  provideDefaults({
4698
4784
  VBtn: {
4699
- height: 'auto',
4785
+ height: toRef(() => props.direction === 'horizontal' ? 'auto' : null),
4700
4786
  baseColor: toRef(() => props.baseColor),
4701
4787
  color: toRef(() => props.color),
4702
4788
  density: toRef(() => props.density),
@@ -4706,7 +4792,7 @@ const VBtnGroup = genericComponent()({
4706
4792
  });
4707
4793
  useRender(() => {
4708
4794
  return createVNode(props.tag, {
4709
- "class": normalizeClass(['v-btn-group', {
4795
+ "class": normalizeClass(['v-btn-group', `v-btn-group--${props.direction}`, {
4710
4796
  'v-btn-group--divided': props.divided
4711
4797
  }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
4712
4798
  "style": normalizeStyle(props.style)
@@ -5829,8 +5915,8 @@ function rippleCancelShow(e) {
5829
5915
  window.clearTimeout(element._ripple.showTimer);
5830
5916
  }
5831
5917
  let keyboardRipple = false;
5832
- function keyboardRippleShow(e) {
5833
- if (!keyboardRipple && (e.keyCode === keyCodes.enter || e.keyCode === keyCodes.space)) {
5918
+ function keyboardRippleShow(e, keys) {
5919
+ if (!keyboardRipple && keys.includes(e.keyCode)) {
5834
5920
  keyboardRipple = true;
5835
5921
  rippleShow(e);
5836
5922
  }
@@ -5858,9 +5944,12 @@ function updateRipple(el, binding, wasEnabled) {
5858
5944
  el._ripple.enabled = enabled;
5859
5945
  el._ripple.centered = modifiers.center;
5860
5946
  el._ripple.circle = modifiers.circle;
5861
- if (isObject(value) && value.class) {
5862
- el._ripple.class = value.class;
5947
+ const bindingValue = isObject(value) ? value : {};
5948
+ if (bindingValue.class) {
5949
+ el._ripple.class = bindingValue.class;
5863
5950
  }
5951
+ const allowedKeys = bindingValue.keys ?? [keyCodes.enter, keyCodes.space];
5952
+ el._ripple.keyDownHandler = e => keyboardRippleShow(e, allowedKeys);
5864
5953
  if (enabled && !wasEnabled) {
5865
5954
  if (modifiers.stop) {
5866
5955
  el.addEventListener('touchstart', rippleStop, {
@@ -5882,7 +5971,7 @@ function updateRipple(el, binding, wasEnabled) {
5882
5971
  el.addEventListener('mousedown', rippleShow);
5883
5972
  el.addEventListener('mouseup', rippleHide);
5884
5973
  el.addEventListener('mouseleave', rippleHide);
5885
- el.addEventListener('keydown', keyboardRippleShow);
5974
+ el.addEventListener('keydown', e => keyboardRippleShow(e, allowedKeys));
5886
5975
  el.addEventListener('keyup', keyboardRippleHide);
5887
5976
  el.addEventListener('blur', focusRippleHide);
5888
5977
 
@@ -5902,7 +5991,9 @@ function removeListeners(el) {
5902
5991
  el.removeEventListener('touchcancel', rippleHide);
5903
5992
  el.removeEventListener('mouseup', rippleHide);
5904
5993
  el.removeEventListener('mouseleave', rippleHide);
5905
- el.removeEventListener('keydown', keyboardRippleShow);
5994
+ if (el._ripple?.keyDownHandler) {
5995
+ el.removeEventListener('keydown', el._ripple.keyDownHandler);
5996
+ }
5906
5997
  el.removeEventListener('keyup', keyboardRippleHide);
5907
5998
  el.removeEventListener('dragstart', rippleHide);
5908
5999
  el.removeEventListener('blur', focusRippleHide);
@@ -5911,8 +6002,8 @@ function mounted$4(el, binding) {
5911
6002
  updateRipple(el, binding, false);
5912
6003
  }
5913
6004
  function unmounted$4(el) {
5914
- delete el._ripple;
5915
6005
  removeListeners(el);
6006
+ delete el._ripple;
5916
6007
  }
5917
6008
  function updated$1(el, binding) {
5918
6009
  if (binding.value === binding.oldValue) {
@@ -6185,6 +6276,31 @@ const VAppBarTitle = genericComponent()({
6185
6276
  // Utilities
6186
6277
  const VAlertTitle = createSimpleFunctional('v-alert-title');
6187
6278
 
6279
+ // Utilities
6280
+
6281
+ // Types
6282
+
6283
+ // Types
6284
+
6285
+ // Composables
6286
+ const makeIconSizeProps = propsFactory({
6287
+ iconSize: [Number, String],
6288
+ iconSizes: {
6289
+ type: Array,
6290
+ default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
6291
+ }
6292
+ }, 'iconSize');
6293
+ function useIconSizes(props, fallback) {
6294
+ const iconSize = computed(() => {
6295
+ const iconSizeMap = new Map(props.iconSizes);
6296
+ const _iconSize = props.iconSize ?? fallback() ?? 'default';
6297
+ return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
6298
+ });
6299
+ return {
6300
+ iconSize
6301
+ };
6302
+ }
6303
+
6188
6304
  // Types
6189
6305
 
6190
6306
  const allowedTypes = ['success', 'info', 'warning', 'error'];
@@ -6224,6 +6340,7 @@ const makeVAlertProps = propsFactory({
6224
6340
  ...makeDensityProps(),
6225
6341
  ...makeDimensionProps(),
6226
6342
  ...makeElevationProps(),
6343
+ ...makeIconSizeProps(),
6227
6344
  ...makeLocationProps(),
6228
6345
  ...makePositionProps(),
6229
6346
  ...makeRoundedProps(),
@@ -6251,6 +6368,9 @@ const VAlert = genericComponent()({
6251
6368
  if (!props.type) return props.icon;
6252
6369
  return props.icon ?? `$${props.type}`;
6253
6370
  });
6371
+ const {
6372
+ iconSize
6373
+ } = useIconSizes(props, () => props.prominent ? 44 : 28);
6254
6374
  const {
6255
6375
  themeClasses
6256
6376
  } = provideTheme(props);
@@ -6298,6 +6418,11 @@ const VAlert = genericComponent()({
6298
6418
  const hasPrepend = !!(slots.prepend || icon.value);
6299
6419
  const hasTitle = !!(slots.title || props.title);
6300
6420
  const hasClose = !!(slots.close || props.closable);
6421
+ const iconProps = {
6422
+ density: props.density,
6423
+ icon: icon.value,
6424
+ size: iconSize.value
6425
+ };
6301
6426
  return isActive.value && createVNode(props.tag, {
6302
6427
  "class": normalizeClass(['v-alert', props.border && {
6303
6428
  'v-alert--border': !!props.border,
@@ -6315,19 +6440,14 @@ const VAlert = genericComponent()({
6315
6440
  }, null), hasPrepend && createElementVNode("div", {
6316
6441
  "key": "prepend",
6317
6442
  "class": "v-alert__prepend"
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, {
6443
+ }, [!slots.prepend ? createVNode(VIcon, mergeProps({
6444
+ "key": "prepend-icon"
6445
+ }, iconProps), null) : createVNode(VDefaultsProvider, {
6324
6446
  "key": "prepend-defaults",
6325
6447
  "disabled": !icon.value,
6326
6448
  "defaults": {
6327
6449
  VIcon: {
6328
- density: props.density,
6329
- icon: icon.value,
6330
- size: props.prominent ? 44 : 28
6450
+ ...iconProps
6331
6451
  }
6332
6452
  }
6333
6453
  }, slots.prepend)]), createElementVNode("div", {
@@ -7852,6 +7972,7 @@ function getOffsetPosition(isHorizontal, element) {
7852
7972
  const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group');
7853
7973
  const makeVSlideGroupProps = propsFactory({
7854
7974
  centerActive: Boolean,
7975
+ contentClass: null,
7855
7976
  direction: {
7856
7977
  type: String,
7857
7978
  default: 'horizontal'
@@ -8164,7 +8285,7 @@ const VSlideGroup = genericComponent()({
8164
8285
  })]), createElementVNode("div", {
8165
8286
  "key": "container",
8166
8287
  "ref": containerRef,
8167
- "class": "v-slide-group__container",
8288
+ "class": normalizeClass(['v-slide-group__container', props.contentClass]),
8168
8289
  "onScroll": onScroll
8169
8290
  }, [createElementVNode("div", {
8170
8291
  "ref": contentRef,
@@ -8527,16 +8648,85 @@ const VChip = genericComponent()({
8527
8648
  }
8528
8649
  });
8529
8650
 
8651
+ const makeVDividerProps = propsFactory({
8652
+ color: String,
8653
+ inset: Boolean,
8654
+ length: [Number, String],
8655
+ opacity: [Number, String],
8656
+ thickness: [Number, String],
8657
+ vertical: Boolean,
8658
+ ...makeComponentProps(),
8659
+ ...makeThemeProps()
8660
+ }, 'VDivider');
8661
+ const VDivider = genericComponent()({
8662
+ name: 'VDivider',
8663
+ props: makeVDividerProps(),
8664
+ setup(props, _ref) {
8665
+ let {
8666
+ attrs,
8667
+ slots
8668
+ } = _ref;
8669
+ const {
8670
+ themeClasses
8671
+ } = provideTheme(props);
8672
+ const {
8673
+ textColorClasses,
8674
+ textColorStyles
8675
+ } = useTextColor(() => props.color);
8676
+ const dividerStyles = computed(() => {
8677
+ const styles = {};
8678
+ if (props.length) {
8679
+ styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
8680
+ }
8681
+ if (props.thickness) {
8682
+ styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
8683
+ }
8684
+ return styles;
8685
+ });
8686
+ useRender(() => {
8687
+ const divider = createElementVNode("hr", {
8688
+ "class": normalizeClass([{
8689
+ 'v-divider': true,
8690
+ 'v-divider--inset': props.inset,
8691
+ 'v-divider--vertical': props.vertical
8692
+ }, themeClasses.value, textColorClasses.value, props.class]),
8693
+ "style": normalizeStyle([dividerStyles.value, textColorStyles.value, {
8694
+ '--v-border-opacity': props.opacity
8695
+ }, props.style]),
8696
+ "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
8697
+ "role": `${attrs.role || 'separator'}`
8698
+ }, null);
8699
+ if (!slots.default) return divider;
8700
+ return createElementVNode("div", {
8701
+ "class": normalizeClass(['v-divider__wrapper', {
8702
+ 'v-divider__wrapper--vertical': props.vertical,
8703
+ 'v-divider__wrapper--inset': props.inset
8704
+ }])
8705
+ }, [divider, createElementVNode("div", {
8706
+ "class": "v-divider__content"
8707
+ }, [slots.default()]), divider]);
8708
+ });
8709
+ return {};
8710
+ }
8711
+ });
8712
+
8530
8713
  // Utilities
8531
8714
 
8532
8715
  // List
8533
8716
  const ListKey = Symbol.for('vuetify:list');
8534
8717
  function createList() {
8718
+ let {
8719
+ filterable
8720
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
8721
+ filterable: false
8722
+ };
8535
8723
  const parent = inject$1(ListKey, {
8724
+ filterable: false,
8536
8725
  hasPrepend: shallowRef(false),
8537
8726
  updateHasPrepend: () => null
8538
8727
  });
8539
8728
  const data = {
8729
+ filterable: parent.filterable || filterable,
8540
8730
  hasPrepend: shallowRef(false),
8541
8731
  updateHasPrepend: value => {
8542
8732
  if (value) data.hasPrepend.value = value;
@@ -9488,6 +9678,9 @@ const VListItem = genericComponent()({
9488
9678
  roundedClasses
9489
9679
  } = useRounded(roundedProps);
9490
9680
  const lineClasses = toRef(() => props.lines ? `v-list-item--${props.lines}-line` : undefined);
9681
+ const rippleOptions = toRef(() => props.ripple !== undefined && !!props.ripple && list?.filterable ? {
9682
+ keys: [keyCodes.enter]
9683
+ } : props.ripple);
9491
9684
  const slotProps = computed(() => ({
9492
9685
  isActive: isActive.value,
9493
9686
  select,
@@ -9512,8 +9705,9 @@ const VListItem = genericComponent()({
9512
9705
  function onKeyDown(e) {
9513
9706
  const target = e.target;
9514
9707
  if (['INPUT', 'TEXTAREA'].includes(target.tagName)) return;
9515
- if (e.key === 'Enter' || e.key === ' ') {
9708
+ if (e.key === 'Enter' || e.key === ' ' && !list?.filterable) {
9516
9709
  e.preventDefault();
9710
+ e.stopPropagation();
9517
9711
  e.target.dispatchEvent(new MouseEvent('click', e));
9518
9712
  }
9519
9713
  }
@@ -9623,7 +9817,7 @@ const VListItem = genericComponent()({
9623
9817
  }), createElementVNode("div", {
9624
9818
  "class": "v-list-item__spacer"
9625
9819
  }, null)])]
9626
- }), [[Ripple, isClickable.value && props.ripple]]);
9820
+ }), [[Ripple, isClickable.value && rippleOptions.value]]);
9627
9821
  });
9628
9822
  return {
9629
9823
  activate,
@@ -9678,68 +9872,6 @@ const VListSubheader = genericComponent()({
9678
9872
  }
9679
9873
  });
9680
9874
 
9681
- const makeVDividerProps = propsFactory({
9682
- color: String,
9683
- inset: Boolean,
9684
- length: [Number, String],
9685
- opacity: [Number, String],
9686
- thickness: [Number, String],
9687
- vertical: Boolean,
9688
- ...makeComponentProps(),
9689
- ...makeThemeProps()
9690
- }, 'VDivider');
9691
- const VDivider = genericComponent()({
9692
- name: 'VDivider',
9693
- props: makeVDividerProps(),
9694
- setup(props, _ref) {
9695
- let {
9696
- attrs,
9697
- slots
9698
- } = _ref;
9699
- const {
9700
- themeClasses
9701
- } = provideTheme(props);
9702
- const {
9703
- textColorClasses,
9704
- textColorStyles
9705
- } = useTextColor(() => props.color);
9706
- const dividerStyles = computed(() => {
9707
- const styles = {};
9708
- if (props.length) {
9709
- styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
9710
- }
9711
- if (props.thickness) {
9712
- styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
9713
- }
9714
- return styles;
9715
- });
9716
- useRender(() => {
9717
- const divider = createElementVNode("hr", {
9718
- "class": normalizeClass([{
9719
- 'v-divider': true,
9720
- 'v-divider--inset': props.inset,
9721
- 'v-divider--vertical': props.vertical
9722
- }, themeClasses.value, textColorClasses.value, props.class]),
9723
- "style": normalizeStyle([dividerStyles.value, textColorStyles.value, {
9724
- '--v-border-opacity': props.opacity
9725
- }, props.style]),
9726
- "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
9727
- "role": `${attrs.role || 'separator'}`
9728
- }, null);
9729
- if (!slots.default) return divider;
9730
- return createElementVNode("div", {
9731
- "class": normalizeClass(['v-divider__wrapper', {
9732
- 'v-divider__wrapper--vertical': props.vertical,
9733
- 'v-divider__wrapper--inset': props.inset
9734
- }])
9735
- }, [divider, createElementVNode("div", {
9736
- "class": "v-divider__content"
9737
- }, [slots.default()]), divider]);
9738
- });
9739
- return {};
9740
- }
9741
- });
9742
-
9743
9875
  // Types
9744
9876
 
9745
9877
  const makeVListChildrenProps = propsFactory({
@@ -9856,7 +9988,7 @@ function transformItem$3(props, item) {
9856
9988
  const _props = {
9857
9989
  title,
9858
9990
  value,
9859
- ...itemProps
9991
+ ...camelizeProps(itemProps)
9860
9992
  };
9861
9993
  return {
9862
9994
  title: String(_props.title ?? ''),
@@ -10008,6 +10140,7 @@ const makeVListProps = propsFactory({
10008
10140
  activeClass: String,
10009
10141
  bgColor: String,
10010
10142
  disabled: Boolean,
10143
+ filterable: Boolean,
10011
10144
  expandIcon: IconValue,
10012
10145
  collapseIcon: IconValue,
10013
10146
  lines: {
@@ -10091,7 +10224,9 @@ const VList = genericComponent()({
10091
10224
  const activeColor = toRef(() => props.activeColor);
10092
10225
  const baseColor = toRef(() => props.baseColor);
10093
10226
  const color = toRef(() => props.color);
10094
- createList();
10227
+ createList({
10228
+ filterable: props.filterable
10229
+ });
10095
10230
  provideDefaults({
10096
10231
  VListGroup: {
10097
10232
  activeColor,
@@ -12667,7 +12802,12 @@ function useVirtual(props, items) {
12667
12802
  }
12668
12803
  function calculateOffset(index) {
12669
12804
  index = clamp(index, 0, items.value.length - 1);
12670
- 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;
12671
12811
  }
12672
12812
  function calculateIndex(scrollTop) {
12673
12813
  return binaryClosest(offsets, scrollTop);
@@ -13021,6 +13161,7 @@ const makeSelectProps = propsFactory({
13021
13161
  },
13022
13162
  openOnClear: Boolean,
13023
13163
  itemColor: String,
13164
+ noAutoScroll: Boolean,
13024
13165
  ...makeItemsProps({
13025
13166
  itemChildren: false
13026
13167
  })
@@ -13235,7 +13376,7 @@ const VSelect = genericComponent()({
13235
13376
  watch(menu, () => {
13236
13377
  if (!props.hideSelected && menu.value && model.value.length) {
13237
13378
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
13238
- IN_BROWSER && window.requestAnimationFrame(() => {
13379
+ IN_BROWSER && !props.noAutoScroll && window.requestAnimationFrame(() => {
13239
13380
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
13240
13381
  });
13241
13382
  }
@@ -13327,6 +13468,22 @@ const VSelect = genericComponent()({
13327
13468
  key: item.value,
13328
13469
  onClick: () => select(item, null)
13329
13470
  });
13471
+ if (item.raw.type === 'divider') {
13472
+ return slots.divider?.({
13473
+ props: item.raw,
13474
+ index
13475
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
13476
+ "key": `divider-${index}`
13477
+ }), null);
13478
+ }
13479
+ if (item.raw.type === 'subheader') {
13480
+ return slots.subheader?.({
13481
+ props: item.raw,
13482
+ index
13483
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
13484
+ "key": `subheader-${index}`
13485
+ }), null);
13486
+ }
13330
13487
  return slots.item?.({
13331
13488
  item,
13332
13489
  index,
@@ -13487,6 +13644,9 @@ function filterItems(items, query, options) {
13487
13644
  let match = -1;
13488
13645
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13489
13646
  if (typeof item === 'object') {
13647
+ if (['divider', 'subheader'].includes(item.raw?.type)) {
13648
+ continue;
13649
+ }
13490
13650
  const filterKeys = keys || Object.keys(transformed);
13491
13651
  for (const key of filterKeys) {
13492
13652
  const value = getPropertyFromItem(transformed, key);
@@ -13689,7 +13849,7 @@ const VAutocomplete = genericComponent()({
13689
13849
  menu.value = !menu.value;
13690
13850
  }
13691
13851
  function onListKeydown(e) {
13692
- if (e.key !== ' ' && checkPrintable(e)) {
13852
+ if (checkPrintable(e) || e.key === 'Backspace') {
13693
13853
  vTextFieldRef.value?.focus();
13694
13854
  }
13695
13855
  }
@@ -13894,6 +14054,7 @@ const VAutocomplete = genericComponent()({
13894
14054
  }, props.menuProps), {
13895
14055
  default: () => [hasList && createVNode(VList, mergeProps({
13896
14056
  "ref": listRef,
14057
+ "filterable": true,
13897
14058
  "selected": selectedValues.value,
13898
14059
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
13899
14060
  "onMousedown": e => e.preventDefault(),
@@ -13925,6 +14086,22 @@ const VAutocomplete = genericComponent()({
13925
14086
  active: highlightFirst.value && index === 0 ? true : undefined,
13926
14087
  onClick: () => select(item, null)
13927
14088
  });
14089
+ if (item.raw.type === 'divider') {
14090
+ return slots.divider?.({
14091
+ props: item.raw,
14092
+ index
14093
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
14094
+ "key": `divider-${index}`
14095
+ }), null);
14096
+ }
14097
+ if (item.raw.type === 'subheader') {
14098
+ return slots.subheader?.({
14099
+ props: item.raw,
14100
+ index
14101
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
14102
+ "key": `subheader-${index}`
14103
+ }), null);
14104
+ }
13928
14105
  return slots.item?.({
13929
14106
  item,
13930
14107
  index,
@@ -14069,7 +14246,8 @@ const makeVBadgeProps = propsFactory({
14069
14246
  ...makeThemeProps(),
14070
14247
  ...makeTransitionProps({
14071
14248
  transition: 'scale-rotate-transition'
14072
- })
14249
+ }),
14250
+ ...makeDimensionProps()
14073
14251
  }, 'VBadge');
14074
14252
  const VBadge = genericComponent()({
14075
14253
  name: 'VBadge',
@@ -14099,6 +14277,9 @@ const VBadge = genericComponent()({
14099
14277
  const base = props.floating ? props.dot ? 2 : 4 : props.dot ? 8 : 12;
14100
14278
  return base + (['top', 'bottom'].includes(side) ? Number(props.offsetY ?? 0) : ['left', 'right'].includes(side) ? Number(props.offsetX ?? 0) : 0);
14101
14279
  });
14280
+ const {
14281
+ dimensionStyles
14282
+ } = useDimension(props);
14102
14283
  useRender(() => {
14103
14284
  const value = Number(props.content);
14104
14285
  const content = !props.max || isNaN(value) ? props.content : value <= Number(props.max) ? value : `${props.max}+`;
@@ -14120,7 +14301,7 @@ const VBadge = genericComponent()({
14120
14301
  }, {
14121
14302
  default: () => [withDirectives(createElementVNode("span", mergeProps({
14122
14303
  "class": ['v-badge__badge', themeClasses.value, backgroundColorClasses.value, roundedClasses.value, textColorClasses.value],
14123
- "style": [backgroundColorStyles.value, textColorStyles.value, props.inline ? {} : locationStyles.value],
14304
+ "style": [backgroundColorStyles.value, textColorStyles.value, dimensionStyles.value, props.inline ? {} : locationStyles.value],
14124
14305
  "aria-atomic": "true",
14125
14306
  "aria-label": t(props.label, value),
14126
14307
  "aria-live": "polite",
@@ -17529,13 +17710,13 @@ function date(value) {
17529
17710
  return null;
17530
17711
  }
17531
17712
  const sundayJanuarySecond2000 = new Date(2000, 0, 2);
17532
- function getWeekdays(locale, firstDayOfWeek) {
17713
+ function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
17533
17714
  const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
17534
17715
  return createRange(7).map(i => {
17535
17716
  const weekday = new Date(sundayJanuarySecond2000);
17536
17717
  weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
17537
17718
  return new Intl.DateTimeFormat(locale, {
17538
- weekday: 'narrow'
17719
+ weekday: weekdayFormat ?? 'narrow'
17539
17720
  }).format(weekday);
17540
17721
  });
17541
17722
  }
@@ -17999,9 +18180,9 @@ class VuetifyDateAdapter {
17999
18180
  getDiff(date, comparing, unit) {
18000
18181
  return getDiff(date, comparing, unit);
18001
18182
  }
18002
- getWeekdays(firstDayOfWeek) {
18183
+ getWeekdays(firstDayOfWeek, weekdayFormat) {
18003
18184
  const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
18004
- return getWeekdays(this.locale, firstDay);
18185
+ return getWeekdays(this.locale, firstDay, weekdayFormat);
18005
18186
  }
18006
18187
  getYear(date) {
18007
18188
  return getYear(date);
@@ -18357,6 +18538,7 @@ const VCombobox = genericComponent()({
18357
18538
  _search.value = val ?? '';
18358
18539
  if (!props.multiple && !hasSelectionSlot.value) {
18359
18540
  model.value = [transformItem$3(props, val)];
18541
+ nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18360
18542
  }
18361
18543
  if (val && props.multiple && props.delimiters?.length) {
18362
18544
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18437,7 +18619,7 @@ const VCombobox = genericComponent()({
18437
18619
  menu.value = !menu.value;
18438
18620
  }
18439
18621
  function onListKeydown(e) {
18440
- if (e.key !== ' ' && checkPrintable(e)) {
18622
+ if (checkPrintable(e) || e.key === 'Backspace') {
18441
18623
  vTextFieldRef.value?.focus();
18442
18624
  }
18443
18625
  }
@@ -18642,6 +18824,7 @@ const VCombobox = genericComponent()({
18642
18824
  }, props.menuProps), {
18643
18825
  default: () => [hasList && createVNode(VList, mergeProps({
18644
18826
  "ref": listRef,
18827
+ "filterable": true,
18645
18828
  "selected": selectedValues.value,
18646
18829
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
18647
18830
  "onMousedown": e => e.preventDefault(),
@@ -18673,6 +18856,22 @@ const VCombobox = genericComponent()({
18673
18856
  active: highlightFirst.value && index === 0 ? true : undefined,
18674
18857
  onClick: () => select(item, null)
18675
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
+ }
18676
18875
  return slots.item?.({
18677
18876
  item,
18678
18877
  index,
@@ -20552,6 +20751,7 @@ const makeVDataTableHeadersProps = propsFactory({
20552
20751
  color: String,
20553
20752
  disableSort: Boolean,
20554
20753
  fixedHeader: Boolean,
20754
+ lastFixed: Boolean,
20555
20755
  multiSort: Boolean,
20556
20756
  sortAscIcon: {
20557
20757
  type: IconValue,
@@ -20598,10 +20798,11 @@ const VDataTableHeaders = genericComponent()({
20598
20798
  loaderClasses
20599
20799
  } = useLoader(props);
20600
20800
  function getFixedStyles(column, y) {
20601
- if (!(props.sticky || props.fixedHeader) && !column.fixed) return undefined;
20801
+ if (!(props.sticky || props.fixedHeader) && !(column.fixed || column.lastFixed)) return undefined;
20602
20802
  return {
20603
20803
  position: 'sticky',
20604
- left: column.fixed ? convertToUnit(column.fixedOffset) : undefined,
20804
+ left: column.fixed || column.lastFixed ? convertToUnit(column.fixedOffset) : undefined,
20805
+ right: column.lastFixed ? convertToUnit(column.fixedOffset ?? 0) : undefined,
20605
20806
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
20606
20807
  };
20607
20808
  }
@@ -21110,11 +21311,18 @@ const VDataTableRows = genericComponent()({
21110
21311
  }
21111
21312
  });
21112
21313
 
21314
+ // Types
21315
+
21113
21316
  const makeVTableProps = propsFactory({
21114
21317
  fixedHeader: Boolean,
21115
21318
  fixedFooter: Boolean,
21116
21319
  height: [Number, String],
21117
21320
  hover: Boolean,
21321
+ striped: {
21322
+ type: String,
21323
+ default: null,
21324
+ validator: v => ['even', 'odd'].includes(v)
21325
+ },
21118
21326
  ...makeComponentProps(),
21119
21327
  ...makeDensityProps(),
21120
21328
  ...makeTagProps(),
@@ -21141,7 +21349,9 @@ const VTable = genericComponent()({
21141
21349
  'v-table--fixed-footer': props.fixedFooter,
21142
21350
  'v-table--has-top': !!slots.top,
21143
21351
  'v-table--has-bottom': !!slots.bottom,
21144
- 'v-table--hover': props.hover
21352
+ 'v-table--hover': props.hover,
21353
+ 'v-table--striped-even': props.striped === 'even',
21354
+ 'v-table--striped-odd': props.striped === 'odd'
21145
21355
  }, themeClasses.value, densityClasses.value, props.class]),
21146
21356
  "style": normalizeStyle(props.style)
21147
21357
  }, {
@@ -22316,7 +22526,8 @@ const makeCalendarProps = propsFactory({
22316
22526
  firstDayOfWeek: {
22317
22527
  type: [Number, String],
22318
22528
  default: undefined
22319
- }
22529
+ },
22530
+ weekdayFormat: String
22320
22531
  }, 'calendar');
22321
22532
  function useCalendar(props) {
22322
22533
  const adapter = useDate();
@@ -22557,7 +22768,7 @@ const VDatePickerMonth = genericComponent()({
22557
22768
  "ref": daysRef,
22558
22769
  "key": daysInMonth.value[0].date?.toString(),
22559
22770
  "class": "v-date-picker-month__days"
22560
- }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => createElementVNode("div", {
22771
+ }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => createElementVNode("div", {
22561
22772
  "class": normalizeClass(['v-date-picker-month__day', 'v-date-picker-month__weekday'])
22562
22773
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22563
22774
  const slotProps = {
@@ -25147,6 +25358,10 @@ const makeVNumberInputProps = propsFactory({
25147
25358
  type: Number,
25148
25359
  default: 0
25149
25360
  },
25361
+ minFractionDigits: {
25362
+ type: Number,
25363
+ default: null
25364
+ },
25150
25365
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
25151
25366
  }, 'VNumberInput');
25152
25367
  const VNumberInput = genericComponent()({
@@ -25177,9 +25392,19 @@ const VNumberInput = genericComponent()({
25177
25392
  } = useFocus(props);
25178
25393
  function correctPrecision(val) {
25179
25394
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
25180
- const fixed = precision == null ? String(val) : val.toFixed(precision);
25181
- return isFocused.value ? Number(fixed).toString() // trim zeros
25182
- : fixed;
25395
+ if (precision == null) {
25396
+ return String(val);
25397
+ }
25398
+ let fixed = val.toFixed(precision);
25399
+ if (isFocused.value) {
25400
+ return Number(fixed).toString(); // trim zeros
25401
+ }
25402
+ if ((props.minFractionDigits ?? precision) < precision) {
25403
+ const trimLimit = precision - props.minFractionDigits;
25404
+ const [baseDigits, fractionDigits] = fixed.split('.');
25405
+ fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
25406
+ }
25407
+ return fixed;
25183
25408
  }
25184
25409
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
25185
25410
  const _inputText = shallowRef(null);
@@ -25234,6 +25459,7 @@ const VNumberInput = genericComponent()({
25234
25459
  }
25235
25460
  };
25236
25461
  watch(() => props.precision, () => formatInputValue());
25462
+ watch(() => props.minFractionDigits, () => formatInputValue());
25237
25463
  onMounted(() => {
25238
25464
  clampModel();
25239
25465
  });
@@ -25348,7 +25574,7 @@ const VNumberInput = genericComponent()({
25348
25574
  inputText.value = null;
25349
25575
  return;
25350
25576
  }
25351
- inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25577
+ inputText.value = correctPrecision(model.value);
25352
25578
  }
25353
25579
  function trimDecimalZeros() {
25354
25580
  if (controlsDisabled.value) return;
@@ -25608,9 +25834,10 @@ const VOtpInput = genericComponent()({
25608
25834
  e.preventDefault();
25609
25835
  e.stopPropagation();
25610
25836
  const clipboardText = e?.clipboardData?.getData('Text').slice(0, length.value) ?? '';
25837
+ const finalIndex = clipboardText.length - 1 === -1 ? index : clipboardText.length - 1;
25611
25838
  if (isValidNumber(clipboardText)) return;
25612
25839
  model.value = clipboardText.split('');
25613
- inputRef.value?.[index].blur();
25840
+ inputRef.value?.[finalIndex].focus();
25614
25841
  }
25615
25842
  function reset() {
25616
25843
  model.value = [];
@@ -29392,7 +29619,7 @@ function createVuetify$1() {
29392
29619
  };
29393
29620
  });
29394
29621
  }
29395
- const version$1 = "3.8.7-master.2025-06-03";
29622
+ const version$1 = "3.8.8-dev.2025-06-08";
29396
29623
  createVuetify$1.version = version$1;
29397
29624
 
29398
29625
  // Vue's inject() can only be used in setup
@@ -29417,7 +29644,7 @@ const createVuetify = function () {
29417
29644
  ...options
29418
29645
  });
29419
29646
  };
29420
- const version = "3.8.7-master.2025-06-03";
29647
+ const version = "3.8.8-dev.2025-06-08";
29421
29648
  createVuetify.version = version;
29422
29649
 
29423
29650
  export { index as blueprints, components, createVuetify, directives, useDate, useDefaults, useDisplay, useGoTo, useLayout, useLocale, useRtl, useTheme, version };