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

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 (90) hide show
  1. package/CHANGELOG.md +21 -14
  2. package/dist/json/attributes.json +1331 -1311
  3. package/dist/json/importMap-labs.json +24 -24
  4. package/dist/json/importMap.json +192 -192
  5. package/dist/json/tags.json +5 -0
  6. package/dist/json/web-types.json +2610 -2471
  7. package/dist/vuetify-labs.cjs +288 -117
  8. package/dist/vuetify-labs.css +3866 -3838
  9. package/dist/vuetify-labs.d.ts +1490 -1352
  10. package/dist/vuetify-labs.esm.js +289 -118
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +288 -117
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +282 -106
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +3130 -3102
  17. package/dist/vuetify.d.ts +659 -519
  18. package/dist/vuetify.esm.js +283 -107
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +282 -106
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1188 -1178
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VAlert/VAlert.css +6 -1
  26. package/lib/components/VAlert/VAlert.d.ts +35 -0
  27. package/lib/components/VAlert/VAlert.js +14 -9
  28. package/lib/components/VAlert/VAlert.js.map +1 -1
  29. package/lib/components/VAlert/VAlert.sass +7 -1
  30. package/lib/components/VAutocomplete/VAutocomplete.d.ts +120 -96
  31. package/lib/components/VAutocomplete/VAutocomplete.js +18 -1
  32. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  33. package/lib/components/VBtnGroup/VBtnGroup.css +30 -7
  34. package/lib/components/VBtnGroup/VBtnGroup.d.ts +58 -32
  35. package/lib/components/VBtnGroup/VBtnGroup.js +7 -3
  36. package/lib/components/VBtnGroup/VBtnGroup.js.map +1 -1
  37. package/lib/components/VBtnGroup/VBtnGroup.sass +44 -17
  38. package/lib/components/VBtnToggle/VBtnToggle.d.ts +25 -0
  39. package/lib/components/VCheckbox/VCheckbox.d.ts +3 -3
  40. package/lib/components/VCombobox/VCombobox.d.ts +120 -96
  41. package/lib/components/VCombobox/VCombobox.js +19 -1
  42. package/lib/components/VCombobox/VCombobox.js.map +1 -1
  43. package/lib/components/VField/VField.d.ts +3 -3
  44. package/lib/components/VFileInput/VFileInput.d.ts +15 -15
  45. package/lib/components/VInput/VInput.d.ts +4 -4
  46. package/lib/components/VList/VListChildren.js.map +1 -1
  47. package/lib/components/VNumberInput/VNumberInput.d.ts +103 -89
  48. package/lib/components/VNumberInput/VNumberInput.js +19 -4
  49. package/lib/components/VNumberInput/VNumberInput.js.map +1 -1
  50. package/lib/components/VOverlay/VOverlay.css +1 -1
  51. package/lib/components/VOverlay/_variables.scss +1 -1
  52. package/lib/components/VRadioGroup/VRadioGroup.d.ts +3 -3
  53. package/lib/components/VRangeSlider/VRangeSlider.d.ts +3 -3
  54. package/lib/components/VSelect/VSelect.d.ts +120 -96
  55. package/lib/components/VSelect/VSelect.js +18 -1
  56. package/lib/components/VSelect/VSelect.js.map +1 -1
  57. package/lib/components/VSlider/VSlider.d.ts +3 -3
  58. package/lib/components/VSwitch/VSwitch.d.ts +3 -3
  59. package/lib/components/VTextField/VTextField.d.ts +27 -27
  60. package/lib/components/VTextarea/VTextarea.d.ts +15 -15
  61. package/lib/composables/calendar.d.ts +1 -0
  62. package/lib/composables/calendar.js.map +1 -1
  63. package/lib/composables/date/index.d.ts +1 -0
  64. package/lib/composables/date/index.js +1 -0
  65. package/lib/composables/date/index.js.map +1 -1
  66. package/lib/composables/filter.js +3 -0
  67. package/lib/composables/filter.js.map +1 -1
  68. package/lib/composables/iconSizes.d.ts +28 -0
  69. package/lib/composables/iconSizes.js +23 -0
  70. package/lib/composables/iconSizes.js.map +1 -0
  71. package/lib/composables/theme.d.ts +6 -1
  72. package/lib/composables/theme.js +94 -26
  73. package/lib/composables/theme.js.map +1 -1
  74. package/lib/composables/virtual.js +6 -1
  75. package/lib/composables/virtual.js.map +1 -1
  76. package/lib/entry-bundler.js +1 -1
  77. package/lib/entry-bundler.js.map +1 -1
  78. package/lib/framework.d.ts +74 -69
  79. package/lib/framework.js +1 -1
  80. package/lib/framework.js.map +1 -1
  81. package/lib/labs/VColorInput/VColorInput.d.ts +3 -3
  82. package/lib/labs/VDateInput/VDateInput.d.ts +87 -87
  83. package/lib/labs/VFileUpload/VFileUpload.d.ts +3 -3
  84. package/lib/labs/VIconBtn/VIconBtn.d.ts +29 -29
  85. package/lib/labs/VIconBtn/VIconBtn.js +7 -11
  86. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  87. package/lib/util/globals.d.ts +1 -0
  88. package/lib/util/globals.js +1 -0
  89. package/lib/util/globals.js.map +1 -1
  90. package/package.json +3 -1
@@ -1,10 +1,10 @@
1
1
  /*!
2
- * Vuetify v3.8.5-master.2025-05-20
2
+ * Vuetify v3.8.6-dev.2025-05-21
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
6
6
 
7
- import { shallowRef, reactive, watchEffect, toRef, capitalize, unref, Fragment, isVNode, Comment, warn, getCurrentInstance as getCurrentInstance$1, ref, computed, provide, inject as inject$1, defineComponent as defineComponent$1, h, camelize, onBeforeUnmount, watch, readonly, onMounted, useId, onDeactivated, onActivated, onScopeDispose, effectScope, toRaw, createVNode, TransitionGroup, Transition, mergeProps, toRefs, toValue, isRef, onBeforeMount, nextTick, withDirectives, resolveDirective, vShow, onUpdated, Text, resolveDynamicComponent, toDisplayString, markRaw, Teleport, cloneVNode, createTextVNode, onUnmounted, onBeforeUpdate, withModifiers, vModelText, resolveComponent, render } from 'vue';
7
+ import { shallowRef, reactive, watchEffect, toRef, capitalize, unref, Fragment, isVNode, Comment, warn, getCurrentInstance as getCurrentInstance$1, ref, computed, provide, inject as inject$1, defineComponent as defineComponent$1, h, camelize, onBeforeUnmount, watch, readonly, onMounted, useId, onDeactivated, onActivated, onScopeDispose, effectScope, toRaw, getCurrentScope, createVNode, TransitionGroup, Transition, mergeProps, toRefs, toValue, isRef, onBeforeMount, nextTick, withDirectives, resolveDirective, vShow, onUpdated, Text, resolveDynamicComponent, toDisplayString, markRaw, Teleport, cloneVNode, createTextVNode, onUnmounted, onBeforeUpdate, withModifiers, vModelText, resolveComponent, render } from 'vue';
8
8
 
9
9
  // Types
10
10
  // eslint-disable-line vue/prefer-import-from-vue
@@ -81,6 +81,7 @@ const IN_BROWSER = typeof window !== 'undefined';
81
81
  const SUPPORTS_INTERSECTION = IN_BROWSER && 'IntersectionObserver' in window;
82
82
  const SUPPORTS_TOUCH = IN_BROWSER && ('ontouchstart' in window || window.navigator.maxTouchPoints > 0);
83
83
  const SUPPORTS_EYE_DROPPER = IN_BROWSER && 'EyeDropper' in window;
84
+ const SUPPORTS_MATCH_MEDIA = IN_BROWSER && 'matchMedia' in window && typeof window.matchMedia === 'function';
84
85
 
85
86
  function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
86
87
  function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
@@ -2295,6 +2296,7 @@ const makeThemeProps = propsFactory({
2295
2296
  function genDefaults$2() {
2296
2297
  return {
2297
2298
  defaultTheme: 'light',
2299
+ prefix: 'v-',
2298
2300
  variations: {
2299
2301
  colors: [],
2300
2302
  lighten: 0,
@@ -2376,7 +2378,10 @@ function genDefaults$2() {
2376
2378
  }
2377
2379
  }
2378
2380
  },
2379
- stylesheetId: 'vuetify-theme-stylesheet'
2381
+ stylesheetId: 'vuetify-theme-stylesheet',
2382
+ scoped: false,
2383
+ unimportant: false,
2384
+ utilities: true
2380
2385
  };
2381
2386
  }
2382
2387
  function parseThemeOptions() {
@@ -2399,21 +2404,21 @@ function parseThemeOptions() {
2399
2404
  function createCssClass(lines, selector, content, scope) {
2400
2405
  lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
2401
2406
  }
2402
- function genCssVariables(theme) {
2407
+ function genCssVariables(theme, prefix) {
2403
2408
  const lightOverlay = theme.dark ? 2 : 1;
2404
2409
  const darkOverlay = theme.dark ? 1 : 2;
2405
2410
  const variables = [];
2406
2411
  for (const [key, value] of Object.entries(theme.colors)) {
2407
2412
  const rgb = parseColor(value);
2408
- variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2413
+ variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2409
2414
  if (!key.startsWith('on-')) {
2410
- variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2415
+ variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2411
2416
  }
2412
2417
  }
2413
2418
  for (const [key, value] of Object.entries(theme.variables)) {
2414
2419
  const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
2415
2420
  const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
2416
- variables.push(`--v-${key}: ${rgb ?? value}`);
2421
+ variables.push(`--${prefix}${key}: ${rgb ?? value}`);
2417
2422
  }
2418
2423
  return variables;
2419
2424
  }
@@ -2457,7 +2462,8 @@ function getScopedSelector(selector, scope) {
2457
2462
  const scopeSelector = `:where(${scope})`;
2458
2463
  return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
2459
2464
  }
2460
- function upsertStyles(styleEl, styles) {
2465
+ function upsertStyles(id, cspNonce, styles) {
2466
+ const styleEl = getOrCreateStyleElement(id, cspNonce);
2461
2467
  if (!styleEl) return;
2462
2468
  styleEl.innerHTML = styles;
2463
2469
  }
@@ -2477,8 +2483,17 @@ function getOrCreateStyleElement(id, cspNonce) {
2477
2483
  // Composables
2478
2484
  function createTheme(options) {
2479
2485
  const parsedOptions = parseThemeOptions(options);
2480
- const name = shallowRef(parsedOptions.defaultTheme);
2486
+ const _name = shallowRef(parsedOptions.defaultTheme);
2481
2487
  const themes = ref(parsedOptions.themes);
2488
+ const systemName = shallowRef('light');
2489
+ const name = computed({
2490
+ get() {
2491
+ return _name.value === 'system' ? systemName.value : _name.value;
2492
+ },
2493
+ set(val) {
2494
+ _name.value = val;
2495
+ }
2496
+ });
2482
2497
  const computedThemes = computed(() => {
2483
2498
  const acc = {};
2484
2499
  for (const [name, original] of Object.entries(themes.value)) {
@@ -2499,28 +2514,49 @@ function createTheme(options) {
2499
2514
  const current = toRef(() => computedThemes.value[name.value]);
2500
2515
  const styles = computed(() => {
2501
2516
  const lines = [];
2517
+ const important = parsedOptions.unimportant ? '' : ' !important';
2518
+ const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
2502
2519
  if (current.value?.dark) {
2503
2520
  createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
2504
2521
  }
2505
- createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
2522
+ createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
2506
2523
  for (const [themeName, theme] of Object.entries(computedThemes.value)) {
2507
- createCssClass(lines, `.v-theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme)], parsedOptions.scope);
2508
- }
2509
- const bgLines = [];
2510
- const fgLines = [];
2511
- const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
2512
- for (const key of colors) {
2513
- if (key.startsWith('on-')) {
2514
- createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
2515
- } else {
2516
- 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);
2517
- createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
2518
- createCssClass(fgLines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`], parsedOptions.scope);
2524
+ createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
2525
+ }
2526
+ if (parsedOptions.utilities) {
2527
+ const bgLines = [];
2528
+ const fgLines = [];
2529
+ const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
2530
+ for (const key of colors) {
2531
+ if (key.startsWith('on-')) {
2532
+ createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
2533
+ } else {
2534
+ createCssClass(bgLines, `.${scoped}bg-${key}`, [`--${parsedOptions.prefix}theme-overlay-multiplier: var(--${parsedOptions.prefix}theme-${key}-overlay-multiplier)`, `background-color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`, `color: rgb(var(--${parsedOptions.prefix}theme-on-${key}))${important}`], parsedOptions.scope);
2535
+ createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
2536
+ createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
2537
+ }
2519
2538
  }
2539
+ lines.push(...bgLines, ...fgLines);
2520
2540
  }
2521
- lines.push(...bgLines, ...fgLines);
2522
2541
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
2523
2542
  });
2543
+ const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
2544
+ const themeNames = toRef(() => Object.keys(computedThemes.value));
2545
+ if (SUPPORTS_MATCH_MEDIA) {
2546
+ const media = window.matchMedia('(prefers-color-scheme: dark)');
2547
+ function updateSystemName() {
2548
+ systemName.value = media.matches ? 'dark' : 'light';
2549
+ }
2550
+ updateSystemName();
2551
+ media.addEventListener('change', updateSystemName, {
2552
+ passive: true
2553
+ });
2554
+ if (getCurrentScope()) {
2555
+ onScopeDispose(() => {
2556
+ media.removeEventListener('change', updateSystemName);
2557
+ });
2558
+ }
2559
+ }
2524
2560
  function install(app) {
2525
2561
  if (parsedOptions.isDisabled) return;
2526
2562
  const head = app._context.provides.usehead;
@@ -2558,22 +2594,55 @@ function createTheme(options) {
2558
2594
  updateStyles();
2559
2595
  }
2560
2596
  function updateStyles() {
2561
- upsertStyles(getOrCreateStyleElement(parsedOptions.stylesheetId, parsedOptions.cspNonce), styles.value);
2597
+ upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
2562
2598
  }
2563
2599
  }
2564
2600
  }
2565
- const themeClasses = toRef(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);
2601
+ function change(themeName) {
2602
+ if (!themeNames.value.includes(themeName)) {
2603
+ consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
2604
+ return;
2605
+ }
2606
+ name.value = themeName;
2607
+ }
2608
+ function cycle() {
2609
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
2610
+ const currentIndex = themeArray.indexOf(name.value);
2611
+ const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
2612
+ change(themeArray[nextIndex]);
2613
+ }
2614
+ function toggle() {
2615
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
2616
+ cycle(themeArray);
2617
+ }
2618
+ const globalName = new Proxy(name, {
2619
+ get(target, prop) {
2620
+ return target[prop];
2621
+ },
2622
+ set(target, prop, val) {
2623
+ if (prop === 'value') {
2624
+ deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
2625
+ }
2626
+ // @ts-expect-error
2627
+ target[prop] = val;
2628
+ return true;
2629
+ }
2630
+ });
2566
2631
  return {
2567
2632
  install,
2633
+ change,
2634
+ cycle,
2635
+ toggle,
2568
2636
  isDisabled: parsedOptions.isDisabled,
2569
2637
  name,
2570
2638
  themes,
2571
2639
  current,
2572
2640
  computedThemes,
2641
+ prefix: parsedOptions.prefix,
2573
2642
  themeClasses,
2574
2643
  styles,
2575
2644
  global: {
2576
- name,
2645
+ name: globalName,
2577
2646
  current
2578
2647
  }
2579
2648
  };
@@ -2584,7 +2653,7 @@ function provideTheme(props) {
2584
2653
  if (!theme) throw new Error('Could not find Vuetify theme injection');
2585
2654
  const name = toRef(() => props.theme ?? theme.name.value);
2586
2655
  const current = toRef(() => theme.themes.value[name.value]);
2587
- const themeClasses = toRef(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);
2656
+ const themeClasses = toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
2588
2657
  const newTheme = {
2589
2658
  ...theme,
2590
2659
  name,
@@ -4131,9 +4200,15 @@ function useVariant(props) {
4131
4200
  };
4132
4201
  }
4133
4202
 
4203
+ // Types
4204
+
4134
4205
  const makeVBtnGroupProps = propsFactory({
4135
4206
  baseColor: String,
4136
4207
  divided: Boolean,
4208
+ direction: {
4209
+ type: String,
4210
+ default: 'horizontal'
4211
+ },
4137
4212
  ...makeBorderProps(),
4138
4213
  ...makeComponentProps(),
4139
4214
  ...makeDensityProps(),
@@ -4167,7 +4242,7 @@ const VBtnGroup = genericComponent()({
4167
4242
  } = useRounded(props);
4168
4243
  provideDefaults({
4169
4244
  VBtn: {
4170
- height: 'auto',
4245
+ height: toRef(() => props.direction === 'horizontal' ? 'auto' : null),
4171
4246
  baseColor: toRef(() => props.baseColor),
4172
4247
  color: toRef(() => props.color),
4173
4248
  density: toRef(() => props.density),
@@ -4177,7 +4252,7 @@ const VBtnGroup = genericComponent()({
4177
4252
  });
4178
4253
  useRender(() => {
4179
4254
  return createVNode(props.tag, {
4180
- "class": ['v-btn-group', {
4255
+ "class": ['v-btn-group', `v-btn-group--${props.direction}`, {
4181
4256
  'v-btn-group--divided': props.divided
4182
4257
  }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class],
4183
4258
  "style": props.style
@@ -5865,6 +5940,31 @@ const VAppBarTitle = genericComponent()({
5865
5940
  // Utilities
5866
5941
  const VAlertTitle = createSimpleFunctional('v-alert-title');
5867
5942
 
5943
+ // Utilities
5944
+
5945
+ // Types
5946
+
5947
+ // Types
5948
+
5949
+ // Composables
5950
+ const makeIconSizeProps = propsFactory({
5951
+ iconSize: [Number, String],
5952
+ iconSizes: {
5953
+ type: Array,
5954
+ default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
5955
+ }
5956
+ }, 'iconSize');
5957
+ function useIconSizes(props, fallback) {
5958
+ const iconSize = computed(() => {
5959
+ const iconSizeMap = new Map(props.iconSizes);
5960
+ const _iconSize = props.iconSize ?? fallback() ?? 'default';
5961
+ return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
5962
+ });
5963
+ return {
5964
+ iconSize
5965
+ };
5966
+ }
5967
+
5868
5968
  // Types
5869
5969
 
5870
5970
  const allowedTypes = ['success', 'info', 'warning', 'error'];
@@ -5904,6 +6004,7 @@ const makeVAlertProps = propsFactory({
5904
6004
  ...makeDensityProps(),
5905
6005
  ...makeDimensionProps(),
5906
6006
  ...makeElevationProps(),
6007
+ ...makeIconSizeProps(),
5907
6008
  ...makeLocationProps(),
5908
6009
  ...makePositionProps(),
5909
6010
  ...makeRoundedProps(),
@@ -5931,6 +6032,9 @@ const VAlert = genericComponent()({
5931
6032
  if (!props.type) return props.icon;
5932
6033
  return props.icon ?? `$${props.type}`;
5933
6034
  });
6035
+ const {
6036
+ iconSize
6037
+ } = useIconSizes(props, () => props.prominent ? 44 : 28);
5934
6038
  const {
5935
6039
  themeClasses
5936
6040
  } = provideTheme(props);
@@ -5978,6 +6082,11 @@ const VAlert = genericComponent()({
5978
6082
  const hasPrepend = !!(slots.prepend || icon.value);
5979
6083
  const hasTitle = !!(slots.title || props.title);
5980
6084
  const hasClose = !!(slots.close || props.closable);
6085
+ const iconProps = {
6086
+ density: props.density,
6087
+ icon: icon.value,
6088
+ size: iconSize.value
6089
+ };
5981
6090
  return isActive.value && createVNode(props.tag, {
5982
6091
  "class": ['v-alert', props.border && {
5983
6092
  'v-alert--border': !!props.border,
@@ -5995,19 +6104,14 @@ const VAlert = genericComponent()({
5995
6104
  }, null), hasPrepend && createVNode("div", {
5996
6105
  "key": "prepend",
5997
6106
  "class": "v-alert__prepend"
5998
- }, [!slots.prepend ? createVNode(VIcon, {
5999
- "key": "prepend-icon",
6000
- "density": props.density,
6001
- "icon": icon.value,
6002
- "size": props.prominent ? 44 : 28
6003
- }, null) : createVNode(VDefaultsProvider, {
6107
+ }, [!slots.prepend ? createVNode(VIcon, mergeProps({
6108
+ "key": "prepend-icon"
6109
+ }, iconProps), null) : createVNode(VDefaultsProvider, {
6004
6110
  "key": "prepend-defaults",
6005
6111
  "disabled": !icon.value,
6006
6112
  "defaults": {
6007
6113
  VIcon: {
6008
- density: props.density,
6009
- icon: icon.value,
6010
- size: props.prominent ? 44 : 28
6114
+ ...iconProps
6011
6115
  }
6012
6116
  }
6013
6117
  }, slots.prepend)]), createVNode("div", {
@@ -8205,6 +8309,68 @@ const VChip = genericComponent()({
8205
8309
  }
8206
8310
  });
8207
8311
 
8312
+ const makeVDividerProps = propsFactory({
8313
+ color: String,
8314
+ inset: Boolean,
8315
+ length: [Number, String],
8316
+ opacity: [Number, String],
8317
+ thickness: [Number, String],
8318
+ vertical: Boolean,
8319
+ ...makeComponentProps(),
8320
+ ...makeThemeProps()
8321
+ }, 'VDivider');
8322
+ const VDivider = genericComponent()({
8323
+ name: 'VDivider',
8324
+ props: makeVDividerProps(),
8325
+ setup(props, _ref) {
8326
+ let {
8327
+ attrs,
8328
+ slots
8329
+ } = _ref;
8330
+ const {
8331
+ themeClasses
8332
+ } = provideTheme(props);
8333
+ const {
8334
+ textColorClasses,
8335
+ textColorStyles
8336
+ } = useTextColor(() => props.color);
8337
+ const dividerStyles = computed(() => {
8338
+ const styles = {};
8339
+ if (props.length) {
8340
+ styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
8341
+ }
8342
+ if (props.thickness) {
8343
+ styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
8344
+ }
8345
+ return styles;
8346
+ });
8347
+ useRender(() => {
8348
+ const divider = createVNode("hr", {
8349
+ "class": [{
8350
+ 'v-divider': true,
8351
+ 'v-divider--inset': props.inset,
8352
+ 'v-divider--vertical': props.vertical
8353
+ }, themeClasses.value, textColorClasses.value, props.class],
8354
+ "style": [dividerStyles.value, textColorStyles.value, {
8355
+ '--v-border-opacity': props.opacity
8356
+ }, props.style],
8357
+ "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
8358
+ "role": `${attrs.role || 'separator'}`
8359
+ }, null);
8360
+ if (!slots.default) return divider;
8361
+ return createVNode("div", {
8362
+ "class": ['v-divider__wrapper', {
8363
+ 'v-divider__wrapper--vertical': props.vertical,
8364
+ 'v-divider__wrapper--inset': props.inset
8365
+ }]
8366
+ }, [divider, createVNode("div", {
8367
+ "class": "v-divider__content"
8368
+ }, [slots.default()]), divider]);
8369
+ });
8370
+ return {};
8371
+ }
8372
+ });
8373
+
8208
8374
  // Utilities
8209
8375
 
8210
8376
  // List
@@ -9356,68 +9522,6 @@ const VListSubheader = genericComponent()({
9356
9522
  }
9357
9523
  });
9358
9524
 
9359
- const makeVDividerProps = propsFactory({
9360
- color: String,
9361
- inset: Boolean,
9362
- length: [Number, String],
9363
- opacity: [Number, String],
9364
- thickness: [Number, String],
9365
- vertical: Boolean,
9366
- ...makeComponentProps(),
9367
- ...makeThemeProps()
9368
- }, 'VDivider');
9369
- const VDivider = genericComponent()({
9370
- name: 'VDivider',
9371
- props: makeVDividerProps(),
9372
- setup(props, _ref) {
9373
- let {
9374
- attrs,
9375
- slots
9376
- } = _ref;
9377
- const {
9378
- themeClasses
9379
- } = provideTheme(props);
9380
- const {
9381
- textColorClasses,
9382
- textColorStyles
9383
- } = useTextColor(() => props.color);
9384
- const dividerStyles = computed(() => {
9385
- const styles = {};
9386
- if (props.length) {
9387
- styles[props.vertical ? 'height' : 'width'] = convertToUnit(props.length);
9388
- }
9389
- if (props.thickness) {
9390
- styles[props.vertical ? 'borderRightWidth' : 'borderTopWidth'] = convertToUnit(props.thickness);
9391
- }
9392
- return styles;
9393
- });
9394
- useRender(() => {
9395
- const divider = createVNode("hr", {
9396
- "class": [{
9397
- 'v-divider': true,
9398
- 'v-divider--inset': props.inset,
9399
- 'v-divider--vertical': props.vertical
9400
- }, themeClasses.value, textColorClasses.value, props.class],
9401
- "style": [dividerStyles.value, textColorStyles.value, {
9402
- '--v-border-opacity': props.opacity
9403
- }, props.style],
9404
- "aria-orientation": !attrs.role || attrs.role === 'separator' ? props.vertical ? 'vertical' : 'horizontal' : undefined,
9405
- "role": `${attrs.role || 'separator'}`
9406
- }, null);
9407
- if (!slots.default) return divider;
9408
- return createVNode("div", {
9409
- "class": ['v-divider__wrapper', {
9410
- 'v-divider__wrapper--vertical': props.vertical,
9411
- 'v-divider__wrapper--inset': props.inset
9412
- }]
9413
- }, [divider, createVNode("div", {
9414
- "class": "v-divider__content"
9415
- }, [slots.default()]), divider]);
9416
- });
9417
- return {};
9418
- }
9419
- });
9420
-
9421
9525
  // Types
9422
9526
 
9423
9527
  const makeVListChildrenProps = propsFactory({
@@ -12335,7 +12439,12 @@ function useVirtual(props, items) {
12335
12439
  }
12336
12440
  function calculateOffset(index) {
12337
12441
  index = clamp(index, 0, items.value.length - 1);
12338
- return offsets[index] || 0;
12442
+ const whole = Math.floor(index);
12443
+ const fraction = index % 1;
12444
+ const next = whole + 1;
12445
+ const wholeOffset = offsets[whole] || 0;
12446
+ const nextOffset = offsets[next] || wholeOffset;
12447
+ return wholeOffset + (nextOffset - wholeOffset) * fraction;
12339
12448
  }
12340
12449
  function calculateIndex(scrollTop) {
12341
12450
  return binaryClosest(offsets, scrollTop);
@@ -12966,6 +13075,22 @@ const VSelect = genericComponent()({
12966
13075
  key: item.value,
12967
13076
  onClick: () => select(item, null)
12968
13077
  });
13078
+ if (item.raw.type === 'divider') {
13079
+ return slots.divider?.({
13080
+ props: item.raw,
13081
+ index
13082
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
13083
+ "key": `divider-${index}`
13084
+ }), null);
13085
+ }
13086
+ if (item.raw.type === 'subheader') {
13087
+ return slots.subheader?.({
13088
+ props: item.raw,
13089
+ index
13090
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
13091
+ "key": `subheader-${index}`
13092
+ }), null);
13093
+ }
12969
13094
  return slots.item?.({
12970
13095
  item,
12971
13096
  index,
@@ -13126,6 +13251,9 @@ function filterItems(items, query, options) {
13126
13251
  let match = -1;
13127
13252
  if ((query || customFiltersLength > 0) && !options?.noFilter) {
13128
13253
  if (typeof item === 'object') {
13254
+ if (['divider', 'subheader'].includes(item.raw?.type)) {
13255
+ continue;
13256
+ }
13129
13257
  const filterKeys = keys || Object.keys(transformed);
13130
13258
  for (const key of filterKeys) {
13131
13259
  const value = getPropertyFromItem(transformed, key);
@@ -13564,6 +13692,22 @@ const VAutocomplete = genericComponent()({
13564
13692
  active: highlightFirst.value && index === 0 ? true : undefined,
13565
13693
  onClick: () => select(item, null)
13566
13694
  });
13695
+ if (item.raw.type === 'divider') {
13696
+ return slots.divider?.({
13697
+ props: item.raw,
13698
+ index
13699
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
13700
+ "key": `divider-${index}`
13701
+ }), null);
13702
+ }
13703
+ if (item.raw.type === 'subheader') {
13704
+ return slots.subheader?.({
13705
+ props: item.raw,
13706
+ index
13707
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
13708
+ "key": `subheader-${index}`
13709
+ }), null);
13710
+ }
13567
13711
  return slots.item?.({
13568
13712
  item,
13569
13713
  index,
@@ -17974,6 +18118,7 @@ const VCombobox = genericComponent()({
17974
18118
  _search.value = val ?? '';
17975
18119
  if (!props.multiple && !hasSelectionSlot.value) {
17976
18120
  model.value = [transformItem$3(props, val)];
18121
+ nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
17977
18122
  }
17978
18123
  if (val && props.multiple && props.delimiters?.length) {
17979
18124
  const values = val.split(new RegExp(`(?:${props.delimiters.join('|')})+`));
@@ -18290,6 +18435,22 @@ const VCombobox = genericComponent()({
18290
18435
  active: highlightFirst.value && index === 0 ? true : undefined,
18291
18436
  onClick: () => select(item, null)
18292
18437
  });
18438
+ if (item.raw.type === 'divider') {
18439
+ return slots.divider?.({
18440
+ props: item.raw,
18441
+ index
18442
+ }) ?? createVNode(VDivider, mergeProps(item.props, {
18443
+ "key": `divider-${index}`
18444
+ }), null);
18445
+ }
18446
+ if (item.raw.type === 'subheader') {
18447
+ return slots.subheader?.({
18448
+ props: item.raw,
18449
+ index
18450
+ }) ?? createVNode(VListSubheader, mergeProps(item.props, {
18451
+ "key": `subheader-${index}`
18452
+ }), null);
18453
+ }
18293
18454
  return slots.item?.({
18294
18455
  item,
18295
18456
  index,
@@ -24713,6 +24874,10 @@ const makeVNumberInputProps = propsFactory({
24713
24874
  type: Number,
24714
24875
  default: 0
24715
24876
  },
24877
+ minFractionDigits: {
24878
+ type: Number,
24879
+ default: null
24880
+ },
24716
24881
  ...omit(makeVTextFieldProps(), ['modelValue', 'validationValue'])
24717
24882
  }, 'VNumberInput');
24718
24883
  const VNumberInput = genericComponent()({
@@ -24743,9 +24908,19 @@ const VNumberInput = genericComponent()({
24743
24908
  } = useFocus(props);
24744
24909
  function correctPrecision(val) {
24745
24910
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : props.precision;
24746
- const fixed = precision == null ? String(val) : val.toFixed(precision);
24747
- return isFocused.value ? Number(fixed).toString() // trim zeros
24748
- : fixed;
24911
+ if (precision == null) {
24912
+ return String(val);
24913
+ }
24914
+ let fixed = val.toFixed(precision);
24915
+ if (isFocused.value) {
24916
+ return Number(fixed).toString(); // trim zeros
24917
+ }
24918
+ if ((props.minFractionDigits ?? precision) < precision) {
24919
+ const trimLimit = precision - props.minFractionDigits;
24920
+ const [baseDigits, fractionDigits] = fixed.split('.');
24921
+ fixed = [baseDigits, fractionDigits.replace(new RegExp(`0{1,${trimLimit}}$`), '')].filter(Boolean).join('.');
24922
+ }
24923
+ return fixed;
24749
24924
  }
24750
24925
  const model = useProxiedModel(props, 'modelValue', null, val => val ?? null, val => val == null ? val ?? null : clamp(Number(val), props.min, props.max));
24751
24926
  const _inputText = shallowRef(null);
@@ -24798,6 +24973,7 @@ const VNumberInput = genericComponent()({
24798
24973
  }
24799
24974
  };
24800
24975
  watch(() => props.precision, () => formatInputValue());
24976
+ watch(() => props.minFractionDigits, () => formatInputValue());
24801
24977
  onMounted(() => {
24802
24978
  clampModel();
24803
24979
  });
@@ -24899,7 +25075,7 @@ const VNumberInput = genericComponent()({
24899
25075
  inputText.value = null;
24900
25076
  return;
24901
25077
  }
24902
- inputText.value = props.precision == null ? String(model.value) : model.value.toFixed(props.precision);
25078
+ inputText.value = correctPrecision(model.value);
24903
25079
  }
24904
25080
  function trimDecimalZeros() {
24905
25081
  if (controlsDisabled.value) return;
@@ -29866,11 +30042,6 @@ const makeVIconBtnProps = propsFactory({
29866
30042
  hideOverlay: Boolean,
29867
30043
  icon: [String, Function, Object],
29868
30044
  iconColor: String,
29869
- iconSize: [Number, String],
29870
- iconSizes: {
29871
- type: Array,
29872
- default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
29873
- },
29874
30045
  loading: Boolean,
29875
30046
  opacity: [Number, String],
29876
30047
  readonly: Boolean,
@@ -29890,6 +30061,7 @@ const makeVIconBtnProps = propsFactory({
29890
30061
  ...makeBorderProps(),
29891
30062
  ...makeComponentProps(),
29892
30063
  ...makeElevationProps(),
30064
+ ...makeIconSizeProps(),
29893
30065
  ...makeRoundedProps(),
29894
30066
  ...makeTagProps({
29895
30067
  tag: 'button'
@@ -29944,7 +30116,6 @@ const VIconBtn = genericComponent()({
29944
30116
  })()
29945
30117
  }));
29946
30118
  const btnSizeMap = new Map(props.sizes);
29947
- const iconSizeMap = new Map(props.iconSizes);
29948
30119
  function onClick() {
29949
30120
  if (props.disabled || props.readonly || isActive.value === undefined || props.tag === 'a' && attrs.href) return;
29950
30121
  isActive.value = !isActive.value;
@@ -29956,12 +30127,12 @@ const VIconBtn = genericComponent()({
29956
30127
  const btnSize = hasNamedSize ? btnSizeMap.get(_btnSize) : _btnSize;
29957
30128
  const btnHeight = props.height ?? btnSize;
29958
30129
  const btnWidth = props.width ?? btnSize;
29959
- const _iconSize = props.iconSize;
29960
- const hasNamedIconSize = iconSizeMap.has(_iconSize);
29961
- const iconSize = !_iconSize ? hasNamedSize ? iconSizeMap.get(_btnSize) : iconSizeMap.get('default') : hasNamedIconSize ? iconSizeMap.get(_iconSize) : _iconSize;
30130
+ const {
30131
+ iconSize
30132
+ } = useIconSizes(props, () => new Map(props.iconSizes).get(_btnSize));
29962
30133
  const iconProps = {
29963
30134
  icon,
29964
- size: iconSize,
30135
+ size: iconSize.value,
29965
30136
  iconColor: props.iconColor,
29966
30137
  opacity: props.opacity
29967
30138
  };
@@ -30004,7 +30175,7 @@ const VIconBtn = genericComponent()({
30004
30175
  "color": typeof props.loading === 'boolean' ? undefined : props.loading,
30005
30176
  "indeterminate": "disable-shrink",
30006
30177
  "width": "2",
30007
- "size": iconSize
30178
+ "size": iconSize.value
30008
30179
  }, null)])]
30009
30180
  });
30010
30181
  });
@@ -31914,7 +32085,7 @@ function createVuetify$1() {
31914
32085
  };
31915
32086
  });
31916
32087
  }
31917
- const version$1 = "3.8.5-master.2025-05-20";
32088
+ const version$1 = "3.8.6-dev.2025-05-21";
31918
32089
  createVuetify$1.version = version$1;
31919
32090
 
31920
32091
  // Vue's inject() can only be used in setup
@@ -32212,7 +32383,7 @@ var index = /*#__PURE__*/Object.freeze({
32212
32383
 
32213
32384
  /* eslint-disable local-rules/sort-imports */
32214
32385
 
32215
- const version = "3.8.5-master.2025-05-20";
32386
+ const version = "3.8.6-dev.2025-05-21";
32216
32387
 
32217
32388
  /* eslint-disable local-rules/sort-imports */
32218
32389