@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.
- package/CHANGELOG.md +14 -29
- package/dist/json/attributes.json +3140 -3132
- package/dist/json/importMap-labs.json +14 -14
- package/dist/json/importMap.json +148 -148
- package/dist/json/tags.json +2 -0
- package/dist/json/web-types.json +5887 -5867
- package/dist/vuetify-labs.cjs +162 -72
- package/dist/vuetify-labs.css +3608 -3581
- package/dist/vuetify-labs.d.ts +135 -102
- package/dist/vuetify-labs.esm.js +163 -73
- package/dist/vuetify-labs.esm.js.map +1 -1
- package/dist/vuetify-labs.js +162 -72
- package/dist/vuetify-labs.min.css +2 -2
- package/dist/vuetify.cjs +141 -39
- package/dist/vuetify.cjs.map +1 -1
- package/dist/vuetify.css +4998 -4971
- package/dist/vuetify.d.ts +164 -131
- package/dist/vuetify.esm.js +142 -40
- package/dist/vuetify.esm.js.map +1 -1
- package/dist/vuetify.js +141 -39
- package/dist/vuetify.js.map +1 -1
- package/dist/vuetify.min.css +2 -2
- package/dist/vuetify.min.js +1182 -1173
- package/dist/vuetify.min.js.map +1 -1
- package/lib/components/VAutocomplete/VAutocomplete.d.ts +3 -3
- package/lib/components/VAutocomplete/VAutocomplete.js +5 -0
- package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
- package/lib/components/VBottomNavigation/VBottomNavigation.d.ts +6 -6
- package/lib/components/VBtnGroup/VBtnGroup.css +30 -7
- package/lib/components/VBtnGroup/VBtnGroup.d.ts +58 -32
- package/lib/components/VBtnGroup/VBtnGroup.js +7 -3
- package/lib/components/VBtnGroup/VBtnGroup.js.map +1 -1
- package/lib/components/VBtnGroup/VBtnGroup.sass +44 -17
- package/lib/components/VBtnToggle/VBtnToggle.d.ts +25 -0
- package/lib/components/VCombobox/VCombobox.d.ts +3 -3
- package/lib/components/VDataTable/VDataTable.d.ts +110 -110
- package/lib/components/VDataTable/VDataTableHeaders.js +1 -2
- package/lib/components/VDataTable/VDataTableHeaders.js.map +1 -1
- package/lib/components/VDataTable/VDataTableServer.d.ts +55 -55
- package/lib/components/VDataTable/VDataTableVirtual.d.ts +55 -55
- package/lib/components/VDataTable/composables/headers.d.ts +75 -75
- package/lib/components/VDatePicker/VDatePicker.d.ts +3 -3
- package/lib/components/VDatePicker/VDatePickerMonth.d.ts +6 -6
- package/lib/components/VFileInput/VFileInput.css +4 -0
- package/lib/components/VFileInput/VFileInput.js +21 -3
- package/lib/components/VFileInput/VFileInput.js.map +1 -1
- package/lib/components/VFileInput/VFileInput.sass +4 -0
- package/lib/components/VInput/VInput.d.ts +1 -1
- package/lib/components/VNumberInput/VNumberInput.d.ts +3 -3
- package/lib/components/VOverlay/VOverlay.css +1 -1
- package/lib/components/VOverlay/_variables.scss +1 -1
- package/lib/components/VOverlay/locationStrategies.js +1 -1
- package/lib/components/VOverlay/locationStrategies.js.map +1 -1
- package/lib/components/VSelect/VSelect.d.ts +3 -3
- package/lib/components/VTabs/VTabs.d.ts +6 -6
- package/lib/components/transitions/dialog-transition.js +3 -3
- package/lib/components/transitions/dialog-transition.js.map +1 -1
- package/lib/composables/calendar.d.ts +1 -0
- package/lib/composables/calendar.js.map +1 -1
- package/lib/composables/theme.d.ts +6 -1
- package/lib/composables/theme.js +94 -26
- package/lib/composables/theme.js.map +1 -1
- package/lib/composables/virtual.js +6 -1
- package/lib/composables/virtual.js.map +1 -1
- package/lib/entry-bundler.d.ts +6 -6
- package/lib/entry-bundler.js +1 -1
- package/lib/entry-bundler.js.map +1 -1
- package/lib/framework.d.ts +56 -51
- package/lib/framework.js +1 -1
- package/lib/framework.js.map +1 -1
- package/lib/labs/VCalendar/VCalendar.d.ts +3 -3
- package/lib/labs/VCalendar/VCalendarDay.d.ts +3 -3
- package/lib/labs/VCalendar/VCalendarInterval.d.ts +3 -3
- package/lib/labs/VCalendar/VCalendarMonthDay.d.ts +3 -3
- package/lib/labs/VDateInput/VDateInput.d.ts +9 -9
- package/lib/labs/VFileUpload/VFileUpload.js +19 -31
- package/lib/labs/VFileUpload/VFileUpload.js.map +1 -1
- package/lib/labs/VTimePicker/VTimePickerClock.js +2 -2
- package/lib/labs/VTimePicker/VTimePickerClock.js.map +1 -1
- package/lib/util/globals.d.ts +1 -0
- package/lib/util/globals.js +1 -0
- package/lib/util/globals.js.map +1 -1
- package/lib/util/helpers.js.map +1 -1
- package/package.json +6 -6
package/dist/vuetify.cjs
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
|
-
* Vuetify v3.8.
|
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(
|
2903
|
+
variables.push(`--${prefix}theme-${key}: ${rgb.r},${rgb.g},${rgb.b}`);
|
2899
2904
|
if (!key.startsWith('on-')) {
|
2900
|
-
variables.push(
|
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(
|
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(
|
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
|
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,
|
2998
|
-
}
|
2999
|
-
|
3000
|
-
|
3001
|
-
|
3002
|
-
|
3003
|
-
|
3004
|
-
|
3005
|
-
|
3006
|
-
|
3007
|
-
|
3008
|
-
|
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(
|
3087
|
+
upsertStyles(parsedOptions.stylesheetId, parsedOptions.cspNonce, styles.value);
|
3052
3088
|
}
|
3053
3089
|
}
|
3054
3090
|
}
|
3055
|
-
|
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 :
|
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)
|
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
|
-
|
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
|
-
|
23580
|
-
|
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.
|
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.
|
29350
|
+
const version = "3.8.4-dev.2025-05-07";
|
29249
29351
|
createVuetify.version = version;
|
29250
29352
|
|
29251
29353
|
exports.blueprints = index;
|