(null)
+
+ onMounted(() => {
+ vSheetRef.value?.$el.addEventListener('dragover', onDragOver)
+ vSheetRef.value?.$el.addEventListener('drop', onDrop)
+ })
+
+ onUnmounted(() => {
+ vSheetRef.value?.$el.removeEventListener('dragover', onDragOver)
+ vSheetRef.value?.$el.removeEventListener('drop', onDrop)
+ })
+
+ function onDragOver (e: DragEvent) {
+ e.preventDefault()
+ e.stopImmediatePropagation()
+ dragOver.value = true
+ }
+
+ function onDragLeave (e: DragEvent) {
+ e.preventDefault()
+ dragOver.value = false
+ }
+
+ function onDrop (e: DragEvent) {
+ e.preventDefault()
+ e.stopImmediatePropagation()
+ dragOver.value = false
+
+ const files = Array.from(e.dataTransfer?.files ?? [])
+
+ if (!files.length) return
+
+ if (!props.multiple) {
+ model.value = [files[0]]
+
+ return
+ }
+
+ const array = model.value.slice()
+
+ for (const file of files) {
+ if (!array.some(f => f.name === file.name)) {
+ array.push(file)
+ }
+ }
+
+ model.value = array
+ }
+
+ function onClick () {
+ inputRef.value?.click()
+ }
+
+ function onClickRemove (index: number) {
+ model.value = model.value.filter((_, i) => i !== index)
+
+ if (model.value.length > 0 || !inputRef.value) return
+
+ inputRef.value.value = ''
+ }
+
+ useRender(() => {
+ const hasTitle = !!(slots.title || props.title)
+ const hasIcon = !!(slots.icon || props.icon)
+ const hasBrowse = !!(!props.hideBrowse && (slots.browse || props.density === 'default'))
+ const cardProps = VSheet.filterProps(props)
+ const dividerProps = VDivider.filterProps(props)
+ const [rootAttrs, inputAttrs] = filterInputAttrs(attrs)
+
+ const inputNode = (
+ {
+ if (!e.target) return
+
+ const target = e.target as HTMLInputElement
+ model.value = [...target.files ?? []]
+ }}
+ { ...inputAttrs }
+ />
+ )
+
+ return (
+ <>
+
+ { hasIcon && (
+
+ { !slots.icon ? (
+
+ ) : (
+
+ { slots.icon() }
+
+ )}
+
+ )}
+
+ { hasTitle && (
+
+ { slots.title?.() ?? t(props.title) }
+
+ )}
+
+ { props.density === 'default' && (
+ <>
+
+ { slots.divider?.() ?? (
+
+ { t(props.dividerText) }
+
+ )}
+
+
+ { hasBrowse && (
+ <>
+ { !slots.browse ? (
+
+ ) : (
+
+ { slots.browse({ props: { onClick } }) }
+
+ )}
+ >
+ )}
+
+ { props.subtitle && (
+
+ { props.subtitle }
+
+ )}
+ >
+ )}
+
+
+
+ { slots.input?.({ inputNode }) ?? inputNode }
+
+
+ { model.value.length > 0 && (
+
+ { model.value.map((file, i) => {
+ const slotProps = {
+ file,
+ props: {
+ 'onClick:remove': () => onClickRemove(i),
+ },
+ }
+
+ return (
+
+ { slots.item?.(slotProps) ?? (
+ onClickRemove(i) }
+ v-slots={ slots }
+ />
+ )}
+
+ )
+ })}
+
+ )}
+ >
+ )
+ })
+ },
+})
+
+export type VFileUpload = InstanceType
diff --git a/packages/vuetify/src/labs/VFileUpload/VFileUploadItem.tsx b/packages/vuetify/src/labs/VFileUpload/VFileUploadItem.tsx
new file mode 100644
index 00000000000..24e5ea5ca30
--- /dev/null
+++ b/packages/vuetify/src/labs/VFileUpload/VFileUploadItem.tsx
@@ -0,0 +1,140 @@
+// Components
+import { VAvatar } from '@/components/VAvatar/VAvatar'
+import { VBtn } from '@/components/VBtn/VBtn'
+import { VDefaultsProvider } from '@/components/VDefaultsProvider/VDefaultsProvider'
+import { makeVListItemProps, VListItem } from '@/components/VList/VListItem'
+
+// Utilities
+import { computed, ref, watchEffect } from 'vue'
+import { genericComponent, humanReadableFileSize, propsFactory, useRender } from '@/util'
+
+// Types
+import type { PropType } from 'vue'
+import type { VListItemSlots } from '@/components/VList/VListItem'
+
+export type VFileUploadItemSlots = {
+ clear: {
+ props: { onClick: () => void }
+ }
+} & VListItemSlots
+
+export const makeVFileUploadItemProps = propsFactory({
+ clearable: Boolean,
+ file: {
+ type: Object as PropType,
+ default: null,
+ },
+ fileIcon: {
+ type: String,
+ // TODO: setup up a proper aliased icon
+ default: 'mdi-file-document',
+ },
+ showSize: Boolean,
+
+ ...makeVListItemProps({
+ border: true,
+ rounded: true,
+ lines: 'two' as const,
+ }),
+}, 'VFileUploadItem')
+
+export const VFileUploadItem = genericComponent()({
+ name: 'VFileUploadItem',
+
+ props: makeVFileUploadItemProps(),
+
+ emits: {
+ 'click:remove': () => true,
+ click: (e: MouseEvent | KeyboardEvent) => true,
+ },
+
+ setup (props, { emit, slots }) {
+ const preview = ref()
+ const base = computed(() => typeof props.showSize !== 'boolean' ? props.showSize : undefined)
+
+ function onClickRemove () {
+ emit('click:remove')
+ }
+
+ watchEffect(() => {
+ preview.value = props.file?.type.startsWith('image') ? URL.createObjectURL(props.file) : undefined
+ })
+
+ useRender(() => {
+ const listItemProps = VListItem.filterProps(props)
+
+ return (
+
+ {{
+ ...slots,
+ prepend: slotProps => (
+ <>
+ { !slots.prepend ? (
+
+ ) : (
+
+ { slots.prepend?.(slotProps) ?? (
+
+ )}
+
+ )}
+ >
+ ),
+ append: slotProps => (
+ <>
+ { props.clearable && (
+ <>
+ { !slots.clear ? (
+
+ ) : (
+
+ { slots.clear?.({
+ ...slotProps,
+ props: { onClick: onClickRemove },
+ }) ?? ()}
+
+ )}
+ >
+ )}
+
+ { slots.append?.(slotProps) }
+ >
+ ),
+ }}
+
+ )
+ })
+ },
+})
+
+export type VFileUploadItem = InstanceType
diff --git a/packages/vuetify/src/labs/VFileUpload/_variables.scss b/packages/vuetify/src/labs/VFileUpload/_variables.scss
new file mode 100644
index 00000000000..38c3ba95aad
--- /dev/null
+++ b/packages/vuetify/src/labs/VFileUpload/_variables.scss
@@ -0,0 +1,12 @@
+@use '../../styles/tools';
+@use '../../styles/settings';
+
+$file-upload-title-font-size: 1.5rem !default;
+$file-upload-padding: 64px 0 !default;
+$file-upload-border-radius: 4px !default;
+$file-upload-border-width: 2px !default;
+$file-upload-title-font-weight: 600 !default;
+$file-upload-icon-font-size: 3rem !default;
+$file-upload-icon-margin-bottom: 1rem !default;
+$file-upload-divider-margin: 32px 0 !default;
+$file-upload-items-margin: 16px 0 !default;
diff --git a/packages/vuetify/src/labs/VFileUpload/index.ts b/packages/vuetify/src/labs/VFileUpload/index.ts
new file mode 100644
index 00000000000..3f85597a4d3
--- /dev/null
+++ b/packages/vuetify/src/labs/VFileUpload/index.ts
@@ -0,0 +1,2 @@
+export { VFileUpload } from './VFileUpload'
+export { VFileUploadItem } from './VFileUploadItem'
diff --git a/packages/vuetify/src/labs/components.ts b/packages/vuetify/src/labs/components.ts
index 6b753ff8790..341d9536360 100644
--- a/packages/vuetify/src/labs/components.ts
+++ b/packages/vuetify/src/labs/components.ts
@@ -1,5 +1,6 @@
export * from './VCalendar'
export * from './VDateInput'
+export * from './VFileUpload'
export * from './VNumberInput'
export * from './VPicker'
export * from './VStepperVertical'
diff --git a/packages/vuetify/src/locale/af.ts b/packages/vuetify/src/locale/af.ts
index 34fc7bd4c76..d7fd337c043 100644
--- a/packages/vuetify/src/locale/af.ts
+++ b/packages/vuetify/src/locale/af.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} files',
counterSize: '{0} files ({1} in total)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/ar.ts b/packages/vuetify/src/locale/ar.ts
index b5ec2b2ea6f..e28cb07f5de 100644
--- a/packages/vuetify/src/locale/ar.ts
+++ b/packages/vuetify/src/locale/ar.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} ملفات',
counterSize: '{0} ملفات ({1} في المجموع)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'صباحاً',
pm: 'مساءً',
diff --git a/packages/vuetify/src/locale/az.ts b/packages/vuetify/src/locale/az.ts
index b452d1ccd95..40477c14b8e 100644
--- a/packages/vuetify/src/locale/az.ts
+++ b/packages/vuetify/src/locale/az.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} fayl',
counterSize: '{0} fayl (cəmi {1})',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/bg.ts b/packages/vuetify/src/locale/bg.ts
index f795df46016..f2a7c345147 100644
--- a/packages/vuetify/src/locale/bg.ts
+++ b/packages/vuetify/src/locale/bg.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} файла',
counterSize: '{0} файла ({1} общо)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'пр. обяд',
pm: 'сл. обяд',
diff --git a/packages/vuetify/src/locale/ca.ts b/packages/vuetify/src/locale/ca.ts
index 09b06b0b9e9..93c064b55a4 100644
--- a/packages/vuetify/src/locale/ca.ts
+++ b/packages/vuetify/src/locale/ca.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} fitxers',
counterSize: '{0} fitxers ({1} en total)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/ckb.ts b/packages/vuetify/src/locale/ckb.ts
index 64ffde6ea1a..ceef0ea6149 100644
--- a/packages/vuetify/src/locale/ckb.ts
+++ b/packages/vuetify/src/locale/ckb.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} فایل',
counterSize: '{0} فایل ({1} لە کۆی گشتی)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'پێش نیوەڕۆژ',
pm: 'دوای نیوەڕۆژ',
diff --git a/packages/vuetify/src/locale/cs.ts b/packages/vuetify/src/locale/cs.ts
index 85a8b6b613a..261fc5a4099 100644
--- a/packages/vuetify/src/locale/cs.ts
+++ b/packages/vuetify/src/locale/cs.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} souborů',
counterSize: '{0} souborů ({1} celkem)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/da.ts b/packages/vuetify/src/locale/da.ts
index 8a80af26500..4668d8e9fde 100644
--- a/packages/vuetify/src/locale/da.ts
+++ b/packages/vuetify/src/locale/da.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} filer',
counterSize: '{0} filer ({1} total)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/de.ts b/packages/vuetify/src/locale/de.ts
index 9b350fc1222..253f9c3b7b4 100644
--- a/packages/vuetify/src/locale/de.ts
+++ b/packages/vuetify/src/locale/de.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} Dateien',
counterSize: '{0} Dateien ({1} gesamt)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/el.ts b/packages/vuetify/src/locale/el.ts
index be1701683f9..fba9a4b9fb1 100755
--- a/packages/vuetify/src/locale/el.ts
+++ b/packages/vuetify/src/locale/el.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} files',
counterSize: '{0} files ({1} in total)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/en.ts b/packages/vuetify/src/locale/en.ts
index cf94f5e9786..0c59dac42d9 100644
--- a/packages/vuetify/src/locale/en.ts
+++ b/packages/vuetify/src/locale/en.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} files',
counterSize: '{0} files ({1} in total)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/es.ts b/packages/vuetify/src/locale/es.ts
index 849ddececaa..86142336aed 100644
--- a/packages/vuetify/src/locale/es.ts
+++ b/packages/vuetify/src/locale/es.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} archivos',
counterSize: '{0} archivos ({1} en total)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/et.ts b/packages/vuetify/src/locale/et.ts
index b420079173d..1ff3d0c9875 100644
--- a/packages/vuetify/src/locale/et.ts
+++ b/packages/vuetify/src/locale/et.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} faili',
counterSize: '{0} faili (kokku {1})',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/fa.ts b/packages/vuetify/src/locale/fa.ts
index d80255e4351..559789c561e 100644
--- a/packages/vuetify/src/locale/fa.ts
+++ b/packages/vuetify/src/locale/fa.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} پرونده',
counterSize: '{0} پرونده ({1} در کل)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'قبل از ظهر',
pm: 'بعد از ظهر',
diff --git a/packages/vuetify/src/locale/fi.ts b/packages/vuetify/src/locale/fi.ts
index d03c0703928..5d9b54d6581 100644
--- a/packages/vuetify/src/locale/fi.ts
+++ b/packages/vuetify/src/locale/fi.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} tiedostoa',
counterSize: '{0} tiedostoa ({1} yhteensä)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'ap.',
pm: 'ip.',
diff --git a/packages/vuetify/src/locale/fr.ts b/packages/vuetify/src/locale/fr.ts
index 0bf6954ac79..371798e0434 100644
--- a/packages/vuetify/src/locale/fr.ts
+++ b/packages/vuetify/src/locale/fr.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} fichier(s)',
counterSize: '{0} fichier(s) ({1} au total)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/he.ts b/packages/vuetify/src/locale/he.ts
index ebc04e428e6..463ac6ddb7c 100644
--- a/packages/vuetify/src/locale/he.ts
+++ b/packages/vuetify/src/locale/he.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} קבצים',
counterSize: '{0} קבצים ({1} בסך הכל)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/hr.ts b/packages/vuetify/src/locale/hr.ts
index d24be21324b..d064708a31c 100644
--- a/packages/vuetify/src/locale/hr.ts
+++ b/packages/vuetify/src/locale/hr.ts
@@ -69,6 +69,11 @@ export default {
counter: 'Odabranih datoteka: {0}',
counterSize: 'Odabranih datoteka: {0} ({1} ukupno)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/hu.ts b/packages/vuetify/src/locale/hu.ts
index d23db5b5e15..ce7a5fac4c4 100644
--- a/packages/vuetify/src/locale/hu.ts
+++ b/packages/vuetify/src/locale/hu.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} fájl',
counterSize: '{0} fájl ({1} összesen)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'de',
pm: 'du',
diff --git a/packages/vuetify/src/locale/id.ts b/packages/vuetify/src/locale/id.ts
index ad689c5f478..9ddda9a693d 100644
--- a/packages/vuetify/src/locale/id.ts
+++ b/packages/vuetify/src/locale/id.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} berkas',
counterSize: '{0} berkas (dari total {1})',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/it.ts b/packages/vuetify/src/locale/it.ts
index cc2d11e9f53..206aeeaad90 100644
--- a/packages/vuetify/src/locale/it.ts
+++ b/packages/vuetify/src/locale/it.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} file',
counterSize: '{0} file ({1} in totale)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/ja.ts b/packages/vuetify/src/locale/ja.ts
index 1156492f552..034842f41c7 100644
--- a/packages/vuetify/src/locale/ja.ts
+++ b/packages/vuetify/src/locale/ja.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} ファイル',
counterSize: '{0} ファイル (合計 {1})',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/km.ts b/packages/vuetify/src/locale/km.ts
index 10c1cd735ac..5de87fc9454 100644
--- a/packages/vuetify/src/locale/km.ts
+++ b/packages/vuetify/src/locale/km.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} ឯកសារ',
counterSize: '{0} ឯកសារ ({1} សរុប)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'ព្រឹក',
pm: 'ល្ងាច',
diff --git a/packages/vuetify/src/locale/ko.ts b/packages/vuetify/src/locale/ko.ts
index 1a0782eec8a..72b07e732bc 100644
--- a/packages/vuetify/src/locale/ko.ts
+++ b/packages/vuetify/src/locale/ko.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} files',
counterSize: '{0} files ({1} in total)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: '오전',
pm: '오후',
diff --git a/packages/vuetify/src/locale/lt.ts b/packages/vuetify/src/locale/lt.ts
index 307340e31a3..2b2f492c4d2 100644
--- a/packages/vuetify/src/locale/lt.ts
+++ b/packages/vuetify/src/locale/lt.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} failų',
counterSize: '{0} failų ({1} iš viso)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/lv.ts b/packages/vuetify/src/locale/lv.ts
index eb493589646..bb4b563e6be 100644
--- a/packages/vuetify/src/locale/lv.ts
+++ b/packages/vuetify/src/locale/lv.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} files',
counterSize: '{0} files ({1} in total)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/nl.ts b/packages/vuetify/src/locale/nl.ts
index b8c6032fe32..266996e1918 100644
--- a/packages/vuetify/src/locale/nl.ts
+++ b/packages/vuetify/src/locale/nl.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} bestanden',
counterSize: '{0} bestanden ({1} in totaal)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/no.ts b/packages/vuetify/src/locale/no.ts
index c9fc72ddfc6..0796d33e009 100644
--- a/packages/vuetify/src/locale/no.ts
+++ b/packages/vuetify/src/locale/no.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} filer',
counterSize: '{0} filer ({1} totalt)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/pl.ts b/packages/vuetify/src/locale/pl.ts
index 0e45ad375df..ccc577f6ed0 100644
--- a/packages/vuetify/src/locale/pl.ts
+++ b/packages/vuetify/src/locale/pl.ts
@@ -69,6 +69,11 @@ export default {
counter: 'Liczba plików: {0}',
counterSize: 'Liczba plików: {0} (łącznie {1})',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/pt.ts b/packages/vuetify/src/locale/pt.ts
index d6094cb7edd..65a63d04bbe 100644
--- a/packages/vuetify/src/locale/pt.ts
+++ b/packages/vuetify/src/locale/pt.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} arquivo(s)',
counterSize: '{0} arquivo(s) ({1} no total)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/ro.ts b/packages/vuetify/src/locale/ro.ts
index 615b2861637..8f898a72fb9 100644
--- a/packages/vuetify/src/locale/ro.ts
+++ b/packages/vuetify/src/locale/ro.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} fișiere',
counterSize: '{0} fișiere ({1} în total)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/ru.ts b/packages/vuetify/src/locale/ru.ts
index 3c6eb2cde0e..3082bab7450 100644
--- a/packages/vuetify/src/locale/ru.ts
+++ b/packages/vuetify/src/locale/ru.ts
@@ -69,6 +69,11 @@ export default {
counter: 'Файлов: {0}',
counterSize: 'Файлов: {0} (всего {1})',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/sk.ts b/packages/vuetify/src/locale/sk.ts
index 9b1ffe2481e..f2c8e51b043 100644
--- a/packages/vuetify/src/locale/sk.ts
+++ b/packages/vuetify/src/locale/sk.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} súborov',
counterSize: '{0} súborov ({1} celkom)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/sl.ts b/packages/vuetify/src/locale/sl.ts
index c36e668c611..2d39a6c857f 100644
--- a/packages/vuetify/src/locale/sl.ts
+++ b/packages/vuetify/src/locale/sl.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} datotek',
counterSize: '{0} datotek (skupno {1})',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/sr-Cyrl.ts b/packages/vuetify/src/locale/sr-Cyrl.ts
index 6e9c1f9cc16..3230a8f1e4b 100644
--- a/packages/vuetify/src/locale/sr-Cyrl.ts
+++ b/packages/vuetify/src/locale/sr-Cyrl.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} фајлова',
counterSize: '{0} фајлова ({1} укупно)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/sr-Latn.ts b/packages/vuetify/src/locale/sr-Latn.ts
index 485d81bd2d0..7b7c1e92857 100644
--- a/packages/vuetify/src/locale/sr-Latn.ts
+++ b/packages/vuetify/src/locale/sr-Latn.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} fajlova',
counterSize: '{0} fajlova ({1} ukupno)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/sv.ts b/packages/vuetify/src/locale/sv.ts
index 2a0b576b7aa..63508c57130 100644
--- a/packages/vuetify/src/locale/sv.ts
+++ b/packages/vuetify/src/locale/sv.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} filer',
counterSize: '{0} filer ({1})',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/th.ts b/packages/vuetify/src/locale/th.ts
index 672643cd6c0..2d2dce683eb 100644
--- a/packages/vuetify/src/locale/th.ts
+++ b/packages/vuetify/src/locale/th.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} ไฟล์',
counterSize: '{0} ไฟล์ (รวม {1})',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/tr.ts b/packages/vuetify/src/locale/tr.ts
index 2463d23ba1e..0bd7eaaddae 100644
--- a/packages/vuetify/src/locale/tr.ts
+++ b/packages/vuetify/src/locale/tr.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} dosya',
counterSize: '{0} dosya (toplamda {1})',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/uk.ts b/packages/vuetify/src/locale/uk.ts
index 4d1d28540ac..e1e6fc13dca 100644
--- a/packages/vuetify/src/locale/uk.ts
+++ b/packages/vuetify/src/locale/uk.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} файлів',
counterSize: '{0} файлів ({1} загалом)',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/vi.ts b/packages/vuetify/src/locale/vi.ts
index 67915a2dc1e..1d6c493ad68 100644
--- a/packages/vuetify/src/locale/vi.ts
+++ b/packages/vuetify/src/locale/vi.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} tệp',
counterSize: '{0} tệp (tổng cộng {1})',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'SA',
pm: 'CH',
diff --git a/packages/vuetify/src/locale/zh-Hans.ts b/packages/vuetify/src/locale/zh-Hans.ts
index dec1c61f811..eed400c16c3 100644
--- a/packages/vuetify/src/locale/zh-Hans.ts
+++ b/packages/vuetify/src/locale/zh-Hans.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} 个文件',
counterSize: '{0} 个文件(共 {1})',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',
diff --git a/packages/vuetify/src/locale/zh-Hant.ts b/packages/vuetify/src/locale/zh-Hant.ts
index dbae45b6526..7bebfcd5b49 100644
--- a/packages/vuetify/src/locale/zh-Hant.ts
+++ b/packages/vuetify/src/locale/zh-Hant.ts
@@ -69,6 +69,11 @@ export default {
counter: '{0} 個檔案',
counterSize: '{0} 個檔案(共 {1})',
},
+ fileUpload: {
+ title: 'Drag and drop files here',
+ divider: 'or',
+ browse: 'Browse Files',
+ },
timePicker: {
am: 'AM',
pm: 'PM',