@vuetify/nightly 3.8.7-dev.2025-05-27 → 3.8.7-master.2025-05-29

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 (125) hide show
  1. package/CHANGELOG.md +5 -24
  2. package/dist/json/attributes.json +3311 -3363
  3. package/dist/json/importMap-labs.json +20 -20
  4. package/dist/json/importMap.json +206 -206
  5. package/dist/json/tags.json +6 -19
  6. package/dist/json/web-types.json +6080 -6298
  7. package/dist/vuetify-labs.cjs +204 -321
  8. package/dist/vuetify-labs.css +5998 -6026
  9. package/dist/vuetify-labs.d.ts +1384 -1583
  10. package/dist/vuetify-labs.esm.js +205 -322
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +204 -321
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +193 -315
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +4658 -4686
  17. package/dist/vuetify.d.ts +541 -742
  18. package/dist/vuetify.esm.js +194 -316
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +193 -315
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1198 -1197
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VAlert/VAlert.css +1 -6
  26. package/lib/components/VAlert/VAlert.d.ts +0 -35
  27. package/lib/components/VAlert/VAlert.js +10 -15
  28. package/lib/components/VAlert/VAlert.js.map +1 -1
  29. package/lib/components/VAlert/VAlert.sass +1 -7
  30. package/lib/components/VAutocomplete/VAutocomplete.d.ts +96 -133
  31. package/lib/components/VAutocomplete/VAutocomplete.js +2 -19
  32. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  33. package/lib/components/VBtnGroup/VBtnGroup.css +7 -30
  34. package/lib/components/VBtnGroup/VBtnGroup.d.ts +32 -58
  35. package/lib/components/VBtnGroup/VBtnGroup.js +3 -7
  36. package/lib/components/VBtnGroup/VBtnGroup.js.map +1 -1
  37. package/lib/components/VBtnGroup/VBtnGroup.sass +17 -44
  38. package/lib/components/VBtnToggle/VBtnToggle.d.ts +0 -25
  39. package/lib/components/VCheckbox/VCheckbox.d.ts +3 -3
  40. package/lib/components/VChipGroup/VChipGroup.d.ts +0 -10
  41. package/lib/components/VCombobox/VCombobox.d.ts +96 -133
  42. package/lib/components/VCombobox/VCombobox.js +2 -20
  43. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  44. package/lib/components/VDataTable/VDataTable.d.ts +0 -18
  45. package/lib/components/VDataTable/VDataTableHeaders.d.ts +0 -13
  46. package/lib/components/VDataTable/VDataTableHeaders.js +2 -4
  47. package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
  48. package/lib/components/VDataTable/VDataTableServer.d.ts +0 -13
  49. package/lib/components/VDataTable/VDataTableVirtual.d.ts +0 -13
  50. package/lib/components/VDatePicker/VDatePicker.d.ts +20 -10
  51. package/lib/components/VDatePicker/VDatePicker.js +39 -2
  52. package/lib/components/VDatePicker/VDatePicker.js.map +1 -1
  53. package/lib/components/VDatePicker/VDatePickerMonth.d.ts +0 -10
  54. package/lib/components/VDatePicker/VDatePickerMonth.js +1 -1
  55. package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
  56. package/lib/components/VDatePicker/VDatePickerMonths.d.ts +10 -0
  57. package/lib/components/VDatePicker/VDatePickerMonths.js +12 -2
  58. package/lib/components/VDatePicker/VDatePickerMonths.js.map +1 -1
  59. package/lib/components/VDatePicker/VDatePickerYears.d.ts +10 -0
  60. package/lib/components/VDatePicker/VDatePickerYears.js +14 -2
  61. package/lib/components/VDatePicker/VDatePickerYears.js.map +1 -1
  62. package/lib/components/VField/VField.d.ts +3 -3
  63. package/lib/components/VFileInput/VFileInput.d.ts +15 -15
  64. package/lib/components/VInput/VInput.d.ts +4 -4
  65. package/lib/components/VList/VListChildren.js.map +1 -1
  66. package/lib/components/VNumberInput/VNumberInput.d.ts +89 -103
  67. package/lib/components/VNumberInput/VNumberInput.js +15 -29
  68. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  69. package/lib/components/VOtpInput/VOtpInput.js +1 -2
  70. package/lib/components/VOtpInput/VOtpInput.js.map +1 -1
  71. package/lib/components/VOverlay/VOverlay.css +1 -1
  72. package/lib/components/VOverlay/_variables.scss +1 -1
  73. package/lib/components/VRadioGroup/VRadioGroup.d.ts +3 -3
  74. package/lib/components/VRangeSlider/VRangeSlider.d.ts +3 -3
  75. package/lib/components/VSelect/VSelect.d.ts +96 -138
  76. package/lib/components/VSelect/VSelect.js +3 -21
  77. package/lib/components/VSelect/VSelect.js.map +1 -1
  78. package/lib/components/VSlideGroup/VSlideGroup.d.ts +0 -10
  79. package/lib/components/VSlideGroup/VSlideGroup.js +1 -2
  80. package/lib/components/VSlideGroup/VSlideGroup.js.map +1 -1
  81. package/lib/components/VSlider/VSlider.d.ts +3 -3
  82. package/lib/components/VSwitch/VSwitch.d.ts +3 -3
  83. package/lib/components/VTabs/VTabs.d.ts +0 -10
  84. package/lib/components/VTextField/VTextField.d.ts +27 -27
  85. package/lib/components/VTextarea/VTextarea.d.ts +15 -15
  86. package/lib/composables/calendar.d.ts +0 -6
  87. package/lib/composables/calendar.js +1 -2
  88. package/lib/composables/calendar.js.map +1 -1
  89. package/lib/composables/date/DateAdapter.d.ts +1 -1
  90. package/lib/composables/date/DateAdapter.js.map +1 -1
  91. package/lib/composables/date/adapters/vuetify.d.ts +1 -1
  92. package/lib/composables/date/adapters/vuetify.js +4 -4
  93. package/lib/composables/date/adapters/vuetify.js.map +1 -1
  94. package/lib/composables/date/date.d.ts +1 -1
  95. package/lib/composables/date/index.d.ts +0 -1
  96. package/lib/composables/date/index.js +0 -1
  97. package/lib/composables/date/index.js.map +1 -1
  98. package/lib/composables/filter.js +0 -3
  99. package/lib/composables/filter.js.map +1 -1
  100. package/lib/composables/theme.d.ts +1 -6
  101. package/lib/composables/theme.js +26 -94
  102. package/lib/composables/theme.js.map +1 -1
  103. package/lib/composables/virtual.js +1 -6
  104. package/lib/composables/virtual.js.map +1 -1
  105. package/lib/entry-bundler.d.ts +1 -1
  106. package/lib/entry-bundler.js +1 -1
  107. package/lib/entry-bundler.js.map +1 -1
  108. package/lib/framework.d.ts +71 -76
  109. package/lib/framework.js +1 -1
  110. package/lib/framework.js.map +1 -1
  111. package/lib/labs/VCalendar/VCalendar.d.ts +0 -10
  112. package/lib/labs/VColorInput/VColorInput.d.ts +3 -3
  113. package/lib/labs/VDateInput/VDateInput.d.ts +107 -97
  114. package/lib/labs/VFileUpload/VFileUpload.d.ts +3 -3
  115. package/lib/labs/VIconBtn/VIconBtn.d.ts +29 -29
  116. package/lib/labs/VIconBtn/VIconBtn.js +11 -7
  117. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  118. package/lib/labs/entry-bundler.d.ts +1 -1
  119. package/lib/util/globals.d.ts +0 -1
  120. package/lib/util/globals.js +0 -1
  121. package/lib/util/globals.js.map +1 -1
  122. package/package.json +1 -3
  123. package/lib/composables/iconSizes.d.ts +0 -28
  124. package/lib/composables/iconSizes.js +0 -23
  125. package/lib/composables/iconSizes.js.map +0 -1
@@ -1,10 +1,10 @@
1
1
  /*!
2
- * Vuetify v3.8.7-dev.2025-05-27
2
+ * Vuetify v3.8.7-master.2025-05-29
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, 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';
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';
8
8
 
9
9
  // Types
10
10
  // eslint-disable-line vue/prefer-import-from-vue
@@ -81,7 +81,6 @@ 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';
85
84
 
86
85
  function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
87
86
  function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
@@ -2338,7 +2337,6 @@ const makeThemeProps = propsFactory({
2338
2337
  function genDefaults$2() {
2339
2338
  return {
2340
2339
  defaultTheme: 'light',
2341
- prefix: 'v-',
2342
2340
  variations: {
2343
2341
  colors: [],
2344
2342
  lighten: 0,
@@ -2420,10 +2418,7 @@ function genDefaults$2() {
2420
2418
  }
2421
2419
  }
2422
2420
  },
2423
- stylesheetId: 'vuetify-theme-stylesheet',
2424
- scoped: false,
2425
- unimportant: false,
2426
- utilities: true
2421
+ stylesheetId: 'vuetify-theme-stylesheet'
2427
2422
  };
2428
2423
  }
2429
2424
  function parseThemeOptions() {
@@ -2446,21 +2441,21 @@ function parseThemeOptions() {
2446
2441
  function createCssClass(lines, selector, content, scope) {
2447
2442
  lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
2448
2443
  }
2449
- function genCssVariables(theme, prefix) {
2444
+ function genCssVariables(theme) {
2450
2445
  const lightOverlay = theme.dark ? 2 : 1;
2451
2446
  const darkOverlay = theme.dark ? 1 : 2;
2452
2447
  const variables = [];
2453
2448
  for (const [key, value] of Object.entries(theme.colors)) {
2454
2449
  const rgb = parseColor(value);
2455
- variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2450
+ variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2456
2451
  if (!key.startsWith('on-')) {
2457
- variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2452
+ variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2458
2453
  }
2459
2454
  }
2460
2455
  for (const [key, value] of Object.entries(theme.variables)) {
2461
2456
  const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
2462
2457
  const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
2463
- variables.push(`--${prefix}${key}: ${rgb ?? value}`);
2458
+ variables.push(`--v-${key}: ${rgb ?? value}`);
2464
2459
  }
2465
2460
  return variables;
2466
2461
  }
@@ -2504,8 +2499,7 @@ function getScopedSelector(selector, scope) {
2504
2499
  const scopeSelector = `:where(${scope})`;
2505
2500
  return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
2506
2501
  }
2507
- function upsertStyles(id, cspNonce, styles) {
2508
- const styleEl = getOrCreateStyleElement(id, cspNonce);
2502
+ function upsertStyles(styleEl, styles) {
2509
2503
  if (!styleEl) return;
2510
2504
  styleEl.innerHTML = styles;
2511
2505
  }
@@ -2525,17 +2519,8 @@ function getOrCreateStyleElement(id, cspNonce) {
2525
2519
  // Composables
2526
2520
  function createTheme(options) {
2527
2521
  const parsedOptions = parseThemeOptions(options);
2528
- const _name = shallowRef(parsedOptions.defaultTheme);
2522
+ const name = shallowRef(parsedOptions.defaultTheme);
2529
2523
  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
- });
2539
2524
  const computedThemes = computed(() => {
2540
2525
  const acc = {};
2541
2526
  for (const [name, original] of Object.entries(themes.value)) {
@@ -2556,49 +2541,28 @@ function createTheme(options) {
2556
2541
  const current = toRef(() => computedThemes.value[name.value]);
2557
2542
  const styles = computed(() => {
2558
2543
  const lines = [];
2559
- const important = parsedOptions.unimportant ? '' : ' !important';
2560
- const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
2561
2544
  if (current.value?.dark) {
2562
2545
  createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
2563
2546
  }
2564
- createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
2547
+ createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
2565
2548
  for (const [themeName, theme] of Object.entries(computedThemes.value)) {
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
- }
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);
2580
2561
  }
2581
- lines.push(...bgLines, ...fgLines);
2582
2562
  }
2563
+ lines.push(...bgLines, ...fgLines);
2583
2564
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
2584
2565
  });
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
- }
2602
2566
  function install(app) {
2603
2567
  if (parsedOptions.isDisabled) return;
2604
2568
  const head = app._context.provides.usehead;
@@ -2636,55 +2600,22 @@ function createTheme(options) {
2636
2600
  updateStyles();
2637
2601
  }
2638
2602
  function updateStyles() {
2639
- upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
2603
+ upsertStyles(getOrCreateStyleElement(parsedOptions.stylesheetId, parsedOptions.cspNonce), styles.value);
2640
2604
  }
2641
2605
  }
2642
2606
  }
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
- });
2607
+ const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);
2673
2608
  return {
2674
2609
  install,
2675
- change,
2676
- cycle,
2677
- toggle,
2678
2610
  isDisabled: parsedOptions.isDisabled,
2679
2611
  name,
2680
2612
  themes,
2681
2613
  current,
2682
2614
  computedThemes,
2683
- prefix: parsedOptions.prefix,
2684
2615
  themeClasses,
2685
2616
  styles,
2686
2617
  global: {
2687
- name: globalName,
2618
+ name,
2688
2619
  current
2689
2620
  }
2690
2621
  };
@@ -2695,7 +2626,7 @@ function provideTheme(props) {
2695
2626
  if (!theme) throw new Error('Could not find Vuetify theme injection');
2696
2627
  const name = toRef(() => props.theme ?? theme.name.value);
2697
2628
  const current = toRef(() => theme.themes.value[name.value]);
2698
- const themeClasses = toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
2629
+ const themeClasses = toRef(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);
2699
2630
  const newTheme = {
2700
2631
  ...theme,
2701
2632
  name,
@@ -4242,15 +4173,9 @@ function useVariant(props) {
4242
4173
  };
4243
4174
  }
4244
4175
 
4245
- // Types
4246
-
4247
4176
  const makeVBtnGroupProps = propsFactory({
4248
4177
  baseColor: String,
4249
4178
  divided: Boolean,
4250
- direction: {
4251
- type: String,
4252
- default: 'horizontal'
4253
- },
4254
4179
  ...makeBorderProps(),
4255
4180
  ...makeComponentProps(),
4256
4181
  ...makeDensityProps(),
@@ -4284,7 +4209,7 @@ const VBtnGroup = genericComponent()({
4284
4209
  } = useRounded(props);
4285
4210
  provideDefaults({
4286
4211
  VBtn: {
4287
- height: toRef(() => props.direction === 'horizontal' ? 'auto' : null),
4212
+ height: 'auto',
4288
4213
  baseColor: toRef(() => props.baseColor),
4289
4214
  color: toRef(() => props.color),
4290
4215
  density: toRef(() => props.density),
@@ -4294,7 +4219,7 @@ const VBtnGroup = genericComponent()({
4294
4219
  });
4295
4220
  useRender(() => {
4296
4221
  return createVNode(props.tag, {
4297
- "class": normalizeClass(['v-btn-group', `v-btn-group--${props.direction}`, {
4222
+ "class": normalizeClass(['v-btn-group', {
4298
4223
  'v-btn-group--divided': props.divided
4299
4224
  }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
4300
4225
  "style": normalizeStyle(props.style)
@@ -5982,31 +5907,6 @@ const VAppBarTitle = genericComponent()({
5982
5907
  // Utilities
5983
5908
  const VAlertTitle = createSimpleFunctional('v-alert-title');
5984
5909
 
5985
- // Utilities
5986
-
5987
- // Types
5988
-
5989
- // Types
5990
-
5991
- // Composables
5992
- const makeIconSizeProps = propsFactory({
5993
- iconSize: [Number, String],
5994
- iconSizes: {
5995
- type: Array,
5996
- default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
5997
- }
5998
- }, 'iconSize');
5999
- function useIconSizes(props, fallback) {
6000
- const iconSize = computed(() => {
6001
- const iconSizeMap = new Map(props.iconSizes);
6002
- const _iconSize = props.iconSize ?? fallback() ?? 'default';
6003
- return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
6004
- });
6005
- return {
6006
- iconSize
6007
- };
6008
- }
6009
-
6010
5910
  // Types
6011
5911
 
6012
5912
  const allowedTypes = ['success', 'info', 'warning', 'error'];
@@ -6046,7 +5946,6 @@ const makeVAlertProps = propsFactory({
6046
5946
  ...makeDensityProps(),
6047
5947
  ...makeDimensionProps(),
6048
5948
  ...makeElevationProps(),
6049
- ...makeIconSizeProps(),
6050
5949
  ...makeLocationProps(),
6051
5950
  ...makePositionProps(),
6052
5951
  ...makeRoundedProps(),
@@ -6074,9 +5973,6 @@ const VAlert = genericComponent()({
6074
5973
  if (!props.type) return props.icon;
6075
5974
  return props.icon ?? `$${props.type}`;
6076
5975
  });
6077
- const {
6078
- iconSize
6079
- } = useIconSizes(props, () => props.prominent ? 44 : 28);
6080
5976
  const {
6081
5977
  themeClasses
6082
5978
  } = provideTheme(props);
@@ -6124,11 +6020,6 @@ const VAlert = genericComponent()({
6124
6020
  const hasPrepend = !!(slots.prepend || icon.value);
6125
6021
  const hasTitle = !!(slots.title || props.title);
6126
6022
  const hasClose = !!(slots.close || props.closable);
6127
- const iconProps = {
6128
- density: props.density,
6129
- icon: icon.value,
6130
- size: iconSize.value
6131
- };
6132
6023
  return isActive.value && createVNode(props.tag, {
6133
6024
  "class": normalizeClass(['v-alert', props.border && {
6134
6025
  'v-alert--border': !!props.border,
@@ -6146,14 +6037,19 @@ const VAlert = genericComponent()({
6146
6037
  }, null), hasPrepend && createElementVNode("div", {
6147
6038
  "key": "prepend",
6148
6039
  "class": "v-alert__prepend"
6149
- }, [!slots.prepend ? createVNode(VIcon, mergeProps({
6150
- "key": "prepend-icon"
6151
- }, iconProps), null) : createVNode(VDefaultsProvider, {
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, {
6152
6046
  "key": "prepend-defaults",
6153
6047
  "disabled": !icon.value,
6154
6048
  "defaults": {
6155
6049
  VIcon: {
6156
- ...iconProps
6050
+ density: props.density,
6051
+ icon: icon.value,
6052
+ size: props.prominent ? 44 : 28
6157
6053
  }
6158
6054
  }
6159
6055
  }, slots.prepend)]), createElementVNode("div", {
@@ -7678,7 +7574,6 @@ function getOffsetPosition(isHorizontal, element) {
7678
7574
  const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group');
7679
7575
  const makeVSlideGroupProps = propsFactory({
7680
7576
  centerActive: Boolean,
7681
- contentClass: null,
7682
7577
  direction: {
7683
7578
  type: String,
7684
7579
  default: 'horizontal'
@@ -7991,7 +7886,7 @@ const VSlideGroup = genericComponent()({
7991
7886
  })]), createElementVNode("div", {
7992
7887
  "key": "container",
7993
7888
  "ref": containerRef,
7994
- "class": normalizeClass(['v-slide-group__container', props.contentClass]),
7889
+ "class": "v-slide-group__container",
7995
7890
  "onScroll": onScroll
7996
7891
  }, [createElementVNode("div", {
7997
7892
  "ref": contentRef,
@@ -8353,68 +8248,6 @@ const VChip = genericComponent()({
8353
8248
  }
8354
8249
  });
8355
8250
 
8356
- const makeVDividerProps = propsFactory({
8357
- color: String,
8358
- inset: Boolean,
8359
- length: [Number, String],
8360
- opacity: [Number, String],
8361
- thickness: [Number, String],
8362
- vertical: Boolean,
8363
- ...makeComponentProps(),
8364
- ...makeThemeProps()
8365
- }, 'VDivider');
8366
- const VDivider = genericComponent()({
8367
- name: 'VDivider',
8368
- props: makeVDividerProps(),
8369
- setup(props, _ref) {
8370
- let {
8371
- attrs,
8372
- slots
8373
- } = _ref;
8374
- const {
8375
- themeClasses
8376
- } = provideTheme(props);
8377
- const {
8378
- textColorClasses,
8379
- textColorStyles
8380
- } = useTextColor(() => props.color);
8381
- const dividerStyles = computed(() => {
8382
- const styles = {};
8383
- if (props.length) {
8384
- styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
8385
- }
8386
- if (props.thickness) {
8387
- styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
8388
- }
8389
- return styles;
8390
- });
8391
- useRender(() => {
8392
- const divider = createElementVNode("hr", {
8393
- "class": normalizeClass([{
8394
- 'v-divider': true,
8395
- 'v-divider--inset': props.inset,
8396
- 'v-divider--vertical': props.vertical
8397
- }, themeClasses.value, textColorClasses.value, props.class]),
8398
- "style": normalizeStyle([dividerStyles.value, textColorStyles.value, {
8399
- '--v-border-opacity': props.opacity
8400
- }, props.style]),
8401
- "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
8402
- "role": `${attrs.role || 'separator'}`
8403
- }, null);
8404
- if (!slots.default) return divider;
8405
- return createElementVNode("div", {
8406
- "class": normalizeClass(['v-divider__wrapper', {
8407
- 'v-divider__wrapper--vertical': props.vertical,
8408
- 'v-divider__wrapper--inset': props.inset
8409
- }])
8410
- }, [divider, createElementVNode("div", {
8411
- "class": "v-divider__content"
8412
- }, [slots.default()]), divider]);
8413
- });
8414
- return {};
8415
- }
8416
- });
8417
-
8418
8251
  // Utilities
8419
8252
 
8420
8253
  // List
@@ -9566,6 +9399,68 @@ const VListSubheader = genericComponent()({
9566
9399
  }
9567
9400
  });
9568
9401
 
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
+
9569
9464
  // Types
9570
9465
 
9571
9466
  const makeVListChildrenProps = propsFactory({
@@ -12493,12 +12388,7 @@ function useVirtual(props, items) {
12493
12388
  }
12494
12389
  function calculateOffset(index) {
12495
12390
  index = clamp(index, 0, items.value.length - 1);
12496
- const whole = Math.floor(index);
12497
- const fraction = index % 1;
12498
- const next = whole + 1;
12499
- const wholeOffset = offsets[whole] || 0;
12500
- const nextOffset = offsets[next] || wholeOffset;
12501
- return wholeOffset + (nextOffset - wholeOffset) * fraction;
12391
+ return offsets[index] || 0;
12502
12392
  }
12503
12393
  function calculateIndex(scrollTop) {
12504
12394
  return binaryClosest(offsets, scrollTop);
@@ -12852,7 +12742,6 @@ const makeSelectProps = propsFactory({
12852
12742
  },
12853
12743
  openOnClear: Boolean,
12854
12744
  itemColor: String,
12855
- noAutoScroll: Boolean,
12856
12745
  ...makeItemsProps({
12857
12746
  itemChildren: false
12858
12747
  })
@@ -13067,7 +12956,7 @@ const VSelect = genericComponent()({
13067
12956
  watch(menu, () => {
13068
12957
  if (!props.hideSelected && menu.value && model.value.length) {
13069
12958
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
13070
- IN_BROWSER && !props.noAutoScroll && window.requestAnimationFrame(() => {
12959
+ IN_BROWSER && window.requestAnimationFrame(() => {
13071
12960
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
13072
12961
  });
13073
12962
  }
@@ -13159,22 +13048,6 @@ const VSelect = genericComponent()({
13159
13048
  key: item.value,
13160
13049
  onClick: () => select(item, null)
13161
13050
  });
13162
- if (item.raw.type === 'divider') {
13163
- return slots.divider?.({
13164
- props: item.raw,
13165
- index
13166
- }) ?? createVNode(VDivider, mergeProps(item.props, {
13167
- "key": `divider-${index}`
13168
- }), null);
13169
- }
13170
- if (item.raw.type === 'subheader') {
13171
- return slots.subheader?.({
13172
- props: item.raw,
13173
- index
13174
- }) ?? createVNode(VListSubheader, mergeProps(item.props, {
13175
- "key": `subheader-${index}`
13176
- }), null);
13177
- }
13178
13051
  return slots.item?.({
13179
13052
  item,
13180
13053
  index,
@@ -13335,9 +13208,6 @@ function filterItems(items, query, options) {
13335
13208
  let match = -1;
13336
13209
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13337
13210
  if (typeof item === 'object') {
13338
- if (['divider', 'subheader'].includes(item.raw?.type)) {
13339
- continue;
13340
- }
13341
13211
  const filterKeys = keys || Object.keys(transformed);
13342
13212
  for (const key of filterKeys) {
13343
13213
  const value = getPropertyFromItem(transformed, key);
@@ -13776,22 +13646,6 @@ const VAutocomplete = genericComponent()({
13776
13646
  active: highlightFirst.value && index === 0 ? true : undefined,
13777
13647
  onClick: () => select(item, null)
13778
13648
  });
13779
- if (item.raw.type === 'divider') {
13780
- return slots.divider?.({
13781
- props: item.raw,
13782
- index
13783
- }) ?? createVNode(VDivider, mergeProps(item.props, {
13784
- "key": `divider-${index}`
13785
- }), null);
13786
- }
13787
- if (item.raw.type === 'subheader') {
13788
- return slots.subheader?.({
13789
- props: item.raw,
13790
- index
13791
- }) ?? createVNode(VListSubheader, mergeProps(item.props, {
13792
- "key": `subheader-${index}`
13793
- }), null);
13794
- }
13795
13649
  return slots.item?.({
13796
13650
  item,
13797
13651
  index,
@@ -17387,13 +17241,13 @@ function date(value) {
17387
17241
  return null;
17388
17242
  }
17389
17243
  const sundayJanuarySecond2000 = new Date(2000, 0, 2);
17390
- function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
17244
+ function getWeekdays(locale, firstDayOfWeek) {
17391
17245
  const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
17392
17246
  return createRange(7).map(i => {
17393
17247
  const weekday = new Date(sundayJanuarySecond2000);
17394
17248
  weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
17395
17249
  return new Intl.DateTimeFormat(locale, {
17396
- weekday: weekdayFormat ?? 'narrow'
17250
+ weekday: 'narrow'
17397
17251
  }).format(weekday);
17398
17252
  });
17399
17253
  }
@@ -17857,9 +17711,9 @@ class VuetifyDateAdapter {
17857
17711
  getDiff(date, comparing, unit) {
17858
17712
  return getDiff(date, comparing, unit);
17859
17713
  }
17860
- getWeekdays(firstDayOfWeek, weekdayFormat) {
17714
+ getWeekdays(firstDayOfWeek) {
17861
17715
  const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
17862
- return getWeekdays(this.locale, firstDay, weekdayFormat);
17716
+ return getWeekdays(this.locale, firstDay);
17863
17717
  }
17864
17718
  getYear(date) {
17865
17719
  return getYear(date);
@@ -18202,7 +18056,6 @@ const VCombobox = genericComponent()({
18202
18056
  _search.value = val ?? '';
18203
18057
  if (!props.multiple && !hasSelectionSlot.value) {
18204
18058
  model.value = [transformItem$3(props, val)];
18205
- nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18206
18059
  }
18207
18060
  if (val && props.multiple && props.delimiters?.length) {
18208
18061
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18519,22 +18372,6 @@ const VCombobox = genericComponent()({
18519
18372
  active: highlightFirst.value && index === 0 ? true : undefined,
18520
18373
  onClick: () => select(item, null)
18521
18374
  });
18522
- if (item.raw.type === 'divider') {
18523
- return slots.divider?.({
18524
- props: item.raw,
18525
- index
18526
- }) ?? createVNode(VDivider, mergeProps(item.props, {
18527
- "key": `divider-${index}`
18528
- }), null);
18529
- }
18530
- if (item.raw.type === 'subheader') {
18531
- return slots.subheader?.({
18532
- props: item.raw,
18533
- index
18534
- }) ?? createVNode(VListSubheader, mergeProps(item.props, {
18535
- "key": `subheader-${index}`
18536
- }), null);
18537
- }
18538
18375
  return slots.item?.({
18539
18376
  item,
18540
18377
  index,
@@ -20414,7 +20251,6 @@ const makeVDataTableHeadersProps = propsFactory({
20414
20251
  color: String,
20415
20252
  disableSort: Boolean,
20416
20253
  fixedHeader: Boolean,
20417
- lastFixed: Boolean,
20418
20254
  multiSort: Boolean,
20419
20255
  sortAscIcon: {
20420
20256
  type: IconValue,
@@ -20461,11 +20297,10 @@ const VDataTableHeaders = genericComponent()({
20461
20297
  loaderClasses
20462
20298
  } = useLoader(props);
20463
20299
  function getFixedStyles(column, y) {
20464
- if (!(props.sticky || props.fixedHeader) && !(column.fixed || column.lastFixed)) return undefined;
20300
+ if (!(props.sticky || props.fixedHeader) && !column.fixed) return undefined;
20465
20301
  return {
20466
20302
  position: 'sticky',
20467
- left: column.fixed || column.lastFixed ? convertToUnit(column.fixedOffset) : undefined,
20468
- right: column.lastFixed ? convertToUnit(column.fixedOffset ?? 0) : undefined,
20303
+ left: column.fixed ? convertToUnit(column.fixedOffset) : undefined,
20469
20304
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
20470
20305
  };
20471
20306
  }
@@ -22180,8 +22015,7 @@ const makeCalendarProps = propsFactory({
22180
22015
  firstDayOfWeek: {
22181
22016
  type: [Number, String],
22182
22017
  default: undefined
22183
- },
22184
- weekdayFormat: String
22018
+ }
22185
22019
  }, 'calendar');
22186
22020
  function useCalendar(props) {
22187
22021
  const adapter = useDate();
@@ -22429,7 +22263,7 @@ const VDatePickerMonth = genericComponent()({
22429
22263
  "ref": daysRef,
22430
22264
  "key": daysInMonth.value[0].date?.toString(),
22431
22265
  "class": "v-date-picker-month__days"
22432
- }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => createElementVNode("div", {
22266
+ }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => createElementVNode("div", {
22433
22267
  "class": ['v-date-picker-month__day', 'v-date-picker-month__weekday']
22434
22268
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22435
22269
  const slotProps = {
@@ -22472,7 +22306,8 @@ const makeVDatePickerMonthsProps = propsFactory({
22472
22306
  min: null,
22473
22307
  max: null,
22474
22308
  modelValue: Number,
22475
- year: Number
22309
+ year: Number,
22310
+ allowedMonths: [Array, Function]
22476
22311
  }, 'VDatePickerMonths');
22477
22312
  const VDatePickerMonths = genericComponent()({
22478
22313
  name: 'VDatePickerMonths',
@@ -22494,7 +22329,7 @@ const VDatePickerMonths = genericComponent()({
22494
22329
  }
22495
22330
  return createRange(12).map(i => {
22496
22331
  const text = adapter.format(date, 'monthShort');
22497
- const isDisabled = !!(props.min && adapter.isAfter(adapter.startOfMonth(adapter.date(props.min)), date) || props.max && adapter.isAfter(date, adapter.startOfMonth(adapter.date(props.max))));
22332
+ const isDisabled = !!(!isMonthAllowed(i) || props.min && adapter.isAfter(adapter.startOfMonth(adapter.date(props.min)), date) || props.max && adapter.isAfter(date, adapter.startOfMonth(adapter.date(props.max))));
22498
22333
  date = adapter.getNextMonth(date);
22499
22334
  return {
22500
22335
  isDisabled,
@@ -22506,6 +22341,15 @@ const VDatePickerMonths = genericComponent()({
22506
22341
  watchEffect(() => {
22507
22342
  model.value = model.value ?? adapter.getMonth(adapter.date());
22508
22343
  });
22344
+ function isMonthAllowed(month) {
22345
+ if (Array.isArray(props.allowedMonths) && props.allowedMonths.length) {
22346
+ return props.allowedMonths.includes(month);
22347
+ }
22348
+ if (typeof props.allowedMonths === 'function') {
22349
+ return props.allowedMonths(month);
22350
+ }
22351
+ return true;
22352
+ }
22509
22353
  useRender(() => createElementVNode("div", {
22510
22354
  "class": "v-date-picker-months",
22511
22355
  "style": normalizeStyle({
@@ -22551,7 +22395,8 @@ const makeVDatePickerYearsProps = propsFactory({
22551
22395
  height: [String, Number],
22552
22396
  min: null,
22553
22397
  max: null,
22554
- modelValue: Number
22398
+ modelValue: Number,
22399
+ allowedYears: [Array, Function]
22555
22400
  }, 'VDatePickerYears');
22556
22401
  const VDatePickerYears = genericComponent()({
22557
22402
  name: 'VDatePickerYears',
@@ -22583,7 +22428,8 @@ const VDatePickerYears = genericComponent()({
22583
22428
  date = adapter.setYear(date, adapter.getYear(date) + 1);
22584
22429
  return {
22585
22430
  text,
22586
- value: i
22431
+ value: i,
22432
+ isDisabled: !isYearAllowed(i)
22587
22433
  };
22588
22434
  });
22589
22435
  });
@@ -22597,6 +22443,15 @@ const VDatePickerYears = genericComponent()({
22597
22443
  block: 'center'
22598
22444
  });
22599
22445
  });
22446
+ function isYearAllowed(year) {
22447
+ if (Array.isArray(props.allowedYears) && props.allowedYears.length) {
22448
+ return props.allowedYears.includes(year);
22449
+ }
22450
+ if (typeof props.allowedYears === 'function') {
22451
+ return props.allowedYears(year);
22452
+ }
22453
+ return true;
22454
+ }
22600
22455
  useRender(() => createElementVNode("div", {
22601
22456
  "class": "v-date-picker-years",
22602
22457
  "style": normalizeStyle({
@@ -22611,6 +22466,7 @@ const VDatePickerYears = genericComponent()({
22611
22466
  color: model.value === year.value ? props.color : undefined,
22612
22467
  rounded: true,
22613
22468
  text: year.text,
22469
+ disabled: year.isDisabled,
22614
22470
  variant: model.value === year.value ? 'flat' : 'text',
22615
22471
  onClick: () => {
22616
22472
  if (model.value === year.value) {
@@ -22760,6 +22616,41 @@ const VDatePicker = genericComponent()({
22760
22616
  }
22761
22617
  return targets;
22762
22618
  });
22619
+ function isAllowedInRange(start, end) {
22620
+ const allowedDates = props.allowedDates;
22621
+ if (typeof allowedDates !== 'function') return true;
22622
+ const days = adapter.getDiff(end, start, 'days');
22623
+ for (let i = 0; i < days; i++) {
22624
+ if (allowedDates(adapter.addDays(start, i))) return true;
22625
+ }
22626
+ return false;
22627
+ }
22628
+ function allowedYears(year) {
22629
+ if (typeof props.allowedDates === 'function') {
22630
+ const startOfYear = adapter.parseISO(`${year}-01-01`);
22631
+ return isAllowedInRange(startOfYear, adapter.endOfYear(startOfYear));
22632
+ }
22633
+ if (Array.isArray(props.allowedDates) && props.allowedDates.length) {
22634
+ for (const date of props.allowedDates) {
22635
+ if (adapter.getYear(adapter.date(date)) === year) return true;
22636
+ }
22637
+ return false;
22638
+ }
22639
+ return true;
22640
+ }
22641
+ function allowedMonths(month) {
22642
+ if (typeof props.allowedDates === 'function') {
22643
+ const startOfMonth = adapter.parseISO(`${year.value}-${month + 1}-01`);
22644
+ return isAllowedInRange(startOfMonth, adapter.endOfMonth(startOfMonth));
22645
+ }
22646
+ if (Array.isArray(props.allowedDates) && props.allowedDates.length) {
22647
+ for (const date of props.allowedDates) {
22648
+ if (adapter.getYear(adapter.date(date)) === year.value && adapter.getMonth(adapter.date(date)) === month) return true;
22649
+ }
22650
+ return false;
22651
+ }
22652
+ return true;
22653
+ }
22763
22654
 
22764
22655
  // function onClickAppend () {
22765
22656
  // inputMode.value = inputMode.value === 'calendar' ? 'keyboard' : 'calendar'
@@ -22875,14 +22766,16 @@ const VDatePicker = genericComponent()({
22875
22766
  "onUpdate:modelValue": [$event => month.value = $event, onUpdateMonth],
22876
22767
  "min": minDate.value,
22877
22768
  "max": maxDate.value,
22878
- "year": year.value
22769
+ "year": year.value,
22770
+ "allowedMonths": allowedMonths
22879
22771
  }), null) : viewMode.value === 'year' ? createVNode(VDatePickerYears, mergeProps({
22880
22772
  "key": "date-picker-years"
22881
22773
  }, datePickerYearsProps, {
22882
22774
  "modelValue": year.value,
22883
22775
  "onUpdate:modelValue": [$event => year.value = $event, onUpdateYear],
22884
22776
  "min": minDate.value,
22885
- "max": maxDate.value
22777
+ "max": maxDate.value,
22778
+ "allowedYears": allowedYears
22886
22779
  }), null) : createVNode(VDatePickerMonth, mergeProps({
22887
22780
  "key": "date-picker-month"
22888
22781
  }, datePickerMonthProps, {
@@ -24960,10 +24853,6 @@ const makeVNumberInputProps = propsFactory({
24960
24853
  type: Number,
24961
24854
  default: 0
24962
24855
  },
24963
- minFractionDigits: {
24964
- type: Number,
24965
- default: null
24966
- },
24967
24856
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
24968
24857
  }, 'VNumberInput');
24969
24858
  const VNumberInput = genericComponent()({
@@ -24994,19 +24883,9 @@ const VNumberInput = genericComponent()({
24994
24883
  } = useFocus(props);
24995
24884
  function correctPrecision(val) {
24996
24885
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
24997
- if (precision == null) {
24998
- return String(val);
24999
- }
25000
- let fixed = val.toFixed(precision);
25001
- if (isFocused.value) {
25002
- return Number(fixed).toString(); // trim zeros
25003
- }
25004
- if ((props.minFractionDigits ?? precision) < precision) {
25005
- const trimLimit = precision - props.minFractionDigits;
25006
- const [baseDigits, fractionDigits] = fixed.split('.');
25007
- fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
25008
- }
25009
- return fixed;
24886
+ const fixed = precision == null ? String(val) : val.toFixed(precision);
24887
+ return isFocused.value ? Number(fixed).toString() // trim zeros
24888
+ : fixed;
25010
24889
  }
25011
24890
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
25012
24891
  const _inputText = shallowRef(null);
@@ -25046,26 +24925,21 @@ const VNumberInput = genericComponent()({
25046
24925
  const controlNodeDefaultHeight = toRef(() => controlVariant.value === 'stacked' ? 'auto' : '100%');
25047
24926
  const incrementSlotProps = {
25048
24927
  props: {
25049
- style: {
25050
- touchAction: 'none'
25051
- },
25052
24928
  onClick: onControlClick,
25053
24929
  onPointerup: onControlMouseup,
25054
- onPointerdown: onUpControlMousedown
24930
+ onPointerdown: onUpControlMousedown,
24931
+ onPointercancel: onControlPointerCancel
25055
24932
  }
25056
24933
  };
25057
24934
  const decrementSlotProps = {
25058
24935
  props: {
25059
- style: {
25060
- touchAction: 'none'
25061
- },
25062
24936
  onClick: onControlClick,
25063
24937
  onPointerup: onControlMouseup,
25064
- onPointerdown: onDownControlMousedown
24938
+ onPointerdown: onDownControlMousedown,
24939
+ onPointercancel: onControlPointerCancel
25065
24940
  }
25066
24941
  };
25067
24942
  watch(() => props.precision, () => formatInputValue());
25068
- watch(() => props.minFractionDigits, () => formatInputValue());
25069
24943
  onMounted(() => {
25070
24944
  clampModel();
25071
24945
  });
@@ -25159,6 +25033,11 @@ const VNumberInput = genericComponent()({
25159
25033
  e.stopPropagation();
25160
25034
  holdStart('down');
25161
25035
  }
25036
+ function onControlPointerCancel(e) {
25037
+ const el = e.currentTarget;
25038
+ el?.releasePointerCapture(e.pointerId);
25039
+ holdStop();
25040
+ }
25162
25041
  function clampModel() {
25163
25042
  if (controlsDisabled.value) return;
25164
25043
  if (!vTextFieldRef.value) return;
@@ -25175,7 +25054,7 @@ const VNumberInput = genericComponent()({
25175
25054
  inputText.value = null;
25176
25055
  return;
25177
25056
  }
25178
- inputText.value = correctPrecision(model.value);
25057
+ inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25179
25058
  }
25180
25059
  function trimDecimalZeros() {
25181
25060
  if (controlsDisabled.value) return;
@@ -25210,8 +25089,8 @@ const VNumberInput = genericComponent()({
25210
25089
  "onClick": onControlClick,
25211
25090
  "onPointerdown": onUpControlMousedown,
25212
25091
  "onPointerup": onControlMouseup,
25092
+ "onPointercancel": onControlPointerCancel,
25213
25093
  "size": controlNodeSize.value,
25214
- "style": "touch-action: none",
25215
25094
  "tabindex": "-1"
25216
25095
  }, null) : createVNode(VDefaultsProvider, {
25217
25096
  "key": "increment-defaults",
@@ -25240,8 +25119,8 @@ const VNumberInput = genericComponent()({
25240
25119
  "onClick": onControlClick,
25241
25120
  "onPointerdown": onDownControlMousedown,
25242
25121
  "onPointerup": onControlMouseup,
25122
+ "onPointercancel": onControlPointerCancel,
25243
25123
  "size": controlNodeSize.value,
25244
- "style": "touch-action: none",
25245
25124
  "tabindex": "-1"
25246
25125
  }, null) : createVNode(VDefaultsProvider, {
25247
25126
  "key": "decrement-defaults",
@@ -25435,10 +25314,9 @@ const VOtpInput = genericComponent()({
25435
25314
  e.preventDefault();
25436
25315
  e.stopPropagation();
25437
25316
  const clipboardText = e?.clipboardData?.getData('Text').slice(0, length.value) ?? '';
25438
- const finalIndex = clipboardText.length - 1 === -1 ? index : clipboardText.length - 1;
25439
25317
  if (isValidNumber(clipboardText)) return;
25440
25318
  model.value = clipboardText.split('');
25441
- inputRef.value?.[finalIndex].focus();
25319
+ inputRef.value?.[index].blur();
25442
25320
  }
25443
25321
  function reset() {
25444
25322
  model.value = [];
@@ -30145,6 +30023,11 @@ const makeVIconBtnProps = propsFactory({
30145
30023
  hideOverlay: Boolean,
30146
30024
  icon: [String, Function, Object],
30147
30025
  iconColor: String,
30026
+ iconSize: [Number, String],
30027
+ iconSizes: {
30028
+ type: Array,
30029
+ default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
30030
+ },
30148
30031
  loading: Boolean,
30149
30032
  opacity: [Number, String],
30150
30033
  readonly: Boolean,
@@ -30164,7 +30047,6 @@ const makeVIconBtnProps = propsFactory({
30164
30047
  ...makeBorderProps(),
30165
30048
  ...makeComponentProps(),
30166
30049
  ...makeElevationProps(),
30167
- ...makeIconSizeProps(),
30168
30050
  ...makeRoundedProps(),
30169
30051
  ...makeTagProps({
30170
30052
  tag: 'button'
@@ -30219,6 +30101,7 @@ const VIconBtn = genericComponent()({
30219
30101
  })()
30220
30102
  }));
30221
30103
  const btnSizeMap = new Map(props.sizes);
30104
+ const iconSizeMap = new Map(props.iconSizes);
30222
30105
  function onClick() {
30223
30106
  if (props.disabled || props.readonly || isActive.value === undefined || props.tag === 'a' && attrs.href) return;
30224
30107
  isActive.value = !isActive.value;
@@ -30230,12 +30113,12 @@ const VIconBtn = genericComponent()({
30230
30113
  const btnSize = hasNamedSize ? btnSizeMap.get(_btnSize) : _btnSize;
30231
30114
  const btnHeight = props.height ?? btnSize;
30232
30115
  const btnWidth = props.width ?? btnSize;
30233
- const {
30234
- iconSize
30235
- } = useIconSizes(props, () => new Map(props.iconSizes).get(_btnSize));
30116
+ const _iconSize = props.iconSize;
30117
+ const hasNamedIconSize = iconSizeMap.has(_iconSize);
30118
+ const iconSize = !_iconSize ? hasNamedSize ? iconSizeMap.get(_btnSize) : iconSizeMap.get('default') : hasNamedIconSize ? iconSizeMap.get(_iconSize) : _iconSize;
30236
30119
  const iconProps = {
30237
30120
  icon,
30238
- size: iconSize.value,
30121
+ size: iconSize,
30239
30122
  iconColor: props.iconColor,
30240
30123
  opacity: props.opacity
30241
30124
  };
@@ -30278,7 +30161,7 @@ const VIconBtn = genericComponent()({
30278
30161
  "color": typeof props.loading === 'boolean' ? undefined : props.loading,
30279
30162
  "indeterminate": "disable-shrink",
30280
30163
  "width": "2",
30281
- "size": iconSize.value
30164
+ "size": iconSize
30282
30165
  }, null)])]
30283
30166
  });
30284
30167
  });
@@ -32188,7 +32071,7 @@ function createVuetify$1() {
32188
32071
  };
32189
32072
  });
32190
32073
  }
32191
- const version$1 = "3.8.7-dev.2025-05-27";
32074
+ const version$1 = "3.8.7-master.2025-05-29";
32192
32075
  createVuetify$1.version = version$1;
32193
32076
 
32194
32077
  // Vue's inject() can only be used in setup
@@ -32486,7 +32369,7 @@ var index = /*#__PURE__*/Object.freeze({
32486
32369
 
32487
32370
  /* eslint-disable local-rules/sort-imports */
32488
32371
 
32489
- const version = "3.8.7-dev.2025-05-27";
32372
+ const version = "3.8.7-master.2025-05-29";
32490
32373
 
32491
32374
  /* eslint-disable local-rules/sort-imports */
32492
32375