@vuetify/nightly 3.8.7-master.2025-06-02 → 3.8.8-dev.2025-06-04

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. package/CHANGELOG.md +33 -11
  2. package/dist/json/attributes.json +2042 -1942
  3. package/dist/json/importMap-labs.json +24 -24
  4. package/dist/json/importMap.json +146 -146
  5. package/dist/json/tags.json +25 -0
  6. package/dist/json/web-types.json +3842 -3510
  7. package/dist/vuetify-labs.cjs +380 -152
  8. package/dist/vuetify-labs.css +5726 -5686
  9. package/dist/vuetify-labs.d.ts +2393 -1889
  10. package/dist/vuetify-labs.esm.js +381 -153
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +380 -152
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +374 -141
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +2674 -2634
  17. package/dist/vuetify.d.ts +1548 -1084
  18. package/dist/vuetify.esm.js +375 -142
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +374 -141
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1226 -1208
  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.css +6 -6
  33. package/lib/components/VAutocomplete/VAutocomplete.d.ts +154 -103
  34. package/lib/components/VAutocomplete/VAutocomplete.js +21 -3
  35. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  36. package/lib/components/VAutocomplete/VAutocomplete.sass +3 -9
  37. package/lib/components/VBtn/VBtn.d.ts +20 -10
  38. package/lib/components/VBtnGroup/VBtnGroup.css +30 -7
  39. package/lib/components/VBtnGroup/VBtnGroup.d.ts +58 -32
  40. package/lib/components/VBtnGroup/VBtnGroup.js +7 -3
  41. package/lib/components/VBtnGroup/VBtnGroup.js.map +1 -1
  42. package/lib/components/VBtnGroup/VBtnGroup.sass +44 -17
  43. package/lib/components/VBtnToggle/VBtnToggle.d.ts +25 -0
  44. package/lib/components/VCard/VCard.d.ts +20 -10
  45. package/lib/components/VCheckbox/VCheckbox.d.ts +23 -13
  46. package/lib/components/VCheckbox/VCheckboxBtn.d.ts +20 -10
  47. package/lib/components/VChip/VChip.d.ts +20 -10
  48. package/lib/components/VChip/VChip.js +1 -0
  49. package/lib/components/VChip/VChip.js.map +1 -1
  50. package/lib/components/VChipGroup/VChipGroup.d.ts +10 -0
  51. package/lib/components/VCombobox/VCombobox.css +6 -6
  52. package/lib/components/VCombobox/VCombobox.d.ts +154 -103
  53. package/lib/components/VCombobox/VCombobox.js +22 -3
  54. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  55. package/lib/components/VCombobox/VCombobox.sass +3 -9
  56. package/lib/components/VDataTable/VDataTable.d.ts +60 -0
  57. package/lib/components/VDataTable/VDataTableHeaders.d.ts +13 -0
  58. package/lib/components/VDataTable/VDataTableHeaders.js +4 -2
  59. package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
  60. package/lib/components/VDataTable/VDataTableServer.d.ts +42 -0
  61. package/lib/components/VDataTable/VDataTableVirtual.d.ts +42 -0
  62. package/lib/components/VDatePicker/VDatePicker.d.ts +10 -0
  63. package/lib/components/VDatePicker/VDatePickerMonth.d.ts +10 -0
  64. package/lib/components/VDatePicker/VDatePickerMonth.js +1 -1
  65. package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
  66. package/lib/components/VExpansionPanel/VExpansionPanel.d.ts +20 -10
  67. package/lib/components/VExpansionPanel/VExpansionPanelTitle.d.ts +20 -10
  68. package/lib/components/VExpansionPanel/VExpansionPanels.d.ts +20 -10
  69. package/lib/components/VFab/VFab.d.ts +20 -10
  70. package/lib/components/VField/VField.d.ts +3 -3
  71. package/lib/components/VFileInput/VFileInput.d.ts +15 -15
  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.css +6 -0
  94. package/lib/components/VSelect/VSelect.d.ts +171 -107
  95. package/lib/components/VSelect/VSelect.js +21 -3
  96. package/lib/components/VSelect/VSelect.js.map +1 -1
  97. package/lib/components/VSelect/VSelect.sass +3 -0
  98. package/lib/components/VSelect/_mixins.scss +14 -0
  99. package/lib/components/VSelectionControl/VSelectionControl.d.ts +20 -10
  100. package/lib/components/VSelectionControlGroup/VSelectionControlGroup.d.ts +28 -14
  101. package/lib/components/VSlideGroup/VSlideGroup.d.ts +10 -0
  102. package/lib/components/VSlideGroup/VSlideGroup.js +2 -1
  103. package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
  104. package/lib/components/VSlider/VSlider.d.ts +3 -3
  105. package/lib/components/VSlider/VSliderThumb.d.ts +20 -10
  106. package/lib/components/VSlider/VSliderThumb.js +12 -6
  107. package/lib/components/VSlider/VSliderThumb.js.map +1 -1
  108. package/lib/components/VSlider/slider.js +4 -1
  109. package/lib/components/VSlider/slider.js.map +1 -1
  110. package/lib/components/VStepper/VStepperItem.d.ts +28 -14
  111. package/lib/components/VSwitch/VSwitch.d.ts +23 -13
  112. package/lib/components/VTable/VTable.css +6 -0
  113. package/lib/components/VTable/VTable.d.ts +55 -24
  114. package/lib/components/VTable/VTable.js +9 -2
  115. package/lib/components/VTable/VTable.js.map +1 -1
  116. package/lib/components/VTable/VTable.sass +14 -0
  117. package/lib/components/VTable/_variables.scss +1 -0
  118. package/lib/components/VTabs/VTab.d.ts +56 -28
  119. package/lib/components/VTabs/VTabs.d.ts +10 -0
  120. package/lib/components/VTextField/VTextField.d.ts +27 -27
  121. package/lib/components/VTextarea/VTextarea.d.ts +15 -15
  122. package/lib/components/VToolbar/VToolbar.d.ts +15 -3
  123. package/lib/components/VToolbar/VToolbar.js +6 -3
  124. package/lib/components/VToolbar/VToolbar.js.map +1 -1
  125. package/lib/composables/calendar.d.ts +6 -0
  126. package/lib/composables/calendar.js +2 -1
  127. package/lib/composables/calendar.js.map +1 -1
  128. package/lib/composables/date/DateAdapter.d.ts +3 -3
  129. package/lib/composables/date/DateAdapter.js.map +1 -1
  130. package/lib/composables/date/adapters/string.d.ts +54 -0
  131. package/lib/composables/date/adapters/string.js +153 -0
  132. package/lib/composables/date/adapters/string.js.map +1 -0
  133. package/lib/composables/date/adapters/vuetify.d.ts +1 -1
  134. package/lib/composables/date/adapters/vuetify.js +4 -4
  135. package/lib/composables/date/adapters/vuetify.js.map +1 -1
  136. package/lib/composables/date/date.d.ts +3 -3
  137. package/lib/composables/date/index.d.ts +1 -0
  138. package/lib/composables/date/index.js +1 -0
  139. package/lib/composables/date/index.js.map +1 -1
  140. package/lib/composables/filter.js +3 -0
  141. package/lib/composables/filter.js.map +1 -1
  142. package/lib/composables/iconSizes.d.ts +28 -0
  143. package/lib/composables/iconSizes.js +23 -0
  144. package/lib/composables/iconSizes.js.map +1 -0
  145. package/lib/composables/list-items.js +2 -2
  146. package/lib/composables/list-items.js.map +1 -1
  147. package/lib/composables/theme.d.ts +6 -1
  148. package/lib/composables/theme.js +94 -26
  149. package/lib/composables/theme.js.map +1 -1
  150. package/lib/composables/virtual.js +6 -1
  151. package/lib/composables/virtual.js.map +1 -1
  152. package/lib/directives/ripple/index.d.ts +2 -1
  153. package/lib/directives/ripple/index.js +12 -7
  154. package/lib/directives/ripple/index.js.map +1 -1
  155. package/lib/entry-bundler.d.ts +3 -3
  156. package/lib/entry-bundler.js +1 -1
  157. package/lib/entry-bundler.js.map +1 -1
  158. package/lib/framework.d.ts +73 -58
  159. package/lib/framework.js +1 -1
  160. package/lib/framework.js.map +1 -1
  161. package/lib/labs/VCalendar/VCalendar.d.ts +10 -0
  162. package/lib/labs/VColorInput/VColorInput.d.ts +3 -3
  163. package/lib/labs/VDateInput/VDateInput.d.ts +97 -87
  164. package/lib/labs/VFileUpload/VFileUpload.d.ts +3 -3
  165. package/lib/labs/VFileUpload/VFileUploadItem.d.ts +20 -10
  166. package/lib/labs/VIconBtn/VIconBtn.d.ts +29 -29
  167. package/lib/labs/VIconBtn/VIconBtn.js +7 -11
  168. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  169. package/lib/labs/VStepperVertical/VStepperVertical.d.ts +20 -10
  170. package/lib/labs/VStepperVertical/VStepperVerticalItem.d.ts +20 -10
  171. package/lib/labs/VTreeview/VTreeview.d.ts +13 -0
  172. package/lib/labs/VTreeview/VTreeviewItem.d.ts +20 -10
  173. package/lib/labs/entry-bundler.d.ts +3 -3
  174. package/lib/util/globals.d.ts +1 -0
  175. package/lib/util/globals.js +1 -0
  176. package/lib/util/globals.js.map +1 -1
  177. package/lib/util/helpers.d.ts +1 -0
  178. package/lib/util/helpers.js +9 -1
  179. package/lib/util/helpers.js.map +1 -1
  180. package/package.json +3 -1
@@ -1,15 +1,16 @@
1
1
  /*!
2
- * Vuetify v3.8.7-master.2025-06-02
2
+ * Vuetify v3.8.8-dev.2025-06-04
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,
@@ -8374,6 +8495,7 @@ const VChip = genericComponent()({
8374
8495
  const isClickable = computed(() => !props.disabled && props.link !== false && (!!group || props.link || link.isClickable.value));
8375
8496
  const closeProps = toRef(() => ({
8376
8497
  'aria-label': t(props.closeLabel),
8498
+ disabled: props.disabled,
8377
8499
  onClick(e) {
8378
8500
  e.preventDefault();
8379
8501
  e.stopPropagation();
@@ -8526,16 +8648,85 @@ const VChip = genericComponent()({
8526
8648
  }
8527
8649
  });
8528
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
+
8529
8713
  // Utilities
8530
8714
 
8531
8715
  // List
8532
8716
  const ListKey = Symbol.for('vuetify:list');
8533
8717
  function createList() {
8718
+ let {
8719
+ filterable
8720
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
8721
+ filterable: false
8722
+ };
8534
8723
  const parent = inject$1(ListKey, {
8724
+ filterable: false,
8535
8725
  hasPrepend: shallowRef(false),
8536
8726
  updateHasPrepend: () => null
8537
8727
  });
8538
8728
  const data = {
8729
+ filterable: parent.filterable || filterable,
8539
8730
  hasPrepend: shallowRef(false),
8540
8731
  updateHasPrepend: value => {
8541
8732
  if (value) data.hasPrepend.value = value;
@@ -9487,6 +9678,9 @@ const VListItem = genericComponent()({
9487
9678
  roundedClasses
9488
9679
  } = useRounded(roundedProps);
9489
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);
9490
9684
  const slotProps = computed(() => ({
9491
9685
  isActive: isActive.value,
9492
9686
  select,
@@ -9511,8 +9705,9 @@ const VListItem = genericComponent()({
9511
9705
  function onKeyDown(e) {
9512
9706
  const target = e.target;
9513
9707
  if (['INPUT', 'TEXTAREA'].includes(target.tagName)) return;
9514
- if (e.key === 'Enter' || e.key === ' ') {
9708
+ if (e.key === 'Enter' || e.key === ' ' && !list?.filterable) {
9515
9709
  e.preventDefault();
9710
+ e.stopPropagation();
9516
9711
  e.target.dispatchEvent(new MouseEvent('click', e));
9517
9712
  }
9518
9713
  }
@@ -9622,7 +9817,7 @@ const VListItem = genericComponent()({
9622
9817
  }), createElementVNode("div", {
9623
9818
  "class": "v-list-item__spacer"
9624
9819
  }, null)])]
9625
- }), [[Ripple, isClickable.value && props.ripple]]);
9820
+ }), [[Ripple, isClickable.value && rippleOptions.value]]);
9626
9821
  });
9627
9822
  return {
9628
9823
  activate,
@@ -9677,68 +9872,6 @@ const VListSubheader = genericComponent()({
9677
9872
  }
9678
9873
  });
9679
9874
 
9680
- const makeVDividerProps = propsFactory({
9681
- color: String,
9682
- inset: Boolean,
9683
- length: [Number, String],
9684
- opacity: [Number, String],
9685
- thickness: [Number, String],
9686
- vertical: Boolean,
9687
- ...makeComponentProps(),
9688
- ...makeThemeProps()
9689
- }, 'VDivider');
9690
- const VDivider = genericComponent()({
9691
- name: 'VDivider',
9692
- props: makeVDividerProps(),
9693
- setup(props, _ref) {
9694
- let {
9695
- attrs,
9696
- slots
9697
- } = _ref;
9698
- const {
9699
- themeClasses
9700
- } = provideTheme(props);
9701
- const {
9702
- textColorClasses,
9703
- textColorStyles
9704
- } = useTextColor(() => props.color);
9705
- const dividerStyles = computed(() => {
9706
- const styles = {};
9707
- if (props.length) {
9708
- styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
9709
- }
9710
- if (props.thickness) {
9711
- styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
9712
- }
9713
- return styles;
9714
- });
9715
- useRender(() => {
9716
- const divider = createElementVNode("hr", {
9717
- "class": normalizeClass([{
9718
- 'v-divider': true,
9719
- 'v-divider--inset': props.inset,
9720
- 'v-divider--vertical': props.vertical
9721
- }, themeClasses.value, textColorClasses.value, props.class]),
9722
- "style": normalizeStyle([dividerStyles.value, textColorStyles.value, {
9723
- '--v-border-opacity': props.opacity
9724
- }, props.style]),
9725
- "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
9726
- "role": `${attrs.role || 'separator'}`
9727
- }, null);
9728
- if (!slots.default) return divider;
9729
- return createElementVNode("div", {
9730
- "class": normalizeClass(['v-divider__wrapper', {
9731
- 'v-divider__wrapper--vertical': props.vertical,
9732
- 'v-divider__wrapper--inset': props.inset
9733
- }])
9734
- }, [divider, createElementVNode("div", {
9735
- "class": "v-divider__content"
9736
- }, [slots.default()]), divider]);
9737
- });
9738
- return {};
9739
- }
9740
- });
9741
-
9742
9875
  // Types
9743
9876
 
9744
9877
  const makeVListChildrenProps = propsFactory({
@@ -9855,7 +9988,7 @@ function transformItem$3(props, item) {
9855
9988
  const _props = {
9856
9989
  title,
9857
9990
  value,
9858
- ...itemProps
9991
+ ...camelizeProps(itemProps)
9859
9992
  };
9860
9993
  return {
9861
9994
  title: String(_props.title ?? ''),
@@ -10007,6 +10140,7 @@ const makeVListProps = propsFactory({
10007
10140
  activeClass: String,
10008
10141
  bgColor: String,
10009
10142
  disabled: Boolean,
10143
+ filterable: Boolean,
10010
10144
  expandIcon: IconValue,
10011
10145
  collapseIcon: IconValue,
10012
10146
  lines: {
@@ -10090,7 +10224,9 @@ const VList = genericComponent()({
10090
10224
  const activeColor = toRef(() => props.activeColor);
10091
10225
  const baseColor = toRef(() => props.baseColor);
10092
10226
  const color = toRef(() => props.color);
10093
- createList();
10227
+ createList({
10228
+ filterable: props.filterable
10229
+ });
10094
10230
  provideDefaults({
10095
10231
  VListGroup: {
10096
10232
  activeColor,
@@ -12666,7 +12802,12 @@ function useVirtual(props, items) {
12666
12802
  }
12667
12803
  function calculateOffset(index) {
12668
12804
  index = clamp(index, 0, items.value.length - 1);
12669
- 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;
12670
12811
  }
12671
12812
  function calculateIndex(scrollTop) {
12672
12813
  return binaryClosest(offsets, scrollTop);
@@ -13020,6 +13161,7 @@ const makeSelectProps = propsFactory({
13020
13161
  },
13021
13162
  openOnClear: Boolean,
13022
13163
  itemColor: String,
13164
+ noAutoScroll: Boolean,
13023
13165
  ...makeItemsProps({
13024
13166
  itemChildren: false
13025
13167
  })
@@ -13234,7 +13376,7 @@ const VSelect = genericComponent()({
13234
13376
  watch(menu, () => {
13235
13377
  if (!props.hideSelected && menu.value && model.value.length) {
13236
13378
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
13237
- IN_BROWSER && window.requestAnimationFrame(() => {
13379
+ IN_BROWSER && !props.noAutoScroll && window.requestAnimationFrame(() => {
13238
13380
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
13239
13381
  });
13240
13382
  }
@@ -13326,6 +13468,22 @@ const VSelect = genericComponent()({
13326
13468
  key: item.value,
13327
13469
  onClick: () => select(item, null)
13328
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
+ }
13329
13487
  return slots.item?.({
13330
13488
  item,
13331
13489
  index,
@@ -13486,6 +13644,9 @@ function filterItems(items, query, options) {
13486
13644
  let match = -1;
13487
13645
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13488
13646
  if (typeof item === 'object') {
13647
+ if (['divider', 'subheader'].includes(item.raw?.type)) {
13648
+ continue;
13649
+ }
13489
13650
  const filterKeys = keys || Object.keys(transformed);
13490
13651
  for (const key of filterKeys) {
13491
13652
  const value = getPropertyFromItem(transformed, key);
@@ -13688,7 +13849,7 @@ const VAutocomplete = genericComponent()({
13688
13849
  menu.value = !menu.value;
13689
13850
  }
13690
13851
  function onListKeydown(e) {
13691
- if (e.key !== ' ' && checkPrintable(e)) {
13852
+ if (checkPrintable(e) || e.key === 'Backspace') {
13692
13853
  vTextFieldRef.value?.focus();
13693
13854
  }
13694
13855
  }
@@ -13893,6 +14054,7 @@ const VAutocomplete = genericComponent()({
13893
14054
  }, props.menuProps), {
13894
14055
  default: () => [hasList && createVNode(VList, mergeProps({
13895
14056
  "ref": listRef,
14057
+ "filterable": true,
13896
14058
  "selected": selectedValues.value,
13897
14059
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
13898
14060
  "onMousedown": e => e.preventDefault(),
@@ -13924,6 +14086,22 @@ const VAutocomplete = genericComponent()({
13924
14086
  active: highlightFirst.value && index === 0 ? true : undefined,
13925
14087
  onClick: () => select(item, null)
13926
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
+ }
13927
14105
  return slots.item?.({
13928
14106
  item,
13929
14107
  index,
@@ -16162,7 +16340,10 @@ const useSteps = props => {
16162
16340
  if (step.value <= 0) return value;
16163
16341
  const clamped = clamp(value, min.value, max.value);
16164
16342
  const offset = min.value % step.value;
16165
- const newValue = Math.round((clamped - offset) / step.value) * step.value + offset;
16343
+ let newValue = Math.round((clamped - offset) / step.value) * step.value + offset;
16344
+ if (clamped > newValue && newValue + step.value > max.value) {
16345
+ newValue = max.value;
16346
+ }
16166
16347
  return parseFloat(Math.min(newValue, max.value).toFixed(decimals.value));
16167
16348
  }
16168
16349
  return {
@@ -16418,6 +16599,8 @@ const VSliderThumb = genericComponent()({
16418
16599
  } = useRtl();
16419
16600
  if (!slider) throw new Error('[Vuetify] v-slider-thumb must be used inside v-slider or v-range-slider');
16420
16601
  const {
16602
+ min,
16603
+ max,
16421
16604
  thumbColor,
16422
16605
  step,
16423
16606
  disabled,
@@ -16458,16 +16641,20 @@ const VSliderThumb = genericComponent()({
16458
16641
  if (!relevantKeys.includes(e.key)) return;
16459
16642
  e.preventDefault();
16460
16643
  const _step = step.value || 0.1;
16461
- const steps = (props.max - props.min) / _step;
16644
+ const steps = (max.value - min.value) / _step;
16462
16645
  if ([left, right, down, up].includes(e.key)) {
16463
16646
  const increase = vertical.value ? [isRtl.value ? left : right, isReversed.value ? down : up] : indexFromEnd.value !== isRtl.value ? [left, up] : [right, up];
16464
16647
  const direction = increase.includes(e.key) ? 1 : -1;
16465
16648
  const multiplier = e.shiftKey ? 2 : e.ctrlKey ? 1 : 0;
16466
- value = value + direction * _step * multipliers.value[multiplier];
16649
+ if (direction === -1 && value === max.value && !multiplier && !Number.isInteger(steps)) {
16650
+ value = value - steps % 1 * _step;
16651
+ } else {
16652
+ value = value + direction * _step * multipliers.value[multiplier];
16653
+ }
16467
16654
  } else if (e.key === home) {
16468
- value = props.min;
16655
+ value = min.value;
16469
16656
  } else if (e.key === end) {
16470
- value = props.max;
16657
+ value = max.value;
16471
16658
  } else {
16472
16659
  const direction = e.key === pagedown ? 1 : -1;
16473
16660
  value = value - direction * _step * (steps > 100 ? steps / 10 : 10);
@@ -16492,8 +16679,8 @@ const VSliderThumb = genericComponent()({
16492
16679
  "role": "slider",
16493
16680
  "tabindex": disabled.value ? -1 : 0,
16494
16681
  "aria-label": props.name,
16495
- "aria-valuemin": props.min,
16496
- "aria-valuemax": props.max,
16682
+ "aria-valuemin": min.value,
16683
+ "aria-valuemax": max.value,
16497
16684
  "aria-valuenow": props.modelValue,
16498
16685
  "aria-readonly": !!readonly.value,
16499
16686
  "aria-orientation": direction.value,
@@ -17519,13 +17706,13 @@ function date(value) {
17519
17706
  return null;
17520
17707
  }
17521
17708
  const sundayJanuarySecond2000 = new Date(2000, 0, 2);
17522
- function getWeekdays(locale, firstDayOfWeek) {
17709
+ function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
17523
17710
  const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
17524
17711
  return createRange(7).map(i => {
17525
17712
  const weekday = new Date(sundayJanuarySecond2000);
17526
17713
  weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
17527
17714
  return new Intl.DateTimeFormat(locale, {
17528
- weekday: 'narrow'
17715
+ weekday: weekdayFormat ?? 'narrow'
17529
17716
  }).format(weekday);
17530
17717
  });
17531
17718
  }
@@ -17989,9 +18176,9 @@ class VuetifyDateAdapter {
17989
18176
  getDiff(date, comparing, unit) {
17990
18177
  return getDiff(date, comparing, unit);
17991
18178
  }
17992
- getWeekdays(firstDayOfWeek) {
18179
+ getWeekdays(firstDayOfWeek, weekdayFormat) {
17993
18180
  const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
17994
- return getWeekdays(this.locale, firstDay);
18181
+ return getWeekdays(this.locale, firstDay, weekdayFormat);
17995
18182
  }
17996
18183
  getYear(date) {
17997
18184
  return getYear(date);
@@ -18347,6 +18534,7 @@ const VCombobox = genericComponent()({
18347
18534
  _search.value = val ?? '';
18348
18535
  if (!props.multiple && !hasSelectionSlot.value) {
18349
18536
  model.value = [transformItem$3(props, val)];
18537
+ nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18350
18538
  }
18351
18539
  if (val && props.multiple && props.delimiters?.length) {
18352
18540
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18427,7 +18615,7 @@ const VCombobox = genericComponent()({
18427
18615
  menu.value = !menu.value;
18428
18616
  }
18429
18617
  function onListKeydown(e) {
18430
- if (e.key !== ' ' && checkPrintable(e)) {
18618
+ if (checkPrintable(e) || e.key === 'Backspace') {
18431
18619
  vTextFieldRef.value?.focus();
18432
18620
  }
18433
18621
  }
@@ -18632,6 +18820,7 @@ const VCombobox = genericComponent()({
18632
18820
  }, props.menuProps), {
18633
18821
  default: () => [hasList && createVNode(VList, mergeProps({
18634
18822
  "ref": listRef,
18823
+ "filterable": true,
18635
18824
  "selected": selectedValues.value,
18636
18825
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
18637
18826
  "onMousedown": e => e.preventDefault(),
@@ -18663,6 +18852,22 @@ const VCombobox = genericComponent()({
18663
18852
  active: highlightFirst.value && index === 0 ? true : undefined,
18664
18853
  onClick: () => select(item, null)
18665
18854
  });
18855
+ if (item.raw.type === 'divider') {
18856
+ return slots.divider?.({
18857
+ props: item.raw,
18858
+ index
18859
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
18860
+ "key": `divider-${index}`
18861
+ }), null);
18862
+ }
18863
+ if (item.raw.type === 'subheader') {
18864
+ return slots.subheader?.({
18865
+ props: item.raw,
18866
+ index
18867
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
18868
+ "key": `subheader-${index}`
18869
+ }), null);
18870
+ }
18666
18871
  return slots.item?.({
18667
18872
  item,
18668
18873
  index,
@@ -20542,6 +20747,7 @@ const makeVDataTableHeadersProps = propsFactory({
20542
20747
  color: String,
20543
20748
  disableSort: Boolean,
20544
20749
  fixedHeader: Boolean,
20750
+ lastFixed: Boolean,
20545
20751
  multiSort: Boolean,
20546
20752
  sortAscIcon: {
20547
20753
  type: IconValue,
@@ -20588,10 +20794,11 @@ const VDataTableHeaders = genericComponent()({
20588
20794
  loaderClasses
20589
20795
  } = useLoader(props);
20590
20796
  function getFixedStyles(column, y) {
20591
- if (!(props.sticky || props.fixedHeader) && !column.fixed) return undefined;
20797
+ if (!(props.sticky || props.fixedHeader) && !(column.fixed || column.lastFixed)) return undefined;
20592
20798
  return {
20593
20799
  position: 'sticky',
20594
- left: column.fixed ? convertToUnit(column.fixedOffset) : undefined,
20800
+ left: column.fixed || column.lastFixed ? convertToUnit(column.fixedOffset) : undefined,
20801
+ right: column.lastFixed ? convertToUnit(column.fixedOffset ?? 0) : undefined,
20595
20802
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
20596
20803
  };
20597
20804
  }
@@ -21100,11 +21307,18 @@ const VDataTableRows = genericComponent()({
21100
21307
  }
21101
21308
  });
21102
21309
 
21310
+ // Types
21311
+
21103
21312
  const makeVTableProps = propsFactory({
21104
21313
  fixedHeader: Boolean,
21105
21314
  fixedFooter: Boolean,
21106
21315
  height: [Number, String],
21107
21316
  hover: Boolean,
21317
+ striped: {
21318
+ type: String,
21319
+ default: null,
21320
+ validator: v => ['even', 'odd'].includes(v)
21321
+ },
21108
21322
  ...makeComponentProps(),
21109
21323
  ...makeDensityProps(),
21110
21324
  ...makeTagProps(),
@@ -21131,7 +21345,9 @@ const VTable = genericComponent()({
21131
21345
  'v-table--fixed-footer': props.fixedFooter,
21132
21346
  'v-table--has-top': !!slots.top,
21133
21347
  'v-table--has-bottom': !!slots.bottom,
21134
- 'v-table--hover': props.hover
21348
+ 'v-table--hover': props.hover,
21349
+ 'v-table--striped-even': props.striped === 'even',
21350
+ 'v-table--striped-odd': props.striped === 'odd'
21135
21351
  }, themeClasses.value, densityClasses.value, props.class]),
21136
21352
  "style": normalizeStyle(props.style)
21137
21353
  }, {
@@ -22306,7 +22522,8 @@ const makeCalendarProps = propsFactory({
22306
22522
  firstDayOfWeek: {
22307
22523
  type: [Number, String],
22308
22524
  default: undefined
22309
- }
22525
+ },
22526
+ weekdayFormat: String
22310
22527
  }, 'calendar');
22311
22528
  function useCalendar(props) {
22312
22529
  const adapter = useDate();
@@ -22547,7 +22764,7 @@ const VDatePickerMonth = genericComponent()({
22547
22764
  "ref": daysRef,
22548
22765
  "key": daysInMonth.value[0].date?.toString(),
22549
22766
  "class": "v-date-picker-month__days"
22550
- }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => createElementVNode("div", {
22767
+ }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => createElementVNode("div", {
22551
22768
  "class": normalizeClass(['v-date-picker-month__day', 'v-date-picker-month__weekday'])
22552
22769
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22553
22770
  const slotProps = {
@@ -25137,6 +25354,10 @@ const makeVNumberInputProps = propsFactory({
25137
25354
  type: Number,
25138
25355
  default: 0
25139
25356
  },
25357
+ minFractionDigits: {
25358
+ type: Number,
25359
+ default: null
25360
+ },
25140
25361
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
25141
25362
  }, 'VNumberInput');
25142
25363
  const VNumberInput = genericComponent()({
@@ -25167,9 +25388,19 @@ const VNumberInput = genericComponent()({
25167
25388
  } = useFocus(props);
25168
25389
  function correctPrecision(val) {
25169
25390
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
25170
- const fixed = precision == null ? String(val) : val.toFixed(precision);
25171
- return isFocused.value ? Number(fixed).toString() // trim zeros
25172
- : fixed;
25391
+ if (precision == null) {
25392
+ return String(val);
25393
+ }
25394
+ let fixed = val.toFixed(precision);
25395
+ if (isFocused.value) {
25396
+ return Number(fixed).toString(); // trim zeros
25397
+ }
25398
+ if ((props.minFractionDigits ?? precision) < precision) {
25399
+ const trimLimit = precision - props.minFractionDigits;
25400
+ const [baseDigits, fractionDigits] = fixed.split('.');
25401
+ fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
25402
+ }
25403
+ return fixed;
25173
25404
  }
25174
25405
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
25175
25406
  const _inputText = shallowRef(null);
@@ -25224,6 +25455,7 @@ const VNumberInput = genericComponent()({
25224
25455
  }
25225
25456
  };
25226
25457
  watch(() => props.precision, () => formatInputValue());
25458
+ watch(() => props.minFractionDigits, () => formatInputValue());
25227
25459
  onMounted(() => {
25228
25460
  clampModel();
25229
25461
  });
@@ -25338,7 +25570,7 @@ const VNumberInput = genericComponent()({
25338
25570
  inputText.value = null;
25339
25571
  return;
25340
25572
  }
25341
- inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25573
+ inputText.value = correctPrecision(model.value);
25342
25574
  }
25343
25575
  function trimDecimalZeros() {
25344
25576
  if (controlsDisabled.value) return;
@@ -25598,9 +25830,10 @@ const VOtpInput = genericComponent()({
25598
25830
  e.preventDefault();
25599
25831
  e.stopPropagation();
25600
25832
  const clipboardText = e?.clipboardData?.getData('Text').slice(0, length.value) ?? '';
25833
+ const finalIndex = clipboardText.length - 1 === -1 ? index : clipboardText.length - 1;
25601
25834
  if (isValidNumber(clipboardText)) return;
25602
25835
  model.value = clipboardText.split('');
25603
- inputRef.value?.[index].blur();
25836
+ inputRef.value?.[finalIndex].focus();
25604
25837
  }
25605
25838
  function reset() {
25606
25839
  model.value = [];
@@ -29382,7 +29615,7 @@ function createVuetify$1() {
29382
29615
  };
29383
29616
  });
29384
29617
  }
29385
- const version$1 = "3.8.7-master.2025-06-02";
29618
+ const version$1 = "3.8.8-dev.2025-06-04";
29386
29619
  createVuetify$1.version = version$1;
29387
29620
 
29388
29621
  // Vue's inject() can only be used in setup
@@ -29407,7 +29640,7 @@ const createVuetify = function () {
29407
29640
  ...options
29408
29641
  });
29409
29642
  };
29410
- const version = "3.8.7-master.2025-06-02";
29643
+ const version = "3.8.8-dev.2025-06-04";
29411
29644
  createVuetify.version = version;
29412
29645
 
29413
29646
  export { index as blueprints, components, createVuetify, directives, useDate, useDefaults, useDisplay, useGoTo, useLayout, useLocale, useRtl, useTheme, version };