@vuetify/nightly 3.8.3-master.2025-05-05 → 3.8.4-dev.2025-05-13

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 (104) hide show
  1. package/CHANGELOG.md +17 -29
  2. package/dist/json/attributes.json +3080 -3064
  3. package/dist/json/importMap-labs.json +30 -30
  4. package/dist/json/importMap.json +144 -144
  5. package/dist/json/tags.json +4 -0
  6. package/dist/json/web-types.json +5925 -5886
  7. package/dist/vuetify-labs.cjs +206 -92
  8. package/dist/vuetify-labs.css +3956 -3924
  9. package/dist/vuetify-labs.d.ts +1030 -978
  10. package/dist/vuetify-labs.esm.js +207 -93
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +206 -92
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +179 -48
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +3200 -3168
  17. package/dist/vuetify.d.ts +620 -566
  18. package/dist/vuetify.esm.js +180 -49
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +179 -48
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1185 -1174
  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 +97 -97
  31. package/lib/components/VAutocomplete/VAutocomplete.js +5 -0
  32. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  33. package/lib/components/VBottomNavigation/VBottomNavigation.d.ts +6 -6
  34. package/lib/components/VBtnGroup/VBtnGroup.css +30 -7
  35. package/lib/components/VBtnGroup/VBtnGroup.d.ts +58 -32
  36. package/lib/components/VBtnGroup/VBtnGroup.js +7 -3
  37. package/lib/components/VBtnGroup/VBtnGroup.js.map +1 -1
  38. package/lib/components/VBtnGroup/VBtnGroup.sass +44 -17
  39. package/lib/components/VBtnToggle/VBtnToggle.d.ts +25 -0
  40. package/lib/components/VCheckbox/VCheckbox.d.ts +3 -3
  41. package/lib/components/VCombobox/VCombobox.d.ts +97 -97
  42. package/lib/components/VDataTable/VDataTable.d.ts +110 -110
  43. package/lib/components/VDataTable/VDataTableHeaders.js +1 -2
  44. package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
  45. package/lib/components/VDataTable/VDataTableServer.d.ts +55 -55
  46. package/lib/components/VDataTable/VDataTableVirtual.d.ts +55 -55
  47. package/lib/components/VDataTable/composables/headers.d.ts +75 -75
  48. package/lib/components/VDatePicker/VDatePicker.d.ts +3 -3
  49. package/lib/components/VDatePicker/VDatePickerMonth.d.ts +6 -6
  50. package/lib/components/VField/VField.d.ts +3 -3
  51. package/lib/components/VFileInput/VFileInput.css +4 -0
  52. package/lib/components/VFileInput/VFileInput.d.ts +15 -15
  53. package/lib/components/VFileInput/VFileInput.js +21 -3
  54. package/lib/components/VFileInput/VFileInput.js.map +1 -1
  55. package/lib/components/VFileInput/VFileInput.sass +4 -0
  56. package/lib/components/VInput/VInput.d.ts +4 -4
  57. package/lib/components/VNumberInput/VNumberInput.d.ts +92 -92
  58. package/lib/components/VOverlay/VOverlay.css +1 -1
  59. package/lib/components/VOverlay/_variables.scss +1 -1
  60. package/lib/components/VOverlay/locationStrategies.js +1 -1
  61. package/lib/components/VOverlay/locationStrategies.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 +97 -97
  65. package/lib/components/VSlider/VSlider.d.ts +3 -3
  66. package/lib/components/VSwitch/VSwitch.d.ts +3 -3
  67. package/lib/components/VTabs/VTabs.d.ts +6 -6
  68. package/lib/components/VTextField/VTextField.d.ts +27 -27
  69. package/lib/components/VTextarea/VTextarea.d.ts +15 -15
  70. package/lib/components/transitions/dialog-transition.js +3 -3
  71. package/lib/components/transitions/dialog-transition.js.map +1 -1
  72. package/lib/composables/calendar.d.ts +1 -0
  73. package/lib/composables/calendar.js.map +1 -1
  74. package/lib/composables/iconSizes.d.ts +28 -0
  75. package/lib/composables/iconSizes.js +23 -0
  76. package/lib/composables/iconSizes.js.map +1 -0
  77. package/lib/composables/theme.d.ts +6 -1
  78. package/lib/composables/theme.js +94 -26
  79. package/lib/composables/theme.js.map +1 -1
  80. package/lib/composables/virtual.js +6 -1
  81. package/lib/composables/virtual.js.map +1 -1
  82. package/lib/entry-bundler.d.ts +6 -6
  83. package/lib/entry-bundler.js +1 -1
  84. package/lib/entry-bundler.js.map +1 -1
  85. package/lib/framework.d.ts +57 -52
  86. package/lib/framework.js +1 -1
  87. package/lib/framework.js.map +1 -1
  88. package/lib/labs/VCalendar/VCalendar.d.ts +3 -3
  89. package/lib/labs/VCalendar/VCalendarDay.d.ts +3 -3
  90. package/lib/labs/VCalendar/VCalendarInterval.d.ts +3 -3
  91. package/lib/labs/VCalendar/VCalendarMonthDay.d.ts +3 -3
  92. package/lib/labs/VDateInput/VDateInput.d.ts +96 -96
  93. package/lib/labs/VFileUpload/VFileUpload.js +19 -31
  94. package/lib/labs/VFileUpload/VFileUpload.js.map +1 -1
  95. package/lib/labs/VIconBtn/VIconBtn.d.ts +29 -29
  96. package/lib/labs/VIconBtn/VIconBtn.js +7 -11
  97. package/lib/labs/VIconBtn/VIconBtn.js.map +1 -1
  98. package/lib/labs/VTimePicker/VTimePickerClock.js +2 -2
  99. package/lib/labs/VTimePicker/VTimePickerClock.js.map +1 -1
  100. package/lib/util/globals.d.ts +1 -0
  101. package/lib/util/globals.js +1 -0
  102. package/lib/util/globals.js.map +1 -1
  103. package/lib/util/helpers.js.map +1 -1
  104. package/package.json +7 -6
@@ -1,10 +1,10 @@
1
1
  /*!
2
- * Vuetify v3.8.3-master.2025-05-05
2
+ * Vuetify v3.8.4-dev.2025-05-13
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,
@@ -2923,10 +2992,10 @@ const VDialogTransition = genericComponent()({
2923
2992
  async onLeave(el, done) {
2924
2993
  await new Promise(resolve => requestAnimationFrame(resolve));
2925
2994
  let dimensions;
2926
- if (!Array.isArray(props.target) && !props.target.offsetParent && saved.has(el)) {
2927
- dimensions = saved.get(el);
2928
- } else {
2995
+ if (!saved.has(el) || Array.isArray(props.target) || props.target.offsetParent || props.target.getClientRects().length) {
2929
2996
  dimensions = getDimensions(props.target, el);
2997
+ } else {
2998
+ dimensions = saved.get(el);
2930
2999
  }
2931
3000
  const {
2932
3001
  x,
@@ -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
@@ -5864,6 +5939,31 @@ const VAppBarTitle = genericComponent()({
5864
5939
  // Utilities
5865
5940
  const VAlertTitle = createSimpleFunctional('v-alert-title');
5866
5941
 
5942
+ // Utilities
5943
+
5944
+ // Types
5945
+
5946
+ // Types
5947
+
5948
+ // Composables
5949
+ const makeIconSizeProps = propsFactory({
5950
+ iconSize: [Number, String],
5951
+ iconSizes: {
5952
+ type: Array,
5953
+ default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
5954
+ }
5955
+ }, 'iconSize');
5956
+ function useIconSizes(props, fallback) {
5957
+ const iconSize = computed(() => {
5958
+ const iconSizeMap = new Map(props.iconSizes);
5959
+ const _iconSize = props.iconSize ?? fallback() ?? 'default';
5960
+ return iconSizeMap.has(_iconSize) ? iconSizeMap.get(_iconSize) : _iconSize;
5961
+ });
5962
+ return {
5963
+ iconSize
5964
+ };
5965
+ }
5966
+
5867
5967
  // Types
5868
5968
 
5869
5969
  const allowedTypes = ['success', 'info', 'warning', 'error'];
@@ -5903,6 +6003,7 @@ const makeVAlertProps = propsFactory({
5903
6003
  ...makeDensityProps(),
5904
6004
  ...makeDimensionProps(),
5905
6005
  ...makeElevationProps(),
6006
+ ...makeIconSizeProps(),
5906
6007
  ...makeLocationProps(),
5907
6008
  ...makePositionProps(),
5908
6009
  ...makeRoundedProps(),
@@ -5930,6 +6031,9 @@ const VAlert = genericComponent()({
5930
6031
  if (!props.type) return props.icon;
5931
6032
  return props.icon ?? `$${props.type}`;
5932
6033
  });
6034
+ const {
6035
+ iconSize
6036
+ } = useIconSizes(props, () => props.prominent ? 44 : 28);
5933
6037
  const {
5934
6038
  themeClasses
5935
6039
  } = provideTheme(props);
@@ -5977,6 +6081,11 @@ const VAlert = genericComponent()({
5977
6081
  const hasPrepend = !!(slots.prepend || icon.value);
5978
6082
  const hasTitle = !!(slots.title || props.title);
5979
6083
  const hasClose = !!(slots.close || props.closable);
6084
+ const iconProps = {
6085
+ density: props.density,
6086
+ icon: icon.value,
6087
+ size: iconSize.value
6088
+ };
5980
6089
  return isActive.value && createVNode(props.tag, {
5981
6090
  "class": ['v-alert', props.border && {
5982
6091
  'v-alert--border': !!props.border,
@@ -5994,19 +6103,14 @@ const VAlert = genericComponent()({
5994
6103
  }, null), hasPrepend && createVNode("div", {
5995
6104
  "key": "prepend",
5996
6105
  "class": "v-alert__prepend"
5997
- }, [!slots.prepend ? createVNode(VIcon, {
5998
- "key": "prepend-icon",
5999
- "density": props.density,
6000
- "icon": icon.value,
6001
- "size": props.prominent ? 44 : 28
6002
- }, null) : createVNode(VDefaultsProvider, {
6106
+ }, [!slots.prepend ? createVNode(VIcon, mergeProps({
6107
+ "key": "prepend-icon"
6108
+ }, iconProps), null) : createVNode(VDefaultsProvider, {
6003
6109
  "key": "prepend-defaults",
6004
6110
  "disabled": !icon.value,
6005
6111
  "defaults": {
6006
6112
  VIcon: {
6007
- density: props.density,
6008
- icon: icon.value,
6009
- size: props.prominent ? 44 : 28
6113
+ ...iconProps
6010
6114
  }
6011
6115
  }
6012
6116
  }, slots.prepend)]), createVNode("div", {
@@ -10164,7 +10268,7 @@ function connectedLocationStrategy(data, props, contentStyles) {
10164
10268
  observe = false;
10165
10269
  requestAnimationFrame(() => observe = true);
10166
10270
  if (!data.target.value || !data.contentEl.value) return;
10167
- if (Array.isArray(data.target.value) || data.target.value.offsetParent) {
10271
+ if (Array.isArray(data.target.value) || data.target.value.offsetParent || data.target.value.getClientRects().length) {
10168
10272
  targetBox = getTargetBox(data.target.value);
10169
10273
  } // Otherwise target element is hidden, use last known value
10170
10274
 
@@ -12352,7 +12456,12 @@ function useVirtual(props, items) {
12352
12456
  }
12353
12457
  function calculateOffset(index) {
12354
12458
  index = clamp(index, 0, items.value.length - 1);
12355
- return offsets[index] || 0;
12459
+ const whole = Math.floor(index);
12460
+ const fraction = index % 1;
12461
+ const next = whole + 1;
12462
+ const wholeOffset = offsets[whole] || 0;
12463
+ const nextOffset = offsets[next] || wholeOffset;
12464
+ return wholeOffset + (nextOffset - wholeOffset) * fraction;
12356
12465
  }
12357
12466
  function calculateIndex(scrollTop) {
12358
12467
  return binaryClosest(offsets, scrollTop);
@@ -13502,6 +13611,11 @@ const VAutocomplete = genericComponent()({
13502
13611
  menu.value = true;
13503
13612
  }
13504
13613
  });
13614
+ watch(model, value => {
13615
+ if (!props.multiple && !hasSelectionSlot.value) {
13616
+ search.value = value[0]?.title ?? '';
13617
+ }
13618
+ });
13505
13619
  useRender(() => {
13506
13620
  const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']);
13507
13621
  const isDirty = model.value.length > 0;
@@ -20329,7 +20443,6 @@ const VDataTableHeaders = genericComponent()({
20329
20443
  });
20330
20444
  };
20331
20445
  const VDataTableMobileHeaderCell = () => {
20332
- const headerProps = mergeProps(props.headerProps ?? {} ?? {});
20333
20446
  const displayItems = computed(() => {
20334
20447
  return columns.value.filter(column => column?.sortable && !props.disableSort);
20335
20448
  });
@@ -20342,7 +20455,7 @@ const VDataTableHeaders = genericComponent()({
20342
20455
  "tag": "th",
20343
20456
  "class": [...headerCellClasses.value],
20344
20457
  "colspan": headers.value.length + 1
20345
- }, headerProps), {
20458
+ }, props.headerProps), {
20346
20459
  default: () => [createVNode("div", {
20347
20460
  "class": "v-data-table-header__content"
20348
20461
  }, [createVNode(VSelect, {
@@ -23265,6 +23378,7 @@ const VFileInput = genericComponent()({
23265
23378
  const inputRef = ref();
23266
23379
  const isActive = toRef(() => isFocused.value || props.active);
23267
23380
  const isPlainOrUnderlined = computed(() => ['plain', 'underlined'].includes(props.variant));
23381
+ const isDragging = shallowRef(false);
23268
23382
  function onFocus() {
23269
23383
  if (inputRef.value !== document.activeElement) {
23270
23384
  inputRef.value?.focus();
@@ -23291,11 +23405,26 @@ const VFileInput = genericComponent()({
23291
23405
  }
23292
23406
  function onDragover(e) {
23293
23407
  e.preventDefault();
23408
+ e.stopImmediatePropagation();
23409
+ isDragging.value = true;
23410
+ }
23411
+ function onDragleave(e) {
23412
+ e.preventDefault();
23413
+ isDragging.value = false;
23294
23414
  }
23295
23415
  function onDrop(e) {
23296
23416
  e.preventDefault();
23297
- if (!e.dataTransfer) return;
23298
- model.value = [...(e.dataTransfer.files ?? [])];
23417
+ e.stopImmediatePropagation();
23418
+ isDragging.value = false;
23419
+ if (!e.dataTransfer?.files?.length || !inputRef.value) return;
23420
+ const dataTransfer = new DataTransfer();
23421
+ for (const file of e.dataTransfer.files) {
23422
+ dataTransfer.items.add(file);
23423
+ }
23424
+ inputRef.value.files = dataTransfer.files;
23425
+ inputRef.value.dispatchEvent(new Event('change', {
23426
+ bubbles: true
23427
+ }));
23299
23428
  }
23300
23429
  watch(model, newValue => {
23301
23430
  const hasModelReset = !Array.isArray(newValue) || !newValue.length;
@@ -23317,6 +23446,7 @@ const VFileInput = genericComponent()({
23317
23446
  "modelValue": props.multiple ? model.value : model.value[0],
23318
23447
  "class": ['v-file-input', {
23319
23448
  'v-file-input--chips': !!props.chips,
23449
+ 'v-file-input--dragging': isDragging.value,
23320
23450
  'v-file-input--hide': props.hideInput,
23321
23451
  'v-input--plain-underlined': isPlainOrUnderlined.value
23322
23452
  }, props.class],
@@ -23378,6 +23508,7 @@ const VFileInput = genericComponent()({
23378
23508
  const target = e.target;
23379
23509
  model.value = [...(target.files ?? [])];
23380
23510
  },
23511
+ "onDragleave": onDragleave,
23381
23512
  "onFocus": onFocus,
23382
23513
  "onBlur": blur
23383
23514
  }, slotProps, inputAttrs), null), createVNode("div", {
@@ -29430,43 +29561,31 @@ const VFileUpload = genericComponent()({
29430
29561
  densityClasses
29431
29562
  } = useDensity(props);
29432
29563
  const model = useProxiedModel(props, 'modelValue', props.modelValue, val => wrapInArray(val), val => props.multiple || Array.isArray(props.modelValue) ? val : val[0]);
29433
- const dragOver = shallowRef(false);
29564
+ const isDragging = shallowRef(false);
29434
29565
  const vSheetRef = ref(null);
29435
29566
  const inputRef = ref(null);
29436
- onMounted(() => {
29437
- vSheetRef.value?.$el.addEventListener('dragover', onDragOver);
29438
- vSheetRef.value?.$el.addEventListener('drop', onDrop);
29439
- });
29440
- onUnmounted(() => {
29441
- vSheetRef.value?.$el.removeEventListener('dragover', onDragOver);
29442
- vSheetRef.value?.$el.removeEventListener('drop', onDrop);
29443
- });
29444
- function onDragOver(e) {
29567
+ function onDragover(e) {
29445
29568
  e.preventDefault();
29446
29569
  e.stopImmediatePropagation();
29447
- dragOver.value = true;
29570
+ isDragging.value = true;
29448
29571
  }
29449
- function onDragLeave(e) {
29572
+ function onDragleave(e) {
29450
29573
  e.preventDefault();
29451
- dragOver.value = false;
29574
+ isDragging.value = false;
29452
29575
  }
29453
29576
  function onDrop(e) {
29454
29577
  e.preventDefault();
29455
29578
  e.stopImmediatePropagation();
29456
- dragOver.value = false;
29457
- const files = Array.from(e.dataTransfer?.files ?? []);
29458
- if (!files.length) return;
29459
- if (!props.multiple) {
29460
- model.value = [files[0]];
29461
- return;
29462
- }
29463
- const array = model.value.slice();
29464
- for (const file of files) {
29465
- if (!array.some(f => f.name === file.name)) {
29466
- array.push(file);
29467
- }
29468
- }
29469
- model.value = array;
29579
+ isDragging.value = false;
29580
+ if (!e.dataTransfer?.files?.length || !inputRef.value) return;
29581
+ const dataTransfer = new DataTransfer();
29582
+ for (const file of e.dataTransfer.files) {
29583
+ dataTransfer.items.add(file);
29584
+ }
29585
+ inputRef.value.files = dataTransfer.files;
29586
+ inputRef.value.dispatchEvent(new Event('change', {
29587
+ bubbles: true
29588
+ }));
29470
29589
  }
29471
29590
  function onClick() {
29472
29591
  inputRef.value?.click();
@@ -29502,11 +29621,11 @@ const VFileUpload = genericComponent()({
29502
29621
  "class": ['v-file-upload', {
29503
29622
  'v-file-upload--clickable': !hasBrowse,
29504
29623
  'v-file-upload--disabled': props.disabled,
29505
- 'v-file-upload--dragging': dragOver.value
29624
+ 'v-file-upload--dragging': isDragging.value
29506
29625
  }, densityClasses.value, props.class],
29507
29626
  "style": [props.style],
29508
- "onDragleave": onDragLeave,
29509
- "onDragover": onDragOver,
29627
+ "onDragleave": onDragleave,
29628
+ "onDragover": onDragover,
29510
29629
  "onDrop": onDrop,
29511
29630
  "onClick": !hasBrowse ? onClick : undefined
29512
29631
  }, rootAttrs), {
@@ -29557,7 +29676,7 @@ const VFileUpload = genericComponent()({
29557
29676
  })]), props.subtitle && createVNode("div", {
29558
29677
  "class": "v-file-upload-subtitle"
29559
29678
  }, [props.subtitle])]), createVNode(VOverlay, {
29560
- "model-value": dragOver.value,
29679
+ "model-value": isDragging.value,
29561
29680
  "contained": true,
29562
29681
  "scrim": props.scrim
29563
29682
  }, null), slots.input?.({
@@ -29613,11 +29732,6 @@ const makeVIconBtnProps = propsFactory({
29613
29732
  hideOverlay: Boolean,
29614
29733
  icon: [String, Function, Object],
29615
29734
  iconColor: String,
29616
- iconSize: [Number, String],
29617
- iconSizes: {
29618
- type: Array,
29619
- default: () => [['x-small', 10], ['small', 16], ['default', 24], ['large', 28], ['x-large', 32]]
29620
- },
29621
29735
  loading: Boolean,
29622
29736
  opacity: [Number, String],
29623
29737
  readonly: Boolean,
@@ -29637,6 +29751,7 @@ const makeVIconBtnProps = propsFactory({
29637
29751
  ...makeBorderProps(),
29638
29752
  ...makeComponentProps(),
29639
29753
  ...makeElevationProps(),
29754
+ ...makeIconSizeProps(),
29640
29755
  ...makeRoundedProps(),
29641
29756
  ...makeTagProps({
29642
29757
  tag: 'button'
@@ -29691,7 +29806,6 @@ const VIconBtn = genericComponent()({
29691
29806
  })()
29692
29807
  }));
29693
29808
  const btnSizeMap = new Map(props.sizes);
29694
- const iconSizeMap = new Map(props.iconSizes);
29695
29809
  function onClick() {
29696
29810
  if (props.disabled || props.readonly || isActive.value === undefined || props.tag === 'a' && attrs.href) return;
29697
29811
  isActive.value = !isActive.value;
@@ -29703,12 +29817,12 @@ const VIconBtn = genericComponent()({
29703
29817
  const btnSize = hasNamedSize ? btnSizeMap.get(_btnSize) : _btnSize;
29704
29818
  const btnHeight = props.height ?? btnSize;
29705
29819
  const btnWidth = props.width ?? btnSize;
29706
- const _iconSize = props.iconSize;
29707
- const hasNamedIconSize = iconSizeMap.has(_iconSize);
29708
- const iconSize = !_iconSize ? hasNamedSize ? iconSizeMap.get(_btnSize) : iconSizeMap.get('default') : hasNamedIconSize ? iconSizeMap.get(_iconSize) : _iconSize;
29820
+ const {
29821
+ iconSize
29822
+ } = useIconSizes(props, () => new Map(props.iconSizes).get(_btnSize));
29709
29823
  const iconProps = {
29710
29824
  icon,
29711
- size: iconSize,
29825
+ size: iconSize.value,
29712
29826
  iconColor: props.iconColor,
29713
29827
  opacity: props.opacity
29714
29828
  };
@@ -29751,7 +29865,7 @@ const VIconBtn = genericComponent()({
29751
29865
  "color": typeof props.loading === 'boolean' ? undefined : props.loading,
29752
29866
  "indeterminate": "disable-shrink",
29753
29867
  "width": "2",
29754
- "size": iconSize
29868
+ "size": iconSize.value
29755
29869
  }, null)])]
29756
29870
  });
29757
29871
  });
@@ -30255,8 +30369,8 @@ const VTimePickerClock = genericComponent()({
30255
30369
  y
30256
30370
  } = getPosition(i);
30257
30371
  return {
30258
- left: `${50 + x * 50}%`,
30259
- top: `${50 + y * 50}%`
30372
+ left: `${Math.round(50 + x * 50)}%`,
30373
+ top: `${Math.round(50 + y * 50)}%`
30260
30374
  };
30261
30375
  }
30262
30376
  function euclidean(p0, p1) {
@@ -31660,7 +31774,7 @@ function createVuetify$1() {
31660
31774
  };
31661
31775
  });
31662
31776
  }
31663
- const version$1 = "3.8.3-master.2025-05-05";
31777
+ const version$1 = "3.8.4-dev.2025-05-13";
31664
31778
  createVuetify$1.version = version$1;
31665
31779
 
31666
31780
  // Vue's inject() can only be used in setup
@@ -31958,7 +32072,7 @@ var index = /*#__PURE__*/Object.freeze({
31958
32072
 
31959
32073
  /* eslint-disable local-rules/sort-imports */
31960
32074
 
31961
- const version = "3.8.3-master.2025-05-05";
32075
+ const version = "3.8.4-dev.2025-05-13";
31962
32076
 
31963
32077
  /* eslint-disable local-rules/sort-imports */
31964
32078