@vuetify/nightly 3.8.7-master.2025-06-02 → 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 (180) hide show
  1. package/CHANGELOG.md +33 -11
  2. package/dist/json/attributes.json +2042 -1942
  3. package/dist/json/importMap-labs.json +24 -24
  4. package/dist/json/importMap.json +146 -146
  5. package/dist/json/tags.json +25 -0
  6. package/dist/json/web-types.json +3842 -3510
  7. package/dist/vuetify-labs.cjs +380 -152
  8. package/dist/vuetify-labs.css +5726 -5686
  9. package/dist/vuetify-labs.d.ts +2393 -1889
  10. package/dist/vuetify-labs.esm.js +381 -153
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +380 -152
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +374 -141
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +2674 -2634
  17. package/dist/vuetify.d.ts +1548 -1084
  18. package/dist/vuetify.esm.js +375 -142
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +374 -141
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1226 -1208
  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.css +6 -6
  33. package/lib/components/VAutocomplete/VAutocomplete.d.ts +154 -103
  34. package/lib/components/VAutocomplete/VAutocomplete.js +21 -3
  35. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  36. package/lib/components/VAutocomplete/VAutocomplete.sass +3 -9
  37. package/lib/components/VBtn/VBtn.d.ts +20 -10
  38. package/lib/components/VBtnGroup/VBtnGroup.css +30 -7
  39. package/lib/components/VBtnGroup/VBtnGroup.d.ts +58 -32
  40. package/lib/components/VBtnGroup/VBtnGroup.js +7 -3
  41. package/lib/components/VBtnGroup/VBtnGroup.js.map +1 -1
  42. package/lib/components/VBtnGroup/VBtnGroup.sass +44 -17
  43. package/lib/components/VBtnToggle/VBtnToggle.d.ts +25 -0
  44. package/lib/components/VCard/VCard.d.ts +20 -10
  45. package/lib/components/VCheckbox/VCheckbox.d.ts +23 -13
  46. package/lib/components/VCheckbox/VCheckboxBtn.d.ts +20 -10
  47. package/lib/components/VChip/VChip.d.ts +20 -10
  48. package/lib/components/VChip/VChip.js +1 -0
  49. package/lib/components/VChip/VChip.js.map +1 -1
  50. package/lib/components/VChipGroup/VChipGroup.d.ts +10 -0
  51. package/lib/components/VCombobox/VCombobox.css +6 -6
  52. package/lib/components/VCombobox/VCombobox.d.ts +154 -103
  53. package/lib/components/VCombobox/VCombobox.js +22 -3
  54. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  55. package/lib/components/VCombobox/VCombobox.sass +3 -9
  56. package/lib/components/VDataTable/VDataTable.d.ts +60 -0
  57. package/lib/components/VDataTable/VDataTableHeaders.d.ts +13 -0
  58. package/lib/components/VDataTable/VDataTableHeaders.js +4 -2
  59. package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
  60. package/lib/components/VDataTable/VDataTableServer.d.ts +42 -0
  61. package/lib/components/VDataTable/VDataTableVirtual.d.ts +42 -0
  62. package/lib/components/VDatePicker/VDatePicker.d.ts +10 -0
  63. package/lib/components/VDatePicker/VDatePickerMonth.d.ts +10 -0
  64. package/lib/components/VDatePicker/VDatePickerMonth.js +1 -1
  65. package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
  66. package/lib/components/VExpansionPanel/VExpansionPanel.d.ts +20 -10
  67. package/lib/components/VExpansionPanel/VExpansionPanelTitle.d.ts +20 -10
  68. package/lib/components/VExpansionPanel/VExpansionPanels.d.ts +20 -10
  69. package/lib/components/VFab/VFab.d.ts +20 -10
  70. package/lib/components/VField/VField.d.ts +3 -3
  71. package/lib/components/VFileInput/VFileInput.d.ts +15 -15
  72. package/lib/components/VInput/VInput.d.ts +4 -4
  73. package/lib/components/VList/VList.d.ts +13 -0
  74. package/lib/components/VList/VList.js +4 -1
  75. package/lib/components/VList/VList.js.map +1 -1
  76. package/lib/components/VList/VListChildren.js.map +1 -1
  77. package/lib/components/VList/VListItem.d.ts +23 -10
  78. package/lib/components/VList/VListItem.js +7 -3
  79. package/lib/components/VList/VListItem.js.map +1 -1
  80. package/lib/components/VList/list.d.ts +9 -2
  81. package/lib/components/VList/list.js +7 -0
  82. package/lib/components/VList/list.js.map +1 -1
  83. package/lib/components/VNumberInput/VNumberInput.d.ts +103 -89
  84. package/lib/components/VNumberInput/VNumberInput.js +19 -4
  85. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  86. package/lib/components/VOtpInput/VOtpInput.js +2 -1
  87. package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
  88. package/lib/components/VOverlay/VOverlay.css +1 -1
  89. package/lib/components/VOverlay/_variables.scss +1 -1
  90. package/lib/components/VRadio/VRadio.d.ts +20 -10
  91. package/lib/components/VRadioGroup/VRadioGroup.d.ts +23 -13
  92. package/lib/components/VRangeSlider/VRangeSlider.d.ts +3 -3
  93. package/lib/components/VSelect/VSelect.css +6 -0
  94. package/lib/components/VSelect/VSelect.d.ts +171 -107
  95. package/lib/components/VSelect/VSelect.js +21 -3
  96. package/lib/components/VSelect/VSelect.js.map +1 -1
  97. package/lib/components/VSelect/VSelect.sass +3 -0
  98. package/lib/components/VSelect/_mixins.scss +14 -0
  99. package/lib/components/VSelectionControl/VSelectionControl.d.ts +20 -10
  100. package/lib/components/VSelectionControlGroup/VSelectionControlGroup.d.ts +28 -14
  101. package/lib/components/VSlideGroup/VSlideGroup.d.ts +10 -0
  102. package/lib/components/VSlideGroup/VSlideGroup.js +2 -1
  103. package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
  104. package/lib/components/VSlider/VSlider.d.ts +3 -3
  105. package/lib/components/VSlider/VSliderThumb.d.ts +20 -10
  106. package/lib/components/VSlider/VSliderThumb.js +12 -6
  107. package/lib/components/VSlider/VSliderThumb.js.map +1 -1
  108. package/lib/components/VSlider/slider.js +4 -1
  109. package/lib/components/VSlider/slider.js.map +1 -1
  110. package/lib/components/VStepper/VStepperItem.d.ts +28 -14
  111. package/lib/components/VSwitch/VSwitch.d.ts +23 -13
  112. package/lib/components/VTable/VTable.css +6 -0
  113. package/lib/components/VTable/VTable.d.ts +55 -24
  114. package/lib/components/VTable/VTable.js +9 -2
  115. package/lib/components/VTable/VTable.js.map +1 -1
  116. package/lib/components/VTable/VTable.sass +14 -0
  117. package/lib/components/VTable/_variables.scss +1 -0
  118. package/lib/components/VTabs/VTab.d.ts +56 -28
  119. package/lib/components/VTabs/VTabs.d.ts +10 -0
  120. package/lib/components/VTextField/VTextField.d.ts +27 -27
  121. package/lib/components/VTextarea/VTextarea.d.ts +15 -15
  122. package/lib/components/VToolbar/VToolbar.d.ts +15 -3
  123. package/lib/components/VToolbar/VToolbar.js +6 -3
  124. package/lib/components/VToolbar/VToolbar.js.map +1 -1
  125. package/lib/composables/calendar.d.ts +6 -0
  126. package/lib/composables/calendar.js +2 -1
  127. package/lib/composables/calendar.js.map +1 -1
  128. package/lib/composables/date/DateAdapter.d.ts +3 -3
  129. package/lib/composables/date/DateAdapter.js.map +1 -1
  130. package/lib/composables/date/adapters/string.d.ts +54 -0
  131. package/lib/composables/date/adapters/string.js +153 -0
  132. package/lib/composables/date/adapters/string.js.map +1 -0
  133. package/lib/composables/date/adapters/vuetify.d.ts +1 -1
  134. package/lib/composables/date/adapters/vuetify.js +4 -4
  135. package/lib/composables/date/adapters/vuetify.js.map +1 -1
  136. package/lib/composables/date/date.d.ts +3 -3
  137. package/lib/composables/date/index.d.ts +1 -0
  138. package/lib/composables/date/index.js +1 -0
  139. package/lib/composables/date/index.js.map +1 -1
  140. package/lib/composables/filter.js +3 -0
  141. package/lib/composables/filter.js.map +1 -1
  142. package/lib/composables/iconSizes.d.ts +28 -0
  143. package/lib/composables/iconSizes.js +23 -0
  144. package/lib/composables/iconSizes.js.map +1 -0
  145. package/lib/composables/list-items.js +2 -2
  146. package/lib/composables/list-items.js.map +1 -1
  147. package/lib/composables/theme.d.ts +6 -1
  148. package/lib/composables/theme.js +94 -26
  149. package/lib/composables/theme.js.map +1 -1
  150. package/lib/composables/virtual.js +6 -1
  151. package/lib/composables/virtual.js.map +1 -1
  152. package/lib/directives/ripple/index.d.ts +2 -1
  153. package/lib/directives/ripple/index.js +12 -7
  154. package/lib/directives/ripple/index.js.map +1 -1
  155. package/lib/entry-bundler.d.ts +3 -3
  156. package/lib/entry-bundler.js +1 -1
  157. package/lib/entry-bundler.js.map +1 -1
  158. package/lib/framework.d.ts +73 -58
  159. package/lib/framework.js +1 -1
  160. package/lib/framework.js.map +1 -1
  161. package/lib/labs/VCalendar/VCalendar.d.ts +10 -0
  162. package/lib/labs/VColorInput/VColorInput.d.ts +3 -3
  163. package/lib/labs/VDateInput/VDateInput.d.ts +97 -87
  164. package/lib/labs/VFileUpload/VFileUpload.d.ts +3 -3
  165. package/lib/labs/VFileUpload/VFileUploadItem.d.ts +20 -10
  166. package/lib/labs/VIconBtn/VIconBtn.d.ts +29 -29
  167. package/lib/labs/VIconBtn/VIconBtn.js +7 -11
  168. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  169. package/lib/labs/VStepperVertical/VStepperVertical.d.ts +20 -10
  170. package/lib/labs/VStepperVertical/VStepperVerticalItem.d.ts +20 -10
  171. package/lib/labs/VTreeview/VTreeview.d.ts +13 -0
  172. package/lib/labs/VTreeview/VTreeviewItem.d.ts +20 -10
  173. package/lib/labs/entry-bundler.d.ts +3 -3
  174. package/lib/util/globals.d.ts +1 -0
  175. package/lib/util/globals.js +1 -0
  176. package/lib/util/globals.js.map +1 -1
  177. package/lib/util/helpers.d.ts +1 -0
  178. package/lib/util/helpers.js +9 -1
  179. package/lib/util/helpers.js.map +1 -1
  180. package/package.json +3 -1
@@ -1,10 +1,10 @@
1
1
  /*!
2
- * Vuetify v3.8.7-master.2025-06-02
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,
@@ -8096,6 +8217,7 @@ const VChip = genericComponent()({
8096
8217
  const isClickable = computed(() => !props.disabled && props.link !== false && (!!group || props.link || link.isClickable.value));
8097
8218
  const closeProps = toRef(() => ({
8098
8219
  'aria-label': t(props.closeLabel),
8220
+ disabled: props.disabled,
8099
8221
  onClick(e) {
8100
8222
  e.preventDefault();
8101
8223
  e.stopPropagation();
@@ -8248,16 +8370,85 @@ const VChip = genericComponent()({
8248
8370
  }
8249
8371
  });
8250
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
+
8251
8435
  // Utilities
8252
8436
 
8253
8437
  // List
8254
8438
  const ListKey = Symbol.for('vuetify:list');
8255
8439
  function createList() {
8440
+ let {
8441
+ filterable
8442
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
8443
+ filterable: false
8444
+ };
8256
8445
  const parent = inject$1(ListKey, {
8446
+ filterable: false,
8257
8447
  hasPrepend: shallowRef(false),
8258
8448
  updateHasPrepend: () => null
8259
8449
  });
8260
8450
  const data = {
8451
+ filterable: parent.filterable || filterable,
8261
8452
  hasPrepend: shallowRef(false),
8262
8453
  updateHasPrepend: value => {
8263
8454
  if (value) data.hasPrepend.value = value;
@@ -9209,6 +9400,9 @@ const VListItem = genericComponent()({
9209
9400
  roundedClasses
9210
9401
  } = useRounded(roundedProps);
9211
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);
9212
9406
  const slotProps = computed(() => ({
9213
9407
  isActive: isActive.value,
9214
9408
  select,
@@ -9233,8 +9427,9 @@ const VListItem = genericComponent()({
9233
9427
  function onKeyDown(e) {
9234
9428
  const target = e.target;
9235
9429
  if (['INPUT', 'TEXTAREA'].includes(target.tagName)) return;
9236
- if (e.key === 'Enter' || e.key === ' ') {
9430
+ if (e.key === 'Enter' || e.key === ' ' && !list?.filterable) {
9237
9431
  e.preventDefault();
9432
+ e.stopPropagation();
9238
9433
  e.target.dispatchEvent(new MouseEvent('click', e));
9239
9434
  }
9240
9435
  }
@@ -9344,7 +9539,7 @@ const VListItem = genericComponent()({
9344
9539
  }), createElementVNode("div", {
9345
9540
  "class": "v-list-item__spacer"
9346
9541
  }, null)])]
9347
- }), [[Ripple, isClickable.value && props.ripple]]);
9542
+ }), [[Ripple, isClickable.value && rippleOptions.value]]);
9348
9543
  });
9349
9544
  return {
9350
9545
  activate,
@@ -9399,68 +9594,6 @@ const VListSubheader = genericComponent()({
9399
9594
  }
9400
9595
  });
9401
9596
 
9402
- const makeVDividerProps = propsFactory({
9403
- color: String,
9404
- inset: Boolean,
9405
- length: [Number, String],
9406
- opacity: [Number, String],
9407
- thickness: [Number, String],
9408
- vertical: Boolean,
9409
- ...makeComponentProps(),
9410
- ...makeThemeProps()
9411
- }, 'VDivider');
9412
- const VDivider = genericComponent()({
9413
- name: 'VDivider',
9414
- props: makeVDividerProps(),
9415
- setup(props, _ref) {
9416
- let {
9417
- attrs,
9418
- slots
9419
- } = _ref;
9420
- const {
9421
- themeClasses
9422
- } = provideTheme(props);
9423
- const {
9424
- textColorClasses,
9425
- textColorStyles
9426
- } = useTextColor(() => props.color);
9427
- const dividerStyles = computed(() => {
9428
- const styles = {};
9429
- if (props.length) {
9430
- styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
9431
- }
9432
- if (props.thickness) {
9433
- styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
9434
- }
9435
- return styles;
9436
- });
9437
- useRender(() => {
9438
- const divider = createElementVNode("hr", {
9439
- "class": normalizeClass([{
9440
- 'v-divider': true,
9441
- 'v-divider--inset': props.inset,
9442
- 'v-divider--vertical': props.vertical
9443
- }, themeClasses.value, textColorClasses.value, props.class]),
9444
- "style": normalizeStyle([dividerStyles.value, textColorStyles.value, {
9445
- '--v-border-opacity': props.opacity
9446
- }, props.style]),
9447
- "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
9448
- "role": `${attrs.role || 'separator'}`
9449
- }, null);
9450
- if (!slots.default) return divider;
9451
- return createElementVNode("div", {
9452
- "class": normalizeClass(['v-divider__wrapper', {
9453
- 'v-divider__wrapper--vertical': props.vertical,
9454
- 'v-divider__wrapper--inset': props.inset
9455
- }])
9456
- }, [divider, createElementVNode("div", {
9457
- "class": "v-divider__content"
9458
- }, [slots.default()]), divider]);
9459
- });
9460
- return {};
9461
- }
9462
- });
9463
-
9464
9597
  // Types
9465
9598
 
9466
9599
  const makeVListChildrenProps = propsFactory({
@@ -9577,7 +9710,7 @@ function transformItem$3(props, item) {
9577
9710
  const _props = {
9578
9711
  title,
9579
9712
  value,
9580
- ...itemProps
9713
+ ...camelizeProps(itemProps)
9581
9714
  };
9582
9715
  return {
9583
9716
  title: String(_props.title ?? ''),
@@ -9729,6 +9862,7 @@ const makeVListProps = propsFactory({
9729
9862
  activeClass: String,
9730
9863
  bgColor: String,
9731
9864
  disabled: Boolean,
9865
+ filterable: Boolean,
9732
9866
  expandIcon: IconValue,
9733
9867
  collapseIcon: IconValue,
9734
9868
  lines: {
@@ -9812,7 +9946,9 @@ const VList = genericComponent()({
9812
9946
  const activeColor = toRef(() => props.activeColor);
9813
9947
  const baseColor = toRef(() => props.baseColor);
9814
9948
  const color = toRef(() => props.color);
9815
- createList();
9949
+ createList({
9950
+ filterable: props.filterable
9951
+ });
9816
9952
  provideDefaults({
9817
9953
  VListGroup: {
9818
9954
  activeColor,
@@ -12388,7 +12524,12 @@ function useVirtual(props, items) {
12388
12524
  }
12389
12525
  function calculateOffset(index) {
12390
12526
  index = clamp(index, 0, items.value.length - 1);
12391
- 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;
12392
12533
  }
12393
12534
  function calculateIndex(scrollTop) {
12394
12535
  return binaryClosest(offsets, scrollTop);
@@ -12742,6 +12883,7 @@ const makeSelectProps = propsFactory({
12742
12883
  },
12743
12884
  openOnClear: Boolean,
12744
12885
  itemColor: String,
12886
+ noAutoScroll: Boolean,
12745
12887
  ...makeItemsProps({
12746
12888
  itemChildren: false
12747
12889
  })
@@ -12956,7 +13098,7 @@ const VSelect = genericComponent()({
12956
13098
  watch(menu, () => {
12957
13099
  if (!props.hideSelected && menu.value && model.value.length) {
12958
13100
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
12959
- IN_BROWSER && window.requestAnimationFrame(() => {
13101
+ IN_BROWSER && !props.noAutoScroll && window.requestAnimationFrame(() => {
12960
13102
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
12961
13103
  });
12962
13104
  }
@@ -13048,6 +13190,22 @@ const VSelect = genericComponent()({
13048
13190
  key: item.value,
13049
13191
  onClick: () => select(item, null)
13050
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
+ }
13051
13209
  return slots.item?.({
13052
13210
  item,
13053
13211
  index,
@@ -13208,6 +13366,9 @@ function filterItems(items, query, options) {
13208
13366
  let match = -1;
13209
13367
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13210
13368
  if (typeof item === 'object') {
13369
+ if (['divider', 'subheader'].includes(item.raw?.type)) {
13370
+ continue;
13371
+ }
13211
13372
  const filterKeys = keys || Object.keys(transformed);
13212
13373
  for (const key of filterKeys) {
13213
13374
  const value = getPropertyFromItem(transformed, key);
@@ -13410,7 +13571,7 @@ const VAutocomplete = genericComponent()({
13410
13571
  menu.value = !menu.value;
13411
13572
  }
13412
13573
  function onListKeydown(e) {
13413
- if (e.key !== ' ' && checkPrintable(e)) {
13574
+ if (checkPrintable(e) || e.key === 'Backspace') {
13414
13575
  vTextFieldRef.value?.focus();
13415
13576
  }
13416
13577
  }
@@ -13615,6 +13776,7 @@ const VAutocomplete = genericComponent()({
13615
13776
  }, props.menuProps), {
13616
13777
  default: () => [hasList && createVNode(VList, mergeProps({
13617
13778
  "ref": listRef,
13779
+ "filterable": true,
13618
13780
  "selected": selectedValues.value,
13619
13781
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
13620
13782
  "onMousedown": e => e.preventDefault(),
@@ -13646,6 +13808,22 @@ const VAutocomplete = genericComponent()({
13646
13808
  active: highlightFirst.value && index === 0 ? true : undefined,
13647
13809
  onClick: () => select(item, null)
13648
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
+ }
13649
13827
  return slots.item?.({
13650
13828
  item,
13651
13829
  index,
@@ -15884,7 +16062,10 @@ const useSteps = props => {
15884
16062
  if (step.value <= 0) return value;
15885
16063
  const clamped = clamp(value, min.value, max.value);
15886
16064
  const offset = min.value % step.value;
15887
- const newValue = Math.round((clamped - offset) / step.value) * step.value + offset;
16065
+ let newValue = Math.round((clamped - offset) / step.value) * step.value + offset;
16066
+ if (clamped > newValue && newValue + step.value > max.value) {
16067
+ newValue = max.value;
16068
+ }
15888
16069
  return parseFloat(Math.min(newValue, max.value).toFixed(decimals.value));
15889
16070
  }
15890
16071
  return {
@@ -16140,6 +16321,8 @@ const VSliderThumb = genericComponent()({
16140
16321
  } = useRtl();
16141
16322
  if (!slider) throw new Error('[Vuetify] v-slider-thumb must be used inside v-slider or v-range-slider');
16142
16323
  const {
16324
+ min,
16325
+ max,
16143
16326
  thumbColor,
16144
16327
  step,
16145
16328
  disabled,
@@ -16180,16 +16363,20 @@ const VSliderThumb = genericComponent()({
16180
16363
  if (!relevantKeys.includes(e.key)) return;
16181
16364
  e.preventDefault();
16182
16365
  const _step = step.value || 0.1;
16183
- const steps = (props.max - props.min) / _step;
16366
+ const steps = (max.value - min.value) / _step;
16184
16367
  if ([left, right, down, up].includes(e.key)) {
16185
16368
  const increase = vertical.value ? [isRtl.value ? left : right, isReversed.value ? down : up] : indexFromEnd.value !== isRtl.value ? [left, up] : [right, up];
16186
16369
  const direction = increase.includes(e.key) ? 1 : -1;
16187
16370
  const multiplier = e.shiftKey ? 2 : e.ctrlKey ? 1 : 0;
16188
- value = value + direction * _step * multipliers.value[multiplier];
16371
+ if (direction === -1 && value === max.value && !multiplier && !Number.isInteger(steps)) {
16372
+ value = value - steps % 1 * _step;
16373
+ } else {
16374
+ value = value + direction * _step * multipliers.value[multiplier];
16375
+ }
16189
16376
  } else if (e.key === home) {
16190
- value = props.min;
16377
+ value = min.value;
16191
16378
  } else if (e.key === end) {
16192
- value = props.max;
16379
+ value = max.value;
16193
16380
  } else {
16194
16381
  const direction = e.key === pagedown ? 1 : -1;
16195
16382
  value = value - direction * _step * (steps > 100 ? steps / 10 : 10);
@@ -16214,8 +16401,8 @@ const VSliderThumb = genericComponent()({
16214
16401
  "role": "slider",
16215
16402
  "tabindex": disabled.value ? -1 : 0,
16216
16403
  "aria-label": props.name,
16217
- "aria-valuemin": props.min,
16218
- "aria-valuemax": props.max,
16404
+ "aria-valuemin": min.value,
16405
+ "aria-valuemax": max.value,
16219
16406
  "aria-valuenow": props.modelValue,
16220
16407
  "aria-readonly": !!readonly.value,
16221
16408
  "aria-orientation": direction.value,
@@ -17241,13 +17428,13 @@ function date(value) {
17241
17428
  return null;
17242
17429
  }
17243
17430
  const sundayJanuarySecond2000 = new Date(2000, 0, 2);
17244
- function getWeekdays(locale, firstDayOfWeek) {
17431
+ function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
17245
17432
  const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
17246
17433
  return createRange(7).map(i => {
17247
17434
  const weekday = new Date(sundayJanuarySecond2000);
17248
17435
  weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
17249
17436
  return new Intl.DateTimeFormat(locale, {
17250
- weekday: 'narrow'
17437
+ weekday: weekdayFormat ?? 'narrow'
17251
17438
  }).format(weekday);
17252
17439
  });
17253
17440
  }
@@ -17711,9 +17898,9 @@ class VuetifyDateAdapter {
17711
17898
  getDiff(date, comparing, unit) {
17712
17899
  return getDiff(date, comparing, unit);
17713
17900
  }
17714
- getWeekdays(firstDayOfWeek) {
17901
+ getWeekdays(firstDayOfWeek, weekdayFormat) {
17715
17902
  const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
17716
- return getWeekdays(this.locale, firstDay);
17903
+ return getWeekdays(this.locale, firstDay, weekdayFormat);
17717
17904
  }
17718
17905
  getYear(date) {
17719
17906
  return getYear(date);
@@ -18069,6 +18256,7 @@ const VCombobox = genericComponent()({
18069
18256
  _search.value = val ?? '';
18070
18257
  if (!props.multiple && !hasSelectionSlot.value) {
18071
18258
  model.value = [transformItem$3(props, val)];
18259
+ nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18072
18260
  }
18073
18261
  if (val && props.multiple && props.delimiters?.length) {
18074
18262
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18149,7 +18337,7 @@ const VCombobox = genericComponent()({
18149
18337
  menu.value = !menu.value;
18150
18338
  }
18151
18339
  function onListKeydown(e) {
18152
- if (e.key !== ' ' && checkPrintable(e)) {
18340
+ if (checkPrintable(e) || e.key === 'Backspace') {
18153
18341
  vTextFieldRef.value?.focus();
18154
18342
  }
18155
18343
  }
@@ -18354,6 +18542,7 @@ const VCombobox = genericComponent()({
18354
18542
  }, props.menuProps), {
18355
18543
  default: () => [hasList && createVNode(VList, mergeProps({
18356
18544
  "ref": listRef,
18545
+ "filterable": true,
18357
18546
  "selected": selectedValues.value,
18358
18547
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
18359
18548
  "onMousedown": e => e.preventDefault(),
@@ -18385,6 +18574,22 @@ const VCombobox = genericComponent()({
18385
18574
  active: highlightFirst.value && index === 0 ? true : undefined,
18386
18575
  onClick: () => select(item, null)
18387
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
+ }
18388
18593
  return slots.item?.({
18389
18594
  item,
18390
18595
  index,
@@ -20264,6 +20469,7 @@ const makeVDataTableHeadersProps = propsFactory({
20264
20469
  color: String,
20265
20470
  disableSort: Boolean,
20266
20471
  fixedHeader: Boolean,
20472
+ lastFixed: Boolean,
20267
20473
  multiSort: Boolean,
20268
20474
  sortAscIcon: {
20269
20475
  type: IconValue,
@@ -20310,10 +20516,11 @@ const VDataTableHeaders = genericComponent()({
20310
20516
  loaderClasses
20311
20517
  } = useLoader(props);
20312
20518
  function getFixedStyles(column, y) {
20313
- if (!(props.sticky || props.fixedHeader) && !column.fixed) return undefined;
20519
+ if (!(props.sticky || props.fixedHeader) && !(column.fixed || column.lastFixed)) return undefined;
20314
20520
  return {
20315
20521
  position: 'sticky',
20316
- 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,
20317
20524
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
20318
20525
  };
20319
20526
  }
@@ -20822,11 +21029,18 @@ const VDataTableRows = genericComponent()({
20822
21029
  }
20823
21030
  });
20824
21031
 
21032
+ // Types
21033
+
20825
21034
  const makeVTableProps = propsFactory({
20826
21035
  fixedHeader: Boolean,
20827
21036
  fixedFooter: Boolean,
20828
21037
  height: [Number, String],
20829
21038
  hover: Boolean,
21039
+ striped: {
21040
+ type: String,
21041
+ default: null,
21042
+ validator: v => ['even', 'odd'].includes(v)
21043
+ },
20830
21044
  ...makeComponentProps(),
20831
21045
  ...makeDensityProps(),
20832
21046
  ...makeTagProps(),
@@ -20853,7 +21067,9 @@ const VTable = genericComponent()({
20853
21067
  'v-table--fixed-footer': props.fixedFooter,
20854
21068
  'v-table--has-top': !!slots.top,
20855
21069
  'v-table--has-bottom': !!slots.bottom,
20856
- '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'
20857
21073
  }, themeClasses.value, densityClasses.value, props.class]),
20858
21074
  "style": normalizeStyle(props.style)
20859
21075
  }, {
@@ -22028,7 +22244,8 @@ const makeCalendarProps = propsFactory({
22028
22244
  firstDayOfWeek: {
22029
22245
  type: [Number, String],
22030
22246
  default: undefined
22031
- }
22247
+ },
22248
+ weekdayFormat: String
22032
22249
  }, 'calendar');
22033
22250
  function useCalendar(props) {
22034
22251
  const adapter = useDate();
@@ -22269,7 +22486,7 @@ const VDatePickerMonth = genericComponent()({
22269
22486
  "ref": daysRef,
22270
22487
  "key": daysInMonth.value[0].date?.toString(),
22271
22488
  "class": "v-date-picker-month__days"
22272
- }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => createElementVNode("div", {
22489
+ }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => createElementVNode("div", {
22273
22490
  "class": normalizeClass(['v-date-picker-month__day', 'v-date-picker-month__weekday'])
22274
22491
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22275
22492
  const slotProps = {
@@ -24859,6 +25076,10 @@ const makeVNumberInputProps = propsFactory({
24859
25076
  type: Number,
24860
25077
  default: 0
24861
25078
  },
25079
+ minFractionDigits: {
25080
+ type: Number,
25081
+ default: null
25082
+ },
24862
25083
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
24863
25084
  }, 'VNumberInput');
24864
25085
  const VNumberInput = genericComponent()({
@@ -24889,9 +25110,19 @@ const VNumberInput = genericComponent()({
24889
25110
  } = useFocus(props);
24890
25111
  function correctPrecision(val) {
24891
25112
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
24892
- const fixed = precision == null ? String(val) : val.toFixed(precision);
24893
- return isFocused.value ? Number(fixed).toString() // trim zeros
24894
- : 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;
24895
25126
  }
24896
25127
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
24897
25128
  const _inputText = shallowRef(null);
@@ -24946,6 +25177,7 @@ const VNumberInput = genericComponent()({
24946
25177
  }
24947
25178
  };
24948
25179
  watch(() => props.precision, () => formatInputValue());
25180
+ watch(() => props.minFractionDigits, () => formatInputValue());
24949
25181
  onMounted(() => {
24950
25182
  clampModel();
24951
25183
  });
@@ -25060,7 +25292,7 @@ const VNumberInput = genericComponent()({
25060
25292
  inputText.value = null;
25061
25293
  return;
25062
25294
  }
25063
- inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25295
+ inputText.value = correctPrecision(model.value);
25064
25296
  }
25065
25297
  function trimDecimalZeros() {
25066
25298
  if (controlsDisabled.value) return;
@@ -25320,9 +25552,10 @@ const VOtpInput = genericComponent()({
25320
25552
  e.preventDefault();
25321
25553
  e.stopPropagation();
25322
25554
  const clipboardText = e?.clipboardData?.getData('Text').slice(0, length.value) ?? '';
25555
+ const finalIndex = clipboardText.length - 1 === -1 ? index : clipboardText.length - 1;
25323
25556
  if (isValidNumber(clipboardText)) return;
25324
25557
  model.value = clipboardText.split('');
25325
- inputRef.value?.[index].blur();
25558
+ inputRef.value?.[finalIndex].focus();
25326
25559
  }
25327
25560
  function reset() {
25328
25561
  model.value = [];
@@ -30025,11 +30258,6 @@ const makeVIconBtnProps = propsFactory({
30025
30258
  hideOverlay: Boolean,
30026
30259
  icon: [String, Function, Object],
30027
30260
  iconColor: String,
30028
- iconSize: [Number, String],
30029
- iconSizes: {
30030
- type: Array,
30031
- default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
30032
- },
30033
30261
  loading: Boolean,
30034
30262
  opacity: [Number, String],
30035
30263
  readonly: Boolean,
@@ -30049,6 +30277,7 @@ const makeVIconBtnProps = propsFactory({
30049
30277
  ...makeBorderProps(),
30050
30278
  ...makeComponentProps(),
30051
30279
  ...makeElevationProps(),
30280
+ ...makeIconSizeProps(),
30052
30281
  ...makeRoundedProps(),
30053
30282
  ...makeTagProps({
30054
30283
  tag: 'button'
@@ -30103,7 +30332,6 @@ const VIconBtn = genericComponent()({
30103
30332
  })()
30104
30333
  }));
30105
30334
  const btnSizeMap = new Map(props.sizes);
30106
- const iconSizeMap = new Map(props.iconSizes);
30107
30335
  function onClick() {
30108
30336
  if (props.disabled || props.readonly || isActive.value === undefined || props.tag === 'a' && attrs.href) return;
30109
30337
  isActive.value = !isActive.value;
@@ -30115,12 +30343,12 @@ const VIconBtn = genericComponent()({
30115
30343
  const btnSize = hasNamedSize ? btnSizeMap.get(_btnSize) : _btnSize;
30116
30344
  const btnHeight = props.height ?? btnSize;
30117
30345
  const btnWidth = props.width ?? btnSize;
30118
- const _iconSize = props.iconSize;
30119
- const hasNamedIconSize = iconSizeMap.has(_iconSize);
30120
- 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));
30121
30349
  const iconProps = {
30122
30350
  icon,
30123
- size: iconSize,
30351
+ size: iconSize.value,
30124
30352
  iconColor: props.iconColor,
30125
30353
  opacity: props.opacity
30126
30354
  };
@@ -30163,7 +30391,7 @@ const VIconBtn = genericComponent()({
30163
30391
  "color": typeof props.loading === 'boolean' ? undefined : props.loading,
30164
30392
  "indeterminate": "disable-shrink",
30165
30393
  "width": "2",
30166
- "size": iconSize
30394
+ "size": iconSize.value
30167
30395
  }, null)])]
30168
30396
  });
30169
30397
  });
@@ -32073,7 +32301,7 @@ function createVuetify$1() {
32073
32301
  };
32074
32302
  });
32075
32303
  }
32076
- const version$1 = "3.8.7-master.2025-06-02";
32304
+ const version$1 = "3.8.8-dev.2025-06-04";
32077
32305
  createVuetify$1.version = version$1;
32078
32306
 
32079
32307
  // Vue's inject() can only be used in setup
@@ -32371,7 +32599,7 @@ var index = /*#__PURE__*/Object.freeze({
32371
32599
 
32372
32600
  /* eslint-disable local-rules/sort-imports */
32373
32601
 
32374
- const version = "3.8.7-master.2025-06-02";
32602
+ const version = "3.8.8-dev.2025-06-04";
32375
32603
 
32376
32604
  /* eslint-disable local-rules/sort-imports */
32377
32605