@vuetify/nightly 3.8.3-master.2025-05-05 → 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 (84) hide show
  1. package/CHANGELOG.md +14 -29
  2. package/dist/json/attributes.json +3140 -3132
  3. package/dist/json/importMap-labs.json +14 -14
  4. package/dist/json/importMap.json +148 -148
  5. package/dist/json/tags.json +2 -0
  6. package/dist/json/web-types.json +5887 -5867
  7. package/dist/vuetify-labs.cjs +162 -72
  8. package/dist/vuetify-labs.css +3608 -3581
  9. package/dist/vuetify-labs.d.ts +135 -102
  10. package/dist/vuetify-labs.esm.js +163 -73
  11. package/dist/vuetify-labs.esm.js.map +1 -1
  12. package/dist/vuetify-labs.js +162 -72
  13. package/dist/vuetify-labs.min.css +2 -2
  14. package/dist/vuetify.cjs +141 -39
  15. package/dist/vuetify.cjs.map +1 -1
  16. package/dist/vuetify.css +4998 -4971
  17. package/dist/vuetify.d.ts +164 -131
  18. package/dist/vuetify.esm.js +142 -40
  19. package/dist/vuetify.esm.js.map +1 -1
  20. package/dist/vuetify.js +141 -39
  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 +55 -55
  40. package/lib/components/VDataTable/VDataTableVirtual.d.ts +55 -55
  41. package/lib/components/VDataTable/composables/headers.d.ts +75 -75
  42. package/lib/components/VDatePicker/VDatePicker.d.ts +3 -3
  43. package/lib/components/VDatePicker/VDatePickerMonth.d.ts +6 -6
  44. package/lib/components/VFileInput/VFileInput.css +4 -0
  45. package/lib/components/VFileInput/VFileInput.js +21 -3
  46. package/lib/components/VFileInput/VFileInput.js.map +1 -1
  47. package/lib/components/VFileInput/VFileInput.sass +4 -0
  48. package/lib/components/VInput/VInput.d.ts +1 -1
  49. package/lib/components/VNumberInput/VNumberInput.d.ts +3 -3
  50. package/lib/components/VOverlay/VOverlay.css +1 -1
  51. package/lib/components/VOverlay/_variables.scss +1 -1
  52. package/lib/components/VOverlay/locationStrategies.js +1 -1
  53. package/lib/components/VOverlay/locationStrategies.js.map +1 -1
  54. package/lib/components/VSelect/VSelect.d.ts +3 -3
  55. package/lib/components/VTabs/VTabs.d.ts +6 -6
  56. package/lib/components/transitions/dialog-transition.js +3 -3
  57. package/lib/components/transitions/dialog-transition.js.map +1 -1
  58. package/lib/composables/calendar.d.ts +1 -0
  59. package/lib/composables/calendar.js.map +1 -1
  60. package/lib/composables/theme.d.ts +6 -1
  61. package/lib/composables/theme.js +94 -26
  62. package/lib/composables/theme.js.map +1 -1
  63. package/lib/composables/virtual.js +6 -1
  64. package/lib/composables/virtual.js.map +1 -1
  65. package/lib/entry-bundler.d.ts +6 -6
  66. package/lib/entry-bundler.js +1 -1
  67. package/lib/entry-bundler.js.map +1 -1
  68. package/lib/framework.d.ts +56 -51
  69. package/lib/framework.js +1 -1
  70. package/lib/framework.js.map +1 -1
  71. package/lib/labs/VCalendar/VCalendar.d.ts +3 -3
  72. package/lib/labs/VCalendar/VCalendarDay.d.ts +3 -3
  73. package/lib/labs/VCalendar/VCalendarInterval.d.ts +3 -3
  74. package/lib/labs/VCalendar/VCalendarMonthDay.d.ts +3 -3
  75. package/lib/labs/VDateInput/VDateInput.d.ts +9 -9
  76. package/lib/labs/VFileUpload/VFileUpload.js +19 -31
  77. package/lib/labs/VFileUpload/VFileUpload.js.map +1 -1
  78. package/lib/labs/VTimePicker/VTimePickerClock.js +2 -2
  79. package/lib/labs/VTimePicker/VTimePickerClock.js.map +1 -1
  80. package/lib/util/globals.d.ts +1 -0
  81. package/lib/util/globals.js +1 -0
  82. package/lib/util/globals.js.map +1 -1
  83. package/lib/util/helpers.js.map +1 -1
  84. package/package.json +6 -6
package/dist/vuetify.cjs CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * Vuetify v3.8.3-master.2025-05-05
2
+ * Vuetify v3.8.4-dev.2025-05-07
3
3
  * Forged by John Leider
4
4
  * Released under the MIT License.
5
5
  */
@@ -14,6 +14,7 @@
14
14
  const SUPPORTS_INTERSECTION = IN_BROWSER && 'IntersectionObserver' in window;
15
15
  const SUPPORTS_TOUCH = IN_BROWSER && ('ontouchstart' in window || window.navigator.maxTouchPoints > 0);
16
16
  const SUPPORTS_EYE_DROPPER = IN_BROWSER && 'EyeDropper' in window;
17
+ const SUPPORTS_MATCH_MEDIA = IN_BROWSER && 'matchMedia' in window && typeof window.matchMedia === 'function';
17
18
 
18
19
  function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
19
20
  function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
@@ -2785,6 +2786,7 @@
2785
2786
  function genDefaults$1() {
2786
2787
  return {
2787
2788
  defaultTheme: 'light',
2789
+ prefix: 'v-',
2788
2790
  variations: {
2789
2791
  colors: [],
2790
2792
  lighten: 0,
@@ -2866,7 +2868,10 @@
2866
2868
  }
2867
2869
  }
2868
2870
  },
2869
- stylesheetId: 'vuetify-theme-stylesheet'
2871
+ stylesheetId: 'vuetify-theme-stylesheet',
2872
+ scoped: false,
2873
+ unimportant: false,
2874
+ utilities: true
2870
2875
  };
2871
2876
  }
2872
2877
  function parseThemeOptions() {
@@ -2889,21 +2894,21 @@
2889
2894
  function createCssClass(lines, selector, content, scope) {
2890
2895
  lines.push(`${getScopedSelector(selector, scope)} {\n`, ...content.map(line => ` ${line};\n`), '}\n');
2891
2896
  }
2892
- function genCssVariables(theme) {
2897
+ function genCssVariables(theme, prefix) {
2893
2898
  const lightOverlay = theme.dark ? 2 : 1;
2894
2899
  const darkOverlay = theme.dark ? 1 : 2;
2895
2900
  const variables = [];
2896
2901
  for (const [key, value] of Object.entries(theme.colors)) {
2897
2902
  const rgb = parseColor(value);
2898
- variables.push(`--v-theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2903
+ variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
2899
2904
  if (!key.startsWith('on-')) {
2900
- variables.push(`--v-theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2905
+ variables.push(`--${prefix}theme-${key}-overlay-multiplier: ${getLuma(value) > 0.18 ? lightOverlay : darkOverlay}`);
2901
2906
  }
2902
2907
  }
2903
2908
  for (const [key, value] of Object.entries(theme.variables)) {
2904
2909
  const color = typeof value === 'string' && value.startsWith('#') ? parseColor(value) : undefined;
2905
2910
  const rgb = color ? `${color.r}, ${color.g}, ${color.b}` : undefined;
2906
- variables.push(`--v-${key}: ${rgb ?? value}`);
2911
+ variables.push(`--${prefix}${key}: ${rgb ?? value}`);
2907
2912
  }
2908
2913
  return variables;
2909
2914
  }
@@ -2947,7 +2952,8 @@
2947
2952
  const scopeSelector = `:where(${scope})`;
2948
2953
  return selector === ':root' ? scopeSelector : `${scopeSelector} ${selector}`;
2949
2954
  }
2950
- function upsertStyles(styleEl, styles) {
2955
+ function upsertStyles(id, cspNonce, styles) {
2956
+ const styleEl = getOrCreateStyleElement(id, cspNonce);
2951
2957
  if (!styleEl) return;
2952
2958
  styleEl.innerHTML = styles;
2953
2959
  }
@@ -2967,8 +2973,17 @@
2967
2973
  // Composables
2968
2974
  function createTheme(options) {
2969
2975
  const parsedOptions = parseThemeOptions(options);
2970
- const name = vue.shallowRef(parsedOptions.defaultTheme);
2976
+ const _name = vue.shallowRef(parsedOptions.defaultTheme);
2971
2977
  const themes = vue.ref(parsedOptions.themes);
2978
+ const systemName = vue.shallowRef('light');
2979
+ const name = vue.computed({
2980
+ get() {
2981
+ return _name.value === 'system' ? systemName.value : _name.value;
2982
+ },
2983
+ set(val) {
2984
+ _name.value = val;
2985
+ }
2986
+ });
2972
2987
  const computedThemes = vue.computed(() => {
2973
2988
  const acc = {};
2974
2989
  for (const [name, original] of Object.entries(themes.value)) {
@@ -2989,28 +3004,49 @@
2989
3004
  const current = vue.toRef(() => computedThemes.value[name.value]);
2990
3005
  const styles = vue.computed(() => {
2991
3006
  const lines = [];
3007
+ const important = parsedOptions.unimportant ? '' : ' !important';
3008
+ const scoped = parsedOptions.scoped ? parsedOptions.prefix : '';
2992
3009
  if (current.value?.dark) {
2993
3010
  createCssClass(lines, ':root', ['color-scheme: dark'], parsedOptions.scope);
2994
3011
  }
2995
- createCssClass(lines, ':root', genCssVariables(current.value), parsedOptions.scope);
3012
+ createCssClass(lines, ':root', genCssVariables(current.value, parsedOptions.prefix), parsedOptions.scope);
2996
3013
  for (const [themeName, theme] of Object.entries(computedThemes.value)) {
2997
- createCssClass(lines, `.v-theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme)], parsedOptions.scope);
2998
- }
2999
- const bgLines = [];
3000
- const fgLines = [];
3001
- const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
3002
- for (const key of colors) {
3003
- if (key.startsWith('on-')) {
3004
- createCssClass(fgLines, `.${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
3005
- } else {
3006
- 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);
3007
- createCssClass(fgLines, `.text-${key}`, [`color: rgb(var(--v-theme-${key})) !important`], parsedOptions.scope);
3008
- createCssClass(fgLines, `.border-${key}`, [`--v-border-color: var(--v-theme-${key})`], parsedOptions.scope);
3014
+ createCssClass(lines, `.${parsedOptions.prefix}theme--${themeName}`, [`color-scheme: ${theme.dark ? 'dark' : 'normal'}`, ...genCssVariables(theme, parsedOptions.prefix)], parsedOptions.scope);
3015
+ }
3016
+ if (parsedOptions.utilities) {
3017
+ const bgLines = [];
3018
+ const fgLines = [];
3019
+ const colors = new Set(Object.values(computedThemes.value).flatMap(theme => Object.keys(theme.colors)));
3020
+ for (const key of colors) {
3021
+ if (key.startsWith('on-')) {
3022
+ createCssClass(fgLines, `.${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
3023
+ } else {
3024
+ 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);
3025
+ createCssClass(fgLines, `.${scoped}text-${key}`, [`color: rgb(var(--${parsedOptions.prefix}theme-${key}))${important}`], parsedOptions.scope);
3026
+ createCssClass(fgLines, `.${scoped}border-${key}`, [`--${parsedOptions.prefix}border-color: var(--${parsedOptions.prefix}theme-${key})`], parsedOptions.scope);
3027
+ }
3009
3028
  }
3029
+ lines.push(...bgLines, ...fgLines);
3010
3030
  }
3011
- lines.push(...bgLines, ...fgLines);
3012
3031
  return lines.map((str, i) => i === 0 ? str : ` ${str}`).join('');
3013
3032
  });
3033
+ const themeClasses = vue.toRef(() => parsedOptions.isDisabled ? undefined : `${parsedOptions.prefix}theme--${name.value}`);
3034
+ const themeNames = vue.toRef(() => Object.keys(computedThemes.value));
3035
+ if (SUPPORTS_MATCH_MEDIA) {
3036
+ const media = window.matchMedia('(prefers-color-scheme: dark)');
3037
+ function updateSystemName() {
3038
+ systemName.value = media.matches ? 'dark' : 'light';
3039
+ }
3040
+ updateSystemName();
3041
+ media.addEventListener('change', updateSystemName, {
3042
+ passive: true
3043
+ });
3044
+ if (vue.getCurrentScope()) {
3045
+ vue.onScopeDispose(() => {
3046
+ media.removeEventListener('change', updateSystemName);
3047
+ });
3048
+ }
3049
+ }
3014
3050
  function install(app) {
3015
3051
  if (parsedOptions.isDisabled) return;
3016
3052
  const head = app._context.provides.usehead;
@@ -3048,22 +3084,55 @@
3048
3084
  updateStyles();
3049
3085
  }
3050
3086
  function updateStyles() {
3051
- upsertStyles(getOrCreateStyleElement(parsedOptions.stylesheetId, parsedOptions.cspNonce), styles.value);
3087
+ upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
3052
3088
  }
3053
3089
  }
3054
3090
  }
3055
- const themeClasses = vue.toRef(() => parsedOptions.isDisabled ? undefined : `v-theme--${name.value}`);
3091
+ function change(themeName) {
3092
+ if (!themeNames.value.includes(themeName)) {
3093
+ consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
3094
+ return;
3095
+ }
3096
+ name.value = themeName;
3097
+ }
3098
+ function cycle() {
3099
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : themeNames.value;
3100
+ const currentIndex = themeArray.indexOf(name.value);
3101
+ const nextIndex = currentIndex === -1 ? 0 : (currentIndex + 1) % themeArray.length;
3102
+ change(themeArray[nextIndex]);
3103
+ }
3104
+ function toggle() {
3105
+ let themeArray = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['light', 'dark'];
3106
+ cycle(themeArray);
3107
+ }
3108
+ const globalName = new Proxy(name, {
3109
+ get(target, prop) {
3110
+ return target[prop];
3111
+ },
3112
+ set(target, prop, val) {
3113
+ if (prop === 'value') {
3114
+ deprecate(`theme.global.name.value = ${val}`, `theme.change('${val}')`);
3115
+ }
3116
+ // @ts-expect-error
3117
+ target[prop] = val;
3118
+ return true;
3119
+ }
3120
+ });
3056
3121
  return {
3057
3122
  install,
3123
+ change,
3124
+ cycle,
3125
+ toggle,
3058
3126
  isDisabled: parsedOptions.isDisabled,
3059
3127
  name,
3060
3128
  themes,
3061
3129
  current,
3062
3130
  computedThemes,
3131
+ prefix: parsedOptions.prefix,
3063
3132
  themeClasses,
3064
3133
  styles,
3065
3134
  global: {
3066
- name,
3135
+ name: globalName,
3067
3136
  current
3068
3137
  }
3069
3138
  };
@@ -3074,7 +3143,7 @@
3074
3143
  if (!theme) throw new Error('Could not find Vuetify theme injection');
3075
3144
  const name = vue.toRef(() => props.theme ?? theme.name.value);
3076
3145
  const current = vue.toRef(() => theme.themes.value[name.value]);
3077
- const themeClasses = vue.toRef(() => theme.isDisabled ? undefined : `v-theme--${name.value}`);
3146
+ const themeClasses = vue.toRef(() => theme.isDisabled ? undefined : `${theme.prefix}theme--${name.value}`);
3078
3147
  const newTheme = {
3079
3148
  ...theme,
3080
3149
  name,
@@ -3413,10 +3482,10 @@
3413
3482
  async onLeave(el, done) {
3414
3483
  await new Promise(resolve => requestAnimationFrame(resolve));
3415
3484
  let dimensions;
3416
- if (!Array.isArray(props.target) && !props.target.offsetParent && saved.has(el)) {
3417
- dimensions = saved.get(el);
3418
- } else {
3485
+ if (!saved.has(el) || Array.isArray(props.target) || props.target.offsetParent || props.target.getClientRects().length) {
3419
3486
  dimensions = getDimensions(props.target, el);
3487
+ } else {
3488
+ dimensions = saved.get(el);
3420
3489
  }
3421
3490
  const {
3422
3491
  x,
@@ -4621,9 +4690,15 @@
4621
4690
  };
4622
4691
  }
4623
4692
 
4693
+ // Types
4694
+
4624
4695
  const makeVBtnGroupProps = propsFactory({
4625
4696
  baseColor: String,
4626
4697
  divided: Boolean,
4698
+ direction: {
4699
+ type: String,
4700
+ default: 'horizontal'
4701
+ },
4627
4702
  ...makeBorderProps(),
4628
4703
  ...makeComponentProps(),
4629
4704
  ...makeDensityProps(),
@@ -4657,7 +4732,7 @@
4657
4732
  } = useRounded(props);
4658
4733
  provideDefaults({
4659
4734
  VBtn: {
4660
- height: 'auto',
4735
+ height: vue.toRef(() => props.direction === 'horizontal' ? 'auto' : null),
4661
4736
  baseColor: vue.toRef(() => props.baseColor),
4662
4737
  color: vue.toRef(() => props.color),
4663
4738
  density: vue.toRef(() => props.density),
@@ -4667,7 +4742,7 @@
4667
4742
  });
4668
4743
  useRender(() => {
4669
4744
  return vue.createVNode(props.tag, {
4670
- "class": ['v-btn-group', {
4745
+ "class": ['v-btn-group', `v-btn-group--${props.direction}`, {
4671
4746
  'v-btn-group--divided': props.divided
4672
4747
  }, themeClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, roundedClasses.value, props.class],
4673
4748
  "style": props.style
@@ -10446,7 +10521,7 @@
10446
10521
  observe = false;
10447
10522
  requestAnimationFrame(() => observe = true);
10448
10523
  if (!data.target.value || !data.contentEl.value) return;
10449
- if (Array.isArray(data.target.value) || data.target.value.offsetParent) {
10524
+ if (Array.isArray(data.target.value) || data.target.value.offsetParent || data.target.value.getClientRects().length) {
10450
10525
  targetBox = getTargetBox(data.target.value);
10451
10526
  } // Otherwise target element is hidden, use last known value
10452
10527
 
@@ -12634,7 +12709,12 @@
12634
12709
  }
12635
12710
  function calculateOffset(index) {
12636
12711
  index = clamp(index, 0, items.value.length - 1);
12637
- return offsets[index] || 0;
12712
+ const whole = Math.floor(index);
12713
+ const fraction = index % 1;
12714
+ const next = whole + 1;
12715
+ const wholeOffset = offsets[whole] || 0;
12716
+ const nextOffset = offsets[next] || wholeOffset;
12717
+ return wholeOffset + (nextOffset - wholeOffset) * fraction;
12638
12718
  }
12639
12719
  function calculateIndex(scrollTop) {
12640
12720
  return binaryClosest(offsets, scrollTop);
@@ -13784,6 +13864,11 @@
13784
13864
  menu.value = true;
13785
13865
  }
13786
13866
  });
13867
+ vue.watch(model, value => {
13868
+ if (!props.multiple && !hasSelectionSlot.value) {
13869
+ search.value = value[0]?.title ?? '';
13870
+ }
13871
+ });
13787
13872
  useRender(() => {
13788
13873
  const hasList = !!(!props.hideNoData || displayItems.value.length || slots['prepend-item'] || slots['append-item'] || slots['no-data']);
13789
13874
  const isDirty = model.value.length > 0;
@@ -20611,7 +20696,6 @@
20611
20696
  });
20612
20697
  };
20613
20698
  const VDataTableMobileHeaderCell = () => {
20614
- const headerProps = vue.mergeProps(props.headerProps ?? {} ?? {});
20615
20699
  const displayItems = vue.computed(() => {
20616
20700
  return columns.value.filter(column => column?.sortable && !props.disableSort);
20617
20701
  });
@@ -20624,7 +20708,7 @@
20624
20708
  "tag": "th",
20625
20709
  "class": [...headerCellClasses.value],
20626
20710
  "colspan": headers.value.length + 1
20627
- }, headerProps), {
20711
+ }, props.headerProps), {
20628
20712
  default: () => [vue.createVNode("div", {
20629
20713
  "class": "v-data-table-header__content"
20630
20714
  }, [vue.createVNode(VSelect, {
@@ -23547,6 +23631,7 @@
23547
23631
  const inputRef = vue.ref();
23548
23632
  const isActive = vue.toRef(() => isFocused.value || props.active);
23549
23633
  const isPlainOrUnderlined = vue.computed(() => ['plain', 'underlined'].includes(props.variant));
23634
+ const isDragging = vue.shallowRef(false);
23550
23635
  function onFocus() {
23551
23636
  if (inputRef.value !== document.activeElement) {
23552
23637
  inputRef.value?.focus();
@@ -23573,11 +23658,26 @@
23573
23658
  }
23574
23659
  function onDragover(e) {
23575
23660
  e.preventDefault();
23661
+ e.stopImmediatePropagation();
23662
+ isDragging.value = true;
23663
+ }
23664
+ function onDragleave(e) {
23665
+ e.preventDefault();
23666
+ isDragging.value = false;
23576
23667
  }
23577
23668
  function onDrop(e) {
23578
23669
  e.preventDefault();
23579
- if (!e.dataTransfer) return;
23580
- model.value = [...(e.dataTransfer.files ?? [])];
23670
+ e.stopImmediatePropagation();
23671
+ isDragging.value = false;
23672
+ if (!e.dataTransfer?.files?.length || !inputRef.value) return;
23673
+ const dataTransfer = new DataTransfer();
23674
+ for (const file of e.dataTransfer.files) {
23675
+ dataTransfer.items.add(file);
23676
+ }
23677
+ inputRef.value.files = dataTransfer.files;
23678
+ inputRef.value.dispatchEvent(new Event('change', {
23679
+ bubbles: true
23680
+ }));
23581
23681
  }
23582
23682
  vue.watch(model, newValue => {
23583
23683
  const hasModelReset = !Array.isArray(newValue) || !newValue.length;
@@ -23599,6 +23699,7 @@
23599
23699
  "modelValue": props.multiple ? model.value : model.value[0],
23600
23700
  "class": ['v-file-input', {
23601
23701
  'v-file-input--chips': !!props.chips,
23702
+ 'v-file-input--dragging': isDragging.value,
23602
23703
  'v-file-input--hide': props.hideInput,
23603
23704
  'v-input--plain-underlined': isPlainOrUnderlined.value
23604
23705
  }, props.class],
@@ -23660,6 +23761,7 @@
23660
23761
  const target = e.target;
23661
23762
  model.value = [...(target.files ?? [])];
23662
23763
  },
23764
+ "onDragleave": onDragleave,
23663
23765
  "onFocus": onFocus,
23664
23766
  "onBlur": blur
23665
23767
  }, slotProps, inputAttrs), null), vue.createVNode("div", {
@@ -29220,7 +29322,7 @@
29220
29322
  };
29221
29323
  });
29222
29324
  }
29223
- const version$1 = "3.8.3-master.2025-05-05";
29325
+ const version$1 = "3.8.4-dev.2025-05-07";
29224
29326
  createVuetify$1.version = version$1;
29225
29327
 
29226
29328
  // Vue's inject() can only be used in setup
@@ -29245,7 +29347,7 @@
29245
29347
  ...options
29246
29348
  });
29247
29349
  };
29248
- const version = "3.8.3-master.2025-05-05";
29350
+ const version = "3.8.4-dev.2025-05-07";
29249
29351
  createVuetify.version = version;
29250
29352
 
29251
29353
  exports.blueprints = index;