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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. package/CHANGELOG.md +39 -16
  2. package/dist/json/attributes.json +3215 -3091
  3. package/dist/json/importMap-labs.json +44 -44
  4. package/dist/json/importMap.json +166 -166
  5. package/dist/json/tags.json +32 -1
  6. package/dist/json/web-types.json +6040 -5654
  7. package/dist/vuetify-labs.cjs +397 -154
  8. package/dist/vuetify-labs.css +4053 -4019
  9. package/dist/vuetify-labs.d.ts +2604 -2064
  10. package/dist/vuetify-labs.esm.js +398 -155
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +397 -154
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +391 -143
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +3715 -3681
  17. package/dist/vuetify.d.ts +1600 -1100
  18. package/dist/vuetify.esm.js +392 -144
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +391 -143
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1198 -1183
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VAlert/VAlert.css +6 -1
  26. package/lib/components/VAlert/VAlert.d.ts +35 -0
  27. package/lib/components/VAlert/VAlert.js +15 -10
  28. package/lib/components/VAlert/VAlert.js.map +1 -1
  29. package/lib/components/VAlert/VAlert.sass +7 -1
  30. package/lib/components/VAppBar/VAppBar.d.ts +15 -3
  31. package/lib/components/VAppBar/VAppBarNavIcon.d.ts +20 -10
  32. package/lib/components/VAutocomplete/VAutocomplete.d.ts +154 -103
  33. package/lib/components/VAutocomplete/VAutocomplete.js +21 -3
  34. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  35. package/lib/components/VBadge/VBadge.d.ts +60 -0
  36. package/lib/components/VBadge/VBadge.js +7 -2
  37. package/lib/components/VBadge/VBadge.js.map +1 -1
  38. package/lib/components/VBtn/VBtn.d.ts +20 -10
  39. package/lib/components/VBtnGroup/VBtnGroup.css +30 -7
  40. package/lib/components/VBtnGroup/VBtnGroup.d.ts +58 -32
  41. package/lib/components/VBtnGroup/VBtnGroup.js +7 -3
  42. package/lib/components/VBtnGroup/VBtnGroup.js.map +1 -1
  43. package/lib/components/VBtnGroup/VBtnGroup.sass +44 -17
  44. package/lib/components/VBtnToggle/VBtnToggle.d.ts +25 -0
  45. package/lib/components/VCard/VCard.d.ts +20 -10
  46. package/lib/components/VCheckbox/VCheckbox.d.ts +23 -13
  47. package/lib/components/VCheckbox/VCheckboxBtn.d.ts +20 -10
  48. package/lib/components/VChip/VChip.d.ts +20 -10
  49. package/lib/components/VChipGroup/VChipGroup.d.ts +10 -0
  50. package/lib/components/VCombobox/VCombobox.d.ts +154 -103
  51. package/lib/components/VCombobox/VCombobox.js +22 -3
  52. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  53. package/lib/components/VDataTable/VDataTable.d.ts +60 -0
  54. package/lib/components/VDataTable/VDataTableHeaders.d.ts +13 -0
  55. package/lib/components/VDataTable/VDataTableHeaders.js +4 -2
  56. package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
  57. package/lib/components/VDataTable/VDataTableServer.d.ts +42 -0
  58. package/lib/components/VDataTable/VDataTableVirtual.d.ts +42 -0
  59. package/lib/components/VDatePicker/VDatePicker.d.ts +10 -0
  60. package/lib/components/VDatePicker/VDatePickerMonth.d.ts +10 -0
  61. package/lib/components/VDatePicker/VDatePickerMonth.js +1 -1
  62. package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
  63. package/lib/components/VExpansionPanel/VExpansionPanel.d.ts +20 -10
  64. package/lib/components/VExpansionPanel/VExpansionPanelTitle.d.ts +20 -10
  65. package/lib/components/VExpansionPanel/VExpansionPanels.d.ts +20 -10
  66. package/lib/components/VFab/VFab.d.ts +20 -10
  67. package/lib/components/VField/VField.d.ts +3 -3
  68. package/lib/components/VFileInput/VFileInput.d.ts +15 -15
  69. package/lib/components/VInfiniteScroll/VInfiniteScroll.d.ts +9 -3
  70. package/lib/components/VInfiniteScroll/VInfiniteScroll.js +29 -0
  71. package/lib/components/VInfiniteScroll/VInfiniteScroll.js.map +1 -1
  72. package/lib/components/VInput/VInput.d.ts +4 -4
  73. package/lib/components/VList/VList.d.ts +13 -0
  74. package/lib/components/VList/VList.js +4 -1
  75. package/lib/components/VList/VList.js.map +1 -1
  76. package/lib/components/VList/VListChildren.js.map +1 -1
  77. package/lib/components/VList/VListItem.d.ts +23 -10
  78. package/lib/components/VList/VListItem.js +7 -3
  79. package/lib/components/VList/VListItem.js.map +1 -1
  80. package/lib/components/VList/list.d.ts +9 -2
  81. package/lib/components/VList/list.js +7 -0
  82. package/lib/components/VList/list.js.map +1 -1
  83. package/lib/components/VNumberInput/VNumberInput.d.ts +103 -89
  84. package/lib/components/VNumberInput/VNumberInput.js +19 -4
  85. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  86. package/lib/components/VOtpInput/VOtpInput.js +2 -1
  87. package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
  88. package/lib/components/VOverlay/VOverlay.css +1 -1
  89. package/lib/components/VOverlay/_variables.scss +1 -1
  90. package/lib/components/VRadio/VRadio.d.ts +20 -10
  91. package/lib/components/VRadioGroup/VRadioGroup.d.ts +23 -13
  92. package/lib/components/VRangeSlider/VRangeSlider.d.ts +3 -3
  93. package/lib/components/VSelect/VSelect.d.ts +171 -107
  94. package/lib/components/VSelect/VSelect.js +27 -8
  95. package/lib/components/VSelect/VSelect.js.map +1 -1
  96. package/lib/components/VSelectionControl/VSelectionControl.d.ts +20 -10
  97. package/lib/components/VSelectionControlGroup/VSelectionControlGroup.d.ts +28 -14
  98. package/lib/components/VSlideGroup/VSlideGroup.d.ts +10 -0
  99. package/lib/components/VSlideGroup/VSlideGroup.js +2 -1
  100. package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
  101. package/lib/components/VSlider/VSlider.d.ts +3 -3
  102. package/lib/components/VSlider/VSliderThumb.d.ts +20 -10
  103. package/lib/components/VStepper/VStepperItem.d.ts +28 -14
  104. package/lib/components/VSwitch/VSwitch.d.ts +23 -13
  105. package/lib/components/VTable/VTable.css +6 -0
  106. package/lib/components/VTable/VTable.d.ts +55 -24
  107. package/lib/components/VTable/VTable.js +9 -2
  108. package/lib/components/VTable/VTable.js.map +1 -1
  109. package/lib/components/VTable/VTable.sass +14 -0
  110. package/lib/components/VTable/_variables.scss +1 -0
  111. package/lib/components/VTabs/VTab.d.ts +56 -28
  112. package/lib/components/VTabs/VTabs.d.ts +10 -0
  113. package/lib/components/VTextField/VTextField.d.ts +27 -27
  114. package/lib/components/VTextarea/VTextarea.d.ts +15 -15
  115. package/lib/components/VToolbar/VToolbar.d.ts +15 -3
  116. package/lib/components/VToolbar/VToolbar.js +6 -3
  117. package/lib/components/VToolbar/VToolbar.js.map +1 -1
  118. package/lib/composables/calendar.d.ts +6 -0
  119. package/lib/composables/calendar.js +2 -1
  120. package/lib/composables/calendar.js.map +1 -1
  121. package/lib/composables/date/DateAdapter.d.ts +3 -3
  122. package/lib/composables/date/DateAdapter.js.map +1 -1
  123. package/lib/composables/date/adapters/string.d.ts +54 -0
  124. package/lib/composables/date/adapters/string.js +153 -0
  125. package/lib/composables/date/adapters/string.js.map +1 -0
  126. package/lib/composables/date/adapters/vuetify.d.ts +1 -1
  127. package/lib/composables/date/adapters/vuetify.js +5 -5
  128. package/lib/composables/date/adapters/vuetify.js.map +1 -1
  129. package/lib/composables/date/date.d.ts +3 -3
  130. package/lib/composables/date/date.js +1 -1
  131. package/lib/composables/date/date.js.map +1 -1
  132. package/lib/composables/date/index.d.ts +1 -0
  133. package/lib/composables/date/index.js +1 -0
  134. package/lib/composables/date/index.js.map +1 -1
  135. package/lib/composables/filter.js +3 -0
  136. package/lib/composables/filter.js.map +1 -1
  137. package/lib/composables/iconSizes.d.ts +28 -0
  138. package/lib/composables/iconSizes.js +23 -0
  139. package/lib/composables/iconSizes.js.map +1 -0
  140. package/lib/composables/list-items.js +2 -2
  141. package/lib/composables/list-items.js.map +1 -1
  142. package/lib/composables/theme.d.ts +6 -1
  143. package/lib/composables/theme.js +94 -26
  144. package/lib/composables/theme.js.map +1 -1
  145. package/lib/composables/virtual.js +6 -1
  146. package/lib/composables/virtual.js.map +1 -1
  147. package/lib/directives/ripple/index.d.ts +2 -1
  148. package/lib/directives/ripple/index.js +12 -7
  149. package/lib/directives/ripple/index.js.map +1 -1
  150. package/lib/entry-bundler.d.ts +3 -3
  151. package/lib/entry-bundler.js +1 -1
  152. package/lib/entry-bundler.js.map +1 -1
  153. package/lib/framework.d.ts +86 -71
  154. package/lib/framework.js +1 -1
  155. package/lib/framework.js.map +1 -1
  156. package/lib/labs/VCalendar/VCalendar.d.ts +10 -0
  157. package/lib/labs/VColorInput/VColorInput.d.ts +3 -3
  158. package/lib/labs/VDateInput/VDateInput.d.ts +97 -87
  159. package/lib/labs/VFileUpload/VFileUpload.d.ts +3 -3
  160. package/lib/labs/VFileUpload/VFileUploadItem.d.ts +20 -10
  161. package/lib/labs/VIconBtn/VIconBtn.d.ts +29 -29
  162. package/lib/labs/VIconBtn/VIconBtn.js +7 -11
  163. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  164. package/lib/labs/VStepperVertical/VStepperVertical.d.ts +20 -10
  165. package/lib/labs/VStepperVertical/VStepperVerticalItem.d.ts +20 -10
  166. package/lib/labs/VTreeview/VTreeview.d.ts +13 -0
  167. package/lib/labs/VTreeview/VTreeviewItem.d.ts +20 -10
  168. package/lib/labs/entry-bundler.d.ts +3 -3
  169. package/lib/util/globals.d.ts +1 -0
  170. package/lib/util/globals.js +1 -0
  171. package/lib/util/globals.js.map +1 -1
  172. package/lib/util/helpers.d.ts +1 -1
  173. package/lib/util/helpers.js +0 -1
  174. package/lib/util/helpers.js.map +1 -1
  175. package/package.json +3 -1
@@ -1,10 +1,10 @@
1
1
  /*!
2
- * Vuetify v3.8.8-master.2025-06-08
2
+ * Vuetify v3.8.9-dev.2025-06-11
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
6
6
 
7
- import { shallowRef, reactive, watchEffect, toRef, capitalize, camelize, unref, Fragment, isVNode, Comment, warn, getCurrentInstance as getCurrentInstance$1, ref, computed, provide, inject as inject$1, defineComponent as defineComponent$1, h, onBeforeUnmount, watch, readonly, onMounted, useId, onDeactivated, onActivated, onScopeDispose, effectScope, toRaw, createElementVNode, normalizeStyle, normalizeClass, createVNode, TransitionGroup, Transition, mergeProps, toRefs, toValue, isRef, onBeforeMount, nextTick, withDirectives, vShow, onUpdated, Text, resolveDynamicComponent, toDisplayString, markRaw, Teleport, cloneVNode, createTextVNode, normalizeProps, guardReactiveProps, onUnmounted, onBeforeUpdate, withModifiers, vModelText, resolveComponent, render } from 'vue';
7
+ import { shallowRef, reactive, watchEffect, toRef, capitalize, unref, Fragment, camelize, isVNode, Comment, warn, getCurrentInstance as getCurrentInstance$1, ref, computed, provide, inject as inject$1, defineComponent as defineComponent$1, h, onBeforeUnmount, watch, readonly, onMounted, useId, onDeactivated, onActivated, onScopeDispose, effectScope, toRaw, getCurrentScope, createElementVNode, normalizeStyle, normalizeClass, createVNode, TransitionGroup, Transition, mergeProps, toRefs, toValue, 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
  // Types
10
10
  // eslint-disable-line vue/prefer-import-from-vue
@@ -81,6 +81,7 @@ const IN_BROWSER = typeof window !== 'undefined';
81
81
  const SUPPORTS_INTERSECTION = IN_BROWSER && 'IntersectionObserver' in window;
82
82
  const SUPPORTS_TOUCH = IN_BROWSER && ('ontouchstart' in window || window.navigator.maxTouchPoints > 0);
83
83
  const SUPPORTS_EYE_DROPPER = IN_BROWSER && 'EyeDropper' in window;
84
+ const SUPPORTS_MATCH_MEDIA = IN_BROWSER && 'matchMedia' in window && typeof window.matchMedia === 'function';
84
85
 
85
86
  function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
86
87
  function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
@@ -603,7 +604,6 @@ function extractNumber(text, decimalDigitsLimit) {
603
604
  return cleanText;
604
605
  }
605
606
  function camelizeProps(props) {
606
- if (!props) return;
607
607
  const out = {};
608
608
  for (const prop in props) {
609
609
  out[camelize(prop)] = props[prop];
@@ -2345,6 +2345,7 @@ const makeThemeProps = propsFactory({
2345
2345
  function genDefaults$2() {
2346
2346
  return {
2347
2347
  defaultTheme: 'light',
2348
+ prefix: 'v-',
2348
2349
  variations: {
2349
2350
  colors: [],
2350
2351
  lighten: 0,
@@ -2426,7 +2427,10 @@ function genDefaults$2() {
2426
2427
  }
2427
2428
  }
2428
2429
  },
2429
- stylesheetId: 'vuetify-theme-stylesheet'
2430
+ stylesheetId: 'vuetify-theme-stylesheet',
2431
+ scoped: false,
2432
+ unimportant: false,
2433
+ utilities: true
2430
2434
  };
2431
2435
  }
2432
2436
  function parseThemeOptions() {
@@ -2449,21 +2453,21 @@ function parseThemeOptions() {
2449
2453
  function createCssClass(lines, selector, content, scope) {
2450
2454
  lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
2451
2455
  }
2452
- function genCssVariables(theme) {
2456
+ function genCssVariables(theme, prefix) {
2453
2457
  const lightOverlay = theme.dark ? 2 : 1;
2454
2458
  const darkOverlay = theme.dark ? 1 : 2;
2455
2459
  const variables = [];
2456
2460
  for (const [key, value] of Object.entries(theme.colors)) {
2457
2461
  const rgb = parseColor(value);
2458
- variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2462
+ variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2459
2463
  if (!key.startsWith('on-')) {
2460
- variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2464
+ variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2461
2465
  }
2462
2466
  }
2463
2467
  for (const [key, value] of Object.entries(theme.variables)) {
2464
2468
  const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
2465
2469
  const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
2466
- variables.push(`--v-${key}: ${rgb ?? value}`);
2470
+ variables.push(`--${prefix}${key}: ${rgb ?? value}`);
2467
2471
  }
2468
2472
  return variables;
2469
2473
  }
@@ -2507,7 +2511,8 @@ function getScopedSelector(selector, scope) {
2507
2511
  const scopeSelector = `:where(${scope})`;
2508
2512
  return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
2509
2513
  }
2510
- function upsertStyles(styleEl, styles) {
2514
+ function upsertStyles(id, cspNonce, styles) {
2515
+ const styleEl = getOrCreateStyleElement(id, cspNonce);
2511
2516
  if (!styleEl) return;
2512
2517
  styleEl.innerHTML = styles;
2513
2518
  }
@@ -2527,8 +2532,17 @@ function getOrCreateStyleElement(id, cspNonce) {
2527
2532
  // Composables
2528
2533
  function createTheme(options) {
2529
2534
  const parsedOptions = parseThemeOptions(options);
2530
- const name = shallowRef(parsedOptions.defaultTheme);
2535
+ const _name = shallowRef(parsedOptions.defaultTheme);
2531
2536
  const themes = ref(parsedOptions.themes);
2537
+ const systemName = shallowRef('light');
2538
+ const name = computed({
2539
+ get() {
2540
+ return _name.value === 'system' ? systemName.value : _name.value;
2541
+ },
2542
+ set(val) {
2543
+ _name.value = val;
2544
+ }
2545
+ });
2532
2546
  const computedThemes = computed(() => {
2533
2547
  const acc = {};
2534
2548
  for (const [name, original] of Object.entries(themes.value)) {
@@ -2549,28 +2563,49 @@ function createTheme(options) {
2549
2563
  const current = toRef(() => computedThemes.value[name.value]);
2550
2564
  const styles = computed(() => {
2551
2565
  const lines = [];
2566
+ const important = parsedOptions.unimportant ? '' : ' !important';
2567
+ const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
2552
2568
  if (current.value?.dark) {
2553
2569
  createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
2554
2570
  }
2555
- createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
2571
+ createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
2556
2572
  for (const [themeName, theme] of Object.entries(computedThemes.value)) {
2557
- createCssClass(lines, `.v-theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme)], parsedOptions.scope);
2558
- }
2559
- const bgLines = [];
2560
- const fgLines = [];
2561
- const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
2562
- for (const key of colors) {
2563
- if (key.startsWith('on-')) {
2564
- createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
2565
- } else {
2566
- 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);
2567
- createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
2568
- createCssClass(fgLines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`], parsedOptions.scope);
2573
+ createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
2574
+ }
2575
+ if (parsedOptions.utilities) {
2576
+ const bgLines = [];
2577
+ const fgLines = [];
2578
+ const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
2579
+ for (const key of colors) {
2580
+ if (key.startsWith('on-')) {
2581
+ createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
2582
+ } else {
2583
+ 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);
2584
+ createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
2585
+ createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
2586
+ }
2569
2587
  }
2588
+ lines.push(...bgLines, ...fgLines);
2570
2589
  }
2571
- lines.push(...bgLines, ...fgLines);
2572
2590
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
2573
2591
  });
2592
+ const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
2593
+ const themeNames = toRef(() => Object.keys(computedThemes.value));
2594
+ if (SUPPORTS_MATCH_MEDIA) {
2595
+ const media = window.matchMedia('(prefers-color-scheme: dark)');
2596
+ function updateSystemName() {
2597
+ systemName.value = media.matches ? 'dark' : 'light';
2598
+ }
2599
+ updateSystemName();
2600
+ media.addEventListener('change', updateSystemName, {
2601
+ passive: true
2602
+ });
2603
+ if (getCurrentScope()) {
2604
+ onScopeDispose(() => {
2605
+ media.removeEventListener('change', updateSystemName);
2606
+ });
2607
+ }
2608
+ }
2574
2609
  function install(app) {
2575
2610
  if (parsedOptions.isDisabled) return;
2576
2611
  const head = app._context.provides.usehead;
@@ -2608,22 +2643,55 @@ function createTheme(options) {
2608
2643
  updateStyles();
2609
2644
  }
2610
2645
  function updateStyles() {
2611
- upsertStyles(getOrCreateStyleElement(parsedOptions.stylesheetId, parsedOptions.cspNonce), styles.value);
2646
+ upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
2612
2647
  }
2613
2648
  }
2614
2649
  }
2615
- const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);
2650
+ function change(themeName) {
2651
+ if (!themeNames.value.includes(themeName)) {
2652
+ consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
2653
+ return;
2654
+ }
2655
+ name.value = themeName;
2656
+ }
2657
+ function cycle() {
2658
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
2659
+ const currentIndex = themeArray.indexOf(name.value);
2660
+ const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
2661
+ change(themeArray[nextIndex]);
2662
+ }
2663
+ function toggle() {
2664
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
2665
+ cycle(themeArray);
2666
+ }
2667
+ const globalName = new Proxy(name, {
2668
+ get(target, prop) {
2669
+ return target[prop];
2670
+ },
2671
+ set(target, prop, val) {
2672
+ if (prop === 'value') {
2673
+ deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
2674
+ }
2675
+ // @ts-expect-error
2676
+ target[prop] = val;
2677
+ return true;
2678
+ }
2679
+ });
2616
2680
  return {
2617
2681
  install,
2682
+ change,
2683
+ cycle,
2684
+ toggle,
2618
2685
  isDisabled: parsedOptions.isDisabled,
2619
2686
  name,
2620
2687
  themes,
2621
2688
  current,
2622
2689
  computedThemes,
2690
+ prefix: parsedOptions.prefix,
2623
2691
  themeClasses,
2624
2692
  styles,
2625
2693
  global: {
2626
- name,
2694
+ name: globalName,
2627
2695
  current
2628
2696
  }
2629
2697
  };
@@ -2634,7 +2702,7 @@ function provideTheme(props) {
2634
2702
  if (!theme) throw new Error('Could not find Vuetify theme injection');
2635
2703
  const name = toRef(() => props.theme ?? theme.name.value);
2636
2704
  const current = toRef(() => theme.themes.value[name.value]);
2637
- const themeClasses = toRef(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);
2705
+ const themeClasses = toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
2638
2706
  const newTheme = {
2639
2707
  ...theme,
2640
2708
  name,
@@ -3738,7 +3806,10 @@ const makeVToolbarProps = propsFactory({
3738
3806
  default: 'default',
3739
3807
  validator: v => allowedDensities$1.includes(v)
3740
3808
  },
3741
- extended: Boolean,
3809
+ extended: {
3810
+ type: Boolean,
3811
+ default: null
3812
+ },
3742
3813
  extensionHeight: {
3743
3814
  type: [Number, String],
3744
3815
  default: 48
@@ -3786,7 +3857,7 @@ const VToolbar = genericComponent()({
3786
3857
  const {
3787
3858
  rtlClasses
3788
3859
  } = useRtl();
3789
- const isExtended = shallowRef(!!(props.extended || slots.extension?.()));
3860
+ const isExtended = shallowRef(props.extended === null ? !!slots.extension?.() : props.extended);
3790
3861
  const contentHeight = computed(() => parseInt(Number(props.height) + (props.density === 'prominent' ? Number(props.height) : 0) - (props.density === 'comfortable' ? 8 : 0) - (props.density === 'compact' ? 16 : 0), 10));
3791
3862
  const extensionHeight = computed(() => isExtended.value ? parseInt(Number(props.extensionHeight) + (props.density === 'prominent' ? Number(props.extensionHeight) : 0) - (props.density === 'comfortable' ? 4 : 0) - (props.density === 'compact' ? 8 : 0), 10) : 0);
3792
3863
  provideDefaults({
@@ -3798,7 +3869,7 @@ const VToolbar = genericComponent()({
3798
3869
  const hasTitle = !!(props.title || slots.title);
3799
3870
  const hasImage = !!(slots.image || props.image);
3800
3871
  const extension = slots.extension?.();
3801
- isExtended.value = !!(props.extended || extension);
3872
+ isExtended.value = props.extended === null ? !!extension : props.extended;
3802
3873
  return createVNode(props.tag, {
3803
3874
  "class": normalizeClass(['v-toolbar', {
3804
3875
  'v-toolbar--absolute': props.absolute,
@@ -4181,9 +4252,15 @@ function useVariant(props) {
4181
4252
  };
4182
4253
  }
4183
4254
 
4255
+ // Types
4256
+
4184
4257
  const makeVBtnGroupProps = propsFactory({
4185
4258
  baseColor: String,
4186
4259
  divided: Boolean,
4260
+ direction: {
4261
+ type: String,
4262
+ default: 'horizontal'
4263
+ },
4187
4264
  ...makeBorderProps(),
4188
4265
  ...makeComponentProps(),
4189
4266
  ...makeDensityProps(),
@@ -4217,7 +4294,7 @@ const VBtnGroup = genericComponent()({
4217
4294
  } = useRounded(props);
4218
4295
  provideDefaults({
4219
4296
  VBtn: {
4220
- height: 'auto',
4297
+ height: toRef(() => props.direction === 'horizontal' ? 'auto' : null),
4221
4298
  baseColor: toRef(() => props.baseColor),
4222
4299
  color: toRef(() => props.color),
4223
4300
  density: toRef(() => props.density),
@@ -4227,7 +4304,7 @@ const VBtnGroup = genericComponent()({
4227
4304
  });
4228
4305
  useRender(() => {
4229
4306
  return createVNode(props.tag, {
4230
- "class": normalizeClass(['v-btn-group', {
4307
+ "class": normalizeClass(['v-btn-group', `v-btn-group--${props.direction}`, {
4231
4308
  'v-btn-group--divided': props.divided
4232
4309
  }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
4233
4310
  "style": normalizeStyle(props.style)
@@ -5559,8 +5636,8 @@ function rippleCancelShow(e) {
5559
5636
  window.clearTimeout(element._ripple.showTimer);
5560
5637
  }
5561
5638
  let keyboardRipple = false;
5562
- function keyboardRippleShow(e) {
5563
- if (!keyboardRipple && (e.keyCode === keyCodes.enter || e.keyCode === keyCodes.space)) {
5639
+ function keyboardRippleShow(e, keys) {
5640
+ if (!keyboardRipple && keys.includes(e.keyCode)) {
5564
5641
  keyboardRipple = true;
5565
5642
  rippleShow(e);
5566
5643
  }
@@ -5588,9 +5665,12 @@ function updateRipple(el, binding, wasEnabled) {
5588
5665
  el._ripple.enabled = enabled;
5589
5666
  el._ripple.centered = modifiers.center;
5590
5667
  el._ripple.circle = modifiers.circle;
5591
- if (isObject(value) && value.class) {
5592
- el._ripple.class = value.class;
5668
+ const bindingValue = isObject(value) ? value : {};
5669
+ if (bindingValue.class) {
5670
+ el._ripple.class = bindingValue.class;
5593
5671
  }
5672
+ const allowedKeys = bindingValue.keys ?? [keyCodes.enter, keyCodes.space];
5673
+ el._ripple.keyDownHandler = e => keyboardRippleShow(e, allowedKeys);
5594
5674
  if (enabled && !wasEnabled) {
5595
5675
  if (modifiers.stop) {
5596
5676
  el.addEventListener('touchstart', rippleStop, {
@@ -5612,7 +5692,7 @@ function updateRipple(el, binding, wasEnabled) {
5612
5692
  el.addEventListener('mousedown', rippleShow);
5613
5693
  el.addEventListener('mouseup', rippleHide);
5614
5694
  el.addEventListener('mouseleave', rippleHide);
5615
- el.addEventListener('keydown', keyboardRippleShow);
5695
+ el.addEventListener('keydown', e => keyboardRippleShow(e, allowedKeys));
5616
5696
  el.addEventListener('keyup', keyboardRippleHide);
5617
5697
  el.addEventListener('blur', focusRippleHide);
5618
5698
 
@@ -5632,7 +5712,9 @@ function removeListeners(el) {
5632
5712
  el.removeEventListener('touchcancel', rippleHide);
5633
5713
  el.removeEventListener('mouseup', rippleHide);
5634
5714
  el.removeEventListener('mouseleave', rippleHide);
5635
- el.removeEventListener('keydown', keyboardRippleShow);
5715
+ if (el._ripple?.keyDownHandler) {
5716
+ el.removeEventListener('keydown', el._ripple.keyDownHandler);
5717
+ }
5636
5718
  el.removeEventListener('keyup', keyboardRippleHide);
5637
5719
  el.removeEventListener('dragstart', rippleHide);
5638
5720
  el.removeEventListener('blur', focusRippleHide);
@@ -5641,8 +5723,8 @@ function mounted$4(el, binding) {
5641
5723
  updateRipple(el, binding, false);
5642
5724
  }
5643
5725
  function unmounted$4(el) {
5644
- delete el._ripple;
5645
5726
  removeListeners(el);
5727
+ delete el._ripple;
5646
5728
  }
5647
5729
  function updated$1(el, binding) {
5648
5730
  if (binding.value === binding.oldValue) {
@@ -5915,6 +5997,31 @@ const VAppBarTitle = genericComponent()({
5915
5997
  // Utilities
5916
5998
  const VAlertTitle = createSimpleFunctional('v-alert-title');
5917
5999
 
6000
+ // Utilities
6001
+
6002
+ // Types
6003
+
6004
+ // Types
6005
+
6006
+ // Composables
6007
+ const makeIconSizeProps = propsFactory({
6008
+ iconSize: [Number, String],
6009
+ iconSizes: {
6010
+ type: Array,
6011
+ default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
6012
+ }
6013
+ }, 'iconSize');
6014
+ function useIconSizes(props, fallback) {
6015
+ const iconSize = computed(() => {
6016
+ const iconSizeMap = new Map(props.iconSizes);
6017
+ const _iconSize = props.iconSize ?? fallback() ?? 'default';
6018
+ return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
6019
+ });
6020
+ return {
6021
+ iconSize
6022
+ };
6023
+ }
6024
+
5918
6025
  // Types
5919
6026
 
5920
6027
  const allowedTypes = ['success', 'info', 'warning', 'error'];
@@ -5954,6 +6061,7 @@ const makeVAlertProps = propsFactory({
5954
6061
  ...makeDensityProps(),
5955
6062
  ...makeDimensionProps(),
5956
6063
  ...makeElevationProps(),
6064
+ ...makeIconSizeProps(),
5957
6065
  ...makeLocationProps(),
5958
6066
  ...makePositionProps(),
5959
6067
  ...makeRoundedProps(),
@@ -5981,6 +6089,9 @@ const VAlert = genericComponent()({
5981
6089
  if (!props.type) return props.icon;
5982
6090
  return props.icon ?? `$${props.type}`;
5983
6091
  });
6092
+ const {
6093
+ iconSize
6094
+ } = useIconSizes(props, () => props.prominent ? 44 : 28);
5984
6095
  const {
5985
6096
  themeClasses
5986
6097
  } = provideTheme(props);
@@ -6028,6 +6139,11 @@ const VAlert = genericComponent()({
6028
6139
  const hasPrepend = !!(slots.prepend || icon.value);
6029
6140
  const hasTitle = !!(slots.title || props.title);
6030
6141
  const hasClose = !!(slots.close || props.closable);
6142
+ const iconProps = {
6143
+ density: props.density,
6144
+ icon: icon.value,
6145
+ size: iconSize.value
6146
+ };
6031
6147
  return isActive.value && createVNode(props.tag, {
6032
6148
  "class": normalizeClass(['v-alert', props.border && {
6033
6149
  'v-alert--border': !!props.border,
@@ -6045,19 +6161,14 @@ const VAlert = genericComponent()({
6045
6161
  }, null), hasPrepend && createElementVNode("div", {
6046
6162
  "key": "prepend",
6047
6163
  "class": "v-alert__prepend"
6048
- }, [!slots.prepend ? createVNode(VIcon, {
6049
- "key": "prepend-icon",
6050
- "density": props.density,
6051
- "icon": icon.value,
6052
- "size": props.prominent ? 44 : 28
6053
- }, null) : createVNode(VDefaultsProvider, {
6164
+ }, [!slots.prepend ? createVNode(VIcon, mergeProps({
6165
+ "key": "prepend-icon"
6166
+ }, iconProps), null) : createVNode(VDefaultsProvider, {
6054
6167
  "key": "prepend-defaults",
6055
6168
  "disabled": !icon.value,
6056
6169
  "defaults": {
6057
6170
  VIcon: {
6058
- density: props.density,
6059
- icon: icon.value,
6060
- size: props.prominent ? 44 : 28
6171
+ ...iconProps
6061
6172
  }
6062
6173
  }
6063
6174
  }, slots.prepend)]), createElementVNode("div", {
@@ -7582,6 +7693,7 @@ function getOffsetPosition(isHorizontal, element) {
7582
7693
  const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group');
7583
7694
  const makeVSlideGroupProps = propsFactory({
7584
7695
  centerActive: Boolean,
7696
+ contentClass: null,
7585
7697
  direction: {
7586
7698
  type: String,
7587
7699
  default: 'horizontal'
@@ -7894,7 +8006,7 @@ const VSlideGroup = genericComponent()({
7894
8006
  })]), createElementVNode("div", {
7895
8007
  "key": "container",
7896
8008
  "ref": containerRef,
7897
- "class": "v-slide-group__container",
8009
+ "class": normalizeClass(['v-slide-group__container', props.contentClass]),
7898
8010
  "onScroll": onScroll
7899
8011
  }, [createElementVNode("div", {
7900
8012
  "ref": contentRef,
@@ -8257,16 +8369,85 @@ const VChip = genericComponent()({
8257
8369
  }
8258
8370
  });
8259
8371
 
8372
+ const makeVDividerProps = propsFactory({
8373
+ color: String,
8374
+ inset: Boolean,
8375
+ length: [Number, String],
8376
+ opacity: [Number, String],
8377
+ thickness: [Number, String],
8378
+ vertical: Boolean,
8379
+ ...makeComponentProps(),
8380
+ ...makeThemeProps()
8381
+ }, 'VDivider');
8382
+ const VDivider = genericComponent()({
8383
+ name: 'VDivider',
8384
+ props: makeVDividerProps(),
8385
+ setup(props, _ref) {
8386
+ let {
8387
+ attrs,
8388
+ slots
8389
+ } = _ref;
8390
+ const {
8391
+ themeClasses
8392
+ } = provideTheme(props);
8393
+ const {
8394
+ textColorClasses,
8395
+ textColorStyles
8396
+ } = useTextColor(() => props.color);
8397
+ const dividerStyles = computed(() => {
8398
+ const styles = {};
8399
+ if (props.length) {
8400
+ styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
8401
+ }
8402
+ if (props.thickness) {
8403
+ styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
8404
+ }
8405
+ return styles;
8406
+ });
8407
+ useRender(() => {
8408
+ const divider = createElementVNode("hr", {
8409
+ "class": normalizeClass([{
8410
+ 'v-divider': true,
8411
+ 'v-divider--inset': props.inset,
8412
+ 'v-divider--vertical': props.vertical
8413
+ }, themeClasses.value, textColorClasses.value, props.class]),
8414
+ "style": normalizeStyle([dividerStyles.value, textColorStyles.value, {
8415
+ '--v-border-opacity': props.opacity
8416
+ }, props.style]),
8417
+ "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
8418
+ "role": `${attrs.role || 'separator'}`
8419
+ }, null);
8420
+ if (!slots.default) return divider;
8421
+ return createElementVNode("div", {
8422
+ "class": normalizeClass(['v-divider__wrapper', {
8423
+ 'v-divider__wrapper--vertical': props.vertical,
8424
+ 'v-divider__wrapper--inset': props.inset
8425
+ }])
8426
+ }, [divider, createElementVNode("div", {
8427
+ "class": "v-divider__content"
8428
+ }, [slots.default()]), divider]);
8429
+ });
8430
+ return {};
8431
+ }
8432
+ });
8433
+
8260
8434
  // Utilities
8261
8435
 
8262
8436
  // List
8263
8437
  const ListKey = Symbol.for('vuetify:list');
8264
8438
  function createList() {
8439
+ let {
8440
+ filterable
8441
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
8442
+ filterable: false
8443
+ };
8265
8444
  const parent = inject$1(ListKey, {
8445
+ filterable: false,
8266
8446
  hasPrepend: shallowRef(false),
8267
8447
  updateHasPrepend: () => null
8268
8448
  });
8269
8449
  const data = {
8450
+ filterable: parent.filterable || filterable,
8270
8451
  hasPrepend: shallowRef(false),
8271
8452
  updateHasPrepend: value => {
8272
8453
  if (value) data.hasPrepend.value = value;
@@ -9218,6 +9399,9 @@ const VListItem = genericComponent()({
9218
9399
  roundedClasses
9219
9400
  } = useRounded(roundedProps);
9220
9401
  const lineClasses = toRef(() => props.lines ? `v-list-item--${props.lines}-line` : undefined);
9402
+ const rippleOptions = toRef(() => props.ripple !== undefined && !!props.ripple && list?.filterable ? {
9403
+ keys: [keyCodes.enter]
9404
+ } : props.ripple);
9221
9405
  const slotProps = computed(() => ({
9222
9406
  isActive: isActive.value,
9223
9407
  select,
@@ -9242,8 +9426,9 @@ const VListItem = genericComponent()({
9242
9426
  function onKeyDown(e) {
9243
9427
  const target = e.target;
9244
9428
  if (['INPUT', 'TEXTAREA'].includes(target.tagName)) return;
9245
- if (e.key === 'Enter' || e.key === ' ') {
9429
+ if (e.key === 'Enter' || e.key === ' ' && !list?.filterable) {
9246
9430
  e.preventDefault();
9431
+ e.stopPropagation();
9247
9432
  e.target.dispatchEvent(new MouseEvent('click', e));
9248
9433
  }
9249
9434
  }
@@ -9353,7 +9538,7 @@ const VListItem = genericComponent()({
9353
9538
  }), createElementVNode("div", {
9354
9539
  "class": "v-list-item__spacer"
9355
9540
  }, null)])]
9356
- }), [[Ripple, isClickable.value && props.ripple]]);
9541
+ }), [[Ripple, isClickable.value && rippleOptions.value]]);
9357
9542
  });
9358
9543
  return {
9359
9544
  activate,
@@ -9408,68 +9593,6 @@ const VListSubheader = genericComponent()({
9408
9593
  }
9409
9594
  });
9410
9595
 
9411
- const makeVDividerProps = propsFactory({
9412
- color: String,
9413
- inset: Boolean,
9414
- length: [Number, String],
9415
- opacity: [Number, String],
9416
- thickness: [Number, String],
9417
- vertical: Boolean,
9418
- ...makeComponentProps(),
9419
- ...makeThemeProps()
9420
- }, 'VDivider');
9421
- const VDivider = genericComponent()({
9422
- name: 'VDivider',
9423
- props: makeVDividerProps(),
9424
- setup(props, _ref) {
9425
- let {
9426
- attrs,
9427
- slots
9428
- } = _ref;
9429
- const {
9430
- themeClasses
9431
- } = provideTheme(props);
9432
- const {
9433
- textColorClasses,
9434
- textColorStyles
9435
- } = useTextColor(() => props.color);
9436
- const dividerStyles = computed(() => {
9437
- const styles = {};
9438
- if (props.length) {
9439
- styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
9440
- }
9441
- if (props.thickness) {
9442
- styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
9443
- }
9444
- return styles;
9445
- });
9446
- useRender(() => {
9447
- const divider = createElementVNode("hr", {
9448
- "class": normalizeClass([{
9449
- 'v-divider': true,
9450
- 'v-divider--inset': props.inset,
9451
- 'v-divider--vertical': props.vertical
9452
- }, themeClasses.value, textColorClasses.value, props.class]),
9453
- "style": normalizeStyle([dividerStyles.value, textColorStyles.value, {
9454
- '--v-border-opacity': props.opacity
9455
- }, props.style]),
9456
- "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
9457
- "role": `${attrs.role || 'separator'}`
9458
- }, null);
9459
- if (!slots.default) return divider;
9460
- return createElementVNode("div", {
9461
- "class": normalizeClass(['v-divider__wrapper', {
9462
- 'v-divider__wrapper--vertical': props.vertical,
9463
- 'v-divider__wrapper--inset': props.inset
9464
- }])
9465
- }, [divider, createElementVNode("div", {
9466
- "class": "v-divider__content"
9467
- }, [slots.default()]), divider]);
9468
- });
9469
- return {};
9470
- }
9471
- });
9472
-
9473
9596
  // Types
9474
9597
 
9475
9598
  const makeVListChildrenProps = propsFactory({
@@ -9586,7 +9709,7 @@ function transformItem$3(props, item) {
9586
9709
  const _props = {
9587
9710
  title,
9588
9711
  value,
9589
- ...camelizeProps(itemProps)
9712
+ ...itemProps
9590
9713
  };
9591
9714
  return {
9592
9715
  title: String(_props.title ?? ''),
@@ -9738,6 +9861,7 @@ const makeVListProps = propsFactory({
9738
9861
  activeClass: String,
9739
9862
  bgColor: String,
9740
9863
  disabled: Boolean,
9864
+ filterable: Boolean,
9741
9865
  expandIcon: IconValue,
9742
9866
  collapseIcon: IconValue,
9743
9867
  lines: {
@@ -9821,7 +9945,9 @@ const VList = genericComponent()({
9821
9945
  const activeColor = toRef(() => props.activeColor);
9822
9946
  const baseColor = toRef(() => props.baseColor);
9823
9947
  const color = toRef(() => props.color);
9824
- createList();
9948
+ createList({
9949
+ filterable: props.filterable
9950
+ });
9825
9951
  provideDefaults({
9826
9952
  VListGroup: {
9827
9953
  activeColor,
@@ -12398,7 +12524,12 @@ function useVirtual(props, items) {
12398
12524
  }
12399
12525
  function calculateOffset(index) {
12400
12526
  index = clamp(index, 0, items.value.length - 1);
12401
- return offsets[index] || 0;
12527
+ const whole = Math.floor(index);
12528
+ const fraction = index % 1;
12529
+ const next = whole + 1;
12530
+ const wholeOffset = offsets[whole] || 0;
12531
+ const nextOffset = offsets[next] || wholeOffset;
12532
+ return wholeOffset + (nextOffset - wholeOffset) * fraction;
12402
12533
  }
12403
12534
  function calculateIndex(scrollTop) {
12404
12535
  return binaryClosest(offsets, scrollTop);
@@ -12752,6 +12883,7 @@ const makeSelectProps = propsFactory({
12752
12883
  },
12753
12884
  openOnClear: Boolean,
12754
12885
  itemColor: String,
12886
+ noAutoScroll: Boolean,
12755
12887
  ...makeItemsProps({
12756
12888
  itemChildren: false
12757
12889
  })
@@ -12966,7 +13098,7 @@ const VSelect = genericComponent()({
12966
13098
  watch(menu, () => {
12967
13099
  if (!props.hideSelected && menu.value && model.value.length) {
12968
13100
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
12969
- IN_BROWSER && window.requestAnimationFrame(() => {
13101
+ IN_BROWSER && !props.noAutoScroll && window.requestAnimationFrame(() => {
12970
13102
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
12971
13103
  });
12972
13104
  }
@@ -13053,11 +13185,28 @@ const VSelect = genericComponent()({
13053
13185
  index,
13054
13186
  itemRef
13055
13187
  } = _ref2;
13188
+ const camelizedProps = camelizeProps(item.props);
13056
13189
  const itemProps = mergeProps(item.props, {
13057
13190
  ref: itemRef,
13058
13191
  key: item.value,
13059
13192
  onClick: () => select(item, null)
13060
13193
  });
13194
+ if (item.raw.type === 'divider') {
13195
+ return slots.divider?.({
13196
+ props: item.raw,
13197
+ index
13198
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
13199
+ "key": `divider-${index}`
13200
+ }), null);
13201
+ }
13202
+ if (item.raw.type === 'subheader') {
13203
+ return slots.subheader?.({
13204
+ props: item.raw,
13205
+ index
13206
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
13207
+ "key": `subheader-${index}`
13208
+ }), null);
13209
+ }
13061
13210
  return slots.item?.({
13062
13211
  item,
13063
13212
  index,
@@ -13074,10 +13223,10 @@ const VSelect = genericComponent()({
13074
13223
  "modelValue": isSelected,
13075
13224
  "ripple": false,
13076
13225
  "tabindex": "-1"
13077
- }, null) : undefined, item.props.prependAvatar && createVNode(VAvatar, {
13078
- "image": item.props.prependAvatar
13079
- }, null), item.props.prependIcon && createVNode(VIcon, {
13080
- "icon": item.props.prependIcon
13226
+ }, null) : undefined, camelizedProps.prependAvatar && createVNode(VAvatar, {
13227
+ "image": camelizedProps.prependAvatar
13228
+ }, null), camelizedProps.prependIcon && createVNode(VIcon, {
13229
+ "icon": camelizedProps.prependIcon
13081
13230
  }, null)]);
13082
13231
  }
13083
13232
  });
@@ -13218,6 +13367,9 @@ function filterItems(items, query, options) {
13218
13367
  let match = -1;
13219
13368
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13220
13369
  if (typeof item === 'object') {
13370
+ if (['divider', 'subheader'].includes(item.raw?.type)) {
13371
+ continue;
13372
+ }
13221
13373
  const filterKeys = keys || Object.keys(transformed);
13222
13374
  for (const key of filterKeys) {
13223
13375
  const value = getPropertyFromItem(transformed, key);
@@ -13420,7 +13572,7 @@ const VAutocomplete = genericComponent()({
13420
13572
  menu.value = !menu.value;
13421
13573
  }
13422
13574
  function onListKeydown(e) {
13423
- if (e.key !== ' ' && checkPrintable(e)) {
13575
+ if (checkPrintable(e) || e.key === 'Backspace') {
13424
13576
  vTextFieldRef.value?.focus();
13425
13577
  }
13426
13578
  }
@@ -13625,6 +13777,7 @@ const VAutocomplete = genericComponent()({
13625
13777
  }, props.menuProps), {
13626
13778
  default: () => [hasList && createVNode(VList, mergeProps({
13627
13779
  "ref": listRef,
13780
+ "filterable": true,
13628
13781
  "selected": selectedValues.value,
13629
13782
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
13630
13783
  "onMousedown": e => e.preventDefault(),
@@ -13656,6 +13809,22 @@ const VAutocomplete = genericComponent()({
13656
13809
  active: highlightFirst.value && index === 0 ? true : undefined,
13657
13810
  onClick: () => select(item, null)
13658
13811
  });
13812
+ if (item.raw.type === 'divider') {
13813
+ return slots.divider?.({
13814
+ props: item.raw,
13815
+ index
13816
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
13817
+ "key": `divider-${index}`
13818
+ }), null);
13819
+ }
13820
+ if (item.raw.type === 'subheader') {
13821
+ return slots.subheader?.({
13822
+ props: item.raw,
13823
+ index
13824
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
13825
+ "key": `subheader-${index}`
13826
+ }), null);
13827
+ }
13659
13828
  return slots.item?.({
13660
13829
  item,
13661
13830
  index,
@@ -13800,7 +13969,8 @@ const makeVBadgeProps = propsFactory({
13800
13969
  ...makeThemeProps(),
13801
13970
  ...makeTransitionProps({
13802
13971
  transition: 'scale-rotate-transition'
13803
- })
13972
+ }),
13973
+ ...makeDimensionProps()
13804
13974
  }, 'VBadge');
13805
13975
  const VBadge = genericComponent()({
13806
13976
  name: 'VBadge',
@@ -13830,6 +14000,9 @@ const VBadge = genericComponent()({
13830
14000
  const base = props.floating ? props.dot ? 2 : 4 : props.dot ? 8 : 12;
13831
14001
  return base + (['top', 'bottom'].includes(side) ? Number(props.offsetY ?? 0) : ['left', 'right'].includes(side) ? Number(props.offsetX ?? 0) : 0);
13832
14002
  });
14003
+ const {
14004
+ dimensionStyles
14005
+ } = useDimension(props);
13833
14006
  useRender(() => {
13834
14007
  const value = Number(props.content);
13835
14008
  const content = !props.max || isNaN(value) ? props.content : value <= Number(props.max) ? value : `${props.max}+`;
@@ -13851,7 +14024,7 @@ const VBadge = genericComponent()({
13851
14024
  }, {
13852
14025
  default: () => [withDirectives(createElementVNode("span", mergeProps({
13853
14026
  "class": ['v-badge__badge', themeClasses.value, backgroundColorClasses.value, roundedClasses.value, textColorClasses.value],
13854
- "style": [backgroundColorStyles.value, textColorStyles.value, props.inline ? {} : locationStyles.value],
14027
+ "style": [backgroundColorStyles.value, textColorStyles.value, dimensionStyles.value, props.inline ? {} : locationStyles.value],
13855
14028
  "aria-atomic": "true",
13856
14029
  "aria-label": t(props.label, value),
13857
14030
  "aria-live": "polite",
@@ -17260,13 +17433,13 @@ function date(value) {
17260
17433
  return null;
17261
17434
  }
17262
17435
  const sundayJanuarySecond2000 = new Date(2000, 0, 2);
17263
- function getWeekdays(locale, firstDayOfWeek) {
17436
+ function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
17264
17437
  const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
17265
17438
  return createRange(7).map(i => {
17266
17439
  const weekday = new Date(sundayJanuarySecond2000);
17267
17440
  weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
17268
17441
  return new Intl.DateTimeFormat(locale, {
17269
- weekday: 'narrow'
17442
+ weekday: weekdayFormat ?? 'narrow'
17270
17443
  }).format(weekday);
17271
17444
  });
17272
17445
  }
@@ -17525,7 +17698,7 @@ function getWeek(date, locale, firstDayOfWeek, firstWeekMinSize) {
17525
17698
  const yearStart = new Date(year, 0, 1);
17526
17699
  const size = firstWeekSize(year);
17527
17700
  const d1w1 = size >= minWeekSize ? addDays(yearStart, size - 7) : addDays(yearStart, size);
17528
- return 1 + getDiff(date, d1w1, 'weeks');
17701
+ return 1 + getDiff(endOfDay(date), startOfDay(d1w1), 'weeks');
17529
17702
  }
17530
17703
  function getDate(date) {
17531
17704
  return date.getDate();
@@ -17730,9 +17903,9 @@ class VuetifyDateAdapter {
17730
17903
  getDiff(date, comparing, unit) {
17731
17904
  return getDiff(date, comparing, unit);
17732
17905
  }
17733
- getWeekdays(firstDayOfWeek) {
17906
+ getWeekdays(firstDayOfWeek, weekdayFormat) {
17734
17907
  const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
17735
- return getWeekdays(this.locale, firstDay);
17908
+ return getWeekdays(this.locale, firstDay, weekdayFormat);
17736
17909
  }
17737
17910
  getYear(date) {
17738
17911
  return getYear(date);
@@ -17829,7 +18002,7 @@ function createDate(options, locale) {
17829
18002
  };
17830
18003
  }
17831
18004
  function createDateRange(adapter, start, stop) {
17832
- const diff = adapter.getDiff(stop ?? start, start, 'days');
18005
+ const diff = adapter.getDiff(adapter.endOfDay(stop ?? start), adapter.startOfDay(start), 'days');
17833
18006
  const datesInRange = [start];
17834
18007
  for (let i = 1; i < diff; i++) {
17835
18008
  const nextDate = adapter.addDays(start, i);
@@ -18087,6 +18260,7 @@ const VCombobox = genericComponent()({
18087
18260
  _search.value = val ?? '';
18088
18261
  if (!props.multiple && !hasSelectionSlot.value) {
18089
18262
  model.value = [transformItem$3(props, val)];
18263
+ nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18090
18264
  }
18091
18265
  if (val && props.multiple && props.delimiters?.length) {
18092
18266
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18167,7 +18341,7 @@ const VCombobox = genericComponent()({
18167
18341
  menu.value = !menu.value;
18168
18342
  }
18169
18343
  function onListKeydown(e) {
18170
- if (e.key !== ' ' && checkPrintable(e)) {
18344
+ if (checkPrintable(e) || e.key === 'Backspace') {
18171
18345
  vTextFieldRef.value?.focus();
18172
18346
  }
18173
18347
  }
@@ -18372,6 +18546,7 @@ const VCombobox = genericComponent()({
18372
18546
  }, props.menuProps), {
18373
18547
  default: () => [hasList && createVNode(VList, mergeProps({
18374
18548
  "ref": listRef,
18549
+ "filterable": true,
18375
18550
  "selected": selectedValues.value,
18376
18551
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
18377
18552
  "onMousedown": e => e.preventDefault(),
@@ -18403,6 +18578,22 @@ const VCombobox = genericComponent()({
18403
18578
  active: highlightFirst.value && index === 0 ? true : undefined,
18404
18579
  onClick: () => select(item, null)
18405
18580
  });
18581
+ if (item.raw.type === 'divider') {
18582
+ return slots.divider?.({
18583
+ props: item.raw,
18584
+ index
18585
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
18586
+ "key": `divider-${index}`
18587
+ }), null);
18588
+ }
18589
+ if (item.raw.type === 'subheader') {
18590
+ return slots.subheader?.({
18591
+ props: item.raw,
18592
+ index
18593
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
18594
+ "key": `subheader-${index}`
18595
+ }), null);
18596
+ }
18406
18597
  return slots.item?.({
18407
18598
  item,
18408
18599
  index,
@@ -20285,6 +20476,7 @@ const makeVDataTableHeadersProps = propsFactory({
20285
20476
  color: String,
20286
20477
  disableSort: Boolean,
20287
20478
  fixedHeader: Boolean,
20479
+ lastFixed: Boolean,
20288
20480
  multiSort: Boolean,
20289
20481
  sortAscIcon: {
20290
20482
  type: IconValue,
@@ -20331,10 +20523,11 @@ const VDataTableHeaders = genericComponent()({
20331
20523
  loaderClasses
20332
20524
  } = useLoader(props);
20333
20525
  function getFixedStyles(column, y) {
20334
- if (!(props.sticky || props.fixedHeader) && !column.fixed) return undefined;
20526
+ if (!(props.sticky || props.fixedHeader) && !(column.fixed || column.lastFixed)) return undefined;
20335
20527
  return {
20336
20528
  position: 'sticky',
20337
- left: column.fixed ? convertToUnit(column.fixedOffset) : undefined,
20529
+ left: column.fixed || column.lastFixed ? convertToUnit(column.fixedOffset) : undefined,
20530
+ right: column.lastFixed ? convertToUnit(column.fixedOffset ?? 0) : undefined,
20338
20531
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
20339
20532
  };
20340
20533
  }
@@ -20850,11 +21043,18 @@ const VDataTableRows = genericComponent()({
20850
21043
  }
20851
21044
  });
20852
21045
 
21046
+ // Types
21047
+
20853
21048
  const makeVTableProps = propsFactory({
20854
21049
  fixedHeader: Boolean,
20855
21050
  fixedFooter: Boolean,
20856
21051
  height: [Number, String],
20857
21052
  hover: Boolean,
21053
+ striped: {
21054
+ type: String,
21055
+ default: null,
21056
+ validator: v => ['even', 'odd'].includes(v)
21057
+ },
20858
21058
  ...makeComponentProps(),
20859
21059
  ...makeDensityProps(),
20860
21060
  ...makeTagProps(),
@@ -20881,7 +21081,9 @@ const VTable = genericComponent()({
20881
21081
  'v-table--fixed-footer': props.fixedFooter,
20882
21082
  'v-table--has-top': !!slots.top,
20883
21083
  'v-table--has-bottom': !!slots.bottom,
20884
- 'v-table--hover': props.hover
21084
+ 'v-table--hover': props.hover,
21085
+ 'v-table--striped-even': props.striped === 'even',
21086
+ 'v-table--striped-odd': props.striped === 'odd'
20885
21087
  }, themeClasses.value, densityClasses.value, props.class]),
20886
21088
  "style": normalizeStyle(props.style)
20887
21089
  }, {
@@ -22056,7 +22258,8 @@ const makeCalendarProps = propsFactory({
22056
22258
  firstDayOfWeek: {
22057
22259
  type: [Number, String],
22058
22260
  default: undefined
22059
- }
22261
+ },
22262
+ weekdayFormat: String
22060
22263
  }, 'calendar');
22061
22264
  function useCalendar(props) {
22062
22265
  const adapter = useDate();
@@ -22297,7 +22500,7 @@ const VDatePickerMonth = genericComponent()({
22297
22500
  "ref": daysRef,
22298
22501
  "key": daysInMonth.value[0].date?.toString(),
22299
22502
  "class": "v-date-picker-month__days"
22300
- }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => createElementVNode("div", {
22503
+ }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => createElementVNode("div", {
22301
22504
  "class": normalizeClass(['v-date-picker-month__day', 'v-date-picker-month__weekday'])
22302
22505
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22303
22506
  const slotProps = {
@@ -23912,6 +24115,9 @@ const VInfiniteScroll = genericComponent()({
23912
24115
  startStatus.value = status;
23913
24116
  } else if (side === 'end') {
23914
24117
  endStatus.value = status;
24118
+ } else if (side === 'both') {
24119
+ startStatus.value = status;
24120
+ endStatus.value = status;
23915
24121
  }
23916
24122
  }
23917
24123
  function getStatus(side) {
@@ -24023,6 +24229,32 @@ const VInfiniteScroll = genericComponent()({
24023
24229
  }, [renderSide('end', endStatus.value)])]
24024
24230
  });
24025
24231
  });
24232
+ function reset(side) {
24233
+ const effectiveSide = side ?? props.side;
24234
+ setStatus(effectiveSide, 'ok');
24235
+ nextTick(() => {
24236
+ setScrollAmount(getScrollSize() - previousScrollSize + getScrollAmount());
24237
+ if (props.mode !== 'manual') {
24238
+ nextTick(() => {
24239
+ window.requestAnimationFrame(() => {
24240
+ window.requestAnimationFrame(() => {
24241
+ window.requestAnimationFrame(() => {
24242
+ if (effectiveSide === 'both') {
24243
+ intersecting('start');
24244
+ intersecting('end');
24245
+ } else {
24246
+ intersecting(effectiveSide);
24247
+ }
24248
+ });
24249
+ });
24250
+ });
24251
+ });
24252
+ }
24253
+ });
24254
+ }
24255
+ return {
24256
+ reset
24257
+ };
24026
24258
  }
24027
24259
  });
24028
24260
 
@@ -24941,6 +25173,10 @@ const makeVNumberInputProps = propsFactory({
24941
25173
  type: Number,
24942
25174
  default: 0
24943
25175
  },
25176
+ minFractionDigits: {
25177
+ type: Number,
25178
+ default: null
25179
+ },
24944
25180
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
24945
25181
  }, 'VNumberInput');
24946
25182
  const VNumberInput = genericComponent()({
@@ -24968,9 +25204,19 @@ const VNumberInput = genericComponent()({
24968
25204
  const isFocused = shallowRef(props.focused);
24969
25205
  function correctPrecision(val) {
24970
25206
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
24971
- const fixed = precision == null ? String(val) : val.toFixed(precision);
24972
- return isFocused.value ? Number(fixed).toString() // trim zeros
24973
- : fixed;
25207
+ if (precision == null) {
25208
+ return String(val);
25209
+ }
25210
+ let fixed = val.toFixed(precision);
25211
+ if (isFocused.value) {
25212
+ return Number(fixed).toString(); // trim zeros
25213
+ }
25214
+ if ((props.minFractionDigits ?? precision) < precision) {
25215
+ const trimLimit = precision - props.minFractionDigits;
25216
+ const [baseDigits, fractionDigits] = fixed.split('.');
25217
+ fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
25218
+ }
25219
+ return fixed;
24974
25220
  }
24975
25221
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
24976
25222
  const _inputText = shallowRef(null);
@@ -25025,6 +25271,7 @@ const VNumberInput = genericComponent()({
25025
25271
  }
25026
25272
  };
25027
25273
  watch(() => props.precision, () => formatInputValue());
25274
+ watch(() => props.minFractionDigits, () => formatInputValue());
25028
25275
  onMounted(() => {
25029
25276
  clampModel();
25030
25277
  });
@@ -25139,7 +25386,7 @@ const VNumberInput = genericComponent()({
25139
25386
  inputText.value = null;
25140
25387
  return;
25141
25388
  }
25142
- inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25389
+ inputText.value = correctPrecision(model.value);
25143
25390
  }
25144
25391
  function trimDecimalZeros() {
25145
25392
  if (controlsDisabled.value) return;
@@ -25399,9 +25646,10 @@ const VOtpInput = genericComponent()({
25399
25646
  e.preventDefault();
25400
25647
  e.stopPropagation();
25401
25648
  const clipboardText = e?.clipboardData?.getData('Text').trim().slice(0, length.value) ?? '';
25649
+ const finalIndex = clipboardText.length - 1 === -1 ? index : clipboardText.length - 1;
25402
25650
  if (isValidNumber(clipboardText)) return;
25403
25651
  model.value = clipboardText.split('');
25404
- inputRef.value?.[index].blur();
25652
+ inputRef.value?.[finalIndex].focus();
25405
25653
  }
25406
25654
  function reset() {
25407
25655
  model.value = [];
@@ -30101,11 +30349,6 @@ const makeVIconBtnProps = propsFactory({
30101
30349
  hideOverlay: Boolean,
30102
30350
  icon: [String, Function, Object],
30103
30351
  iconColor: String,
30104
- iconSize: [Number, String],
30105
- iconSizes: {
30106
- type: Array,
30107
- default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
30108
- },
30109
30352
  loading: Boolean,
30110
30353
  opacity: [Number, String],
30111
30354
  readonly: Boolean,
@@ -30125,6 +30368,7 @@ const makeVIconBtnProps = propsFactory({
30125
30368
  ...makeBorderProps(),
30126
30369
  ...makeComponentProps(),
30127
30370
  ...makeElevationProps(),
30371
+ ...makeIconSizeProps(),
30128
30372
  ...makeRoundedProps(),
30129
30373
  ...makeTagProps({
30130
30374
  tag: 'button'
@@ -30179,7 +30423,6 @@ const VIconBtn = genericComponent()({
30179
30423
  })()
30180
30424
  }));
30181
30425
  const btnSizeMap = new Map(props.sizes);
30182
- const iconSizeMap = new Map(props.iconSizes);
30183
30426
  function onClick() {
30184
30427
  if (props.disabled || props.readonly || isActive.value === undefined || props.tag === 'a' && attrs.href) return;
30185
30428
  isActive.value = !isActive.value;
@@ -30191,12 +30434,12 @@ const VIconBtn = genericComponent()({
30191
30434
  const btnSize = hasNamedSize ? btnSizeMap.get(_btnSize) : _btnSize;
30192
30435
  const btnHeight = props.height ?? btnSize;
30193
30436
  const btnWidth = props.width ?? btnSize;
30194
- const _iconSize = props.iconSize;
30195
- const hasNamedIconSize = iconSizeMap.has(_iconSize);
30196
- const iconSize = !_iconSize ? hasNamedSize ? iconSizeMap.get(_btnSize) : iconSizeMap.get('default') : hasNamedIconSize ? iconSizeMap.get(_iconSize) : _iconSize;
30437
+ const {
30438
+ iconSize
30439
+ } = useIconSizes(props, () => new Map(props.iconSizes).get(_btnSize));
30197
30440
  const iconProps = {
30198
30441
  icon,
30199
- size: iconSize,
30442
+ size: iconSize.value,
30200
30443
  iconColor: props.iconColor,
30201
30444
  opacity: props.opacity
30202
30445
  };
@@ -30239,7 +30482,7 @@ const VIconBtn = genericComponent()({
30239
30482
  "color": typeof props.loading === 'boolean' ? undefined : props.loading,
30240
30483
  "indeterminate": "disable-shrink",
30241
30484
  "width": "2",
30242
- "size": iconSize
30485
+ "size": iconSize.value
30243
30486
  }, null)])]
30244
30487
  });
30245
30488
  });
@@ -32149,7 +32392,7 @@ function createVuetify$1() {
32149
32392
  };
32150
32393
  });
32151
32394
  }
32152
- const version$1 = "3.8.8-master.2025-06-08";
32395
+ const version$1 = "3.8.9-dev.2025-06-11";
32153
32396
  createVuetify$1.version = version$1;
32154
32397
 
32155
32398
  // Vue's inject() can only be used in setup
@@ -32447,7 +32690,7 @@ var index = /*#__PURE__*/Object.freeze({
32447
32690
 
32448
32691
  /* eslint-disable local-rules/sort-imports */
32449
32692
 
32450
- const version = "3.8.8-master.2025-06-08";
32693
+ const version = "3.8.9-dev.2025-06-11";
32451
32694
 
32452
32695
  /* eslint-disable local-rules/sort-imports */
32453
32696