@vuetify/nightly 3.8.6-master.2025-05-26 → 3.8.7-dev.2025-05-30

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 (149) hide show
  1. package/CHANGELOG.md +25 -20
  2. package/dist/json/attributes.json +3672 -3588
  3. package/dist/json/importMap-labs.json +28 -28
  4. package/dist/json/importMap.json +164 -164
  5. package/dist/json/tags.json +21 -0
  6. package/dist/json/web-types.json +6618 -6326
  7. package/dist/vuetify-labs.cjs +338 -140
  8. package/dist/vuetify-labs.css +4581 -4553
  9. package/dist/vuetify-labs.d.ts +1533 -1116
  10. package/dist/vuetify-labs.esm.js +339 -141
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +338 -140
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +332 -129
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +3805 -3777
  17. package/dist/vuetify.d.ts +1022 -645
  18. package/dist/vuetify.esm.js +333 -130
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +332 -129
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1200 -1185
  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/VAppBarNavIcon.d.ts +20 -10
  31. package/lib/components/VAutocomplete/VAutocomplete.d.ts +154 -103
  32. package/lib/components/VAutocomplete/VAutocomplete.js +21 -3
  33. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  34. package/lib/components/VBtn/VBtn.d.ts +20 -10
  35. package/lib/components/VBtnGroup/VBtnGroup.css +30 -7
  36. package/lib/components/VBtnGroup/VBtnGroup.d.ts +58 -32
  37. package/lib/components/VBtnGroup/VBtnGroup.js +7 -3
  38. package/lib/components/VBtnGroup/VBtnGroup.js.map +1 -1
  39. package/lib/components/VBtnGroup/VBtnGroup.sass +44 -17
  40. package/lib/components/VBtnToggle/VBtnToggle.d.ts +25 -0
  41. package/lib/components/VCard/VCard.d.ts +20 -10
  42. package/lib/components/VCheckbox/VCheckbox.d.ts +23 -13
  43. package/lib/components/VCheckbox/VCheckboxBtn.d.ts +20 -10
  44. package/lib/components/VChip/VChip.d.ts +20 -10
  45. package/lib/components/VChipGroup/VChipGroup.d.ts +10 -0
  46. package/lib/components/VCombobox/VCombobox.d.ts +154 -103
  47. package/lib/components/VCombobox/VCombobox.js +22 -3
  48. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  49. package/lib/components/VDataTable/VDataTable.d.ts +18 -0
  50. package/lib/components/VDataTable/VDataTableHeaders.d.ts +13 -0
  51. package/lib/components/VDataTable/VDataTableHeaders.js +4 -2
  52. package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
  53. package/lib/components/VDataTable/VDataTableServer.d.ts +13 -0
  54. package/lib/components/VDataTable/VDataTableVirtual.d.ts +13 -0
  55. package/lib/components/VDatePicker/VDatePicker.d.ts +10 -0
  56. package/lib/components/VDatePicker/VDatePickerMonth.d.ts +10 -0
  57. package/lib/components/VDatePicker/VDatePickerMonth.js +1 -1
  58. package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
  59. package/lib/components/VExpansionPanel/VExpansionPanel.d.ts +20 -10
  60. package/lib/components/VExpansionPanel/VExpansionPanelTitle.d.ts +20 -10
  61. package/lib/components/VExpansionPanel/VExpansionPanels.d.ts +20 -10
  62. package/lib/components/VFab/VFab.d.ts +20 -10
  63. package/lib/components/VField/VField.d.ts +3 -3
  64. package/lib/components/VFileInput/VFileInput.d.ts +15 -15
  65. package/lib/components/VInput/VInput.d.ts +4 -4
  66. package/lib/components/VList/VList.d.ts +13 -0
  67. package/lib/components/VList/VList.js +4 -1
  68. package/lib/components/VList/VList.js.map +1 -1
  69. package/lib/components/VList/VListChildren.js.map +1 -1
  70. package/lib/components/VList/VListItem.d.ts +23 -10
  71. package/lib/components/VList/VListItem.js +7 -3
  72. package/lib/components/VList/VListItem.js.map +1 -1
  73. package/lib/components/VList/list.d.ts +9 -2
  74. package/lib/components/VList/list.js +7 -0
  75. package/lib/components/VList/list.js.map +1 -1
  76. package/lib/components/VNumberInput/VNumberInput.d.ts +103 -89
  77. package/lib/components/VNumberInput/VNumberInput.js +19 -4
  78. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  79. package/lib/components/VOtpInput/VOtpInput.js +2 -1
  80. package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
  81. package/lib/components/VOverlay/VOverlay.css +1 -1
  82. package/lib/components/VOverlay/_variables.scss +1 -1
  83. package/lib/components/VRadio/VRadio.d.ts +20 -10
  84. package/lib/components/VRadioGroup/VRadioGroup.d.ts +23 -13
  85. package/lib/components/VRangeSlider/VRangeSlider.d.ts +3 -3
  86. package/lib/components/VSelect/VSelect.d.ts +171 -107
  87. package/lib/components/VSelect/VSelect.js +21 -3
  88. package/lib/components/VSelect/VSelect.js.map +1 -1
  89. package/lib/components/VSelectionControl/VSelectionControl.d.ts +20 -10
  90. package/lib/components/VSelectionControlGroup/VSelectionControlGroup.d.ts +28 -14
  91. package/lib/components/VSlideGroup/VSlideGroup.d.ts +10 -0
  92. package/lib/components/VSlideGroup/VSlideGroup.js +2 -1
  93. package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
  94. package/lib/components/VSlider/VSlider.d.ts +3 -3
  95. package/lib/components/VSlider/VSliderThumb.d.ts +20 -10
  96. package/lib/components/VStepper/VStepperItem.d.ts +28 -14
  97. package/lib/components/VSwitch/VSwitch.d.ts +23 -13
  98. package/lib/components/VTabs/VTab.d.ts +56 -28
  99. package/lib/components/VTabs/VTabs.d.ts +10 -0
  100. package/lib/components/VTextField/VTextField.d.ts +27 -27
  101. package/lib/components/VTextarea/VTextarea.d.ts +15 -15
  102. package/lib/composables/calendar.d.ts +6 -0
  103. package/lib/composables/calendar.js +2 -1
  104. package/lib/composables/calendar.js.map +1 -1
  105. package/lib/composables/date/DateAdapter.d.ts +1 -1
  106. package/lib/composables/date/DateAdapter.js.map +1 -1
  107. package/lib/composables/date/adapters/vuetify.d.ts +1 -1
  108. package/lib/composables/date/adapters/vuetify.js +4 -4
  109. package/lib/composables/date/adapters/vuetify.js.map +1 -1
  110. package/lib/composables/date/date.d.ts +1 -1
  111. package/lib/composables/date/index.d.ts +1 -0
  112. package/lib/composables/date/index.js +1 -0
  113. package/lib/composables/date/index.js.map +1 -1
  114. package/lib/composables/filter.js +3 -0
  115. package/lib/composables/filter.js.map +1 -1
  116. package/lib/composables/iconSizes.d.ts +28 -0
  117. package/lib/composables/iconSizes.js +23 -0
  118. package/lib/composables/iconSizes.js.map +1 -0
  119. package/lib/composables/theme.d.ts +6 -1
  120. package/lib/composables/theme.js +94 -26
  121. package/lib/composables/theme.js.map +1 -1
  122. package/lib/composables/virtual.js +6 -1
  123. package/lib/composables/virtual.js.map +1 -1
  124. package/lib/directives/ripple/index.d.ts +2 -1
  125. package/lib/directives/ripple/index.js +12 -7
  126. package/lib/directives/ripple/index.js.map +1 -1
  127. package/lib/entry-bundler.d.ts +1 -1
  128. package/lib/entry-bundler.js +1 -1
  129. package/lib/entry-bundler.js.map +1 -1
  130. package/lib/framework.d.ts +64 -59
  131. package/lib/framework.js +1 -1
  132. package/lib/framework.js.map +1 -1
  133. package/lib/labs/VCalendar/VCalendar.d.ts +10 -0
  134. package/lib/labs/VColorInput/VColorInput.d.ts +3 -3
  135. package/lib/labs/VDateInput/VDateInput.d.ts +97 -87
  136. package/lib/labs/VFileUpload/VFileUpload.d.ts +3 -3
  137. package/lib/labs/VFileUpload/VFileUploadItem.d.ts +20 -10
  138. package/lib/labs/VIconBtn/VIconBtn.d.ts +29 -29
  139. package/lib/labs/VIconBtn/VIconBtn.js +7 -11
  140. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  141. package/lib/labs/VStepperVertical/VStepperVertical.d.ts +20 -10
  142. package/lib/labs/VStepperVertical/VStepperVerticalItem.d.ts +20 -10
  143. package/lib/labs/VTreeview/VTreeview.d.ts +13 -0
  144. package/lib/labs/VTreeview/VTreeviewItem.d.ts +20 -10
  145. package/lib/labs/entry-bundler.d.ts +1 -1
  146. package/lib/util/globals.d.ts +1 -0
  147. package/lib/util/globals.js +1 -0
  148. package/lib/util/globals.js.map +1 -1
  149. package/package.json +3 -1
@@ -1,15 +1,16 @@
1
1
  /*!
2
- * Vuetify v3.8.6-master.2025-05-26
2
+ * Vuetify v3.8.7-dev.2025-05-30
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, 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, 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"); }
@@ -2824,6 +2825,7 @@ const makeThemeProps = propsFactory({
2824
2825
  function genDefaults$1() {
2825
2826
  return {
2826
2827
  defaultTheme: 'light',
2828
+ prefix: 'v-',
2827
2829
  variations: {
2828
2830
  colors: [],
2829
2831
  lighten: 0,
@@ -2905,7 +2907,10 @@ function genDefaults$1() {
2905
2907
  }
2906
2908
  }
2907
2909
  },
2908
- stylesheetId: 'vuetify-theme-stylesheet'
2910
+ stylesheetId: 'vuetify-theme-stylesheet',
2911
+ scoped: false,
2912
+ unimportant: false,
2913
+ utilities: true
2909
2914
  };
2910
2915
  }
2911
2916
  function parseThemeOptions() {
@@ -2928,21 +2933,21 @@ function parseThemeOptions() {
2928
2933
  function createCssClass(lines, selector, content, scope) {
2929
2934
  lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
2930
2935
  }
2931
- function genCssVariables(theme) {
2936
+ function genCssVariables(theme, prefix) {
2932
2937
  const lightOverlay = theme.dark ? 2 : 1;
2933
2938
  const darkOverlay = theme.dark ? 1 : 2;
2934
2939
  const variables = [];
2935
2940
  for (const [key, value] of Object.entries(theme.colors)) {
2936
2941
  const rgb = parseColor(value);
2937
- variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2942
+ variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2938
2943
  if (!key.startsWith('on-')) {
2939
- variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2944
+ variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2940
2945
  }
2941
2946
  }
2942
2947
  for (const [key, value] of Object.entries(theme.variables)) {
2943
2948
  const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
2944
2949
  const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
2945
- variables.push(`--v-${key}: ${rgb ?? value}`);
2950
+ variables.push(`--${prefix}${key}: ${rgb ?? value}`);
2946
2951
  }
2947
2952
  return variables;
2948
2953
  }
@@ -2986,7 +2991,8 @@ function getScopedSelector(selector, scope) {
2986
2991
  const scopeSelector = `:where(${scope})`;
2987
2992
  return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
2988
2993
  }
2989
- function upsertStyles(styleEl, styles) {
2994
+ function upsertStyles(id, cspNonce, styles) {
2995
+ const styleEl = getOrCreateStyleElement(id, cspNonce);
2990
2996
  if (!styleEl) return;
2991
2997
  styleEl.innerHTML = styles;
2992
2998
  }
@@ -3006,8 +3012,17 @@ function getOrCreateStyleElement(id, cspNonce) {
3006
3012
  // Composables
3007
3013
  function createTheme(options) {
3008
3014
  const parsedOptions = parseThemeOptions(options);
3009
- const name = shallowRef(parsedOptions.defaultTheme);
3015
+ const _name = shallowRef(parsedOptions.defaultTheme);
3010
3016
  const themes = ref(parsedOptions.themes);
3017
+ const systemName = shallowRef('light');
3018
+ const name = computed({
3019
+ get() {
3020
+ return _name.value === 'system' ? systemName.value : _name.value;
3021
+ },
3022
+ set(val) {
3023
+ _name.value = val;
3024
+ }
3025
+ });
3011
3026
  const computedThemes = computed(() => {
3012
3027
  const acc = {};
3013
3028
  for (const [name, original] of Object.entries(themes.value)) {
@@ -3028,28 +3043,49 @@ function createTheme(options) {
3028
3043
  const current = toRef(() => computedThemes.value[name.value]);
3029
3044
  const styles = computed(() => {
3030
3045
  const lines = [];
3046
+ const important = parsedOptions.unimportant ? '' : ' !important';
3047
+ const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
3031
3048
  if (current.value?.dark) {
3032
3049
  createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
3033
3050
  }
3034
- createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
3051
+ createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
3035
3052
  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);
3053
+ createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
3054
+ }
3055
+ if (parsedOptions.utilities) {
3056
+ const bgLines = [];
3057
+ const fgLines = [];
3058
+ const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
3059
+ for (const key of colors) {
3060
+ if (key.startsWith('on-')) {
3061
+ createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
3062
+ } else {
3063
+ 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);
3064
+ createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
3065
+ createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
3066
+ }
3048
3067
  }
3068
+ lines.push(...bgLines, ...fgLines);
3049
3069
  }
3050
- lines.push(...bgLines, ...fgLines);
3051
3070
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
3052
3071
  });
3072
+ const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
3073
+ const themeNames = toRef(() => Object.keys(computedThemes.value));
3074
+ if (SUPPORTS_MATCH_MEDIA) {
3075
+ const media = window.matchMedia('(prefers-color-scheme: dark)');
3076
+ function updateSystemName() {
3077
+ systemName.value = media.matches ? 'dark' : 'light';
3078
+ }
3079
+ updateSystemName();
3080
+ media.addEventListener('change', updateSystemName, {
3081
+ passive: true
3082
+ });
3083
+ if (getCurrentScope()) {
3084
+ onScopeDispose(() => {
3085
+ media.removeEventListener('change', updateSystemName);
3086
+ });
3087
+ }
3088
+ }
3053
3089
  function install(app) {
3054
3090
  if (parsedOptions.isDisabled) return;
3055
3091
  const head = app._context.provides.usehead;
@@ -3087,22 +3123,55 @@ function createTheme(options) {
3087
3123
  updateStyles();
3088
3124
  }
3089
3125
  function updateStyles() {
3090
- upsertStyles(getOrCreateStyleElement(parsedOptions.stylesheetId, parsedOptions.cspNonce), styles.value);
3126
+ upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
3091
3127
  }
3092
3128
  }
3093
3129
  }
3094
- const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);
3130
+ function change(themeName) {
3131
+ if (!themeNames.value.includes(themeName)) {
3132
+ consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
3133
+ return;
3134
+ }
3135
+ name.value = themeName;
3136
+ }
3137
+ function cycle() {
3138
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
3139
+ const currentIndex = themeArray.indexOf(name.value);
3140
+ const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
3141
+ change(themeArray[nextIndex]);
3142
+ }
3143
+ function toggle() {
3144
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
3145
+ cycle(themeArray);
3146
+ }
3147
+ const globalName = new Proxy(name, {
3148
+ get(target, prop) {
3149
+ return target[prop];
3150
+ },
3151
+ set(target, prop, val) {
3152
+ if (prop === 'value') {
3153
+ deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
3154
+ }
3155
+ // @ts-expect-error
3156
+ target[prop] = val;
3157
+ return true;
3158
+ }
3159
+ });
3095
3160
  return {
3096
3161
  install,
3162
+ change,
3163
+ cycle,
3164
+ toggle,
3097
3165
  isDisabled: parsedOptions.isDisabled,
3098
3166
  name,
3099
3167
  themes,
3100
3168
  current,
3101
3169
  computedThemes,
3170
+ prefix: parsedOptions.prefix,
3102
3171
  themeClasses,
3103
3172
  styles,
3104
3173
  global: {
3105
- name,
3174
+ name: globalName,
3106
3175
  current
3107
3176
  }
3108
3177
  };
@@ -3113,7 +3182,7 @@ function provideTheme(props) {
3113
3182
  if (!theme) throw new Error('Could not find Vuetify theme injection');
3114
3183
  const name = toRef(() => props.theme ?? theme.name.value);
3115
3184
  const current = toRef(() => theme.themes.value[name.value]);
3116
- const themeClasses = toRef(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);
3185
+ const themeClasses = toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
3117
3186
  const newTheme = {
3118
3187
  ...theme,
3119
3188
  name,
@@ -4660,9 +4729,15 @@ function useVariant(props) {
4660
4729
  };
4661
4730
  }
4662
4731
 
4732
+ // Types
4733
+
4663
4734
  const makeVBtnGroupProps = propsFactory({
4664
4735
  baseColor: String,
4665
4736
  divided: Boolean,
4737
+ direction: {
4738
+ type: String,
4739
+ default: 'horizontal'
4740
+ },
4666
4741
  ...makeBorderProps(),
4667
4742
  ...makeComponentProps(),
4668
4743
  ...makeDensityProps(),
@@ -4696,7 +4771,7 @@ const VBtnGroup = genericComponent()({
4696
4771
  } = useRounded(props);
4697
4772
  provideDefaults({
4698
4773
  VBtn: {
4699
- height: 'auto',
4774
+ height: toRef(() => props.direction === 'horizontal' ? 'auto' : null),
4700
4775
  baseColor: toRef(() => props.baseColor),
4701
4776
  color: toRef(() => props.color),
4702
4777
  density: toRef(() => props.density),
@@ -4706,7 +4781,7 @@ const VBtnGroup = genericComponent()({
4706
4781
  });
4707
4782
  useRender(() => {
4708
4783
  return createVNode(props.tag, {
4709
- "class": normalizeClass(['v-btn-group', {
4784
+ "class": normalizeClass(['v-btn-group', `v-btn-group--${props.direction}`, {
4710
4785
  'v-btn-group--divided': props.divided
4711
4786
  }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
4712
4787
  "style": normalizeStyle(props.style)
@@ -5829,8 +5904,8 @@ function rippleCancelShow(e) {
5829
5904
  window.clearTimeout(element._ripple.showTimer);
5830
5905
  }
5831
5906
  let keyboardRipple = false;
5832
- function keyboardRippleShow(e) {
5833
- if (!keyboardRipple && (e.keyCode === keyCodes.enter || e.keyCode === keyCodes.space)) {
5907
+ function keyboardRippleShow(e, keys) {
5908
+ if (!keyboardRipple && keys.includes(e.keyCode)) {
5834
5909
  keyboardRipple = true;
5835
5910
  rippleShow(e);
5836
5911
  }
@@ -5858,9 +5933,12 @@ function updateRipple(el, binding, wasEnabled) {
5858
5933
  el._ripple.enabled = enabled;
5859
5934
  el._ripple.centered = modifiers.center;
5860
5935
  el._ripple.circle = modifiers.circle;
5861
- if (isObject(value) && value.class) {
5862
- el._ripple.class = value.class;
5936
+ const bindingValue = isObject(value) ? value : {};
5937
+ if (bindingValue.class) {
5938
+ el._ripple.class = bindingValue.class;
5863
5939
  }
5940
+ const allowedKeys = bindingValue.keys ?? [keyCodes.enter, keyCodes.space];
5941
+ el._ripple.keyDownHandler = e => keyboardRippleShow(e, allowedKeys);
5864
5942
  if (enabled && !wasEnabled) {
5865
5943
  if (modifiers.stop) {
5866
5944
  el.addEventListener('touchstart', rippleStop, {
@@ -5882,7 +5960,7 @@ function updateRipple(el, binding, wasEnabled) {
5882
5960
  el.addEventListener('mousedown', rippleShow);
5883
5961
  el.addEventListener('mouseup', rippleHide);
5884
5962
  el.addEventListener('mouseleave', rippleHide);
5885
- el.addEventListener('keydown', keyboardRippleShow);
5963
+ el.addEventListener('keydown', e => keyboardRippleShow(e, allowedKeys));
5886
5964
  el.addEventListener('keyup', keyboardRippleHide);
5887
5965
  el.addEventListener('blur', focusRippleHide);
5888
5966
 
@@ -5902,7 +5980,9 @@ function removeListeners(el) {
5902
5980
  el.removeEventListener('touchcancel', rippleHide);
5903
5981
  el.removeEventListener('mouseup', rippleHide);
5904
5982
  el.removeEventListener('mouseleave', rippleHide);
5905
- el.removeEventListener('keydown', keyboardRippleShow);
5983
+ if (el._ripple?.keyDownHandler) {
5984
+ el.removeEventListener('keydown', el._ripple.keyDownHandler);
5985
+ }
5906
5986
  el.removeEventListener('keyup', keyboardRippleHide);
5907
5987
  el.removeEventListener('dragstart', rippleHide);
5908
5988
  el.removeEventListener('blur', focusRippleHide);
@@ -5911,8 +5991,8 @@ function mounted$4(el, binding) {
5911
5991
  updateRipple(el, binding, false);
5912
5992
  }
5913
5993
  function unmounted$4(el) {
5914
- delete el._ripple;
5915
5994
  removeListeners(el);
5995
+ delete el._ripple;
5916
5996
  }
5917
5997
  function updated$1(el, binding) {
5918
5998
  if (binding.value === binding.oldValue) {
@@ -6185,6 +6265,31 @@ const VAppBarTitle = genericComponent()({
6185
6265
  // Utilities
6186
6266
  const VAlertTitle = createSimpleFunctional('v-alert-title');
6187
6267
 
6268
+ // Utilities
6269
+
6270
+ // Types
6271
+
6272
+ // Types
6273
+
6274
+ // Composables
6275
+ const makeIconSizeProps = propsFactory({
6276
+ iconSize: [Number, String],
6277
+ iconSizes: {
6278
+ type: Array,
6279
+ default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
6280
+ }
6281
+ }, 'iconSize');
6282
+ function useIconSizes(props, fallback) {
6283
+ const iconSize = computed(() => {
6284
+ const iconSizeMap = new Map(props.iconSizes);
6285
+ const _iconSize = props.iconSize ?? fallback() ?? 'default';
6286
+ return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
6287
+ });
6288
+ return {
6289
+ iconSize
6290
+ };
6291
+ }
6292
+
6188
6293
  // Types
6189
6294
 
6190
6295
  const allowedTypes = ['success', 'info', 'warning', 'error'];
@@ -6224,6 +6329,7 @@ const makeVAlertProps = propsFactory({
6224
6329
  ...makeDensityProps(),
6225
6330
  ...makeDimensionProps(),
6226
6331
  ...makeElevationProps(),
6332
+ ...makeIconSizeProps(),
6227
6333
  ...makeLocationProps(),
6228
6334
  ...makePositionProps(),
6229
6335
  ...makeRoundedProps(),
@@ -6251,6 +6357,9 @@ const VAlert = genericComponent()({
6251
6357
  if (!props.type) return props.icon;
6252
6358
  return props.icon ?? `$${props.type}`;
6253
6359
  });
6360
+ const {
6361
+ iconSize
6362
+ } = useIconSizes(props, () => props.prominent ? 44 : 28);
6254
6363
  const {
6255
6364
  themeClasses
6256
6365
  } = provideTheme(props);
@@ -6298,6 +6407,11 @@ const VAlert = genericComponent()({
6298
6407
  const hasPrepend = !!(slots.prepend || icon.value);
6299
6408
  const hasTitle = !!(slots.title || props.title);
6300
6409
  const hasClose = !!(slots.close || props.closable);
6410
+ const iconProps = {
6411
+ density: props.density,
6412
+ icon: icon.value,
6413
+ size: iconSize.value
6414
+ };
6301
6415
  return isActive.value && createVNode(props.tag, {
6302
6416
  "class": normalizeClass(['v-alert', props.border && {
6303
6417
  'v-alert--border': !!props.border,
@@ -6315,19 +6429,14 @@ const VAlert = genericComponent()({
6315
6429
  }, null), hasPrepend && createElementVNode("div", {
6316
6430
  "key": "prepend",
6317
6431
  "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, {
6432
+ }, [!slots.prepend ? createVNode(VIcon, mergeProps({
6433
+ "key": "prepend-icon"
6434
+ }, iconProps), null) : createVNode(VDefaultsProvider, {
6324
6435
  "key": "prepend-defaults",
6325
6436
  "disabled": !icon.value,
6326
6437
  "defaults": {
6327
6438
  VIcon: {
6328
- density: props.density,
6329
- icon: icon.value,
6330
- size: props.prominent ? 44 : 28
6439
+ ...iconProps
6331
6440
  }
6332
6441
  }
6333
6442
  }, slots.prepend)]), createElementVNode("div", {
@@ -7852,6 +7961,7 @@ function getOffsetPosition(isHorizontal, element) {
7852
7961
  const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group');
7853
7962
  const makeVSlideGroupProps = propsFactory({
7854
7963
  centerActive: Boolean,
7964
+ contentClass: null,
7855
7965
  direction: {
7856
7966
  type: String,
7857
7967
  default: 'horizontal'
@@ -8164,7 +8274,7 @@ const VSlideGroup = genericComponent()({
8164
8274
  })]), createElementVNode("div", {
8165
8275
  "key": "container",
8166
8276
  "ref": containerRef,
8167
- "class": "v-slide-group__container",
8277
+ "class": normalizeClass(['v-slide-group__container', props.contentClass]),
8168
8278
  "onScroll": onScroll
8169
8279
  }, [createElementVNode("div", {
8170
8280
  "ref": contentRef,
@@ -8526,16 +8636,85 @@ const VChip = genericComponent()({
8526
8636
  }
8527
8637
  });
8528
8638
 
8639
+ const makeVDividerProps = propsFactory({
8640
+ color: String,
8641
+ inset: Boolean,
8642
+ length: [Number, String],
8643
+ opacity: [Number, String],
8644
+ thickness: [Number, String],
8645
+ vertical: Boolean,
8646
+ ...makeComponentProps(),
8647
+ ...makeThemeProps()
8648
+ }, 'VDivider');
8649
+ const VDivider = genericComponent()({
8650
+ name: 'VDivider',
8651
+ props: makeVDividerProps(),
8652
+ setup(props, _ref) {
8653
+ let {
8654
+ attrs,
8655
+ slots
8656
+ } = _ref;
8657
+ const {
8658
+ themeClasses
8659
+ } = provideTheme(props);
8660
+ const {
8661
+ textColorClasses,
8662
+ textColorStyles
8663
+ } = useTextColor(() => props.color);
8664
+ const dividerStyles = computed(() => {
8665
+ const styles = {};
8666
+ if (props.length) {
8667
+ styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
8668
+ }
8669
+ if (props.thickness) {
8670
+ styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
8671
+ }
8672
+ return styles;
8673
+ });
8674
+ useRender(() => {
8675
+ const divider = createElementVNode("hr", {
8676
+ "class": normalizeClass([{
8677
+ 'v-divider': true,
8678
+ 'v-divider--inset': props.inset,
8679
+ 'v-divider--vertical': props.vertical
8680
+ }, themeClasses.value, textColorClasses.value, props.class]),
8681
+ "style": normalizeStyle([dividerStyles.value, textColorStyles.value, {
8682
+ '--v-border-opacity': props.opacity
8683
+ }, props.style]),
8684
+ "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
8685
+ "role": `${attrs.role || 'separator'}`
8686
+ }, null);
8687
+ if (!slots.default) return divider;
8688
+ return createElementVNode("div", {
8689
+ "class": normalizeClass(['v-divider__wrapper', {
8690
+ 'v-divider__wrapper--vertical': props.vertical,
8691
+ 'v-divider__wrapper--inset': props.inset
8692
+ }])
8693
+ }, [divider, createElementVNode("div", {
8694
+ "class": "v-divider__content"
8695
+ }, [slots.default()]), divider]);
8696
+ });
8697
+ return {};
8698
+ }
8699
+ });
8700
+
8529
8701
  // Utilities
8530
8702
 
8531
8703
  // List
8532
8704
  const ListKey = Symbol.for('vuetify:list');
8533
8705
  function createList() {
8706
+ let {
8707
+ filterable
8708
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
8709
+ filterable: false
8710
+ };
8534
8711
  const parent = inject$1(ListKey, {
8712
+ filterable: false,
8535
8713
  hasPrepend: shallowRef(false),
8536
8714
  updateHasPrepend: () => null
8537
8715
  });
8538
8716
  const data = {
8717
+ filterable: parent.filterable || filterable,
8539
8718
  hasPrepend: shallowRef(false),
8540
8719
  updateHasPrepend: value => {
8541
8720
  if (value) data.hasPrepend.value = value;
@@ -9487,6 +9666,9 @@ const VListItem = genericComponent()({
9487
9666
  roundedClasses
9488
9667
  } = useRounded(roundedProps);
9489
9668
  const lineClasses = toRef(() => props.lines ? `v-list-item--${props.lines}-line` : undefined);
9669
+ const rippleOptions = toRef(() => props.ripple !== undefined && !!props.ripple && list?.filterable ? {
9670
+ keys: [keyCodes.enter]
9671
+ } : props.ripple);
9490
9672
  const slotProps = computed(() => ({
9491
9673
  isActive: isActive.value,
9492
9674
  select,
@@ -9511,8 +9693,9 @@ const VListItem = genericComponent()({
9511
9693
  function onKeyDown(e) {
9512
9694
  const target = e.target;
9513
9695
  if (['INPUT', 'TEXTAREA'].includes(target.tagName)) return;
9514
- if (e.key === 'Enter' || e.key === ' ') {
9696
+ if (e.key === 'Enter' || e.key === ' ' && !list?.filterable) {
9515
9697
  e.preventDefault();
9698
+ e.stopPropagation();
9516
9699
  e.target.dispatchEvent(new MouseEvent('click', e));
9517
9700
  }
9518
9701
  }
@@ -9622,7 +9805,7 @@ const VListItem = genericComponent()({
9622
9805
  }), createElementVNode("div", {
9623
9806
  "class": "v-list-item__spacer"
9624
9807
  }, null)])]
9625
- }), [[Ripple, isClickable.value && props.ripple]]);
9808
+ }), [[Ripple, isClickable.value && rippleOptions.value]]);
9626
9809
  });
9627
9810
  return {
9628
9811
  activate,
@@ -9677,68 +9860,6 @@ const VListSubheader = genericComponent()({
9677
9860
  }
9678
9861
  });
9679
9862
 
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
9863
  // Types
9743
9864
 
9744
9865
  const makeVListChildrenProps = propsFactory({
@@ -10007,6 +10128,7 @@ const makeVListProps = propsFactory({
10007
10128
  activeClass: String,
10008
10129
  bgColor: String,
10009
10130
  disabled: Boolean,
10131
+ filterable: Boolean,
10010
10132
  expandIcon: IconValue,
10011
10133
  collapseIcon: IconValue,
10012
10134
  lines: {
@@ -10090,7 +10212,9 @@ const VList = genericComponent()({
10090
10212
  const activeColor = toRef(() => props.activeColor);
10091
10213
  const baseColor = toRef(() => props.baseColor);
10092
10214
  const color = toRef(() => props.color);
10093
- createList();
10215
+ createList({
10216
+ filterable: props.filterable
10217
+ });
10094
10218
  provideDefaults({
10095
10219
  VListGroup: {
10096
10220
  activeColor,
@@ -12666,7 +12790,12 @@ function useVirtual(props, items) {
12666
12790
  }
12667
12791
  function calculateOffset(index) {
12668
12792
  index = clamp(index, 0, items.value.length - 1);
12669
- return offsets[index] || 0;
12793
+ const whole = Math.floor(index);
12794
+ const fraction = index % 1;
12795
+ const next = whole + 1;
12796
+ const wholeOffset = offsets[whole] || 0;
12797
+ const nextOffset = offsets[next] || wholeOffset;
12798
+ return wholeOffset + (nextOffset - wholeOffset) * fraction;
12670
12799
  }
12671
12800
  function calculateIndex(scrollTop) {
12672
12801
  return binaryClosest(offsets, scrollTop);
@@ -13020,6 +13149,7 @@ const makeSelectProps = propsFactory({
13020
13149
  },
13021
13150
  openOnClear: Boolean,
13022
13151
  itemColor: String,
13152
+ noAutoScroll: Boolean,
13023
13153
  ...makeItemsProps({
13024
13154
  itemChildren: false
13025
13155
  })
@@ -13234,7 +13364,7 @@ const VSelect = genericComponent()({
13234
13364
  watch(menu, () => {
13235
13365
  if (!props.hideSelected && menu.value && model.value.length) {
13236
13366
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
13237
- IN_BROWSER && window.requestAnimationFrame(() => {
13367
+ IN_BROWSER && !props.noAutoScroll && window.requestAnimationFrame(() => {
13238
13368
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
13239
13369
  });
13240
13370
  }
@@ -13326,6 +13456,22 @@ const VSelect = genericComponent()({
13326
13456
  key: item.value,
13327
13457
  onClick: () => select(item, null)
13328
13458
  });
13459
+ if (item.raw.type === 'divider') {
13460
+ return slots.divider?.({
13461
+ props: item.raw,
13462
+ index
13463
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
13464
+ "key": `divider-${index}`
13465
+ }), null);
13466
+ }
13467
+ if (item.raw.type === 'subheader') {
13468
+ return slots.subheader?.({
13469
+ props: item.raw,
13470
+ index
13471
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
13472
+ "key": `subheader-${index}`
13473
+ }), null);
13474
+ }
13329
13475
  return slots.item?.({
13330
13476
  item,
13331
13477
  index,
@@ -13486,6 +13632,9 @@ function filterItems(items, query, options) {
13486
13632
  let match = -1;
13487
13633
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13488
13634
  if (typeof item === 'object') {
13635
+ if (['divider', 'subheader'].includes(item.raw?.type)) {
13636
+ continue;
13637
+ }
13489
13638
  const filterKeys = keys || Object.keys(transformed);
13490
13639
  for (const key of filterKeys) {
13491
13640
  const value = getPropertyFromItem(transformed, key);
@@ -13688,7 +13837,7 @@ const VAutocomplete = genericComponent()({
13688
13837
  menu.value = !menu.value;
13689
13838
  }
13690
13839
  function onListKeydown(e) {
13691
- if (e.key !== ' ' && checkPrintable(e)) {
13840
+ if (checkPrintable(e) || e.key === 'Backspace') {
13692
13841
  vTextFieldRef.value?.focus();
13693
13842
  }
13694
13843
  }
@@ -13893,6 +14042,7 @@ const VAutocomplete = genericComponent()({
13893
14042
  }, props.menuProps), {
13894
14043
  default: () => [hasList && createVNode(VList, mergeProps({
13895
14044
  "ref": listRef,
14045
+ "filterable": true,
13896
14046
  "selected": selectedValues.value,
13897
14047
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
13898
14048
  "onMousedown": e => e.preventDefault(),
@@ -13924,6 +14074,22 @@ const VAutocomplete = genericComponent()({
13924
14074
  active: highlightFirst.value && index === 0 ? true : undefined,
13925
14075
  onClick: () => select(item, null)
13926
14076
  });
14077
+ if (item.raw.type === 'divider') {
14078
+ return slots.divider?.({
14079
+ props: item.raw,
14080
+ index
14081
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
14082
+ "key": `divider-${index}`
14083
+ }), null);
14084
+ }
14085
+ if (item.raw.type === 'subheader') {
14086
+ return slots.subheader?.({
14087
+ props: item.raw,
14088
+ index
14089
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
14090
+ "key": `subheader-${index}`
14091
+ }), null);
14092
+ }
13927
14093
  return slots.item?.({
13928
14094
  item,
13929
14095
  index,
@@ -17519,13 +17685,13 @@ function date(value) {
17519
17685
  return null;
17520
17686
  }
17521
17687
  const sundayJanuarySecond2000 = new Date(2000, 0, 2);
17522
- function getWeekdays(locale, firstDayOfWeek) {
17688
+ function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
17523
17689
  const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
17524
17690
  return createRange(7).map(i => {
17525
17691
  const weekday = new Date(sundayJanuarySecond2000);
17526
17692
  weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
17527
17693
  return new Intl.DateTimeFormat(locale, {
17528
- weekday: 'narrow'
17694
+ weekday: weekdayFormat ?? 'narrow'
17529
17695
  }).format(weekday);
17530
17696
  });
17531
17697
  }
@@ -17989,9 +18155,9 @@ class VuetifyDateAdapter {
17989
18155
  getDiff(date, comparing, unit) {
17990
18156
  return getDiff(date, comparing, unit);
17991
18157
  }
17992
- getWeekdays(firstDayOfWeek) {
18158
+ getWeekdays(firstDayOfWeek, weekdayFormat) {
17993
18159
  const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
17994
- return getWeekdays(this.locale, firstDay);
18160
+ return getWeekdays(this.locale, firstDay, weekdayFormat);
17995
18161
  }
17996
18162
  getYear(date) {
17997
18163
  return getYear(date);
@@ -18334,6 +18500,7 @@ const VCombobox = genericComponent()({
18334
18500
  _search.value = val ?? '';
18335
18501
  if (!props.multiple && !hasSelectionSlot.value) {
18336
18502
  model.value = [transformItem$3(props, val)];
18503
+ nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18337
18504
  }
18338
18505
  if (val && props.multiple && props.delimiters?.length) {
18339
18506
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18414,7 +18581,7 @@ const VCombobox = genericComponent()({
18414
18581
  menu.value = !menu.value;
18415
18582
  }
18416
18583
  function onListKeydown(e) {
18417
- if (e.key !== ' ' && checkPrintable(e)) {
18584
+ if (checkPrintable(e) || e.key === 'Backspace') {
18418
18585
  vTextFieldRef.value?.focus();
18419
18586
  }
18420
18587
  }
@@ -18619,6 +18786,7 @@ const VCombobox = genericComponent()({
18619
18786
  }, props.menuProps), {
18620
18787
  default: () => [hasList && createVNode(VList, mergeProps({
18621
18788
  "ref": listRef,
18789
+ "filterable": true,
18622
18790
  "selected": selectedValues.value,
18623
18791
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
18624
18792
  "onMousedown": e => e.preventDefault(),
@@ -18650,6 +18818,22 @@ const VCombobox = genericComponent()({
18650
18818
  active: highlightFirst.value && index === 0 ? true : undefined,
18651
18819
  onClick: () => select(item, null)
18652
18820
  });
18821
+ if (item.raw.type === 'divider') {
18822
+ return slots.divider?.({
18823
+ props: item.raw,
18824
+ index
18825
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
18826
+ "key": `divider-${index}`
18827
+ }), null);
18828
+ }
18829
+ if (item.raw.type === 'subheader') {
18830
+ return slots.subheader?.({
18831
+ props: item.raw,
18832
+ index
18833
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
18834
+ "key": `subheader-${index}`
18835
+ }), null);
18836
+ }
18653
18837
  return slots.item?.({
18654
18838
  item,
18655
18839
  index,
@@ -20529,6 +20713,7 @@ const makeVDataTableHeadersProps = propsFactory({
20529
20713
  color: String,
20530
20714
  disableSort: Boolean,
20531
20715
  fixedHeader: Boolean,
20716
+ lastFixed: Boolean,
20532
20717
  multiSort: Boolean,
20533
20718
  sortAscIcon: {
20534
20719
  type: IconValue,
@@ -20575,10 +20760,11 @@ const VDataTableHeaders = genericComponent()({
20575
20760
  loaderClasses
20576
20761
  } = useLoader(props);
20577
20762
  function getFixedStyles(column, y) {
20578
- if (!(props.sticky || props.fixedHeader) && !column.fixed) return undefined;
20763
+ if (!(props.sticky || props.fixedHeader) && !(column.fixed || column.lastFixed)) return undefined;
20579
20764
  return {
20580
20765
  position: 'sticky',
20581
- left: column.fixed ? convertToUnit(column.fixedOffset) : undefined,
20766
+ left: column.fixed || column.lastFixed ? convertToUnit(column.fixedOffset) : undefined,
20767
+ right: column.lastFixed ? convertToUnit(column.fixedOffset ?? 0) : undefined,
20582
20768
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
20583
20769
  };
20584
20770
  }
@@ -22293,7 +22479,8 @@ const makeCalendarProps = propsFactory({
22293
22479
  firstDayOfWeek: {
22294
22480
  type: [Number, String],
22295
22481
  default: undefined
22296
- }
22482
+ },
22483
+ weekdayFormat: String
22297
22484
  }, 'calendar');
22298
22485
  function useCalendar(props) {
22299
22486
  const adapter = useDate();
@@ -22541,7 +22728,7 @@ const VDatePickerMonth = genericComponent()({
22541
22728
  "ref": daysRef,
22542
22729
  "key": daysInMonth.value[0].date?.toString(),
22543
22730
  "class": "v-date-picker-month__days"
22544
- }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => createElementVNode("div", {
22731
+ }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => createElementVNode("div", {
22545
22732
  "class": ['v-date-picker-month__day', 'v-date-picker-month__weekday']
22546
22733
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22547
22734
  const slotProps = {
@@ -25072,6 +25259,10 @@ const makeVNumberInputProps = propsFactory({
25072
25259
  type: Number,
25073
25260
  default: 0
25074
25261
  },
25262
+ minFractionDigits: {
25263
+ type: Number,
25264
+ default: null
25265
+ },
25075
25266
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
25076
25267
  }, 'VNumberInput');
25077
25268
  const VNumberInput = genericComponent()({
@@ -25102,9 +25293,19 @@ const VNumberInput = genericComponent()({
25102
25293
  } = useFocus(props);
25103
25294
  function correctPrecision(val) {
25104
25295
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
25105
- const fixed = precision == null ? String(val) : val.toFixed(precision);
25106
- return isFocused.value ? Number(fixed).toString() // trim zeros
25107
- : fixed;
25296
+ if (precision == null) {
25297
+ return String(val);
25298
+ }
25299
+ let fixed = val.toFixed(precision);
25300
+ if (isFocused.value) {
25301
+ return Number(fixed).toString(); // trim zeros
25302
+ }
25303
+ if ((props.minFractionDigits ?? precision) < precision) {
25304
+ const trimLimit = precision - props.minFractionDigits;
25305
+ const [baseDigits, fractionDigits] = fixed.split('.');
25306
+ fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
25307
+ }
25308
+ return fixed;
25108
25309
  }
25109
25310
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
25110
25311
  const _inputText = shallowRef(null);
@@ -25163,6 +25364,7 @@ const VNumberInput = genericComponent()({
25163
25364
  }
25164
25365
  };
25165
25366
  watch(() => props.precision, () => formatInputValue());
25367
+ watch(() => props.minFractionDigits, () => formatInputValue());
25166
25368
  onMounted(() => {
25167
25369
  clampModel();
25168
25370
  });
@@ -25272,7 +25474,7 @@ const VNumberInput = genericComponent()({
25272
25474
  inputText.value = null;
25273
25475
  return;
25274
25476
  }
25275
- inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25477
+ inputText.value = correctPrecision(model.value);
25276
25478
  }
25277
25479
  function trimDecimalZeros() {
25278
25480
  if (controlsDisabled.value) return;
@@ -25532,9 +25734,10 @@ const VOtpInput = genericComponent()({
25532
25734
  e.preventDefault();
25533
25735
  e.stopPropagation();
25534
25736
  const clipboardText = e?.clipboardData?.getData('Text').slice(0, length.value) ?? '';
25737
+ const finalIndex = clipboardText.length - 1 === -1 ? index : clipboardText.length - 1;
25535
25738
  if (isValidNumber(clipboardText)) return;
25536
25739
  model.value = clipboardText.split('');
25537
- inputRef.value?.[index].blur();
25740
+ inputRef.value?.[finalIndex].focus();
25538
25741
  }
25539
25742
  function reset() {
25540
25743
  model.value = [];
@@ -29316,7 +29519,7 @@ function createVuetify$1() {
29316
29519
  };
29317
29520
  });
29318
29521
  }
29319
- const version$1 = "3.8.6-master.2025-05-26";
29522
+ const version$1 = "3.8.7-dev.2025-05-30";
29320
29523
  createVuetify$1.version = version$1;
29321
29524
 
29322
29525
  // Vue's inject() can only be used in setup
@@ -29341,7 +29544,7 @@ const createVuetify = function () {
29341
29544
  ...options
29342
29545
  });
29343
29546
  };
29344
- const version = "3.8.6-master.2025-05-26";
29547
+ const version = "3.8.7-dev.2025-05-30";
29345
29548
  createVuetify.version = version;
29346
29549
 
29347
29550
  export { index as blueprints, components, createVuetify, directives, useDate, useDefaults, useDisplay, useGoTo, useLayout, useLocale, useRtl, useTheme, version };