@vuetify/nightly 3.9.2-master.2025-07-29 → 3.9.3-dev.2025-07-30
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 +6 -62
- package/dist/json/attributes.json +4301 -4281
- package/dist/json/importMap-labs.json +26 -26
- package/dist/json/importMap.json +188 -188
- package/dist/json/tags.json +5 -0
- package/dist/json/web-types.json +7597 -7527
- package/dist/vuetify-labs.cjs +228 -33
- package/dist/vuetify-labs.css +5466 -5464
- package/dist/vuetify-labs.d.ts +134 -71
- package/dist/vuetify-labs.esm.js +228 -33
- package/dist/vuetify-labs.esm.js.map +1 -1
- package/dist/vuetify-labs.js +228 -33
- package/dist/vuetify-labs.min.css +2 -2
- package/dist/vuetify.cjs +190 -24
- package/dist/vuetify.cjs.map +1 -1
- package/dist/vuetify.css +5163 -5161
- package/dist/vuetify.d.ts +124 -71
- package/dist/vuetify.esm.js +190 -24
- package/dist/vuetify.esm.js.map +1 -1
- package/dist/vuetify.js +190 -24
- package/dist/vuetify.js.map +1 -1
- package/dist/vuetify.min.css +2 -2
- package/dist/vuetify.min.js +731 -708
- package/dist/vuetify.min.js.map +1 -1
- package/lib/components/VAutocomplete/VAutocomplete.js +1 -0
- package/lib/components/VAutocomplete/VAutocomplete.js.map +1 -1
- package/lib/components/VCombobox/VCombobox.js +11 -6
- package/lib/components/VCombobox/VCombobox.js.map +1 -1
- package/lib/components/VFileInput/VFileInput.d.ts +15 -0
- package/lib/components/VFileInput/VFileInput.js +38 -9
- package/lib/components/VFileInput/VFileInput.js.map +1 -1
- package/lib/components/VList/VList.js +2 -1
- package/lib/components/VList/VList.js.map +1 -1
- package/lib/components/VList/VListItem.js +7 -1
- package/lib/components/VList/VListItem.js.map +1 -1
- package/lib/components/VProgressLinear/VProgressLinear.css +1 -1
- package/lib/components/VProgressLinear/VProgressLinear.d.ts +75 -0
- package/lib/components/VProgressLinear/VProgressLinear.js +32 -6
- package/lib/components/VProgressLinear/VProgressLinear.js.map +1 -1
- package/lib/components/VProgressLinear/VProgressLinear.sass +1 -1
- package/lib/components/VProgressLinear/chunks.d.ts +55 -0
- package/lib/components/VProgressLinear/chunks.js +62 -0
- package/lib/components/VProgressLinear/chunks.js.map +1 -0
- package/lib/components/VSelect/VSelect.js +1 -0
- package/lib/components/VSelect/VSelect.js.map +1 -1
- package/lib/composables/fileFilter.d.ts +18 -0
- package/lib/composables/fileFilter.js +38 -0
- package/lib/composables/fileFilter.js.map +1 -0
- package/lib/composables/theme.d.ts +1 -0
- package/lib/composables/theme.js +3 -1
- package/lib/composables/theme.js.map +1 -1
- package/lib/entry-bundler.js +1 -1
- package/lib/entry-bundler.js.map +1 -1
- package/lib/framework.d.ts +72 -71
- package/lib/framework.js +1 -1
- package/lib/framework.js.map +1 -1
- package/lib/labs/VFileUpload/VFileUpload.d.ts +15 -0
- package/lib/labs/VFileUpload/VFileUpload.js +39 -9
- package/lib/labs/VFileUpload/VFileUpload.js.map +1 -1
- package/package.json +1 -1
package/dist/vuetify.cjs
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*!
|
2
|
-
* Vuetify v3.9.
|
2
|
+
* Vuetify v3.9.3-dev.2025-07-30
|
3
3
|
* Forged by John Leider
|
4
4
|
* Released under the MIT License.
|
5
5
|
*/
|
@@ -3163,6 +3163,7 @@
|
|
3163
3163
|
return acc;
|
3164
3164
|
});
|
3165
3165
|
const current = vue.toRef(() => computedThemes.value[name.value]);
|
3166
|
+
const isSystem = vue.toRef(() => _name.value === 'system');
|
3166
3167
|
const styles = vue.computed(() => {
|
3167
3168
|
const lines = [];
|
3168
3169
|
const important = parsedOptions.unimportant ? '' : ' !important';
|
@@ -3250,7 +3251,7 @@
|
|
3250
3251
|
}
|
3251
3252
|
}
|
3252
3253
|
function change(themeName) {
|
3253
|
-
if (!themeNames.value.includes(themeName)) {
|
3254
|
+
if (themeName !== 'system' && !themeNames.value.includes(themeName)) {
|
3254
3255
|
consoleWarn(`Theme "${themeName}" not found on the Vuetify theme instance`);
|
3255
3256
|
return;
|
3256
3257
|
}
|
@@ -3283,6 +3284,7 @@
|
|
3283
3284
|
cycle,
|
3284
3285
|
toggle,
|
3285
3286
|
isDisabled: parsedOptions.isDisabled,
|
3287
|
+
isSystem,
|
3286
3288
|
name,
|
3287
3289
|
themes,
|
3288
3290
|
current,
|
@@ -5494,6 +5496,69 @@
|
|
5494
5496
|
};
|
5495
5497
|
}
|
5496
5498
|
|
5499
|
+
// Utilities
|
5500
|
+
|
5501
|
+
// Types
|
5502
|
+
|
5503
|
+
// Composables
|
5504
|
+
const makeChunksProps = propsFactory({
|
5505
|
+
chunkCount: {
|
5506
|
+
type: [Number, String],
|
5507
|
+
default: null
|
5508
|
+
},
|
5509
|
+
chunkWidth: {
|
5510
|
+
type: [Number, String],
|
5511
|
+
default: null
|
5512
|
+
},
|
5513
|
+
chunkGap: {
|
5514
|
+
type: [Number, String],
|
5515
|
+
default: 4
|
5516
|
+
}
|
5517
|
+
}, 'chunks');
|
5518
|
+
function useChunks(props, containerWidth) {
|
5519
|
+
const hasChunks = vue.toRef(() => !!props.chunkCount || !!props.chunkWidth);
|
5520
|
+
const chunkWidth = vue.computed(() => {
|
5521
|
+
const containerSize = vue.toValue(containerWidth);
|
5522
|
+
if (!containerSize) {
|
5523
|
+
return 0;
|
5524
|
+
}
|
5525
|
+
if (!props.chunkCount) {
|
5526
|
+
return Number(props.chunkWidth);
|
5527
|
+
}
|
5528
|
+
const count = Number(props.chunkCount);
|
5529
|
+
const availableWidth = containerSize - Number(props.chunkGap) * (count - 1);
|
5530
|
+
return availableWidth / count;
|
5531
|
+
});
|
5532
|
+
const chunkGap = vue.toRef(() => Number(props.chunkGap));
|
5533
|
+
const chunksMaskStyles = vue.computed(() => {
|
5534
|
+
if (!hasChunks.value) {
|
5535
|
+
return {};
|
5536
|
+
}
|
5537
|
+
const chunkGapPx = convertToUnit(chunkGap.value);
|
5538
|
+
const chunkWidthPx = convertToUnit(chunkWidth.value);
|
5539
|
+
return {
|
5540
|
+
maskRepeat: 'repeat-x',
|
5541
|
+
maskImage: `linear-gradient(90deg, #000, #000 ${chunkWidthPx}, transparent ${chunkWidthPx}, transparent)`,
|
5542
|
+
maskSize: `calc(${chunkWidthPx} + ${chunkGapPx}) 100%`
|
5543
|
+
};
|
5544
|
+
});
|
5545
|
+
function snapValueToChunk(val) {
|
5546
|
+
const containerSize = vue.toValue(containerWidth);
|
5547
|
+
if (!containerSize) {
|
5548
|
+
return val;
|
5549
|
+
}
|
5550
|
+
const gapRelativeSize = 100 * chunkGap.value / containerSize;
|
5551
|
+
const chunkRelativeSize = 100 * (chunkWidth.value + chunkGap.value) / containerSize;
|
5552
|
+
const filledChunks = Math.floor((val + gapRelativeSize) / chunkRelativeSize);
|
5553
|
+
return clamp(0, filledChunks * chunkRelativeSize - gapRelativeSize / 2, 100);
|
5554
|
+
}
|
5555
|
+
return {
|
5556
|
+
hasChunks,
|
5557
|
+
chunksMaskStyles,
|
5558
|
+
snapValueToChunk
|
5559
|
+
};
|
5560
|
+
}
|
5561
|
+
|
5497
5562
|
const makeVProgressLinearProps = propsFactory({
|
5498
5563
|
absolute: Boolean,
|
5499
5564
|
active: {
|
@@ -5528,6 +5593,7 @@
|
|
5528
5593
|
stream: Boolean,
|
5529
5594
|
striped: Boolean,
|
5530
5595
|
roundedBar: Boolean,
|
5596
|
+
...makeChunksProps(),
|
5531
5597
|
...makeComponentProps(),
|
5532
5598
|
...makeLocationProps({
|
5533
5599
|
location: 'top'
|
@@ -5546,6 +5612,7 @@
|
|
5546
5612
|
let {
|
5547
5613
|
slots
|
5548
5614
|
} = _ref;
|
5615
|
+
const root = vue.ref();
|
5549
5616
|
const progress = useProxiedModel(props, 'modelValue');
|
5550
5617
|
const {
|
5551
5618
|
isRtl,
|
@@ -5587,6 +5654,24 @@
|
|
5587
5654
|
const isReversed = vue.computed(() => isRtl.value !== props.reverse);
|
5588
5655
|
const transition = vue.computed(() => props.indeterminate ? 'fade-transition' : 'slide-x-transition');
|
5589
5656
|
const isForcedColorsModeActive = IN_BROWSER && window.matchMedia?.('(forced-colors: active)').matches;
|
5657
|
+
const containerWidth = vue.shallowRef(0);
|
5658
|
+
const {
|
5659
|
+
hasChunks,
|
5660
|
+
chunksMaskStyles,
|
5661
|
+
snapValueToChunk
|
5662
|
+
} = useChunks(props, containerWidth);
|
5663
|
+
useToggleScope(hasChunks, () => {
|
5664
|
+
const {
|
5665
|
+
resizeRef
|
5666
|
+
} = useResizeObserver(entries => containerWidth.value = entries[0].contentRect.width);
|
5667
|
+
vue.watchEffect(() => resizeRef.value = root.value);
|
5668
|
+
});
|
5669
|
+
const bufferWidth = vue.computed(() => {
|
5670
|
+
return hasChunks.value ? snapValueToChunk(normalizedBuffer.value) : normalizedBuffer.value;
|
5671
|
+
});
|
5672
|
+
const barWidth = vue.computed(() => {
|
5673
|
+
return hasChunks.value ? snapValueToChunk(normalizedValue.value) : normalizedValue.value;
|
5674
|
+
});
|
5590
5675
|
function handleClick(e) {
|
5591
5676
|
if (!intersectionRef.value) return;
|
5592
5677
|
const {
|
@@ -5597,8 +5682,11 @@
|
|
5597
5682
|
const value = isReversed.value ? width - e.clientX + (right - width) : e.clientX - left;
|
5598
5683
|
progress.value = Math.round(value / width * max.value);
|
5599
5684
|
}
|
5685
|
+
vue.watchEffect(() => {
|
5686
|
+
intersectionRef.value = root.value;
|
5687
|
+
});
|
5600
5688
|
useRender(() => vue.createVNode(props.tag, {
|
5601
|
-
"ref":
|
5689
|
+
"ref": root,
|
5602
5690
|
"class": vue.normalizeClass(['v-progress-linear', {
|
5603
5691
|
'v-progress-linear--absolute': props.absolute,
|
5604
5692
|
'v-progress-linear--active': props.active && isIntersecting.value,
|
@@ -5614,7 +5702,7 @@
|
|
5614
5702
|
height: props.active ? convertToUnit(height.value) : 0,
|
5615
5703
|
'--v-progress-linear-height': convertToUnit(height.value),
|
5616
5704
|
...(props.absolute ? locationStyles.value : {})
|
5617
|
-
}, props.style]),
|
5705
|
+
}, chunksMaskStyles.value, props.style]),
|
5618
5706
|
"role": "progressbar",
|
5619
5707
|
"aria-hidden": props.active ? 'false' : 'true',
|
5620
5708
|
"aria-valuemin": "0",
|
@@ -5644,7 +5732,7 @@
|
|
5644
5732
|
"class": vue.normalizeClass(['v-progress-linear__buffer', !isForcedColorsModeActive ? bufferColorClasses.value : undefined]),
|
5645
5733
|
"style": vue.normalizeStyle([bufferColorStyles.value, {
|
5646
5734
|
opacity: parseFloat(props.bufferOpacity),
|
5647
|
-
width: convertToUnit(
|
5735
|
+
width: convertToUnit(bufferWidth.value, '%')
|
5648
5736
|
}])
|
5649
5737
|
}, null), vue.createVNode(vue.Transition, {
|
5650
5738
|
"name": transition.value
|
@@ -5652,7 +5740,7 @@
|
|
5652
5740
|
default: () => [!props.indeterminate ? vue.createElementVNode("div", {
|
5653
5741
|
"class": vue.normalizeClass(['v-progress-linear__determinate', !isForcedColorsModeActive ? barColorClasses.value : undefined]),
|
5654
5742
|
"style": vue.normalizeStyle([barColorStyles.value, {
|
5655
|
-
width: convertToUnit(
|
5743
|
+
width: convertToUnit(barWidth.value, '%')
|
5656
5744
|
}])
|
5657
5745
|
}, null) : vue.createElementVNode("div", {
|
5658
5746
|
"class": "v-progress-linear__indeterminate"
|
@@ -9856,6 +9944,11 @@
|
|
9856
9944
|
const isLink = vue.toRef(() => props.link !== false && link.isLink.value);
|
9857
9945
|
const isSelectable = vue.computed(() => !!list && (root.selectable.value || root.activatable.value || props.value != null));
|
9858
9946
|
const isClickable = vue.computed(() => !props.disabled && props.link !== false && (props.link || link.isClickable.value || isSelectable.value));
|
9947
|
+
const role = vue.computed(() => list ? isSelectable.value ? 'option' : 'listitem' : undefined);
|
9948
|
+
const ariaSelected = vue.computed(() => {
|
9949
|
+
if (!isSelectable.value) return undefined;
|
9950
|
+
return root.activatable.value ? isActivated.value : root.selectable.value ? isSelected.value : isActive.value;
|
9951
|
+
});
|
9859
9952
|
const roundedProps = vue.toRef(() => props.rounded || props.nav);
|
9860
9953
|
const color = vue.toRef(() => props.color ?? props.activeColor);
|
9861
9954
|
const variantProps = vue.toRef(() => ({
|
@@ -9959,7 +10052,8 @@
|
|
9959
10052
|
}, themeClasses.value, borderClasses.value, colorClasses.value, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, variantClasses.value, props.class],
|
9960
10053
|
"style": [colorStyles.value, dimensionStyles.value, props.style],
|
9961
10054
|
"tabindex": isClickable.value ? list ? -2 : 0 : undefined,
|
9962
|
-
"aria-selected":
|
10055
|
+
"aria-selected": ariaSelected.value,
|
10056
|
+
"role": role.value,
|
9963
10057
|
"onClick": onClick,
|
9964
10058
|
"onKeydown": isClickable.value && !isLink.value && onKeyDown
|
9965
10059
|
}, link.linkProps), {
|
@@ -10459,6 +10553,7 @@
|
|
10459
10553
|
const activeColor = vue.toRef(() => props.activeColor);
|
10460
10554
|
const baseColor = vue.toRef(() => props.baseColor);
|
10461
10555
|
const color = vue.toRef(() => props.color);
|
10556
|
+
const isSelectable = vue.toRef(() => props.selectable || props.activatable);
|
10462
10557
|
createList({
|
10463
10558
|
filterable: props.filterable
|
10464
10559
|
});
|
@@ -10530,7 +10625,7 @@
|
|
10530
10625
|
}, themeClasses.value, backgroundColorClasses.value, borderClasses.value, densityClasses.value, elevationClasses.value, lineClasses.value, roundedClasses.value, props.class]),
|
10531
10626
|
"style": vue.normalizeStyle([backgroundColorStyles.value, dimensionStyles.value, props.style]),
|
10532
10627
|
"tabindex": props.disabled ? -1 : 0,
|
10533
|
-
"role":
|
10628
|
+
"role": isSelectable.value ? 'listbox' : 'list',
|
10534
10629
|
"aria-activedescendant": undefined,
|
10535
10630
|
"onFocusin": onFocusin,
|
10536
10631
|
"onFocusout": onFocusout,
|
@@ -13609,6 +13704,7 @@
|
|
13609
13704
|
"onKeydown": onListKeydown,
|
13610
13705
|
"onFocusin": onFocusin,
|
13611
13706
|
"tabindex": "-1",
|
13707
|
+
"selectable": true,
|
13612
13708
|
"aria-live": "polite",
|
13613
13709
|
"aria-label": `${props.label}-list`,
|
13614
13710
|
"color": props.itemColor ?? props.color
|
@@ -14228,6 +14324,7 @@
|
|
14228
14324
|
"onFocusin": onFocusin,
|
14229
14325
|
"onFocusout": onFocusout,
|
14230
14326
|
"tabindex": "-1",
|
14327
|
+
"selectable": true,
|
14231
14328
|
"aria-live": "polite",
|
14232
14329
|
"color": props.itemColor ?? props.color
|
14233
14330
|
}, listEvents, props.listProps), {
|
@@ -19041,19 +19138,23 @@
|
|
19041
19138
|
get: () => {
|
19042
19139
|
return _search.value;
|
19043
19140
|
},
|
19044
|
-
set: val => {
|
19141
|
+
set: async val => {
|
19045
19142
|
_search.value = val ?? '';
|
19046
19143
|
if (!props.multiple && !hasSelectionSlot.value) {
|
19047
19144
|
model.value = [transformItem$3(props, val)];
|
19048
19145
|
vue.nextTick(() => vVirtualScrollRef.value?.scrollToIndex(0));
|
19049
19146
|
}
|
19050
19147
|
if (val && props.multiple && props.delimiters?.length) {
|
19051
|
-
const
|
19148
|
+
const signsToMatch = props.delimiters.map(escapeForRegex).join('|');
|
19149
|
+
const values = val.split(new RegExp(`(?:${signsToMatch})+`));
|
19052
19150
|
if (values.length > 1) {
|
19053
|
-
|
19151
|
+
for (let v of values) {
|
19054
19152
|
v = v.trim();
|
19055
|
-
if (v)
|
19056
|
-
|
19153
|
+
if (v) {
|
19154
|
+
select(transformItem$3(props, v));
|
19155
|
+
await vue.nextTick();
|
19156
|
+
}
|
19157
|
+
}
|
19057
19158
|
_search.value = '';
|
19058
19159
|
}
|
19059
19160
|
}
|
@@ -19335,6 +19436,7 @@
|
|
19335
19436
|
"selected": selectedValues.value,
|
19336
19437
|
"selectStrategy": props.multiple ? 'independent' : 'single-independent',
|
19337
19438
|
"onMousedown": e => e.preventDefault(),
|
19439
|
+
"selectable": true,
|
19338
19440
|
"onKeydown": onListKeydown,
|
19339
19441
|
"onFocusin": onFocusin,
|
19340
19442
|
"onFocusout": onFocusout,
|
@@ -24451,6 +24553,42 @@
|
|
24451
24553
|
return item.isDirectory ? `${path}/${item.name}` : path;
|
24452
24554
|
}
|
24453
24555
|
|
24556
|
+
// Utilities
|
24557
|
+
// Composables
|
24558
|
+
const makeFileFilterProps = propsFactory({
|
24559
|
+
filterByType: String
|
24560
|
+
}, 'file-accept');
|
24561
|
+
function useFileFilter(props) {
|
24562
|
+
const fileFilter = vue.computed(() => props.filterByType ? createFilter(props.filterByType) : null);
|
24563
|
+
function filterAccepted(files) {
|
24564
|
+
if (fileFilter.value) {
|
24565
|
+
const accepted = files.filter(fileFilter.value);
|
24566
|
+
return {
|
24567
|
+
accepted,
|
24568
|
+
rejected: files.filter(f => !accepted.includes(f))
|
24569
|
+
};
|
24570
|
+
}
|
24571
|
+
return {
|
24572
|
+
accepted: files,
|
24573
|
+
rejected: []
|
24574
|
+
};
|
24575
|
+
}
|
24576
|
+
return {
|
24577
|
+
filterAccepted
|
24578
|
+
};
|
24579
|
+
}
|
24580
|
+
function createFilter(v) {
|
24581
|
+
const types = v.split(',').map(x => x.trim().toLowerCase());
|
24582
|
+
const extensionsToMatch = types.filter(x => x.startsWith('.'));
|
24583
|
+
const wildcards = types.filter(x => x.endsWith('/*'));
|
24584
|
+
const typesToMatch = types.filter(x => !extensionsToMatch.includes(x) && !wildcards.includes(x));
|
24585
|
+
return file => {
|
24586
|
+
const extension = file.name.split('.').at(-1)?.toLowerCase() ?? '';
|
24587
|
+
const typeGroup = file.type.split('/').at(0)?.toLowerCase() ?? '';
|
24588
|
+
return typesToMatch.includes(file.type) || extensionsToMatch.includes(`.${extension}`) || wildcards.includes(`${typeGroup}/*`);
|
24589
|
+
};
|
24590
|
+
}
|
24591
|
+
|
24454
24592
|
// Types
|
24455
24593
|
|
24456
24594
|
const makeVFileInputProps = propsFactory({
|
@@ -24483,6 +24621,7 @@
|
|
24483
24621
|
return wrapInArray(val).every(v => v != null && typeof v === 'object');
|
24484
24622
|
}
|
24485
24623
|
},
|
24624
|
+
...makeFileFilterProps(),
|
24486
24625
|
...makeVFieldProps({
|
24487
24626
|
clearable: true
|
24488
24627
|
})
|
@@ -24495,7 +24634,8 @@
|
|
24495
24634
|
'click:control': e => true,
|
24496
24635
|
'mousedown:control': e => true,
|
24497
24636
|
'update:focused': focused => true,
|
24498
|
-
'update:modelValue': files => true
|
24637
|
+
'update:modelValue': files => true,
|
24638
|
+
rejected: files => true
|
24499
24639
|
},
|
24500
24640
|
setup(props, _ref) {
|
24501
24641
|
let {
|
@@ -24506,6 +24646,9 @@
|
|
24506
24646
|
const {
|
24507
24647
|
t
|
24508
24648
|
} = useLocale();
|
24649
|
+
const {
|
24650
|
+
filterAccepted
|
24651
|
+
} = useFileFilter(props);
|
24509
24652
|
const model = useProxiedModel(props, 'modelValue', props.modelValue, val => wrapInArray(val), val => !props.multiple && Array.isArray(val) ? val[0] : val);
|
24510
24653
|
const {
|
24511
24654
|
isFocused,
|
@@ -24579,14 +24722,38 @@
|
|
24579
24722
|
e.stopImmediatePropagation();
|
24580
24723
|
isDragging.value = false;
|
24581
24724
|
if (!inputRef.value || !hasFilesOrFolders(e)) return;
|
24725
|
+
const allDroppedFiles = await handleDrop(e);
|
24726
|
+
selectAccepted(allDroppedFiles);
|
24727
|
+
}
|
24728
|
+
function onFileSelection(e) {
|
24729
|
+
if (!e.target || e.repack) return; // prevent loop
|
24730
|
+
|
24731
|
+
if (!props.filterByType) {
|
24732
|
+
const target = e.target;
|
24733
|
+
model.value = [...(target.files ?? [])];
|
24734
|
+
} else {
|
24735
|
+
selectAccepted([...e.target.files]);
|
24736
|
+
}
|
24737
|
+
}
|
24738
|
+
function selectAccepted(files) {
|
24582
24739
|
const dataTransfer = new DataTransfer();
|
24583
|
-
|
24740
|
+
const {
|
24741
|
+
accepted,
|
24742
|
+
rejected
|
24743
|
+
} = filterAccepted(files);
|
24744
|
+
if (rejected.length) {
|
24745
|
+
emit('rejected', rejected);
|
24746
|
+
}
|
24747
|
+
for (const file of accepted) {
|
24584
24748
|
dataTransfer.items.add(file);
|
24585
24749
|
}
|
24586
24750
|
inputRef.value.files = dataTransfer.files;
|
24587
|
-
|
24751
|
+
model.value = [...dataTransfer.files];
|
24752
|
+
const event = new Event('change', {
|
24588
24753
|
bubbles: true
|
24589
|
-
})
|
24754
|
+
});
|
24755
|
+
event.repack = true;
|
24756
|
+
inputRef.value.dispatchEvent(event);
|
24590
24757
|
}
|
24591
24758
|
vue.watch(model, newValue => {
|
24592
24759
|
const hasModelReset = !Array.isArray(newValue) || !newValue.length;
|
@@ -24603,6 +24770,8 @@
|
|
24603
24770
|
...inputProps
|
24604
24771
|
} = VInput.filterProps(props);
|
24605
24772
|
const fieldProps = VField.filterProps(props);
|
24773
|
+
const expectsDirectory = attrs.webkitdirectory !== undefined && attrs.webkitdirectory !== false;
|
24774
|
+
const inputAccept = expectsDirectory ? undefined : props.filterByType ?? String(attrs.accept);
|
24606
24775
|
return vue.createVNode(VInput, vue.mergeProps({
|
24607
24776
|
"ref": vInputRef,
|
24608
24777
|
"modelValue": props.multiple ? model.value : model.value[0],
|
@@ -24658,6 +24827,7 @@
|
|
24658
24827
|
return vue.createElementVNode(vue.Fragment, null, [vue.createElementVNode("input", vue.mergeProps({
|
24659
24828
|
"ref": inputRef,
|
24660
24829
|
"type": "file",
|
24830
|
+
"accept": inputAccept,
|
24661
24831
|
"readonly": isReadonly.value,
|
24662
24832
|
"disabled": isDisabled.value,
|
24663
24833
|
"multiple": props.multiple,
|
@@ -24667,11 +24837,7 @@
|
|
24667
24837
|
if (isReadonly.value) e.preventDefault();
|
24668
24838
|
onFocus();
|
24669
24839
|
},
|
24670
|
-
"onChange":
|
24671
|
-
if (!e.target) return;
|
24672
|
-
const target = e.target;
|
24673
|
-
model.value = [...(target.files ?? [])];
|
24674
|
-
},
|
24840
|
+
"onChange": onFileSelection,
|
24675
24841
|
"onDragleave": onDragleave,
|
24676
24842
|
"onFocus": onFocus,
|
24677
24843
|
"onBlur": blur
|
@@ -31469,7 +31635,7 @@
|
|
31469
31635
|
};
|
31470
31636
|
});
|
31471
31637
|
}
|
31472
|
-
const version$1 = "3.9.
|
31638
|
+
const version$1 = "3.9.3-dev.2025-07-30";
|
31473
31639
|
createVuetify$1.version = version$1;
|
31474
31640
|
|
31475
31641
|
// Vue's inject() can only be used in setup
|
@@ -31494,7 +31660,7 @@
|
|
31494
31660
|
...options
|
31495
31661
|
});
|
31496
31662
|
};
|
31497
|
-
const version = "3.9.
|
31663
|
+
const version = "3.9.3-dev.2025-07-30";
|
31498
31664
|
createVuetify.version = version;
|
31499
31665
|
|
31500
31666
|
exports.blueprints = index;
|