@vuetify/nightly 3.8.7-master.2025-06-03 → 3.8.8-dev.2025-06-08

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 (170) hide show
  1. package/CHANGELOG.md +30 -15
  2. package/dist/json/attributes.json +3542 -3418
  3. package/dist/json/importMap-labs.json +18 -18
  4. package/dist/json/importMap.json +168 -168
  5. package/dist/json/tags.json +32 -1
  6. package/dist/json/web-types.json +6581 -6195
  7. package/dist/vuetify-labs.cjs +369 -147
  8. package/dist/vuetify-labs.css +3246 -3212
  9. package/dist/vuetify-labs.d.ts +2433 -1899
  10. package/dist/vuetify-labs.esm.js +370 -148
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +369 -147
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +363 -136
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +3712 -3678
  17. package/dist/vuetify.d.ts +1588 -1094
  18. package/dist/vuetify.esm.js +364 -137
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +363 -136
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1224 -1206
  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/VInput/VInput.d.ts +4 -4
  70. package/lib/components/VList/VList.d.ts +13 -0
  71. package/lib/components/VList/VList.js +4 -1
  72. package/lib/components/VList/VList.js.map +1 -1
  73. package/lib/components/VList/VListChildren.js.map +1 -1
  74. package/lib/components/VList/VListItem.d.ts +23 -10
  75. package/lib/components/VList/VListItem.js +7 -3
  76. package/lib/components/VList/VListItem.js.map +1 -1
  77. package/lib/components/VList/list.d.ts +9 -2
  78. package/lib/components/VList/list.js +7 -0
  79. package/lib/components/VList/list.js.map +1 -1
  80. package/lib/components/VNumberInput/VNumberInput.d.ts +103 -89
  81. package/lib/components/VNumberInput/VNumberInput.js +19 -4
  82. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  83. package/lib/components/VOtpInput/VOtpInput.js +2 -1
  84. package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
  85. package/lib/components/VOverlay/VOverlay.css +1 -1
  86. package/lib/components/VOverlay/_variables.scss +1 -1
  87. package/lib/components/VRadio/VRadio.d.ts +20 -10
  88. package/lib/components/VRadioGroup/VRadioGroup.d.ts +23 -13
  89. package/lib/components/VRangeSlider/VRangeSlider.d.ts +3 -3
  90. package/lib/components/VSelect/VSelect.d.ts +171 -107
  91. package/lib/components/VSelect/VSelect.js +21 -3
  92. package/lib/components/VSelect/VSelect.js.map +1 -1
  93. package/lib/components/VSelectionControl/VSelectionControl.d.ts +20 -10
  94. package/lib/components/VSelectionControlGroup/VSelectionControlGroup.d.ts +28 -14
  95. package/lib/components/VSlideGroup/VSlideGroup.d.ts +10 -0
  96. package/lib/components/VSlideGroup/VSlideGroup.js +2 -1
  97. package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
  98. package/lib/components/VSlider/VSlider.d.ts +3 -3
  99. package/lib/components/VSlider/VSliderThumb.d.ts +20 -10
  100. package/lib/components/VStepper/VStepperItem.d.ts +28 -14
  101. package/lib/components/VSwitch/VSwitch.d.ts +23 -13
  102. package/lib/components/VTable/VTable.css +6 -0
  103. package/lib/components/VTable/VTable.d.ts +55 -24
  104. package/lib/components/VTable/VTable.js +9 -2
  105. package/lib/components/VTable/VTable.js.map +1 -1
  106. package/lib/components/VTable/VTable.sass +14 -0
  107. package/lib/components/VTable/_variables.scss +1 -0
  108. package/lib/components/VTabs/VTab.d.ts +56 -28
  109. package/lib/components/VTabs/VTabs.d.ts +10 -0
  110. package/lib/components/VTextField/VTextField.d.ts +27 -27
  111. package/lib/components/VTextarea/VTextarea.d.ts +15 -15
  112. package/lib/components/VToolbar/VToolbar.d.ts +15 -3
  113. package/lib/components/VToolbar/VToolbar.js +6 -3
  114. package/lib/components/VToolbar/VToolbar.js.map +1 -1
  115. package/lib/composables/calendar.d.ts +6 -0
  116. package/lib/composables/calendar.js +2 -1
  117. package/lib/composables/calendar.js.map +1 -1
  118. package/lib/composables/date/DateAdapter.d.ts +3 -3
  119. package/lib/composables/date/DateAdapter.js.map +1 -1
  120. package/lib/composables/date/adapters/string.d.ts +54 -0
  121. package/lib/composables/date/adapters/string.js +153 -0
  122. package/lib/composables/date/adapters/string.js.map +1 -0
  123. package/lib/composables/date/adapters/vuetify.d.ts +1 -1
  124. package/lib/composables/date/adapters/vuetify.js +4 -4
  125. package/lib/composables/date/adapters/vuetify.js.map +1 -1
  126. package/lib/composables/date/date.d.ts +3 -3
  127. package/lib/composables/date/index.d.ts +1 -0
  128. package/lib/composables/date/index.js +1 -0
  129. package/lib/composables/date/index.js.map +1 -1
  130. package/lib/composables/filter.js +3 -0
  131. package/lib/composables/filter.js.map +1 -1
  132. package/lib/composables/iconSizes.d.ts +28 -0
  133. package/lib/composables/iconSizes.js +23 -0
  134. package/lib/composables/iconSizes.js.map +1 -0
  135. package/lib/composables/list-items.js +2 -2
  136. package/lib/composables/list-items.js.map +1 -1
  137. package/lib/composables/theme.d.ts +6 -1
  138. package/lib/composables/theme.js +94 -26
  139. package/lib/composables/theme.js.map +1 -1
  140. package/lib/composables/virtual.js +6 -1
  141. package/lib/composables/virtual.js.map +1 -1
  142. package/lib/directives/ripple/index.d.ts +2 -1
  143. package/lib/directives/ripple/index.js +12 -7
  144. package/lib/directives/ripple/index.js.map +1 -1
  145. package/lib/entry-bundler.d.ts +3 -3
  146. package/lib/entry-bundler.js +1 -1
  147. package/lib/entry-bundler.js.map +1 -1
  148. package/lib/framework.d.ts +83 -68
  149. package/lib/framework.js +1 -1
  150. package/lib/framework.js.map +1 -1
  151. package/lib/labs/VCalendar/VCalendar.d.ts +10 -0
  152. package/lib/labs/VColorInput/VColorInput.d.ts +3 -3
  153. package/lib/labs/VDateInput/VDateInput.d.ts +97 -87
  154. package/lib/labs/VFileUpload/VFileUpload.d.ts +3 -3
  155. package/lib/labs/VFileUpload/VFileUploadItem.d.ts +20 -10
  156. package/lib/labs/VIconBtn/VIconBtn.d.ts +29 -29
  157. package/lib/labs/VIconBtn/VIconBtn.js +7 -11
  158. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  159. package/lib/labs/VStepperVertical/VStepperVertical.d.ts +20 -10
  160. package/lib/labs/VStepperVertical/VStepperVerticalItem.d.ts +20 -10
  161. package/lib/labs/VTreeview/VTreeview.d.ts +13 -0
  162. package/lib/labs/VTreeview/VTreeviewItem.d.ts +20 -10
  163. package/lib/labs/entry-bundler.d.ts +3 -3
  164. package/lib/util/globals.d.ts +1 -0
  165. package/lib/util/globals.js +1 -0
  166. package/lib/util/globals.js.map +1 -1
  167. package/lib/util/helpers.d.ts +1 -0
  168. package/lib/util/helpers.js +9 -1
  169. package/lib/util/helpers.js.map +1 -1
  170. package/package.json +3 -1
@@ -1,10 +1,10 @@
1
1
  /*!
2
- * Vuetify v3.8.7-master.2025-06-03
2
+ * Vuetify v3.8.8-dev.2025-06-08
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, 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, 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, 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"); }
@@ -602,6 +603,14 @@ function extractNumber(text, decimalDigitsLimit) {
602
603
  }
603
604
  return cleanText;
604
605
  }
606
+ function camelizeProps(props) {
607
+ if (!props) return;
608
+ const out = {};
609
+ for (const prop in props) {
610
+ out[camelize(prop)] = props[prop];
611
+ }
612
+ return out;
613
+ }
605
614
 
606
615
  // Utilities
607
616
  const block = ['top', 'bottom'];
@@ -2337,6 +2346,7 @@ const makeThemeProps = propsFactory({
2337
2346
  function genDefaults$2() {
2338
2347
  return {
2339
2348
  defaultTheme: 'light',
2349
+ prefix: 'v-',
2340
2350
  variations: {
2341
2351
  colors: [],
2342
2352
  lighten: 0,
@@ -2418,7 +2428,10 @@ function genDefaults$2() {
2418
2428
  }
2419
2429
  }
2420
2430
  },
2421
- stylesheetId: 'vuetify-theme-stylesheet'
2431
+ stylesheetId: 'vuetify-theme-stylesheet',
2432
+ scoped: false,
2433
+ unimportant: false,
2434
+ utilities: true
2422
2435
  };
2423
2436
  }
2424
2437
  function parseThemeOptions() {
@@ -2441,21 +2454,21 @@ function parseThemeOptions() {
2441
2454
  function createCssClass(lines, selector, content, scope) {
2442
2455
  lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
2443
2456
  }
2444
- function genCssVariables(theme) {
2457
+ function genCssVariables(theme, prefix) {
2445
2458
  const lightOverlay = theme.dark ? 2 : 1;
2446
2459
  const darkOverlay = theme.dark ? 1 : 2;
2447
2460
  const variables = [];
2448
2461
  for (const [key, value] of Object.entries(theme.colors)) {
2449
2462
  const rgb = parseColor(value);
2450
- variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2463
+ variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2451
2464
  if (!key.startsWith('on-')) {
2452
- variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2465
+ variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2453
2466
  }
2454
2467
  }
2455
2468
  for (const [key, value] of Object.entries(theme.variables)) {
2456
2469
  const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
2457
2470
  const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
2458
- variables.push(`--v-${key}: ${rgb ?? value}`);
2471
+ variables.push(`--${prefix}${key}: ${rgb ?? value}`);
2459
2472
  }
2460
2473
  return variables;
2461
2474
  }
@@ -2499,7 +2512,8 @@ function getScopedSelector(selector, scope) {
2499
2512
  const scopeSelector = `:where(${scope})`;
2500
2513
  return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
2501
2514
  }
2502
- function upsertStyles(styleEl, styles) {
2515
+ function upsertStyles(id, cspNonce, styles) {
2516
+ const styleEl = getOrCreateStyleElement(id, cspNonce);
2503
2517
  if (!styleEl) return;
2504
2518
  styleEl.innerHTML = styles;
2505
2519
  }
@@ -2519,8 +2533,17 @@ function getOrCreateStyleElement(id, cspNonce) {
2519
2533
  // Composables
2520
2534
  function createTheme(options) {
2521
2535
  const parsedOptions = parseThemeOptions(options);
2522
- const name = shallowRef(parsedOptions.defaultTheme);
2536
+ const _name = shallowRef(parsedOptions.defaultTheme);
2523
2537
  const themes = ref(parsedOptions.themes);
2538
+ const systemName = shallowRef('light');
2539
+ const name = computed({
2540
+ get() {
2541
+ return _name.value === 'system' ? systemName.value : _name.value;
2542
+ },
2543
+ set(val) {
2544
+ _name.value = val;
2545
+ }
2546
+ });
2524
2547
  const computedThemes = computed(() => {
2525
2548
  const acc = {};
2526
2549
  for (const [name, original] of Object.entries(themes.value)) {
@@ -2541,28 +2564,49 @@ function createTheme(options) {
2541
2564
  const current = toRef(() => computedThemes.value[name.value]);
2542
2565
  const styles = computed(() => {
2543
2566
  const lines = [];
2567
+ const important = parsedOptions.unimportant ? '' : ' !important';
2568
+ const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
2544
2569
  if (current.value?.dark) {
2545
2570
  createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
2546
2571
  }
2547
- createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
2572
+ createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
2548
2573
  for (const [themeName, theme] of Object.entries(computedThemes.value)) {
2549
- createCssClass(lines, `.v-theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme)], parsedOptions.scope);
2550
- }
2551
- const bgLines = [];
2552
- const fgLines = [];
2553
- const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
2554
- for (const key of colors) {
2555
- if (key.startsWith('on-')) {
2556
- createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
2557
- } else {
2558
- 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);
2559
- createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
2560
- createCssClass(fgLines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`], parsedOptions.scope);
2574
+ createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
2575
+ }
2576
+ if (parsedOptions.utilities) {
2577
+ const bgLines = [];
2578
+ const fgLines = [];
2579
+ const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
2580
+ for (const key of colors) {
2581
+ if (key.startsWith('on-')) {
2582
+ createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
2583
+ } else {
2584
+ 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);
2585
+ createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
2586
+ createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
2587
+ }
2561
2588
  }
2589
+ lines.push(...bgLines, ...fgLines);
2562
2590
  }
2563
- lines.push(...bgLines, ...fgLines);
2564
2591
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
2565
2592
  });
2593
+ const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
2594
+ const themeNames = toRef(() => Object.keys(computedThemes.value));
2595
+ if (SUPPORTS_MATCH_MEDIA) {
2596
+ const media = window.matchMedia('(prefers-color-scheme: dark)');
2597
+ function updateSystemName() {
2598
+ systemName.value = media.matches ? 'dark' : 'light';
2599
+ }
2600
+ updateSystemName();
2601
+ media.addEventListener('change', updateSystemName, {
2602
+ passive: true
2603
+ });
2604
+ if (getCurrentScope()) {
2605
+ onScopeDispose(() => {
2606
+ media.removeEventListener('change', updateSystemName);
2607
+ });
2608
+ }
2609
+ }
2566
2610
  function install(app) {
2567
2611
  if (parsedOptions.isDisabled) return;
2568
2612
  const head = app._context.provides.usehead;
@@ -2600,22 +2644,55 @@ function createTheme(options) {
2600
2644
  updateStyles();
2601
2645
  }
2602
2646
  function updateStyles() {
2603
- upsertStyles(getOrCreateStyleElement(parsedOptions.stylesheetId, parsedOptions.cspNonce), styles.value);
2647
+ upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
2604
2648
  }
2605
2649
  }
2606
2650
  }
2607
- const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);
2651
+ function change(themeName) {
2652
+ if (!themeNames.value.includes(themeName)) {
2653
+ consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
2654
+ return;
2655
+ }
2656
+ name.value = themeName;
2657
+ }
2658
+ function cycle() {
2659
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
2660
+ const currentIndex = themeArray.indexOf(name.value);
2661
+ const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
2662
+ change(themeArray[nextIndex]);
2663
+ }
2664
+ function toggle() {
2665
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
2666
+ cycle(themeArray);
2667
+ }
2668
+ const globalName = new Proxy(name, {
2669
+ get(target, prop) {
2670
+ return target[prop];
2671
+ },
2672
+ set(target, prop, val) {
2673
+ if (prop === 'value') {
2674
+ deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
2675
+ }
2676
+ // @ts-expect-error
2677
+ target[prop] = val;
2678
+ return true;
2679
+ }
2680
+ });
2608
2681
  return {
2609
2682
  install,
2683
+ change,
2684
+ cycle,
2685
+ toggle,
2610
2686
  isDisabled: parsedOptions.isDisabled,
2611
2687
  name,
2612
2688
  themes,
2613
2689
  current,
2614
2690
  computedThemes,
2691
+ prefix: parsedOptions.prefix,
2615
2692
  themeClasses,
2616
2693
  styles,
2617
2694
  global: {
2618
- name,
2695
+ name: globalName,
2619
2696
  current
2620
2697
  }
2621
2698
  };
@@ -2626,7 +2703,7 @@ function provideTheme(props) {
2626
2703
  if (!theme) throw new Error('Could not find Vuetify theme injection');
2627
2704
  const name = toRef(() => props.theme ?? theme.name.value);
2628
2705
  const current = toRef(() => theme.themes.value[name.value]);
2629
- const themeClasses = toRef(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);
2706
+ const themeClasses = toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
2630
2707
  const newTheme = {
2631
2708
  ...theme,
2632
2709
  name,
@@ -3730,7 +3807,10 @@ const makeVToolbarProps = propsFactory({
3730
3807
  default: 'default',
3731
3808
  validator: v => allowedDensities$1.includes(v)
3732
3809
  },
3733
- extended: Boolean,
3810
+ extended: {
3811
+ type: Boolean,
3812
+ default: null
3813
+ },
3734
3814
  extensionHeight: {
3735
3815
  type: [Number, String],
3736
3816
  default: 48
@@ -3778,7 +3858,7 @@ const VToolbar = genericComponent()({
3778
3858
  const {
3779
3859
  rtlClasses
3780
3860
  } = useRtl();
3781
- const isExtended = shallowRef(!!(props.extended || slots.extension?.()));
3861
+ const isExtended = shallowRef(props.extended === null ? !!slots.extension?.() : props.extended);
3782
3862
  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));
3783
3863
  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);
3784
3864
  provideDefaults({
@@ -3790,7 +3870,7 @@ const VToolbar = genericComponent()({
3790
3870
  const hasTitle = !!(props.title || slots.title);
3791
3871
  const hasImage = !!(slots.image || props.image);
3792
3872
  const extension = slots.extension?.();
3793
- isExtended.value = !!(props.extended || extension);
3873
+ isExtended.value = props.extended === null ? !!extension : props.extended;
3794
3874
  return createVNode(props.tag, {
3795
3875
  "class": normalizeClass(['v-toolbar', {
3796
3876
  'v-toolbar--absolute': props.absolute,
@@ -4173,9 +4253,15 @@ function useVariant(props) {
4173
4253
  };
4174
4254
  }
4175
4255
 
4256
+ // Types
4257
+
4176
4258
  const makeVBtnGroupProps = propsFactory({
4177
4259
  baseColor: String,
4178
4260
  divided: Boolean,
4261
+ direction: {
4262
+ type: String,
4263
+ default: 'horizontal'
4264
+ },
4179
4265
  ...makeBorderProps(),
4180
4266
  ...makeComponentProps(),
4181
4267
  ...makeDensityProps(),
@@ -4209,7 +4295,7 @@ const VBtnGroup = genericComponent()({
4209
4295
  } = useRounded(props);
4210
4296
  provideDefaults({
4211
4297
  VBtn: {
4212
- height: 'auto',
4298
+ height: toRef(() => props.direction === 'horizontal' ? 'auto' : null),
4213
4299
  baseColor: toRef(() => props.baseColor),
4214
4300
  color: toRef(() => props.color),
4215
4301
  density: toRef(() => props.density),
@@ -4219,7 +4305,7 @@ const VBtnGroup = genericComponent()({
4219
4305
  });
4220
4306
  useRender(() => {
4221
4307
  return createVNode(props.tag, {
4222
- "class": normalizeClass(['v-btn-group', {
4308
+ "class": normalizeClass(['v-btn-group', `v-btn-group--${props.direction}`, {
4223
4309
  'v-btn-group--divided': props.divided
4224
4310
  }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
4225
4311
  "style": normalizeStyle(props.style)
@@ -5551,8 +5637,8 @@ function rippleCancelShow(e) {
5551
5637
  window.clearTimeout(element._ripple.showTimer);
5552
5638
  }
5553
5639
  let keyboardRipple = false;
5554
- function keyboardRippleShow(e) {
5555
- if (!keyboardRipple && (e.keyCode === keyCodes.enter || e.keyCode === keyCodes.space)) {
5640
+ function keyboardRippleShow(e, keys) {
5641
+ if (!keyboardRipple && keys.includes(e.keyCode)) {
5556
5642
  keyboardRipple = true;
5557
5643
  rippleShow(e);
5558
5644
  }
@@ -5580,9 +5666,12 @@ function updateRipple(el, binding, wasEnabled) {
5580
5666
  el._ripple.enabled = enabled;
5581
5667
  el._ripple.centered = modifiers.center;
5582
5668
  el._ripple.circle = modifiers.circle;
5583
- if (isObject(value) && value.class) {
5584
- el._ripple.class = value.class;
5669
+ const bindingValue = isObject(value) ? value : {};
5670
+ if (bindingValue.class) {
5671
+ el._ripple.class = bindingValue.class;
5585
5672
  }
5673
+ const allowedKeys = bindingValue.keys ?? [keyCodes.enter, keyCodes.space];
5674
+ el._ripple.keyDownHandler = e => keyboardRippleShow(e, allowedKeys);
5586
5675
  if (enabled && !wasEnabled) {
5587
5676
  if (modifiers.stop) {
5588
5677
  el.addEventListener('touchstart', rippleStop, {
@@ -5604,7 +5693,7 @@ function updateRipple(el, binding, wasEnabled) {
5604
5693
  el.addEventListener('mousedown', rippleShow);
5605
5694
  el.addEventListener('mouseup', rippleHide);
5606
5695
  el.addEventListener('mouseleave', rippleHide);
5607
- el.addEventListener('keydown', keyboardRippleShow);
5696
+ el.addEventListener('keydown', e => keyboardRippleShow(e, allowedKeys));
5608
5697
  el.addEventListener('keyup', keyboardRippleHide);
5609
5698
  el.addEventListener('blur', focusRippleHide);
5610
5699
 
@@ -5624,7 +5713,9 @@ function removeListeners(el) {
5624
5713
  el.removeEventListener('touchcancel', rippleHide);
5625
5714
  el.removeEventListener('mouseup', rippleHide);
5626
5715
  el.removeEventListener('mouseleave', rippleHide);
5627
- el.removeEventListener('keydown', keyboardRippleShow);
5716
+ if (el._ripple?.keyDownHandler) {
5717
+ el.removeEventListener('keydown', el._ripple.keyDownHandler);
5718
+ }
5628
5719
  el.removeEventListener('keyup', keyboardRippleHide);
5629
5720
  el.removeEventListener('dragstart', rippleHide);
5630
5721
  el.removeEventListener('blur', focusRippleHide);
@@ -5633,8 +5724,8 @@ function mounted$4(el, binding) {
5633
5724
  updateRipple(el, binding, false);
5634
5725
  }
5635
5726
  function unmounted$4(el) {
5636
- delete el._ripple;
5637
5727
  removeListeners(el);
5728
+ delete el._ripple;
5638
5729
  }
5639
5730
  function updated$1(el, binding) {
5640
5731
  if (binding.value === binding.oldValue) {
@@ -5907,6 +5998,31 @@ const VAppBarTitle = genericComponent()({
5907
5998
  // Utilities
5908
5999
  const VAlertTitle = createSimpleFunctional('v-alert-title');
5909
6000
 
6001
+ // Utilities
6002
+
6003
+ // Types
6004
+
6005
+ // Types
6006
+
6007
+ // Composables
6008
+ const makeIconSizeProps = propsFactory({
6009
+ iconSize: [Number, String],
6010
+ iconSizes: {
6011
+ type: Array,
6012
+ default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
6013
+ }
6014
+ }, 'iconSize');
6015
+ function useIconSizes(props, fallback) {
6016
+ const iconSize = computed(() => {
6017
+ const iconSizeMap = new Map(props.iconSizes);
6018
+ const _iconSize = props.iconSize ?? fallback() ?? 'default';
6019
+ return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
6020
+ });
6021
+ return {
6022
+ iconSize
6023
+ };
6024
+ }
6025
+
5910
6026
  // Types
5911
6027
 
5912
6028
  const allowedTypes = ['success', 'info', 'warning', 'error'];
@@ -5946,6 +6062,7 @@ const makeVAlertProps = propsFactory({
5946
6062
  ...makeDensityProps(),
5947
6063
  ...makeDimensionProps(),
5948
6064
  ...makeElevationProps(),
6065
+ ...makeIconSizeProps(),
5949
6066
  ...makeLocationProps(),
5950
6067
  ...makePositionProps(),
5951
6068
  ...makeRoundedProps(),
@@ -5973,6 +6090,9 @@ const VAlert = genericComponent()({
5973
6090
  if (!props.type) return props.icon;
5974
6091
  return props.icon ?? `$${props.type}`;
5975
6092
  });
6093
+ const {
6094
+ iconSize
6095
+ } = useIconSizes(props, () => props.prominent ? 44 : 28);
5976
6096
  const {
5977
6097
  themeClasses
5978
6098
  } = provideTheme(props);
@@ -6020,6 +6140,11 @@ const VAlert = genericComponent()({
6020
6140
  const hasPrepend = !!(slots.prepend || icon.value);
6021
6141
  const hasTitle = !!(slots.title || props.title);
6022
6142
  const hasClose = !!(slots.close || props.closable);
6143
+ const iconProps = {
6144
+ density: props.density,
6145
+ icon: icon.value,
6146
+ size: iconSize.value
6147
+ };
6023
6148
  return isActive.value && createVNode(props.tag, {
6024
6149
  "class": normalizeClass(['v-alert', props.border && {
6025
6150
  'v-alert--border': !!props.border,
@@ -6037,19 +6162,14 @@ const VAlert = genericComponent()({
6037
6162
  }, null), hasPrepend && createElementVNode("div", {
6038
6163
  "key": "prepend",
6039
6164
  "class": "v-alert__prepend"
6040
- }, [!slots.prepend ? createVNode(VIcon, {
6041
- "key": "prepend-icon",
6042
- "density": props.density,
6043
- "icon": icon.value,
6044
- "size": props.prominent ? 44 : 28
6045
- }, null) : createVNode(VDefaultsProvider, {
6165
+ }, [!slots.prepend ? createVNode(VIcon, mergeProps({
6166
+ "key": "prepend-icon"
6167
+ }, iconProps), null) : createVNode(VDefaultsProvider, {
6046
6168
  "key": "prepend-defaults",
6047
6169
  "disabled": !icon.value,
6048
6170
  "defaults": {
6049
6171
  VIcon: {
6050
- density: props.density,
6051
- icon: icon.value,
6052
- size: props.prominent ? 44 : 28
6172
+ ...iconProps
6053
6173
  }
6054
6174
  }
6055
6175
  }, slots.prepend)]), createElementVNode("div", {
@@ -7574,6 +7694,7 @@ function getOffsetPosition(isHorizontal, element) {
7574
7694
  const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group');
7575
7695
  const makeVSlideGroupProps = propsFactory({
7576
7696
  centerActive: Boolean,
7697
+ contentClass: null,
7577
7698
  direction: {
7578
7699
  type: String,
7579
7700
  default: 'horizontal'
@@ -7886,7 +8007,7 @@ const VSlideGroup = genericComponent()({
7886
8007
  })]), createElementVNode("div", {
7887
8008
  "key": "container",
7888
8009
  "ref": containerRef,
7889
- "class": "v-slide-group__container",
8010
+ "class": normalizeClass(['v-slide-group__container', props.contentClass]),
7890
8011
  "onScroll": onScroll
7891
8012
  }, [createElementVNode("div", {
7892
8013
  "ref": contentRef,
@@ -8249,16 +8370,85 @@ const VChip = genericComponent()({
8249
8370
  }
8250
8371
  });
8251
8372
 
8373
+ const makeVDividerProps = propsFactory({
8374
+ color: String,
8375
+ inset: Boolean,
8376
+ length: [Number, String],
8377
+ opacity: [Number, String],
8378
+ thickness: [Number, String],
8379
+ vertical: Boolean,
8380
+ ...makeComponentProps(),
8381
+ ...makeThemeProps()
8382
+ }, 'VDivider');
8383
+ const VDivider = genericComponent()({
8384
+ name: 'VDivider',
8385
+ props: makeVDividerProps(),
8386
+ setup(props, _ref) {
8387
+ let {
8388
+ attrs,
8389
+ slots
8390
+ } = _ref;
8391
+ const {
8392
+ themeClasses
8393
+ } = provideTheme(props);
8394
+ const {
8395
+ textColorClasses,
8396
+ textColorStyles
8397
+ } = useTextColor(() => props.color);
8398
+ const dividerStyles = computed(() => {
8399
+ const styles = {};
8400
+ if (props.length) {
8401
+ styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
8402
+ }
8403
+ if (props.thickness) {
8404
+ styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
8405
+ }
8406
+ return styles;
8407
+ });
8408
+ useRender(() => {
8409
+ const divider = createElementVNode("hr", {
8410
+ "class": normalizeClass([{
8411
+ 'v-divider': true,
8412
+ 'v-divider--inset': props.inset,
8413
+ 'v-divider--vertical': props.vertical
8414
+ }, themeClasses.value, textColorClasses.value, props.class]),
8415
+ "style": normalizeStyle([dividerStyles.value, textColorStyles.value, {
8416
+ '--v-border-opacity': props.opacity
8417
+ }, props.style]),
8418
+ "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
8419
+ "role": `${attrs.role || 'separator'}`
8420
+ }, null);
8421
+ if (!slots.default) return divider;
8422
+ return createElementVNode("div", {
8423
+ "class": normalizeClass(['v-divider__wrapper', {
8424
+ 'v-divider__wrapper--vertical': props.vertical,
8425
+ 'v-divider__wrapper--inset': props.inset
8426
+ }])
8427
+ }, [divider, createElementVNode("div", {
8428
+ "class": "v-divider__content"
8429
+ }, [slots.default()]), divider]);
8430
+ });
8431
+ return {};
8432
+ }
8433
+ });
8434
+
8252
8435
  // Utilities
8253
8436
 
8254
8437
  // List
8255
8438
  const ListKey = Symbol.for('vuetify:list');
8256
8439
  function createList() {
8440
+ let {
8441
+ filterable
8442
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
8443
+ filterable: false
8444
+ };
8257
8445
  const parent = inject$1(ListKey, {
8446
+ filterable: false,
8258
8447
  hasPrepend: shallowRef(false),
8259
8448
  updateHasPrepend: () => null
8260
8449
  });
8261
8450
  const data = {
8451
+ filterable: parent.filterable || filterable,
8262
8452
  hasPrepend: shallowRef(false),
8263
8453
  updateHasPrepend: value => {
8264
8454
  if (value) data.hasPrepend.value = value;
@@ -9210,6 +9400,9 @@ const VListItem = genericComponent()({
9210
9400
  roundedClasses
9211
9401
  } = useRounded(roundedProps);
9212
9402
  const lineClasses = toRef(() => props.lines ? `v-list-item--${props.lines}-line` : undefined);
9403
+ const rippleOptions = toRef(() => props.ripple !== undefined && !!props.ripple && list?.filterable ? {
9404
+ keys: [keyCodes.enter]
9405
+ } : props.ripple);
9213
9406
  const slotProps = computed(() => ({
9214
9407
  isActive: isActive.value,
9215
9408
  select,
@@ -9234,8 +9427,9 @@ const VListItem = genericComponent()({
9234
9427
  function onKeyDown(e) {
9235
9428
  const target = e.target;
9236
9429
  if (['INPUT', 'TEXTAREA'].includes(target.tagName)) return;
9237
- if (e.key === 'Enter' || e.key === ' ') {
9430
+ if (e.key === 'Enter' || e.key === ' ' && !list?.filterable) {
9238
9431
  e.preventDefault();
9432
+ e.stopPropagation();
9239
9433
  e.target.dispatchEvent(new MouseEvent('click', e));
9240
9434
  }
9241
9435
  }
@@ -9345,7 +9539,7 @@ const VListItem = genericComponent()({
9345
9539
  }), createElementVNode("div", {
9346
9540
  "class": "v-list-item__spacer"
9347
9541
  }, null)])]
9348
- }), [[Ripple, isClickable.value && props.ripple]]);
9542
+ }), [[Ripple, isClickable.value && rippleOptions.value]]);
9349
9543
  });
9350
9544
  return {
9351
9545
  activate,
@@ -9400,68 +9594,6 @@ const VListSubheader = genericComponent()({
9400
9594
  }
9401
9595
  });
9402
9596
 
9403
- const makeVDividerProps = propsFactory({
9404
- color: String,
9405
- inset: Boolean,
9406
- length: [Number, String],
9407
- opacity: [Number, String],
9408
- thickness: [Number, String],
9409
- vertical: Boolean,
9410
- ...makeComponentProps(),
9411
- ...makeThemeProps()
9412
- }, 'VDivider');
9413
- const VDivider = genericComponent()({
9414
- name: 'VDivider',
9415
- props: makeVDividerProps(),
9416
- setup(props, _ref) {
9417
- let {
9418
- attrs,
9419
- slots
9420
- } = _ref;
9421
- const {
9422
- themeClasses
9423
- } = provideTheme(props);
9424
- const {
9425
- textColorClasses,
9426
- textColorStyles
9427
- } = useTextColor(() => props.color);
9428
- const dividerStyles = computed(() => {
9429
- const styles = {};
9430
- if (props.length) {
9431
- styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
9432
- }
9433
- if (props.thickness) {
9434
- styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
9435
- }
9436
- return styles;
9437
- });
9438
- useRender(() => {
9439
- const divider = createElementVNode("hr", {
9440
- "class": normalizeClass([{
9441
- 'v-divider': true,
9442
- 'v-divider--inset': props.inset,
9443
- 'v-divider--vertical': props.vertical
9444
- }, themeClasses.value, textColorClasses.value, props.class]),
9445
- "style": normalizeStyle([dividerStyles.value, textColorStyles.value, {
9446
- '--v-border-opacity': props.opacity
9447
- }, props.style]),
9448
- "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
9449
- "role": `${attrs.role || 'separator'}`
9450
- }, null);
9451
- if (!slots.default) return divider;
9452
- return createElementVNode("div", {
9453
- "class": normalizeClass(['v-divider__wrapper', {
9454
- 'v-divider__wrapper--vertical': props.vertical,
9455
- 'v-divider__wrapper--inset': props.inset
9456
- }])
9457
- }, [divider, createElementVNode("div", {
9458
- "class": "v-divider__content"
9459
- }, [slots.default()]), divider]);
9460
- });
9461
- return {};
9462
- }
9463
- });
9464
-
9465
9597
  // Types
9466
9598
 
9467
9599
  const makeVListChildrenProps = propsFactory({
@@ -9578,7 +9710,7 @@ function transformItem$3(props, item) {
9578
9710
  const _props = {
9579
9711
  title,
9580
9712
  value,
9581
- ...itemProps
9713
+ ...camelizeProps(itemProps)
9582
9714
  };
9583
9715
  return {
9584
9716
  title: String(_props.title ?? ''),
@@ -9730,6 +9862,7 @@ const makeVListProps = propsFactory({
9730
9862
  activeClass: String,
9731
9863
  bgColor: String,
9732
9864
  disabled: Boolean,
9865
+ filterable: Boolean,
9733
9866
  expandIcon: IconValue,
9734
9867
  collapseIcon: IconValue,
9735
9868
  lines: {
@@ -9813,7 +9946,9 @@ const VList = genericComponent()({
9813
9946
  const activeColor = toRef(() => props.activeColor);
9814
9947
  const baseColor = toRef(() => props.baseColor);
9815
9948
  const color = toRef(() => props.color);
9816
- createList();
9949
+ createList({
9950
+ filterable: props.filterable
9951
+ });
9817
9952
  provideDefaults({
9818
9953
  VListGroup: {
9819
9954
  activeColor,
@@ -12389,7 +12524,12 @@ function useVirtual(props, items) {
12389
12524
  }
12390
12525
  function calculateOffset(index) {
12391
12526
  index = clamp(index, 0, items.value.length - 1);
12392
- 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;
12393
12533
  }
12394
12534
  function calculateIndex(scrollTop) {
12395
12535
  return binaryClosest(offsets, scrollTop);
@@ -12743,6 +12883,7 @@ const makeSelectProps = propsFactory({
12743
12883
  },
12744
12884
  openOnClear: Boolean,
12745
12885
  itemColor: String,
12886
+ noAutoScroll: Boolean,
12746
12887
  ...makeItemsProps({
12747
12888
  itemChildren: false
12748
12889
  })
@@ -12957,7 +13098,7 @@ const VSelect = genericComponent()({
12957
13098
  watch(menu, () => {
12958
13099
  if (!props.hideSelected && menu.value && model.value.length) {
12959
13100
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
12960
- IN_BROWSER && window.requestAnimationFrame(() => {
13101
+ IN_BROWSER && !props.noAutoScroll && window.requestAnimationFrame(() => {
12961
13102
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
12962
13103
  });
12963
13104
  }
@@ -13049,6 +13190,22 @@ const VSelect = genericComponent()({
13049
13190
  key: item.value,
13050
13191
  onClick: () => select(item, null)
13051
13192
  });
13193
+ if (item.raw.type === 'divider') {
13194
+ return slots.divider?.({
13195
+ props: item.raw,
13196
+ index
13197
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
13198
+ "key": `divider-${index}`
13199
+ }), null);
13200
+ }
13201
+ if (item.raw.type === 'subheader') {
13202
+ return slots.subheader?.({
13203
+ props: item.raw,
13204
+ index
13205
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
13206
+ "key": `subheader-${index}`
13207
+ }), null);
13208
+ }
13052
13209
  return slots.item?.({
13053
13210
  item,
13054
13211
  index,
@@ -13209,6 +13366,9 @@ function filterItems(items, query, options) {
13209
13366
  let match = -1;
13210
13367
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13211
13368
  if (typeof item === 'object') {
13369
+ if (['divider', 'subheader'].includes(item.raw?.type)) {
13370
+ continue;
13371
+ }
13212
13372
  const filterKeys = keys || Object.keys(transformed);
13213
13373
  for (const key of filterKeys) {
13214
13374
  const value = getPropertyFromItem(transformed, key);
@@ -13411,7 +13571,7 @@ const VAutocomplete = genericComponent()({
13411
13571
  menu.value = !menu.value;
13412
13572
  }
13413
13573
  function onListKeydown(e) {
13414
- if (e.key !== ' ' && checkPrintable(e)) {
13574
+ if (checkPrintable(e) || e.key === 'Backspace') {
13415
13575
  vTextFieldRef.value?.focus();
13416
13576
  }
13417
13577
  }
@@ -13616,6 +13776,7 @@ const VAutocomplete = genericComponent()({
13616
13776
  }, props.menuProps), {
13617
13777
  default: () => [hasList && createVNode(VList, mergeProps({
13618
13778
  "ref": listRef,
13779
+ "filterable": true,
13619
13780
  "selected": selectedValues.value,
13620
13781
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
13621
13782
  "onMousedown": e => e.preventDefault(),
@@ -13647,6 +13808,22 @@ const VAutocomplete = genericComponent()({
13647
13808
  active: highlightFirst.value && index === 0 ? true : undefined,
13648
13809
  onClick: () => select(item, null)
13649
13810
  });
13811
+ if (item.raw.type === 'divider') {
13812
+ return slots.divider?.({
13813
+ props: item.raw,
13814
+ index
13815
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
13816
+ "key": `divider-${index}`
13817
+ }), null);
13818
+ }
13819
+ if (item.raw.type === 'subheader') {
13820
+ return slots.subheader?.({
13821
+ props: item.raw,
13822
+ index
13823
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
13824
+ "key": `subheader-${index}`
13825
+ }), null);
13826
+ }
13650
13827
  return slots.item?.({
13651
13828
  item,
13652
13829
  index,
@@ -13791,7 +13968,8 @@ const makeVBadgeProps = propsFactory({
13791
13968
  ...makeThemeProps(),
13792
13969
  ...makeTransitionProps({
13793
13970
  transition: 'scale-rotate-transition'
13794
- })
13971
+ }),
13972
+ ...makeDimensionProps()
13795
13973
  }, 'VBadge');
13796
13974
  const VBadge = genericComponent()({
13797
13975
  name: 'VBadge',
@@ -13821,6 +13999,9 @@ const VBadge = genericComponent()({
13821
13999
  const base = props.floating ? props.dot ? 2 : 4 : props.dot ? 8 : 12;
13822
14000
  return base + (['top', 'bottom'].includes(side) ? Number(props.offsetY ?? 0) : ['left', 'right'].includes(side) ? Number(props.offsetX ?? 0) : 0);
13823
14001
  });
14002
+ const {
14003
+ dimensionStyles
14004
+ } = useDimension(props);
13824
14005
  useRender(() => {
13825
14006
  const value = Number(props.content);
13826
14007
  const content = !props.max || isNaN(value) ? props.content : value <= Number(props.max) ? value : `${props.max}+`;
@@ -13842,7 +14023,7 @@ const VBadge = genericComponent()({
13842
14023
  }, {
13843
14024
  default: () => [withDirectives(createElementVNode("span", mergeProps({
13844
14025
  "class": ['v-badge__badge', themeClasses.value, backgroundColorClasses.value, roundedClasses.value, textColorClasses.value],
13845
- "style": [backgroundColorStyles.value, textColorStyles.value, props.inline ? {} : locationStyles.value],
14026
+ "style": [backgroundColorStyles.value, textColorStyles.value, dimensionStyles.value, props.inline ? {} : locationStyles.value],
13846
14027
  "aria-atomic": "true",
13847
14028
  "aria-label": t(props.label, value),
13848
14029
  "aria-live": "polite",
@@ -17251,13 +17432,13 @@ function date(value) {
17251
17432
  return null;
17252
17433
  }
17253
17434
  const sundayJanuarySecond2000 = new Date(2000, 0, 2);
17254
- function getWeekdays(locale, firstDayOfWeek) {
17435
+ function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
17255
17436
  const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
17256
17437
  return createRange(7).map(i => {
17257
17438
  const weekday = new Date(sundayJanuarySecond2000);
17258
17439
  weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
17259
17440
  return new Intl.DateTimeFormat(locale, {
17260
- weekday: 'narrow'
17441
+ weekday: weekdayFormat ?? 'narrow'
17261
17442
  }).format(weekday);
17262
17443
  });
17263
17444
  }
@@ -17721,9 +17902,9 @@ class VuetifyDateAdapter {
17721
17902
  getDiff(date, comparing, unit) {
17722
17903
  return getDiff(date, comparing, unit);
17723
17904
  }
17724
- getWeekdays(firstDayOfWeek) {
17905
+ getWeekdays(firstDayOfWeek, weekdayFormat) {
17725
17906
  const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
17726
- return getWeekdays(this.locale, firstDay);
17907
+ return getWeekdays(this.locale, firstDay, weekdayFormat);
17727
17908
  }
17728
17909
  getYear(date) {
17729
17910
  return getYear(date);
@@ -18079,6 +18260,7 @@ const VCombobox = genericComponent()({
18079
18260
  _search.value = val ?? '';
18080
18261
  if (!props.multiple && !hasSelectionSlot.value) {
18081
18262
  model.value = [transformItem$3(props, val)];
18263
+ nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18082
18264
  }
18083
18265
  if (val && props.multiple && props.delimiters?.length) {
18084
18266
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18159,7 +18341,7 @@ const VCombobox = genericComponent()({
18159
18341
  menu.value = !menu.value;
18160
18342
  }
18161
18343
  function onListKeydown(e) {
18162
- if (e.key !== ' ' && checkPrintable(e)) {
18344
+ if (checkPrintable(e) || e.key === 'Backspace') {
18163
18345
  vTextFieldRef.value?.focus();
18164
18346
  }
18165
18347
  }
@@ -18364,6 +18546,7 @@ const VCombobox = genericComponent()({
18364
18546
  }, props.menuProps), {
18365
18547
  default: () => [hasList && createVNode(VList, mergeProps({
18366
18548
  "ref": listRef,
18549
+ "filterable": true,
18367
18550
  "selected": selectedValues.value,
18368
18551
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
18369
18552
  "onMousedown": e => e.preventDefault(),
@@ -18395,6 +18578,22 @@ const VCombobox = genericComponent()({
18395
18578
  active: highlightFirst.value && index === 0 ? true : undefined,
18396
18579
  onClick: () => select(item, null)
18397
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
+ }
18398
18597
  return slots.item?.({
18399
18598
  item,
18400
18599
  index,
@@ -20274,6 +20473,7 @@ const makeVDataTableHeadersProps = propsFactory({
20274
20473
  color: String,
20275
20474
  disableSort: Boolean,
20276
20475
  fixedHeader: Boolean,
20476
+ lastFixed: Boolean,
20277
20477
  multiSort: Boolean,
20278
20478
  sortAscIcon: {
20279
20479
  type: IconValue,
@@ -20320,10 +20520,11 @@ const VDataTableHeaders = genericComponent()({
20320
20520
  loaderClasses
20321
20521
  } = useLoader(props);
20322
20522
  function getFixedStyles(column, y) {
20323
- if (!(props.sticky || props.fixedHeader) && !column.fixed) return undefined;
20523
+ if (!(props.sticky || props.fixedHeader) && !(column.fixed || column.lastFixed)) return undefined;
20324
20524
  return {
20325
20525
  position: 'sticky',
20326
- left: column.fixed ? convertToUnit(column.fixedOffset) : undefined,
20526
+ left: column.fixed || column.lastFixed ? convertToUnit(column.fixedOffset) : undefined,
20527
+ right: column.lastFixed ? convertToUnit(column.fixedOffset ?? 0) : undefined,
20327
20528
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
20328
20529
  };
20329
20530
  }
@@ -20832,11 +21033,18 @@ const VDataTableRows = genericComponent()({
20832
21033
  }
20833
21034
  });
20834
21035
 
21036
+ // Types
21037
+
20835
21038
  const makeVTableProps = propsFactory({
20836
21039
  fixedHeader: Boolean,
20837
21040
  fixedFooter: Boolean,
20838
21041
  height: [Number, String],
20839
21042
  hover: Boolean,
21043
+ striped: {
21044
+ type: String,
21045
+ default: null,
21046
+ validator: v => ['even', 'odd'].includes(v)
21047
+ },
20840
21048
  ...makeComponentProps(),
20841
21049
  ...makeDensityProps(),
20842
21050
  ...makeTagProps(),
@@ -20863,7 +21071,9 @@ const VTable = genericComponent()({
20863
21071
  'v-table--fixed-footer': props.fixedFooter,
20864
21072
  'v-table--has-top': !!slots.top,
20865
21073
  'v-table--has-bottom': !!slots.bottom,
20866
- 'v-table--hover': props.hover
21074
+ 'v-table--hover': props.hover,
21075
+ 'v-table--striped-even': props.striped === 'even',
21076
+ 'v-table--striped-odd': props.striped === 'odd'
20867
21077
  }, themeClasses.value, densityClasses.value, props.class]),
20868
21078
  "style": normalizeStyle(props.style)
20869
21079
  }, {
@@ -22038,7 +22248,8 @@ const makeCalendarProps = propsFactory({
22038
22248
  firstDayOfWeek: {
22039
22249
  type: [Number, String],
22040
22250
  default: undefined
22041
- }
22251
+ },
22252
+ weekdayFormat: String
22042
22253
  }, 'calendar');
22043
22254
  function useCalendar(props) {
22044
22255
  const adapter = useDate();
@@ -22279,7 +22490,7 @@ const VDatePickerMonth = genericComponent()({
22279
22490
  "ref": daysRef,
22280
22491
  "key": daysInMonth.value[0].date?.toString(),
22281
22492
  "class": "v-date-picker-month__days"
22282
- }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => createElementVNode("div", {
22493
+ }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => createElementVNode("div", {
22283
22494
  "class": normalizeClass(['v-date-picker-month__day', 'v-date-picker-month__weekday'])
22284
22495
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22285
22496
  const slotProps = {
@@ -24869,6 +25080,10 @@ const makeVNumberInputProps = propsFactory({
24869
25080
  type: Number,
24870
25081
  default: 0
24871
25082
  },
25083
+ minFractionDigits: {
25084
+ type: Number,
25085
+ default: null
25086
+ },
24872
25087
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
24873
25088
  }, 'VNumberInput');
24874
25089
  const VNumberInput = genericComponent()({
@@ -24899,9 +25114,19 @@ const VNumberInput = genericComponent()({
24899
25114
  } = useFocus(props);
24900
25115
  function correctPrecision(val) {
24901
25116
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
24902
- const fixed = precision == null ? String(val) : val.toFixed(precision);
24903
- return isFocused.value ? Number(fixed).toString() // trim zeros
24904
- : fixed;
25117
+ if (precision == null) {
25118
+ return String(val);
25119
+ }
25120
+ let fixed = val.toFixed(precision);
25121
+ if (isFocused.value) {
25122
+ return Number(fixed).toString(); // trim zeros
25123
+ }
25124
+ if ((props.minFractionDigits ?? precision) < precision) {
25125
+ const trimLimit = precision - props.minFractionDigits;
25126
+ const [baseDigits, fractionDigits] = fixed.split('.');
25127
+ fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
25128
+ }
25129
+ return fixed;
24905
25130
  }
24906
25131
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
24907
25132
  const _inputText = shallowRef(null);
@@ -24956,6 +25181,7 @@ const VNumberInput = genericComponent()({
24956
25181
  }
24957
25182
  };
24958
25183
  watch(() => props.precision, () => formatInputValue());
25184
+ watch(() => props.minFractionDigits, () => formatInputValue());
24959
25185
  onMounted(() => {
24960
25186
  clampModel();
24961
25187
  });
@@ -25070,7 +25296,7 @@ const VNumberInput = genericComponent()({
25070
25296
  inputText.value = null;
25071
25297
  return;
25072
25298
  }
25073
- inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25299
+ inputText.value = correctPrecision(model.value);
25074
25300
  }
25075
25301
  function trimDecimalZeros() {
25076
25302
  if (controlsDisabled.value) return;
@@ -25330,9 +25556,10 @@ const VOtpInput = genericComponent()({
25330
25556
  e.preventDefault();
25331
25557
  e.stopPropagation();
25332
25558
  const clipboardText = e?.clipboardData?.getData('Text').slice(0, length.value) ?? '';
25559
+ const finalIndex = clipboardText.length - 1 === -1 ? index : clipboardText.length - 1;
25333
25560
  if (isValidNumber(clipboardText)) return;
25334
25561
  model.value = clipboardText.split('');
25335
- inputRef.value?.[index].blur();
25562
+ inputRef.value?.[finalIndex].focus();
25336
25563
  }
25337
25564
  function reset() {
25338
25565
  model.value = [];
@@ -30035,11 +30262,6 @@ const makeVIconBtnProps = propsFactory({
30035
30262
  hideOverlay: Boolean,
30036
30263
  icon: [String, Function, Object],
30037
30264
  iconColor: String,
30038
- iconSize: [Number, String],
30039
- iconSizes: {
30040
- type: Array,
30041
- default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
30042
- },
30043
30265
  loading: Boolean,
30044
30266
  opacity: [Number, String],
30045
30267
  readonly: Boolean,
@@ -30059,6 +30281,7 @@ const makeVIconBtnProps = propsFactory({
30059
30281
  ...makeBorderProps(),
30060
30282
  ...makeComponentProps(),
30061
30283
  ...makeElevationProps(),
30284
+ ...makeIconSizeProps(),
30062
30285
  ...makeRoundedProps(),
30063
30286
  ...makeTagProps({
30064
30287
  tag: 'button'
@@ -30113,7 +30336,6 @@ const VIconBtn = genericComponent()({
30113
30336
  })()
30114
30337
  }));
30115
30338
  const btnSizeMap = new Map(props.sizes);
30116
- const iconSizeMap = new Map(props.iconSizes);
30117
30339
  function onClick() {
30118
30340
  if (props.disabled || props.readonly || isActive.value === undefined || props.tag === 'a' && attrs.href) return;
30119
30341
  isActive.value = !isActive.value;
@@ -30125,12 +30347,12 @@ const VIconBtn = genericComponent()({
30125
30347
  const btnSize = hasNamedSize ? btnSizeMap.get(_btnSize) : _btnSize;
30126
30348
  const btnHeight = props.height ?? btnSize;
30127
30349
  const btnWidth = props.width ?? btnSize;
30128
- const _iconSize = props.iconSize;
30129
- const hasNamedIconSize = iconSizeMap.has(_iconSize);
30130
- const iconSize = !_iconSize ? hasNamedSize ? iconSizeMap.get(_btnSize) : iconSizeMap.get('default') : hasNamedIconSize ? iconSizeMap.get(_iconSize) : _iconSize;
30350
+ const {
30351
+ iconSize
30352
+ } = useIconSizes(props, () => new Map(props.iconSizes).get(_btnSize));
30131
30353
  const iconProps = {
30132
30354
  icon,
30133
- size: iconSize,
30355
+ size: iconSize.value,
30134
30356
  iconColor: props.iconColor,
30135
30357
  opacity: props.opacity
30136
30358
  };
@@ -30173,7 +30395,7 @@ const VIconBtn = genericComponent()({
30173
30395
  "color": typeof props.loading === 'boolean' ? undefined : props.loading,
30174
30396
  "indeterminate": "disable-shrink",
30175
30397
  "width": "2",
30176
- "size": iconSize
30398
+ "size": iconSize.value
30177
30399
  }, null)])]
30178
30400
  });
30179
30401
  });
@@ -32083,7 +32305,7 @@ function createVuetify$1() {
32083
32305
  };
32084
32306
  });
32085
32307
  }
32086
- const version$1 = "3.8.7-master.2025-06-03";
32308
+ const version$1 = "3.8.8-dev.2025-06-08";
32087
32309
  createVuetify$1.version = version$1;
32088
32310
 
32089
32311
  // Vue's inject() can only be used in setup
@@ -32381,7 +32603,7 @@ var index = /*#__PURE__*/Object.freeze({
32381
32603
 
32382
32604
  /* eslint-disable local-rules/sort-imports */
32383
32605
 
32384
- const version = "3.8.7-master.2025-06-03";
32606
+ const version = "3.8.8-dev.2025-06-08";
32385
32607
 
32386
32608
  /* eslint-disable local-rules/sort-imports */
32387
32609