@vuetify/nightly 3.8.8-master.2025-06-08 → 3.8.9-dev.2025-06-11

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 (175) hide show
  1. package/CHANGELOG.md +39 -16
  2. package/dist/json/attributes.json +3215 -3091
  3. package/dist/json/importMap-labs.json +44 -44
  4. package/dist/json/importMap.json +166 -166
  5. package/dist/json/tags.json +32 -1
  6. package/dist/json/web-types.json +6040 -5654
  7. package/dist/vuetify-labs.cjs +397 -154
  8. package/dist/vuetify-labs.css +4053 -4019
  9. package/dist/vuetify-labs.d.ts +2604 -2064
  10. package/dist/vuetify-labs.esm.js +398 -155
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +397 -154
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +391 -143
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +3715 -3681
  17. package/dist/vuetify.d.ts +1600 -1100
  18. package/dist/vuetify.esm.js +392 -144
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +391 -143
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1198 -1183
  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 +27 -8
  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 +5 -5
  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/date.js +1 -1
  131. package/lib/composables/date/date.js.map +1 -1
  132. package/lib/composables/date/index.d.ts +1 -0
  133. package/lib/composables/date/index.js +1 -0
  134. package/lib/composables/date/index.js.map +1 -1
  135. package/lib/composables/filter.js +3 -0
  136. package/lib/composables/filter.js.map +1 -1
  137. package/lib/composables/iconSizes.d.ts +28 -0
  138. package/lib/composables/iconSizes.js +23 -0
  139. package/lib/composables/iconSizes.js.map +1 -0
  140. package/lib/composables/list-items.js +2 -2
  141. package/lib/composables/list-items.js.map +1 -1
  142. package/lib/composables/theme.d.ts +6 -1
  143. package/lib/composables/theme.js +94 -26
  144. package/lib/composables/theme.js.map +1 -1
  145. package/lib/composables/virtual.js +6 -1
  146. package/lib/composables/virtual.js.map +1 -1
  147. package/lib/directives/ripple/index.d.ts +2 -1
  148. package/lib/directives/ripple/index.js +12 -7
  149. package/lib/directives/ripple/index.js.map +1 -1
  150. package/lib/entry-bundler.d.ts +3 -3
  151. package/lib/entry-bundler.js +1 -1
  152. package/lib/entry-bundler.js.map +1 -1
  153. package/lib/framework.d.ts +86 -71
  154. package/lib/framework.js +1 -1
  155. package/lib/framework.js.map +1 -1
  156. package/lib/labs/VCalendar/VCalendar.d.ts +10 -0
  157. package/lib/labs/VColorInput/VColorInput.d.ts +3 -3
  158. package/lib/labs/VDateInput/VDateInput.d.ts +97 -87
  159. package/lib/labs/VFileUpload/VFileUpload.d.ts +3 -3
  160. package/lib/labs/VFileUpload/VFileUploadItem.d.ts +20 -10
  161. package/lib/labs/VIconBtn/VIconBtn.d.ts +29 -29
  162. package/lib/labs/VIconBtn/VIconBtn.js +7 -11
  163. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  164. package/lib/labs/VStepperVertical/VStepperVertical.d.ts +20 -10
  165. package/lib/labs/VStepperVertical/VStepperVerticalItem.d.ts +20 -10
  166. package/lib/labs/VTreeview/VTreeview.d.ts +13 -0
  167. package/lib/labs/VTreeview/VTreeviewItem.d.ts +20 -10
  168. package/lib/labs/entry-bundler.d.ts +3 -3
  169. package/lib/util/globals.d.ts +1 -0
  170. package/lib/util/globals.js +1 -0
  171. package/lib/util/globals.js.map +1 -1
  172. package/lib/util/helpers.d.ts +1 -1
  173. package/lib/util/helpers.js +0 -1
  174. package/lib/util/helpers.js.map +1 -1
  175. package/package.json +3 -1
@@ -1,15 +1,16 @@
1
1
  /*!
2
- * Vuetify v3.8.8-master.2025-06-08
2
+ * Vuetify v3.8.9-dev.2025-06-11
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
6
6
 
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, 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"); }
@@ -526,7 +527,6 @@ function extractNumber(text, decimalDigitsLimit) {
526
527
  return cleanText;
527
528
  }
528
529
  function camelizeProps(props) {
529
- if (!props) return;
530
530
  const out = {};
531
531
  for (const prop in props) {
532
532
  out[camelize(prop)] = props[prop];
@@ -2832,6 +2832,7 @@ const makeThemeProps = propsFactory({
2832
2832
  function genDefaults$1() {
2833
2833
  return {
2834
2834
  defaultTheme: 'light',
2835
+ prefix: 'v-',
2835
2836
  variations: {
2836
2837
  colors: [],
2837
2838
  lighten: 0,
@@ -2913,7 +2914,10 @@ function genDefaults$1() {
2913
2914
  }
2914
2915
  }
2915
2916
  },
2916
- stylesheetId: 'vuetify-theme-stylesheet'
2917
+ stylesheetId: 'vuetify-theme-stylesheet',
2918
+ scoped: false,
2919
+ unimportant: false,
2920
+ utilities: true
2917
2921
  };
2918
2922
  }
2919
2923
  function parseThemeOptions() {
@@ -2936,21 +2940,21 @@ function parseThemeOptions() {
2936
2940
  function createCssClass(lines, selector, content, scope) {
2937
2941
  lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
2938
2942
  }
2939
- function genCssVariables(theme) {
2943
+ function genCssVariables(theme, prefix) {
2940
2944
  const lightOverlay = theme.dark ? 2 : 1;
2941
2945
  const darkOverlay = theme.dark ? 1 : 2;
2942
2946
  const variables = [];
2943
2947
  for (const [key, value] of Object.entries(theme.colors)) {
2944
2948
  const rgb = parseColor(value);
2945
- variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2949
+ variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2946
2950
  if (!key.startsWith('on-')) {
2947
- 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}`);
2948
2952
  }
2949
2953
  }
2950
2954
  for (const [key, value] of Object.entries(theme.variables)) {
2951
2955
  const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
2952
2956
  const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
2953
- variables.push(`--v-${key}: ${rgb ?? value}`);
2957
+ variables.push(`--${prefix}${key}: ${rgb ?? value}`);
2954
2958
  }
2955
2959
  return variables;
2956
2960
  }
@@ -2994,7 +2998,8 @@ function getScopedSelector(selector, scope) {
2994
2998
  const scopeSelector = `:where(${scope})`;
2995
2999
  return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
2996
3000
  }
2997
- function upsertStyles(styleEl, styles) {
3001
+ function upsertStyles(id, cspNonce, styles) {
3002
+ const styleEl = getOrCreateStyleElement(id, cspNonce);
2998
3003
  if (!styleEl) return;
2999
3004
  styleEl.innerHTML = styles;
3000
3005
  }
@@ -3014,8 +3019,17 @@ function getOrCreateStyleElement(id, cspNonce) {
3014
3019
  // Composables
3015
3020
  function createTheme(options) {
3016
3021
  const parsedOptions = parseThemeOptions(options);
3017
- const name = shallowRef(parsedOptions.defaultTheme);
3022
+ const _name = shallowRef(parsedOptions.defaultTheme);
3018
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
+ });
3019
3033
  const computedThemes = computed(() => {
3020
3034
  const acc = {};
3021
3035
  for (const [name, original] of Object.entries(themes.value)) {
@@ -3036,28 +3050,49 @@ function createTheme(options) {
3036
3050
  const current = toRef(() => computedThemes.value[name.value]);
3037
3051
  const styles = computed(() => {
3038
3052
  const lines = [];
3053
+ const important = parsedOptions.unimportant ? '' : ' !important';
3054
+ const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
3039
3055
  if (current.value?.dark) {
3040
3056
  createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
3041
3057
  }
3042
- createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
3058
+ createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
3043
3059
  for (const [themeName, theme] of Object.entries(computedThemes.value)) {
3044
- createCssClass(lines, `.v-theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme)], parsedOptions.scope);
3045
- }
3046
- const bgLines = [];
3047
- const fgLines = [];
3048
- const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
3049
- for (const key of colors) {
3050
- if (key.startsWith('on-')) {
3051
- createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
3052
- } else {
3053
- 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);
3054
- createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
3055
- 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
+ }
3056
3074
  }
3075
+ lines.push(...bgLines, ...fgLines);
3057
3076
  }
3058
- lines.push(...bgLines, ...fgLines);
3059
3077
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
3060
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
+ }
3061
3096
  function install(app) {
3062
3097
  if (parsedOptions.isDisabled) return;
3063
3098
  const head = app._context.provides.usehead;
@@ -3095,22 +3130,55 @@ function createTheme(options) {
3095
3130
  updateStyles();
3096
3131
  }
3097
3132
  function updateStyles() {
3098
- upsertStyles(getOrCreateStyleElement(parsedOptions.stylesheetId, parsedOptions.cspNonce), styles.value);
3133
+ upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
3099
3134
  }
3100
3135
  }
3101
3136
  }
3102
- 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
+ });
3103
3167
  return {
3104
3168
  install,
3169
+ change,
3170
+ cycle,
3171
+ toggle,
3105
3172
  isDisabled: parsedOptions.isDisabled,
3106
3173
  name,
3107
3174
  themes,
3108
3175
  current,
3109
3176
  computedThemes,
3177
+ prefix: parsedOptions.prefix,
3110
3178
  themeClasses,
3111
3179
  styles,
3112
3180
  global: {
3113
- name,
3181
+ name: globalName,
3114
3182
  current
3115
3183
  }
3116
3184
  };
@@ -3121,7 +3189,7 @@ function provideTheme(props) {
3121
3189
  if (!theme) throw new Error('Could not find Vuetify theme injection');
3122
3190
  const name = toRef(() => props.theme ?? theme.name.value);
3123
3191
  const current = toRef(() => theme.themes.value[name.value]);
3124
- const themeClasses = toRef(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);
3192
+ const themeClasses = toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
3125
3193
  const newTheme = {
3126
3194
  ...theme,
3127
3195
  name,
@@ -4225,7 +4293,10 @@ const makeVToolbarProps = propsFactory({
4225
4293
  default: 'default',
4226
4294
  validator: v => allowedDensities$1.includes(v)
4227
4295
  },
4228
- extended: Boolean,
4296
+ extended: {
4297
+ type: Boolean,
4298
+ default: null
4299
+ },
4229
4300
  extensionHeight: {
4230
4301
  type: [Number, String],
4231
4302
  default: 48
@@ -4273,7 +4344,7 @@ const VToolbar = genericComponent()({
4273
4344
  const {
4274
4345
  rtlClasses
4275
4346
  } = useRtl();
4276
- const isExtended = shallowRef(!!(props.extended || slots.extension?.()));
4347
+ const isExtended = shallowRef(props.extended === null ? !!slots.extension?.() : props.extended);
4277
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));
4278
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);
4279
4350
  provideDefaults({
@@ -4285,7 +4356,7 @@ const VToolbar = genericComponent()({
4285
4356
  const hasTitle = !!(props.title || slots.title);
4286
4357
  const hasImage = !!(slots.image || props.image);
4287
4358
  const extension = slots.extension?.();
4288
- isExtended.value = !!(props.extended || extension);
4359
+ isExtended.value = props.extended === null ? !!extension : props.extended;
4289
4360
  return createVNode(props.tag, {
4290
4361
  "class": normalizeClass(['v-toolbar', {
4291
4362
  'v-toolbar--absolute': props.absolute,
@@ -4668,9 +4739,15 @@ function useVariant(props) {
4668
4739
  };
4669
4740
  }
4670
4741
 
4742
+ // Types
4743
+
4671
4744
  const makeVBtnGroupProps = propsFactory({
4672
4745
  baseColor: String,
4673
4746
  divided: Boolean,
4747
+ direction: {
4748
+ type: String,
4749
+ default: 'horizontal'
4750
+ },
4674
4751
  ...makeBorderProps(),
4675
4752
  ...makeComponentProps(),
4676
4753
  ...makeDensityProps(),
@@ -4704,7 +4781,7 @@ const VBtnGroup = genericComponent()({
4704
4781
  } = useRounded(props);
4705
4782
  provideDefaults({
4706
4783
  VBtn: {
4707
- height: 'auto',
4784
+ height: toRef(() => props.direction === 'horizontal' ? 'auto' : null),
4708
4785
  baseColor: toRef(() => props.baseColor),
4709
4786
  color: toRef(() => props.color),
4710
4787
  density: toRef(() => props.density),
@@ -4714,7 +4791,7 @@ const VBtnGroup = genericComponent()({
4714
4791
  });
4715
4792
  useRender(() => {
4716
4793
  return createVNode(props.tag, {
4717
- "class": normalizeClass(['v-btn-group', {
4794
+ "class": normalizeClass(['v-btn-group', `v-btn-group--${props.direction}`, {
4718
4795
  'v-btn-group--divided': props.divided
4719
4796
  }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
4720
4797
  "style": normalizeStyle(props.style)
@@ -5837,8 +5914,8 @@ function rippleCancelShow(e) {
5837
5914
  window.clearTimeout(element._ripple.showTimer);
5838
5915
  }
5839
5916
  let keyboardRipple = false;
5840
- function keyboardRippleShow(e) {
5841
- if (!keyboardRipple && (e.keyCode === keyCodes.enter || e.keyCode === keyCodes.space)) {
5917
+ function keyboardRippleShow(e, keys) {
5918
+ if (!keyboardRipple && keys.includes(e.keyCode)) {
5842
5919
  keyboardRipple = true;
5843
5920
  rippleShow(e);
5844
5921
  }
@@ -5866,9 +5943,12 @@ function updateRipple(el, binding, wasEnabled) {
5866
5943
  el._ripple.enabled = enabled;
5867
5944
  el._ripple.centered = modifiers.center;
5868
5945
  el._ripple.circle = modifiers.circle;
5869
- if (isObject(value) && value.class) {
5870
- el._ripple.class = value.class;
5946
+ const bindingValue = isObject(value) ? value : {};
5947
+ if (bindingValue.class) {
5948
+ el._ripple.class = bindingValue.class;
5871
5949
  }
5950
+ const allowedKeys = bindingValue.keys ?? [keyCodes.enter, keyCodes.space];
5951
+ el._ripple.keyDownHandler = e => keyboardRippleShow(e, allowedKeys);
5872
5952
  if (enabled && !wasEnabled) {
5873
5953
  if (modifiers.stop) {
5874
5954
  el.addEventListener('touchstart', rippleStop, {
@@ -5890,7 +5970,7 @@ function updateRipple(el, binding, wasEnabled) {
5890
5970
  el.addEventListener('mousedown', rippleShow);
5891
5971
  el.addEventListener('mouseup', rippleHide);
5892
5972
  el.addEventListener('mouseleave', rippleHide);
5893
- el.addEventListener('keydown', keyboardRippleShow);
5973
+ el.addEventListener('keydown', e => keyboardRippleShow(e, allowedKeys));
5894
5974
  el.addEventListener('keyup', keyboardRippleHide);
5895
5975
  el.addEventListener('blur', focusRippleHide);
5896
5976
 
@@ -5910,7 +5990,9 @@ function removeListeners(el) {
5910
5990
  el.removeEventListener('touchcancel', rippleHide);
5911
5991
  el.removeEventListener('mouseup', rippleHide);
5912
5992
  el.removeEventListener('mouseleave', rippleHide);
5913
- el.removeEventListener('keydown', keyboardRippleShow);
5993
+ if (el._ripple?.keyDownHandler) {
5994
+ el.removeEventListener('keydown', el._ripple.keyDownHandler);
5995
+ }
5914
5996
  el.removeEventListener('keyup', keyboardRippleHide);
5915
5997
  el.removeEventListener('dragstart', rippleHide);
5916
5998
  el.removeEventListener('blur', focusRippleHide);
@@ -5919,8 +6001,8 @@ function mounted$4(el, binding) {
5919
6001
  updateRipple(el, binding, false);
5920
6002
  }
5921
6003
  function unmounted$4(el) {
5922
- delete el._ripple;
5923
6004
  removeListeners(el);
6005
+ delete el._ripple;
5924
6006
  }
5925
6007
  function updated$1(el, binding) {
5926
6008
  if (binding.value === binding.oldValue) {
@@ -6193,6 +6275,31 @@ const VAppBarTitle = genericComponent()({
6193
6275
  // Utilities
6194
6276
  const VAlertTitle = createSimpleFunctional('v-alert-title');
6195
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
+
6196
6303
  // Types
6197
6304
 
6198
6305
  const allowedTypes = ['success', 'info', 'warning', 'error'];
@@ -6232,6 +6339,7 @@ const makeVAlertProps = propsFactory({
6232
6339
  ...makeDensityProps(),
6233
6340
  ...makeDimensionProps(),
6234
6341
  ...makeElevationProps(),
6342
+ ...makeIconSizeProps(),
6235
6343
  ...makeLocationProps(),
6236
6344
  ...makePositionProps(),
6237
6345
  ...makeRoundedProps(),
@@ -6259,6 +6367,9 @@ const VAlert = genericComponent()({
6259
6367
  if (!props.type) return props.icon;
6260
6368
  return props.icon ?? `$${props.type}`;
6261
6369
  });
6370
+ const {
6371
+ iconSize
6372
+ } = useIconSizes(props, () => props.prominent ? 44 : 28);
6262
6373
  const {
6263
6374
  themeClasses
6264
6375
  } = provideTheme(props);
@@ -6306,6 +6417,11 @@ const VAlert = genericComponent()({
6306
6417
  const hasPrepend = !!(slots.prepend || icon.value);
6307
6418
  const hasTitle = !!(slots.title || props.title);
6308
6419
  const hasClose = !!(slots.close || props.closable);
6420
+ const iconProps = {
6421
+ density: props.density,
6422
+ icon: icon.value,
6423
+ size: iconSize.value
6424
+ };
6309
6425
  return isActive.value && createVNode(props.tag, {
6310
6426
  "class": normalizeClass(['v-alert', props.border && {
6311
6427
  'v-alert--border': !!props.border,
@@ -6323,19 +6439,14 @@ const VAlert = genericComponent()({
6323
6439
  }, null), hasPrepend && createElementVNode("div", {
6324
6440
  "key": "prepend",
6325
6441
  "class": "v-alert__prepend"
6326
- }, [!slots.prepend ? createVNode(VIcon, {
6327
- "key": "prepend-icon",
6328
- "density": props.density,
6329
- "icon": icon.value,
6330
- "size": props.prominent ? 44 : 28
6331
- }, null) : createVNode(VDefaultsProvider, {
6442
+ }, [!slots.prepend ? createVNode(VIcon, mergeProps({
6443
+ "key": "prepend-icon"
6444
+ }, iconProps), null) : createVNode(VDefaultsProvider, {
6332
6445
  "key": "prepend-defaults",
6333
6446
  "disabled": !icon.value,
6334
6447
  "defaults": {
6335
6448
  VIcon: {
6336
- density: props.density,
6337
- icon: icon.value,
6338
- size: props.prominent ? 44 : 28
6449
+ ...iconProps
6339
6450
  }
6340
6451
  }
6341
6452
  }, slots.prepend)]), createElementVNode("div", {
@@ -7860,6 +7971,7 @@ function getOffsetPosition(isHorizontal, element) {
7860
7971
  const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group');
7861
7972
  const makeVSlideGroupProps = propsFactory({
7862
7973
  centerActive: Boolean,
7974
+ contentClass: null,
7863
7975
  direction: {
7864
7976
  type: String,
7865
7977
  default: 'horizontal'
@@ -8172,7 +8284,7 @@ const VSlideGroup = genericComponent()({
8172
8284
  })]), createElementVNode("div", {
8173
8285
  "key": "container",
8174
8286
  "ref": containerRef,
8175
- "class": "v-slide-group__container",
8287
+ "class": normalizeClass(['v-slide-group__container', props.contentClass]),
8176
8288
  "onScroll": onScroll
8177
8289
  }, [createElementVNode("div", {
8178
8290
  "ref": contentRef,
@@ -8535,16 +8647,85 @@ const VChip = genericComponent()({
8535
8647
  }
8536
8648
  });
8537
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
+
8538
8712
  // Utilities
8539
8713
 
8540
8714
  // List
8541
8715
  const ListKey = Symbol.for('vuetify:list');
8542
8716
  function createList() {
8717
+ let {
8718
+ filterable
8719
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
8720
+ filterable: false
8721
+ };
8543
8722
  const parent = inject$1(ListKey, {
8723
+ filterable: false,
8544
8724
  hasPrepend: shallowRef(false),
8545
8725
  updateHasPrepend: () => null
8546
8726
  });
8547
8727
  const data = {
8728
+ filterable: parent.filterable || filterable,
8548
8729
  hasPrepend: shallowRef(false),
8549
8730
  updateHasPrepend: value => {
8550
8731
  if (value) data.hasPrepend.value = value;
@@ -9496,6 +9677,9 @@ const VListItem = genericComponent()({
9496
9677
  roundedClasses
9497
9678
  } = useRounded(roundedProps);
9498
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);
9499
9683
  const slotProps = computed(() => ({
9500
9684
  isActive: isActive.value,
9501
9685
  select,
@@ -9520,8 +9704,9 @@ const VListItem = genericComponent()({
9520
9704
  function onKeyDown(e) {
9521
9705
  const target = e.target;
9522
9706
  if (['INPUT', 'TEXTAREA'].includes(target.tagName)) return;
9523
- if (e.key === 'Enter' || e.key === ' ') {
9707
+ if (e.key === 'Enter' || e.key === ' ' && !list?.filterable) {
9524
9708
  e.preventDefault();
9709
+ e.stopPropagation();
9525
9710
  e.target.dispatchEvent(new MouseEvent('click', e));
9526
9711
  }
9527
9712
  }
@@ -9631,7 +9816,7 @@ const VListItem = genericComponent()({
9631
9816
  }), createElementVNode("div", {
9632
9817
  "class": "v-list-item__spacer"
9633
9818
  }, null)])]
9634
- }), [[Ripple, isClickable.value && props.ripple]]);
9819
+ }), [[Ripple, isClickable.value && rippleOptions.value]]);
9635
9820
  });
9636
9821
  return {
9637
9822
  activate,
@@ -9686,68 +9871,6 @@ const VListSubheader = genericComponent()({
9686
9871
  }
9687
9872
  });
9688
9873
 
9689
- const makeVDividerProps = propsFactory({
9690
- color: String,
9691
- inset: Boolean,
9692
- length: [Number, String],
9693
- opacity: [Number, String],
9694
- thickness: [Number, String],
9695
- vertical: Boolean,
9696
- ...makeComponentProps(),
9697
- ...makeThemeProps()
9698
- }, 'VDivider');
9699
- const VDivider = genericComponent()({
9700
- name: 'VDivider',
9701
- props: makeVDividerProps(),
9702
- setup(props, _ref) {
9703
- let {
9704
- attrs,
9705
- slots
9706
- } = _ref;
9707
- const {
9708
- themeClasses
9709
- } = provideTheme(props);
9710
- const {
9711
- textColorClasses,
9712
- textColorStyles
9713
- } = useTextColor(() => props.color);
9714
- const dividerStyles = computed(() => {
9715
- const styles = {};
9716
- if (props.length) {
9717
- styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
9718
- }
9719
- if (props.thickness) {
9720
- styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
9721
- }
9722
- return styles;
9723
- });
9724
- useRender(() => {
9725
- const divider = createElementVNode("hr", {
9726
- "class": normalizeClass([{
9727
- 'v-divider': true,
9728
- 'v-divider--inset': props.inset,
9729
- 'v-divider--vertical': props.vertical
9730
- }, themeClasses.value, textColorClasses.value, props.class]),
9731
- "style": normalizeStyle([dividerStyles.value, textColorStyles.value, {
9732
- '--v-border-opacity': props.opacity
9733
- }, props.style]),
9734
- "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
9735
- "role": `${attrs.role || 'separator'}`
9736
- }, null);
9737
- if (!slots.default) return divider;
9738
- return createElementVNode("div", {
9739
- "class": normalizeClass(['v-divider__wrapper', {
9740
- 'v-divider__wrapper--vertical': props.vertical,
9741
- 'v-divider__wrapper--inset': props.inset
9742
- }])
9743
- }, [divider, createElementVNode("div", {
9744
- "class": "v-divider__content"
9745
- }, [slots.default()]), divider]);
9746
- });
9747
- return {};
9748
- }
9749
- });
9750
-
9751
9874
  // Types
9752
9875
 
9753
9876
  const makeVListChildrenProps = propsFactory({
@@ -9864,7 +9987,7 @@ function transformItem$3(props, item) {
9864
9987
  const _props = {
9865
9988
  title,
9866
9989
  value,
9867
- ...camelizeProps(itemProps)
9990
+ ...itemProps
9868
9991
  };
9869
9992
  return {
9870
9993
  title: String(_props.title ?? ''),
@@ -10016,6 +10139,7 @@ const makeVListProps = propsFactory({
10016
10139
  activeClass: String,
10017
10140
  bgColor: String,
10018
10141
  disabled: Boolean,
10142
+ filterable: Boolean,
10019
10143
  expandIcon: IconValue,
10020
10144
  collapseIcon: IconValue,
10021
10145
  lines: {
@@ -10099,7 +10223,9 @@ const VList = genericComponent()({
10099
10223
  const activeColor = toRef(() => props.activeColor);
10100
10224
  const baseColor = toRef(() => props.baseColor);
10101
10225
  const color = toRef(() => props.color);
10102
- createList();
10226
+ createList({
10227
+ filterable: props.filterable
10228
+ });
10103
10229
  provideDefaults({
10104
10230
  VListGroup: {
10105
10231
  activeColor,
@@ -12676,7 +12802,12 @@ function useVirtual(props, items) {
12676
12802
  }
12677
12803
  function calculateOffset(index) {
12678
12804
  index = clamp(index, 0, items.value.length - 1);
12679
- 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;
12680
12811
  }
12681
12812
  function calculateIndex(scrollTop) {
12682
12813
  return binaryClosest(offsets, scrollTop);
@@ -13030,6 +13161,7 @@ const makeSelectProps = propsFactory({
13030
13161
  },
13031
13162
  openOnClear: Boolean,
13032
13163
  itemColor: String,
13164
+ noAutoScroll: Boolean,
13033
13165
  ...makeItemsProps({
13034
13166
  itemChildren: false
13035
13167
  })
@@ -13244,7 +13376,7 @@ const VSelect = genericComponent()({
13244
13376
  watch(menu, () => {
13245
13377
  if (!props.hideSelected && menu.value && model.value.length) {
13246
13378
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
13247
- IN_BROWSER && window.requestAnimationFrame(() => {
13379
+ IN_BROWSER && !props.noAutoScroll && window.requestAnimationFrame(() => {
13248
13380
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
13249
13381
  });
13250
13382
  }
@@ -13331,11 +13463,28 @@ const VSelect = genericComponent()({
13331
13463
  index,
13332
13464
  itemRef
13333
13465
  } = _ref2;
13466
+ const camelizedProps = camelizeProps(item.props);
13334
13467
  const itemProps = mergeProps(item.props, {
13335
13468
  ref: itemRef,
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,
@@ -13352,10 +13501,10 @@ const VSelect = genericComponent()({
13352
13501
  "modelValue": isSelected,
13353
13502
  "ripple": false,
13354
13503
  "tabindex": "-1"
13355
- }, null) : undefined, item.props.prependAvatar && createVNode(VAvatar, {
13356
- "image": item.props.prependAvatar
13357
- }, null), item.props.prependIcon && createVNode(VIcon, {
13358
- "icon": item.props.prependIcon
13504
+ }, null) : undefined, camelizedProps.prependAvatar && createVNode(VAvatar, {
13505
+ "image": camelizedProps.prependAvatar
13506
+ }, null), camelizedProps.prependIcon && createVNode(VIcon, {
13507
+ "icon": camelizedProps.prependIcon
13359
13508
  }, null)]);
13360
13509
  }
13361
13510
  });
@@ -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
  }
@@ -17803,7 +17976,7 @@ function getWeek(date, locale, firstDayOfWeek, firstWeekMinSize) {
17803
17976
  const yearStart = new Date(year, 0, 1);
17804
17977
  const size = firstWeekSize(year);
17805
17978
  const d1w1 = size >= minWeekSize ? addDays(yearStart, size - 7) : addDays(yearStart, size);
17806
- return 1 + getDiff(date, d1w1, 'weeks');
17979
+ return 1 + getDiff(endOfDay(date), startOfDay(d1w1), 'weeks');
17807
17980
  }
17808
17981
  function getDate(date) {
17809
17982
  return date.getDate();
@@ -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);
@@ -18107,7 +18280,7 @@ function createDate(options, locale) {
18107
18280
  };
18108
18281
  }
18109
18282
  function createDateRange(adapter, start, stop) {
18110
- const diff = adapter.getDiff(stop ?? start, start, 'days');
18283
+ const diff = adapter.getDiff(adapter.endOfDay(stop ?? start), adapter.startOfDay(start), 'days');
18111
18284
  const datesInRange = [start];
18112
18285
  for (let i = 1; i < diff; i++) {
18113
18286
  const nextDate = adapter.addDays(start, i);
@@ -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-08";
29715
+ const version$1 = "3.8.9-dev.2025-06-11";
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-08";
29740
+ const version = "3.8.9-dev.2025-06-11";
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 };