@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,5 +1,5 @@
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
  */
@@ -85,7 +85,6 @@
85
85
  const SUPPORTS_INTERSECTION = IN_BROWSER && 'IntersectionObserver' in window;
86
86
  const SUPPORTS_TOUCH = IN_BROWSER && ('ontouchstart' in window || window.navigator.maxTouchPoints > 0);
87
87
  const SUPPORTS_EYE_DROPPER = IN_BROWSER && 'EyeDropper' in window;
88
- const SUPPORTS_MATCH_MEDIA = IN_BROWSER && 'matchMedia' in window && typeof window.matchMedia === 'function';
89
88
 
90
89
  function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
91
90
  function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
@@ -2342,7 +2341,6 @@
2342
2341
  function genDefaults$2() {
2343
2342
  return {
2344
2343
  defaultTheme: 'light',
2345
- prefix: 'v-',
2346
2344
  variations: {
2347
2345
  colors: [],
2348
2346
  lighten: 0,
@@ -2424,10 +2422,7 @@
2424
2422
  }
2425
2423
  }
2426
2424
  },
2427
- stylesheetId: 'vuetify-theme-stylesheet',
2428
- scoped: false,
2429
- unimportant: false,
2430
- utilities: true
2425
+ stylesheetId: 'vuetify-theme-stylesheet'
2431
2426
  };
2432
2427
  }
2433
2428
  function parseThemeOptions() {
@@ -2450,21 +2445,21 @@
2450
2445
  function createCssClass(lines, selector, content, scope) {
2451
2446
  lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
2452
2447
  }
2453
- function genCssVariables(theme, prefix) {
2448
+ function genCssVariables(theme) {
2454
2449
  const lightOverlay = theme.dark ? 2 : 1;
2455
2450
  const darkOverlay = theme.dark ? 1 : 2;
2456
2451
  const variables = [];
2457
2452
  for (const [key, value] of Object.entries(theme.colors)) {
2458
2453
  const rgb = parseColor(value);
2459
- variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2454
+ variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2460
2455
  if (!key.startsWith('on-')) {
2461
- variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2456
+ variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2462
2457
  }
2463
2458
  }
2464
2459
  for (const [key, value] of Object.entries(theme.variables)) {
2465
2460
  const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
2466
2461
  const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
2467
- variables.push(`--${prefix}${key}: ${rgb ?? value}`);
2462
+ variables.push(`--v-${key}: ${rgb ?? value}`);
2468
2463
  }
2469
2464
  return variables;
2470
2465
  }
@@ -2508,8 +2503,7 @@
2508
2503
  const scopeSelector = `:where(${scope})`;
2509
2504
  return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
2510
2505
  }
2511
- function upsertStyles(id, cspNonce, styles) {
2512
- const styleEl = getOrCreateStyleElement(id, cspNonce);
2506
+ function upsertStyles(styleEl, styles) {
2513
2507
  if (!styleEl) return;
2514
2508
  styleEl.innerHTML = styles;
2515
2509
  }
@@ -2529,17 +2523,8 @@
2529
2523
  // Composables
2530
2524
  function createTheme(options) {
2531
2525
  const parsedOptions = parseThemeOptions(options);
2532
- const _name = vue.shallowRef(parsedOptions.defaultTheme);
2526
+ const name = vue.shallowRef(parsedOptions.defaultTheme);
2533
2527
  const themes = vue.ref(parsedOptions.themes);
2534
- const systemName = vue.shallowRef('light');
2535
- const name = vue.computed({
2536
- get() {
2537
- return _name.value === 'system' ? systemName.value : _name.value;
2538
- },
2539
- set(val) {
2540
- _name.value = val;
2541
- }
2542
- });
2543
2528
  const computedThemes = vue.computed(() => {
2544
2529
  const acc = {};
2545
2530
  for (const [name, original] of Object.entries(themes.value)) {
@@ -2560,49 +2545,28 @@
2560
2545
  const current = vue.toRef(() => computedThemes.value[name.value]);
2561
2546
  const styles = vue.computed(() => {
2562
2547
  const lines = [];
2563
- const important = parsedOptions.unimportant ? '' : ' !important';
2564
- const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
2565
2548
  if (current.value?.dark) {
2566
2549
  createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
2567
2550
  }
2568
- createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
2551
+ createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
2569
2552
  for (const [themeName, theme] of Object.entries(computedThemes.value)) {
2570
- createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
2571
- }
2572
- if (parsedOptions.utilities) {
2573
- const bgLines = [];
2574
- const fgLines = [];
2575
- const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
2576
- for (const key of colors) {
2577
- if (key.startsWith('on-')) {
2578
- createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
2579
- } else {
2580
- 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);
2581
- createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
2582
- createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
2583
- }
2553
+ createCssClass(lines, `.v-theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme)], parsedOptions.scope);
2554
+ }
2555
+ const bgLines = [];
2556
+ const fgLines = [];
2557
+ const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
2558
+ for (const key of colors) {
2559
+ if (key.startsWith('on-')) {
2560
+ createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
2561
+ } else {
2562
+ 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);
2563
+ createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
2564
+ createCssClass(fgLines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`], parsedOptions.scope);
2584
2565
  }
2585
- lines.push(...bgLines, ...fgLines);
2586
2566
  }
2567
+ lines.push(...bgLines, ...fgLines);
2587
2568
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
2588
2569
  });
2589
- const themeClasses = vue.toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
2590
- const themeNames = vue.toRef(() => Object.keys(computedThemes.value));
2591
- if (SUPPORTS_MATCH_MEDIA) {
2592
- const media = window.matchMedia('(prefers-color-scheme: dark)');
2593
- function updateSystemName() {
2594
- systemName.value = media.matches ? 'dark' : 'light';
2595
- }
2596
- updateSystemName();
2597
- media.addEventListener('change', updateSystemName, {
2598
- passive: true
2599
- });
2600
- if (vue.getCurrentScope()) {
2601
- vue.onScopeDispose(() => {
2602
- media.removeEventListener('change', updateSystemName);
2603
- });
2604
- }
2605
- }
2606
2570
  function install(app) {
2607
2571
  if (parsedOptions.isDisabled) return;
2608
2572
  const head = app._context.provides.usehead;
@@ -2640,55 +2604,22 @@
2640
2604
  updateStyles();
2641
2605
  }
2642
2606
  function updateStyles() {
2643
- upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
2607
+ upsertStyles(getOrCreateStyleElement(parsedOptions.stylesheetId, parsedOptions.cspNonce), styles.value);
2644
2608
  }
2645
2609
  }
2646
2610
  }
2647
- function change(themeName) {
2648
- if (!themeNames.value.includes(themeName)) {
2649
- consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
2650
- return;
2651
- }
2652
- name.value = themeName;
2653
- }
2654
- function cycle() {
2655
- let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
2656
- const currentIndex = themeArray.indexOf(name.value);
2657
- const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
2658
- change(themeArray[nextIndex]);
2659
- }
2660
- function toggle() {
2661
- let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
2662
- cycle(themeArray);
2663
- }
2664
- const globalName = new Proxy(name, {
2665
- get(target, prop) {
2666
- return target[prop];
2667
- },
2668
- set(target, prop, val) {
2669
- if (prop === 'value') {
2670
- deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
2671
- }
2672
- // @ts-expect-error
2673
- target[prop] = val;
2674
- return true;
2675
- }
2676
- });
2611
+ const themeClasses = vue.toRef(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);
2677
2612
  return {
2678
2613
  install,
2679
- change,
2680
- cycle,
2681
- toggle,
2682
2614
  isDisabled: parsedOptions.isDisabled,
2683
2615
  name,
2684
2616
  themes,
2685
2617
  current,
2686
2618
  computedThemes,
2687
- prefix: parsedOptions.prefix,
2688
2619
  themeClasses,
2689
2620
  styles,
2690
2621
  global: {
2691
- name: globalName,
2622
+ name,
2692
2623
  current
2693
2624
  }
2694
2625
  };
@@ -2699,7 +2630,7 @@
2699
2630
  if (!theme) throw new Error('Could not find Vuetify theme injection');
2700
2631
  const name = vue.toRef(() => props.theme ?? theme.name.value);
2701
2632
  const current = vue.toRef(() => theme.themes.value[name.value]);
2702
- const themeClasses = vue.toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
2633
+ const themeClasses = vue.toRef(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);
2703
2634
  const newTheme = {
2704
2635
  ...theme,
2705
2636
  name,
@@ -4246,15 +4177,9 @@
4246
4177
  };
4247
4178
  }
4248
4179
 
4249
- // Types
4250
-
4251
4180
  const makeVBtnGroupProps = propsFactory({
4252
4181
  baseColor: String,
4253
4182
  divided: Boolean,
4254
- direction: {
4255
- type: String,
4256
- default: 'horizontal'
4257
- },
4258
4183
  ...makeBorderProps(),
4259
4184
  ...makeComponentProps(),
4260
4185
  ...makeDensityProps(),
@@ -4288,7 +4213,7 @@
4288
4213
  } = useRounded(props);
4289
4214
  provideDefaults({
4290
4215
  VBtn: {
4291
- height: vue.toRef(() => props.direction === 'horizontal' ? 'auto' : null),
4216
+ height: 'auto',
4292
4217
  baseColor: vue.toRef(() => props.baseColor),
4293
4218
  color: vue.toRef(() => props.color),
4294
4219
  density: vue.toRef(() => props.density),
@@ -4298,7 +4223,7 @@
4298
4223
  });
4299
4224
  useRender(() => {
4300
4225
  return vue.createVNode(props.tag, {
4301
- "class": vue.normalizeClass(['v-btn-group', `v-btn-group--${props.direction}`, {
4226
+ "class": vue.normalizeClass(['v-btn-group', {
4302
4227
  'v-btn-group--divided': props.divided
4303
4228
  }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class]),
4304
4229
  "style": vue.normalizeStyle(props.style)
@@ -5986,31 +5911,6 @@
5986
5911
  // Utilities
5987
5912
  const VAlertTitle = createSimpleFunctional('v-alert-title');
5988
5913
 
5989
- // Utilities
5990
-
5991
- // Types
5992
-
5993
- // Types
5994
-
5995
- // Composables
5996
- const makeIconSizeProps = propsFactory({
5997
- iconSize: [Number, String],
5998
- iconSizes: {
5999
- type: Array,
6000
- default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
6001
- }
6002
- }, 'iconSize');
6003
- function useIconSizes(props, fallback) {
6004
- const iconSize = vue.computed(() => {
6005
- const iconSizeMap = new Map(props.iconSizes);
6006
- const _iconSize = props.iconSize ?? fallback() ?? 'default';
6007
- return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
6008
- });
6009
- return {
6010
- iconSize
6011
- };
6012
- }
6013
-
6014
5914
  // Types
6015
5915
 
6016
5916
  const allowedTypes = ['success', 'info', 'warning', 'error'];
@@ -6050,7 +5950,6 @@
6050
5950
  ...makeDensityProps(),
6051
5951
  ...makeDimensionProps(),
6052
5952
  ...makeElevationProps(),
6053
- ...makeIconSizeProps(),
6054
5953
  ...makeLocationProps(),
6055
5954
  ...makePositionProps(),
6056
5955
  ...makeRoundedProps(),
@@ -6078,9 +5977,6 @@
6078
5977
  if (!props.type) return props.icon;
6079
5978
  return props.icon ?? `$${props.type}`;
6080
5979
  });
6081
- const {
6082
- iconSize
6083
- } = useIconSizes(props, () => props.prominent ? 44 : 28);
6084
5980
  const {
6085
5981
  themeClasses
6086
5982
  } = provideTheme(props);
@@ -6128,11 +6024,6 @@
6128
6024
  const hasPrepend = !!(slots.prepend || icon.value);
6129
6025
  const hasTitle = !!(slots.title || props.title);
6130
6026
  const hasClose = !!(slots.close || props.closable);
6131
- const iconProps = {
6132
- density: props.density,
6133
- icon: icon.value,
6134
- size: iconSize.value
6135
- };
6136
6027
  return isActive.value && vue.createVNode(props.tag, {
6137
6028
  "class": vue.normalizeClass(['v-alert', props.border && {
6138
6029
  'v-alert--border': !!props.border,
@@ -6150,14 +6041,19 @@
6150
6041
  }, null), hasPrepend && vue.createElementVNode("div", {
6151
6042
  "key": "prepend",
6152
6043
  "class": "v-alert__prepend"
6153
- }, [!slots.prepend ? vue.createVNode(VIcon, vue.mergeProps({
6154
- "key": "prepend-icon"
6155
- }, iconProps), null) : vue.createVNode(VDefaultsProvider, {
6044
+ }, [!slots.prepend ? vue.createVNode(VIcon, {
6045
+ "key": "prepend-icon",
6046
+ "density": props.density,
6047
+ "icon": icon.value,
6048
+ "size": props.prominent ? 44 : 28
6049
+ }, null) : vue.createVNode(VDefaultsProvider, {
6156
6050
  "key": "prepend-defaults",
6157
6051
  "disabled": !icon.value,
6158
6052
  "defaults": {
6159
6053
  VIcon: {
6160
- ...iconProps
6054
+ density: props.density,
6055
+ icon: icon.value,
6056
+ size: props.prominent ? 44 : 28
6161
6057
  }
6162
6058
  }
6163
6059
  }, slots.prepend)]), vue.createElementVNode("div", {
@@ -7682,7 +7578,6 @@
7682
7578
  const VSlideGroupSymbol = Symbol.for('vuetify:v-slide-group');
7683
7579
  const makeVSlideGroupProps = propsFactory({
7684
7580
  centerActive: Boolean,
7685
- contentClass: null,
7686
7581
  direction: {
7687
7582
  type: String,
7688
7583
  default: 'horizontal'
@@ -7995,7 +7890,7 @@
7995
7890
  })]), vue.createElementVNode("div", {
7996
7891
  "key": "container",
7997
7892
  "ref": containerRef,
7998
- "class": vue.normalizeClass(['v-slide-group__container', props.contentClass]),
7893
+ "class": "v-slide-group__container",
7999
7894
  "onScroll": onScroll
8000
7895
  }, [vue.createElementVNode("div", {
8001
7896
  "ref": contentRef,
@@ -8357,68 +8252,6 @@
8357
8252
  }
8358
8253
  });
8359
8254
 
8360
- const makeVDividerProps = propsFactory({
8361
- color: String,
8362
- inset: Boolean,
8363
- length: [Number, String],
8364
- opacity: [Number, String],
8365
- thickness: [Number, String],
8366
- vertical: Boolean,
8367
- ...makeComponentProps(),
8368
- ...makeThemeProps()
8369
- }, 'VDivider');
8370
- const VDivider = genericComponent()({
8371
- name: 'VDivider',
8372
- props: makeVDividerProps(),
8373
- setup(props, _ref) {
8374
- let {
8375
- attrs,
8376
- slots
8377
- } = _ref;
8378
- const {
8379
- themeClasses
8380
- } = provideTheme(props);
8381
- const {
8382
- textColorClasses,
8383
- textColorStyles
8384
- } = useTextColor(() => props.color);
8385
- const dividerStyles = vue.computed(() => {
8386
- const styles = {};
8387
- if (props.length) {
8388
- styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
8389
- }
8390
- if (props.thickness) {
8391
- styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
8392
- }
8393
- return styles;
8394
- });
8395
- useRender(() => {
8396
- const divider = vue.createElementVNode("hr", {
8397
- "class": vue.normalizeClass([{
8398
- 'v-divider': true,
8399
- 'v-divider--inset': props.inset,
8400
- 'v-divider--vertical': props.vertical
8401
- }, themeClasses.value, textColorClasses.value, props.class]),
8402
- "style": vue.normalizeStyle([dividerStyles.value, textColorStyles.value, {
8403
- '--v-border-opacity': props.opacity
8404
- }, props.style]),
8405
- "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
8406
- "role": `${attrs.role || 'separator'}`
8407
- }, null);
8408
- if (!slots.default) return divider;
8409
- return vue.createElementVNode("div", {
8410
- "class": vue.normalizeClass(['v-divider__wrapper', {
8411
- 'v-divider__wrapper--vertical': props.vertical,
8412
- 'v-divider__wrapper--inset': props.inset
8413
- }])
8414
- }, [divider, vue.createElementVNode("div", {
8415
- "class": "v-divider__content"
8416
- }, [slots.default()]), divider]);
8417
- });
8418
- return {};
8419
- }
8420
- });
8421
-
8422
8255
  // Utilities
8423
8256
 
8424
8257
  // List
@@ -9570,6 +9403,68 @@
9570
9403
  }
9571
9404
  });
9572
9405
 
9406
+ const makeVDividerProps = propsFactory({
9407
+ color: String,
9408
+ inset: Boolean,
9409
+ length: [Number, String],
9410
+ opacity: [Number, String],
9411
+ thickness: [Number, String],
9412
+ vertical: Boolean,
9413
+ ...makeComponentProps(),
9414
+ ...makeThemeProps()
9415
+ }, 'VDivider');
9416
+ const VDivider = genericComponent()({
9417
+ name: 'VDivider',
9418
+ props: makeVDividerProps(),
9419
+ setup(props, _ref) {
9420
+ let {
9421
+ attrs,
9422
+ slots
9423
+ } = _ref;
9424
+ const {
9425
+ themeClasses
9426
+ } = provideTheme(props);
9427
+ const {
9428
+ textColorClasses,
9429
+ textColorStyles
9430
+ } = useTextColor(() => props.color);
9431
+ const dividerStyles = vue.computed(() => {
9432
+ const styles = {};
9433
+ if (props.length) {
9434
+ styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
9435
+ }
9436
+ if (props.thickness) {
9437
+ styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
9438
+ }
9439
+ return styles;
9440
+ });
9441
+ useRender(() => {
9442
+ const divider = vue.createElementVNode("hr", {
9443
+ "class": vue.normalizeClass([{
9444
+ 'v-divider': true,
9445
+ 'v-divider--inset': props.inset,
9446
+ 'v-divider--vertical': props.vertical
9447
+ }, themeClasses.value, textColorClasses.value, props.class]),
9448
+ "style": vue.normalizeStyle([dividerStyles.value, textColorStyles.value, {
9449
+ '--v-border-opacity': props.opacity
9450
+ }, props.style]),
9451
+ "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
9452
+ "role": `${attrs.role || 'separator'}`
9453
+ }, null);
9454
+ if (!slots.default) return divider;
9455
+ return vue.createElementVNode("div", {
9456
+ "class": vue.normalizeClass(['v-divider__wrapper', {
9457
+ 'v-divider__wrapper--vertical': props.vertical,
9458
+ 'v-divider__wrapper--inset': props.inset
9459
+ }])
9460
+ }, [divider, vue.createElementVNode("div", {
9461
+ "class": "v-divider__content"
9462
+ }, [slots.default()]), divider]);
9463
+ });
9464
+ return {};
9465
+ }
9466
+ });
9467
+
9573
9468
  // Types
9574
9469
 
9575
9470
  const makeVListChildrenProps = propsFactory({
@@ -12497,12 +12392,7 @@
12497
12392
  }
12498
12393
  function calculateOffset(index) {
12499
12394
  index = clamp(index, 0, items.value.length - 1);
12500
- const whole = Math.floor(index);
12501
- const fraction = index % 1;
12502
- const next = whole + 1;
12503
- const wholeOffset = offsets[whole] || 0;
12504
- const nextOffset = offsets[next] || wholeOffset;
12505
- return wholeOffset + (nextOffset - wholeOffset) * fraction;
12395
+ return offsets[index] || 0;
12506
12396
  }
12507
12397
  function calculateIndex(scrollTop) {
12508
12398
  return binaryClosest(offsets, scrollTop);
@@ -12856,7 +12746,6 @@
12856
12746
  },
12857
12747
  openOnClear: Boolean,
12858
12748
  itemColor: String,
12859
- noAutoScroll: Boolean,
12860
12749
  ...makeItemsProps({
12861
12750
  itemChildren: false
12862
12751
  })
@@ -13071,7 +12960,7 @@
13071
12960
  vue.watch(menu, () => {
13072
12961
  if (!props.hideSelected && menu.value && model.value.length) {
13073
12962
  const index = displayItems.value.findIndex(item => model.value.some(s => (props.valueComparator || deepEqual)(s.value, item.value)));
13074
- IN_BROWSER && !props.noAutoScroll && window.requestAnimationFrame(() => {
12963
+ IN_BROWSER && window.requestAnimationFrame(() => {
13075
12964
  index >= 0 && vVirtualScrollRef.value?.scrollToIndex(index);
13076
12965
  });
13077
12966
  }
@@ -13163,22 +13052,6 @@
13163
13052
  key: item.value,
13164
13053
  onClick: () => select(item, null)
13165
13054
  });
13166
- if (item.raw.type === 'divider') {
13167
- return slots.divider?.({
13168
- props: item.raw,
13169
- index
13170
- }) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
13171
- "key": `divider-${index}`
13172
- }), null);
13173
- }
13174
- if (item.raw.type === 'subheader') {
13175
- return slots.subheader?.({
13176
- props: item.raw,
13177
- index
13178
- }) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
13179
- "key": `subheader-${index}`
13180
- }), null);
13181
- }
13182
13055
  return slots.item?.({
13183
13056
  item,
13184
13057
  index,
@@ -13339,9 +13212,6 @@
13339
13212
  let match = -1;
13340
13213
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13341
13214
  if (typeof item === 'object') {
13342
- if (['divider', 'subheader'].includes(item.raw?.type)) {
13343
- continue;
13344
- }
13345
13215
  const filterKeys = keys || Object.keys(transformed);
13346
13216
  for (const key of filterKeys) {
13347
13217
  const value = getPropertyFromItem(transformed, key);
@@ -13780,22 +13650,6 @@
13780
13650
  active: highlightFirst.value && index === 0 ? true : undefined,
13781
13651
  onClick: () => select(item, null)
13782
13652
  });
13783
- if (item.raw.type === 'divider') {
13784
- return slots.divider?.({
13785
- props: item.raw,
13786
- index
13787
- }) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
13788
- "key": `divider-${index}`
13789
- }), null);
13790
- }
13791
- if (item.raw.type === 'subheader') {
13792
- return slots.subheader?.({
13793
- props: item.raw,
13794
- index
13795
- }) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
13796
- "key": `subheader-${index}`
13797
- }), null);
13798
- }
13799
13653
  return slots.item?.({
13800
13654
  item,
13801
13655
  index,
@@ -17391,13 +17245,13 @@
17391
17245
  return null;
17392
17246
  }
17393
17247
  const sundayJanuarySecond2000 = new Date(2000, 0, 2);
17394
- function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
17248
+ function getWeekdays(locale, firstDayOfWeek) {
17395
17249
  const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
17396
17250
  return createRange(7).map(i => {
17397
17251
  const weekday = new Date(sundayJanuarySecond2000);
17398
17252
  weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
17399
17253
  return new Intl.DateTimeFormat(locale, {
17400
- weekday: weekdayFormat ?? 'narrow'
17254
+ weekday: 'narrow'
17401
17255
  }).format(weekday);
17402
17256
  });
17403
17257
  }
@@ -17861,9 +17715,9 @@
17861
17715
  getDiff(date, comparing, unit) {
17862
17716
  return getDiff(date, comparing, unit);
17863
17717
  }
17864
- getWeekdays(firstDayOfWeek, weekdayFormat) {
17718
+ getWeekdays(firstDayOfWeek) {
17865
17719
  const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
17866
- return getWeekdays(this.locale, firstDay, weekdayFormat);
17720
+ return getWeekdays(this.locale, firstDay);
17867
17721
  }
17868
17722
  getYear(date) {
17869
17723
  return getYear(date);
@@ -18206,7 +18060,6 @@
18206
18060
  _search.value = val ?? '';
18207
18061
  if (!props.multiple && !hasSelectionSlot.value) {
18208
18062
  model.value = [transformItem$3(props, val)];
18209
- vue.nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18210
18063
  }
18211
18064
  if (val && props.multiple && props.delimiters?.length) {
18212
18065
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18523,22 +18376,6 @@
18523
18376
  active: highlightFirst.value && index === 0 ? true : undefined,
18524
18377
  onClick: () => select(item, null)
18525
18378
  });
18526
- if (item.raw.type === 'divider') {
18527
- return slots.divider?.({
18528
- props: item.raw,
18529
- index
18530
- }) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
18531
- "key": `divider-${index}`
18532
- }), null);
18533
- }
18534
- if (item.raw.type === 'subheader') {
18535
- return slots.subheader?.({
18536
- props: item.raw,
18537
- index
18538
- }) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
18539
- "key": `subheader-${index}`
18540
- }), null);
18541
- }
18542
18379
  return slots.item?.({
18543
18380
  item,
18544
18381
  index,
@@ -20418,7 +20255,6 @@
20418
20255
  color: String,
20419
20256
  disableSort: Boolean,
20420
20257
  fixedHeader: Boolean,
20421
- lastFixed: Boolean,
20422
20258
  multiSort: Boolean,
20423
20259
  sortAscIcon: {
20424
20260
  type: IconValue,
@@ -20465,11 +20301,10 @@
20465
20301
  loaderClasses
20466
20302
  } = useLoader(props);
20467
20303
  function getFixedStyles(column, y) {
20468
- if (!(props.sticky || props.fixedHeader) && !(column.fixed || column.lastFixed)) return undefined;
20304
+ if (!(props.sticky || props.fixedHeader) && !column.fixed) return undefined;
20469
20305
  return {
20470
20306
  position: 'sticky',
20471
- left: column.fixed || column.lastFixed ? convertToUnit(column.fixedOffset) : undefined,
20472
- right: column.lastFixed ? convertToUnit(column.fixedOffset ?? 0) : undefined,
20307
+ left: column.fixed ? convertToUnit(column.fixedOffset) : undefined,
20473
20308
  top: props.sticky || props.fixedHeader ? `calc(var(--v-table-header-height) * ${y})` : undefined
20474
20309
  };
20475
20310
  }
@@ -22184,8 +22019,7 @@
22184
22019
  firstDayOfWeek: {
22185
22020
  type: [Number, String],
22186
22021
  default: undefined
22187
- },
22188
- weekdayFormat: String
22022
+ }
22189
22023
  }, 'calendar');
22190
22024
  function useCalendar(props) {
22191
22025
  const adapter = useDate();
@@ -22433,7 +22267,7 @@
22433
22267
  "ref": daysRef,
22434
22268
  "key": daysInMonth.value[0].date?.toString(),
22435
22269
  "class": "v-date-picker-month__days"
22436
- }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => vue.createElementVNode("div", {
22270
+ }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => vue.createElementVNode("div", {
22437
22271
  "class": ['v-date-picker-month__day', 'v-date-picker-month__weekday']
22438
22272
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22439
22273
  const slotProps = {
@@ -22476,7 +22310,8 @@
22476
22310
  min: null,
22477
22311
  max: null,
22478
22312
  modelValue: Number,
22479
- year: Number
22313
+ year: Number,
22314
+ allowedMonths: [Array, Function]
22480
22315
  }, 'VDatePickerMonths');
22481
22316
  const VDatePickerMonths = genericComponent()({
22482
22317
  name: 'VDatePickerMonths',
@@ -22498,7 +22333,7 @@
22498
22333
  }
22499
22334
  return createRange(12).map(i => {
22500
22335
  const text = adapter.format(date, 'monthShort');
22501
- const isDisabled = !!(props.min && adapter.isAfter(adapter.startOfMonth(adapter.date(props.min)), date) || props.max && adapter.isAfter(date, adapter.startOfMonth(adapter.date(props.max))));
22336
+ 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))));
22502
22337
  date = adapter.getNextMonth(date);
22503
22338
  return {
22504
22339
  isDisabled,
@@ -22510,6 +22345,15 @@
22510
22345
  vue.watchEffect(() => {
22511
22346
  model.value = model.value ?? adapter.getMonth(adapter.date());
22512
22347
  });
22348
+ function isMonthAllowed(month) {
22349
+ if (Array.isArray(props.allowedMonths) && props.allowedMonths.length) {
22350
+ return props.allowedMonths.includes(month);
22351
+ }
22352
+ if (typeof props.allowedMonths === 'function') {
22353
+ return props.allowedMonths(month);
22354
+ }
22355
+ return true;
22356
+ }
22513
22357
  useRender(() => vue.createElementVNode("div", {
22514
22358
  "class": "v-date-picker-months",
22515
22359
  "style": vue.normalizeStyle({
@@ -22555,7 +22399,8 @@
22555
22399
  height: [String, Number],
22556
22400
  min: null,
22557
22401
  max: null,
22558
- modelValue: Number
22402
+ modelValue: Number,
22403
+ allowedYears: [Array, Function]
22559
22404
  }, 'VDatePickerYears');
22560
22405
  const VDatePickerYears = genericComponent()({
22561
22406
  name: 'VDatePickerYears',
@@ -22587,7 +22432,8 @@
22587
22432
  date = adapter.setYear(date, adapter.getYear(date) + 1);
22588
22433
  return {
22589
22434
  text,
22590
- value: i
22435
+ value: i,
22436
+ isDisabled: !isYearAllowed(i)
22591
22437
  };
22592
22438
  });
22593
22439
  });
@@ -22601,6 +22447,15 @@
22601
22447
  block: 'center'
22602
22448
  });
22603
22449
  });
22450
+ function isYearAllowed(year) {
22451
+ if (Array.isArray(props.allowedYears) && props.allowedYears.length) {
22452
+ return props.allowedYears.includes(year);
22453
+ }
22454
+ if (typeof props.allowedYears === 'function') {
22455
+ return props.allowedYears(year);
22456
+ }
22457
+ return true;
22458
+ }
22604
22459
  useRender(() => vue.createElementVNode("div", {
22605
22460
  "class": "v-date-picker-years",
22606
22461
  "style": vue.normalizeStyle({
@@ -22615,6 +22470,7 @@
22615
22470
  color: model.value === year.value ? props.color : undefined,
22616
22471
  rounded: true,
22617
22472
  text: year.text,
22473
+ disabled: year.isDisabled,
22618
22474
  variant: model.value === year.value ? 'flat' : 'text',
22619
22475
  onClick: () => {
22620
22476
  if (model.value === year.value) {
@@ -22764,6 +22620,41 @@
22764
22620
  }
22765
22621
  return targets;
22766
22622
  });
22623
+ function isAllowedInRange(start, end) {
22624
+ const allowedDates = props.allowedDates;
22625
+ if (typeof allowedDates !== 'function') return true;
22626
+ const days = adapter.getDiff(end, start, 'days');
22627
+ for (let i = 0; i < days; i++) {
22628
+ if (allowedDates(adapter.addDays(start, i))) return true;
22629
+ }
22630
+ return false;
22631
+ }
22632
+ function allowedYears(year) {
22633
+ if (typeof props.allowedDates === 'function') {
22634
+ const startOfYear = adapter.parseISO(`${year}-01-01`);
22635
+ return isAllowedInRange(startOfYear, adapter.endOfYear(startOfYear));
22636
+ }
22637
+ if (Array.isArray(props.allowedDates) && props.allowedDates.length) {
22638
+ for (const date of props.allowedDates) {
22639
+ if (adapter.getYear(adapter.date(date)) === year) return true;
22640
+ }
22641
+ return false;
22642
+ }
22643
+ return true;
22644
+ }
22645
+ function allowedMonths(month) {
22646
+ if (typeof props.allowedDates === 'function') {
22647
+ const startOfMonth = adapter.parseISO(`${year.value}-${month + 1}-01`);
22648
+ return isAllowedInRange(startOfMonth, adapter.endOfMonth(startOfMonth));
22649
+ }
22650
+ if (Array.isArray(props.allowedDates) && props.allowedDates.length) {
22651
+ for (const date of props.allowedDates) {
22652
+ if (adapter.getYear(adapter.date(date)) === year.value && adapter.getMonth(adapter.date(date)) === month) return true;
22653
+ }
22654
+ return false;
22655
+ }
22656
+ return true;
22657
+ }
22767
22658
 
22768
22659
  // function onClickAppend () {
22769
22660
  // inputMode.value = inputMode.value === 'calendar' ? 'keyboard' : 'calendar'
@@ -22879,14 +22770,16 @@
22879
22770
  "onUpdate:modelValue": [$event => month.value = $event, onUpdateMonth],
22880
22771
  "min": minDate.value,
22881
22772
  "max": maxDate.value,
22882
- "year": year.value
22773
+ "year": year.value,
22774
+ "allowedMonths": allowedMonths
22883
22775
  }), null) : viewMode.value === 'year' ? vue.createVNode(VDatePickerYears, vue.mergeProps({
22884
22776
  "key": "date-picker-years"
22885
22777
  }, datePickerYearsProps, {
22886
22778
  "modelValue": year.value,
22887
22779
  "onUpdate:modelValue": [$event => year.value = $event, onUpdateYear],
22888
22780
  "min": minDate.value,
22889
- "max": maxDate.value
22781
+ "max": maxDate.value,
22782
+ "allowedYears": allowedYears
22890
22783
  }), null) : vue.createVNode(VDatePickerMonth, vue.mergeProps({
22891
22784
  "key": "date-picker-month"
22892
22785
  }, datePickerMonthProps, {
@@ -24964,10 +24857,6 @@
24964
24857
  type: Number,
24965
24858
  default: 0
24966
24859
  },
24967
- minFractionDigits: {
24968
- type: Number,
24969
- default: null
24970
- },
24971
24860
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
24972
24861
  }, 'VNumberInput');
24973
24862
  const VNumberInput = genericComponent()({
@@ -24998,19 +24887,9 @@
24998
24887
  } = useFocus(props);
24999
24888
  function correctPrecision(val) {
25000
24889
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
25001
- if (precision == null) {
25002
- return String(val);
25003
- }
25004
- let fixed = val.toFixed(precision);
25005
- if (isFocused.value) {
25006
- return Number(fixed).toString(); // trim zeros
25007
- }
25008
- if ((props.minFractionDigits ?? precision) < precision) {
25009
- const trimLimit = precision - props.minFractionDigits;
25010
- const [baseDigits, fractionDigits] = fixed.split('.');
25011
- fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
25012
- }
25013
- return fixed;
24890
+ const fixed = precision == null ? String(val) : val.toFixed(precision);
24891
+ return isFocused.value ? Number(fixed).toString() // trim zeros
24892
+ : fixed;
25014
24893
  }
25015
24894
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
25016
24895
  const _inputText = vue.shallowRef(null);
@@ -25050,26 +24929,21 @@
25050
24929
  const controlNodeDefaultHeight = vue.toRef(() => controlVariant.value === 'stacked' ? 'auto' : '100%');
25051
24930
  const incrementSlotProps = {
25052
24931
  props: {
25053
- style: {
25054
- touchAction: 'none'
25055
- },
25056
24932
  onClick: onControlClick,
25057
24933
  onPointerup: onControlMouseup,
25058
- onPointerdown: onUpControlMousedown
24934
+ onPointerdown: onUpControlMousedown,
24935
+ onPointercancel: onControlPointerCancel
25059
24936
  }
25060
24937
  };
25061
24938
  const decrementSlotProps = {
25062
24939
  props: {
25063
- style: {
25064
- touchAction: 'none'
25065
- },
25066
24940
  onClick: onControlClick,
25067
24941
  onPointerup: onControlMouseup,
25068
- onPointerdown: onDownControlMousedown
24942
+ onPointerdown: onDownControlMousedown,
24943
+ onPointercancel: onControlPointerCancel
25069
24944
  }
25070
24945
  };
25071
24946
  vue.watch(() => props.precision, () => formatInputValue());
25072
- vue.watch(() => props.minFractionDigits, () => formatInputValue());
25073
24947
  vue.onMounted(() => {
25074
24948
  clampModel();
25075
24949
  });
@@ -25163,6 +25037,11 @@
25163
25037
  e.stopPropagation();
25164
25038
  holdStart('down');
25165
25039
  }
25040
+ function onControlPointerCancel(e) {
25041
+ const el = e.currentTarget;
25042
+ el?.releasePointerCapture(e.pointerId);
25043
+ holdStop();
25044
+ }
25166
25045
  function clampModel() {
25167
25046
  if (controlsDisabled.value) return;
25168
25047
  if (!vTextFieldRef.value) return;
@@ -25179,7 +25058,7 @@
25179
25058
  inputText.value = null;
25180
25059
  return;
25181
25060
  }
25182
- inputText.value = correctPrecision(model.value);
25061
+ inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25183
25062
  }
25184
25063
  function trimDecimalZeros() {
25185
25064
  if (controlsDisabled.value) return;
@@ -25214,8 +25093,8 @@
25214
25093
  "onClick": onControlClick,
25215
25094
  "onPointerdown": onUpControlMousedown,
25216
25095
  "onPointerup": onControlMouseup,
25096
+ "onPointercancel": onControlPointerCancel,
25217
25097
  "size": controlNodeSize.value,
25218
- "style": "touch-action: none",
25219
25098
  "tabindex": "-1"
25220
25099
  }, null) : vue.createVNode(VDefaultsProvider, {
25221
25100
  "key": "increment-defaults",
@@ -25244,8 +25123,8 @@
25244
25123
  "onClick": onControlClick,
25245
25124
  "onPointerdown": onDownControlMousedown,
25246
25125
  "onPointerup": onControlMouseup,
25126
+ "onPointercancel": onControlPointerCancel,
25247
25127
  "size": controlNodeSize.value,
25248
- "style": "touch-action: none",
25249
25128
  "tabindex": "-1"
25250
25129
  }, null) : vue.createVNode(VDefaultsProvider, {
25251
25130
  "key": "decrement-defaults",
@@ -25439,10 +25318,9 @@
25439
25318
  e.preventDefault();
25440
25319
  e.stopPropagation();
25441
25320
  const clipboardText = e?.clipboardData?.getData('Text').slice(0, length.value) ?? '';
25442
- const finalIndex = clipboardText.length - 1 === -1 ? index : clipboardText.length - 1;
25443
25321
  if (isValidNumber(clipboardText)) return;
25444
25322
  model.value = clipboardText.split('');
25445
- inputRef.value?.[finalIndex].focus();
25323
+ inputRef.value?.[index].blur();
25446
25324
  }
25447
25325
  function reset() {
25448
25326
  model.value = [];
@@ -30149,6 +30027,11 @@
30149
30027
  hideOverlay: Boolean,
30150
30028
  icon: [String, Function, Object],
30151
30029
  iconColor: String,
30030
+ iconSize: [Number, String],
30031
+ iconSizes: {
30032
+ type: Array,
30033
+ default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
30034
+ },
30152
30035
  loading: Boolean,
30153
30036
  opacity: [Number, String],
30154
30037
  readonly: Boolean,
@@ -30168,7 +30051,6 @@
30168
30051
  ...makeBorderProps(),
30169
30052
  ...makeComponentProps(),
30170
30053
  ...makeElevationProps(),
30171
- ...makeIconSizeProps(),
30172
30054
  ...makeRoundedProps(),
30173
30055
  ...makeTagProps({
30174
30056
  tag: 'button'
@@ -30223,6 +30105,7 @@
30223
30105
  })()
30224
30106
  }));
30225
30107
  const btnSizeMap = new Map(props.sizes);
30108
+ const iconSizeMap = new Map(props.iconSizes);
30226
30109
  function onClick() {
30227
30110
  if (props.disabled || props.readonly || isActive.value === undefined || props.tag === 'a' && attrs.href) return;
30228
30111
  isActive.value = !isActive.value;
@@ -30234,12 +30117,12 @@
30234
30117
  const btnSize = hasNamedSize ? btnSizeMap.get(_btnSize) : _btnSize;
30235
30118
  const btnHeight = props.height ?? btnSize;
30236
30119
  const btnWidth = props.width ?? btnSize;
30237
- const {
30238
- iconSize
30239
- } = useIconSizes(props, () => new Map(props.iconSizes).get(_btnSize));
30120
+ const _iconSize = props.iconSize;
30121
+ const hasNamedIconSize = iconSizeMap.has(_iconSize);
30122
+ const iconSize = !_iconSize ? hasNamedSize ? iconSizeMap.get(_btnSize) : iconSizeMap.get('default') : hasNamedIconSize ? iconSizeMap.get(_iconSize) : _iconSize;
30240
30123
  const iconProps = {
30241
30124
  icon,
30242
- size: iconSize.value,
30125
+ size: iconSize,
30243
30126
  iconColor: props.iconColor,
30244
30127
  opacity: props.opacity
30245
30128
  };
@@ -30282,7 +30165,7 @@
30282
30165
  "color": typeof props.loading === 'boolean' ? undefined : props.loading,
30283
30166
  "indeterminate": "disable-shrink",
30284
30167
  "width": "2",
30285
- "size": iconSize.value
30168
+ "size": iconSize
30286
30169
  }, null)])]
30287
30170
  });
30288
30171
  });
@@ -32192,7 +32075,7 @@
32192
32075
  };
32193
32076
  });
32194
32077
  }
32195
- const version$1 = "3.8.7-dev.2025-05-27";
32078
+ const version$1 = "3.8.7-master.2025-05-29";
32196
32079
  createVuetify$1.version = version$1;
32197
32080
 
32198
32081
  // Vue's inject() can only be used in setup
@@ -32490,7 +32373,7 @@
32490
32373
 
32491
32374
  /* eslint-disable local-rules/sort-imports */
32492
32375
 
32493
- const version = "3.8.7-dev.2025-05-27";
32376
+ const version = "3.8.7-master.2025-05-29";
32494
32377
 
32495
32378
  /* eslint-disable local-rules/sort-imports */
32496
32379