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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/CHANGELOG.md +29 -15
  2. package/dist/json/attributes.json +3615 -3515
  3. package/dist/json/importMap-labs.json +18 -18
  4. package/dist/json/importMap.json +138 -138
  5. package/dist/json/tags.json +25 -0
  6. package/dist/json/web-types.json +6428 -6096
  7. package/dist/vuetify-labs.cjs +363 -145
  8. package/dist/vuetify-labs.css +3793 -3759
  9. package/dist/vuetify-labs.d.ts +2390 -1886
  10. package/dist/vuetify-labs.esm.js +364 -146
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +363 -145
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +357 -134
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +3553 -3519
  17. package/dist/vuetify.d.ts +1545 -1081
  18. package/dist/vuetify.esm.js +358 -135
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +357 -134
  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/VBtn/VBtn.d.ts +20 -10
  36. package/lib/components/VBtnGroup/VBtnGroup.css +30 -7
  37. package/lib/components/VBtnGroup/VBtnGroup.d.ts +58 -32
  38. package/lib/components/VBtnGroup/VBtnGroup.js +7 -3
  39. package/lib/components/VBtnGroup/VBtnGroup.js.map +1 -1
  40. package/lib/components/VBtnGroup/VBtnGroup.sass +44 -17
  41. package/lib/components/VBtnToggle/VBtnToggle.d.ts +25 -0
  42. package/lib/components/VCard/VCard.d.ts +20 -10
  43. package/lib/components/VCheckbox/VCheckbox.d.ts +23 -13
  44. package/lib/components/VCheckbox/VCheckboxBtn.d.ts +20 -10
  45. package/lib/components/VChip/VChip.d.ts +20 -10
  46. package/lib/components/VChipGroup/VChipGroup.d.ts +10 -0
  47. package/lib/components/VCombobox/VCombobox.d.ts +154 -103
  48. package/lib/components/VCombobox/VCombobox.js +22 -3
  49. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  50. package/lib/components/VDataTable/VDataTable.d.ts +60 -0
  51. package/lib/components/VDataTable/VDataTableHeaders.d.ts +13 -0
  52. package/lib/components/VDataTable/VDataTableHeaders.js +4 -2
  53. package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
  54. package/lib/components/VDataTable/VDataTableServer.d.ts +42 -0
  55. package/lib/components/VDataTable/VDataTableVirtual.d.ts +42 -0
  56. package/lib/components/VDatePicker/VDatePicker.d.ts +10 -0
  57. package/lib/components/VDatePicker/VDatePickerMonth.d.ts +10 -0
  58. package/lib/components/VDatePicker/VDatePickerMonth.js +1 -1
  59. package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
  60. package/lib/components/VExpansionPanel/VExpansionPanel.d.ts +20 -10
  61. package/lib/components/VExpansionPanel/VExpansionPanelTitle.d.ts +20 -10
  62. package/lib/components/VExpansionPanel/VExpansionPanels.d.ts +20 -10
  63. package/lib/components/VFab/VFab.d.ts +20 -10
  64. package/lib/components/VField/VField.d.ts +3 -3
  65. package/lib/components/VFileInput/VFileInput.d.ts +15 -15
  66. package/lib/components/VInput/VInput.d.ts +4 -4
  67. package/lib/components/VList/VList.d.ts +13 -0
  68. package/lib/components/VList/VList.js +4 -1
  69. package/lib/components/VList/VList.js.map +1 -1
  70. package/lib/components/VList/VListChildren.js.map +1 -1
  71. package/lib/components/VList/VListItem.d.ts +23 -10
  72. package/lib/components/VList/VListItem.js +7 -3
  73. package/lib/components/VList/VListItem.js.map +1 -1
  74. package/lib/components/VList/list.d.ts +9 -2
  75. package/lib/components/VList/list.js +7 -0
  76. package/lib/components/VList/list.js.map +1 -1
  77. package/lib/components/VNumberInput/VNumberInput.d.ts +103 -89
  78. package/lib/components/VNumberInput/VNumberInput.js +19 -4
  79. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  80. package/lib/components/VOtpInput/VOtpInput.js +2 -1
  81. package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
  82. package/lib/components/VOverlay/VOverlay.css +1 -1
  83. package/lib/components/VOverlay/_variables.scss +1 -1
  84. package/lib/components/VRadio/VRadio.d.ts +20 -10
  85. package/lib/components/VRadioGroup/VRadioGroup.d.ts +23 -13
  86. package/lib/components/VRangeSlider/VRangeSlider.d.ts +3 -3
  87. package/lib/components/VSelect/VSelect.d.ts +171 -107
  88. package/lib/components/VSelect/VSelect.js +21 -3
  89. package/lib/components/VSelect/VSelect.js.map +1 -1
  90. package/lib/components/VSelectionControl/VSelectionControl.d.ts +20 -10
  91. package/lib/components/VSelectionControlGroup/VSelectionControlGroup.d.ts +28 -14
  92. package/lib/components/VSlideGroup/VSlideGroup.d.ts +10 -0
  93. package/lib/components/VSlideGroup/VSlideGroup.js +2 -1
  94. package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
  95. package/lib/components/VSlider/VSlider.d.ts +3 -3
  96. package/lib/components/VSlider/VSliderThumb.d.ts +20 -10
  97. package/lib/components/VStepper/VStepperItem.d.ts +28 -14
  98. package/lib/components/VSwitch/VSwitch.d.ts +23 -13
  99. package/lib/components/VTable/VTable.css +6 -0
  100. package/lib/components/VTable/VTable.d.ts +55 -24
  101. package/lib/components/VTable/VTable.js +9 -2
  102. package/lib/components/VTable/VTable.js.map +1 -1
  103. package/lib/components/VTable/VTable.sass +14 -0
  104. package/lib/components/VTable/_variables.scss +1 -0
  105. package/lib/components/VTabs/VTab.d.ts +56 -28
  106. package/lib/components/VTabs/VTabs.d.ts +10 -0
  107. package/lib/components/VTextField/VTextField.d.ts +27 -27
  108. package/lib/components/VTextarea/VTextarea.d.ts +15 -15
  109. package/lib/components/VToolbar/VToolbar.d.ts +15 -3
  110. package/lib/components/VToolbar/VToolbar.js +6 -3
  111. package/lib/components/VToolbar/VToolbar.js.map +1 -1
  112. package/lib/composables/calendar.d.ts +6 -0
  113. package/lib/composables/calendar.js +2 -1
  114. package/lib/composables/calendar.js.map +1 -1
  115. package/lib/composables/date/DateAdapter.d.ts +3 -3
  116. package/lib/composables/date/DateAdapter.js.map +1 -1
  117. package/lib/composables/date/adapters/string.d.ts +54 -0
  118. package/lib/composables/date/adapters/string.js +153 -0
  119. package/lib/composables/date/adapters/string.js.map +1 -0
  120. package/lib/composables/date/adapters/vuetify.d.ts +1 -1
  121. package/lib/composables/date/adapters/vuetify.js +4 -4
  122. package/lib/composables/date/adapters/vuetify.js.map +1 -1
  123. package/lib/composables/date/date.d.ts +3 -3
  124. package/lib/composables/date/index.d.ts +1 -0
  125. package/lib/composables/date/index.js +1 -0
  126. package/lib/composables/date/index.js.map +1 -1
  127. package/lib/composables/filter.js +3 -0
  128. package/lib/composables/filter.js.map +1 -1
  129. package/lib/composables/iconSizes.d.ts +28 -0
  130. package/lib/composables/iconSizes.js +23 -0
  131. package/lib/composables/iconSizes.js.map +1 -0
  132. package/lib/composables/list-items.js +2 -2
  133. package/lib/composables/list-items.js.map +1 -1
  134. package/lib/composables/theme.d.ts +6 -1
  135. package/lib/composables/theme.js +94 -26
  136. package/lib/composables/theme.js.map +1 -1
  137. package/lib/composables/virtual.js +6 -1
  138. package/lib/composables/virtual.js.map +1 -1
  139. package/lib/directives/ripple/index.d.ts +2 -1
  140. package/lib/directives/ripple/index.js +12 -7
  141. package/lib/directives/ripple/index.js.map +1 -1
  142. package/lib/entry-bundler.d.ts +3 -3
  143. package/lib/entry-bundler.js +1 -1
  144. package/lib/entry-bundler.js.map +1 -1
  145. package/lib/framework.d.ts +70 -55
  146. package/lib/framework.js +1 -1
  147. package/lib/framework.js.map +1 -1
  148. package/lib/labs/VCalendar/VCalendar.d.ts +10 -0
  149. package/lib/labs/VColorInput/VColorInput.d.ts +3 -3
  150. package/lib/labs/VDateInput/VDateInput.d.ts +97 -87
  151. package/lib/labs/VFileUpload/VFileUpload.d.ts +3 -3
  152. package/lib/labs/VFileUpload/VFileUploadItem.d.ts +20 -10
  153. package/lib/labs/VIconBtn/VIconBtn.d.ts +29 -29
  154. package/lib/labs/VIconBtn/VIconBtn.js +7 -11
  155. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  156. package/lib/labs/VStepperVertical/VStepperVertical.d.ts +20 -10
  157. package/lib/labs/VStepperVertical/VStepperVerticalItem.d.ts +20 -10
  158. package/lib/labs/VTreeview/VTreeview.d.ts +13 -0
  159. package/lib/labs/VTreeview/VTreeviewItem.d.ts +20 -10
  160. package/lib/labs/entry-bundler.d.ts +3 -3
  161. package/lib/util/globals.d.ts +1 -0
  162. package/lib/util/globals.js +1 -0
  163. package/lib/util/globals.js.map +1 -1
  164. package/lib/util/helpers.d.ts +1 -0
  165. package/lib/util/helpers.js +9 -1
  166. package/lib/util/helpers.js.map +1 -1
  167. 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-04
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
6
6
 
7
- import { shallowRef, reactive, watchEffect, toRef, capitalize, unref, Fragment, isVNode, Comment, warn, getCurrentInstance as getCurrentInstance$1, ref, computed, provide, inject as inject$1, defineComponent as defineComponent$1, h, camelize, 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,
@@ -17251,13 +17428,13 @@ function date(value) {
17251
17428
  return null;
17252
17429
  }
17253
17430
  const sundayJanuarySecond2000 = new Date(2000, 0, 2);
17254
- function getWeekdays(locale, firstDayOfWeek) {
17431
+ function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
17255
17432
  const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
17256
17433
  return createRange(7).map(i => {
17257
17434
  const weekday = new Date(sundayJanuarySecond2000);
17258
17435
  weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
17259
17436
  return new Intl.DateTimeFormat(locale, {
17260
- weekday: 'narrow'
17437
+ weekday: weekdayFormat ?? 'narrow'
17261
17438
  }).format(weekday);
17262
17439
  });
17263
17440
  }
@@ -17721,9 +17898,9 @@ class VuetifyDateAdapter {
17721
17898
  getDiff(date, comparing, unit) {
17722
17899
  return getDiff(date, comparing, unit);
17723
17900
  }
17724
- getWeekdays(firstDayOfWeek) {
17901
+ getWeekdays(firstDayOfWeek, weekdayFormat) {
17725
17902
  const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
17726
- return getWeekdays(this.locale, firstDay);
17903
+ return getWeekdays(this.locale, firstDay, weekdayFormat);
17727
17904
  }
17728
17905
  getYear(date) {
17729
17906
  return getYear(date);
@@ -18079,6 +18256,7 @@ const VCombobox = genericComponent()({
18079
18256
  _search.value = val ?? '';
18080
18257
  if (!props.multiple && !hasSelectionSlot.value) {
18081
18258
  model.value = [transformItem$3(props, val)];
18259
+ nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18082
18260
  }
18083
18261
  if (val && props.multiple && props.delimiters?.length) {
18084
18262
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18159,7 +18337,7 @@ const VCombobox = genericComponent()({
18159
18337
  menu.value = !menu.value;
18160
18338
  }
18161
18339
  function onListKeydown(e) {
18162
- if (e.key !== ' ' && checkPrintable(e)) {
18340
+ if (checkPrintable(e) || e.key === 'Backspace') {
18163
18341
  vTextFieldRef.value?.focus();
18164
18342
  }
18165
18343
  }
@@ -18364,6 +18542,7 @@ const VCombobox = genericComponent()({
18364
18542
  }, props.menuProps), {
18365
18543
  default: () => [hasList && createVNode(VList, mergeProps({
18366
18544
  "ref": listRef,
18545
+ "filterable": true,
18367
18546
  "selected": selectedValues.value,
18368
18547
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
18369
18548
  "onMousedown": e => e.preventDefault(),
@@ -18395,6 +18574,22 @@ const VCombobox = genericComponent()({
18395
18574
  active: highlightFirst.value && index === 0 ? true : undefined,
18396
18575
  onClick: () => select(item, null)
18397
18576
  });
18577
+ if (item.raw.type === 'divider') {
18578
+ return slots.divider?.({
18579
+ props: item.raw,
18580
+ index
18581
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
18582
+ "key": `divider-${index}`
18583
+ }), null);
18584
+ }
18585
+ if (item.raw.type === 'subheader') {
18586
+ return slots.subheader?.({
18587
+ props: item.raw,
18588
+ index
18589
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
18590
+ "key": `subheader-${index}`
18591
+ }), null);
18592
+ }
18398
18593
  return slots.item?.({
18399
18594
  item,
18400
18595
  index,
@@ -20274,6 +20469,7 @@ const makeVDataTableHeadersProps = propsFactory({
20274
20469
  color: String,
20275
20470
  disableSort: Boolean,
20276
20471
  fixedHeader: Boolean,
20472
+ lastFixed: Boolean,
20277
20473
  multiSort: Boolean,
20278
20474
  sortAscIcon: {
20279
20475
  type: IconValue,
@@ -20320,10 +20516,11 @@ const VDataTableHeaders = genericComponent()({
20320
20516
  loaderClasses
20321
20517
  } = useLoader(props);
20322
20518
  function getFixedStyles(column, y) {
20323
- if (!(props.sticky || props.fixedHeader) && !column.fixed) return undefined;
20519
+ if (!(props.sticky || props.fixedHeader) && !(column.fixed || column.lastFixed)) return undefined;
20324
20520
  return {
20325
20521
  position: 'sticky',
20326
- left: column.fixed ? convertToUnit(column.fixedOffset) : undefined,
20522
+ left: column.fixed || column.lastFixed ? convertToUnit(column.fixedOffset) : undefined,
20523
+ right: column.lastFixed ? convertToUnit(column.fixedOffset ?? 0) : undefined,
20327
20524
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
20328
20525
  };
20329
20526
  }
@@ -20832,11 +21029,18 @@ const VDataTableRows = genericComponent()({
20832
21029
  }
20833
21030
  });
20834
21031
 
21032
+ // Types
21033
+
20835
21034
  const makeVTableProps = propsFactory({
20836
21035
  fixedHeader: Boolean,
20837
21036
  fixedFooter: Boolean,
20838
21037
  height: [Number, String],
20839
21038
  hover: Boolean,
21039
+ striped: {
21040
+ type: String,
21041
+ default: null,
21042
+ validator: v => ['even', 'odd'].includes(v)
21043
+ },
20840
21044
  ...makeComponentProps(),
20841
21045
  ...makeDensityProps(),
20842
21046
  ...makeTagProps(),
@@ -20863,7 +21067,9 @@ const VTable = genericComponent()({
20863
21067
  'v-table--fixed-footer': props.fixedFooter,
20864
21068
  'v-table--has-top': !!slots.top,
20865
21069
  'v-table--has-bottom': !!slots.bottom,
20866
- 'v-table--hover': props.hover
21070
+ 'v-table--hover': props.hover,
21071
+ 'v-table--striped-even': props.striped === 'even',
21072
+ 'v-table--striped-odd': props.striped === 'odd'
20867
21073
  }, themeClasses.value, densityClasses.value, props.class]),
20868
21074
  "style": normalizeStyle(props.style)
20869
21075
  }, {
@@ -22038,7 +22244,8 @@ const makeCalendarProps = propsFactory({
22038
22244
  firstDayOfWeek: {
22039
22245
  type: [Number, String],
22040
22246
  default: undefined
22041
- }
22247
+ },
22248
+ weekdayFormat: String
22042
22249
  }, 'calendar');
22043
22250
  function useCalendar(props) {
22044
22251
  const adapter = useDate();
@@ -22279,7 +22486,7 @@ const VDatePickerMonth = genericComponent()({
22279
22486
  "ref": daysRef,
22280
22487
  "key": daysInMonth.value[0].date?.toString(),
22281
22488
  "class": "v-date-picker-month__days"
22282
- }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => createElementVNode("div", {
22489
+ }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => createElementVNode("div", {
22283
22490
  "class": normalizeClass(['v-date-picker-month__day', 'v-date-picker-month__weekday'])
22284
22491
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22285
22492
  const slotProps = {
@@ -24869,6 +25076,10 @@ const makeVNumberInputProps = propsFactory({
24869
25076
  type: Number,
24870
25077
  default: 0
24871
25078
  },
25079
+ minFractionDigits: {
25080
+ type: Number,
25081
+ default: null
25082
+ },
24872
25083
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
24873
25084
  }, 'VNumberInput');
24874
25085
  const VNumberInput = genericComponent()({
@@ -24899,9 +25110,19 @@ const VNumberInput = genericComponent()({
24899
25110
  } = useFocus(props);
24900
25111
  function correctPrecision(val) {
24901
25112
  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;
25113
+ if (precision == null) {
25114
+ return String(val);
25115
+ }
25116
+ let fixed = val.toFixed(precision);
25117
+ if (isFocused.value) {
25118
+ return Number(fixed).toString(); // trim zeros
25119
+ }
25120
+ if ((props.minFractionDigits ?? precision) < precision) {
25121
+ const trimLimit = precision - props.minFractionDigits;
25122
+ const [baseDigits, fractionDigits] = fixed.split('.');
25123
+ fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
25124
+ }
25125
+ return fixed;
24905
25126
  }
24906
25127
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
24907
25128
  const _inputText = shallowRef(null);
@@ -24956,6 +25177,7 @@ const VNumberInput = genericComponent()({
24956
25177
  }
24957
25178
  };
24958
25179
  watch(() => props.precision, () => formatInputValue());
25180
+ watch(() => props.minFractionDigits, () => formatInputValue());
24959
25181
  onMounted(() => {
24960
25182
  clampModel();
24961
25183
  });
@@ -25070,7 +25292,7 @@ const VNumberInput = genericComponent()({
25070
25292
  inputText.value = null;
25071
25293
  return;
25072
25294
  }
25073
- inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25295
+ inputText.value = correctPrecision(model.value);
25074
25296
  }
25075
25297
  function trimDecimalZeros() {
25076
25298
  if (controlsDisabled.value) return;
@@ -25330,9 +25552,10 @@ const VOtpInput = genericComponent()({
25330
25552
  e.preventDefault();
25331
25553
  e.stopPropagation();
25332
25554
  const clipboardText = e?.clipboardData?.getData('Text').slice(0, length.value) ?? '';
25555
+ const finalIndex = clipboardText.length - 1 === -1 ? index : clipboardText.length - 1;
25333
25556
  if (isValidNumber(clipboardText)) return;
25334
25557
  model.value = clipboardText.split('');
25335
- inputRef.value?.[index].blur();
25558
+ inputRef.value?.[finalIndex].focus();
25336
25559
  }
25337
25560
  function reset() {
25338
25561
  model.value = [];
@@ -30035,11 +30258,6 @@ const makeVIconBtnProps = propsFactory({
30035
30258
  hideOverlay: Boolean,
30036
30259
  icon: [String, Function, Object],
30037
30260
  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
30261
  loading: Boolean,
30044
30262
  opacity: [Number, String],
30045
30263
  readonly: Boolean,
@@ -30059,6 +30277,7 @@ const makeVIconBtnProps = propsFactory({
30059
30277
  ...makeBorderProps(),
30060
30278
  ...makeComponentProps(),
30061
30279
  ...makeElevationProps(),
30280
+ ...makeIconSizeProps(),
30062
30281
  ...makeRoundedProps(),
30063
30282
  ...makeTagProps({
30064
30283
  tag: 'button'
@@ -30113,7 +30332,6 @@ const VIconBtn = genericComponent()({
30113
30332
  })()
30114
30333
  }));
30115
30334
  const btnSizeMap = new Map(props.sizes);
30116
- const iconSizeMap = new Map(props.iconSizes);
30117
30335
  function onClick() {
30118
30336
  if (props.disabled || props.readonly || isActive.value === undefined || props.tag === 'a' && attrs.href) return;
30119
30337
  isActive.value = !isActive.value;
@@ -30125,12 +30343,12 @@ const VIconBtn = genericComponent()({
30125
30343
  const btnSize = hasNamedSize ? btnSizeMap.get(_btnSize) : _btnSize;
30126
30344
  const btnHeight = props.height ?? btnSize;
30127
30345
  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;
30346
+ const {
30347
+ iconSize
30348
+ } = useIconSizes(props, () => new Map(props.iconSizes).get(_btnSize));
30131
30349
  const iconProps = {
30132
30350
  icon,
30133
- size: iconSize,
30351
+ size: iconSize.value,
30134
30352
  iconColor: props.iconColor,
30135
30353
  opacity: props.opacity
30136
30354
  };
@@ -30173,7 +30391,7 @@ const VIconBtn = genericComponent()({
30173
30391
  "color": typeof props.loading === 'boolean' ? undefined : props.loading,
30174
30392
  "indeterminate": "disable-shrink",
30175
30393
  "width": "2",
30176
- "size": iconSize
30394
+ "size": iconSize.value
30177
30395
  }, null)])]
30178
30396
  });
30179
30397
  });
@@ -32083,7 +32301,7 @@ function createVuetify$1() {
32083
32301
  };
32084
32302
  });
32085
32303
  }
32086
- const version$1 = "3.8.7-master.2025-06-03";
32304
+ const version$1 = "3.8.8-dev.2025-06-04";
32087
32305
  createVuetify$1.version = version$1;
32088
32306
 
32089
32307
  // Vue's inject() can only be used in setup
@@ -32381,7 +32599,7 @@ var index = /*#__PURE__*/Object.freeze({
32381
32599
 
32382
32600
  /* eslint-disable local-rules/sort-imports */
32383
32601
 
32384
- const version = "3.8.7-master.2025-06-03";
32602
+ const version = "3.8.8-dev.2025-06-04";
32385
32603
 
32386
32604
  /* eslint-disable local-rules/sort-imports */
32387
32605