@vuetify/nightly 3.8.6-dev.2025-05-21 → 3.8.6-master.2025-05-22

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 (117) hide show
  1. package/CHANGELOG.md +10 -21
  2. package/dist/json/attributes.json +3598 -3634
  3. package/dist/json/importMap-labs.json +24 -24
  4. package/dist/json/importMap.json +184 -184
  5. package/dist/json/tags.json +0 -9
  6. package/dist/json/web-types.json +6522 -6697
  7. package/dist/vuetify-labs.cjs +223 -323
  8. package/dist/vuetify-labs.css +4050 -4078
  9. package/dist/vuetify-labs.d.ts +1350 -1508
  10. package/dist/vuetify-labs.esm.js +224 -324
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +223 -323
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +212 -317
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +3022 -3050
  17. package/dist/vuetify.d.ts +517 -667
  18. package/dist/vuetify.esm.js +213 -318
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +212 -317
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1195 -1200
  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 +9 -14
  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 -120
  31. package/lib/components/VAutocomplete/VAutocomplete.js +1 -18
  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/VCombobox/VCombobox.d.ts +96 -120
  41. package/lib/components/VCombobox/VCombobox.js +1 -19
  42. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  43. package/lib/components/VDatePicker/VDatePicker.d.ts +0 -10
  44. package/lib/components/VDatePicker/VDatePickerMonth.d.ts +0 -10
  45. package/lib/components/VDatePicker/VDatePickerMonth.js +1 -1
  46. package/lib/components/VDatePicker/VDatePickerMonth.js.map +1 -1
  47. package/lib/components/VField/VField.d.ts +3 -3
  48. package/lib/components/VFileInput/VFileInput.d.ts +15 -15
  49. package/lib/components/VInput/VInput.d.ts +4 -4
  50. package/lib/components/VList/VListChildren.js.map +1 -1
  51. package/lib/components/VNavigationDrawer/touch.js +2 -4
  52. package/lib/components/VNavigationDrawer/touch.js.map +1 -1
  53. package/lib/components/VNumberInput/VNumberInput.d.ts +89 -103
  54. package/lib/components/VNumberInput/VNumberInput.js +22 -29
  55. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  56. package/lib/components/VOverlay/VOverlay.css +1 -1
  57. package/lib/components/VOverlay/_variables.scss +1 -1
  58. package/lib/components/VOverlay/locationStrategies.js +16 -8
  59. package/lib/components/VOverlay/locationStrategies.js.map +1 -1
  60. package/lib/components/VProgressCircular/VProgressCircular.js +2 -2
  61. package/lib/components/VProgressCircular/VProgressCircular.js.map +1 -1
  62. package/lib/components/VRadioGroup/VRadioGroup.d.ts +3 -3
  63. package/lib/components/VRangeSlider/VRangeSlider.d.ts +3 -3
  64. package/lib/components/VSelect/VSelect.d.ts +96 -120
  65. package/lib/components/VSelect/VSelect.js +37 -25
  66. package/lib/components/VSelect/VSelect.js.map +1 -1
  67. package/lib/components/VSlider/VSlider.d.ts +3 -3
  68. package/lib/components/VSlider/slider.js +1 -1
  69. package/lib/components/VSlider/slider.js.map +1 -1
  70. package/lib/components/VSwitch/VSwitch.d.ts +3 -3
  71. package/lib/components/VTextField/VTextField.d.ts +27 -27
  72. package/lib/components/VTextarea/VTextarea.d.ts +15 -15
  73. package/lib/composables/calendar.d.ts +0 -6
  74. package/lib/composables/calendar.js +1 -2
  75. package/lib/composables/calendar.js.map +1 -1
  76. package/lib/composables/date/DateAdapter.d.ts +1 -1
  77. package/lib/composables/date/DateAdapter.js.map +1 -1
  78. package/lib/composables/date/adapters/vuetify.d.ts +1 -1
  79. package/lib/composables/date/adapters/vuetify.js +4 -4
  80. package/lib/composables/date/adapters/vuetify.js.map +1 -1
  81. package/lib/composables/date/date.d.ts +1 -1
  82. package/lib/composables/date/index.d.ts +0 -1
  83. package/lib/composables/date/index.js +0 -1
  84. package/lib/composables/date/index.js.map +1 -1
  85. package/lib/composables/filter.js +0 -3
  86. package/lib/composables/filter.js.map +1 -1
  87. package/lib/composables/goto.js +1 -1
  88. package/lib/composables/goto.js.map +1 -1
  89. package/lib/composables/theme.d.ts +1 -6
  90. package/lib/composables/theme.js +26 -94
  91. package/lib/composables/theme.js.map +1 -1
  92. package/lib/composables/virtual.js +1 -6
  93. package/lib/composables/virtual.js.map +1 -1
  94. package/lib/entry-bundler.d.ts +1 -1
  95. package/lib/entry-bundler.js +1 -1
  96. package/lib/entry-bundler.js.map +1 -1
  97. package/lib/framework.d.ts +67 -72
  98. package/lib/framework.js +1 -1
  99. package/lib/framework.js.map +1 -1
  100. package/lib/labs/VCalendar/VCalendar.d.ts +0 -10
  101. package/lib/labs/VColorInput/VColorInput.d.ts +3 -3
  102. package/lib/labs/VDateInput/VDateInput.d.ts +87 -97
  103. package/lib/labs/VFileUpload/VFileUpload.d.ts +3 -3
  104. package/lib/labs/VIconBtn/VIconBtn.d.ts +29 -29
  105. package/lib/labs/VIconBtn/VIconBtn.js +11 -7
  106. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  107. package/lib/labs/entry-bundler.d.ts +1 -1
  108. package/lib/util/box.d.ts +1 -0
  109. package/lib/util/box.js +27 -0
  110. package/lib/util/box.js.map +1 -1
  111. package/lib/util/globals.d.ts +0 -1
  112. package/lib/util/globals.js +0 -1
  113. package/lib/util/globals.js.map +1 -1
  114. package/package.json +5 -7
  115. package/lib/composables/iconSizes.d.ts +0 -28
  116. package/lib/composables/iconSizes.js +0 -23
  117. package/lib/composables/iconSizes.js.map +0 -1
@@ -1,10 +1,10 @@
1
1
  /*!
2
- * Vuetify v3.8.6-dev.2025-05-21
2
+ * Vuetify v3.8.6-master.2025-05-22
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, createVNode, TransitionGroup, Transition, mergeProps, toRefs, toValue, isRef, onBeforeMount, nextTick, withDirectives, resolveDirective, vShow, onUpdated, Text, resolveDynamicComponent, toDisplayString, markRaw, Teleport, cloneVNode, createTextVNode, 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, createVNode, TransitionGroup, Transition, mergeProps, toRefs, toValue, isRef, onBeforeMount, nextTick, withDirectives, resolveDirective, vShow, onUpdated, Text, resolveDynamicComponent, toDisplayString, markRaw, Teleport, cloneVNode, createTextVNode, 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"); }
@@ -692,6 +691,33 @@ function getTargetBox(target) {
692
691
  return target.getBoundingClientRect();
693
692
  }
694
693
  }
694
+ function getElementBox(el) {
695
+ if (el === document.documentElement) {
696
+ if (!visualViewport) {
697
+ return new Box({
698
+ x: 0,
699
+ y: 0,
700
+ width: document.documentElement.clientWidth,
701
+ height: document.documentElement.clientHeight
702
+ });
703
+ } else {
704
+ return new Box({
705
+ x: visualViewport.scale > 1 ? 0 : visualViewport.offsetLeft,
706
+ y: visualViewport.scale > 1 ? 0 : visualViewport.offsetTop,
707
+ width: visualViewport.width * visualViewport.scale,
708
+ height: visualViewport.height * visualViewport.scale
709
+ });
710
+ }
711
+ } else {
712
+ const rect = el.getBoundingClientRect();
713
+ return new Box({
714
+ x: rect.x,
715
+ y: rect.y,
716
+ width: el.clientWidth,
717
+ height: el.clientHeight
718
+ });
719
+ }
720
+ }
695
721
 
696
722
  // Utilities
697
723
 
@@ -2296,7 +2322,6 @@ const makeThemeProps = propsFactory({
2296
2322
  function genDefaults$2() {
2297
2323
  return {
2298
2324
  defaultTheme: 'light',
2299
- prefix: 'v-',
2300
2325
  variations: {
2301
2326
  colors: [],
2302
2327
  lighten: 0,
@@ -2378,10 +2403,7 @@ function genDefaults$2() {
2378
2403
  }
2379
2404
  }
2380
2405
  },
2381
- stylesheetId: 'vuetify-theme-stylesheet',
2382
- scoped: false,
2383
- unimportant: false,
2384
- utilities: true
2406
+ stylesheetId: 'vuetify-theme-stylesheet'
2385
2407
  };
2386
2408
  }
2387
2409
  function parseThemeOptions() {
@@ -2404,21 +2426,21 @@ function parseThemeOptions() {
2404
2426
  function createCssClass(lines, selector, content, scope) {
2405
2427
  lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
2406
2428
  }
2407
- function genCssVariables(theme, prefix) {
2429
+ function genCssVariables(theme) {
2408
2430
  const lightOverlay = theme.dark ? 2 : 1;
2409
2431
  const darkOverlay = theme.dark ? 1 : 2;
2410
2432
  const variables = [];
2411
2433
  for (const [key, value] of Object.entries(theme.colors)) {
2412
2434
  const rgb = parseColor(value);
2413
- variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2435
+ variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2414
2436
  if (!key.startsWith('on-')) {
2415
- variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2437
+ variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2416
2438
  }
2417
2439
  }
2418
2440
  for (const [key, value] of Object.entries(theme.variables)) {
2419
2441
  const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
2420
2442
  const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
2421
- variables.push(`--${prefix}${key}: ${rgb ?? value}`);
2443
+ variables.push(`--v-${key}: ${rgb ?? value}`);
2422
2444
  }
2423
2445
  return variables;
2424
2446
  }
@@ -2462,8 +2484,7 @@ function getScopedSelector(selector, scope) {
2462
2484
  const scopeSelector = `:where(${scope})`;
2463
2485
  return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
2464
2486
  }
2465
- function upsertStyles(id, cspNonce, styles) {
2466
- const styleEl = getOrCreateStyleElement(id, cspNonce);
2487
+ function upsertStyles(styleEl, styles) {
2467
2488
  if (!styleEl) return;
2468
2489
  styleEl.innerHTML = styles;
2469
2490
  }
@@ -2483,17 +2504,8 @@ function getOrCreateStyleElement(id, cspNonce) {
2483
2504
  // Composables
2484
2505
  function createTheme(options) {
2485
2506
  const parsedOptions = parseThemeOptions(options);
2486
- const _name = shallowRef(parsedOptions.defaultTheme);
2507
+ const name = shallowRef(parsedOptions.defaultTheme);
2487
2508
  const themes = ref(parsedOptions.themes);
2488
- const systemName = shallowRef('light');
2489
- const name = computed({
2490
- get() {
2491
- return _name.value === 'system' ? systemName.value : _name.value;
2492
- },
2493
- set(val) {
2494
- _name.value = val;
2495
- }
2496
- });
2497
2509
  const computedThemes = computed(() => {
2498
2510
  const acc = {};
2499
2511
  for (const [name, original] of Object.entries(themes.value)) {
@@ -2514,49 +2526,28 @@ function createTheme(options) {
2514
2526
  const current = toRef(() => computedThemes.value[name.value]);
2515
2527
  const styles = computed(() => {
2516
2528
  const lines = [];
2517
- const important = parsedOptions.unimportant ? '' : ' !important';
2518
- const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
2519
2529
  if (current.value?.dark) {
2520
2530
  createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
2521
2531
  }
2522
- createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
2532
+ createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
2523
2533
  for (const [themeName, theme] of Object.entries(computedThemes.value)) {
2524
- createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
2525
- }
2526
- if (parsedOptions.utilities) {
2527
- const bgLines = [];
2528
- const fgLines = [];
2529
- const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
2530
- for (const key of colors) {
2531
- if (key.startsWith('on-')) {
2532
- createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
2533
- } else {
2534
- 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);
2535
- createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
2536
- createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
2537
- }
2534
+ createCssClass(lines, `.v-theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme)], parsedOptions.scope);
2535
+ }
2536
+ const bgLines = [];
2537
+ const fgLines = [];
2538
+ const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
2539
+ for (const key of colors) {
2540
+ if (key.startsWith('on-')) {
2541
+ createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
2542
+ } else {
2543
+ 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);
2544
+ createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
2545
+ createCssClass(fgLines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`], parsedOptions.scope);
2538
2546
  }
2539
- lines.push(...bgLines, ...fgLines);
2540
2547
  }
2548
+ lines.push(...bgLines, ...fgLines);
2541
2549
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
2542
2550
  });
2543
- const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
2544
- const themeNames = toRef(() => Object.keys(computedThemes.value));
2545
- if (SUPPORTS_MATCH_MEDIA) {
2546
- const media = window.matchMedia('(prefers-color-scheme: dark)');
2547
- function updateSystemName() {
2548
- systemName.value = media.matches ? 'dark' : 'light';
2549
- }
2550
- updateSystemName();
2551
- media.addEventListener('change', updateSystemName, {
2552
- passive: true
2553
- });
2554
- if (getCurrentScope()) {
2555
- onScopeDispose(() => {
2556
- media.removeEventListener('change', updateSystemName);
2557
- });
2558
- }
2559
- }
2560
2551
  function install(app) {
2561
2552
  if (parsedOptions.isDisabled) return;
2562
2553
  const head = app._context.provides.usehead;
@@ -2594,55 +2585,22 @@ function createTheme(options) {
2594
2585
  updateStyles();
2595
2586
  }
2596
2587
  function updateStyles() {
2597
- upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
2588
+ upsertStyles(getOrCreateStyleElement(parsedOptions.stylesheetId, parsedOptions.cspNonce), styles.value);
2598
2589
  }
2599
2590
  }
2600
2591
  }
2601
- function change(themeName) {
2602
- if (!themeNames.value.includes(themeName)) {
2603
- consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
2604
- return;
2605
- }
2606
- name.value = themeName;
2607
- }
2608
- function cycle() {
2609
- let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
2610
- const currentIndex = themeArray.indexOf(name.value);
2611
- const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
2612
- change(themeArray[nextIndex]);
2613
- }
2614
- function toggle() {
2615
- let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
2616
- cycle(themeArray);
2617
- }
2618
- const globalName = new Proxy(name, {
2619
- get(target, prop) {
2620
- return target[prop];
2621
- },
2622
- set(target, prop, val) {
2623
- if (prop === 'value') {
2624
- deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
2625
- }
2626
- // @ts-expect-error
2627
- target[prop] = val;
2628
- return true;
2629
- }
2630
- });
2592
+ const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);
2631
2593
  return {
2632
2594
  install,
2633
- change,
2634
- cycle,
2635
- toggle,
2636
2595
  isDisabled: parsedOptions.isDisabled,
2637
2596
  name,
2638
2597
  themes,
2639
2598
  current,
2640
2599
  computedThemes,
2641
- prefix: parsedOptions.prefix,
2642
2600
  themeClasses,
2643
2601
  styles,
2644
2602
  global: {
2645
- name: globalName,
2603
+ name,
2646
2604
  current
2647
2605
  }
2648
2606
  };
@@ -2653,7 +2611,7 @@ function provideTheme(props) {
2653
2611
  if (!theme) throw new Error('Could not find Vuetify theme injection');
2654
2612
  const name = toRef(() => props.theme ?? theme.name.value);
2655
2613
  const current = toRef(() => theme.themes.value[name.value]);
2656
- const themeClasses = toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
2614
+ const themeClasses = toRef(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);
2657
2615
  const newTheme = {
2658
2616
  ...theme,
2659
2617
  name,
@@ -4200,15 +4158,9 @@ function useVariant(props) {
4200
4158
  };
4201
4159
  }
4202
4160
 
4203
- // Types
4204
-
4205
4161
  const makeVBtnGroupProps = propsFactory({
4206
4162
  baseColor: String,
4207
4163
  divided: Boolean,
4208
- direction: {
4209
- type: String,
4210
- default: 'horizontal'
4211
- },
4212
4164
  ...makeBorderProps(),
4213
4165
  ...makeComponentProps(),
4214
4166
  ...makeDensityProps(),
@@ -4242,7 +4194,7 @@ const VBtnGroup = genericComponent()({
4242
4194
  } = useRounded(props);
4243
4195
  provideDefaults({
4244
4196
  VBtn: {
4245
- height: toRef(() => props.direction === 'horizontal' ? 'auto' : null),
4197
+ height: 'auto',
4246
4198
  baseColor: toRef(() => props.baseColor),
4247
4199
  color: toRef(() => props.color),
4248
4200
  density: toRef(() => props.density),
@@ -4252,7 +4204,7 @@ const VBtnGroup = genericComponent()({
4252
4204
  });
4253
4205
  useRender(() => {
4254
4206
  return createVNode(props.tag, {
4255
- "class": ['v-btn-group', `v-btn-group--${props.direction}`, {
4207
+ "class": ['v-btn-group', {
4256
4208
  'v-btn-group--divided': props.divided
4257
4209
  }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class],
4258
4210
  "style": props.style
@@ -4930,7 +4882,7 @@ const VProgressCircular = genericComponent()({
4930
4882
  resizeRef,
4931
4883
  contentRect
4932
4884
  } = useResizeObserver();
4933
- const normalizedValue = toRef(() => Math.max(0, Math.min(100, parseFloat(props.modelValue))));
4885
+ const normalizedValue = toRef(() => clamp(parseFloat(props.modelValue), 0, 100));
4934
4886
  const width = toRef(() => Number(props.width));
4935
4887
  const size = toRef(() => {
4936
4888
  // Get size from element if size prop value is small, large etc
@@ -5940,31 +5892,6 @@ const VAppBarTitle = genericComponent()({
5940
5892
  // Utilities
5941
5893
  const VAlertTitle = createSimpleFunctional('v-alert-title');
5942
5894
 
5943
- // Utilities
5944
-
5945
- // Types
5946
-
5947
- // Types
5948
-
5949
- // Composables
5950
- const makeIconSizeProps = propsFactory({
5951
- iconSize: [Number, String],
5952
- iconSizes: {
5953
- type: Array,
5954
- default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
5955
- }
5956
- }, 'iconSize');
5957
- function useIconSizes(props, fallback) {
5958
- const iconSize = computed(() => {
5959
- const iconSizeMap = new Map(props.iconSizes);
5960
- const _iconSize = props.iconSize ?? fallback() ?? 'default';
5961
- return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
5962
- });
5963
- return {
5964
- iconSize
5965
- };
5966
- }
5967
-
5968
5895
  // Types
5969
5896
 
5970
5897
  const allowedTypes = ['success', 'info', 'warning', 'error'];
@@ -6004,7 +5931,6 @@ const makeVAlertProps = propsFactory({
6004
5931
  ...makeDensityProps(),
6005
5932
  ...makeDimensionProps(),
6006
5933
  ...makeElevationProps(),
6007
- ...makeIconSizeProps(),
6008
5934
  ...makeLocationProps(),
6009
5935
  ...makePositionProps(),
6010
5936
  ...makeRoundedProps(),
@@ -6032,9 +5958,6 @@ const VAlert = genericComponent()({
6032
5958
  if (!props.type) return props.icon;
6033
5959
  return props.icon ?? `$${props.type}`;
6034
5960
  });
6035
- const {
6036
- iconSize
6037
- } = useIconSizes(props, () => props.prominent ? 44 : 28);
6038
5961
  const {
6039
5962
  themeClasses
6040
5963
  } = provideTheme(props);
@@ -6082,11 +6005,6 @@ const VAlert = genericComponent()({
6082
6005
  const hasPrepend = !!(slots.prepend || icon.value);
6083
6006
  const hasTitle = !!(slots.title || props.title);
6084
6007
  const hasClose = !!(slots.close || props.closable);
6085
- const iconProps = {
6086
- density: props.density,
6087
- icon: icon.value,
6088
- size: iconSize.value
6089
- };
6090
6008
  return isActive.value && createVNode(props.tag, {
6091
6009
  "class": ['v-alert', props.border && {
6092
6010
  'v-alert--border': !!props.border,
@@ -6104,14 +6022,19 @@ const VAlert = genericComponent()({
6104
6022
  }, null), hasPrepend && createVNode("div", {
6105
6023
  "key": "prepend",
6106
6024
  "class": "v-alert__prepend"
6107
- }, [!slots.prepend ? createVNode(VIcon, mergeProps({
6108
- "key": "prepend-icon"
6109
- }, iconProps), null) : createVNode(VDefaultsProvider, {
6025
+ }, [!slots.prepend ? createVNode(VIcon, {
6026
+ "key": "prepend-icon",
6027
+ "density": props.density,
6028
+ "icon": icon.value,
6029
+ "size": props.prominent ? 44 : 28
6030
+ }, null) : createVNode(VDefaultsProvider, {
6110
6031
  "key": "prepend-defaults",
6111
6032
  "disabled": !icon.value,
6112
6033
  "defaults": {
6113
6034
  VIcon: {
6114
- ...iconProps
6035
+ density: props.density,
6036
+ icon: icon.value,
6037
+ size: props.prominent ? 44 : 28
6115
6038
  }
6116
6039
  }
6117
6040
  }, slots.prepend)]), createVNode("div", {
@@ -7566,7 +7489,7 @@ function clampTarget(container, value, rtl, horizontal) {
7566
7489
  min = 0;
7567
7490
  max = scrollHeight + -containerHeight;
7568
7491
  }
7569
- return Math.max(Math.min(value, max), min);
7492
+ return clamp(value, min, max);
7570
7493
  }
7571
7494
 
7572
7495
  function calculateUpdatedTarget(_ref) {
@@ -8309,68 +8232,6 @@ const VChip = genericComponent()({
8309
8232
  }
8310
8233
  });
8311
8234
 
8312
- const makeVDividerProps = propsFactory({
8313
- color: String,
8314
- inset: Boolean,
8315
- length: [Number, String],
8316
- opacity: [Number, String],
8317
- thickness: [Number, String],
8318
- vertical: Boolean,
8319
- ...makeComponentProps(),
8320
- ...makeThemeProps()
8321
- }, 'VDivider');
8322
- const VDivider = genericComponent()({
8323
- name: 'VDivider',
8324
- props: makeVDividerProps(),
8325
- setup(props, _ref) {
8326
- let {
8327
- attrs,
8328
- slots
8329
- } = _ref;
8330
- const {
8331
- themeClasses
8332
- } = provideTheme(props);
8333
- const {
8334
- textColorClasses,
8335
- textColorStyles
8336
- } = useTextColor(() => props.color);
8337
- const dividerStyles = computed(() => {
8338
- const styles = {};
8339
- if (props.length) {
8340
- styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
8341
- }
8342
- if (props.thickness) {
8343
- styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
8344
- }
8345
- return styles;
8346
- });
8347
- useRender(() => {
8348
- const divider = createVNode("hr", {
8349
- "class": [{
8350
- 'v-divider': true,
8351
- 'v-divider--inset': props.inset,
8352
- 'v-divider--vertical': props.vertical
8353
- }, themeClasses.value, textColorClasses.value, props.class],
8354
- "style": [dividerStyles.value, textColorStyles.value, {
8355
- '--v-border-opacity': props.opacity
8356
- }, props.style],
8357
- "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
8358
- "role": `${attrs.role || 'separator'}`
8359
- }, null);
8360
- if (!slots.default) return divider;
8361
- return createVNode("div", {
8362
- "class": ['v-divider__wrapper', {
8363
- 'v-divider__wrapper--vertical': props.vertical,
8364
- 'v-divider__wrapper--inset': props.inset
8365
- }]
8366
- }, [divider, createVNode("div", {
8367
- "class": "v-divider__content"
8368
- }, [slots.default()]), divider]);
8369
- });
8370
- return {};
8371
- }
8372
- });
8373
-
8374
8235
  // Utilities
8375
8236
 
8376
8237
  // List
@@ -9522,6 +9383,68 @@ const VListSubheader = genericComponent()({
9522
9383
  }
9523
9384
  });
9524
9385
 
9386
+ const makeVDividerProps = propsFactory({
9387
+ color: String,
9388
+ inset: Boolean,
9389
+ length: [Number, String],
9390
+ opacity: [Number, String],
9391
+ thickness: [Number, String],
9392
+ vertical: Boolean,
9393
+ ...makeComponentProps(),
9394
+ ...makeThemeProps()
9395
+ }, 'VDivider');
9396
+ const VDivider = genericComponent()({
9397
+ name: 'VDivider',
9398
+ props: makeVDividerProps(),
9399
+ setup(props, _ref) {
9400
+ let {
9401
+ attrs,
9402
+ slots
9403
+ } = _ref;
9404
+ const {
9405
+ themeClasses
9406
+ } = provideTheme(props);
9407
+ const {
9408
+ textColorClasses,
9409
+ textColorStyles
9410
+ } = useTextColor(() => props.color);
9411
+ const dividerStyles = computed(() => {
9412
+ const styles = {};
9413
+ if (props.length) {
9414
+ styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
9415
+ }
9416
+ if (props.thickness) {
9417
+ styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
9418
+ }
9419
+ return styles;
9420
+ });
9421
+ useRender(() => {
9422
+ const divider = createVNode("hr", {
9423
+ "class": [{
9424
+ 'v-divider': true,
9425
+ 'v-divider--inset': props.inset,
9426
+ 'v-divider--vertical': props.vertical
9427
+ }, themeClasses.value, textColorClasses.value, props.class],
9428
+ "style": [dividerStyles.value, textColorStyles.value, {
9429
+ '--v-border-opacity': props.opacity
9430
+ }, props.style],
9431
+ "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
9432
+ "role": `${attrs.role || 'separator'}`
9433
+ }, null);
9434
+ if (!slots.default) return divider;
9435
+ return createVNode("div", {
9436
+ "class": ['v-divider__wrapper', {
9437
+ 'v-divider__wrapper--vertical': props.vertical,
9438
+ 'v-divider__wrapper--inset': props.inset
9439
+ }]
9440
+ }, [divider, createVNode("div", {
9441
+ "class": "v-divider__content"
9442
+ }, [slots.default()]), divider]);
9443
+ });
9444
+ return {};
9445
+ }
9446
+ });
9447
+
9525
9448
  // Types
9526
9449
 
9527
9450
  const makeVListChildrenProps = propsFactory({
@@ -10100,11 +10023,19 @@ function useLocationStrategies(props, data) {
10100
10023
  watch(() => props.locationStrategy, reset);
10101
10024
  onScopeDispose(() => {
10102
10025
  window.removeEventListener('resize', onResize);
10026
+ visualViewport?.removeEventListener('resize', onVisualResize);
10027
+ visualViewport?.removeEventListener('scroll', onVisualScroll);
10103
10028
  updateLocation.value = undefined;
10104
10029
  });
10105
10030
  window.addEventListener('resize', onResize, {
10106
10031
  passive: true
10107
10032
  });
10033
+ visualViewport?.addEventListener('resize', onVisualResize, {
10034
+ passive: true
10035
+ });
10036
+ visualViewport?.addEventListener('scroll', onVisualScroll, {
10037
+ passive: true
10038
+ });
10108
10039
  if (typeof props.locationStrategy === 'function') {
10109
10040
  updateLocation.value = props.locationStrategy(data, props, contentStyles)?.updateLocation;
10110
10041
  } else {
@@ -10115,6 +10046,12 @@ function useLocationStrategies(props, data) {
10115
10046
  function onResize(e) {
10116
10047
  updateLocation.value?.(e);
10117
10048
  }
10049
+ function onVisualResize(e) {
10050
+ updateLocation.value?.(e);
10051
+ }
10052
+ function onVisualScroll(e) {
10053
+ updateLocation.value?.(e);
10054
+ }
10118
10055
  return {
10119
10056
  contentStyles,
10120
10057
  updateLocation
@@ -10266,13 +10203,7 @@ function connectedLocationStrategy(data, props, contentStyles) {
10266
10203
  }
10267
10204
  }
10268
10205
  const viewport = scrollParents.reduce((box, el) => {
10269
- const rect = el.getBoundingClientRect();
10270
- const scrollBox = new Box({
10271
- x: el === document.documentElement ? 0 : rect.x,
10272
- y: el === document.documentElement ? 0 : rect.y,
10273
- width: el.clientWidth,
10274
- height: el.clientHeight
10275
- });
10206
+ const scrollBox = getElementBox(el);
10276
10207
  if (box) {
10277
10208
  return new Box({
10278
10209
  x: Math.max(box.left, scrollBox.left),
@@ -12439,12 +12370,7 @@ function useVirtual(props, items) {
12439
12370
  }
12440
12371
  function calculateOffset(index) {
12441
12372
  index = clamp(index, 0, items.value.length - 1);
12442
- const whole = Math.floor(index);
12443
- const fraction = index % 1;
12444
- const next = whole + 1;
12445
- const wholeOffset = offsets[whole] || 0;
12446
- const nextOffset = offsets[next] || wholeOffset;
12447
- return wholeOffset + (nextOffset - wholeOffset) * fraction;
12373
+ return offsets[index] || 0;
12448
12374
  }
12449
12375
  function calculateIndex(scrollTop) {
12450
12376
  return binaryClosest(offsets, scrollTop);
@@ -12848,6 +12774,7 @@ const VSelect = genericComponent()({
12848
12774
  const selectedValues = computed(() => model.value.map(selection => selection.value));
12849
12775
  const isFocused = shallowRef(false);
12850
12776
  let keyboardLookupPrefix = '';
12777
+ let keyboardLookupIndex = -1;
12851
12778
  let keyboardLookupLastTime;
12852
12779
  const displayItems = computed(() => {
12853
12780
  if (props.hideSelected) {
@@ -12915,18 +12842,46 @@ const VSelect = genericComponent()({
12915
12842
  const now = performance.now();
12916
12843
  if (now - keyboardLookupLastTime > KEYBOARD_LOOKUP_THRESHOLD) {
12917
12844
  keyboardLookupPrefix = '';
12845
+ keyboardLookupIndex = -1;
12918
12846
  }
12919
12847
  keyboardLookupPrefix += e.key.toLowerCase();
12920
12848
  keyboardLookupLastTime = now;
12921
- const item = items.value.find(item => item.title.toLowerCase().startsWith(keyboardLookupPrefix));
12922
- if (item !== undefined) {
12923
- if (!props.multiple) {
12924
- model.value = [item];
12849
+ const items = displayItems.value;
12850
+ function findItem() {
12851
+ let result = findItemBase();
12852
+ if (result) return result;
12853
+ if (keyboardLookupPrefix.at(-1) === keyboardLookupPrefix.at(-2)) {
12854
+ // No matches but we have a repeated letter, try the next item with that prefix
12855
+ keyboardLookupPrefix = keyboardLookupPrefix.slice(0, -1);
12856
+ result = findItemBase();
12857
+ if (result) return result;
12925
12858
  }
12926
- const index = displayItems.value.indexOf(item);
12927
- if (~index && IN_BROWSER) {
12928
- listRef.value?.focus(index);
12859
+
12860
+ // Still nothing, wrap around to the top
12861
+ keyboardLookupIndex = -1;
12862
+ result = findItemBase();
12863
+ if (result) return result;
12864
+
12865
+ // Still nothing, try just the new letter
12866
+ keyboardLookupPrefix = e.key.toLowerCase();
12867
+ return findItemBase();
12868
+ }
12869
+ function findItemBase() {
12870
+ for (let i = keyboardLookupIndex + 1; i < items.length; i++) {
12871
+ const _item = items[i];
12872
+ if (_item.title.toLowerCase().startsWith(keyboardLookupPrefix)) {
12873
+ return [_item, i];
12874
+ }
12929
12875
  }
12876
+ return undefined;
12877
+ }
12878
+ const result = findItem();
12879
+ if (!result) return;
12880
+ const [item, index] = result;
12881
+ keyboardLookupIndex = index;
12882
+ listRef.value?.focus(index);
12883
+ if (!props.multiple) {
12884
+ model.value = [item];
12930
12885
  }
12931
12886
  }
12932
12887
 
@@ -13075,22 +13030,6 @@ const VSelect = genericComponent()({
13075
13030
  key: item.value,
13076
13031
  onClick: () => select(item, null)
13077
13032
  });
13078
- if (item.raw.type === 'divider') {
13079
- return slots.divider?.({
13080
- props: item.raw,
13081
- index
13082
- }) ?? createVNode(VDivider, mergeProps(item.props, {
13083
- "key": `divider-${index}`
13084
- }), null);
13085
- }
13086
- if (item.raw.type === 'subheader') {
13087
- return slots.subheader?.({
13088
- props: item.raw,
13089
- index
13090
- }) ?? createVNode(VListSubheader, mergeProps(item.props, {
13091
- "key": `subheader-${index}`
13092
- }), null);
13093
- }
13094
13033
  return slots.item?.({
13095
13034
  item,
13096
13035
  index,
@@ -13251,9 +13190,6 @@ function filterItems(items, query, options) {
13251
13190
  let match = -1;
13252
13191
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13253
13192
  if (typeof item === 'object') {
13254
- if (['divider', 'subheader'].includes(item.raw?.type)) {
13255
- continue;
13256
- }
13257
13193
  const filterKeys = keys || Object.keys(transformed);
13258
13194
  for (const key of filterKeys) {
13259
13195
  const value = getPropertyFromItem(transformed, key);
@@ -13692,22 +13628,6 @@ const VAutocomplete = genericComponent()({
13692
13628
  active: highlightFirst.value && index === 0 ? true : undefined,
13693
13629
  onClick: () => select(item, null)
13694
13630
  });
13695
- if (item.raw.type === 'divider') {
13696
- return slots.divider?.({
13697
- props: item.raw,
13698
- index
13699
- }) ?? createVNode(VDivider, mergeProps(item.props, {
13700
- "key": `divider-${index}`
13701
- }), null);
13702
- }
13703
- if (item.raw.type === 'subheader') {
13704
- return slots.subheader?.({
13705
- props: item.raw,
13706
- index
13707
- }) ?? createVNode(VListSubheader, mergeProps(item.props, {
13708
- "key": `subheader-${index}`
13709
- }), null);
13710
- }
13711
13631
  return slots.item?.({
13712
13632
  item,
13713
13633
  index,
@@ -16005,7 +15925,7 @@ const useSlider = _ref => {
16005
15925
  const clickOffset = getPosition(e, position);
16006
15926
 
16007
15927
  // It is possible for left to be NaN, force to number
16008
- let clickPos = Math.min(Math.max((clickOffset - trackStart - startOffset.value) / trackLength, 0), 1) || 0;
15928
+ let clickPos = clamp((clickOffset - trackStart - startOffset.value) / trackLength) || 0;
16009
15929
  if (vertical ? indexFromEnd.value : indexFromEnd.value !== isRtl.value) clickPos = 1 - clickPos;
16010
15930
  return roundValue(min.value + clickPos * (max.value - min.value));
16011
15931
  }
@@ -17303,13 +17223,13 @@ function date(value) {
17303
17223
  return null;
17304
17224
  }
17305
17225
  const sundayJanuarySecond2000 = new Date(2000, 0, 2);
17306
- function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
17226
+ function getWeekdays(locale, firstDayOfWeek) {
17307
17227
  const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
17308
17228
  return createRange(7).map(i => {
17309
17229
  const weekday = new Date(sundayJanuarySecond2000);
17310
17230
  weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
17311
17231
  return new Intl.DateTimeFormat(locale, {
17312
- weekday: weekdayFormat ?? 'narrow'
17232
+ weekday: 'narrow'
17313
17233
  }).format(weekday);
17314
17234
  });
17315
17235
  }
@@ -17773,9 +17693,9 @@ class VuetifyDateAdapter {
17773
17693
  getDiff(date, comparing, unit) {
17774
17694
  return getDiff(date, comparing, unit);
17775
17695
  }
17776
- getWeekdays(firstDayOfWeek, weekdayFormat) {
17696
+ getWeekdays(firstDayOfWeek) {
17777
17697
  const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
17778
- return getWeekdays(this.locale, firstDay, weekdayFormat);
17698
+ return getWeekdays(this.locale, firstDay);
17779
17699
  }
17780
17700
  getYear(date) {
17781
17701
  return getYear(date);
@@ -18118,7 +18038,6 @@ const VCombobox = genericComponent()({
18118
18038
  _search.value = val ?? '';
18119
18039
  if (!props.multiple && !hasSelectionSlot.value) {
18120
18040
  model.value = [transformItem$3(props, val)];
18121
- nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18122
18041
  }
18123
18042
  if (val && props.multiple && props.delimiters?.length) {
18124
18043
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18435,22 +18354,6 @@ const VCombobox = genericComponent()({
18435
18354
  active: highlightFirst.value && index === 0 ? true : undefined,
18436
18355
  onClick: () => select(item, null)
18437
18356
  });
18438
- if (item.raw.type === 'divider') {
18439
- return slots.divider?.({
18440
- props: item.raw,
18441
- index
18442
- }) ?? createVNode(VDivider, mergeProps(item.props, {
18443
- "key": `divider-${index}`
18444
- }), null);
18445
- }
18446
- if (item.raw.type === 'subheader') {
18447
- return slots.subheader?.({
18448
- props: item.raw,
18449
- index
18450
- }) ?? createVNode(VListSubheader, mergeProps(item.props, {
18451
- "key": `subheader-${index}`
18452
- }), null);
18453
- }
18454
18357
  return slots.item?.({
18455
18358
  item,
18456
18359
  index,
@@ -22094,8 +21997,7 @@ const makeCalendarProps = propsFactory({
22094
21997
  firstDayOfWeek: {
22095
21998
  type: [Number, String],
22096
21999
  default: undefined
22097
- },
22098
- weekdayFormat: String
22000
+ }
22099
22001
  }, 'calendar');
22100
22002
  function useCalendar(props) {
22101
22003
  const adapter = useDate();
@@ -22343,7 +22245,7 @@ const VDatePickerMonth = genericComponent()({
22343
22245
  "ref": daysRef,
22344
22246
  "key": daysInMonth.value[0].date?.toString(),
22345
22247
  "class": "v-date-picker-month__days"
22346
- }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => createVNode("div", {
22248
+ }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => createVNode("div", {
22347
22249
  "class": ['v-date-picker-month__day', 'v-date-picker-month__weekday']
22348
22250
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22349
22251
  const slotProps = {
@@ -24461,7 +24363,7 @@ function useTouch(_ref) {
24461
24363
  function getProgress(pos) {
24462
24364
  let limit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
24463
24365
  const progress = position.value === 'left' ? (pos - offset.value) / width.value : position.value === 'right' ? (document.documentElement.clientWidth - pos - offset.value) / width.value : position.value === 'top' ? (pos - offset.value) / width.value : position.value === 'bottom' ? (document.documentElement.clientHeight - pos - offset.value) / width.value : oops();
24464
- return limit ? Math.max(0, Math.min(1, progress)) : progress;
24366
+ return limit ? clamp(progress) : progress;
24465
24367
  }
24466
24368
  function onTouchstart(e) {
24467
24369
  if (touchless.value) return;
@@ -24874,10 +24776,6 @@ const makeVNumberInputProps = propsFactory({
24874
24776
  type: Number,
24875
24777
  default: 0
24876
24778
  },
24877
- minFractionDigits: {
24878
- type: Number,
24879
- default: null
24880
- },
24881
24779
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
24882
24780
  }, 'VNumberInput');
24883
24781
  const VNumberInput = genericComponent()({
@@ -24908,19 +24806,9 @@ const VNumberInput = genericComponent()({
24908
24806
  } = useFocus(props);
24909
24807
  function correctPrecision(val) {
24910
24808
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
24911
- if (precision == null) {
24912
- return String(val);
24913
- }
24914
- let fixed = val.toFixed(precision);
24915
- if (isFocused.value) {
24916
- return Number(fixed).toString(); // trim zeros
24917
- }
24918
- if ((props.minFractionDigits ?? precision) < precision) {
24919
- const trimLimit = precision - props.minFractionDigits;
24920
- const [baseDigits, fractionDigits] = fixed.split('.');
24921
- fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
24922
- }
24923
- return fixed;
24809
+ const fixed = precision == null ? String(val) : val.toFixed(precision);
24810
+ return isFocused.value ? Number(fixed).toString() // trim zeros
24811
+ : fixed;
24924
24812
  }
24925
24813
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
24926
24814
  const _inputText = shallowRef(null);
@@ -24960,6 +24848,9 @@ const VNumberInput = genericComponent()({
24960
24848
  const controlNodeDefaultHeight = toRef(() => controlVariant.value === 'stacked' ? 'auto' : '100%');
24961
24849
  const incrementSlotProps = {
24962
24850
  props: {
24851
+ style: {
24852
+ touchAction: 'none'
24853
+ },
24963
24854
  onClick: onControlClick,
24964
24855
  onPointerup: onControlMouseup,
24965
24856
  onPointerdown: onUpControlMousedown
@@ -24967,13 +24858,15 @@ const VNumberInput = genericComponent()({
24967
24858
  };
24968
24859
  const decrementSlotProps = {
24969
24860
  props: {
24861
+ style: {
24862
+ touchAction: 'none'
24863
+ },
24970
24864
  onClick: onControlClick,
24971
24865
  onPointerup: onControlMouseup,
24972
24866
  onPointerdown: onDownControlMousedown
24973
24867
  }
24974
24868
  };
24975
24869
  watch(() => props.precision, () => formatInputValue());
24976
- watch(() => props.minFractionDigits, () => formatInputValue());
24977
24870
  onMounted(() => {
24978
24871
  clampModel();
24979
24872
  });
@@ -25075,7 +24968,7 @@ const VNumberInput = genericComponent()({
25075
24968
  inputText.value = null;
25076
24969
  return;
25077
24970
  }
25078
- inputText.value = correctPrecision(model.value);
24971
+ inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25079
24972
  }
25080
24973
  function trimDecimalZeros() {
25081
24974
  if (controlsDisabled.value) return;
@@ -25100,17 +24993,18 @@ const VNumberInput = genericComponent()({
25100
24993
  } = VTextField.filterProps(props);
25101
24994
  function incrementControlNode() {
25102
24995
  return !slots.increment ? createVNode(VBtn, {
24996
+ "aria-hidden": "true",
24997
+ "data-testid": "increment",
25103
24998
  "disabled": !canIncrease.value,
25104
24999
  "flat": true,
25105
- "key": "increment-btn",
25106
25000
  "height": controlNodeDefaultHeight.value,
25107
- "data-testid": "increment",
25108
- "aria-hidden": "true",
25109
25001
  "icon": incrementIcon.value,
25002
+ "key": "increment-btn",
25110
25003
  "onClick": onControlClick,
25111
- "onPointerup": onControlMouseup,
25112
25004
  "onPointerdown": onUpControlMousedown,
25005
+ "onPointerup": onControlMouseup,
25113
25006
  "size": controlNodeSize.value,
25007
+ "style": "touch-action: none",
25114
25008
  "tabindex": "-1"
25115
25009
  }, null) : createVNode(VDefaultsProvider, {
25116
25010
  "key": "increment-defaults",
@@ -25129,18 +25023,19 @@ const VNumberInput = genericComponent()({
25129
25023
  }
25130
25024
  function decrementControlNode() {
25131
25025
  return !slots.decrement ? createVNode(VBtn, {
25026
+ "aria-hidden": "true",
25027
+ "data-testid": "decrement",
25132
25028
  "disabled": !canDecrease.value,
25133
25029
  "flat": true,
25134
- "key": "decrement-btn",
25135
25030
  "height": controlNodeDefaultHeight.value,
25136
- "data-testid": "decrement",
25137
- "aria-hidden": "true",
25138
25031
  "icon": decrementIcon.value,
25139
- "size": controlNodeSize.value,
25140
- "tabindex": "-1",
25032
+ "key": "decrement-btn",
25141
25033
  "onClick": onControlClick,
25034
+ "onPointerdown": onDownControlMousedown,
25142
25035
  "onPointerup": onControlMouseup,
25143
- "onPointerdown": onDownControlMousedown
25036
+ "size": controlNodeSize.value,
25037
+ "style": "touch-action: none",
25038
+ "tabindex": "-1"
25144
25039
  }, null) : createVNode(VDefaultsProvider, {
25145
25040
  "key": "decrement-defaults",
25146
25041
  "defaults": {
@@ -30042,6 +29937,11 @@ const makeVIconBtnProps = propsFactory({
30042
29937
  hideOverlay: Boolean,
30043
29938
  icon: [String, Function, Object],
30044
29939
  iconColor: String,
29940
+ iconSize: [Number, String],
29941
+ iconSizes: {
29942
+ type: Array,
29943
+ default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
29944
+ },
30045
29945
  loading: Boolean,
30046
29946
  opacity: [Number, String],
30047
29947
  readonly: Boolean,
@@ -30061,7 +29961,6 @@ const makeVIconBtnProps = propsFactory({
30061
29961
  ...makeBorderProps(),
30062
29962
  ...makeComponentProps(),
30063
29963
  ...makeElevationProps(),
30064
- ...makeIconSizeProps(),
30065
29964
  ...makeRoundedProps(),
30066
29965
  ...makeTagProps({
30067
29966
  tag: 'button'
@@ -30116,6 +30015,7 @@ const VIconBtn = genericComponent()({
30116
30015
  })()
30117
30016
  }));
30118
30017
  const btnSizeMap = new Map(props.sizes);
30018
+ const iconSizeMap = new Map(props.iconSizes);
30119
30019
  function onClick() {
30120
30020
  if (props.disabled || props.readonly || isActive.value === undefined || props.tag === 'a' && attrs.href) return;
30121
30021
  isActive.value = !isActive.value;
@@ -30127,12 +30027,12 @@ const VIconBtn = genericComponent()({
30127
30027
  const btnSize = hasNamedSize ? btnSizeMap.get(_btnSize) : _btnSize;
30128
30028
  const btnHeight = props.height ?? btnSize;
30129
30029
  const btnWidth = props.width ?? btnSize;
30130
- const {
30131
- iconSize
30132
- } = useIconSizes(props, () => new Map(props.iconSizes).get(_btnSize));
30030
+ const _iconSize = props.iconSize;
30031
+ const hasNamedIconSize = iconSizeMap.has(_iconSize);
30032
+ const iconSize = !_iconSize ? hasNamedSize ? iconSizeMap.get(_btnSize) : iconSizeMap.get('default') : hasNamedIconSize ? iconSizeMap.get(_iconSize) : _iconSize;
30133
30033
  const iconProps = {
30134
30034
  icon,
30135
- size: iconSize.value,
30035
+ size: iconSize,
30136
30036
  iconColor: props.iconColor,
30137
30037
  opacity: props.opacity
30138
30038
  };
@@ -30175,7 +30075,7 @@ const VIconBtn = genericComponent()({
30175
30075
  "color": typeof props.loading === 'boolean' ? undefined : props.loading,
30176
30076
  "indeterminate": "disable-shrink",
30177
30077
  "width": "2",
30178
- "size": iconSize.value
30078
+ "size": iconSize
30179
30079
  }, null)])]
30180
30080
  });
30181
30081
  });
@@ -32085,7 +31985,7 @@ function createVuetify$1() {
32085
31985
  };
32086
31986
  });
32087
31987
  }
32088
- const version$1 = "3.8.6-dev.2025-05-21";
31988
+ const version$1 = "3.8.6-master.2025-05-22";
32089
31989
  createVuetify$1.version = version$1;
32090
31990
 
32091
31991
  // Vue's inject() can only be used in setup
@@ -32383,7 +32283,7 @@ var index = /*#__PURE__*/Object.freeze({
32383
32283
 
32384
32284
  /* eslint-disable local-rules/sort-imports */
32385
32285
 
32386
- const version = "3.8.6-dev.2025-05-21";
32286
+ const version = "3.8.6-master.2025-05-22";
32387
32287
 
32388
32288
  /* eslint-disable local-rules/sort-imports */
32389
32289