@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,5 +1,5 @@
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
  */
@@ -85,7 +85,6 @@
85
85
  const SUPPORTS_INTERSECTION = IN_BROWSER && 'IntersectionObserver' in window;
86
86
  const SUPPORTS_TOUCH = IN_BROWSER && ('ontouchstart' in window || window.navigator.maxTouchPoints > 0);
87
87
  const SUPPORTS_EYE_DROPPER = IN_BROWSER && 'EyeDropper' in window;
88
- const SUPPORTS_MATCH_MEDIA = IN_BROWSER && 'matchMedia' in window && typeof window.matchMedia === 'function';
89
88
 
90
89
  function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
91
90
  function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
@@ -696,6 +695,33 @@
696
695
  return target.getBoundingClientRect();
697
696
  }
698
697
  }
698
+ function getElementBox(el) {
699
+ if (el === document.documentElement) {
700
+ if (!visualViewport) {
701
+ return new Box({
702
+ x: 0,
703
+ y: 0,
704
+ width: document.documentElement.clientWidth,
705
+ height: document.documentElement.clientHeight
706
+ });
707
+ } else {
708
+ return new Box({
709
+ x: visualViewport.scale > 1 ? 0 : visualViewport.offsetLeft,
710
+ y: visualViewport.scale > 1 ? 0 : visualViewport.offsetTop,
711
+ width: visualViewport.width * visualViewport.scale,
712
+ height: visualViewport.height * visualViewport.scale
713
+ });
714
+ }
715
+ } else {
716
+ const rect = el.getBoundingClientRect();
717
+ return new Box({
718
+ x: rect.x,
719
+ y: rect.y,
720
+ width: el.clientWidth,
721
+ height: el.clientHeight
722
+ });
723
+ }
724
+ }
699
725
 
700
726
  // Utilities
701
727
 
@@ -2300,7 +2326,6 @@
2300
2326
  function genDefaults$2() {
2301
2327
  return {
2302
2328
  defaultTheme: 'light',
2303
- prefix: 'v-',
2304
2329
  variations: {
2305
2330
  colors: [],
2306
2331
  lighten: 0,
@@ -2382,10 +2407,7 @@
2382
2407
  }
2383
2408
  }
2384
2409
  },
2385
- stylesheetId: 'vuetify-theme-stylesheet',
2386
- scoped: false,
2387
- unimportant: false,
2388
- utilities: true
2410
+ stylesheetId: 'vuetify-theme-stylesheet'
2389
2411
  };
2390
2412
  }
2391
2413
  function parseThemeOptions() {
@@ -2408,21 +2430,21 @@
2408
2430
  function createCssClass(lines, selector, content, scope) {
2409
2431
  lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
2410
2432
  }
2411
- function genCssVariables(theme, prefix) {
2433
+ function genCssVariables(theme) {
2412
2434
  const lightOverlay = theme.dark ? 2 : 1;
2413
2435
  const darkOverlay = theme.dark ? 1 : 2;
2414
2436
  const variables = [];
2415
2437
  for (const [key, value] of Object.entries(theme.colors)) {
2416
2438
  const rgb = parseColor(value);
2417
- variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2439
+ variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2418
2440
  if (!key.startsWith('on-')) {
2419
- variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2441
+ variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2420
2442
  }
2421
2443
  }
2422
2444
  for (const [key, value] of Object.entries(theme.variables)) {
2423
2445
  const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
2424
2446
  const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
2425
- variables.push(`--${prefix}${key}: ${rgb ?? value}`);
2447
+ variables.push(`--v-${key}: ${rgb ?? value}`);
2426
2448
  }
2427
2449
  return variables;
2428
2450
  }
@@ -2466,8 +2488,7 @@
2466
2488
  const scopeSelector = `:where(${scope})`;
2467
2489
  return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
2468
2490
  }
2469
- function upsertStyles(id, cspNonce, styles) {
2470
- const styleEl = getOrCreateStyleElement(id, cspNonce);
2491
+ function upsertStyles(styleEl, styles) {
2471
2492
  if (!styleEl) return;
2472
2493
  styleEl.innerHTML = styles;
2473
2494
  }
@@ -2487,17 +2508,8 @@
2487
2508
  // Composables
2488
2509
  function createTheme(options) {
2489
2510
  const parsedOptions = parseThemeOptions(options);
2490
- const _name = vue.shallowRef(parsedOptions.defaultTheme);
2511
+ const name = vue.shallowRef(parsedOptions.defaultTheme);
2491
2512
  const themes = vue.ref(parsedOptions.themes);
2492
- const systemName = vue.shallowRef('light');
2493
- const name = vue.computed({
2494
- get() {
2495
- return _name.value === 'system' ? systemName.value : _name.value;
2496
- },
2497
- set(val) {
2498
- _name.value = val;
2499
- }
2500
- });
2501
2513
  const computedThemes = vue.computed(() => {
2502
2514
  const acc = {};
2503
2515
  for (const [name, original] of Object.entries(themes.value)) {
@@ -2518,49 +2530,28 @@
2518
2530
  const current = vue.toRef(() => computedThemes.value[name.value]);
2519
2531
  const styles = vue.computed(() => {
2520
2532
  const lines = [];
2521
- const important = parsedOptions.unimportant ? '' : ' !important';
2522
- const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
2523
2533
  if (current.value?.dark) {
2524
2534
  createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
2525
2535
  }
2526
- createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
2536
+ createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
2527
2537
  for (const [themeName, theme] of Object.entries(computedThemes.value)) {
2528
- createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
2529
- }
2530
- if (parsedOptions.utilities) {
2531
- const bgLines = [];
2532
- const fgLines = [];
2533
- const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
2534
- for (const key of colors) {
2535
- if (key.startsWith('on-')) {
2536
- createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
2537
- } else {
2538
- 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);
2539
- createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
2540
- createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
2541
- }
2538
+ createCssClass(lines, `.v-theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme)], parsedOptions.scope);
2539
+ }
2540
+ const bgLines = [];
2541
+ const fgLines = [];
2542
+ const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
2543
+ for (const key of colors) {
2544
+ if (key.startsWith('on-')) {
2545
+ createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
2546
+ } else {
2547
+ 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);
2548
+ createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
2549
+ createCssClass(fgLines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`], parsedOptions.scope);
2542
2550
  }
2543
- lines.push(...bgLines, ...fgLines);
2544
2551
  }
2552
+ lines.push(...bgLines, ...fgLines);
2545
2553
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
2546
2554
  });
2547
- const themeClasses = vue.toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
2548
- const themeNames = vue.toRef(() => Object.keys(computedThemes.value));
2549
- if (SUPPORTS_MATCH_MEDIA) {
2550
- const media = window.matchMedia('(prefers-color-scheme: dark)');
2551
- function updateSystemName() {
2552
- systemName.value = media.matches ? 'dark' : 'light';
2553
- }
2554
- updateSystemName();
2555
- media.addEventListener('change', updateSystemName, {
2556
- passive: true
2557
- });
2558
- if (vue.getCurrentScope()) {
2559
- vue.onScopeDispose(() => {
2560
- media.removeEventListener('change', updateSystemName);
2561
- });
2562
- }
2563
- }
2564
2555
  function install(app) {
2565
2556
  if (parsedOptions.isDisabled) return;
2566
2557
  const head = app._context.provides.usehead;
@@ -2598,55 +2589,22 @@
2598
2589
  updateStyles();
2599
2590
  }
2600
2591
  function updateStyles() {
2601
- upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
2592
+ upsertStyles(getOrCreateStyleElement(parsedOptions.stylesheetId, parsedOptions.cspNonce), styles.value);
2602
2593
  }
2603
2594
  }
2604
2595
  }
2605
- function change(themeName) {
2606
- if (!themeNames.value.includes(themeName)) {
2607
- consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
2608
- return;
2609
- }
2610
- name.value = themeName;
2611
- }
2612
- function cycle() {
2613
- let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
2614
- const currentIndex = themeArray.indexOf(name.value);
2615
- const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
2616
- change(themeArray[nextIndex]);
2617
- }
2618
- function toggle() {
2619
- let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
2620
- cycle(themeArray);
2621
- }
2622
- const globalName = new Proxy(name, {
2623
- get(target, prop) {
2624
- return target[prop];
2625
- },
2626
- set(target, prop, val) {
2627
- if (prop === 'value') {
2628
- deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
2629
- }
2630
- // @ts-expect-error
2631
- target[prop] = val;
2632
- return true;
2633
- }
2634
- });
2596
+ const themeClasses = vue.toRef(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);
2635
2597
  return {
2636
2598
  install,
2637
- change,
2638
- cycle,
2639
- toggle,
2640
2599
  isDisabled: parsedOptions.isDisabled,
2641
2600
  name,
2642
2601
  themes,
2643
2602
  current,
2644
2603
  computedThemes,
2645
- prefix: parsedOptions.prefix,
2646
2604
  themeClasses,
2647
2605
  styles,
2648
2606
  global: {
2649
- name: globalName,
2607
+ name,
2650
2608
  current
2651
2609
  }
2652
2610
  };
@@ -2657,7 +2615,7 @@
2657
2615
  if (!theme) throw new Error('Could not find Vuetify theme injection');
2658
2616
  const name = vue.toRef(() => props.theme ?? theme.name.value);
2659
2617
  const current = vue.toRef(() => theme.themes.value[name.value]);
2660
- const themeClasses = vue.toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
2618
+ const themeClasses = vue.toRef(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);
2661
2619
  const newTheme = {
2662
2620
  ...theme,
2663
2621
  name,
@@ -4204,15 +4162,9 @@
4204
4162
  };
4205
4163
  }
4206
4164
 
4207
- // Types
4208
-
4209
4165
  const makeVBtnGroupProps = propsFactory({
4210
4166
  baseColor: String,
4211
4167
  divided: Boolean,
4212
- direction: {
4213
- type: String,
4214
- default: 'horizontal'
4215
- },
4216
4168
  ...makeBorderProps(),
4217
4169
  ...makeComponentProps(),
4218
4170
  ...makeDensityProps(),
@@ -4246,7 +4198,7 @@
4246
4198
  } = useRounded(props);
4247
4199
  provideDefaults({
4248
4200
  VBtn: {
4249
- height: vue.toRef(() => props.direction === 'horizontal' ? 'auto' : null),
4201
+ height: 'auto',
4250
4202
  baseColor: vue.toRef(() => props.baseColor),
4251
4203
  color: vue.toRef(() => props.color),
4252
4204
  density: vue.toRef(() => props.density),
@@ -4256,7 +4208,7 @@
4256
4208
  });
4257
4209
  useRender(() => {
4258
4210
  return vue.createVNode(props.tag, {
4259
- "class": ['v-btn-group', `v-btn-group--${props.direction}`, {
4211
+ "class": ['v-btn-group', {
4260
4212
  'v-btn-group--divided': props.divided
4261
4213
  }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class],
4262
4214
  "style": props.style
@@ -4934,7 +4886,7 @@
4934
4886
  resizeRef,
4935
4887
  contentRect
4936
4888
  } = useResizeObserver();
4937
- const normalizedValue = vue.toRef(() => Math.max(0, Math.min(100, parseFloat(props.modelValue))));
4889
+ const normalizedValue = vue.toRef(() => clamp(parseFloat(props.modelValue), 0, 100));
4938
4890
  const width = vue.toRef(() => Number(props.width));
4939
4891
  const size = vue.toRef(() => {
4940
4892
  // Get size from element if size prop value is small, large etc
@@ -5944,31 +5896,6 @@
5944
5896
  // Utilities
5945
5897
  const VAlertTitle = createSimpleFunctional('v-alert-title');
5946
5898
 
5947
- // Utilities
5948
-
5949
- // Types
5950
-
5951
- // Types
5952
-
5953
- // Composables
5954
- const makeIconSizeProps = propsFactory({
5955
- iconSize: [Number, String],
5956
- iconSizes: {
5957
- type: Array,
5958
- default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
5959
- }
5960
- }, 'iconSize');
5961
- function useIconSizes(props, fallback) {
5962
- const iconSize = vue.computed(() => {
5963
- const iconSizeMap = new Map(props.iconSizes);
5964
- const _iconSize = props.iconSize ?? fallback() ?? 'default';
5965
- return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
5966
- });
5967
- return {
5968
- iconSize
5969
- };
5970
- }
5971
-
5972
5899
  // Types
5973
5900
 
5974
5901
  const allowedTypes = ['success', 'info', 'warning', 'error'];
@@ -6008,7 +5935,6 @@
6008
5935
  ...makeDensityProps(),
6009
5936
  ...makeDimensionProps(),
6010
5937
  ...makeElevationProps(),
6011
- ...makeIconSizeProps(),
6012
5938
  ...makeLocationProps(),
6013
5939
  ...makePositionProps(),
6014
5940
  ...makeRoundedProps(),
@@ -6036,9 +5962,6 @@
6036
5962
  if (!props.type) return props.icon;
6037
5963
  return props.icon ?? `$${props.type}`;
6038
5964
  });
6039
- const {
6040
- iconSize
6041
- } = useIconSizes(props, () => props.prominent ? 44 : 28);
6042
5965
  const {
6043
5966
  themeClasses
6044
5967
  } = provideTheme(props);
@@ -6086,11 +6009,6 @@
6086
6009
  const hasPrepend = !!(slots.prepend || icon.value);
6087
6010
  const hasTitle = !!(slots.title || props.title);
6088
6011
  const hasClose = !!(slots.close || props.closable);
6089
- const iconProps = {
6090
- density: props.density,
6091
- icon: icon.value,
6092
- size: iconSize.value
6093
- };
6094
6012
  return isActive.value && vue.createVNode(props.tag, {
6095
6013
  "class": ['v-alert', props.border && {
6096
6014
  'v-alert--border': !!props.border,
@@ -6108,14 +6026,19 @@
6108
6026
  }, null), hasPrepend && vue.createVNode("div", {
6109
6027
  "key": "prepend",
6110
6028
  "class": "v-alert__prepend"
6111
- }, [!slots.prepend ? vue.createVNode(VIcon, vue.mergeProps({
6112
- "key": "prepend-icon"
6113
- }, iconProps), null) : vue.createVNode(VDefaultsProvider, {
6029
+ }, [!slots.prepend ? vue.createVNode(VIcon, {
6030
+ "key": "prepend-icon",
6031
+ "density": props.density,
6032
+ "icon": icon.value,
6033
+ "size": props.prominent ? 44 : 28
6034
+ }, null) : vue.createVNode(VDefaultsProvider, {
6114
6035
  "key": "prepend-defaults",
6115
6036
  "disabled": !icon.value,
6116
6037
  "defaults": {
6117
6038
  VIcon: {
6118
- ...iconProps
6039
+ density: props.density,
6040
+ icon: icon.value,
6041
+ size: props.prominent ? 44 : 28
6119
6042
  }
6120
6043
  }
6121
6044
  }, slots.prepend)]), vue.createVNode("div", {
@@ -7570,7 +7493,7 @@
7570
7493
  min = 0;
7571
7494
  max = scrollHeight + -containerHeight;
7572
7495
  }
7573
- return Math.max(Math.min(value, max), min);
7496
+ return clamp(value, min, max);
7574
7497
  }
7575
7498
 
7576
7499
  function calculateUpdatedTarget(_ref) {
@@ -8313,68 +8236,6 @@
8313
8236
  }
8314
8237
  });
8315
8238
 
8316
- const makeVDividerProps = propsFactory({
8317
- color: String,
8318
- inset: Boolean,
8319
- length: [Number, String],
8320
- opacity: [Number, String],
8321
- thickness: [Number, String],
8322
- vertical: Boolean,
8323
- ...makeComponentProps(),
8324
- ...makeThemeProps()
8325
- }, 'VDivider');
8326
- const VDivider = genericComponent()({
8327
- name: 'VDivider',
8328
- props: makeVDividerProps(),
8329
- setup(props, _ref) {
8330
- let {
8331
- attrs,
8332
- slots
8333
- } = _ref;
8334
- const {
8335
- themeClasses
8336
- } = provideTheme(props);
8337
- const {
8338
- textColorClasses,
8339
- textColorStyles
8340
- } = useTextColor(() => props.color);
8341
- const dividerStyles = vue.computed(() => {
8342
- const styles = {};
8343
- if (props.length) {
8344
- styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
8345
- }
8346
- if (props.thickness) {
8347
- styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
8348
- }
8349
- return styles;
8350
- });
8351
- useRender(() => {
8352
- const divider = vue.createVNode("hr", {
8353
- "class": [{
8354
- 'v-divider': true,
8355
- 'v-divider--inset': props.inset,
8356
- 'v-divider--vertical': props.vertical
8357
- }, themeClasses.value, textColorClasses.value, props.class],
8358
- "style": [dividerStyles.value, textColorStyles.value, {
8359
- '--v-border-opacity': props.opacity
8360
- }, props.style],
8361
- "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
8362
- "role": `${attrs.role || 'separator'}`
8363
- }, null);
8364
- if (!slots.default) return divider;
8365
- return vue.createVNode("div", {
8366
- "class": ['v-divider__wrapper', {
8367
- 'v-divider__wrapper--vertical': props.vertical,
8368
- 'v-divider__wrapper--inset': props.inset
8369
- }]
8370
- }, [divider, vue.createVNode("div", {
8371
- "class": "v-divider__content"
8372
- }, [slots.default()]), divider]);
8373
- });
8374
- return {};
8375
- }
8376
- });
8377
-
8378
8239
  // Utilities
8379
8240
 
8380
8241
  // List
@@ -9526,6 +9387,68 @@
9526
9387
  }
9527
9388
  });
9528
9389
 
9390
+ const makeVDividerProps = propsFactory({
9391
+ color: String,
9392
+ inset: Boolean,
9393
+ length: [Number, String],
9394
+ opacity: [Number, String],
9395
+ thickness: [Number, String],
9396
+ vertical: Boolean,
9397
+ ...makeComponentProps(),
9398
+ ...makeThemeProps()
9399
+ }, 'VDivider');
9400
+ const VDivider = genericComponent()({
9401
+ name: 'VDivider',
9402
+ props: makeVDividerProps(),
9403
+ setup(props, _ref) {
9404
+ let {
9405
+ attrs,
9406
+ slots
9407
+ } = _ref;
9408
+ const {
9409
+ themeClasses
9410
+ } = provideTheme(props);
9411
+ const {
9412
+ textColorClasses,
9413
+ textColorStyles
9414
+ } = useTextColor(() => props.color);
9415
+ const dividerStyles = vue.computed(() => {
9416
+ const styles = {};
9417
+ if (props.length) {
9418
+ styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
9419
+ }
9420
+ if (props.thickness) {
9421
+ styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
9422
+ }
9423
+ return styles;
9424
+ });
9425
+ useRender(() => {
9426
+ const divider = vue.createVNode("hr", {
9427
+ "class": [{
9428
+ 'v-divider': true,
9429
+ 'v-divider--inset': props.inset,
9430
+ 'v-divider--vertical': props.vertical
9431
+ }, themeClasses.value, textColorClasses.value, props.class],
9432
+ "style": [dividerStyles.value, textColorStyles.value, {
9433
+ '--v-border-opacity': props.opacity
9434
+ }, props.style],
9435
+ "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
9436
+ "role": `${attrs.role || 'separator'}`
9437
+ }, null);
9438
+ if (!slots.default) return divider;
9439
+ return vue.createVNode("div", {
9440
+ "class": ['v-divider__wrapper', {
9441
+ 'v-divider__wrapper--vertical': props.vertical,
9442
+ 'v-divider__wrapper--inset': props.inset
9443
+ }]
9444
+ }, [divider, vue.createVNode("div", {
9445
+ "class": "v-divider__content"
9446
+ }, [slots.default()]), divider]);
9447
+ });
9448
+ return {};
9449
+ }
9450
+ });
9451
+
9529
9452
  // Types
9530
9453
 
9531
9454
  const makeVListChildrenProps = propsFactory({
@@ -10104,11 +10027,19 @@
10104
10027
  vue.watch(() => props.locationStrategy, reset);
10105
10028
  vue.onScopeDispose(() => {
10106
10029
  window.removeEventListener('resize', onResize);
10030
+ visualViewport?.removeEventListener('resize', onVisualResize);
10031
+ visualViewport?.removeEventListener('scroll', onVisualScroll);
10107
10032
  updateLocation.value = undefined;
10108
10033
  });
10109
10034
  window.addEventListener('resize', onResize, {
10110
10035
  passive: true
10111
10036
  });
10037
+ visualViewport?.addEventListener('resize', onVisualResize, {
10038
+ passive: true
10039
+ });
10040
+ visualViewport?.addEventListener('scroll', onVisualScroll, {
10041
+ passive: true
10042
+ });
10112
10043
  if (typeof props.locationStrategy === 'function') {
10113
10044
  updateLocation.value = props.locationStrategy(data, props, contentStyles)?.updateLocation;
10114
10045
  } else {
@@ -10119,6 +10050,12 @@
10119
10050
  function onResize(e) {
10120
10051
  updateLocation.value?.(e);
10121
10052
  }
10053
+ function onVisualResize(e) {
10054
+ updateLocation.value?.(e);
10055
+ }
10056
+ function onVisualScroll(e) {
10057
+ updateLocation.value?.(e);
10058
+ }
10122
10059
  return {
10123
10060
  contentStyles,
10124
10061
  updateLocation
@@ -10270,13 +10207,7 @@
10270
10207
  }
10271
10208
  }
10272
10209
  const viewport = scrollParents.reduce((box, el) => {
10273
- const rect = el.getBoundingClientRect();
10274
- const scrollBox = new Box({
10275
- x: el === document.documentElement ? 0 : rect.x,
10276
- y: el === document.documentElement ? 0 : rect.y,
10277
- width: el.clientWidth,
10278
- height: el.clientHeight
10279
- });
10210
+ const scrollBox = getElementBox(el);
10280
10211
  if (box) {
10281
10212
  return new Box({
10282
10213
  x: Math.max(box.left, scrollBox.left),
@@ -12443,12 +12374,7 @@
12443
12374
  }
12444
12375
  function calculateOffset(index) {
12445
12376
  index = clamp(index, 0, items.value.length - 1);
12446
- const whole = Math.floor(index);
12447
- const fraction = index % 1;
12448
- const next = whole + 1;
12449
- const wholeOffset = offsets[whole] || 0;
12450
- const nextOffset = offsets[next] || wholeOffset;
12451
- return wholeOffset + (nextOffset - wholeOffset) * fraction;
12377
+ return offsets[index] || 0;
12452
12378
  }
12453
12379
  function calculateIndex(scrollTop) {
12454
12380
  return binaryClosest(offsets, scrollTop);
@@ -12852,6 +12778,7 @@
12852
12778
  const selectedValues = vue.computed(() => model.value.map(selection => selection.value));
12853
12779
  const isFocused = vue.shallowRef(false);
12854
12780
  let keyboardLookupPrefix = '';
12781
+ let keyboardLookupIndex = -1;
12855
12782
  let keyboardLookupLastTime;
12856
12783
  const displayItems = vue.computed(() => {
12857
12784
  if (props.hideSelected) {
@@ -12919,18 +12846,46 @@
12919
12846
  const now = performance.now();
12920
12847
  if (now - keyboardLookupLastTime > KEYBOARD_LOOKUP_THRESHOLD) {
12921
12848
  keyboardLookupPrefix = '';
12849
+ keyboardLookupIndex = -1;
12922
12850
  }
12923
12851
  keyboardLookupPrefix += e.key.toLowerCase();
12924
12852
  keyboardLookupLastTime = now;
12925
- const item = items.value.find(item => item.title.toLowerCase().startsWith(keyboardLookupPrefix));
12926
- if (item !== undefined) {
12927
- if (!props.multiple) {
12928
- model.value = [item];
12853
+ const items = displayItems.value;
12854
+ function findItem() {
12855
+ let result = findItemBase();
12856
+ if (result) return result;
12857
+ if (keyboardLookupPrefix.at(-1) === keyboardLookupPrefix.at(-2)) {
12858
+ // No matches but we have a repeated letter, try the next item with that prefix
12859
+ keyboardLookupPrefix = keyboardLookupPrefix.slice(0, -1);
12860
+ result = findItemBase();
12861
+ if (result) return result;
12929
12862
  }
12930
- const index = displayItems.value.indexOf(item);
12931
- if (~index && IN_BROWSER) {
12932
- listRef.value?.focus(index);
12863
+
12864
+ // Still nothing, wrap around to the top
12865
+ keyboardLookupIndex = -1;
12866
+ result = findItemBase();
12867
+ if (result) return result;
12868
+
12869
+ // Still nothing, try just the new letter
12870
+ keyboardLookupPrefix = e.key.toLowerCase();
12871
+ return findItemBase();
12872
+ }
12873
+ function findItemBase() {
12874
+ for (let i = keyboardLookupIndex + 1; i < items.length; i++) {
12875
+ const _item = items[i];
12876
+ if (_item.title.toLowerCase().startsWith(keyboardLookupPrefix)) {
12877
+ return [_item, i];
12878
+ }
12933
12879
  }
12880
+ return undefined;
12881
+ }
12882
+ const result = findItem();
12883
+ if (!result) return;
12884
+ const [item, index] = result;
12885
+ keyboardLookupIndex = index;
12886
+ listRef.value?.focus(index);
12887
+ if (!props.multiple) {
12888
+ model.value = [item];
12934
12889
  }
12935
12890
  }
12936
12891
 
@@ -13079,22 +13034,6 @@
13079
13034
  key: item.value,
13080
13035
  onClick: () => select(item, null)
13081
13036
  });
13082
- if (item.raw.type === 'divider') {
13083
- return slots.divider?.({
13084
- props: item.raw,
13085
- index
13086
- }) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
13087
- "key": `divider-${index}`
13088
- }), null);
13089
- }
13090
- if (item.raw.type === 'subheader') {
13091
- return slots.subheader?.({
13092
- props: item.raw,
13093
- index
13094
- }) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
13095
- "key": `subheader-${index}`
13096
- }), null);
13097
- }
13098
13037
  return slots.item?.({
13099
13038
  item,
13100
13039
  index,
@@ -13255,9 +13194,6 @@
13255
13194
  let match = -1;
13256
13195
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13257
13196
  if (typeof item === 'object') {
13258
- if (['divider', 'subheader'].includes(item.raw?.type)) {
13259
- continue;
13260
- }
13261
13197
  const filterKeys = keys || Object.keys(transformed);
13262
13198
  for (const key of filterKeys) {
13263
13199
  const value = getPropertyFromItem(transformed, key);
@@ -13696,22 +13632,6 @@
13696
13632
  active: highlightFirst.value && index === 0 ? true : undefined,
13697
13633
  onClick: () => select(item, null)
13698
13634
  });
13699
- if (item.raw.type === 'divider') {
13700
- return slots.divider?.({
13701
- props: item.raw,
13702
- index
13703
- }) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
13704
- "key": `divider-${index}`
13705
- }), null);
13706
- }
13707
- if (item.raw.type === 'subheader') {
13708
- return slots.subheader?.({
13709
- props: item.raw,
13710
- index
13711
- }) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
13712
- "key": `subheader-${index}`
13713
- }), null);
13714
- }
13715
13635
  return slots.item?.({
13716
13636
  item,
13717
13637
  index,
@@ -16009,7 +15929,7 @@
16009
15929
  const clickOffset = getPosition(e, position);
16010
15930
 
16011
15931
  // It is possible for left to be NaN, force to number
16012
- let clickPos = Math.min(Math.max((clickOffset - trackStart - startOffset.value) / trackLength, 0), 1) || 0;
15932
+ let clickPos = clamp((clickOffset - trackStart - startOffset.value) / trackLength) || 0;
16013
15933
  if (vertical ? indexFromEnd.value : indexFromEnd.value !== isRtl.value) clickPos = 1 - clickPos;
16014
15934
  return roundValue(min.value + clickPos * (max.value - min.value));
16015
15935
  }
@@ -17307,13 +17227,13 @@
17307
17227
  return null;
17308
17228
  }
17309
17229
  const sundayJanuarySecond2000 = new Date(2000, 0, 2);
17310
- function getWeekdays(locale, firstDayOfWeek, weekdayFormat) {
17230
+ function getWeekdays(locale, firstDayOfWeek) {
17311
17231
  const daysFromSunday = firstDayOfWeek ?? weekInfo(locale)?.firstDay ?? 0;
17312
17232
  return createRange(7).map(i => {
17313
17233
  const weekday = new Date(sundayJanuarySecond2000);
17314
17234
  weekday.setDate(sundayJanuarySecond2000.getDate() + daysFromSunday + i);
17315
17235
  return new Intl.DateTimeFormat(locale, {
17316
- weekday: weekdayFormat ?? 'narrow'
17236
+ weekday: 'narrow'
17317
17237
  }).format(weekday);
17318
17238
  });
17319
17239
  }
@@ -17777,9 +17697,9 @@
17777
17697
  getDiff(date, comparing, unit) {
17778
17698
  return getDiff(date, comparing, unit);
17779
17699
  }
17780
- getWeekdays(firstDayOfWeek, weekdayFormat) {
17700
+ getWeekdays(firstDayOfWeek) {
17781
17701
  const firstDay = firstDayOfWeek !== undefined ? Number(firstDayOfWeek) : undefined;
17782
- return getWeekdays(this.locale, firstDay, weekdayFormat);
17702
+ return getWeekdays(this.locale, firstDay);
17783
17703
  }
17784
17704
  getYear(date) {
17785
17705
  return getYear(date);
@@ -18122,7 +18042,6 @@
18122
18042
  _search.value = val ?? '';
18123
18043
  if (!props.multiple && !hasSelectionSlot.value) {
18124
18044
  model.value = [transformItem$3(props, val)];
18125
- vue.nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
18126
18045
  }
18127
18046
  if (val && props.multiple && props.delimiters?.length) {
18128
18047
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18439,22 +18358,6 @@
18439
18358
  active: highlightFirst.value && index === 0 ? true : undefined,
18440
18359
  onClick: () => select(item, null)
18441
18360
  });
18442
- if (item.raw.type === 'divider') {
18443
- return slots.divider?.({
18444
- props: item.raw,
18445
- index
18446
- }) ?? vue.createVNode(VDivider, vue.mergeProps(item.props, {
18447
- "key": `divider-${index}`
18448
- }), null);
18449
- }
18450
- if (item.raw.type === 'subheader') {
18451
- return slots.subheader?.({
18452
- props: item.raw,
18453
- index
18454
- }) ?? vue.createVNode(VListSubheader, vue.mergeProps(item.props, {
18455
- "key": `subheader-${index}`
18456
- }), null);
18457
- }
18458
18361
  return slots.item?.({
18459
18362
  item,
18460
18363
  index,
@@ -22098,8 +22001,7 @@
22098
22001
  firstDayOfWeek: {
22099
22002
  type: [Number, String],
22100
22003
  default: undefined
22101
- },
22102
- weekdayFormat: String
22004
+ }
22103
22005
  }, 'calendar');
22104
22006
  function useCalendar(props) {
22105
22007
  const adapter = useDate();
@@ -22347,7 +22249,7 @@
22347
22249
  "ref": daysRef,
22348
22250
  "key": daysInMonth.value[0].date?.toString(),
22349
22251
  "class": "v-date-picker-month__days"
22350
- }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek, props.weekdayFormat).map(weekDay => vue.createVNode("div", {
22252
+ }, [!props.hideWeekdays && adapter.getWeekdays(props.firstDayOfWeek).map(weekDay => vue.createVNode("div", {
22351
22253
  "class": ['v-date-picker-month__day', 'v-date-picker-month__weekday']
22352
22254
  }, [weekDay])), daysInMonth.value.map((item, i) => {
22353
22255
  const slotProps = {
@@ -24465,7 +24367,7 @@
24465
24367
  function getProgress(pos) {
24466
24368
  let limit = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
24467
24369
  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();
24468
- return limit ? Math.max(0, Math.min(1, progress)) : progress;
24370
+ return limit ? clamp(progress) : progress;
24469
24371
  }
24470
24372
  function onTouchstart(e) {
24471
24373
  if (touchless.value) return;
@@ -24878,10 +24780,6 @@
24878
24780
  type: Number,
24879
24781
  default: 0
24880
24782
  },
24881
- minFractionDigits: {
24882
- type: Number,
24883
- default: null
24884
- },
24885
24783
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
24886
24784
  }, 'VNumberInput');
24887
24785
  const VNumberInput = genericComponent()({
@@ -24912,19 +24810,9 @@
24912
24810
  } = useFocus(props);
24913
24811
  function correctPrecision(val) {
24914
24812
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
24915
- if (precision == null) {
24916
- return String(val);
24917
- }
24918
- let fixed = val.toFixed(precision);
24919
- if (isFocused.value) {
24920
- return Number(fixed).toString(); // trim zeros
24921
- }
24922
- if ((props.minFractionDigits ?? precision) < precision) {
24923
- const trimLimit = precision - props.minFractionDigits;
24924
- const [baseDigits, fractionDigits] = fixed.split('.');
24925
- fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
24926
- }
24927
- return fixed;
24813
+ const fixed = precision == null ? String(val) : val.toFixed(precision);
24814
+ return isFocused.value ? Number(fixed).toString() // trim zeros
24815
+ : fixed;
24928
24816
  }
24929
24817
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
24930
24818
  const _inputText = vue.shallowRef(null);
@@ -24964,6 +24852,9 @@
24964
24852
  const controlNodeDefaultHeight = vue.toRef(() => controlVariant.value === 'stacked' ? 'auto' : '100%');
24965
24853
  const incrementSlotProps = {
24966
24854
  props: {
24855
+ style: {
24856
+ touchAction: 'none'
24857
+ },
24967
24858
  onClick: onControlClick,
24968
24859
  onPointerup: onControlMouseup,
24969
24860
  onPointerdown: onUpControlMousedown
@@ -24971,13 +24862,15 @@
24971
24862
  };
24972
24863
  const decrementSlotProps = {
24973
24864
  props: {
24865
+ style: {
24866
+ touchAction: 'none'
24867
+ },
24974
24868
  onClick: onControlClick,
24975
24869
  onPointerup: onControlMouseup,
24976
24870
  onPointerdown: onDownControlMousedown
24977
24871
  }
24978
24872
  };
24979
24873
  vue.watch(() => props.precision, () => formatInputValue());
24980
- vue.watch(() => props.minFractionDigits, () => formatInputValue());
24981
24874
  vue.onMounted(() => {
24982
24875
  clampModel();
24983
24876
  });
@@ -25079,7 +24972,7 @@
25079
24972
  inputText.value = null;
25080
24973
  return;
25081
24974
  }
25082
- inputText.value = correctPrecision(model.value);
24975
+ inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25083
24976
  }
25084
24977
  function trimDecimalZeros() {
25085
24978
  if (controlsDisabled.value) return;
@@ -25104,17 +24997,18 @@
25104
24997
  } = VTextField.filterProps(props);
25105
24998
  function incrementControlNode() {
25106
24999
  return !slots.increment ? vue.createVNode(VBtn, {
25000
+ "aria-hidden": "true",
25001
+ "data-testid": "increment",
25107
25002
  "disabled": !canIncrease.value,
25108
25003
  "flat": true,
25109
- "key": "increment-btn",
25110
25004
  "height": controlNodeDefaultHeight.value,
25111
- "data-testid": "increment",
25112
- "aria-hidden": "true",
25113
25005
  "icon": incrementIcon.value,
25006
+ "key": "increment-btn",
25114
25007
  "onClick": onControlClick,
25115
- "onPointerup": onControlMouseup,
25116
25008
  "onPointerdown": onUpControlMousedown,
25009
+ "onPointerup": onControlMouseup,
25117
25010
  "size": controlNodeSize.value,
25011
+ "style": "touch-action: none",
25118
25012
  "tabindex": "-1"
25119
25013
  }, null) : vue.createVNode(VDefaultsProvider, {
25120
25014
  "key": "increment-defaults",
@@ -25133,18 +25027,19 @@
25133
25027
  }
25134
25028
  function decrementControlNode() {
25135
25029
  return !slots.decrement ? vue.createVNode(VBtn, {
25030
+ "aria-hidden": "true",
25031
+ "data-testid": "decrement",
25136
25032
  "disabled": !canDecrease.value,
25137
25033
  "flat": true,
25138
- "key": "decrement-btn",
25139
25034
  "height": controlNodeDefaultHeight.value,
25140
- "data-testid": "decrement",
25141
- "aria-hidden": "true",
25142
25035
  "icon": decrementIcon.value,
25143
- "size": controlNodeSize.value,
25144
- "tabindex": "-1",
25036
+ "key": "decrement-btn",
25145
25037
  "onClick": onControlClick,
25038
+ "onPointerdown": onDownControlMousedown,
25146
25039
  "onPointerup": onControlMouseup,
25147
- "onPointerdown": onDownControlMousedown
25040
+ "size": controlNodeSize.value,
25041
+ "style": "touch-action: none",
25042
+ "tabindex": "-1"
25148
25043
  }, null) : vue.createVNode(VDefaultsProvider, {
25149
25044
  "key": "decrement-defaults",
25150
25045
  "defaults": {
@@ -30046,6 +29941,11 @@
30046
29941
  hideOverlay: Boolean,
30047
29942
  icon: [String, Function, Object],
30048
29943
  iconColor: String,
29944
+ iconSize: [Number, String],
29945
+ iconSizes: {
29946
+ type: Array,
29947
+ default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
29948
+ },
30049
29949
  loading: Boolean,
30050
29950
  opacity: [Number, String],
30051
29951
  readonly: Boolean,
@@ -30065,7 +29965,6 @@
30065
29965
  ...makeBorderProps(),
30066
29966
  ...makeComponentProps(),
30067
29967
  ...makeElevationProps(),
30068
- ...makeIconSizeProps(),
30069
29968
  ...makeRoundedProps(),
30070
29969
  ...makeTagProps({
30071
29970
  tag: 'button'
@@ -30120,6 +30019,7 @@
30120
30019
  })()
30121
30020
  }));
30122
30021
  const btnSizeMap = new Map(props.sizes);
30022
+ const iconSizeMap = new Map(props.iconSizes);
30123
30023
  function onClick() {
30124
30024
  if (props.disabled || props.readonly || isActive.value === undefined || props.tag === 'a' && attrs.href) return;
30125
30025
  isActive.value = !isActive.value;
@@ -30131,12 +30031,12 @@
30131
30031
  const btnSize = hasNamedSize ? btnSizeMap.get(_btnSize) : _btnSize;
30132
30032
  const btnHeight = props.height ?? btnSize;
30133
30033
  const btnWidth = props.width ?? btnSize;
30134
- const {
30135
- iconSize
30136
- } = useIconSizes(props, () => new Map(props.iconSizes).get(_btnSize));
30034
+ const _iconSize = props.iconSize;
30035
+ const hasNamedIconSize = iconSizeMap.has(_iconSize);
30036
+ const iconSize = !_iconSize ? hasNamedSize ? iconSizeMap.get(_btnSize) : iconSizeMap.get('default') : hasNamedIconSize ? iconSizeMap.get(_iconSize) : _iconSize;
30137
30037
  const iconProps = {
30138
30038
  icon,
30139
- size: iconSize.value,
30039
+ size: iconSize,
30140
30040
  iconColor: props.iconColor,
30141
30041
  opacity: props.opacity
30142
30042
  };
@@ -30179,7 +30079,7 @@
30179
30079
  "color": typeof props.loading === 'boolean' ? undefined : props.loading,
30180
30080
  "indeterminate": "disable-shrink",
30181
30081
  "width": "2",
30182
- "size": iconSize.value
30082
+ "size": iconSize
30183
30083
  }, null)])]
30184
30084
  });
30185
30085
  });
@@ -32089,7 +31989,7 @@
32089
31989
  };
32090
31990
  });
32091
31991
  }
32092
- const version$1 = "3.8.6-dev.2025-05-21";
31992
+ const version$1 = "3.8.6-master.2025-05-22";
32093
31993
  createVuetify$1.version = version$1;
32094
31994
 
32095
31995
  // Vue's inject() can only be used in setup
@@ -32387,7 +32287,7 @@
32387
32287
 
32388
32288
  /* eslint-disable local-rules/sort-imports */
32389
32289
 
32390
- const version = "3.8.6-dev.2025-05-21";
32290
+ const version = "3.8.6-master.2025-05-22";
32391
32291
 
32392
32292
  /* eslint-disable local-rules/sort-imports */
32393
32293