@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
package/dist/vuetify.cjs CHANGED
@@ -1,5 +1,5 @@
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
  */
@@ -14,6 +14,7 @@
14
14
  const SUPPORTS_INTERSECTION = IN_BROWSER && 'IntersectionObserver' in window;
15
15
  const SUPPORTS_TOUCH = IN_BROWSER && ('ontouchstart' in window || window.navigator.maxTouchPoints > 0);
16
16
  const SUPPORTS_EYE_DROPPER = IN_BROWSER && 'EyeDropper' in window;
17
+ const SUPPORTS_MATCH_MEDIA = IN_BROWSER && 'matchMedia' in window && typeof window.matchMedia === 'function';
17
18
 
18
19
  function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
19
20
  function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
@@ -530,7 +531,6 @@
530
531
  return cleanText;
531
532
  }
532
533
  function camelizeProps(props) {
533
- if (!props) return;
534
534
  const out = {};
535
535
  for (const prop in props) {
536
536
  out[vue.camelize(prop)] = props[prop];
@@ -2836,6 +2836,7 @@
2836
2836
  function genDefaults$1() {
2837
2837
  return {
2838
2838
  defaultTheme: 'light',
2839
+ prefix: 'v-',
2839
2840
  variations: {
2840
2841
  colors: [],
2841
2842
  lighten: 0,
@@ -2917,7 +2918,10 @@
2917
2918
  }
2918
2919
  }
2919
2920
  },
2920
- stylesheetId: 'vuetify-theme-stylesheet'
2921
+ stylesheetId: 'vuetify-theme-stylesheet',
2922
+ scoped: false,
2923
+ unimportant: false,
2924
+ utilities: true
2921
2925
  };
2922
2926
  }
2923
2927
  function parseThemeOptions() {
@@ -2940,21 +2944,21 @@
2940
2944
  function createCssClass(lines, selector, content, scope) {
2941
2945
  lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
2942
2946
  }
2943
- function genCssVariables(theme) {
2947
+ function genCssVariables(theme, prefix) {
2944
2948
  const lightOverlay = theme.dark ? 2 : 1;
2945
2949
  const darkOverlay = theme.dark ? 1 : 2;
2946
2950
  const variables = [];
2947
2951
  for (const [key, value] of Object.entries(theme.colors)) {
2948
2952
  const rgb = parseColor(value);
2949
- variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2953
+ variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2950
2954
  if (!key.startsWith('on-')) {
2951
- variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2955
+ variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2952
2956
  }
2953
2957
  }
2954
2958
  for (const [key, value] of Object.entries(theme.variables)) {
2955
2959
  const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
2956
2960
  const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
2957
- variables.push(`--v-${key}: ${rgb ?? value}`);
2961
+ variables.push(`--${prefix}${key}: ${rgb ?? value}`);
2958
2962
  }
2959
2963
  return variables;
2960
2964
  }
@@ -2998,7 +3002,8 @@
2998
3002
  const scopeSelector = `:where(${scope})`;
2999
3003
  return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
3000
3004
  }
3001
- function upsertStyles(styleEl, styles) {
3005
+ function upsertStyles(id, cspNonce, styles) {
3006
+ const styleEl = getOrCreateStyleElement(id, cspNonce);
3002
3007
  if (!styleEl) return;
3003
3008
  styleEl.innerHTML = styles;
3004
3009
  }
@@ -3018,8 +3023,17 @@
3018
3023
  // Composables
3019
3024
  function createTheme(options) {
3020
3025
  const parsedOptions = parseThemeOptions(options);
3021
- const name = vue.shallowRef(parsedOptions.defaultTheme);
3026
+ const _name = vue.shallowRef(parsedOptions.defaultTheme);
3022
3027
  const themes = vue.ref(parsedOptions.themes);
3028
+ const systemName = vue.shallowRef('light');
3029
+ const name = vue.computed({
3030
+ get() {
3031
+ return _name.value === 'system' ? systemName.value : _name.value;
3032
+ },
3033
+ set(val) {
3034
+ _name.value = val;
3035
+ }
3036
+ });
3023
3037
  const computedThemes = vue.computed(() => {
3024
3038
  const acc = {};
3025
3039
  for (const [name, original] of Object.entries(themes.value)) {
@@ -3040,28 +3054,49 @@
3040
3054
  const current = vue.toRef(() => computedThemes.value[name.value]);
3041
3055
  const styles = vue.computed(() => {
3042
3056
  const lines = [];
3057
+ const important = parsedOptions.unimportant ? '' : ' !important';
3058
+ const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
3043
3059
  if (current.value?.dark) {
3044
3060
  createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
3045
3061
  }
3046
- createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
3062
+ createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
3047
3063
  for (const [themeName, theme] of Object.entries(computedThemes.value)) {
3048
- createCssClass(lines, `.v-theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme)], parsedOptions.scope);
3049
- }
3050
- const bgLines = [];
3051
- const fgLines = [];
3052
- const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
3053
- for (const key of colors) {
3054
- if (key.startsWith('on-')) {
3055
- createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
3056
- } else {
3057
- 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);
3058
- createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
3059
- createCssClass(fgLines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`], parsedOptions.scope);
3064
+ createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
3065
+ }
3066
+ if (parsedOptions.utilities) {
3067
+ const bgLines = [];
3068
+ const fgLines = [];
3069
+ const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
3070
+ for (const key of colors) {
3071
+ if (key.startsWith('on-')) {
3072
+ createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
3073
+ } else {
3074
+ 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);
3075
+ createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
3076
+ createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
3077
+ }
3060
3078
  }
3079
+ lines.push(...bgLines, ...fgLines);
3061
3080
  }
3062
- lines.push(...bgLines, ...fgLines);
3063
3081
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
3064
3082
  });
3083
+ const themeClasses = vue.toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
3084
+ const themeNames = vue.toRef(() => Object.keys(computedThemes.value));
3085
+ if (SUPPORTS_MATCH_MEDIA) {
3086
+ const media = window.matchMedia('(prefers-color-scheme: dark)');
3087
+ function updateSystemName() {
3088
+ systemName.value = media.matches ? 'dark' : 'light';
3089
+ }
3090
+ updateSystemName();
3091
+ media.addEventListener('change', updateSystemName, {
3092
+ passive: true
3093
+ });
3094
+ if (vue.getCurrentScope()) {
3095
+ vue.onScopeDispose(() => {
3096
+ media.removeEventListener('change', updateSystemName);
3097
+ });
3098
+ }
3099
+ }
3065
3100
  function install(app) {
3066
3101
  if (parsedOptions.isDisabled) return;
3067
3102
  const head = app._context.provides.usehead;
@@ -3099,22 +3134,55 @@
3099
3134
  updateStyles();
3100
3135
  }
3101
3136
  function updateStyles() {
3102
- upsertStyles(getOrCreateStyleElement(parsedOptions.stylesheetId, parsedOptions.cspNonce), styles.value);
3137
+ upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
3103
3138
  }
3104
3139
  }
3105
3140
  }
3106
- const themeClasses = vue.toRef(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);
3141
+ function change(themeName) {
3142
+ if (!themeNames.value.includes(themeName)) {
3143
+ consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
3144
+ return;
3145
+ }
3146
+ name.value = themeName;
3147
+ }
3148
+ function cycle() {
3149
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
3150
+ const currentIndex = themeArray.indexOf(name.value);
3151
+ const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
3152
+ change(themeArray[nextIndex]);
3153
+ }
3154
+ function toggle() {
3155
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
3156
+ cycle(themeArray);
3157
+ }
3158
+ const globalName = new Proxy(name, {
3159
+ get(target, prop) {
3160
+ return target[prop];
3161
+ },
3162
+ set(target, prop, val) {
3163
+ if (prop === 'value') {
3164
+ deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
3165
+ }
3166
+ // @ts-expect-error
3167
+ target[prop] = val;
3168
+ return true;
3169
+ }
3170
+ });
3107
3171
  return {
3108
3172
  install,
3173
+ change,
3174
+ cycle,
3175
+ toggle,
3109
3176
  isDisabled: parsedOptions.isDisabled,
3110
3177
  name,
3111
3178
  themes,
3112
3179
  current,
3113
3180
  computedThemes,
3181
+ prefix: parsedOptions.prefix,
3114
3182
  themeClasses,
3115
3183
  styles,
3116
3184
  global: {
3117
- name,
3185
+ name: globalName,
3118
3186
  current
3119
3187
  }
3120
3188
  };
@@ -3125,7 +3193,7 @@
3125
3193
  if (!theme) throw new Error('Could not find Vuetify theme injection');
3126
3194
  const name = vue.toRef(() => props.theme ?? theme.name.value);
3127
3195
  const current = vue.toRef(() => theme.themes.value[name.value]);
3128
- const themeClasses = vue.toRef(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);
3196
+ const themeClasses = vue.toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
3129
3197
  const newTheme = {
3130
3198
  ...theme,
3131
3199
  name,
@@ -4229,7 +4297,10 @@
4229
4297
  default: 'default',
4230
4298
  validator: v => allowedDensities$1.includes(v)
4231
4299
  },
4232
- extended: Boolean,
4300
+ extended: {
4301
+ type: Boolean,
4302
+ default: null
4303
+ },
4233
4304
  extensionHeight: {
4234
4305
  type: [Number, String],
4235
4306
  default: 48
@@ -4277,7 +4348,7 @@
4277
4348
  const {
4278
4349
  rtlClasses
4279
4350
  } = useRtl();
4280
- const isExtended = vue.shallowRef(!!(props.extended || slots.extension?.()));
4351
+ const isExtended = vue.shallowRef(props.extended === null ? !!slots.extension?.() : props.extended);
4281
4352
  const contentHeight = vue.computed(() => parseInt(Number(props.height) + (props.density === 'prominent' ? Number(props.height) : 0) - (props.density === 'comfortable' ? 8 : 0) - (props.density === 'compact' ? 16 : 0), 10));
4282
4353
  const extensionHeight = vue.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);
4283
4354
  provideDefaults({
@@ -4289,7 +4360,7 @@
4289
4360
  const hasTitle = !!(props.title || slots.title);
4290
4361
  const hasImage = !!(slots.image || props.image);
4291
4362
  const extension = slots.extension?.();
4292
- isExtended.value = !!(props.extended || extension);
4363
+ isExtended.value = props.extended === null ? !!extension : props.extended;
4293
4364
  return vue.createVNode(props.tag, {
4294
4365
  "class": vue.normalizeClass(['v-toolbar', {
4295
4366
  'v-toolbar--absolute': props.absolute,
@@ -4672,9 +4743,15 @@
4672
4743
  };
4673
4744
  }
4674
4745
 
4746
+ // Types
4747
+
4675
4748
  const makeVBtnGroupProps = propsFactory({
4676
4749
  baseColor: String,
4677
4750
  divided: Boolean,
4751
+ direction: {
4752
+ type: String,
4753
+ default: 'horizontal'
4754
+ },
4678
4755
  ...makeBorderProps(),
4679
4756
  ...makeComponentProps(),
4680
4757
  ...makeDensityProps(),
@@ -4708,7 +4785,7 @@
4708
4785
  } = useRounded(props);
4709
4786
  provideDefaults({
4710
4787
  VBtn: {
4711
- height: 'auto',
4788
+ height: vue.toRef(() => props.direction === 'horizontal' ? 'auto' : null),
4712
4789
  baseColor: vue.toRef(() => props.baseColor),
4713
4790
  color: vue.toRef(() => props.color),
4714
4791
  density: vue.toRef(() => props.density),
@@ -4718,7 +4795,7 @@
4718
4795
  });
4719
4796
  useRender(() => {
4720
4797
  return vue.createVNode(props.tag, {
4721
- "class": vue.normalizeClass(['v-btn-group', {
4798
+ "class": vue.normalizeClass(['v-btn-group', `v-btn-group--${props.direction}`, {
4722
4799
  'v-btn-group--divided': props.divided
4723
4800
  }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
4724
4801
  "style": vue.normalizeStyle(props.style)
@@ -5841,8 +5918,8 @@
5841
5918
  window.clearTimeout(element._ripple.showTimer);
5842
5919
  }
5843
5920
  let keyboardRipple = false;
5844
- function keyboardRippleShow(e) {
5845
- if (!keyboardRipple && (e.keyCode === keyCodes.enter || e.keyCode === keyCodes.space)) {
5921
+ function keyboardRippleShow(e, keys) {
5922
+ if (!keyboardRipple && keys.includes(e.keyCode)) {
5846
5923
  keyboardRipple = true;
5847
5924
  rippleShow(e);
5848
5925
  }
@@ -5870,9 +5947,12 @@
5870
5947
  el._ripple.enabled = enabled;
5871
5948
  el._ripple.centered = modifiers.center;
5872
5949
  el._ripple.circle = modifiers.circle;
5873
- if (isObject(value) && value.class) {
5874
- el._ripple.class = value.class;
5950
+ const bindingValue = isObject(value) ? value : {};
5951
+ if (bindingValue.class) {
5952
+ el._ripple.class = bindingValue.class;
5875
5953
  }
5954
+ const allowedKeys = bindingValue.keys ?? [keyCodes.enter, keyCodes.space];
5955
+ el._ripple.keyDownHandler = e => keyboardRippleShow(e, allowedKeys);
5876
5956
  if (enabled && !wasEnabled) {
5877
5957
  if (modifiers.stop) {
5878
5958
  el.addEventListener('touchstart', rippleStop, {
@@ -5894,7 +5974,7 @@
5894
5974
  el.addEventListener('mousedown', rippleShow);
5895
5975
  el.addEventListener('mouseup', rippleHide);
5896
5976
  el.addEventListener('mouseleave', rippleHide);
5897
- el.addEventListener('keydown', keyboardRippleShow);
5977
+ el.addEventListener('keydown', e => keyboardRippleShow(e, allowedKeys));
5898
5978
  el.addEventListener('keyup', keyboardRippleHide);
5899
5979
  el.addEventListener('blur', focusRippleHide);
5900
5980
 
@@ -5914,7 +5994,9 @@
5914
5994
  el.removeEventListener('touchcancel', rippleHide);
5915
5995
  el.removeEventListener('mouseup', rippleHide);
5916
5996
  el.removeEventListener('mouseleave', rippleHide);
5917
- el.removeEventListener('keydown', keyboardRippleShow);
5997
+ if (el._ripple?.keyDownHandler) {
5998
+ el.removeEventListener('keydown', el._ripple.keyDownHandler);
5999
+ }
5918
6000
  el.removeEventListener('keyup', keyboardRippleHide);
5919
6001
  el.removeEventListener('dragstart', rippleHide);
5920
6002
  el.removeEventListener('blur', focusRippleHide);
@@ -5923,8 +6005,8 @@
5923
6005
  updateRipple(el, binding, false);
5924
6006
  }
5925
6007
  function unmounted$4(el) {
5926
- delete el._ripple;
5927
6008
  removeListeners(el);
6009
+ delete el._ripple;
5928
6010
  }
5929
6011
  function updated$1(el, binding) {
5930
6012
  if (binding.value === binding.oldValue) {
@@ -6197,6 +6279,31 @@
6197
6279
  // Utilities
6198
6280
  const VAlertTitle = createSimpleFunctional('v-alert-title');
6199
6281
 
6282
+ // Utilities
6283
+
6284
+ // Types
6285
+
6286
+ // Types
6287
+
6288
+ // Composables
6289
+ const makeIconSizeProps = propsFactory({
6290
+ iconSize: [Number, String],
6291
+ iconSizes: {
6292
+ type: Array,
6293
+ default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
6294
+ }
6295
+ }, 'iconSize');
6296
+ function useIconSizes(props, fallback) {
6297
+ const iconSize = vue.computed(() => {
6298
+ const iconSizeMap = new Map(props.iconSizes);
6299
+ const _iconSize = props.iconSize ?? fallback() ?? 'default';
6300
+ return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
6301
+ });
6302
+ return {
6303
+ iconSize
6304
+ };
6305
+ }
6306
+
6200
6307
  // Types
6201
6308
 
6202
6309
  const allowedTypes = ['success', 'info', 'warning', 'error'];
@@ -6236,6 +6343,7 @@
6236
6343
  ...makeDensityProps(),
6237
6344
  ...makeDimensionProps(),
6238
6345
  ...makeElevationProps(),
6346
+ ...makeIconSizeProps(),
6239
6347
  ...makeLocationProps(),
6240
6348
  ...makePositionProps(),
6241
6349
  ...makeRoundedProps(),
@@ -6263,6 +6371,9 @@
6263
6371
  if (!props.type) return props.icon;
6264
6372
  return props.icon ?? `$${props.type}`;
6265
6373
  });
6374
+ const {
6375
+ iconSize
6376
+ } = useIconSizes(props, () => props.prominent ? 44 : 28);
6266
6377
  const {
6267
6378
  themeClasses
6268
6379
  } = provideTheme(props);
@@ -6310,6 +6421,11 @@
6310
6421
  const hasPrepend = !!(slots.prepend || icon.value);
6311
6422
  const hasTitle = !!(slots.title || props.title);
6312
6423
  const hasClose = !!(slots.close || props.closable);
6424
+ const iconProps = {
6425
+ density: props.density,
6426
+ icon: icon.value,
6427
+ size: iconSize.value
6428
+ };
6313
6429
  return isActive.value && vue.createVNode(props.tag, {
6314
6430
  "class": vue.normalizeClass(['v-alert', props.border && {
6315
6431
  'v-alert--border': !!props.border,
@@ -6327,19 +6443,14 @@
6327
6443
  }, null), hasPrepend && vue.createElementVNode("div", {
6328
6444
  "key": "prepend",
6329
6445
  "class": "v-alert__prepend"
6330
- }, [!slots.prepend ? vue.createVNode(VIcon, {
6331
- "key": "prepend-icon",
6332
- "density": props.density,
6333
- "icon": icon.value,
6334
- "size": props.prominent ? 44 : 28
6335
- }, null) : vue.createVNode(VDefaultsProvider, {
6446
+ }, [!slots.prepend ? vue.createVNode(VIcon, vue.mergeProps({
6447
+ "key": "prepend-icon"
6448
+ }, iconProps), null) : vue.createVNode(VDefaultsProvider, {
6336
6449
  "key": "prepend-defaults",
6337
6450
  "disabled": !icon.value,
6338
6451
  "defaults": {
6339
6452
  VIcon: {
6340
- density: props.density,
6341
- icon: icon.value,
6342
- size: props.prominent ? 44 : 28
6453
+ ...iconProps
6343
6454
  }
6344
6455
  }
6345
6456
  }, slots.prepend)]), vue.createElementVNode("div", {
@@ -7864,6 +7975,7 @@
7864
7975
  const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group');
7865
7976
  const makeVSlideGroupProps = propsFactory({
7866
7977
  centerActive: Boolean,
7978
+ contentClass: null,
7867
7979
  direction: {
7868
7980
  type: String,
7869
7981
  default: 'horizontal'
@@ -8176,7 +8288,7 @@
8176
8288
  })]), vue.createElementVNode("div", {
8177
8289
  "key": "container",
8178
8290
  "ref": containerRef,
8179
- "class": "v-slide-group__container",
8291
+ "class": vue.normalizeClass(['v-slide-group__container', props.contentClass]),
8180
8292
  "onScroll": onScroll
8181
8293
  }, [vue.createElementVNode("div", {
8182
8294
  "ref": contentRef,
@@ -8539,16 +8651,85 @@
8539
8651
  }
8540
8652
  });
8541
8653
 
8654
+ const makeVDividerProps = propsFactory({
8655
+ color: String,
8656
+ inset: Boolean,
8657
+ length: [Number, String],
8658
+ opacity: [Number, String],
8659
+ thickness: [Number, String],
8660
+ vertical: Boolean,
8661
+ ...makeComponentProps(),
8662
+ ...makeThemeProps()
8663
+ }, 'VDivider');
8664
+ const VDivider = genericComponent()({
8665
+ name: 'VDivider',
8666
+ props: makeVDividerProps(),
8667
+ setup(props, _ref) {
8668
+ let {
8669
+ attrs,
8670
+ slots
8671
+ } = _ref;
8672
+ const {
8673
+ themeClasses
8674
+ } = provideTheme(props);
8675
+ const {
8676
+ textColorClasses,
8677
+ textColorStyles
8678
+ } = useTextColor(() => props.color);
8679
+ const dividerStyles = vue.computed(() => {
8680
+ const styles = {};
8681
+ if (props.length) {
8682
+ styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
8683
+ }
8684
+ if (props.thickness) {
8685
+ styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
8686
+ }
8687
+ return styles;
8688
+ });
8689
+ useRender(() => {
8690
+ const divider = vue.createElementVNode("hr", {
8691
+ "class": vue.normalizeClass([{
8692
+ 'v-divider': true,
8693
+ 'v-divider--inset': props.inset,
8694
+ 'v-divider--vertical': props.vertical
8695
+ }, themeClasses.value, textColorClasses.value, props.class]),
8696
+ "style": vue.normalizeStyle([dividerStyles.value, textColorStyles.value, {
8697
+ '--v-border-opacity': props.opacity
8698
+ }, props.style]),
8699
+ "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
8700
+ "role": `${attrs.role || 'separator'}`
8701
+ }, null);
8702
+ if (!slots.default) return divider;
8703
+ return vue.createElementVNode("div", {
8704
+ "class": vue.normalizeClass(['v-divider__wrapper', {
8705
+ 'v-divider__wrapper--vertical': props.vertical,
8706
+ 'v-divider__wrapper--inset': props.inset
8707
+ }])
8708
+ }, [divider, vue.createElementVNode("div", {
8709
+ "class": "v-divider__content"
8710
+ }, [slots.default()]), divider]);
8711
+ });
8712
+ return {};
8713
+ }
8714
+ });
8715
+
8542
8716
  // Utilities
8543
8717
 
8544
8718
  // List
8545
8719
  const ListKey = Symbol.for('vuetify:list');
8546
8720
  function createList() {
8721
+ let {
8722
+ filterable
8723
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
8724
+ filterable: false
8725
+ };
8547
8726
  const parent = vue.inject(ListKey, {
8727
+ filterable: false,
8548
8728
  hasPrepend: vue.shallowRef(false),
8549
8729
  updateHasPrepend: () => null
8550
8730
  });
8551
8731
  const data = {
8732
+ filterable: parent.filterable || filterable,
8552
8733
  hasPrepend: vue.shallowRef(false),
8553
8734
  updateHasPrepend: value => {
8554
8735
  if (value) data.hasPrepend.value = value;
@@ -9500,6 +9681,9 @@
9500
9681
  roundedClasses
9501
9682
  } = useRounded(roundedProps);
9502
9683
  const lineClasses = vue.toRef(() => props.lines ? `v-list-item--${props.lines}-line` : undefined);
9684
+ const rippleOptions = vue.toRef(() => props.ripple !== undefined && !!props.ripple && list?.filterable ? {
9685
+ keys: [keyCodes.enter]
9686
+ } : props.ripple);
9503
9687
  const slotProps = vue.computed(() => ({
9504
9688
  isActive: isActive.value,
9505
9689
  select,
@@ -9524,8 +9708,9 @@
9524
9708
  function onKeyDown(e) {
9525
9709
  const target = e.target;
9526
9710
  if (['INPUT', 'TEXTAREA'].includes(target.tagName)) return;
9527
- if (e.key === 'Enter' || e.key === ' ') {
9711
+ if (e.key === 'Enter' || e.key === ' ' && !list?.filterable) {
9528
9712
  e.preventDefault();
9713
+ e.stopPropagation();
9529
9714
  e.target.dispatchEvent(new MouseEvent('click', e));
9530
9715
  }
9531
9716
  }
@@ -9635,7 +9820,7 @@
9635
9820
  }), vue.createElementVNode("div", {
9636
9821
  "class": "v-list-item__spacer"
9637
9822
  }, null)])]
9638
- }), [[Ripple, isClickable.value && props.ripple]]);
9823
+ }), [[Ripple, isClickable.value && rippleOptions.value]]);
9639
9824
  });
9640
9825
  return {
9641
9826
  activate,
@@ -9690,68 +9875,6 @@
9690
9875
  }
9691
9876
  });
9692
9877
 
9693
- const makeVDividerProps = propsFactory({
9694
- color: String,
9695
- inset: Boolean,
9696
- length: [Number, String],
9697
- opacity: [Number, String],
9698
- thickness: [Number, String],
9699
- vertical: Boolean,
9700
- ...makeComponentProps(),
9701
- ...makeThemeProps()
9702
- }, 'VDivider');
9703
- const VDivider = genericComponent()({
9704
- name: 'VDivider',
9705
- props: makeVDividerProps(),
9706
- setup(props, _ref) {
9707
- let {
9708
- attrs,
9709
- slots
9710
- } = _ref;
9711
- const {
9712
- themeClasses
9713
- } = provideTheme(props);
9714
- const {
9715
- textColorClasses,
9716
- textColorStyles
9717
- } = useTextColor(() => props.color);
9718
- const dividerStyles = vue.computed(() => {
9719
- const styles = {};
9720
- if (props.length) {
9721
- styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
9722
- }
9723
- if (props.thickness) {
9724
- styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
9725
- }
9726
- return styles;
9727
- });
9728
- useRender(() => {
9729
- const divider = vue.createElementVNode("hr", {
9730
- "class": vue.normalizeClass([{
9731
- 'v-divider': true,
9732
- 'v-divider--inset': props.inset,
9733
- 'v-divider--vertical': props.vertical
9734
- }, themeClasses.value, textColorClasses.value, props.class]),
9735
- "style": vue.normalizeStyle([dividerStyles.value, textColorStyles.value, {
9736
- '--v-border-opacity': props.opacity
9737
- }, props.style]),
9738
- "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
9739
- "role": `${attrs.role || 'separator'}`
9740
- }, null);
9741
- if (!slots.default) return divider;
9742
- return vue.createElementVNode("div", {
9743
- "class": vue.normalizeClass(['v-divider__wrapper', {
9744
- 'v-divider__wrapper--vertical': props.vertical,
9745
- 'v-divider__wrapper--inset': props.inset
9746
- }])
9747
- }, [divider, vue.createElementVNode("div", {
9748
- "class": "v-divider__content"
9749
- }, [slots.default()]), divider]);
9750
- });
9751
- return {};
9752
- }
9753
- });
9754
-
9755
9878
  // Types
9756
9879
 
9757
9880
  const makeVListChildrenProps = propsFactory({
@@ -9868,7 +9991,7 @@
9868
9991
  const _props = {
9869
9992
  title,
9870
9993
  value,
9871
- ...camelizeProps(itemProps)
9994
+ ...itemProps
9872
9995
  };
9873
9996
  return {
9874
9997
  title: String(_props.title ?? ''),
@@ -10020,6 +10143,7 @@
10020
10143
  activeClass: String,
10021
10144
  bgColor: String,
10022
10145
  disabled: Boolean,
10146
+ filterable: Boolean,
10023
10147
  expandIcon: IconValue,
10024
10148
  collapseIcon: IconValue,
10025
10149
  lines: {
@@ -10103,7 +10227,9 @@
10103
10227
  const activeColor = vue.toRef(() => props.activeColor);
10104
10228
  const baseColor = vue.toRef(() => props.baseColor);
10105
10229
  const color = vue.toRef(() => props.color);
10106
- createList();
10230
+ createList({
10231
+ filterable: props.filterable
10232
+ });
10107
10233
  provideDefaults({
10108
10234
  VListGroup: {
10109
10235
  activeColor,
@@ -12680,7 +12806,12 @@
12680
12806
  }
12681
12807
  function calculateOffset(index) {
12682
12808
  index = clamp(index, 0, items.value.length - 1);
12683
- return offsets[index] || 0;
12809
+ const whole = Math.floor(index);
12810
+ const fraction = index % 1;
12811
+ const next = whole + 1;
12812
+ const wholeOffset = offsets[whole] || 0;
12813
+ const nextOffset = offsets[next] || wholeOffset;
12814
+ return wholeOffset + (nextOffset - wholeOffset) * fraction;
12684
12815
  }
12685
12816
  function calculateIndex(scrollTop) {
12686
12817
  return binaryClosest(offsets, scrollTop);
@@ -13034,6 +13165,7 @@
13034
13165
  },
13035
13166
  openOnClear: Boolean,
13036
13167
  itemColor: String,
13168
+ noAutoScroll: Boolean,
13037
13169
  ...makeItemsProps({
13038
13170
  itemChildren: false
13039
13171
  })
@@ -13248,7 +13380,7 @@
13248
13380
  vue.watch(menu, () => {
13249
13381
  if (!props.hideSelected && menu.value && model.value.length) {
13250
13382
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
13251
- IN_BROWSER && window.requestAnimationFrame(() => {
13383
+ IN_BROWSER && !props.noAutoScroll && window.requestAnimationFrame(() => {
13252
13384
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
13253
13385
  });
13254
13386
  }
@@ -13335,11 +13467,28 @@
13335
13467
  index,
13336
13468
  itemRef
13337
13469
  } = _ref2;
13470
+ const camelizedProps = camelizeProps(item.props);
13338
13471
  const itemProps = vue.mergeProps(item.props, {
13339
13472
  ref: itemRef,
13340
13473
  key: item.value,
13341
13474
  onClick: () => select(item, null)
13342
13475
  });
13476
+ if (item.raw.type === 'divider') {
13477
+ return slots.divider?.({
13478
+ props: item.raw,
13479
+ index
13480
+ }) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
13481
+ "key": `divider-${index}`
13482
+ }), null);
13483
+ }
13484
+ if (item.raw.type === 'subheader') {
13485
+ return slots.subheader?.({
13486
+ props: item.raw,
13487
+ index
13488
+ }) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
13489
+ "key": `subheader-${index}`
13490
+ }), null);
13491
+ }
13343
13492
  return slots.item?.({
13344
13493
  item,
13345
13494
  index,
@@ -13356,10 +13505,10 @@
13356
13505
  "modelValue": isSelected,
13357
13506
  "ripple": false,
13358
13507
  "tabindex": "-1"
13359
- }, null) : undefined, item.props.prependAvatar && vue.createVNode(VAvatar, {
13360
- "image": item.props.prependAvatar
13361
- }, null), item.props.prependIcon && vue.createVNode(VIcon, {
13362
- "icon": item.props.prependIcon
13508
+ }, null) : undefined, camelizedProps.prependAvatar && vue.createVNode(VAvatar, {
13509
+ "image": camelizedProps.prependAvatar
13510
+ }, null), camelizedProps.prependIcon && vue.createVNode(VIcon, {
13511
+ "icon": camelizedProps.prependIcon
13363
13512
  }, null)]);
13364
13513
  }
13365
13514
  });
@@ -13500,6 +13649,9 @@
13500
13649
  let match = -1;
13501
13650
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13502
13651
  if (typeof item === 'object') {
13652
+ if (['divider', 'subheader'].includes(item.raw?.type)) {
13653
+ continue;
13654
+ }
13503
13655
  const filterKeys = keys || Object.keys(transformed);
13504
13656
  for (const key of filterKeys) {
13505
13657
  const value = getPropertyFromItem(transformed, key);
@@ -13702,7 +13854,7 @@
13702
13854
  menu.value = !menu.value;
13703
13855
  }
13704
13856
  function onListKeydown(e) {
13705
- if (e.key !== ' ' && checkPrintable(e)) {
13857
+ if (checkPrintable(e) || e.key === 'Backspace') {
13706
13858
  vTextFieldRef.value?.focus();
13707
13859
  }
13708
13860
  }
@@ -13907,6 +14059,7 @@
13907
14059
  }, props.menuProps), {
13908
14060
  default: () => [hasList && vue.createVNode(VList, vue.mergeProps({
13909
14061
  "ref": listRef,
14062
+ "filterable": true,
13910
14063
  "selected": selectedValues.value,
13911
14064
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
13912
14065
  "onMousedown": e => e.preventDefault(),
@@ -13938,6 +14091,22 @@
13938
14091
  active: highlightFirst.value && index === 0 ? true : undefined,
13939
14092
  onClick: () => select(item, null)
13940
14093
  });
14094
+ if (item.raw.type === 'divider') {
14095
+ return slots.divider?.({
14096
+ props: item.raw,
14097
+ index
14098
+ }) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
14099
+ "key": `divider-${index}`
14100
+ }), null);
14101
+ }
14102
+ if (item.raw.type === 'subheader') {
14103
+ return slots.subheader?.({
14104
+ props: item.raw,
14105
+ index
14106
+ }) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
14107
+ "key": `subheader-${index}`
14108
+ }), null);
14109
+ }
13941
14110
  return slots.item?.({
13942
14111
  item,
13943
14112
  index,
@@ -14082,7 +14251,8 @@
14082
14251
  ...makeThemeProps(),
14083
14252
  ...makeTransitionProps({
14084
14253
  transition: 'scale-rotate-transition'
14085
- })
14254
+ }),
14255
+ ...makeDimensionProps()
14086
14256
  }, 'VBadge');
14087
14257
  const VBadge = genericComponent()({
14088
14258
  name: 'VBadge',
@@ -14112,6 +14282,9 @@
14112
14282
  const base = props.floating ? props.dot ? 2 : 4 : props.dot ? 8 : 12;
14113
14283
  return base + (['top', 'bottom'].includes(side) ? Number(props.offsetY ?? 0) : ['left', 'right'].includes(side) ? Number(props.offsetX ?? 0) : 0);
14114
14284
  });
14285
+ const {
14286
+ dimensionStyles
14287
+ } = useDimension(props);
14115
14288
  useRender(() => {
14116
14289
  const value = Number(props.content);
14117
14290
  const content = !props.max || isNaN(value) ? props.content : value <= Number(props.max) ? value : `${props.max}+`;
@@ -14133,7 +14306,7 @@
14133
14306
  }, {
14134
14307
  default: () => [vue.withDirectives(vue.createElementVNode("span", vue.mergeProps({
14135
14308
  "class": ['v-badge__badge', themeClasses.value, backgroundColorClasses.value, roundedClasses.value, textColorClasses.value],
14136
- "style": [backgroundColorStyles.value, textColorStyles.value, props.inline ? {} : locationStyles.value],
14309
+ "style": [backgroundColorStyles.value, textColorStyles.value, dimensionStyles.value, props.inline ? {} : locationStyles.value],
14137
14310
  "aria-atomic": "true",
14138
14311
  "aria-label": t(props.label, value),
14139
14312
  "aria-live": "polite",
@@ -17542,13 +17715,13 @@
17542
17715
  return null;
17543
17716
  }
17544
17717
  const sundayJanuarySecond2000 = new Date(2000, 0, 2);
17545
- function getWeekdays(locale, firstDayOfWeek) {
17718
+ function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
17546
17719
  const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
17547
17720
  return createRange(7).map(i => {
17548
17721
  const weekday = new Date(sundayJanuarySecond2000);
17549
17722
  weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
17550
17723
  return new Intl.DateTimeFormat(locale, {
17551
- weekday: 'narrow'
17724
+ weekday: weekdayFormat ?? 'narrow'
17552
17725
  }).format(weekday);
17553
17726
  });
17554
17727
  }
@@ -17807,7 +17980,7 @@
17807
17980
  const yearStart = new Date(year, 0, 1);
17808
17981
  const size = firstWeekSize(year);
17809
17982
  const d1w1 = size >= minWeekSize ? addDays(yearStart, size - 7) : addDays(yearStart, size);
17810
- return 1 + getDiff(date, d1w1, 'weeks');
17983
+ return 1 + getDiff(endOfDay(date), startOfDay(d1w1), 'weeks');
17811
17984
  }
17812
17985
  function getDate(date) {
17813
17986
  return date.getDate();
@@ -18012,9 +18185,9 @@
18012
18185
  getDiff(date, comparing, unit) {
18013
18186
  return getDiff(date, comparing, unit);
18014
18187
  }
18015
- getWeekdays(firstDayOfWeek) {
18188
+ getWeekdays(firstDayOfWeek, weekdayFormat) {
18016
18189
  const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
18017
- return getWeekdays(this.locale, firstDay);
18190
+ return getWeekdays(this.locale, firstDay, weekdayFormat);
18018
18191
  }
18019
18192
  getYear(date) {
18020
18193
  return getYear(date);
@@ -18111,7 +18284,7 @@
18111
18284
  };
18112
18285
  }
18113
18286
  function createDateRange(adapter, start, stop) {
18114
- const diff = adapter.getDiff(stop ?? start, start, 'days');
18287
+ const diff = adapter.getDiff(adapter.endOfDay(stop ?? start), adapter.startOfDay(start), 'days');
18115
18288
  const datesInRange = [start];
18116
18289
  for (let i = 1; i < diff; i++) {
18117
18290
  const nextDate = adapter.addDays(start, i);
@@ -18369,6 +18542,7 @@
18369
18542
  _search.value = val ?? '';
18370
18543
  if (!props.multiple && !hasSelectionSlot.value) {
18371
18544
  model.value = [transformItem$3(props, val)];
18545
+ vue.nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18372
18546
  }
18373
18547
  if (val && props.multiple && props.delimiters?.length) {
18374
18548
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18449,7 +18623,7 @@
18449
18623
  menu.value = !menu.value;
18450
18624
  }
18451
18625
  function onListKeydown(e) {
18452
- if (e.key !== ' ' && checkPrintable(e)) {
18626
+ if (checkPrintable(e) || e.key === 'Backspace') {
18453
18627
  vTextFieldRef.value?.focus();
18454
18628
  }
18455
18629
  }
@@ -18654,6 +18828,7 @@
18654
18828
  }, props.menuProps), {
18655
18829
  default: () => [hasList && vue.createVNode(VList, vue.mergeProps({
18656
18830
  "ref": listRef,
18831
+ "filterable": true,
18657
18832
  "selected": selectedValues.value,
18658
18833
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
18659
18834
  "onMousedown": e => e.preventDefault(),
@@ -18685,6 +18860,22 @@
18685
18860
  active: highlightFirst.value && index === 0 ? true : undefined,
18686
18861
  onClick: () => select(item, null)
18687
18862
  });
18863
+ if (item.raw.type === 'divider') {
18864
+ return slots.divider?.({
18865
+ props: item.raw,
18866
+ index
18867
+ }) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
18868
+ "key": `divider-${index}`
18869
+ }), null);
18870
+ }
18871
+ if (item.raw.type === 'subheader') {
18872
+ return slots.subheader?.({
18873
+ props: item.raw,
18874
+ index
18875
+ }) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
18876
+ "key": `subheader-${index}`
18877
+ }), null);
18878
+ }
18688
18879
  return slots.item?.({
18689
18880
  item,
18690
18881
  index,
@@ -20567,6 +20758,7 @@
20567
20758
  color: String,
20568
20759
  disableSort: Boolean,
20569
20760
  fixedHeader: Boolean,
20761
+ lastFixed: Boolean,
20570
20762
  multiSort: Boolean,
20571
20763
  sortAscIcon: {
20572
20764
  type: IconValue,
@@ -20613,10 +20805,11 @@
20613
20805
  loaderClasses
20614
20806
  } = useLoader(props);
20615
20807
  function getFixedStyles(column, y) {
20616
- if (!(props.sticky || props.fixedHeader) && !column.fixed) return undefined;
20808
+ if (!(props.sticky || props.fixedHeader) && !(column.fixed || column.lastFixed)) return undefined;
20617
20809
  return {
20618
20810
  position: 'sticky',
20619
- left: column.fixed ? convertToUnit(column.fixedOffset) : undefined,
20811
+ left: column.fixed || column.lastFixed ? convertToUnit(column.fixedOffset) : undefined,
20812
+ right: column.lastFixed ? convertToUnit(column.fixedOffset ?? 0) : undefined,
20620
20813
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
20621
20814
  };
20622
20815
  }
@@ -21132,11 +21325,18 @@
21132
21325
  }
21133
21326
  });
21134
21327
 
21328
+ // Types
21329
+
21135
21330
  const makeVTableProps = propsFactory({
21136
21331
  fixedHeader: Boolean,
21137
21332
  fixedFooter: Boolean,
21138
21333
  height: [Number, String],
21139
21334
  hover: Boolean,
21335
+ striped: {
21336
+ type: String,
21337
+ default: null,
21338
+ validator: v => ['even', 'odd'].includes(v)
21339
+ },
21140
21340
  ...makeComponentProps(),
21141
21341
  ...makeDensityProps(),
21142
21342
  ...makeTagProps(),
@@ -21163,7 +21363,9 @@
21163
21363
  'v-table--fixed-footer': props.fixedFooter,
21164
21364
  'v-table--has-top': !!slots.top,
21165
21365
  'v-table--has-bottom': !!slots.bottom,
21166
- 'v-table--hover': props.hover
21366
+ 'v-table--hover': props.hover,
21367
+ 'v-table--striped-even': props.striped === 'even',
21368
+ 'v-table--striped-odd': props.striped === 'odd'
21167
21369
  }, themeClasses.value, densityClasses.value, props.class]),
21168
21370
  "style": vue.normalizeStyle(props.style)
21169
21371
  }, {
@@ -22338,7 +22540,8 @@
22338
22540
  firstDayOfWeek: {
22339
22541
  type: [Number, String],
22340
22542
  default: undefined
22341
- }
22543
+ },
22544
+ weekdayFormat: String
22342
22545
  }, 'calendar');
22343
22546
  function useCalendar(props) {
22344
22547
  const adapter = useDate();
@@ -22579,7 +22782,7 @@
22579
22782
  "ref": daysRef,
22580
22783
  "key": daysInMonth.value[0].date?.toString(),
22581
22784
  "class": "v-date-picker-month__days"
22582
- }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => vue.createElementVNode("div", {
22785
+ }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => vue.createElementVNode("div", {
22583
22786
  "class": vue.normalizeClass(['v-date-picker-month__day', 'v-date-picker-month__weekday'])
22584
22787
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22585
22788
  const slotProps = {
@@ -24194,6 +24397,9 @@
24194
24397
  startStatus.value = status;
24195
24398
  } else if (side === 'end') {
24196
24399
  endStatus.value = status;
24400
+ } else if (side === 'both') {
24401
+ startStatus.value = status;
24402
+ endStatus.value = status;
24197
24403
  }
24198
24404
  }
24199
24405
  function getStatus(side) {
@@ -24305,6 +24511,32 @@
24305
24511
  }, [renderSide('end', endStatus.value)])]
24306
24512
  });
24307
24513
  });
24514
+ function reset(side) {
24515
+ const effectiveSide = side ?? props.side;
24516
+ setStatus(effectiveSide, 'ok');
24517
+ vue.nextTick(() => {
24518
+ setScrollAmount(getScrollSize() - previousScrollSize + getScrollAmount());
24519
+ if (props.mode !== 'manual') {
24520
+ vue.nextTick(() => {
24521
+ window.requestAnimationFrame(() => {
24522
+ window.requestAnimationFrame(() => {
24523
+ window.requestAnimationFrame(() => {
24524
+ if (effectiveSide === 'both') {
24525
+ intersecting('start');
24526
+ intersecting('end');
24527
+ } else {
24528
+ intersecting(effectiveSide);
24529
+ }
24530
+ });
24531
+ });
24532
+ });
24533
+ });
24534
+ }
24535
+ });
24536
+ }
24537
+ return {
24538
+ reset
24539
+ };
24308
24540
  }
24309
24541
  });
24310
24542
 
@@ -25223,6 +25455,10 @@
25223
25455
  type: Number,
25224
25456
  default: 0
25225
25457
  },
25458
+ minFractionDigits: {
25459
+ type: Number,
25460
+ default: null
25461
+ },
25226
25462
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
25227
25463
  }, 'VNumberInput');
25228
25464
  const VNumberInput = genericComponent()({
@@ -25250,9 +25486,19 @@
25250
25486
  const isFocused = vue.shallowRef(props.focused);
25251
25487
  function correctPrecision(val) {
25252
25488
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
25253
- const fixed = precision == null ? String(val) : val.toFixed(precision);
25254
- return isFocused.value ? Number(fixed).toString() // trim zeros
25255
- : fixed;
25489
+ if (precision == null) {
25490
+ return String(val);
25491
+ }
25492
+ let fixed = val.toFixed(precision);
25493
+ if (isFocused.value) {
25494
+ return Number(fixed).toString(); // trim zeros
25495
+ }
25496
+ if ((props.minFractionDigits ?? precision) < precision) {
25497
+ const trimLimit = precision - props.minFractionDigits;
25498
+ const [baseDigits, fractionDigits] = fixed.split('.');
25499
+ fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
25500
+ }
25501
+ return fixed;
25256
25502
  }
25257
25503
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
25258
25504
  const _inputText = vue.shallowRef(null);
@@ -25307,6 +25553,7 @@
25307
25553
  }
25308
25554
  };
25309
25555
  vue.watch(() => props.precision, () => formatInputValue());
25556
+ vue.watch(() => props.minFractionDigits, () => formatInputValue());
25310
25557
  vue.onMounted(() => {
25311
25558
  clampModel();
25312
25559
  });
@@ -25421,7 +25668,7 @@
25421
25668
  inputText.value = null;
25422
25669
  return;
25423
25670
  }
25424
- inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25671
+ inputText.value = correctPrecision(model.value);
25425
25672
  }
25426
25673
  function trimDecimalZeros() {
25427
25674
  if (controlsDisabled.value) return;
@@ -25681,9 +25928,10 @@
25681
25928
  e.preventDefault();
25682
25929
  e.stopPropagation();
25683
25930
  const clipboardText = e?.clipboardData?.getData('Text').trim().slice(0, length.value) ?? '';
25931
+ const finalIndex = clipboardText.length - 1 === -1 ? index : clipboardText.length - 1;
25684
25932
  if (isValidNumber(clipboardText)) return;
25685
25933
  model.value = clipboardText.split('');
25686
- inputRef.value?.[index].blur();
25934
+ inputRef.value?.[finalIndex].focus();
25687
25935
  }
25688
25936
  function reset() {
25689
25937
  model.value = [];
@@ -29468,7 +29716,7 @@
29468
29716
  };
29469
29717
  });
29470
29718
  }
29471
- const version$1 = "3.8.8-master.2025-06-08";
29719
+ const version$1 = "3.8.9-dev.2025-06-11";
29472
29720
  createVuetify$1.version = version$1;
29473
29721
 
29474
29722
  // Vue's inject() can only be used in setup
@@ -29493,7 +29741,7 @@
29493
29741
  ...options
29494
29742
  });
29495
29743
  };
29496
- const version = "3.8.8-master.2025-06-08";
29744
+ const version = "3.8.9-dev.2025-06-11";
29497
29745
  createVuetify.version = version;
29498
29746
 
29499
29747
  exports.blueprints = index;