@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,16 +1,15 @@
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, createVNode, mergeProps, toValue, onBeforeUnmount, watch, readonly, onMounted, useId, onDeactivated, onActivated, onScopeDispose, effectScope, toRaw, getCurrentScope, TransitionGroup, Transition, toRefs, 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, createVNode, mergeProps, toValue, onBeforeUnmount, watch, readonly, onMounted, useId, onDeactivated, onActivated, onScopeDispose, effectScope, toRaw, TransitionGroup, Transition, toRefs, 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
  const IN_BROWSER = typeof window !== 'undefined';
10
10
  const SUPPORTS_INTERSECTION = IN_BROWSER && 'IntersectionObserver' in window;
11
11
  const SUPPORTS_TOUCH = IN_BROWSER && ('ontouchstart' in window || window.navigator.maxTouchPoints > 0);
12
12
  const SUPPORTS_EYE_DROPPER = IN_BROWSER && 'EyeDropper' in window;
13
- const SUPPORTS_MATCH_MEDIA = IN_BROWSER && 'matchMedia' in window && typeof window.matchMedia === 'function';
14
13
 
15
14
  function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
16
15
  function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
@@ -615,6 +614,33 @@ function getTargetBox(target) {
615
614
  return target.getBoundingClientRect();
616
615
  }
617
616
  }
617
+ function getElementBox(el) {
618
+ if (el === document.documentElement) {
619
+ if (!visualViewport) {
620
+ return new Box({
621
+ x: 0,
622
+ y: 0,
623
+ width: document.documentElement.clientWidth,
624
+ height: document.documentElement.clientHeight
625
+ });
626
+ } else {
627
+ return new Box({
628
+ x: visualViewport.scale > 1 ? 0 : visualViewport.offsetLeft,
629
+ y: visualViewport.scale > 1 ? 0 : visualViewport.offsetTop,
630
+ width: visualViewport.width * visualViewport.scale,
631
+ height: visualViewport.height * visualViewport.scale
632
+ });
633
+ }
634
+ } else {
635
+ const rect = el.getBoundingClientRect();
636
+ return new Box({
637
+ x: rect.x,
638
+ y: rect.y,
639
+ width: el.clientWidth,
640
+ height: el.clientHeight
641
+ });
642
+ }
643
+ }
618
644
 
619
645
  // Utilities
620
646
 
@@ -2783,7 +2809,6 @@ const makeThemeProps = propsFactory({
2783
2809
  function genDefaults$1() {
2784
2810
  return {
2785
2811
  defaultTheme: 'light',
2786
- prefix: 'v-',
2787
2812
  variations: {
2788
2813
  colors: [],
2789
2814
  lighten: 0,
@@ -2865,10 +2890,7 @@ function genDefaults$1() {
2865
2890
  }
2866
2891
  }
2867
2892
  },
2868
- stylesheetId: 'vuetify-theme-stylesheet',
2869
- scoped: false,
2870
- unimportant: false,
2871
- utilities: true
2893
+ stylesheetId: 'vuetify-theme-stylesheet'
2872
2894
  };
2873
2895
  }
2874
2896
  function parseThemeOptions() {
@@ -2891,21 +2913,21 @@ function parseThemeOptions() {
2891
2913
  function createCssClass(lines, selector, content, scope) {
2892
2914
  lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
2893
2915
  }
2894
- function genCssVariables(theme, prefix) {
2916
+ function genCssVariables(theme) {
2895
2917
  const lightOverlay = theme.dark ? 2 : 1;
2896
2918
  const darkOverlay = theme.dark ? 1 : 2;
2897
2919
  const variables = [];
2898
2920
  for (const [key, value] of Object.entries(theme.colors)) {
2899
2921
  const rgb = parseColor(value);
2900
- variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2922
+ variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2901
2923
  if (!key.startsWith('on-')) {
2902
- variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2924
+ variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2903
2925
  }
2904
2926
  }
2905
2927
  for (const [key, value] of Object.entries(theme.variables)) {
2906
2928
  const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
2907
2929
  const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
2908
- variables.push(`--${prefix}${key}: ${rgb ?? value}`);
2930
+ variables.push(`--v-${key}: ${rgb ?? value}`);
2909
2931
  }
2910
2932
  return variables;
2911
2933
  }
@@ -2949,8 +2971,7 @@ function getScopedSelector(selector, scope) {
2949
2971
  const scopeSelector = `:where(${scope})`;
2950
2972
  return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
2951
2973
  }
2952
- function upsertStyles(id, cspNonce, styles) {
2953
- const styleEl = getOrCreateStyleElement(id, cspNonce);
2974
+ function upsertStyles(styleEl, styles) {
2954
2975
  if (!styleEl) return;
2955
2976
  styleEl.innerHTML = styles;
2956
2977
  }
@@ -2970,17 +2991,8 @@ function getOrCreateStyleElement(id, cspNonce) {
2970
2991
  // Composables
2971
2992
  function createTheme(options) {
2972
2993
  const parsedOptions = parseThemeOptions(options);
2973
- const _name = shallowRef(parsedOptions.defaultTheme);
2994
+ const name = shallowRef(parsedOptions.defaultTheme);
2974
2995
  const themes = ref(parsedOptions.themes);
2975
- const systemName = shallowRef('light');
2976
- const name = computed({
2977
- get() {
2978
- return _name.value === 'system' ? systemName.value : _name.value;
2979
- },
2980
- set(val) {
2981
- _name.value = val;
2982
- }
2983
- });
2984
2996
  const computedThemes = computed(() => {
2985
2997
  const acc = {};
2986
2998
  for (const [name, original] of Object.entries(themes.value)) {
@@ -3001,49 +3013,28 @@ function createTheme(options) {
3001
3013
  const current = toRef(() => computedThemes.value[name.value]);
3002
3014
  const styles = computed(() => {
3003
3015
  const lines = [];
3004
- const important = parsedOptions.unimportant ? '' : ' !important';
3005
- const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
3006
3016
  if (current.value?.dark) {
3007
3017
  createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
3008
3018
  }
3009
- createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
3019
+ createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
3010
3020
  for (const [themeName, theme] of Object.entries(computedThemes.value)) {
3011
- createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
3012
- }
3013
- if (parsedOptions.utilities) {
3014
- const bgLines = [];
3015
- const fgLines = [];
3016
- const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
3017
- for (const key of colors) {
3018
- if (key.startsWith('on-')) {
3019
- createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
3020
- } else {
3021
- 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);
3022
- createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
3023
- createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
3024
- }
3021
+ createCssClass(lines, `.v-theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme)], parsedOptions.scope);
3022
+ }
3023
+ const bgLines = [];
3024
+ const fgLines = [];
3025
+ const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
3026
+ for (const key of colors) {
3027
+ if (key.startsWith('on-')) {
3028
+ createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
3029
+ } else {
3030
+ 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);
3031
+ createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
3032
+ createCssClass(fgLines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`], parsedOptions.scope);
3025
3033
  }
3026
- lines.push(...bgLines, ...fgLines);
3027
3034
  }
3035
+ lines.push(...bgLines, ...fgLines);
3028
3036
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
3029
3037
  });
3030
- const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
3031
- const themeNames = toRef(() => Object.keys(computedThemes.value));
3032
- if (SUPPORTS_MATCH_MEDIA) {
3033
- const media = window.matchMedia('(prefers-color-scheme: dark)');
3034
- function updateSystemName() {
3035
- systemName.value = media.matches ? 'dark' : 'light';
3036
- }
3037
- updateSystemName();
3038
- media.addEventListener('change', updateSystemName, {
3039
- passive: true
3040
- });
3041
- if (getCurrentScope()) {
3042
- onScopeDispose(() => {
3043
- media.removeEventListener('change', updateSystemName);
3044
- });
3045
- }
3046
- }
3047
3038
  function install(app) {
3048
3039
  if (parsedOptions.isDisabled) return;
3049
3040
  const head = app._context.provides.usehead;
@@ -3081,55 +3072,22 @@ function createTheme(options) {
3081
3072
  updateStyles();
3082
3073
  }
3083
3074
  function updateStyles() {
3084
- upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
3075
+ upsertStyles(getOrCreateStyleElement(parsedOptions.stylesheetId, parsedOptions.cspNonce), styles.value);
3085
3076
  }
3086
3077
  }
3087
3078
  }
3088
- function change(themeName) {
3089
- if (!themeNames.value.includes(themeName)) {
3090
- consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
3091
- return;
3092
- }
3093
- name.value = themeName;
3094
- }
3095
- function cycle() {
3096
- let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
3097
- const currentIndex = themeArray.indexOf(name.value);
3098
- const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
3099
- change(themeArray[nextIndex]);
3100
- }
3101
- function toggle() {
3102
- let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
3103
- cycle(themeArray);
3104
- }
3105
- const globalName = new Proxy(name, {
3106
- get(target, prop) {
3107
- return target[prop];
3108
- },
3109
- set(target, prop, val) {
3110
- if (prop === 'value') {
3111
- deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
3112
- }
3113
- // @ts-expect-error
3114
- target[prop] = val;
3115
- return true;
3116
- }
3117
- });
3079
+ const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);
3118
3080
  return {
3119
3081
  install,
3120
- change,
3121
- cycle,
3122
- toggle,
3123
3082
  isDisabled: parsedOptions.isDisabled,
3124
3083
  name,
3125
3084
  themes,
3126
3085
  current,
3127
3086
  computedThemes,
3128
- prefix: parsedOptions.prefix,
3129
3087
  themeClasses,
3130
3088
  styles,
3131
3089
  global: {
3132
- name: globalName,
3090
+ name,
3133
3091
  current
3134
3092
  }
3135
3093
  };
@@ -3140,7 +3098,7 @@ function provideTheme(props) {
3140
3098
  if (!theme) throw new Error('Could not find Vuetify theme injection');
3141
3099
  const name = toRef(() => props.theme ?? theme.name.value);
3142
3100
  const current = toRef(() => theme.themes.value[name.value]);
3143
- const themeClasses = toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
3101
+ const themeClasses = toRef(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);
3144
3102
  const newTheme = {
3145
3103
  ...theme,
3146
3104
  name,
@@ -4687,15 +4645,9 @@ function useVariant(props) {
4687
4645
  };
4688
4646
  }
4689
4647
 
4690
- // Types
4691
-
4692
4648
  const makeVBtnGroupProps = propsFactory({
4693
4649
  baseColor: String,
4694
4650
  divided: Boolean,
4695
- direction: {
4696
- type: String,
4697
- default: 'horizontal'
4698
- },
4699
4651
  ...makeBorderProps(),
4700
4652
  ...makeComponentProps(),
4701
4653
  ...makeDensityProps(),
@@ -4729,7 +4681,7 @@ const VBtnGroup = genericComponent()({
4729
4681
  } = useRounded(props);
4730
4682
  provideDefaults({
4731
4683
  VBtn: {
4732
- height: toRef(() => props.direction === 'horizontal' ? 'auto' : null),
4684
+ height: 'auto',
4733
4685
  baseColor: toRef(() => props.baseColor),
4734
4686
  color: toRef(() => props.color),
4735
4687
  density: toRef(() => props.density),
@@ -4739,7 +4691,7 @@ const VBtnGroup = genericComponent()({
4739
4691
  });
4740
4692
  useRender(() => {
4741
4693
  return createVNode(props.tag, {
4742
- "class": ['v-btn-group', `v-btn-group--${props.direction}`, {
4694
+ "class": ['v-btn-group', {
4743
4695
  'v-btn-group--divided': props.divided
4744
4696
  }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class],
4745
4697
  "style": props.style
@@ -5208,7 +5160,7 @@ const VProgressCircular = genericComponent()({
5208
5160
  resizeRef,
5209
5161
  contentRect
5210
5162
  } = useResizeObserver();
5211
- const normalizedValue = toRef(() => Math.max(0, Math.min(100, parseFloat(props.modelValue))));
5163
+ const normalizedValue = toRef(() => clamp(parseFloat(props.modelValue), 0, 100));
5212
5164
  const width = toRef(() => Number(props.width));
5213
5165
  const size = toRef(() => {
5214
5166
  // Get size from element if size prop value is small, large etc
@@ -6218,31 +6170,6 @@ const VAppBarTitle = genericComponent()({
6218
6170
  // Utilities
6219
6171
  const VAlertTitle = createSimpleFunctional('v-alert-title');
6220
6172
 
6221
- // Utilities
6222
-
6223
- // Types
6224
-
6225
- // Types
6226
-
6227
- // Composables
6228
- const makeIconSizeProps = propsFactory({
6229
- iconSize: [Number, String],
6230
- iconSizes: {
6231
- type: Array,
6232
- default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
6233
- }
6234
- }, 'iconSize');
6235
- function useIconSizes(props, fallback) {
6236
- const iconSize = computed(() => {
6237
- const iconSizeMap = new Map(props.iconSizes);
6238
- const _iconSize = props.iconSize ?? fallback() ?? 'default';
6239
- return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
6240
- });
6241
- return {
6242
- iconSize
6243
- };
6244
- }
6245
-
6246
6173
  // Types
6247
6174
 
6248
6175
  const allowedTypes = ['success', 'info', 'warning', 'error'];
@@ -6282,7 +6209,6 @@ const makeVAlertProps = propsFactory({
6282
6209
  ...makeDensityProps(),
6283
6210
  ...makeDimensionProps(),
6284
6211
  ...makeElevationProps(),
6285
- ...makeIconSizeProps(),
6286
6212
  ...makeLocationProps(),
6287
6213
  ...makePositionProps(),
6288
6214
  ...makeRoundedProps(),
@@ -6310,9 +6236,6 @@ const VAlert = genericComponent()({
6310
6236
  if (!props.type) return props.icon;
6311
6237
  return props.icon ?? `$${props.type}`;
6312
6238
  });
6313
- const {
6314
- iconSize
6315
- } = useIconSizes(props, () => props.prominent ? 44 : 28);
6316
6239
  const {
6317
6240
  themeClasses
6318
6241
  } = provideTheme(props);
@@ -6360,11 +6283,6 @@ const VAlert = genericComponent()({
6360
6283
  const hasPrepend = !!(slots.prepend || icon.value);
6361
6284
  const hasTitle = !!(slots.title || props.title);
6362
6285
  const hasClose = !!(slots.close || props.closable);
6363
- const iconProps = {
6364
- density: props.density,
6365
- icon: icon.value,
6366
- size: iconSize.value
6367
- };
6368
6286
  return isActive.value && createVNode(props.tag, {
6369
6287
  "class": ['v-alert', props.border && {
6370
6288
  'v-alert--border': !!props.border,
@@ -6382,14 +6300,19 @@ const VAlert = genericComponent()({
6382
6300
  }, null), hasPrepend && createVNode("div", {
6383
6301
  "key": "prepend",
6384
6302
  "class": "v-alert__prepend"
6385
- }, [!slots.prepend ? createVNode(VIcon, mergeProps({
6386
- "key": "prepend-icon"
6387
- }, iconProps), null) : createVNode(VDefaultsProvider, {
6303
+ }, [!slots.prepend ? createVNode(VIcon, {
6304
+ "key": "prepend-icon",
6305
+ "density": props.density,
6306
+ "icon": icon.value,
6307
+ "size": props.prominent ? 44 : 28
6308
+ }, null) : createVNode(VDefaultsProvider, {
6388
6309
  "key": "prepend-defaults",
6389
6310
  "disabled": !icon.value,
6390
6311
  "defaults": {
6391
6312
  VIcon: {
6392
- ...iconProps
6313
+ density: props.density,
6314
+ icon: icon.value,
6315
+ size: props.prominent ? 44 : 28
6393
6316
  }
6394
6317
  }
6395
6318
  }, slots.prepend)]), createVNode("div", {
@@ -7844,7 +7767,7 @@ function clampTarget(container, value, rtl, horizontal) {
7844
7767
  min = 0;
7845
7768
  max = scrollHeight + -containerHeight;
7846
7769
  }
7847
- return Math.max(Math.min(value, max), min);
7770
+ return clamp(value, min, max);
7848
7771
  }
7849
7772
 
7850
7773
  function calculateUpdatedTarget(_ref) {
@@ -8587,68 +8510,6 @@ const VChip = genericComponent()({
8587
8510
  }
8588
8511
  });
8589
8512
 
8590
- const makeVDividerProps = propsFactory({
8591
- color: String,
8592
- inset: Boolean,
8593
- length: [Number, String],
8594
- opacity: [Number, String],
8595
- thickness: [Number, String],
8596
- vertical: Boolean,
8597
- ...makeComponentProps(),
8598
- ...makeThemeProps()
8599
- }, 'VDivider');
8600
- const VDivider = genericComponent()({
8601
- name: 'VDivider',
8602
- props: makeVDividerProps(),
8603
- setup(props, _ref) {
8604
- let {
8605
- attrs,
8606
- slots
8607
- } = _ref;
8608
- const {
8609
- themeClasses
8610
- } = provideTheme(props);
8611
- const {
8612
- textColorClasses,
8613
- textColorStyles
8614
- } = useTextColor(() => props.color);
8615
- const dividerStyles = computed(() => {
8616
- const styles = {};
8617
- if (props.length) {
8618
- styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
8619
- }
8620
- if (props.thickness) {
8621
- styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
8622
- }
8623
- return styles;
8624
- });
8625
- useRender(() => {
8626
- const divider = createVNode("hr", {
8627
- "class": [{
8628
- 'v-divider': true,
8629
- 'v-divider--inset': props.inset,
8630
- 'v-divider--vertical': props.vertical
8631
- }, themeClasses.value, textColorClasses.value, props.class],
8632
- "style": [dividerStyles.value, textColorStyles.value, {
8633
- '--v-border-opacity': props.opacity
8634
- }, props.style],
8635
- "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
8636
- "role": `${attrs.role || 'separator'}`
8637
- }, null);
8638
- if (!slots.default) return divider;
8639
- return createVNode("div", {
8640
- "class": ['v-divider__wrapper', {
8641
- 'v-divider__wrapper--vertical': props.vertical,
8642
- 'v-divider__wrapper--inset': props.inset
8643
- }]
8644
- }, [divider, createVNode("div", {
8645
- "class": "v-divider__content"
8646
- }, [slots.default()]), divider]);
8647
- });
8648
- return {};
8649
- }
8650
- });
8651
-
8652
8513
  // Utilities
8653
8514
 
8654
8515
  // List
@@ -9800,6 +9661,68 @@ const VListSubheader = genericComponent()({
9800
9661
  }
9801
9662
  });
9802
9663
 
9664
+ const makeVDividerProps = propsFactory({
9665
+ color: String,
9666
+ inset: Boolean,
9667
+ length: [Number, String],
9668
+ opacity: [Number, String],
9669
+ thickness: [Number, String],
9670
+ vertical: Boolean,
9671
+ ...makeComponentProps(),
9672
+ ...makeThemeProps()
9673
+ }, 'VDivider');
9674
+ const VDivider = genericComponent()({
9675
+ name: 'VDivider',
9676
+ props: makeVDividerProps(),
9677
+ setup(props, _ref) {
9678
+ let {
9679
+ attrs,
9680
+ slots
9681
+ } = _ref;
9682
+ const {
9683
+ themeClasses
9684
+ } = provideTheme(props);
9685
+ const {
9686
+ textColorClasses,
9687
+ textColorStyles
9688
+ } = useTextColor(() => props.color);
9689
+ const dividerStyles = computed(() => {
9690
+ const styles = {};
9691
+ if (props.length) {
9692
+ styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
9693
+ }
9694
+ if (props.thickness) {
9695
+ styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
9696
+ }
9697
+ return styles;
9698
+ });
9699
+ useRender(() => {
9700
+ const divider = createVNode("hr", {
9701
+ "class": [{
9702
+ 'v-divider': true,
9703
+ 'v-divider--inset': props.inset,
9704
+ 'v-divider--vertical': props.vertical
9705
+ }, themeClasses.value, textColorClasses.value, props.class],
9706
+ "style": [dividerStyles.value, textColorStyles.value, {
9707
+ '--v-border-opacity': props.opacity
9708
+ }, props.style],
9709
+ "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
9710
+ "role": `${attrs.role || 'separator'}`
9711
+ }, null);
9712
+ if (!slots.default) return divider;
9713
+ return createVNode("div", {
9714
+ "class": ['v-divider__wrapper', {
9715
+ 'v-divider__wrapper--vertical': props.vertical,
9716
+ 'v-divider__wrapper--inset': props.inset
9717
+ }]
9718
+ }, [divider, createVNode("div", {
9719
+ "class": "v-divider__content"
9720
+ }, [slots.default()]), divider]);
9721
+ });
9722
+ return {};
9723
+ }
9724
+ });
9725
+
9803
9726
  // Types
9804
9727
 
9805
9728
  const makeVListChildrenProps = propsFactory({
@@ -10378,11 +10301,19 @@ function useLocationStrategies(props, data) {
10378
10301
  watch(() => props.locationStrategy, reset);
10379
10302
  onScopeDispose(() => {
10380
10303
  window.removeEventListener('resize', onResize);
10304
+ visualViewport?.removeEventListener('resize', onVisualResize);
10305
+ visualViewport?.removeEventListener('scroll', onVisualScroll);
10381
10306
  updateLocation.value = undefined;
10382
10307
  });
10383
10308
  window.addEventListener('resize', onResize, {
10384
10309
  passive: true
10385
10310
  });
10311
+ visualViewport?.addEventListener('resize', onVisualResize, {
10312
+ passive: true
10313
+ });
10314
+ visualViewport?.addEventListener('scroll', onVisualScroll, {
10315
+ passive: true
10316
+ });
10386
10317
  if (typeof props.locationStrategy === 'function') {
10387
10318
  updateLocation.value = props.locationStrategy(data, props, contentStyles)?.updateLocation;
10388
10319
  } else {
@@ -10393,6 +10324,12 @@ function useLocationStrategies(props, data) {
10393
10324
  function onResize(e) {
10394
10325
  updateLocation.value?.(e);
10395
10326
  }
10327
+ function onVisualResize(e) {
10328
+ updateLocation.value?.(e);
10329
+ }
10330
+ function onVisualScroll(e) {
10331
+ updateLocation.value?.(e);
10332
+ }
10396
10333
  return {
10397
10334
  contentStyles,
10398
10335
  updateLocation
@@ -10544,13 +10481,7 @@ function connectedLocationStrategy(data, props, contentStyles) {
10544
10481
  }
10545
10482
  }
10546
10483
  const viewport = scrollParents.reduce((box, el) => {
10547
- const rect = el.getBoundingClientRect();
10548
- const scrollBox = new Box({
10549
- x: el === document.documentElement ? 0 : rect.x,
10550
- y: el === document.documentElement ? 0 : rect.y,
10551
- width: el.clientWidth,
10552
- height: el.clientHeight
10553
- });
10484
+ const scrollBox = getElementBox(el);
10554
10485
  if (box) {
10555
10486
  return new Box({
10556
10487
  x: Math.max(box.left, scrollBox.left),
@@ -12717,12 +12648,7 @@ function useVirtual(props, items) {
12717
12648
  }
12718
12649
  function calculateOffset(index) {
12719
12650
  index = clamp(index, 0, items.value.length - 1);
12720
- const whole = Math.floor(index);
12721
- const fraction = index % 1;
12722
- const next = whole + 1;
12723
- const wholeOffset = offsets[whole] || 0;
12724
- const nextOffset = offsets[next] || wholeOffset;
12725
- return wholeOffset + (nextOffset - wholeOffset) * fraction;
12651
+ return offsets[index] || 0;
12726
12652
  }
12727
12653
  function calculateIndex(scrollTop) {
12728
12654
  return binaryClosest(offsets, scrollTop);
@@ -13126,6 +13052,7 @@ const VSelect = genericComponent()({
13126
13052
  const selectedValues = computed(() => model.value.map(selection => selection.value));
13127
13053
  const isFocused = shallowRef(false);
13128
13054
  let keyboardLookupPrefix = '';
13055
+ let keyboardLookupIndex = -1;
13129
13056
  let keyboardLookupLastTime;
13130
13057
  const displayItems = computed(() => {
13131
13058
  if (props.hideSelected) {
@@ -13193,18 +13120,46 @@ const VSelect = genericComponent()({
13193
13120
  const now = performance.now();
13194
13121
  if (now - keyboardLookupLastTime > KEYBOARD_LOOKUP_THRESHOLD) {
13195
13122
  keyboardLookupPrefix = '';
13123
+ keyboardLookupIndex = -1;
13196
13124
  }
13197
13125
  keyboardLookupPrefix += e.key.toLowerCase();
13198
13126
  keyboardLookupLastTime = now;
13199
- const item = items.value.find(item => item.title.toLowerCase().startsWith(keyboardLookupPrefix));
13200
- if (item !== undefined) {
13201
- if (!props.multiple) {
13202
- model.value = [item];
13127
+ const items = displayItems.value;
13128
+ function findItem() {
13129
+ let result = findItemBase();
13130
+ if (result) return result;
13131
+ if (keyboardLookupPrefix.at(-1) === keyboardLookupPrefix.at(-2)) {
13132
+ // No matches but we have a repeated letter, try the next item with that prefix
13133
+ keyboardLookupPrefix = keyboardLookupPrefix.slice(0, -1);
13134
+ result = findItemBase();
13135
+ if (result) return result;
13203
13136
  }
13204
- const index = displayItems.value.indexOf(item);
13205
- if (~index && IN_BROWSER) {
13206
- listRef.value?.focus(index);
13137
+
13138
+ // Still nothing, wrap around to the top
13139
+ keyboardLookupIndex = -1;
13140
+ result = findItemBase();
13141
+ if (result) return result;
13142
+
13143
+ // Still nothing, try just the new letter
13144
+ keyboardLookupPrefix = e.key.toLowerCase();
13145
+ return findItemBase();
13146
+ }
13147
+ function findItemBase() {
13148
+ for (let i = keyboardLookupIndex + 1; i < items.length; i++) {
13149
+ const _item = items[i];
13150
+ if (_item.title.toLowerCase().startsWith(keyboardLookupPrefix)) {
13151
+ return [_item, i];
13152
+ }
13207
13153
  }
13154
+ return undefined;
13155
+ }
13156
+ const result = findItem();
13157
+ if (!result) return;
13158
+ const [item, index] = result;
13159
+ keyboardLookupIndex = index;
13160
+ listRef.value?.focus(index);
13161
+ if (!props.multiple) {
13162
+ model.value = [item];
13208
13163
  }
13209
13164
  }
13210
13165
 
@@ -13353,22 +13308,6 @@ const VSelect = genericComponent()({
13353
13308
  key: item.value,
13354
13309
  onClick: () => select(item, null)
13355
13310
  });
13356
- if (item.raw.type === 'divider') {
13357
- return slots.divider?.({
13358
- props: item.raw,
13359
- index
13360
- }) ?? createVNode(VDivider, mergeProps(item.props, {
13361
- "key": `divider-${index}`
13362
- }), null);
13363
- }
13364
- if (item.raw.type === 'subheader') {
13365
- return slots.subheader?.({
13366
- props: item.raw,
13367
- index
13368
- }) ?? createVNode(VListSubheader, mergeProps(item.props, {
13369
- "key": `subheader-${index}`
13370
- }), null);
13371
- }
13372
13311
  return slots.item?.({
13373
13312
  item,
13374
13313
  index,
@@ -13529,9 +13468,6 @@ function filterItems(items, query, options) {
13529
13468
  let match = -1;
13530
13469
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13531
13470
  if (typeof item === 'object') {
13532
- if (['divider', 'subheader'].includes(item.raw?.type)) {
13533
- continue;
13534
- }
13535
13471
  const filterKeys = keys || Object.keys(transformed);
13536
13472
  for (const key of filterKeys) {
13537
13473
  const value = getPropertyFromItem(transformed, key);
@@ -13970,22 +13906,6 @@ const VAutocomplete = genericComponent()({
13970
13906
  active: highlightFirst.value && index === 0 ? true : undefined,
13971
13907
  onClick: () => select(item, null)
13972
13908
  });
13973
- if (item.raw.type === 'divider') {
13974
- return slots.divider?.({
13975
- props: item.raw,
13976
- index
13977
- }) ?? createVNode(VDivider, mergeProps(item.props, {
13978
- "key": `divider-${index}`
13979
- }), null);
13980
- }
13981
- if (item.raw.type === 'subheader') {
13982
- return slots.subheader?.({
13983
- props: item.raw,
13984
- index
13985
- }) ?? createVNode(VListSubheader, mergeProps(item.props, {
13986
- "key": `subheader-${index}`
13987
- }), null);
13988
- }
13989
13909
  return slots.item?.({
13990
13910
  item,
13991
13911
  index,
@@ -16283,7 +16203,7 @@ const useSlider = _ref => {
16283
16203
  const clickOffset = getPosition(e, position);
16284
16204
 
16285
16205
  // It is possible for left to be NaN, force to number
16286
- let clickPos = Math.min(Math.max((clickOffset - trackStart - startOffset.value) / trackLength, 0), 1) || 0;
16206
+ let clickPos = clamp((clickOffset - trackStart - startOffset.value) / trackLength) || 0;
16287
16207
  if (vertical ? indexFromEnd.value : indexFromEnd.value !== isRtl.value) clickPos = 1 - clickPos;
16288
16208
  return roundValue(min.value + clickPos * (max.value - min.value));
16289
16209
  }
@@ -17581,13 +17501,13 @@ function date(value) {
17581
17501
  return null;
17582
17502
  }
17583
17503
  const sundayJanuarySecond2000 = new Date(2000, 0, 2);
17584
- function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
17504
+ function getWeekdays(locale, firstDayOfWeek) {
17585
17505
  const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
17586
17506
  return createRange(7).map(i => {
17587
17507
  const weekday = new Date(sundayJanuarySecond2000);
17588
17508
  weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
17589
17509
  return new Intl.DateTimeFormat(locale, {
17590
- weekday: weekdayFormat ?? 'narrow'
17510
+ weekday: 'narrow'
17591
17511
  }).format(weekday);
17592
17512
  });
17593
17513
  }
@@ -18051,9 +17971,9 @@ class VuetifyDateAdapter {
18051
17971
  getDiff(date, comparing, unit) {
18052
17972
  return getDiff(date, comparing, unit);
18053
17973
  }
18054
- getWeekdays(firstDayOfWeek, weekdayFormat) {
17974
+ getWeekdays(firstDayOfWeek) {
18055
17975
  const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
18056
- return getWeekdays(this.locale, firstDay, weekdayFormat);
17976
+ return getWeekdays(this.locale, firstDay);
18057
17977
  }
18058
17978
  getYear(date) {
18059
17979
  return getYear(date);
@@ -18396,7 +18316,6 @@ const VCombobox = genericComponent()({
18396
18316
  _search.value = val ?? '';
18397
18317
  if (!props.multiple && !hasSelectionSlot.value) {
18398
18318
  model.value = [transformItem$3(props, val)];
18399
- nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18400
18319
  }
18401
18320
  if (val && props.multiple && props.delimiters?.length) {
18402
18321
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18713,22 +18632,6 @@ const VCombobox = genericComponent()({
18713
18632
  active: highlightFirst.value && index === 0 ? true : undefined,
18714
18633
  onClick: () => select(item, null)
18715
18634
  });
18716
- if (item.raw.type === 'divider') {
18717
- return slots.divider?.({
18718
- props: item.raw,
18719
- index
18720
- }) ?? createVNode(VDivider, mergeProps(item.props, {
18721
- "key": `divider-${index}`
18722
- }), null);
18723
- }
18724
- if (item.raw.type === 'subheader') {
18725
- return slots.subheader?.({
18726
- props: item.raw,
18727
- index
18728
- }) ?? createVNode(VListSubheader, mergeProps(item.props, {
18729
- "key": `subheader-${index}`
18730
- }), null);
18731
- }
18732
18635
  return slots.item?.({
18733
18636
  item,
18734
18637
  index,
@@ -22372,8 +22275,7 @@ const makeCalendarProps = propsFactory({
22372
22275
  firstDayOfWeek: {
22373
22276
  type: [Number, String],
22374
22277
  default: undefined
22375
- },
22376
- weekdayFormat: String
22278
+ }
22377
22279
  }, 'calendar');
22378
22280
  function useCalendar(props) {
22379
22281
  const adapter = useDate();
@@ -22621,7 +22523,7 @@ const VDatePickerMonth = genericComponent()({
22621
22523
  "ref": daysRef,
22622
22524
  "key": daysInMonth.value[0].date?.toString(),
22623
22525
  "class": "v-date-picker-month__days"
22624
- }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => createVNode("div", {
22526
+ }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => createVNode("div", {
22625
22527
  "class": ['v-date-picker-month__day', 'v-date-picker-month__weekday']
22626
22528
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22627
22529
  const slotProps = {
@@ -24739,7 +24641,7 @@ function useTouch(_ref) {
24739
24641
  function getProgress(pos) {
24740
24642
  let limit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
24741
24643
  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();
24742
- return limit ? Math.max(0, Math.min(1, progress)) : progress;
24644
+ return limit ? clamp(progress) : progress;
24743
24645
  }
24744
24646
  function onTouchstart(e) {
24745
24647
  if (touchless.value) return;
@@ -25152,10 +25054,6 @@ const makeVNumberInputProps = propsFactory({
25152
25054
  type: Number,
25153
25055
  default: 0
25154
25056
  },
25155
- minFractionDigits: {
25156
- type: Number,
25157
- default: null
25158
- },
25159
25057
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
25160
25058
  }, 'VNumberInput');
25161
25059
  const VNumberInput = genericComponent()({
@@ -25186,19 +25084,9 @@ const VNumberInput = genericComponent()({
25186
25084
  } = useFocus(props);
25187
25085
  function correctPrecision(val) {
25188
25086
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
25189
- if (precision == null) {
25190
- return String(val);
25191
- }
25192
- let fixed = val.toFixed(precision);
25193
- if (isFocused.value) {
25194
- return Number(fixed).toString(); // trim zeros
25195
- }
25196
- if ((props.minFractionDigits ?? precision) < precision) {
25197
- const trimLimit = precision - props.minFractionDigits;
25198
- const [baseDigits, fractionDigits] = fixed.split('.');
25199
- fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
25200
- }
25201
- return fixed;
25087
+ const fixed = precision == null ? String(val) : val.toFixed(precision);
25088
+ return isFocused.value ? Number(fixed).toString() // trim zeros
25089
+ : fixed;
25202
25090
  }
25203
25091
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
25204
25092
  const _inputText = shallowRef(null);
@@ -25238,6 +25126,9 @@ const VNumberInput = genericComponent()({
25238
25126
  const controlNodeDefaultHeight = toRef(() => controlVariant.value === 'stacked' ? 'auto' : '100%');
25239
25127
  const incrementSlotProps = {
25240
25128
  props: {
25129
+ style: {
25130
+ touchAction: 'none'
25131
+ },
25241
25132
  onClick: onControlClick,
25242
25133
  onPointerup: onControlMouseup,
25243
25134
  onPointerdown: onUpControlMousedown
@@ -25245,13 +25136,15 @@ const VNumberInput = genericComponent()({
25245
25136
  };
25246
25137
  const decrementSlotProps = {
25247
25138
  props: {
25139
+ style: {
25140
+ touchAction: 'none'
25141
+ },
25248
25142
  onClick: onControlClick,
25249
25143
  onPointerup: onControlMouseup,
25250
25144
  onPointerdown: onDownControlMousedown
25251
25145
  }
25252
25146
  };
25253
25147
  watch(() => props.precision, () => formatInputValue());
25254
- watch(() => props.minFractionDigits, () => formatInputValue());
25255
25148
  onMounted(() => {
25256
25149
  clampModel();
25257
25150
  });
@@ -25353,7 +25246,7 @@ const VNumberInput = genericComponent()({
25353
25246
  inputText.value = null;
25354
25247
  return;
25355
25248
  }
25356
- inputText.value = correctPrecision(model.value);
25249
+ inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25357
25250
  }
25358
25251
  function trimDecimalZeros() {
25359
25252
  if (controlsDisabled.value) return;
@@ -25378,17 +25271,18 @@ const VNumberInput = genericComponent()({
25378
25271
  } = VTextField.filterProps(props);
25379
25272
  function incrementControlNode() {
25380
25273
  return !slots.increment ? createVNode(VBtn, {
25274
+ "aria-hidden": "true",
25275
+ "data-testid": "increment",
25381
25276
  "disabled": !canIncrease.value,
25382
25277
  "flat": true,
25383
- "key": "increment-btn",
25384
25278
  "height": controlNodeDefaultHeight.value,
25385
- "data-testid": "increment",
25386
- "aria-hidden": "true",
25387
25279
  "icon": incrementIcon.value,
25280
+ "key": "increment-btn",
25388
25281
  "onClick": onControlClick,
25389
- "onPointerup": onControlMouseup,
25390
25282
  "onPointerdown": onUpControlMousedown,
25283
+ "onPointerup": onControlMouseup,
25391
25284
  "size": controlNodeSize.value,
25285
+ "style": "touch-action: none",
25392
25286
  "tabindex": "-1"
25393
25287
  }, null) : createVNode(VDefaultsProvider, {
25394
25288
  "key": "increment-defaults",
@@ -25407,18 +25301,19 @@ const VNumberInput = genericComponent()({
25407
25301
  }
25408
25302
  function decrementControlNode() {
25409
25303
  return !slots.decrement ? createVNode(VBtn, {
25304
+ "aria-hidden": "true",
25305
+ "data-testid": "decrement",
25410
25306
  "disabled": !canDecrease.value,
25411
25307
  "flat": true,
25412
- "key": "decrement-btn",
25413
25308
  "height": controlNodeDefaultHeight.value,
25414
- "data-testid": "decrement",
25415
- "aria-hidden": "true",
25416
25309
  "icon": decrementIcon.value,
25417
- "size": controlNodeSize.value,
25418
- "tabindex": "-1",
25310
+ "key": "decrement-btn",
25419
25311
  "onClick": onControlClick,
25312
+ "onPointerdown": onDownControlMousedown,
25420
25313
  "onPointerup": onControlMouseup,
25421
- "onPointerdown": onDownControlMousedown
25314
+ "size": controlNodeSize.value,
25315
+ "style": "touch-action: none",
25316
+ "tabindex": "-1"
25422
25317
  }, null) : createVNode(VDefaultsProvider, {
25423
25318
  "key": "decrement-defaults",
25424
25319
  "defaults": {
@@ -29395,7 +29290,7 @@ function createVuetify$1() {
29395
29290
  };
29396
29291
  });
29397
29292
  }
29398
- const version$1 = "3.8.6-dev.2025-05-21";
29293
+ const version$1 = "3.8.6-master.2025-05-22";
29399
29294
  createVuetify$1.version = version$1;
29400
29295
 
29401
29296
  // Vue's inject() can only be used in setup
@@ -29420,7 +29315,7 @@ const createVuetify = function () {
29420
29315
  ...options
29421
29316
  });
29422
29317
  };
29423
- const version = "3.8.6-dev.2025-05-21";
29318
+ const version = "3.8.6-master.2025-05-22";
29424
29319
  createVuetify.version = version;
29425
29320
 
29426
29321
  export { index as blueprints, components, createVuetify, directives, useDate, useDefaults, useDisplay, useGoTo, useLayout, useLocale, useRtl, useTheme, version };