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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/CHANGELOG.md +25 -20
  2. package/dist/json/attributes.json +3672 -3588
  3. package/dist/json/importMap-labs.json +28 -28
  4. package/dist/json/importMap.json +164 -164
  5. package/dist/json/tags.json +21 -0
  6. package/dist/json/web-types.json +6618 -6326
  7. package/dist/vuetify-labs.cjs +338 -140
  8. package/dist/vuetify-labs.css +4581 -4553
  9. package/dist/vuetify-labs.d.ts +1533 -1116
  10. package/dist/vuetify-labs.esm.js +339 -141
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +338 -140
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +332 -129
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +3805 -3777
  17. package/dist/vuetify.d.ts +1022 -645
  18. package/dist/vuetify.esm.js +333 -130
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +332 -129
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1200 -1185
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VAlert/VAlert.css +6 -1
  26. package/lib/components/VAlert/VAlert.d.ts +35 -0
  27. package/lib/components/VAlert/VAlert.js +15 -10
  28. package/lib/components/VAlert/VAlert.js.map +1 -1
  29. package/lib/components/VAlert/VAlert.sass +7 -1
  30. package/lib/components/VAppBar/VAppBarNavIcon.d.ts +20 -10
  31. package/lib/components/VAutocomplete/VAutocomplete.d.ts +154 -103
  32. package/lib/components/VAutocomplete/VAutocomplete.js +21 -3
  33. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  34. package/lib/components/VBtn/VBtn.d.ts +20 -10
  35. package/lib/components/VBtnGroup/VBtnGroup.css +30 -7
  36. package/lib/components/VBtnGroup/VBtnGroup.d.ts +58 -32
  37. package/lib/components/VBtnGroup/VBtnGroup.js +7 -3
  38. package/lib/components/VBtnGroup/VBtnGroup.js.map +1 -1
  39. package/lib/components/VBtnGroup/VBtnGroup.sass +44 -17
  40. package/lib/components/VBtnToggle/VBtnToggle.d.ts +25 -0
  41. package/lib/components/VCard/VCard.d.ts +20 -10
  42. package/lib/components/VCheckbox/VCheckbox.d.ts +23 -13
  43. package/lib/components/VCheckbox/VCheckboxBtn.d.ts +20 -10
  44. package/lib/components/VChip/VChip.d.ts +20 -10
  45. package/lib/components/VChipGroup/VChipGroup.d.ts +10 -0
  46. package/lib/components/VCombobox/VCombobox.d.ts +154 -103
  47. package/lib/components/VCombobox/VCombobox.js +22 -3
  48. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  49. package/lib/components/VDataTable/VDataTable.d.ts +18 -0
  50. package/lib/components/VDataTable/VDataTableHeaders.d.ts +13 -0
  51. package/lib/components/VDataTable/VDataTableHeaders.js +4 -2
  52. package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
  53. package/lib/components/VDataTable/VDataTableServer.d.ts +13 -0
  54. package/lib/components/VDataTable/VDataTableVirtual.d.ts +13 -0
  55. package/lib/components/VDatePicker/VDatePicker.d.ts +10 -0
  56. package/lib/components/VDatePicker/VDatePickerMonth.d.ts +10 -0
  57. package/lib/components/VDatePicker/VDatePickerMonth.js +1 -1
  58. package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
  59. package/lib/components/VExpansionPanel/VExpansionPanel.d.ts +20 -10
  60. package/lib/components/VExpansionPanel/VExpansionPanelTitle.d.ts +20 -10
  61. package/lib/components/VExpansionPanel/VExpansionPanels.d.ts +20 -10
  62. package/lib/components/VFab/VFab.d.ts +20 -10
  63. package/lib/components/VField/VField.d.ts +3 -3
  64. package/lib/components/VFileInput/VFileInput.d.ts +15 -15
  65. package/lib/components/VInput/VInput.d.ts +4 -4
  66. package/lib/components/VList/VList.d.ts +13 -0
  67. package/lib/components/VList/VList.js +4 -1
  68. package/lib/components/VList/VList.js.map +1 -1
  69. package/lib/components/VList/VListChildren.js.map +1 -1
  70. package/lib/components/VList/VListItem.d.ts +23 -10
  71. package/lib/components/VList/VListItem.js +7 -3
  72. package/lib/components/VList/VListItem.js.map +1 -1
  73. package/lib/components/VList/list.d.ts +9 -2
  74. package/lib/components/VList/list.js +7 -0
  75. package/lib/components/VList/list.js.map +1 -1
  76. package/lib/components/VNumberInput/VNumberInput.d.ts +103 -89
  77. package/lib/components/VNumberInput/VNumberInput.js +19 -4
  78. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  79. package/lib/components/VOtpInput/VOtpInput.js +2 -1
  80. package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
  81. package/lib/components/VOverlay/VOverlay.css +1 -1
  82. package/lib/components/VOverlay/_variables.scss +1 -1
  83. package/lib/components/VRadio/VRadio.d.ts +20 -10
  84. package/lib/components/VRadioGroup/VRadioGroup.d.ts +23 -13
  85. package/lib/components/VRangeSlider/VRangeSlider.d.ts +3 -3
  86. package/lib/components/VSelect/VSelect.d.ts +171 -107
  87. package/lib/components/VSelect/VSelect.js +21 -3
  88. package/lib/components/VSelect/VSelect.js.map +1 -1
  89. package/lib/components/VSelectionControl/VSelectionControl.d.ts +20 -10
  90. package/lib/components/VSelectionControlGroup/VSelectionControlGroup.d.ts +28 -14
  91. package/lib/components/VSlideGroup/VSlideGroup.d.ts +10 -0
  92. package/lib/components/VSlideGroup/VSlideGroup.js +2 -1
  93. package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
  94. package/lib/components/VSlider/VSlider.d.ts +3 -3
  95. package/lib/components/VSlider/VSliderThumb.d.ts +20 -10
  96. package/lib/components/VStepper/VStepperItem.d.ts +28 -14
  97. package/lib/components/VSwitch/VSwitch.d.ts +23 -13
  98. package/lib/components/VTabs/VTab.d.ts +56 -28
  99. package/lib/components/VTabs/VTabs.d.ts +10 -0
  100. package/lib/components/VTextField/VTextField.d.ts +27 -27
  101. package/lib/components/VTextarea/VTextarea.d.ts +15 -15
  102. package/lib/composables/calendar.d.ts +6 -0
  103. package/lib/composables/calendar.js +2 -1
  104. package/lib/composables/calendar.js.map +1 -1
  105. package/lib/composables/date/DateAdapter.d.ts +1 -1
  106. package/lib/composables/date/DateAdapter.js.map +1 -1
  107. package/lib/composables/date/adapters/vuetify.d.ts +1 -1
  108. package/lib/composables/date/adapters/vuetify.js +4 -4
  109. package/lib/composables/date/adapters/vuetify.js.map +1 -1
  110. package/lib/composables/date/date.d.ts +1 -1
  111. package/lib/composables/date/index.d.ts +1 -0
  112. package/lib/composables/date/index.js +1 -0
  113. package/lib/composables/date/index.js.map +1 -1
  114. package/lib/composables/filter.js +3 -0
  115. package/lib/composables/filter.js.map +1 -1
  116. package/lib/composables/iconSizes.d.ts +28 -0
  117. package/lib/composables/iconSizes.js +23 -0
  118. package/lib/composables/iconSizes.js.map +1 -0
  119. package/lib/composables/theme.d.ts +6 -1
  120. package/lib/composables/theme.js +94 -26
  121. package/lib/composables/theme.js.map +1 -1
  122. package/lib/composables/virtual.js +6 -1
  123. package/lib/composables/virtual.js.map +1 -1
  124. package/lib/directives/ripple/index.d.ts +2 -1
  125. package/lib/directives/ripple/index.js +12 -7
  126. package/lib/directives/ripple/index.js.map +1 -1
  127. package/lib/entry-bundler.d.ts +1 -1
  128. package/lib/entry-bundler.js +1 -1
  129. package/lib/entry-bundler.js.map +1 -1
  130. package/lib/framework.d.ts +64 -59
  131. package/lib/framework.js +1 -1
  132. package/lib/framework.js.map +1 -1
  133. package/lib/labs/VCalendar/VCalendar.d.ts +10 -0
  134. package/lib/labs/VColorInput/VColorInput.d.ts +3 -3
  135. package/lib/labs/VDateInput/VDateInput.d.ts +97 -87
  136. package/lib/labs/VFileUpload/VFileUpload.d.ts +3 -3
  137. package/lib/labs/VFileUpload/VFileUploadItem.d.ts +20 -10
  138. package/lib/labs/VIconBtn/VIconBtn.d.ts +29 -29
  139. package/lib/labs/VIconBtn/VIconBtn.js +7 -11
  140. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  141. package/lib/labs/VStepperVertical/VStepperVertical.d.ts +20 -10
  142. package/lib/labs/VStepperVertical/VStepperVerticalItem.d.ts +20 -10
  143. package/lib/labs/VTreeview/VTreeview.d.ts +13 -0
  144. package/lib/labs/VTreeview/VTreeviewItem.d.ts +20 -10
  145. package/lib/labs/entry-bundler.d.ts +1 -1
  146. package/lib/util/globals.d.ts +1 -0
  147. package/lib/util/globals.js +1 -0
  148. package/lib/util/globals.js.map +1 -1
  149. package/package.json +3 -1
@@ -1,10 +1,10 @@
1
1
  /*!
2
- * Vuetify v3.8.6-master.2025-05-26
2
+ * Vuetify v3.8.7-dev.2025-05-30
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
6
6
 
7
- import { shallowRef, reactive, watchEffect, toRef, capitalize, unref, Fragment, isVNode, Comment, warn, getCurrentInstance as getCurrentInstance$1, ref, computed, provide, inject as inject$1, defineComponent as defineComponent$1, h, camelize, onBeforeUnmount, watch, readonly, onMounted, useId, onDeactivated, onActivated, onScopeDispose, effectScope, toRaw, createElementVNode, normalizeStyle, normalizeClass, createVNode, TransitionGroup, Transition, mergeProps, toRefs, toValue, isRef, onBeforeMount, nextTick, withDirectives, vShow, onUpdated, Text, resolveDynamicComponent, toDisplayString, markRaw, Teleport, cloneVNode, createTextVNode, normalizeProps, guardReactiveProps, onUnmounted, onBeforeUpdate, withModifiers, vModelText, resolveComponent, render } from 'vue';
7
+ import { shallowRef, reactive, watchEffect, toRef, capitalize, unref, Fragment, 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, 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"); }
@@ -2337,6 +2338,7 @@ const makeThemeProps = propsFactory({
2337
2338
  function genDefaults$2() {
2338
2339
  return {
2339
2340
  defaultTheme: 'light',
2341
+ prefix: 'v-',
2340
2342
  variations: {
2341
2343
  colors: [],
2342
2344
  lighten: 0,
@@ -2418,7 +2420,10 @@ function genDefaults$2() {
2418
2420
  }
2419
2421
  }
2420
2422
  },
2421
- stylesheetId: 'vuetify-theme-stylesheet'
2423
+ stylesheetId: 'vuetify-theme-stylesheet',
2424
+ scoped: false,
2425
+ unimportant: false,
2426
+ utilities: true
2422
2427
  };
2423
2428
  }
2424
2429
  function parseThemeOptions() {
@@ -2441,21 +2446,21 @@ function parseThemeOptions() {
2441
2446
  function createCssClass(lines, selector, content, scope) {
2442
2447
  lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
2443
2448
  }
2444
- function genCssVariables(theme) {
2449
+ function genCssVariables(theme, prefix) {
2445
2450
  const lightOverlay = theme.dark ? 2 : 1;
2446
2451
  const darkOverlay = theme.dark ? 1 : 2;
2447
2452
  const variables = [];
2448
2453
  for (const [key, value] of Object.entries(theme.colors)) {
2449
2454
  const rgb = parseColor(value);
2450
- variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2455
+ variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2451
2456
  if (!key.startsWith('on-')) {
2452
- variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2457
+ variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2453
2458
  }
2454
2459
  }
2455
2460
  for (const [key, value] of Object.entries(theme.variables)) {
2456
2461
  const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
2457
2462
  const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
2458
- variables.push(`--v-${key}: ${rgb ?? value}`);
2463
+ variables.push(`--${prefix}${key}: ${rgb ?? value}`);
2459
2464
  }
2460
2465
  return variables;
2461
2466
  }
@@ -2499,7 +2504,8 @@ function getScopedSelector(selector, scope) {
2499
2504
  const scopeSelector = `:where(${scope})`;
2500
2505
  return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
2501
2506
  }
2502
- function upsertStyles(styleEl, styles) {
2507
+ function upsertStyles(id, cspNonce, styles) {
2508
+ const styleEl = getOrCreateStyleElement(id, cspNonce);
2503
2509
  if (!styleEl) return;
2504
2510
  styleEl.innerHTML = styles;
2505
2511
  }
@@ -2519,8 +2525,17 @@ function getOrCreateStyleElement(id, cspNonce) {
2519
2525
  // Composables
2520
2526
  function createTheme(options) {
2521
2527
  const parsedOptions = parseThemeOptions(options);
2522
- const name = shallowRef(parsedOptions.defaultTheme);
2528
+ const _name = shallowRef(parsedOptions.defaultTheme);
2523
2529
  const themes = ref(parsedOptions.themes);
2530
+ const systemName = shallowRef('light');
2531
+ const name = computed({
2532
+ get() {
2533
+ return _name.value === 'system' ? systemName.value : _name.value;
2534
+ },
2535
+ set(val) {
2536
+ _name.value = val;
2537
+ }
2538
+ });
2524
2539
  const computedThemes = computed(() => {
2525
2540
  const acc = {};
2526
2541
  for (const [name, original] of Object.entries(themes.value)) {
@@ -2541,28 +2556,49 @@ function createTheme(options) {
2541
2556
  const current = toRef(() => computedThemes.value[name.value]);
2542
2557
  const styles = computed(() => {
2543
2558
  const lines = [];
2559
+ const important = parsedOptions.unimportant ? '' : ' !important';
2560
+ const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
2544
2561
  if (current.value?.dark) {
2545
2562
  createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
2546
2563
  }
2547
- createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
2564
+ createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
2548
2565
  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);
2566
+ createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
2567
+ }
2568
+ if (parsedOptions.utilities) {
2569
+ const bgLines = [];
2570
+ const fgLines = [];
2571
+ const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
2572
+ for (const key of colors) {
2573
+ if (key.startsWith('on-')) {
2574
+ createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
2575
+ } else {
2576
+ 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);
2577
+ createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
2578
+ createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
2579
+ }
2561
2580
  }
2581
+ lines.push(...bgLines, ...fgLines);
2562
2582
  }
2563
- lines.push(...bgLines, ...fgLines);
2564
2583
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
2565
2584
  });
2585
+ const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
2586
+ const themeNames = toRef(() => Object.keys(computedThemes.value));
2587
+ if (SUPPORTS_MATCH_MEDIA) {
2588
+ const media = window.matchMedia('(prefers-color-scheme: dark)');
2589
+ function updateSystemName() {
2590
+ systemName.value = media.matches ? 'dark' : 'light';
2591
+ }
2592
+ updateSystemName();
2593
+ media.addEventListener('change', updateSystemName, {
2594
+ passive: true
2595
+ });
2596
+ if (getCurrentScope()) {
2597
+ onScopeDispose(() => {
2598
+ media.removeEventListener('change', updateSystemName);
2599
+ });
2600
+ }
2601
+ }
2566
2602
  function install(app) {
2567
2603
  if (parsedOptions.isDisabled) return;
2568
2604
  const head = app._context.provides.usehead;
@@ -2600,22 +2636,55 @@ function createTheme(options) {
2600
2636
  updateStyles();
2601
2637
  }
2602
2638
  function updateStyles() {
2603
- upsertStyles(getOrCreateStyleElement(parsedOptions.stylesheetId, parsedOptions.cspNonce), styles.value);
2639
+ upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
2604
2640
  }
2605
2641
  }
2606
2642
  }
2607
- const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);
2643
+ function change(themeName) {
2644
+ if (!themeNames.value.includes(themeName)) {
2645
+ consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
2646
+ return;
2647
+ }
2648
+ name.value = themeName;
2649
+ }
2650
+ function cycle() {
2651
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
2652
+ const currentIndex = themeArray.indexOf(name.value);
2653
+ const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
2654
+ change(themeArray[nextIndex]);
2655
+ }
2656
+ function toggle() {
2657
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
2658
+ cycle(themeArray);
2659
+ }
2660
+ const globalName = new Proxy(name, {
2661
+ get(target, prop) {
2662
+ return target[prop];
2663
+ },
2664
+ set(target, prop, val) {
2665
+ if (prop === 'value') {
2666
+ deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
2667
+ }
2668
+ // @ts-expect-error
2669
+ target[prop] = val;
2670
+ return true;
2671
+ }
2672
+ });
2608
2673
  return {
2609
2674
  install,
2675
+ change,
2676
+ cycle,
2677
+ toggle,
2610
2678
  isDisabled: parsedOptions.isDisabled,
2611
2679
  name,
2612
2680
  themes,
2613
2681
  current,
2614
2682
  computedThemes,
2683
+ prefix: parsedOptions.prefix,
2615
2684
  themeClasses,
2616
2685
  styles,
2617
2686
  global: {
2618
- name,
2687
+ name: globalName,
2619
2688
  current
2620
2689
  }
2621
2690
  };
@@ -2626,7 +2695,7 @@ function provideTheme(props) {
2626
2695
  if (!theme) throw new Error('Could not find Vuetify theme injection');
2627
2696
  const name = toRef(() => props.theme ?? theme.name.value);
2628
2697
  const current = toRef(() => theme.themes.value[name.value]);
2629
- const themeClasses = toRef(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);
2698
+ const themeClasses = toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
2630
2699
  const newTheme = {
2631
2700
  ...theme,
2632
2701
  name,
@@ -4173,9 +4242,15 @@ function useVariant(props) {
4173
4242
  };
4174
4243
  }
4175
4244
 
4245
+ // Types
4246
+
4176
4247
  const makeVBtnGroupProps = propsFactory({
4177
4248
  baseColor: String,
4178
4249
  divided: Boolean,
4250
+ direction: {
4251
+ type: String,
4252
+ default: 'horizontal'
4253
+ },
4179
4254
  ...makeBorderProps(),
4180
4255
  ...makeComponentProps(),
4181
4256
  ...makeDensityProps(),
@@ -4209,7 +4284,7 @@ const VBtnGroup = genericComponent()({
4209
4284
  } = useRounded(props);
4210
4285
  provideDefaults({
4211
4286
  VBtn: {
4212
- height: 'auto',
4287
+ height: toRef(() => props.direction === 'horizontal' ? 'auto' : null),
4213
4288
  baseColor: toRef(() => props.baseColor),
4214
4289
  color: toRef(() => props.color),
4215
4290
  density: toRef(() => props.density),
@@ -4219,7 +4294,7 @@ const VBtnGroup = genericComponent()({
4219
4294
  });
4220
4295
  useRender(() => {
4221
4296
  return createVNode(props.tag, {
4222
- "class": normalizeClass(['v-btn-group', {
4297
+ "class": normalizeClass(['v-btn-group', `v-btn-group--${props.direction}`, {
4223
4298
  'v-btn-group--divided': props.divided
4224
4299
  }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
4225
4300
  "style": normalizeStyle(props.style)
@@ -5551,8 +5626,8 @@ function rippleCancelShow(e) {
5551
5626
  window.clearTimeout(element._ripple.showTimer);
5552
5627
  }
5553
5628
  let keyboardRipple = false;
5554
- function keyboardRippleShow(e) {
5555
- if (!keyboardRipple && (e.keyCode === keyCodes.enter || e.keyCode === keyCodes.space)) {
5629
+ function keyboardRippleShow(e, keys) {
5630
+ if (!keyboardRipple && keys.includes(e.keyCode)) {
5556
5631
  keyboardRipple = true;
5557
5632
  rippleShow(e);
5558
5633
  }
@@ -5580,9 +5655,12 @@ function updateRipple(el, binding, wasEnabled) {
5580
5655
  el._ripple.enabled = enabled;
5581
5656
  el._ripple.centered = modifiers.center;
5582
5657
  el._ripple.circle = modifiers.circle;
5583
- if (isObject(value) && value.class) {
5584
- el._ripple.class = value.class;
5658
+ const bindingValue = isObject(value) ? value : {};
5659
+ if (bindingValue.class) {
5660
+ el._ripple.class = bindingValue.class;
5585
5661
  }
5662
+ const allowedKeys = bindingValue.keys ?? [keyCodes.enter, keyCodes.space];
5663
+ el._ripple.keyDownHandler = e => keyboardRippleShow(e, allowedKeys);
5586
5664
  if (enabled && !wasEnabled) {
5587
5665
  if (modifiers.stop) {
5588
5666
  el.addEventListener('touchstart', rippleStop, {
@@ -5604,7 +5682,7 @@ function updateRipple(el, binding, wasEnabled) {
5604
5682
  el.addEventListener('mousedown', rippleShow);
5605
5683
  el.addEventListener('mouseup', rippleHide);
5606
5684
  el.addEventListener('mouseleave', rippleHide);
5607
- el.addEventListener('keydown', keyboardRippleShow);
5685
+ el.addEventListener('keydown', e => keyboardRippleShow(e, allowedKeys));
5608
5686
  el.addEventListener('keyup', keyboardRippleHide);
5609
5687
  el.addEventListener('blur', focusRippleHide);
5610
5688
 
@@ -5624,7 +5702,9 @@ function removeListeners(el) {
5624
5702
  el.removeEventListener('touchcancel', rippleHide);
5625
5703
  el.removeEventListener('mouseup', rippleHide);
5626
5704
  el.removeEventListener('mouseleave', rippleHide);
5627
- el.removeEventListener('keydown', keyboardRippleShow);
5705
+ if (el._ripple?.keyDownHandler) {
5706
+ el.removeEventListener('keydown', el._ripple.keyDownHandler);
5707
+ }
5628
5708
  el.removeEventListener('keyup', keyboardRippleHide);
5629
5709
  el.removeEventListener('dragstart', rippleHide);
5630
5710
  el.removeEventListener('blur', focusRippleHide);
@@ -5633,8 +5713,8 @@ function mounted$4(el, binding) {
5633
5713
  updateRipple(el, binding, false);
5634
5714
  }
5635
5715
  function unmounted$4(el) {
5636
- delete el._ripple;
5637
5716
  removeListeners(el);
5717
+ delete el._ripple;
5638
5718
  }
5639
5719
  function updated$1(el, binding) {
5640
5720
  if (binding.value === binding.oldValue) {
@@ -5907,6 +5987,31 @@ const VAppBarTitle = genericComponent()({
5907
5987
  // Utilities
5908
5988
  const VAlertTitle = createSimpleFunctional('v-alert-title');
5909
5989
 
5990
+ // Utilities
5991
+
5992
+ // Types
5993
+
5994
+ // Types
5995
+
5996
+ // Composables
5997
+ const makeIconSizeProps = propsFactory({
5998
+ iconSize: [Number, String],
5999
+ iconSizes: {
6000
+ type: Array,
6001
+ default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
6002
+ }
6003
+ }, 'iconSize');
6004
+ function useIconSizes(props, fallback) {
6005
+ const iconSize = computed(() => {
6006
+ const iconSizeMap = new Map(props.iconSizes);
6007
+ const _iconSize = props.iconSize ?? fallback() ?? 'default';
6008
+ return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
6009
+ });
6010
+ return {
6011
+ iconSize
6012
+ };
6013
+ }
6014
+
5910
6015
  // Types
5911
6016
 
5912
6017
  const allowedTypes = ['success', 'info', 'warning', 'error'];
@@ -5946,6 +6051,7 @@ const makeVAlertProps = propsFactory({
5946
6051
  ...makeDensityProps(),
5947
6052
  ...makeDimensionProps(),
5948
6053
  ...makeElevationProps(),
6054
+ ...makeIconSizeProps(),
5949
6055
  ...makeLocationProps(),
5950
6056
  ...makePositionProps(),
5951
6057
  ...makeRoundedProps(),
@@ -5973,6 +6079,9 @@ const VAlert = genericComponent()({
5973
6079
  if (!props.type) return props.icon;
5974
6080
  return props.icon ?? `$${props.type}`;
5975
6081
  });
6082
+ const {
6083
+ iconSize
6084
+ } = useIconSizes(props, () => props.prominent ? 44 : 28);
5976
6085
  const {
5977
6086
  themeClasses
5978
6087
  } = provideTheme(props);
@@ -6020,6 +6129,11 @@ const VAlert = genericComponent()({
6020
6129
  const hasPrepend = !!(slots.prepend || icon.value);
6021
6130
  const hasTitle = !!(slots.title || props.title);
6022
6131
  const hasClose = !!(slots.close || props.closable);
6132
+ const iconProps = {
6133
+ density: props.density,
6134
+ icon: icon.value,
6135
+ size: iconSize.value
6136
+ };
6023
6137
  return isActive.value && createVNode(props.tag, {
6024
6138
  "class": normalizeClass(['v-alert', props.border && {
6025
6139
  'v-alert--border': !!props.border,
@@ -6037,19 +6151,14 @@ const VAlert = genericComponent()({
6037
6151
  }, null), hasPrepend && createElementVNode("div", {
6038
6152
  "key": "prepend",
6039
6153
  "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, {
6154
+ }, [!slots.prepend ? createVNode(VIcon, mergeProps({
6155
+ "key": "prepend-icon"
6156
+ }, iconProps), null) : createVNode(VDefaultsProvider, {
6046
6157
  "key": "prepend-defaults",
6047
6158
  "disabled": !icon.value,
6048
6159
  "defaults": {
6049
6160
  VIcon: {
6050
- density: props.density,
6051
- icon: icon.value,
6052
- size: props.prominent ? 44 : 28
6161
+ ...iconProps
6053
6162
  }
6054
6163
  }
6055
6164
  }, slots.prepend)]), createElementVNode("div", {
@@ -7574,6 +7683,7 @@ function getOffsetPosition(isHorizontal, element) {
7574
7683
  const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group');
7575
7684
  const makeVSlideGroupProps = propsFactory({
7576
7685
  centerActive: Boolean,
7686
+ contentClass: null,
7577
7687
  direction: {
7578
7688
  type: String,
7579
7689
  default: 'horizontal'
@@ -7886,7 +7996,7 @@ const VSlideGroup = genericComponent()({
7886
7996
  })]), createElementVNode("div", {
7887
7997
  "key": "container",
7888
7998
  "ref": containerRef,
7889
- "class": "v-slide-group__container",
7999
+ "class": normalizeClass(['v-slide-group__container', props.contentClass]),
7890
8000
  "onScroll": onScroll
7891
8001
  }, [createElementVNode("div", {
7892
8002
  "ref": contentRef,
@@ -8248,16 +8358,85 @@ const VChip = genericComponent()({
8248
8358
  }
8249
8359
  });
8250
8360
 
8361
+ const makeVDividerProps = propsFactory({
8362
+ color: String,
8363
+ inset: Boolean,
8364
+ length: [Number, String],
8365
+ opacity: [Number, String],
8366
+ thickness: [Number, String],
8367
+ vertical: Boolean,
8368
+ ...makeComponentProps(),
8369
+ ...makeThemeProps()
8370
+ }, 'VDivider');
8371
+ const VDivider = genericComponent()({
8372
+ name: 'VDivider',
8373
+ props: makeVDividerProps(),
8374
+ setup(props, _ref) {
8375
+ let {
8376
+ attrs,
8377
+ slots
8378
+ } = _ref;
8379
+ const {
8380
+ themeClasses
8381
+ } = provideTheme(props);
8382
+ const {
8383
+ textColorClasses,
8384
+ textColorStyles
8385
+ } = useTextColor(() => props.color);
8386
+ const dividerStyles = computed(() => {
8387
+ const styles = {};
8388
+ if (props.length) {
8389
+ styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
8390
+ }
8391
+ if (props.thickness) {
8392
+ styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
8393
+ }
8394
+ return styles;
8395
+ });
8396
+ useRender(() => {
8397
+ const divider = createElementVNode("hr", {
8398
+ "class": normalizeClass([{
8399
+ 'v-divider': true,
8400
+ 'v-divider--inset': props.inset,
8401
+ 'v-divider--vertical': props.vertical
8402
+ }, themeClasses.value, textColorClasses.value, props.class]),
8403
+ "style": normalizeStyle([dividerStyles.value, textColorStyles.value, {
8404
+ '--v-border-opacity': props.opacity
8405
+ }, props.style]),
8406
+ "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
8407
+ "role": `${attrs.role || 'separator'}`
8408
+ }, null);
8409
+ if (!slots.default) return divider;
8410
+ return createElementVNode("div", {
8411
+ "class": normalizeClass(['v-divider__wrapper', {
8412
+ 'v-divider__wrapper--vertical': props.vertical,
8413
+ 'v-divider__wrapper--inset': props.inset
8414
+ }])
8415
+ }, [divider, createElementVNode("div", {
8416
+ "class": "v-divider__content"
8417
+ }, [slots.default()]), divider]);
8418
+ });
8419
+ return {};
8420
+ }
8421
+ });
8422
+
8251
8423
  // Utilities
8252
8424
 
8253
8425
  // List
8254
8426
  const ListKey = Symbol.for('vuetify:list');
8255
8427
  function createList() {
8428
+ let {
8429
+ filterable
8430
+ } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
8431
+ filterable: false
8432
+ };
8256
8433
  const parent = inject$1(ListKey, {
8434
+ filterable: false,
8257
8435
  hasPrepend: shallowRef(false),
8258
8436
  updateHasPrepend: () => null
8259
8437
  });
8260
8438
  const data = {
8439
+ filterable: parent.filterable || filterable,
8261
8440
  hasPrepend: shallowRef(false),
8262
8441
  updateHasPrepend: value => {
8263
8442
  if (value) data.hasPrepend.value = value;
@@ -9209,6 +9388,9 @@ const VListItem = genericComponent()({
9209
9388
  roundedClasses
9210
9389
  } = useRounded(roundedProps);
9211
9390
  const lineClasses = toRef(() => props.lines ? `v-list-item--${props.lines}-line` : undefined);
9391
+ const rippleOptions = toRef(() => props.ripple !== undefined && !!props.ripple && list?.filterable ? {
9392
+ keys: [keyCodes.enter]
9393
+ } : props.ripple);
9212
9394
  const slotProps = computed(() => ({
9213
9395
  isActive: isActive.value,
9214
9396
  select,
@@ -9233,8 +9415,9 @@ const VListItem = genericComponent()({
9233
9415
  function onKeyDown(e) {
9234
9416
  const target = e.target;
9235
9417
  if (['INPUT', 'TEXTAREA'].includes(target.tagName)) return;
9236
- if (e.key === 'Enter' || e.key === ' ') {
9418
+ if (e.key === 'Enter' || e.key === ' ' && !list?.filterable) {
9237
9419
  e.preventDefault();
9420
+ e.stopPropagation();
9238
9421
  e.target.dispatchEvent(new MouseEvent('click', e));
9239
9422
  }
9240
9423
  }
@@ -9344,7 +9527,7 @@ const VListItem = genericComponent()({
9344
9527
  }), createElementVNode("div", {
9345
9528
  "class": "v-list-item__spacer"
9346
9529
  }, null)])]
9347
- }), [[Ripple, isClickable.value && props.ripple]]);
9530
+ }), [[Ripple, isClickable.value && rippleOptions.value]]);
9348
9531
  });
9349
9532
  return {
9350
9533
  activate,
@@ -9399,68 +9582,6 @@ const VListSubheader = genericComponent()({
9399
9582
  }
9400
9583
  });
9401
9584
 
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
9585
  // Types
9465
9586
 
9466
9587
  const makeVListChildrenProps = propsFactory({
@@ -9729,6 +9850,7 @@ const makeVListProps = propsFactory({
9729
9850
  activeClass: String,
9730
9851
  bgColor: String,
9731
9852
  disabled: Boolean,
9853
+ filterable: Boolean,
9732
9854
  expandIcon: IconValue,
9733
9855
  collapseIcon: IconValue,
9734
9856
  lines: {
@@ -9812,7 +9934,9 @@ const VList = genericComponent()({
9812
9934
  const activeColor = toRef(() => props.activeColor);
9813
9935
  const baseColor = toRef(() => props.baseColor);
9814
9936
  const color = toRef(() => props.color);
9815
- createList();
9937
+ createList({
9938
+ filterable: props.filterable
9939
+ });
9816
9940
  provideDefaults({
9817
9941
  VListGroup: {
9818
9942
  activeColor,
@@ -12388,7 +12512,12 @@ function useVirtual(props, items) {
12388
12512
  }
12389
12513
  function calculateOffset(index) {
12390
12514
  index = clamp(index, 0, items.value.length - 1);
12391
- return offsets[index] || 0;
12515
+ const whole = Math.floor(index);
12516
+ const fraction = index % 1;
12517
+ const next = whole + 1;
12518
+ const wholeOffset = offsets[whole] || 0;
12519
+ const nextOffset = offsets[next] || wholeOffset;
12520
+ return wholeOffset + (nextOffset - wholeOffset) * fraction;
12392
12521
  }
12393
12522
  function calculateIndex(scrollTop) {
12394
12523
  return binaryClosest(offsets, scrollTop);
@@ -12742,6 +12871,7 @@ const makeSelectProps = propsFactory({
12742
12871
  },
12743
12872
  openOnClear: Boolean,
12744
12873
  itemColor: String,
12874
+ noAutoScroll: Boolean,
12745
12875
  ...makeItemsProps({
12746
12876
  itemChildren: false
12747
12877
  })
@@ -12956,7 +13086,7 @@ const VSelect = genericComponent()({
12956
13086
  watch(menu, () => {
12957
13087
  if (!props.hideSelected && menu.value && model.value.length) {
12958
13088
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
12959
- IN_BROWSER && window.requestAnimationFrame(() => {
13089
+ IN_BROWSER && !props.noAutoScroll && window.requestAnimationFrame(() => {
12960
13090
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
12961
13091
  });
12962
13092
  }
@@ -13048,6 +13178,22 @@ const VSelect = genericComponent()({
13048
13178
  key: item.value,
13049
13179
  onClick: () => select(item, null)
13050
13180
  });
13181
+ if (item.raw.type === 'divider') {
13182
+ return slots.divider?.({
13183
+ props: item.raw,
13184
+ index
13185
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
13186
+ "key": `divider-${index}`
13187
+ }), null);
13188
+ }
13189
+ if (item.raw.type === 'subheader') {
13190
+ return slots.subheader?.({
13191
+ props: item.raw,
13192
+ index
13193
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
13194
+ "key": `subheader-${index}`
13195
+ }), null);
13196
+ }
13051
13197
  return slots.item?.({
13052
13198
  item,
13053
13199
  index,
@@ -13208,6 +13354,9 @@ function filterItems(items, query, options) {
13208
13354
  let match = -1;
13209
13355
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13210
13356
  if (typeof item === 'object') {
13357
+ if (['divider', 'subheader'].includes(item.raw?.type)) {
13358
+ continue;
13359
+ }
13211
13360
  const filterKeys = keys || Object.keys(transformed);
13212
13361
  for (const key of filterKeys) {
13213
13362
  const value = getPropertyFromItem(transformed, key);
@@ -13410,7 +13559,7 @@ const VAutocomplete = genericComponent()({
13410
13559
  menu.value = !menu.value;
13411
13560
  }
13412
13561
  function onListKeydown(e) {
13413
- if (e.key !== ' ' && checkPrintable(e)) {
13562
+ if (checkPrintable(e) || e.key === 'Backspace') {
13414
13563
  vTextFieldRef.value?.focus();
13415
13564
  }
13416
13565
  }
@@ -13615,6 +13764,7 @@ const VAutocomplete = genericComponent()({
13615
13764
  }, props.menuProps), {
13616
13765
  default: () => [hasList && createVNode(VList, mergeProps({
13617
13766
  "ref": listRef,
13767
+ "filterable": true,
13618
13768
  "selected": selectedValues.value,
13619
13769
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
13620
13770
  "onMousedown": e => e.preventDefault(),
@@ -13646,6 +13796,22 @@ const VAutocomplete = genericComponent()({
13646
13796
  active: highlightFirst.value && index === 0 ? true : undefined,
13647
13797
  onClick: () => select(item, null)
13648
13798
  });
13799
+ if (item.raw.type === 'divider') {
13800
+ return slots.divider?.({
13801
+ props: item.raw,
13802
+ index
13803
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
13804
+ "key": `divider-${index}`
13805
+ }), null);
13806
+ }
13807
+ if (item.raw.type === 'subheader') {
13808
+ return slots.subheader?.({
13809
+ props: item.raw,
13810
+ index
13811
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
13812
+ "key": `subheader-${index}`
13813
+ }), null);
13814
+ }
13649
13815
  return slots.item?.({
13650
13816
  item,
13651
13817
  index,
@@ -17241,13 +17407,13 @@ function date(value) {
17241
17407
  return null;
17242
17408
  }
17243
17409
  const sundayJanuarySecond2000 = new Date(2000, 0, 2);
17244
- function getWeekdays(locale, firstDayOfWeek) {
17410
+ function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
17245
17411
  const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
17246
17412
  return createRange(7).map(i => {
17247
17413
  const weekday = new Date(sundayJanuarySecond2000);
17248
17414
  weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
17249
17415
  return new Intl.DateTimeFormat(locale, {
17250
- weekday: 'narrow'
17416
+ weekday: weekdayFormat ?? 'narrow'
17251
17417
  }).format(weekday);
17252
17418
  });
17253
17419
  }
@@ -17711,9 +17877,9 @@ class VuetifyDateAdapter {
17711
17877
  getDiff(date, comparing, unit) {
17712
17878
  return getDiff(date, comparing, unit);
17713
17879
  }
17714
- getWeekdays(firstDayOfWeek) {
17880
+ getWeekdays(firstDayOfWeek, weekdayFormat) {
17715
17881
  const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
17716
- return getWeekdays(this.locale, firstDay);
17882
+ return getWeekdays(this.locale, firstDay, weekdayFormat);
17717
17883
  }
17718
17884
  getYear(date) {
17719
17885
  return getYear(date);
@@ -18056,6 +18222,7 @@ const VCombobox = genericComponent()({
18056
18222
  _search.value = val ?? '';
18057
18223
  if (!props.multiple && !hasSelectionSlot.value) {
18058
18224
  model.value = [transformItem$3(props, val)];
18225
+ nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18059
18226
  }
18060
18227
  if (val && props.multiple && props.delimiters?.length) {
18061
18228
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18136,7 +18303,7 @@ const VCombobox = genericComponent()({
18136
18303
  menu.value = !menu.value;
18137
18304
  }
18138
18305
  function onListKeydown(e) {
18139
- if (e.key !== ' ' && checkPrintable(e)) {
18306
+ if (checkPrintable(e) || e.key === 'Backspace') {
18140
18307
  vTextFieldRef.value?.focus();
18141
18308
  }
18142
18309
  }
@@ -18341,6 +18508,7 @@ const VCombobox = genericComponent()({
18341
18508
  }, props.menuProps), {
18342
18509
  default: () => [hasList && createVNode(VList, mergeProps({
18343
18510
  "ref": listRef,
18511
+ "filterable": true,
18344
18512
  "selected": selectedValues.value,
18345
18513
  "selectStrategy": props.multiple ? 'independent' : 'single-independent',
18346
18514
  "onMousedown": e => e.preventDefault(),
@@ -18372,6 +18540,22 @@ const VCombobox = genericComponent()({
18372
18540
  active: highlightFirst.value && index === 0 ? true : undefined,
18373
18541
  onClick: () => select(item, null)
18374
18542
  });
18543
+ if (item.raw.type === 'divider') {
18544
+ return slots.divider?.({
18545
+ props: item.raw,
18546
+ index
18547
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
18548
+ "key": `divider-${index}`
18549
+ }), null);
18550
+ }
18551
+ if (item.raw.type === 'subheader') {
18552
+ return slots.subheader?.({
18553
+ props: item.raw,
18554
+ index
18555
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
18556
+ "key": `subheader-${index}`
18557
+ }), null);
18558
+ }
18375
18559
  return slots.item?.({
18376
18560
  item,
18377
18561
  index,
@@ -20251,6 +20435,7 @@ const makeVDataTableHeadersProps = propsFactory({
20251
20435
  color: String,
20252
20436
  disableSort: Boolean,
20253
20437
  fixedHeader: Boolean,
20438
+ lastFixed: Boolean,
20254
20439
  multiSort: Boolean,
20255
20440
  sortAscIcon: {
20256
20441
  type: IconValue,
@@ -20297,10 +20482,11 @@ const VDataTableHeaders = genericComponent()({
20297
20482
  loaderClasses
20298
20483
  } = useLoader(props);
20299
20484
  function getFixedStyles(column, y) {
20300
- if (!(props.sticky || props.fixedHeader) && !column.fixed) return undefined;
20485
+ if (!(props.sticky || props.fixedHeader) && !(column.fixed || column.lastFixed)) return undefined;
20301
20486
  return {
20302
20487
  position: 'sticky',
20303
- left: column.fixed ? convertToUnit(column.fixedOffset) : undefined,
20488
+ left: column.fixed || column.lastFixed ? convertToUnit(column.fixedOffset) : undefined,
20489
+ right: column.lastFixed ? convertToUnit(column.fixedOffset ?? 0) : undefined,
20304
20490
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
20305
20491
  };
20306
20492
  }
@@ -22015,7 +22201,8 @@ const makeCalendarProps = propsFactory({
22015
22201
  firstDayOfWeek: {
22016
22202
  type: [Number, String],
22017
22203
  default: undefined
22018
- }
22204
+ },
22205
+ weekdayFormat: String
22019
22206
  }, 'calendar');
22020
22207
  function useCalendar(props) {
22021
22208
  const adapter = useDate();
@@ -22263,7 +22450,7 @@ const VDatePickerMonth = genericComponent()({
22263
22450
  "ref": daysRef,
22264
22451
  "key": daysInMonth.value[0].date?.toString(),
22265
22452
  "class": "v-date-picker-month__days"
22266
- }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => createElementVNode("div", {
22453
+ }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => createElementVNode("div", {
22267
22454
  "class": ['v-date-picker-month__day', 'v-date-picker-month__weekday']
22268
22455
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22269
22456
  const slotProps = {
@@ -24794,6 +24981,10 @@ const makeVNumberInputProps = propsFactory({
24794
24981
  type: Number,
24795
24982
  default: 0
24796
24983
  },
24984
+ minFractionDigits: {
24985
+ type: Number,
24986
+ default: null
24987
+ },
24797
24988
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
24798
24989
  }, 'VNumberInput');
24799
24990
  const VNumberInput = genericComponent()({
@@ -24824,9 +25015,19 @@ const VNumberInput = genericComponent()({
24824
25015
  } = useFocus(props);
24825
25016
  function correctPrecision(val) {
24826
25017
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
24827
- const fixed = precision == null ? String(val) : val.toFixed(precision);
24828
- return isFocused.value ? Number(fixed).toString() // trim zeros
24829
- : fixed;
25018
+ if (precision == null) {
25019
+ return String(val);
25020
+ }
25021
+ let fixed = val.toFixed(precision);
25022
+ if (isFocused.value) {
25023
+ return Number(fixed).toString(); // trim zeros
25024
+ }
25025
+ if ((props.minFractionDigits ?? precision) < precision) {
25026
+ const trimLimit = precision - props.minFractionDigits;
25027
+ const [baseDigits, fractionDigits] = fixed.split('.');
25028
+ fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
25029
+ }
25030
+ return fixed;
24830
25031
  }
24831
25032
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
24832
25033
  const _inputText = shallowRef(null);
@@ -24885,6 +25086,7 @@ const VNumberInput = genericComponent()({
24885
25086
  }
24886
25087
  };
24887
25088
  watch(() => props.precision, () => formatInputValue());
25089
+ watch(() => props.minFractionDigits, () => formatInputValue());
24888
25090
  onMounted(() => {
24889
25091
  clampModel();
24890
25092
  });
@@ -24994,7 +25196,7 @@ const VNumberInput = genericComponent()({
24994
25196
  inputText.value = null;
24995
25197
  return;
24996
25198
  }
24997
- inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25199
+ inputText.value = correctPrecision(model.value);
24998
25200
  }
24999
25201
  function trimDecimalZeros() {
25000
25202
  if (controlsDisabled.value) return;
@@ -25254,9 +25456,10 @@ const VOtpInput = genericComponent()({
25254
25456
  e.preventDefault();
25255
25457
  e.stopPropagation();
25256
25458
  const clipboardText = e?.clipboardData?.getData('Text').slice(0, length.value) ?? '';
25459
+ const finalIndex = clipboardText.length - 1 === -1 ? index : clipboardText.length - 1;
25257
25460
  if (isValidNumber(clipboardText)) return;
25258
25461
  model.value = clipboardText.split('');
25259
- inputRef.value?.[index].blur();
25462
+ inputRef.value?.[finalIndex].focus();
25260
25463
  }
25261
25464
  function reset() {
25262
25465
  model.value = [];
@@ -29963,11 +30166,6 @@ const makeVIconBtnProps = propsFactory({
29963
30166
  hideOverlay: Boolean,
29964
30167
  icon: [String, Function, Object],
29965
30168
  iconColor: String,
29966
- iconSize: [Number, String],
29967
- iconSizes: {
29968
- type: Array,
29969
- default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
29970
- },
29971
30169
  loading: Boolean,
29972
30170
  opacity: [Number, String],
29973
30171
  readonly: Boolean,
@@ -29987,6 +30185,7 @@ const makeVIconBtnProps = propsFactory({
29987
30185
  ...makeBorderProps(),
29988
30186
  ...makeComponentProps(),
29989
30187
  ...makeElevationProps(),
30188
+ ...makeIconSizeProps(),
29990
30189
  ...makeRoundedProps(),
29991
30190
  ...makeTagProps({
29992
30191
  tag: 'button'
@@ -30041,7 +30240,6 @@ const VIconBtn = genericComponent()({
30041
30240
  })()
30042
30241
  }));
30043
30242
  const btnSizeMap = new Map(props.sizes);
30044
- const iconSizeMap = new Map(props.iconSizes);
30045
30243
  function onClick() {
30046
30244
  if (props.disabled || props.readonly || isActive.value === undefined || props.tag === 'a' && attrs.href) return;
30047
30245
  isActive.value = !isActive.value;
@@ -30053,12 +30251,12 @@ const VIconBtn = genericComponent()({
30053
30251
  const btnSize = hasNamedSize ? btnSizeMap.get(_btnSize) : _btnSize;
30054
30252
  const btnHeight = props.height ?? btnSize;
30055
30253
  const btnWidth = props.width ?? btnSize;
30056
- const _iconSize = props.iconSize;
30057
- const hasNamedIconSize = iconSizeMap.has(_iconSize);
30058
- const iconSize = !_iconSize ? hasNamedSize ? iconSizeMap.get(_btnSize) : iconSizeMap.get('default') : hasNamedIconSize ? iconSizeMap.get(_iconSize) : _iconSize;
30254
+ const {
30255
+ iconSize
30256
+ } = useIconSizes(props, () => new Map(props.iconSizes).get(_btnSize));
30059
30257
  const iconProps = {
30060
30258
  icon,
30061
- size: iconSize,
30259
+ size: iconSize.value,
30062
30260
  iconColor: props.iconColor,
30063
30261
  opacity: props.opacity
30064
30262
  };
@@ -30101,7 +30299,7 @@ const VIconBtn = genericComponent()({
30101
30299
  "color": typeof props.loading === 'boolean' ? undefined : props.loading,
30102
30300
  "indeterminate": "disable-shrink",
30103
30301
  "width": "2",
30104
- "size": iconSize
30302
+ "size": iconSize.value
30105
30303
  }, null)])]
30106
30304
  });
30107
30305
  });
@@ -32011,7 +32209,7 @@ function createVuetify$1() {
32011
32209
  };
32012
32210
  });
32013
32211
  }
32014
- const version$1 = "3.8.6-master.2025-05-26";
32212
+ const version$1 = "3.8.7-dev.2025-05-30";
32015
32213
  createVuetify$1.version = version$1;
32016
32214
 
32017
32215
  // Vue's inject() can only be used in setup
@@ -32309,7 +32507,7 @@ var index = /*#__PURE__*/Object.freeze({
32309
32507
 
32310
32508
  /* eslint-disable local-rules/sort-imports */
32311
32509
 
32312
- const version = "3.8.6-master.2025-05-26";
32510
+ const version = "3.8.7-dev.2025-05-30";
32313
32511
 
32314
32512
  /* eslint-disable local-rules/sort-imports */
32315
32513