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

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 (88) hide show
  1. package/CHANGELOG.md +14 -24
  2. package/dist/json/attributes.json +2834 -2826
  3. package/dist/json/importMap-labs.json +24 -24
  4. package/dist/json/importMap.json +156 -156
  5. package/dist/json/tags.json +2 -0
  6. package/dist/json/web-types.json +5151 -5131
  7. package/dist/vuetify-labs.cjs +163 -73
  8. package/dist/vuetify-labs.css +4647 -4620
  9. package/dist/vuetify-labs.d.ts +154 -377
  10. package/dist/vuetify-labs.esm.js +164 -74
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +163 -73
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +142 -40
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +5041 -5014
  17. package/dist/vuetify.d.ts +183 -406
  18. package/dist/vuetify.esm.js +143 -41
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +142 -40
  21. package/dist/vuetify.js.map +1 -1
  22. package/dist/vuetify.min.css +2 -2
  23. package/dist/vuetify.min.js +1182 -1173
  24. package/dist/vuetify.min.js.map +1 -1
  25. package/lib/components/VAutocomplete/VAutocomplete.d.ts +3 -3
  26. package/lib/components/VAutocomplete/VAutocomplete.js +5 -0
  27. package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
  28. package/lib/components/VBottomNavigation/VBottomNavigation.d.ts +6 -6
  29. package/lib/components/VBtnGroup/VBtnGroup.css +30 -7
  30. package/lib/components/VBtnGroup/VBtnGroup.d.ts +58 -32
  31. package/lib/components/VBtnGroup/VBtnGroup.js +7 -3
  32. package/lib/components/VBtnGroup/VBtnGroup.js.map +1 -1
  33. package/lib/components/VBtnGroup/VBtnGroup.sass +44 -17
  34. package/lib/components/VBtnToggle/VBtnToggle.d.ts +25 -0
  35. package/lib/components/VCombobox/VCombobox.d.ts +3 -3
  36. package/lib/components/VDataTable/VDataTable.d.ts +110 -110
  37. package/lib/components/VDataTable/VDataTableHeaders.js +1 -2
  38. package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
  39. package/lib/components/VDataTable/VDataTableServer.d.ts +62 -189
  40. package/lib/components/VDataTable/VDataTableServer.js.map +1 -1
  41. package/lib/components/VDataTable/VDataTableVirtual.d.ts +62 -189
  42. package/lib/components/VDataTable/VDataTableVirtual.js.map +1 -1
  43. package/lib/components/VDataTable/composables/headers.d.ts +75 -75
  44. package/lib/components/VDatePicker/VDatePicker.d.ts +3 -3
  45. package/lib/components/VDatePicker/VDatePickerMonth.d.ts +6 -6
  46. package/lib/components/VDialog/VDialog.js +1 -1
  47. package/lib/components/VDialog/VDialog.js.map +1 -1
  48. package/lib/components/VFileInput/VFileInput.css +4 -0
  49. package/lib/components/VFileInput/VFileInput.js +21 -3
  50. package/lib/components/VFileInput/VFileInput.js.map +1 -1
  51. package/lib/components/VFileInput/VFileInput.sass +4 -0
  52. package/lib/components/VInput/VInput.d.ts +1 -1
  53. package/lib/components/VNumberInput/VNumberInput.d.ts +3 -3
  54. package/lib/components/VOverlay/VOverlay.css +1 -1
  55. package/lib/components/VOverlay/_variables.scss +1 -1
  56. package/lib/components/VOverlay/locationStrategies.js +1 -1
  57. package/lib/components/VOverlay/locationStrategies.js.map +1 -1
  58. package/lib/components/VSelect/VSelect.d.ts +3 -3
  59. package/lib/components/VTabs/VTabs.d.ts +6 -6
  60. package/lib/components/transitions/dialog-transition.js +3 -3
  61. package/lib/components/transitions/dialog-transition.js.map +1 -1
  62. package/lib/composables/calendar.d.ts +1 -0
  63. package/lib/composables/calendar.js.map +1 -1
  64. package/lib/composables/theme.d.ts +6 -1
  65. package/lib/composables/theme.js +94 -26
  66. package/lib/composables/theme.js.map +1 -1
  67. package/lib/composables/virtual.js +6 -1
  68. package/lib/composables/virtual.js.map +1 -1
  69. package/lib/entry-bundler.d.ts +6 -6
  70. package/lib/entry-bundler.js +1 -1
  71. package/lib/entry-bundler.js.map +1 -1
  72. package/lib/framework.d.ts +65 -60
  73. package/lib/framework.js +1 -1
  74. package/lib/framework.js.map +1 -1
  75. package/lib/labs/VCalendar/VCalendar.d.ts +3 -3
  76. package/lib/labs/VCalendar/VCalendarDay.d.ts +3 -3
  77. package/lib/labs/VCalendar/VCalendarInterval.d.ts +3 -3
  78. package/lib/labs/VCalendar/VCalendarMonthDay.d.ts +3 -3
  79. package/lib/labs/VDateInput/VDateInput.d.ts +9 -9
  80. package/lib/labs/VFileUpload/VFileUpload.js +19 -31
  81. package/lib/labs/VFileUpload/VFileUpload.js.map +1 -1
  82. package/lib/labs/VTimePicker/VTimePickerClock.js +2 -2
  83. package/lib/labs/VTimePicker/VTimePickerClock.js.map +1 -1
  84. package/lib/util/globals.d.ts +1 -0
  85. package/lib/util/globals.js +1 -0
  86. package/lib/util/globals.js.map +1 -1
  87. package/lib/util/helpers.js.map +1 -1
  88. package/package.json +6 -6
@@ -1,10 +1,10 @@
1
1
  /*!
2
- * Vuetify v3.8.3-master.2025-05-04
2
+ * Vuetify v3.8.4-dev.2025-05-07
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
@@ -10164,7 +10239,7 @@ function connectedLocationStrategy(data, props, contentStyles) {
10164
10239
  observe = false;
10165
10240
  requestAnimationFrame(() => observe = true);
10166
10241
  if (!data.target.value || !data.contentEl.value) return;
10167
- if (Array.isArray(data.target.value) || data.target.value.offsetParent) {
10242
+ if (Array.isArray(data.target.value) || data.target.value.offsetParent || data.target.value.getClientRects().length) {
10168
10243
  targetBox = getTargetBox(data.target.value);
10169
10244
  } // Otherwise target element is hidden, use last known value
10170
10245
 
@@ -12352,7 +12427,12 @@ function useVirtual(props, items) {
12352
12427
  }
12353
12428
  function calculateOffset(index) {
12354
12429
  index = clamp(index, 0, items.value.length - 1);
12355
- return offsets[index] || 0;
12430
+ const whole = Math.floor(index);
12431
+ const fraction = index % 1;
12432
+ const next = whole + 1;
12433
+ const wholeOffset = offsets[whole] || 0;
12434
+ const nextOffset = offsets[next] || wholeOffset;
12435
+ return wholeOffset + (nextOffset - wholeOffset) * fraction;
12356
12436
  }
12357
12437
  function calculateIndex(scrollTop) {
12358
12438
  return binaryClosest(offsets, scrollTop);
@@ -13502,6 +13582,11 @@ const VAutocomplete = genericComponent()({
13502
13582
  menu.value = true;
13503
13583
  }
13504
13584
  });
13585
+ watch(model, value => {
13586
+ if (!props.multiple && !hasSelectionSlot.value) {
13587
+ search.value = value[0]?.title ?? '';
13588
+ }
13589
+ });
13505
13590
  useRender(() => {
13506
13591
  const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']);
13507
13592
  const isDirty = model.value.length > 0;
@@ -14121,7 +14206,7 @@ const VDialog = genericComponent()({
14121
14206
  }
14122
14207
  function onAfterEnter() {
14123
14208
  emit('afterEnter');
14124
- if (overlay.value?.contentEl && !overlay.value.contentEl.contains(document.activeElement)) {
14209
+ if ((props.scrim || props.retainFocus) && overlay.value?.contentEl && !overlay.value.contentEl.contains(document.activeElement)) {
14125
14210
  overlay.value.contentEl.focus({
14126
14211
  preventScroll: true
14127
14212
  });
@@ -20329,7 +20414,6 @@ const VDataTableHeaders = genericComponent()({
20329
20414
  });
20330
20415
  };
20331
20416
  const VDataTableMobileHeaderCell = () => {
20332
- const headerProps = mergeProps(props.headerProps ?? {} ?? {});
20333
20417
  const displayItems = computed(() => {
20334
20418
  return columns.value.filter(column => column?.sortable && !props.disableSort);
20335
20419
  });
@@ -20342,7 +20426,7 @@ const VDataTableHeaders = genericComponent()({
20342
20426
  "tag": "th",
20343
20427
  "class": [...headerCellClasses.value],
20344
20428
  "colspan": headers.value.length + 1
20345
- }, headerProps), {
20429
+ }, props.headerProps), {
20346
20430
  default: () => [createVNode("div", {
20347
20431
  "class": "v-data-table-header__content"
20348
20432
  }, [createVNode(VSelect, {
@@ -23265,6 +23349,7 @@ const VFileInput = genericComponent()({
23265
23349
  const inputRef = ref();
23266
23350
  const isActive = toRef(() => isFocused.value || props.active);
23267
23351
  const isPlainOrUnderlined = computed(() => ['plain', 'underlined'].includes(props.variant));
23352
+ const isDragging = shallowRef(false);
23268
23353
  function onFocus() {
23269
23354
  if (inputRef.value !== document.activeElement) {
23270
23355
  inputRef.value?.focus();
@@ -23291,11 +23376,26 @@ const VFileInput = genericComponent()({
23291
23376
  }
23292
23377
  function onDragover(e) {
23293
23378
  e.preventDefault();
23379
+ e.stopImmediatePropagation();
23380
+ isDragging.value = true;
23381
+ }
23382
+ function onDragleave(e) {
23383
+ e.preventDefault();
23384
+ isDragging.value = false;
23294
23385
  }
23295
23386
  function onDrop(e) {
23296
23387
  e.preventDefault();
23297
- if (!e.dataTransfer) return;
23298
- model.value = [...(e.dataTransfer.files ?? [])];
23388
+ e.stopImmediatePropagation();
23389
+ isDragging.value = false;
23390
+ if (!e.dataTransfer?.files?.length || !inputRef.value) return;
23391
+ const dataTransfer = new DataTransfer();
23392
+ for (const file of e.dataTransfer.files) {
23393
+ dataTransfer.items.add(file);
23394
+ }
23395
+ inputRef.value.files = dataTransfer.files;
23396
+ inputRef.value.dispatchEvent(new Event('change', {
23397
+ bubbles: true
23398
+ }));
23299
23399
  }
23300
23400
  watch(model, newValue => {
23301
23401
  const hasModelReset = !Array.isArray(newValue) || !newValue.length;
@@ -23317,6 +23417,7 @@ const VFileInput = genericComponent()({
23317
23417
  "modelValue": props.multiple ? model.value : model.value[0],
23318
23418
  "class": ['v-file-input', {
23319
23419
  'v-file-input--chips': !!props.chips,
23420
+ 'v-file-input--dragging': isDragging.value,
23320
23421
  'v-file-input--hide': props.hideInput,
23321
23422
  'v-input--plain-underlined': isPlainOrUnderlined.value
23322
23423
  }, props.class],
@@ -23378,6 +23479,7 @@ const VFileInput = genericComponent()({
23378
23479
  const target = e.target;
23379
23480
  model.value = [...(target.files ?? [])];
23380
23481
  },
23482
+ "onDragleave": onDragleave,
23381
23483
  "onFocus": onFocus,
23382
23484
  "onBlur": blur
23383
23485
  }, slotProps, inputAttrs), null), createVNode("div", {
@@ -29430,43 +29532,31 @@ const VFileUpload = genericComponent()({
29430
29532
  densityClasses
29431
29533
  } = useDensity(props);
29432
29534
  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);
29535
+ const isDragging = shallowRef(false);
29434
29536
  const vSheetRef = ref(null);
29435
29537
  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) {
29538
+ function onDragover(e) {
29445
29539
  e.preventDefault();
29446
29540
  e.stopImmediatePropagation();
29447
- dragOver.value = true;
29541
+ isDragging.value = true;
29448
29542
  }
29449
- function onDragLeave(e) {
29543
+ function onDragleave(e) {
29450
29544
  e.preventDefault();
29451
- dragOver.value = false;
29545
+ isDragging.value = false;
29452
29546
  }
29453
29547
  function onDrop(e) {
29454
29548
  e.preventDefault();
29455
29549
  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;
29550
+ isDragging.value = false;
29551
+ if (!e.dataTransfer?.files?.length || !inputRef.value) return;
29552
+ const dataTransfer = new DataTransfer();
29553
+ for (const file of e.dataTransfer.files) {
29554
+ dataTransfer.items.add(file);
29555
+ }
29556
+ inputRef.value.files = dataTransfer.files;
29557
+ inputRef.value.dispatchEvent(new Event('change', {
29558
+ bubbles: true
29559
+ }));
29470
29560
  }
29471
29561
  function onClick() {
29472
29562
  inputRef.value?.click();
@@ -29502,11 +29592,11 @@ const VFileUpload = genericComponent()({
29502
29592
  "class": ['v-file-upload', {
29503
29593
  'v-file-upload--clickable': !hasBrowse,
29504
29594
  'v-file-upload--disabled': props.disabled,
29505
- 'v-file-upload--dragging': dragOver.value
29595
+ 'v-file-upload--dragging': isDragging.value
29506
29596
  }, densityClasses.value, props.class],
29507
29597
  "style": [props.style],
29508
- "onDragleave": onDragLeave,
29509
- "onDragover": onDragOver,
29598
+ "onDragleave": onDragleave,
29599
+ "onDragover": onDragover,
29510
29600
  "onDrop": onDrop,
29511
29601
  "onClick": !hasBrowse ? onClick : undefined
29512
29602
  }, rootAttrs), {
@@ -29557,7 +29647,7 @@ const VFileUpload = genericComponent()({
29557
29647
  })]), props.subtitle && createVNode("div", {
29558
29648
  "class": "v-file-upload-subtitle"
29559
29649
  }, [props.subtitle])]), createVNode(VOverlay, {
29560
- "model-value": dragOver.value,
29650
+ "model-value": isDragging.value,
29561
29651
  "contained": true,
29562
29652
  "scrim": props.scrim
29563
29653
  }, null), slots.input?.({
@@ -30255,8 +30345,8 @@ const VTimePickerClock = genericComponent()({
30255
30345
  y
30256
30346
  } = getPosition(i);
30257
30347
  return {
30258
- left: `${50 + x * 50}%`,
30259
- top: `${50 + y * 50}%`
30348
+ left: `${Math.round(50 + x * 50)}%`,
30349
+ top: `${Math.round(50 + y * 50)}%`
30260
30350
  };
30261
30351
  }
30262
30352
  function euclidean(p0, p1) {
@@ -31660,7 +31750,7 @@ function createVuetify$1() {
31660
31750
  };
31661
31751
  });
31662
31752
  }
31663
- const version$1 = "3.8.3-master.2025-05-04";
31753
+ const version$1 = "3.8.4-dev.2025-05-07";
31664
31754
  createVuetify$1.version = version$1;
31665
31755
 
31666
31756
  // Vue's inject() can only be used in setup
@@ -31958,7 +32048,7 @@ var index = /*#__PURE__*/Object.freeze({
31958
32048
 
31959
32049
  /* eslint-disable local-rules/sort-imports */
31960
32050
 
31961
- const version = "3.8.3-master.2025-05-04";
32051
+ const version = "3.8.4-dev.2025-05-07";
31962
32052
 
31963
32053
  /* eslint-disable local-rules/sort-imports */
31964
32054